Plot climatology of sea ice volume tendency¶
Questions:
- How does OM3 compare with OM2?
- Does the sum of freeze + melt match the
dvidttdiagnostic?
In [1]:
Copied!
# These first two cells must be in all notebooks!
# It allows us to run all the notebooks at once, this cell has a tag "parameters" which allows us to pass in
# arguments externally using papermill (see mkfigs.sh for details)
# Set esm_file to the datastore for the main experiment of interest
esm_file = "/g/data/ol01/outputs/access-om3-25km/MC_25km_jra_iaf+wombatlite-test3v2-00532b88/datastore.json"
# papermill settings. *No need to modify these if running interactively.*
papermill = False # `cwd` and `nbname` will be populated by papermill.
cwd = None # current working directory
nbname = None # notebook name
# These first two cells must be in all notebooks!
# It allows us to run all the notebooks at once, this cell has a tag "parameters" which allows us to pass in
# arguments externally using papermill (see mkfigs.sh for details)
# Set esm_file to the datastore for the main experiment of interest
esm_file = "/g/data/ol01/outputs/access-om3-25km/MC_25km_jra_iaf+wombatlite-test3v2-00532b88/datastore.json"
# papermill settings. *No need to modify these if running interactively.*
papermill = False # `cwd` and `nbname` will be populated by papermill.
cwd = None # current working directory
nbname = None # notebook name
In [2]:
Copied!
# Parameters
esm_file = "/g/data/ol01/outputs/access-om3-25km/MC_25km_jra_ryf+wombatlite-test3-f4d79e82/experiment_datastore.json"
papermill = True
cwd = "/g/data/tm70/cyb561/access-om3-paper-1-runs/MC_25km_jra_ryf+wombatlite-test3-f4d79e82/notebooks/mkfigs_output_MC_25km_jra_ryf+wombatlite-test3-f4d79e82/"
nbname = "SeaIce_mass_budget_climatology.ipynb"
# Parameters
esm_file = "/g/data/ol01/outputs/access-om3-25km/MC_25km_jra_ryf+wombatlite-test3-f4d79e82/experiment_datastore.json"
papermill = True
cwd = "/g/data/tm70/cyb561/access-om3-paper-1-runs/MC_25km_jra_ryf+wombatlite-test3-f4d79e82/notebooks/mkfigs_output_MC_25km_jra_ryf+wombatlite-test3-f4d79e82/"
nbname = "SeaIce_mass_budget_climatology.ipynb"
In [3]:
Copied!
import os
if not papermill:
import nci_ipynb # requires conda/analysis3-26.03 or later
cwd = nci_ipynb.dir()
nbname = nci_ipynb.name()
os.chdir(cwd)
import mkfigs_bootstrap # noqa: adds external/access-model-mkfigs/src to sys.path (stop-gap)
from mkfigs import MkmdWriter
mkmd = MkmdWriter(esm_file, nbname, str(cwd), pm=papermill)
plotfolder = str(cwd) + "/" if cwd else "./"
import os
if not papermill:
import nci_ipynb # requires conda/analysis3-26.03 or later
cwd = nci_ipynb.dir()
nbname = nci_ipynb.name()
os.chdir(cwd)
import mkfigs_bootstrap # noqa: adds external/access-model-mkfigs/src to sys.path (stop-gap)
from mkfigs import MkmdWriter
mkmd = MkmdWriter(esm_file, nbname, str(cwd), pm=papermill)
plotfolder = str(cwd) + "/" if cwd else "./"
In [4]:
Copied!
import xarray as xr
import numpy as np
import cf_xarray
from datetime import timedelta
import intake
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
from distributed import Client
import pandas as pd
pd.set_option('display.max_rows', 500)
import xarray as xr
import numpy as np
import cf_xarray
from datetime import timedelta
import intake
import cartopy.crs as ccrs
import matplotlib.pyplot as plt
from distributed import Client
import pandas as pd
pd.set_option('display.max_rows', 500)
In [5]:
Copied!
IAF = esm_file.find('iaf') > 0
IAF
IAF = esm_file.find('iaf') > 0
IAF
Out[5]:
False
In [6]:
Copied!
if IAF:
om2_exp = '025deg_jra55_iaf_omip2_cycle6'
else:
om2_exp = '025deg_jra55_ryf9091_gadi'
if IAF:
om2_exp = '025deg_jra55_iaf_omip2_cycle6'
else:
om2_exp = '025deg_jra55_ryf9091_gadi'
In [7]:
Copied!
client = Client(threads_per_worker=1)
client.dashboard_link
client = Client(threads_per_worker=1)
client.dashboard_link
Out[7]:
'http://127.0.0.1:8787/status'
Open the intake-esm datastore¶
In [8]:
Copied!
COLUMNS_WITH_ITERABLES = [
"variable",
"variable_long_name",
"variable_standard_name",
"variable_cell_methods",
"variable_units"
]
datastore = intake.open_esm_datastore(
esm_file,
columns_with_iterables=COLUMNS_WITH_ITERABLES
)
COLUMNS_WITH_ITERABLES = [
"variable",
"variable_long_name",
"variable_standard_name",
"variable_cell_methods",
"variable_units"
]
datastore = intake.open_esm_datastore(
esm_file,
columns_with_iterables=COLUMNS_WITH_ITERABLES
)
What ocean variables are available at monthly frequency?¶
In [9]:
Copied!
def available_variables(datastore):
"""Return a pandas dataframe summarising the variables in a datastore"""
variable_columns = [col for col in datastore.df.columns if "variable" in col]
return (
datastore.df[variable_columns]
.explode(variable_columns)
.drop_duplicates()
.set_index("variable")
.sort_index()
)
def available_variables(datastore):
"""Return a pandas dataframe summarising the variables in a datastore"""
variable_columns = [col for col in datastore.df.columns if "variable" in col]
return (
datastore.df[variable_columns]
.explode(variable_columns)
.drop_duplicates()
.set_index("variable")
.sort_index()
)
In [10]:
Copied!
datastore_filtered = datastore.search(realm="seaIce", frequency="1mon")
datastore_filtered_grid = datastore.search(realm="seaIce", frequency="fx")
available_variables(datastore_filtered)
datastore_filtered = datastore.search(realm="seaIce", frequency="1mon")
datastore_filtered_grid = datastore.search(realm="seaIce", frequency="fx")
available_variables(datastore_filtered)
Out[10]:
| variable_long_name | variable_standard_name | variable_cell_methods | variable_units | |
|---|---|---|---|---|
| variable | ||||
| ANGLE | angle grid makes with latitude line on U grid | radians | ||
| ANGLET | angle grid makes with latitude line on T grid | radians | ||
| NCAT | category maximum thickness | m | ||
| Tair_m | air temperature | time: mean | C | |
| Tsfc_m | snow/ice surface temperature | time: mean | C | |
| VGRDa | vertical snow-ice-bio levels | 1 | ||
| VGRDb | vertical ice-bio levels | 1 | ||
| VGRDi | vertical ice levels | 1 | ||
| VGRDs | vertical snow levels | 1 | ||
| aice_m | ice area (aggregate) | time: mean | 1 | |
| aicen_m | ice area, categories | time: mean | 1 | |
| albice_m | bare ice albedo | time: mean | % | |
| albsni_m | snow/ice broad band albedo | time: mean | % | |
| albsno_m | snow albedo | time: mean | % | |
| alidf_ai_m | near IR diffuse albedo | time: mean | % | |
| alidr_ai_m | near IR direct albedo | time: mean | % | |
| alvdf_ai_m | visible diffuse albedo | time: mean | % | |
| alvdr_ai_m | visible direct albedo | time: mean | % | |
| blkmask | block id of T grid cells, mytask + iblk/100 | 1 | ||
| congel_m | congelation ice growth | time: mean | cm/day | |
| daidtd_m | area tendency dynamics | time: mean | %/day | |
| daidtt_m | area tendency thermo | time: mean | %/day | |
| divu_m | strain rate (divergence) | %/day | ||
| dvidtd_m | volume tendency dynamics | time: mean | cm/day | |
| dvidtt_m | volume tendency thermo | time: mean | cm/day | |
| evap_ai_m | evaporative water flux | time: mean | cm/day | |
| fcondtop_ai_m | top surface conductive heat flux | time: mean | W/m^2 | |
| fcondtopn_ai_m | top sfc conductive heat flux, cat | time: mean | W/m^2 | |
| fhocn_ai_m | heat flux ice to ocean (fhocn_ai) | time: mean | W/m^2 | |
| flat_ai_m | latent heat flux | time: mean | W/m^2 | |
| flatn_ai_m | latent heat flux, category | time: mean | W/m^2 | |
| flwdn_m | down longwave flux | time: mean | W/m^2 | |
| flwup_ai_m | upward longwave flux | time: mean | W/m^2 | |
| fmeltt_ai_m | net surface heat flux causing melt | time: mean | W/m^2 | |
| fmelttn_ai_m | net sfc heat flux causing melt, cat | time: mean | W/m^2 | |
| frazil_m | frazil ice growth | time: mean | cm/day | |
| fresh_ai_m | freshwtr flx ice to ocn | time: mean | cm/day | |
| frzmlt_m | freeze/melt potential | time: mean | W/m^2 | |
| fsalt_ai_m | salt flux ice to ocean | time: mean | kg/m^2/s | |
| fsalt_m | salt flux ice to ocn (cpl) | time: mean | kg/m^2/s | |
| fsens_ai_m | sensible heat flux | time: mean | W/m^2 | |
| fsensn_ai_m | sensible heat flux, category | time: mean | W/m^2 | |
| fsurfn_ai_m | net surface heat flux, categories | time: mean | W/m^2 | |
| fswabs_ai_m | snow/ice/ocn absorbed solar flux | time: mean | W/m^2 | |
| fswdn_m | down solar flux | time: mean | W/m^2 | |
| fswthru_ai_m | SW flux thru ice to ocean | time: mean | W/m^2 | |
| fswup_m | upward solar flux | time: mean | W/m^2 | |
| hi_m | grid cell mean ice thickness | time: mean | m | |
| hs_m | grid cell mean snow thickness | time: mean | m | |
| ice_present_m | fraction of time-avg interval that ice is present | time: mean | 1 | |
| meltb_m | basal ice melt | time: mean | cm/day | |
| meltl_m | lateral ice melt | time: mean | cm/day | |
| melts_m | top snow melt | time: mean | cm/day | |
| meltt_m | top ice melt | time: mean | cm/day | |
| opening_m | lead area opening rate | time: mean | %/day | |
| rain_ai_m | rainfall rate | time: mean | cm/day | |
| scale_factor_m | shortwave scaling factor | time: mean | 1 | |
| shear_m | strain rate (shear) | %/day | ||
| sice_m | bulk ice salinity | time: mean | ppt | |
| sifb_m | sea-ice freeboard | area: time: mean where sea ice (mask=siconc) | m | |
| snoice_m | snow-ice formation | time: mean | cm/day | |
| snow_ai_m | snowfall rate | time: mean | cm/day | |
| strairx_m | atm/ice stress (x) | time: mean | N/m^2 | |
| strairy_m | atm/ice stress (y) | time: mean | N/m^2 | |
| strcorx_m | coriolis stress (x) | time: mean | N/m^2 | |
| strcory_m | coriolis stress (y) | time: mean | N/m^2 | |
| strength_m | compressive ice strength | time: mean | N/m | |
| strintx_m | internal ice stress (x) | time: mean | N/m^2 | |
| strinty_m | internal ice stress (y) | time: mean | N/m^2 | |
| strocnx_m | ocean/ice stress (x) | time: mean | N/m^2 | |
| strocny_m | ocean/ice stress (y) | time: mean | N/m^2 | |
| strtltx_m | sea sfc tilt stress (x) | time: mean | N/m^2 | |
| strtlty_m | sea sfc tilt stress (y) | time: mean | N/m^2 | |
| time | time | days since 1900-01-01 00:00:00 | ||
| time_bounds | time interval bounds | days since 1900-01-01 00:00:00 | ||
| trsig_m | internal stress tensor trace | N/m | ||
| uatm_m | atm velocity (x) | time: mean | m/s | |
| uvel_m | ice velocity (x) | time: mean | m/s | |
| vatm_m | atm velocity (y) | time: mean | m/s | |
| vicen_m | ice volume, categories | time: mean | m | |
| vort_m | strain rate (vorticity) | %/day | ||
| vvel_m | ice velocity (y) | time: mean | m/s |
In [11]:
Copied!
available_variables(datastore_filtered_grid)
available_variables(datastore_filtered_grid)
Out[11]:
| variable_long_name | variable_standard_name | variable_cell_methods | variable_units | |
|---|---|---|---|---|
| variable | ||||
| ANGLE | angle grid makes with latitude line on U grid | radians | ||
| ANGLET | angle grid makes with latitude line on T grid | radians | ||
| ELAT | E grid center latitude | degrees_north | ||
| ELON | E grid center longitude | degrees_east | ||
| HTE | T cell width on East side | m | ||
| HTN | T cell width on North side | m | ||
| NCAT | category maximum thickness | m | ||
| NFSD | category floe size (center) | m | ||
| NLAT | N grid center latitude | degrees_north | ||
| NLON | N grid center longitude | degrees_east | ||
| TLAT | T grid center latitude | degrees_north | ||
| TLON | T grid center longitude | degrees_east | ||
| ULAT | U grid center latitude | degrees_north | ||
| ULON | U grid center longitude | degrees_east | ||
| VGRDa | vertical snow-ice-bio levels | 1 | ||
| VGRDb | vertical ice-bio levels | 1 | ||
| VGRDi | vertical ice levels | 1 | ||
| VGRDs | vertical snow levels | 1 | ||
| blkmask | block id of T grid cells, mytask + iblk/100 | 1 | ||
| dxe | E cell width through middle | m | ||
| dxn | N cell width through middle | m | ||
| dxt | T cell width through middle | m | ||
| dxu | U cell width through middle | m | ||
| dye | E cell height through middle | m | ||
| dyn | N cell height through middle | m | ||
| dyt | T cell height through middle | m | ||
| dyu | U cell height through middle | m | ||
| earea | area of E grid cells | m^2 | ||
| emask | mask of E grid cells, 0 = land, 1 = ocean | 1 | ||
| late_bounds | latitude bounds (E-cell) | degrees_north | ||
| latn_bounds | latitude bounds (N-cell) | degrees_north | ||
| latt_bounds | latitude bounds (T-cell) | degrees_north | ||
| latu_bounds | latitude bounds (U-cell) | degrees_north | ||
| lone_bounds | longitude bounds (E-cell) | degrees_east | ||
| lonn_bounds | longitude bounds (N-cell) | degrees_east | ||
| lont_bounds | longitude bounds (T-cell) | degrees_east | ||
| lonu_bounds | longitude bounds (U-cell) | degrees_east | ||
| narea | area of N grid cells | m^2 | ||
| nmask | mask of N grid cells, 0 = land, 1 = ocean | 1 | ||
| tarea | area of T grid cells | m^2 | ||
| tmask | mask of T grid cells, 0 = land, 1 = ocean | 1 | ||
| uarea | area of U grid cells | m^2 | ||
| umask | mask of U grid cells, 0 = land, 1 = ocean | 1 |
Load ACCESS-OM3 sea ice mass budget diagnostics using the ESM datastore¶
In [12]:
Copied!
variables = ["aice_m", "congel_m", "frazil_m", "snoice_m", "meltt_m", "meltb_m", "meltl_m", "evap_ai_m", "dvidtt_m"]
ds = datastore.search(variable=variables, frequency="1mon").to_dask(
xarray_open_kwargs = dict(chunks={"yh": -1, "xh": -1}, # Good for spatial operations, but not temporal
decode_timedelta=True,),
)
variables = ["aice_m", "congel_m", "frazil_m", "snoice_m", "meltt_m", "meltb_m", "meltl_m", "evap_ai_m", "dvidtt_m"]
ds = datastore.search(variable=variables, frequency="1mon").to_dask(
xarray_open_kwargs = dict(chunks={"yh": -1, "xh": -1}, # Good for spatial operations, but not temporal
decode_timedelta=True,),
)
Pick the last 10 years
In [13]:
Copied!
if IAF:
t_slice = slice('2009','2018') #manually pick some years in both om2 & 3 experiments
else:
years = np.unique(ds.time.dt.year)[-10:]
t_slice = slice(str(years[0]),str(years[-1]))
t_slice
if IAF:
t_slice = slice('2009','2018') #manually pick some years in both om2 & 3 experiments
else:
years = np.unique(ds.time.dt.year)[-10:]
t_slice = slice(str(years[0]),str(years[-1]))
t_slice
In [14]:
Copied!
ds = ds.sel(time=t_slice)
ds
ds = ds.sel(time=t_slice)
ds
Out[14]:
<xarray.Dataset> Size: 14GB
Dimensions: (time: 120, nj: 1152, ni: 1440)
Coordinates:
* time (time) object 960B 1921-01-16 12:00:00 ... 1930-12-16 12:00:00
Dimensions without coordinates: nj, ni
Data variables:
frazil_m (time, nj, ni) float64 2GB dask.array<chunksize=(1, 384, 720), meta=np.ndarray>
dvidtt_m (time, nj, ni) float64 2GB dask.array<chunksize=(1, 384, 720), meta=np.ndarray>
meltl_m (time, nj, ni) float64 2GB dask.array<chunksize=(1, 384, 720), meta=np.ndarray>
snoice_m (time, nj, ni) float64 2GB dask.array<chunksize=(1, 384, 720), meta=np.ndarray>
congel_m (time, nj, ni) float64 2GB dask.array<chunksize=(1, 384, 720), meta=np.ndarray>
evap_ai_m (time, nj, ni) float64 2GB dask.array<chunksize=(1, 384, 720), meta=np.ndarray>
meltb_m (time, nj, ni) float64 2GB dask.array<chunksize=(1, 384, 720), meta=np.ndarray>
aice_m (time, nj, ni) float64 2GB dask.array<chunksize=(1, 384, 720), meta=np.ndarray>
meltt_m (time, nj, ni) float64 2GB dask.array<chunksize=(1, 384, 720), meta=np.ndarray>
Attributes: (12/22)
title: access-om3
contents: Diagnostic and Prognostic Varia...
source: CICE Sea Ice Model, unknown_ver...
comment: All years have exactly 365 days
comment3: seconds elapsed into model date...
time_period_freq: month_1
... ...
intake_esm_attrs:variable_cell_methods: ,,,time: mean,time: mean,,,,,ti...
intake_esm_attrs:variable_units: radians,radians,m,C,C,1,1,1,1,1...
intake_esm_attrs:realm: seaIce
intake_esm_attrs:temporal_label: mean
intake_esm_attrs:_data_format_: netcdf
intake_esm_dataset_key: seaIce.1mon.nbnd:2.nc:5.ni:1440...Calculate the monthly climatology for these last 10 years.
In [15]:
Copied!
ds_clim = ds.groupby('time.month').mean('time').compute()
ds_clim = ds.groupby('time.month').mean('time').compute()
Load grid cell area from cice variable
In [16]:
Copied!
_search = datastore.search(variable="tarea", frequency="fx", realm="seaIce")
_path = _search.df.loc[0, "path"]
tarea = datastore.search(variable="tarea", frequency="fx", realm="seaIce", path=_path).to_dask().compute()
_search = datastore.search(variable="tarea", frequency="fx", realm="seaIce")
_path = _search.df.loc[0, "path"]
tarea = datastore.search(variable="tarea", frequency="fx", realm="seaIce", path=_path).to_dask().compute()
Integrate terms for both poles. The terms are currently in cm/day, so convert to m/day
In [17]:
Copied!
antarctic_seaice = (ds_clim * tarea.tarea / 100).sel(nj=slice(0,int(len(ds.nj)/2))).sum(['nj','ni'])
arctic_seaice = (ds_clim * tarea.tarea / 100).sel(nj=slice(int(len(ds.nj)/2), None)).sum(['nj','ni'])
antarctic_seaice = (ds_clim * tarea.tarea / 100).sel(nj=slice(0,int(len(ds.nj)/2))).sum(['nj','ni'])
arctic_seaice = (ds_clim * tarea.tarea / 100).sel(nj=slice(int(len(ds.nj)/2), None)).sum(['nj','ni'])
Load ACCESS-OM2 sea ice mass budget diagnostics using the intake catalog¶
In [18]:
Copied!
catalog = intake.cat.access_nri
catalog = intake.cat.access_nri
In [19]:
Copied!
var = catalog[om2_exp].search(variable=variables,frequency="1mon")
var.esmcat.aggregation_control.groupby_attrs = ['frequency'] ## Not sure why I have to do this!!
ds_om2=var.to_dask(xarray_open_kwargs=dict(chunks={"time": -1},
decode_timedelta=True,
use_cftime=True),
xarray_combine_by_coords_kwargs = dict( # These kwargs can make things faster
compat="override", data_vars="minimal", coords="minimal",),
)
# shift time to correct for OM2 calendar strangeness
def shift_time(ds):
ds["time"] = ds.time.to_pandas() - timedelta(minutes=1)
return ds
ds_om2 = shift_time(ds_om2)
# select out the same 10 years as for OM3
ds_om2 = ds_om2.sel(time=t_slice)
var = catalog[om2_exp].search(variable=variables,frequency="1mon")
var.esmcat.aggregation_control.groupby_attrs = ['frequency'] ## Not sure why I have to do this!!
ds_om2=var.to_dask(xarray_open_kwargs=dict(chunks={"time": -1},
decode_timedelta=True,
use_cftime=True),
xarray_combine_by_coords_kwargs = dict( # These kwargs can make things faster
compat="override", data_vars="minimal", coords="minimal",),
)
# shift time to correct for OM2 calendar strangeness
def shift_time(ds):
ds["time"] = ds.time.to_pandas() - timedelta(minutes=1)
return ds
ds_om2 = shift_time(ds_om2)
# select out the same 10 years as for OM3
ds_om2 = ds_om2.sel(time=t_slice)
/g/data/xp65/public/apps/med_conda/envs/analysis3-26.07/lib/python3.12/site-packages/access_nri_intake/aliases.py:192: UserWarning: Value aliasing: variable='aice_m' → variable=['aice_m','aice_m'] norm: dict[str, Any] = self._normalise_kwargs(kwargs) /g/data/xp65/public/apps/med_conda/envs/analysis3-26.07/lib/python3.12/site-packages/access_nri_intake/aliases.py:192: UserWarning: Value aliasing: variable='congel_m' → variable=['congel_m','congel_m'] norm: dict[str, Any] = self._normalise_kwargs(kwargs) /g/data/xp65/public/apps/med_conda/envs/analysis3-26.07/lib/python3.12/site-packages/access_nri_intake/aliases.py:192: UserWarning: Value aliasing: variable='frazil_m' → variable=['frazil_m','frazil_m'] norm: dict[str, Any] = self._normalise_kwargs(kwargs) /g/data/xp65/public/apps/med_conda/envs/analysis3-26.07/lib/python3.12/site-packages/access_nri_intake/aliases.py:192: UserWarning: Value aliasing: variable='snoice_m' → variable=['snoice_m','snoice_m'] norm: dict[str, Any] = self._normalise_kwargs(kwargs) /g/data/xp65/public/apps/med_conda/envs/analysis3-26.07/lib/python3.12/site-packages/access_nri_intake/aliases.py:192: UserWarning: Value aliasing: variable='meltt_m' → variable=['meltt_m','meltt_m'] norm: dict[str, Any] = self._normalise_kwargs(kwargs) /g/data/xp65/public/apps/med_conda/envs/analysis3-26.07/lib/python3.12/site-packages/access_nri_intake/aliases.py:192: UserWarning: Value aliasing: variable='meltb_m' → variable=['meltb_m','meltb_m'] norm: dict[str, Any] = self._normalise_kwargs(kwargs) /g/data/xp65/public/apps/med_conda/envs/analysis3-26.07/lib/python3.12/site-packages/access_nri_intake/aliases.py:192: UserWarning: Value aliasing: variable='meltl_m' → variable=['meltl_m','meltl_m'] norm: dict[str, Any] = self._normalise_kwargs(kwargs) /g/data/xp65/public/apps/med_conda/envs/analysis3-26.07/lib/python3.12/site-packages/access_nri_intake/aliases.py:192: UserWarning: Value aliasing: variable='evap_ai_m' → variable=['evap_ai_m','evap_ai_m'] norm: dict[str, Any] = self._normalise_kwargs(kwargs) /g/data/xp65/public/apps/med_conda/envs/analysis3-26.07/lib/python3.12/site-packages/access_nri_intake/aliases.py:192: UserWarning: Value aliasing: variable='dvidtt_m' → variable=['dvidtt_m','dvidtt_m'] norm: dict[str, Any] = self._normalise_kwargs(kwargs)
/g/data/xp65/public/apps/med_conda/envs/analysis3-26.07/lib/python3.12/site-packages/distributed/client.py:3387: UserWarning: Sending large graph of size 20.87 MiB. This may cause some slowdown. Consider loading the data with Dask directly or using futures or delayed objects to embed the data into the graph without repetition. See also https://docs.dask.org/en/stable/best-practices.html#load-data-with-dask for more information. warnings.warn(
In [20]:
Copied!
print(ds_om2.time.min().values, ds_om2.time.max().values)
print(ds_om2.time.min().values, ds_om2.time.max().values)
1921-01-31 23:59:00 1930-12-31 23:59:00
Calculate the monthly climatology for these last 10 years.
In [21]:
Copied!
ds_clim_om2 = ds_om2.groupby('time.month').mean('time').compute()
ds_clim_om2 = ds_om2.groupby('time.month').mean('time').compute()
/g/data/xp65/public/apps/med_conda/envs/analysis3-26.07/lib/python3.12/site-packages/distributed/client.py:3387: UserWarning: Sending large graph of size 82.29 MiB. This may cause some slowdown. Consider loading the data with Dask directly or using futures or delayed objects to embed the data into the graph without repetition. See also https://docs.dask.org/en/stable/best-practices.html#load-data-with-dask for more information. warnings.warn(
Load grid cell area variable
In [22]:
Copied!
var = catalog['025deg_jra55_ryf9091_gadi'].search(variable='tarea', frequency="1mon", start_date='1940-01-01.*')
ds_om2_tarea = var.to_dask()
var = catalog['025deg_jra55_ryf9091_gadi'].search(variable='tarea', frequency="1mon", start_date='1940-01-01.*')
ds_om2_tarea = var.to_dask()
Integrate terms for both poles. The terms are currently in cm/day.
In [23]:
Copied!
antarctic_seaice_om2 = (ds_clim_om2 * ds_om2_tarea.tarea / 100).sel(nj=slice(0,int(len(ds_om2.nj)/2))).sum(['nj','ni']).compute()
arctic_seaice_om2 = (ds_clim_om2 * ds_om2_tarea.tarea / 100).sel(nj=slice(int(len(ds_om2.nj)/2), None)).sum(['nj','ni']).compute()
antarctic_seaice_om2 = (ds_clim_om2 * ds_om2_tarea.tarea / 100).sel(nj=slice(0,int(len(ds_om2.nj)/2))).sum(['nj','ni']).compute()
arctic_seaice_om2 = (ds_clim_om2 * ds_om2_tarea.tarea / 100).sel(nj=slice(int(len(ds_om2.nj)/2), None)).sum(['nj','ni']).compute()
/g/data/xp65/public/apps/med_conda/envs/analysis3-26.07/lib/python3.12/site-packages/distributed/client.py:3387: UserWarning: Sending large graph of size 640.75 MiB. This may cause some slowdown. Consider loading the data with Dask directly or using futures or delayed objects to embed the data into the graph without repetition. See also https://docs.dask.org/en/stable/best-practices.html#load-data-with-dask for more information. warnings.warn(
/g/data/xp65/public/apps/med_conda/envs/analysis3-26.07/lib/python3.12/site-packages/distributed/client.py:3387: UserWarning: Sending large graph of size 640.75 MiB. This may cause some slowdown. Consider loading the data with Dask directly or using futures or delayed objects to embed the data into the graph without repetition. See also https://docs.dask.org/en/stable/best-practices.html#load-data-with-dask for more information. warnings.warn(
Plot Antarctic sea ice climatology¶
In [24]:
Copied!
def figure(region):
plt.rcParams['font.size'] = 12
fig, axes = plt.subplots(ncols=3, figsize=(21,4), sharex=True)
plt.subplots_adjust(wspace=0.12)
axes[0].text(0.0, 1.03, 'a) ACCESS-OM3', fontsize=12, fontweight='bold', transform=axes[0].transAxes)
axes[1].text(0.0, 1.03, 'b) ACCESS-OM2', fontsize=12, fontweight='bold', transform=axes[1].transAxes)
axes[2].text(0.0, 1.03, 'c) ACCESS-OM3 - ACCESS-OM2', fontsize=12, fontweight='bold', transform=axes[2].transAxes)
for i, ax in enumerate(axes):
ax.text(0.99, 1.03, f'{region}', ha='right', fontsize=12, transform=ax.transAxes)
ax.plot(np.arange(1,13,1), np.full(12,0), lw=0.5, c='k')
ax.set_xlim([1,12])
ax.set_xticks(np.arange(1,13,1))
ax.set_xlabel('Month')
axes[0].set_ylabel('Sea ice volume tendency\n(x1000 km$^3$ day$^{-1}$)')
return fig, axes
def figure(region):
plt.rcParams['font.size'] = 12
fig, axes = plt.subplots(ncols=3, figsize=(21,4), sharex=True)
plt.subplots_adjust(wspace=0.12)
axes[0].text(0.0, 1.03, 'a) ACCESS-OM3', fontsize=12, fontweight='bold', transform=axes[0].transAxes)
axes[1].text(0.0, 1.03, 'b) ACCESS-OM2', fontsize=12, fontweight='bold', transform=axes[1].transAxes)
axes[2].text(0.0, 1.03, 'c) ACCESS-OM3 - ACCESS-OM2', fontsize=12, fontweight='bold', transform=axes[2].transAxes)
for i, ax in enumerate(axes):
ax.text(0.99, 1.03, f'{region}', ha='right', fontsize=12, transform=ax.transAxes)
ax.plot(np.arange(1,13,1), np.full(12,0), lw=0.5, c='k')
ax.set_xlim([1,12])
ax.set_xticks(np.arange(1,13,1))
ax.set_xlabel('Month')
axes[0].set_ylabel('Sea ice volume tendency\n(x1000 km$^3$ day$^{-1}$)')
return fig, axes
Sum of freeze and melt versus dvidtt diagnostic
Note: Not using evap_ai_m because this includes evaporation from snow. There is no diagnostic (currently) for evap_ice.
In [25]:
Copied!
region = 'ANTARCTICA'
fig, axes = figure(region)
x = np.arange(1, 13, 1)
### OM3 ###
freeze = antarctic_seaice['frazil_m'] + antarctic_seaice['congel_m'] + antarctic_seaice['snoice_m']
melt = antarctic_seaice['meltb_m'] + antarctic_seaice['meltt_m'] + antarctic_seaice['meltl_m']
axes[0].plot(x, freeze/1e12, c='blue', label='Total freeze')
axes[0].plot(x, -melt/1e12, c='orangered', label='Total melt')
axes[0].plot(x, (freeze - melt)/1e12, c='grey', lw=2, label='Net (freeze + melt)')
axes[0].plot(x, antarctic_seaice['dvidtt_m']/1e12, c='k', ls=':', lw=2, label='dvidtt')
axes[0].legend(frameon=False, ncols=2, fontsize=12)
### OM2 ###
freeze_om2 = antarctic_seaice_om2['frazil_m'] + antarctic_seaice_om2['congel_m'] + antarctic_seaice_om2['snoice_m']
melt_om2 = antarctic_seaice_om2['meltb_m'] + antarctic_seaice_om2['meltt_m'] + antarctic_seaice_om2['meltl_m']
axes[1].plot(x, freeze_om2/1e12, c='blue', label='Total freeze')
axes[1].plot(x, -melt_om2/1e12, c='orangered', label='Total melt')
# axes[0].plot(x, -melt_om2/1e12, c='firebrick', label='Total melt')
axes[1].plot(x, (freeze_om2 - melt_om2)/1e12, c='grey', lw=2, label='Net (freeze + melt)')
axes[1].plot(x, antarctic_seaice_om2['dvidtt_m']/1e12, c='k', ls=':', lw=2, label='dvidtt')
### Difference (OM3 - OM2) ###
axes[2].plot(x, (freeze - freeze_om2)/1e12, c='blue', label='Total freeze')
axes[2].plot(x, (-melt - -melt_om2)/1e12, c='orangered', label='Total melt')
axes[2].plot(x, ((freeze - melt) - (freeze_om2 - melt_om2))/1e12, c='grey', lw=2, label='Net (freeze + melt)')
axes[2].plot(x, (antarctic_seaice['dvidtt_m'] - antarctic_seaice_om2['dvidtt_m'])/1e12, c='k', ls=':', lw=2, label='dvidtt')
axes[0].set_ylim([-0.25, 0.15])
axes[1].set_ylim([-0.25, 0.15])
axes[2].set_ylim([-0.02, 0.02])
figfile = plotfolder + f'seaice_vol_budget_{region}.jpg'
plt.savefig(figfile, dpi=300, bbox_inches='tight')
plt.show()
mkmd.savefig(fig, "Sea Ice Mass Budget", "Antarctic sea ice volume budget climatology comparing ACCESS-OM3 and ACCESS-OM2. [GitHub issue: Sea ice mass budget climatology](https://github.com/ACCESS-Community-Hub/access-om3-paper-1/issues/52)")
region = 'ANTARCTICA'
fig, axes = figure(region)
x = np.arange(1, 13, 1)
### OM3 ###
freeze = antarctic_seaice['frazil_m'] + antarctic_seaice['congel_m'] + antarctic_seaice['snoice_m']
melt = antarctic_seaice['meltb_m'] + antarctic_seaice['meltt_m'] + antarctic_seaice['meltl_m']
axes[0].plot(x, freeze/1e12, c='blue', label='Total freeze')
axes[0].plot(x, -melt/1e12, c='orangered', label='Total melt')
axes[0].plot(x, (freeze - melt)/1e12, c='grey', lw=2, label='Net (freeze + melt)')
axes[0].plot(x, antarctic_seaice['dvidtt_m']/1e12, c='k', ls=':', lw=2, label='dvidtt')
axes[0].legend(frameon=False, ncols=2, fontsize=12)
### OM2 ###
freeze_om2 = antarctic_seaice_om2['frazil_m'] + antarctic_seaice_om2['congel_m'] + antarctic_seaice_om2['snoice_m']
melt_om2 = antarctic_seaice_om2['meltb_m'] + antarctic_seaice_om2['meltt_m'] + antarctic_seaice_om2['meltl_m']
axes[1].plot(x, freeze_om2/1e12, c='blue', label='Total freeze')
axes[1].plot(x, -melt_om2/1e12, c='orangered', label='Total melt')
# axes[0].plot(x, -melt_om2/1e12, c='firebrick', label='Total melt')
axes[1].plot(x, (freeze_om2 - melt_om2)/1e12, c='grey', lw=2, label='Net (freeze + melt)')
axes[1].plot(x, antarctic_seaice_om2['dvidtt_m']/1e12, c='k', ls=':', lw=2, label='dvidtt')
### Difference (OM3 - OM2) ###
axes[2].plot(x, (freeze - freeze_om2)/1e12, c='blue', label='Total freeze')
axes[2].plot(x, (-melt - -melt_om2)/1e12, c='orangered', label='Total melt')
axes[2].plot(x, ((freeze - melt) - (freeze_om2 - melt_om2))/1e12, c='grey', lw=2, label='Net (freeze + melt)')
axes[2].plot(x, (antarctic_seaice['dvidtt_m'] - antarctic_seaice_om2['dvidtt_m'])/1e12, c='k', ls=':', lw=2, label='dvidtt')
axes[0].set_ylim([-0.25, 0.15])
axes[1].set_ylim([-0.25, 0.15])
axes[2].set_ylim([-0.02, 0.02])
figfile = plotfolder + f'seaice_vol_budget_{region}.jpg'
plt.savefig(figfile, dpi=300, bbox_inches='tight')
plt.show()
mkmd.savefig(fig, "Sea Ice Mass Budget", "Antarctic sea ice volume budget climatology comparing ACCESS-OM3 and ACCESS-OM2. [GitHub issue: Sea ice mass budget climatology](https://github.com/ACCESS-Community-Hub/access-om3-paper-1/issues/52)")
Saved /g/data/tm70/cyb561/access-om3-paper-1-runs/MC_25km_jra_ryf+wombatlite-test3-f4d79e82/notebooks/mkfigs_output_MC_25km_jra_ryf+wombatlite-test3-f4d79e82/mkmd/SeaIce_mass_budget_climatology_01.png Adding entry to per-notebook markdown: /g/data/tm70/cyb561/access-om3-paper-1-runs/MC_25km_jra_ryf+wombatlite-test3-f4d79e82/notebooks/mkfigs_output_MC_25km_jra_ryf+wombatlite-test3-f4d79e82/mkmd/SeaIce_mass_budget_climatology.md Lines appended to /g/data/tm70/cyb561/access-om3-paper-1-runs/MC_25km_jra_ryf+wombatlite-test3-f4d79e82/notebooks/mkfigs_output_MC_25km_jra_ryf+wombatlite-test3-f4d79e82/mkmd/SeaIce_mass_budget_climatology.md successfully.
Plot Arctic sea ice climatology¶
In [26]:
Copied!
region = 'ARCTIC'
fig, axes = figure(region)
x = np.arange(1, 13, 1)
### OM3 ###
freeze = arctic_seaice['frazil_m'] + arctic_seaice['congel_m'] + arctic_seaice['snoice_m']
melt = arctic_seaice['meltb_m'] + arctic_seaice['meltt_m'] + arctic_seaice['meltl_m']
axes[0].plot(x, freeze/1e12, c='blue', label='Total freeze')
axes[0].plot(x, -melt/1e12, c='orangered', label='Total melt')
axes[0].plot(x, (freeze - melt)/1e12, c='grey', lw=2, label='Net (freeze + melt)')
axes[0].plot(x, arctic_seaice['dvidtt_m']/1e12, c='k', ls=':', lw=2, label='dvidtt')
axes[0].legend(frameon=False, ncols=1, fontsize=12, loc='lower left')
### OM2 ###
freeze_om2 = arctic_seaice_om2['frazil_m'] + arctic_seaice_om2['congel_m'] + arctic_seaice_om2['snoice_m']
melt_om2 = arctic_seaice_om2['meltb_m'] + arctic_seaice_om2['meltt_m'] + arctic_seaice_om2['meltl_m']
axes[1].plot(x, freeze_om2/1e12, c='blue', label='Total freeze')
# axes[0].plot(x, freeze_om2/1e12, c='cyan', label='Total freeze')
axes[1].plot(x, -melt_om2/1e12, c='orangered', label='Total melt')
# axes[0].plot(x, -melt_om2/1e12, c='firebrick', label='Total melt')
axes[1].plot(x, (freeze_om2 - melt_om2)/1e12, c='grey', lw=2, label='Net (freeze + melt)')
axes[1].plot(x, arctic_seaice_om2['dvidtt_m']/1e12, c='k', ls=':', lw=2, label='dvidtt')
### Difference (OM3 - OM2) ###
axes[2].plot(x, (freeze - freeze_om2)/1e12, c='blue', label='Total freeze')
axes[2].plot(x, (-melt - -melt_om2)/1e12, c='orangered', label='Total melt')
axes[2].plot(x, ((freeze - melt) - (freeze_om2 - melt_om2))/1e12, c='grey', lw=2, label='Net (freeze + melt)')
axes[2].plot(x, (arctic_seaice['dvidtt_m'] - arctic_seaice_om2['dvidtt_m'])/1e12, c='k', ls=':', lw=2, label='dvidtt')
axes[0].set_ylim([-0.3, 0.2])
axes[1].set_ylim([-0.3, 0.2])
axes[2].set_ylim([-0.02, 0.035])
figfile = plotfolder + f'seaice_vol_budget_{region}.jpg'
plt.savefig(figfile, dpi=300, bbox_inches='tight')
plt.show()
mkmd.savefig(fig, "Sea Ice Mass Budget", "Arctic sea ice volume budget climatology comparing ACCESS-OM3 and ACCESS-OM2. [GitHub issue: Sea ice mass budget climatology](https://github.com/ACCESS-Community-Hub/access-om3-paper-1/issues/52)")
region = 'ARCTIC'
fig, axes = figure(region)
x = np.arange(1, 13, 1)
### OM3 ###
freeze = arctic_seaice['frazil_m'] + arctic_seaice['congel_m'] + arctic_seaice['snoice_m']
melt = arctic_seaice['meltb_m'] + arctic_seaice['meltt_m'] + arctic_seaice['meltl_m']
axes[0].plot(x, freeze/1e12, c='blue', label='Total freeze')
axes[0].plot(x, -melt/1e12, c='orangered', label='Total melt')
axes[0].plot(x, (freeze - melt)/1e12, c='grey', lw=2, label='Net (freeze + melt)')
axes[0].plot(x, arctic_seaice['dvidtt_m']/1e12, c='k', ls=':', lw=2, label='dvidtt')
axes[0].legend(frameon=False, ncols=1, fontsize=12, loc='lower left')
### OM2 ###
freeze_om2 = arctic_seaice_om2['frazil_m'] + arctic_seaice_om2['congel_m'] + arctic_seaice_om2['snoice_m']
melt_om2 = arctic_seaice_om2['meltb_m'] + arctic_seaice_om2['meltt_m'] + arctic_seaice_om2['meltl_m']
axes[1].plot(x, freeze_om2/1e12, c='blue', label='Total freeze')
# axes[0].plot(x, freeze_om2/1e12, c='cyan', label='Total freeze')
axes[1].plot(x, -melt_om2/1e12, c='orangered', label='Total melt')
# axes[0].plot(x, -melt_om2/1e12, c='firebrick', label='Total melt')
axes[1].plot(x, (freeze_om2 - melt_om2)/1e12, c='grey', lw=2, label='Net (freeze + melt)')
axes[1].plot(x, arctic_seaice_om2['dvidtt_m']/1e12, c='k', ls=':', lw=2, label='dvidtt')
### Difference (OM3 - OM2) ###
axes[2].plot(x, (freeze - freeze_om2)/1e12, c='blue', label='Total freeze')
axes[2].plot(x, (-melt - -melt_om2)/1e12, c='orangered', label='Total melt')
axes[2].plot(x, ((freeze - melt) - (freeze_om2 - melt_om2))/1e12, c='grey', lw=2, label='Net (freeze + melt)')
axes[2].plot(x, (arctic_seaice['dvidtt_m'] - arctic_seaice_om2['dvidtt_m'])/1e12, c='k', ls=':', lw=2, label='dvidtt')
axes[0].set_ylim([-0.3, 0.2])
axes[1].set_ylim([-0.3, 0.2])
axes[2].set_ylim([-0.02, 0.035])
figfile = plotfolder + f'seaice_vol_budget_{region}.jpg'
plt.savefig(figfile, dpi=300, bbox_inches='tight')
plt.show()
mkmd.savefig(fig, "Sea Ice Mass Budget", "Arctic sea ice volume budget climatology comparing ACCESS-OM3 and ACCESS-OM2. [GitHub issue: Sea ice mass budget climatology](https://github.com/ACCESS-Community-Hub/access-om3-paper-1/issues/52)")
Saved /g/data/tm70/cyb561/access-om3-paper-1-runs/MC_25km_jra_ryf+wombatlite-test3-f4d79e82/notebooks/mkfigs_output_MC_25km_jra_ryf+wombatlite-test3-f4d79e82/mkmd/SeaIce_mass_budget_climatology_02.png Adding entry to per-notebook markdown: /g/data/tm70/cyb561/access-om3-paper-1-runs/MC_25km_jra_ryf+wombatlite-test3-f4d79e82/notebooks/mkfigs_output_MC_25km_jra_ryf+wombatlite-test3-f4d79e82/mkmd/SeaIce_mass_budget_climatology.md This title already exists in the notebook markdown – appending an additional figure. Lines appended to /g/data/tm70/cyb561/access-om3-paper-1-runs/MC_25km_jra_ryf+wombatlite-test3-f4d79e82/notebooks/mkfigs_output_MC_25km_jra_ryf+wombatlite-test3-f4d79e82/mkmd/SeaIce_mass_budget_climatology.md successfully.
Check freeze - melt and dvidtt residuals¶
In [27]:
Copied!
def figure():
plt.rcParams['font.size'] = 12
fig, axes = plt.subplots(ncols=2, figsize=(14,4), sharex=True, sharey=True)
plt.subplots_adjust(wspace=0.08)
axes[0].text(0.0, 1.03, 'a) ACCESS-OM3', fontsize=12, fontweight='bold', transform=axes[0].transAxes)
axes[1].text(0.0, 1.03, 'b) ACCESS-OM2', fontsize=12, fontweight='bold', transform=axes[1].transAxes)
for i, ax in enumerate(axes):
ax.plot(np.arange(1,13,1), np.full(12,0), lw=0.5, c='k')
ax.set_xlim([1,12])
ax.set_xticks(np.arange(1,13,1))
ax.set_xlabel('Month')
axes[0].set_ylabel('Sea ice volume tendency\n(x1000 km$^3$ day$^{-1}$)')
return fig, axes
def figure():
plt.rcParams['font.size'] = 12
fig, axes = plt.subplots(ncols=2, figsize=(14,4), sharex=True, sharey=True)
plt.subplots_adjust(wspace=0.08)
axes[0].text(0.0, 1.03, 'a) ACCESS-OM3', fontsize=12, fontweight='bold', transform=axes[0].transAxes)
axes[1].text(0.0, 1.03, 'b) ACCESS-OM2', fontsize=12, fontweight='bold', transform=axes[1].transAxes)
for i, ax in enumerate(axes):
ax.plot(np.arange(1,13,1), np.full(12,0), lw=0.5, c='k')
ax.set_xlim([1,12])
ax.set_xticks(np.arange(1,13,1))
ax.set_xlabel('Month')
axes[0].set_ylabel('Sea ice volume tendency\n(x1000 km$^3$ day$^{-1}$)')
return fig, axes
In [28]:
Copied!
fig, axes = figure()
x = np.arange(1, 13, 1)
freeze = antarctic_seaice['frazil_m'] + antarctic_seaice['congel_m'] + antarctic_seaice['snoice_m']
melt = antarctic_seaice['meltb_m'] + antarctic_seaice['meltt_m'] + antarctic_seaice['meltl_m']
freeze_om2 = antarctic_seaice_om2['frazil_m'] + antarctic_seaice_om2['congel_m'] + antarctic_seaice_om2['snoice_m']
melt_om2 = antarctic_seaice_om2['meltb_m'] + antarctic_seaice_om2['meltt_m'] + antarctic_seaice_om2['meltl_m']
axes[0].plot(x, ((freeze - melt) - antarctic_seaice['dvidtt_m'])/1e12, c='darkviolet', label='Antarctic: Net - dvidtt')
axes[1].plot(x, ((freeze_om2 - melt_om2) - antarctic_seaice_om2['dvidtt_m'])/1e12, c='darkviolet', label='Antarctic: Net - dvidtt')
freeze = arctic_seaice['frazil_m'] + arctic_seaice['congel_m'] + arctic_seaice['snoice_m']
melt = arctic_seaice['meltb_m'] + arctic_seaice['meltt_m'] + arctic_seaice['meltl_m']
freeze_om2 = arctic_seaice_om2['frazil_m'] + arctic_seaice_om2['congel_m'] + arctic_seaice_om2['snoice_m']
melt_om2 = arctic_seaice_om2['meltb_m'] + arctic_seaice_om2['meltt_m'] + arctic_seaice_om2['meltl_m']
axes[0].plot(x, ((freeze - melt) - arctic_seaice['dvidtt_m'])/1e12, c='green', label='Arctic: Net - dvidtt')
axes[1].plot(x, ((freeze_om2 - melt_om2) - arctic_seaice_om2['dvidtt_m'])/1e12, c='green', label='Arctic: Net - dvidtt')
axes[0].legend(frameon=False, ncols=1, fontsize=12, loc='lower left')
figfile = plotfolder + f'seaice_vol_budget_net-dvidtt_differences.jpg'
plt.savefig(figfile, dpi=300, bbox_inches='tight')
plt.show()
mkmd.savefig(fig, "Sea Ice Mass Budget", "Sea ice volume budget residual comparing ACCESS-OM3 and ACCESS-OM2. [GitHub issue: Sea ice mass budget climatology](https://github.com/ACCESS-Community-Hub/access-om3-paper-1/issues/52)")
fig, axes = figure()
x = np.arange(1, 13, 1)
freeze = antarctic_seaice['frazil_m'] + antarctic_seaice['congel_m'] + antarctic_seaice['snoice_m']
melt = antarctic_seaice['meltb_m'] + antarctic_seaice['meltt_m'] + antarctic_seaice['meltl_m']
freeze_om2 = antarctic_seaice_om2['frazil_m'] + antarctic_seaice_om2['congel_m'] + antarctic_seaice_om2['snoice_m']
melt_om2 = antarctic_seaice_om2['meltb_m'] + antarctic_seaice_om2['meltt_m'] + antarctic_seaice_om2['meltl_m']
axes[0].plot(x, ((freeze - melt) - antarctic_seaice['dvidtt_m'])/1e12, c='darkviolet', label='Antarctic: Net - dvidtt')
axes[1].plot(x, ((freeze_om2 - melt_om2) - antarctic_seaice_om2['dvidtt_m'])/1e12, c='darkviolet', label='Antarctic: Net - dvidtt')
freeze = arctic_seaice['frazil_m'] + arctic_seaice['congel_m'] + arctic_seaice['snoice_m']
melt = arctic_seaice['meltb_m'] + arctic_seaice['meltt_m'] + arctic_seaice['meltl_m']
freeze_om2 = arctic_seaice_om2['frazil_m'] + arctic_seaice_om2['congel_m'] + arctic_seaice_om2['snoice_m']
melt_om2 = arctic_seaice_om2['meltb_m'] + arctic_seaice_om2['meltt_m'] + arctic_seaice_om2['meltl_m']
axes[0].plot(x, ((freeze - melt) - arctic_seaice['dvidtt_m'])/1e12, c='green', label='Arctic: Net - dvidtt')
axes[1].plot(x, ((freeze_om2 - melt_om2) - arctic_seaice_om2['dvidtt_m'])/1e12, c='green', label='Arctic: Net - dvidtt')
axes[0].legend(frameon=False, ncols=1, fontsize=12, loc='lower left')
figfile = plotfolder + f'seaice_vol_budget_net-dvidtt_differences.jpg'
plt.savefig(figfile, dpi=300, bbox_inches='tight')
plt.show()
mkmd.savefig(fig, "Sea Ice Mass Budget", "Sea ice volume budget residual comparing ACCESS-OM3 and ACCESS-OM2. [GitHub issue: Sea ice mass budget climatology](https://github.com/ACCESS-Community-Hub/access-om3-paper-1/issues/52)")
Saved /g/data/tm70/cyb561/access-om3-paper-1-runs/MC_25km_jra_ryf+wombatlite-test3-f4d79e82/notebooks/mkfigs_output_MC_25km_jra_ryf+wombatlite-test3-f4d79e82/mkmd/SeaIce_mass_budget_climatology_03.png Adding entry to per-notebook markdown: /g/data/tm70/cyb561/access-om3-paper-1-runs/MC_25km_jra_ryf+wombatlite-test3-f4d79e82/notebooks/mkfigs_output_MC_25km_jra_ryf+wombatlite-test3-f4d79e82/mkmd/SeaIce_mass_budget_climatology.md This title already exists in the notebook markdown – appending an additional figure. Lines appended to /g/data/tm70/cyb561/access-om3-paper-1-runs/MC_25km_jra_ryf+wombatlite-test3-f4d79e82/notebooks/mkfigs_output_MC_25km_jra_ryf+wombatlite-test3-f4d79e82/mkmd/SeaIce_mass_budget_climatology.md successfully.
In [29]:
Copied!
client.close()
client.close()
In [ ]:
Copied!