A “spell” system#

[1]:
%load_ext autoreload
%autoreload 2

import os
os.chdir('/glade/u/home/fengzhu/Github/x4c/docsrc/notebooks')
import x4c
print(x4c.__version__)
2024.5.15
[4]:
dirpath = '/glade/campaign/univ/ubrn0018/fengzhu/CESM_output/timeseries/b.e13.B1850C5.ne16_g16.icesm131_d18O_fixer.Miocene.3xCO2.005'
case = x4c.Timeseries(dirpath)
>>> case.root_dir: /glade/campaign/univ/ubrn0018/fengzhu/CESM_output/timeseries/b.e13.B1850C5.ne16_g16.icesm131_d18O_fixer.Miocene.3xCO2.005
>>> case.path_pattern: comp/proc/tseries/month_1/casename.mdl.h_str.vn.timespan.nc
>>> case.grid_dict: {'atm': 'ne16', 'ocn': 'g16', 'lnd': 'ne16', 'rof': 'ne16', 'ice': 'g16'}
>>> case.vars_info created

A 1st order variable that exists under the CESM Postprocessing Timeseries directory#

[3]:
spell = 'TS'
case.calc(spell)
case.diags[spell]
>>> case.ds["TS"] created
>>> case.diags["TS"] created
[3]:
<xarray.DataArray 'TS' (time: 600, ncol: 13826)> Size: 33MB
array([[30.115295, 29.491943, 28.593048, ..., 20.259125, 17.343262,
        18.36267 ],
       [31.816986, 31.327759, 30.49112 , ..., 19.40506 , 17.631165,
        18.420319],
       [30.922668, 30.435669, 29.57724 , ..., 19.17099 , 17.414886,
        18.323761],
       ...,
       [24.949066, 23.907959, 22.722198, ..., 29.804321, 27.803436,
        28.56009 ],
       [26.115387, 25.092682, 23.751007, ..., 25.909088, 23.512573,
        24.234802],
       [28.901093, 28.040283, 26.766968, ..., 22.911407, 20.540161,
        21.184845]], dtype=float32)
Coordinates:
  * time     (time) object 5kB 6951-01-31 00:00:00 ... 7000-12-31 00:00:00
Dimensions without coordinates: ncol
Attributes:
    units:         °C
    long_name:     Surface temperature (radiative)
    cell_methods:  time: mean
    path:          /glade/campaign/univ/ubrn0018/fengzhu/CESM_output/timeseri...
    gw:            <xarray.DataArray 'gw' (ncol: 13826)> Size: 111kB\n[13826 ...
    lat:           <xarray.DataArray 'lat' (ncol: 13826)> Size: 111kB\n[13826...
    lon:           <xarray.DataArray 'lon' (ncol: 13826)> Size: 111kB\n[13826...
    comp:          atm
    grid:          ne16

A deduced variable based on 1st order variables#

[4]:
spell = 'SST'
case.calc(spell)
case.diags[spell]
>>> case.ds["TEMP"] created
>>> case.diags["SST"] created
[4]:
<xarray.DataArray 'SST' (time: 600, nlat: 384, nlon: 320)> Size: 295MB
[73728000 values with dtype=float32]
Coordinates:
    z_t      float32 4B 500.0
    ULONG    (nlat, nlon) float64 983kB ...
    ULAT     (nlat, nlon) float64 983kB ...
    TLONG    (nlat, nlon) float64 983kB ...
    TLAT     (nlat, nlon) float64 983kB ...
  * time     (time) object 5kB 6951-01-31 00:00:00 ... 7000-12-31 00:00:00
Dimensions without coordinates: nlat, nlon
Attributes:
    long_name:     Sea Surface Temperature
    units:         °C
    grid_loc:      3111
    cell_methods:  time: mean
    path:          /glade/campaign/univ/ubrn0018/fengzhu/CESM_output/timeseri...
    gw:            <xarray.DataArray 'gw' (nlat: 384, nlon: 320)> Size: 983kB...
    lat:           <xarray.DataArray 'lat' (nlat: 384, nlon: 320)> Size: 983k...
    lon:           <xarray.DataArray 'lon' (nlat: 384, nlon: 320)> Size: 983k...
    comp:          ocn
    grid:          g16
[5]:
spell = 'd18Op'
case.calc(spell)
case.diags[spell]
>>> case.ds["PRECRC_H216Or"] created
>>> case.ds["PRECSC_H216Os"] created
>>> case.ds["PRECRL_H216OR"] created
>>> case.ds["PRECSL_H216OS"] created
>>> case.ds["PRECRC_H218Or"] created
>>> case.ds["PRECSC_H218Os"] created
>>> case.ds["PRECRL_H218OR"] created
>>> case.ds["PRECSL_H218OS"] created
>>> case.diags["d18Op"] created
[5]:
<xarray.DataArray 'd18Op' (time: 600, ncol: 13826)> Size: 33MB
array([[-1.7427206, -1.7643571, -2.1771193, ..., -8.510709 , -7.7379346,
        -7.486999 ],
       [-2.3528934, -2.1284223, -1.8881559, ..., -7.032275 , -6.7304373,
        -6.397307 ],
       [-2.2357106, -2.3323298, -2.5407076, ..., -7.622123 , -6.967664 ,
        -6.7536235],
       ...,
       [-2.425313 , -3.3228397, -4.793942 , ..., -3.848195 , -4.269719 ,
        -3.5235286],
       [-1.9090176, -2.6127696, -3.4157038, ..., -6.644845 , -6.4725876,
        -6.0330033],
       [-1.0784268, -1.4600754, -6.1579943, ..., -6.125927 , -4.7311783,
        -4.798174 ]], dtype=float32)
Coordinates:
  * time     (time) object 5kB 6951-01-31 00:00:00 ... 7000-12-31 00:00:00
Dimensions without coordinates: ncol
Attributes:
    units:         m/s
    long_name:     Convective rain rate for H218Or
    cell_methods:  time: mean
    path:          /glade/campaign/univ/ubrn0018/fengzhu/CESM_output/timeseri...
    gw:            <xarray.DataArray 'gw' (ncol: 13826)> Size: 111kB\n[13826 ...
    lat:           <xarray.DataArray 'lat' (ncol: 13826)> Size: 111kB\n[13826...
    lon:           <xarray.DataArray 'lon' (ncol: 13826)> Size: 111kB\n[13826...
    comp:          atm
    grid:          ne16

Climatology#

[6]:
spell = 'TS:climo:gm'
case.calc(spell)
case.diags[spell]
>>> case.ds["TS"] created
>>> case.diags["TS:climo:gm"] created
[6]:
<xarray.DataArray 'TS' (time: 12)>
array([17.132423  , 17.17904783, 16.67184088, 16.56906268, 17.24778526,
       18.35244407, 19.17750972, 18.95686033, 17.87159633, 16.73436938,
       16.24615771, 16.48020455])
Coordinates:
  * time     (time) int64 1 2 3 4 5 6 7 8 9 10 11 12
Attributes:
    units:         °C
    long_name:     Global Mean Surface temperature (radiative) (Climatology)
    cell_methods:  time: mean
    path:          /glade/campaign/univ/ubrn0018/fengzhu/CESM_output/timeseri...
    gw:            <xarray.DataArray 'gw' (lat: 180, lon: 360)>\narray([[0.00...
    comp:          atm
    grid:          ne16
    climo_period:  (7951, 8000)
[11]:
x4c.set_style('web', font_scale=1)
fig, ax = case.plot(spell)
../_images/notebooks_diags-spell_10_0.png

A horizontal 2D map#

[43]:
spell = 'TS:ann'
case.calc(spell)
case.diags[spell]
>>> case.ds["TS"] created
>>> case.diags["TS:ann"] created
[43]:
<xarray.DataArray 'TS' (time: 50, ncol: 13826)> Size: 3MB
array([[27.255615, 26.59375 , 25.732697, ..., 24.627686, 23.223907,
        24.14569 ],
       [27.369781, 26.764069, 25.98816 , ..., 24.485626, 23.12378 ,
        24.04718 ],
       [27.426819, 26.78302 , 25.943298, ..., 24.74707 , 23.381744,
        24.290405],
       ...,
       [27.305878, 26.622803, 25.72229 , ..., 25.120941, 23.717438,
        24.671234],
       [27.353516, 26.718628, 25.887177, ..., 25.187317, 23.84436 ,
        24.80011 ],
       [27.750732, 27.057007, 26.139557, ..., 25.670074, 24.444519,
        25.14618 ]], dtype=float32)
Coordinates:
  * time     (time) object 400B 6951-12-31 00:00:00 ... 7000-12-31 00:00:00
Dimensions without coordinates: ncol
Attributes:
    units:         °C
    long_name:     Surface temperature (radiative) (Annual)
    cell_methods:  time: mean
    path:          /glade/campaign/univ/ubrn0018/fengzhu/CESM_output/timeseri...
    gw:            <xarray.DataArray 'gw' (ncol: 13826)> Size: 111kB\n[13826 ...
    lat:           <xarray.DataArray 'lat' (ncol: 13826)> Size: 111kB\n[13826...
    lon:           <xarray.DataArray 'lon' (ncol: 13826)> Size: 111kB\n[13826...
    comp:          atm
    grid:          ne16
[47]:
x4c.set_style('journal_spines', font_scale=1.2)
fig, ax = case.plot(spell)
Regridding from [1, 13826] to [180, 360]
>>> case.ds["SSH"] created
../_images/notebooks_diags-spell_13_1.png
[51]:
spell = 'SST:-12,1,2'
case.calc(spell)
case.diags[spell]
>>> case.ds["TEMP"] created
>>> case.diags["SST:-12,1,2"] created
[51]:
<xarray.DataArray 'SST' (time: 51, nlat: 384, nlon: 320)> Size: 25MB
array([[[nan, nan, nan, ..., nan, nan, nan],
        [nan, nan, nan, ..., nan, nan, nan],
        [nan, nan, nan, ..., nan, nan, nan],
        ...,
        [nan, nan, nan, ..., nan, nan, nan],
        [nan, nan, nan, ..., nan, nan, nan],
        [nan, nan, nan, ..., nan, nan, nan]],

       [[nan, nan, nan, ..., nan, nan, nan],
        [nan, nan, nan, ..., nan, nan, nan],
        [nan, nan, nan, ..., nan, nan, nan],
        ...,
        [nan, nan, nan, ..., nan, nan, nan],
        [nan, nan, nan, ..., nan, nan, nan],
        [nan, nan, nan, ..., nan, nan, nan]],

       [[nan, nan, nan, ..., nan, nan, nan],
        [nan, nan, nan, ..., nan, nan, nan],
        [nan, nan, nan, ..., nan, nan, nan],
        ...,
...
        ...,
        [nan, nan, nan, ..., nan, nan, nan],
        [nan, nan, nan, ..., nan, nan, nan],
        [nan, nan, nan, ..., nan, nan, nan]],

       [[nan, nan, nan, ..., nan, nan, nan],
        [nan, nan, nan, ..., nan, nan, nan],
        [nan, nan, nan, ..., nan, nan, nan],
        ...,
        [nan, nan, nan, ..., nan, nan, nan],
        [nan, nan, nan, ..., nan, nan, nan],
        [nan, nan, nan, ..., nan, nan, nan]],

       [[nan, nan, nan, ..., nan, nan, nan],
        [nan, nan, nan, ..., nan, nan, nan],
        [nan, nan, nan, ..., nan, nan, nan],
        ...,
        [nan, nan, nan, ..., nan, nan, nan],
        [nan, nan, nan, ..., nan, nan, nan],
        [nan, nan, nan, ..., nan, nan, nan]]], dtype=float32)
Coordinates:
    z_t      float32 4B 500.0
    ULONG    (nlat, nlon) float64 983kB ...
    ULAT     (nlat, nlon) float64 983kB ...
    TLONG    (nlat, nlon) float64 983kB ...
    TLAT     (nlat, nlon) float64 983kB ...
  * time     (time) object 408B 6951-02-28 00:00:00 ... 7001-02-28 00:00:00
Dimensions without coordinates: nlat, nlon
Attributes:
    long_name:     Sea Surface Temperature (DJF)
    units:         °C
    grid_loc:      3111
    cell_methods:  time: mean
    path:          /glade/campaign/univ/ubrn0018/fengzhu/CESM_output/timeseri...
    gw:            <xarray.DataArray 'gw' (nlat: 384, nlon: 320)> Size: 983kB...
    lat:           <xarray.DataArray 'lat' (nlat: 384, nlon: 320)> Size: 983k...
    lon:           <xarray.DataArray 'lon' (nlat: 384, nlon: 320)> Size: 983k...
    comp:          ocn
    grid:          g16
[54]:
fig, ax = case.plot(spell)
../_images/notebooks_diags-spell_15_0.png
[65]:
case.calc('MLD:3')
case.calc('MLD:9')

mask = case.diags['MLD:3'].lat > 0
case.diags['MLD:mix'] = case.diags['MLD:3'].mean('time').where(mask, other=case.diags['MLD:9'].mean('time'))
>>> case.ds["XMXL"] created
>>> case.diags["MLD:3"] created
>>> case.ds["XMXL"] already loaded; to reload, run case.clear_ds("XMXL") before case.load("XMXL")
>>> case.diags["MLD:9"] created
[68]:
fig, ax = case.plot(
    'MLD:mix',
    figsize=(6, 6),
    cbar_kwargs={'orientation': 'horizontal', 'aspect': 20, 'pad': 0.05},
)
ax.set_title('Mixed Layer Depth (NH: Mar; SH: Sept)', weight='bold')
x4c.showfig(fig)
x4c.savefig(fig, './figs/map_MLD_mix.pdf')
../_images/notebooks_diags-spell_17_0.png
Figure saved at: "figs/map_MLD_mix.pdf"
[WARNING] yaksa: 10 leaked handle pool objects

A timeseries#

[33]:
spell = 'TS:ann:gm'
case.calc(spell)
case.diags[spell]
>>> case.ds["TS"] created
Regridding from [1, 13826] to [180, 360]
>>> case.diags["TS:ann:gm"] created
[33]:
<xarray.DataArray 'TS' (time: 50)> Size: 400B
array([17.42720653, 17.48905824, 17.44967605, 17.47774547, 17.51654981,
       17.24848253, 17.39658188, 17.59053861, 17.48456964, 17.43645915,
       17.4322128 , 17.3081354 , 17.48215638, 17.76362381, 17.3122794 ,
       17.21187245, 17.20908332, 17.54942076, 17.72846092, 17.33755901,
       17.43767921, 17.57137876, 17.52678597, 17.32145085, 17.38547791,
       17.56191536, 17.36943034, 17.33152329, 17.24494713, 17.52045722,
       17.34284225, 17.21382635, 17.36316737, 17.39722006, 17.38297636,
       17.3732631 , 17.3726002 , 17.46888324, 17.66213172, 17.29246269,
       17.14775584, 17.40703955, 17.62723439, 17.50499981, 17.37590867,
       17.34382487, 17.40328731, 17.49603029, 17.37513375, 17.16387423])
Coordinates:
  * time     (time) object 400B 6951-12-31 00:00:00 ... 7000-12-31 00:00:00
Attributes:
    units:         °C
    long_name:     Global Mean Surface temperature (radiative) (Annual)
    cell_methods:  time: mean
    path:          /glade/campaign/univ/ubrn0018/fengzhu/CESM_output/timeseri...
    gw:            <xarray.DataArray 'gw' (lat: 180, lon: 360)> Size: 518kB\n...
    lat:           <xarray.DataArray 'lat' (lat: 180)> Size: 1kB\narray([-89....
    lon:           <xarray.DataArray 'lon' (lon: 360)> Size: 3kB\narray([  0....
    comp:          atm
    grid:          ne16
[34]:
x4c.set_style('web', font_scale=1.2)
fig, ax = case.plot(spell)
../_images/notebooks_diags-spell_20_0.png

A zonal mean plot#

[28]:
spell = 'LST:ann:zm'
case.calc(spell)
case.diags[spell]
>>> case.ds["TS"] created
>>> case.ds["LANDFRAC"] created
Regridding from [1, 13826] to [180, 360]
>>> case.diags["LST:ann:zm"] created
[28]:
<xarray.DataArray 'LST' (time: 50, lat: 180)> Size: 36kB
array([[-17.61438 , -18.295929, -18.382156, ...,        nan,        nan,
               nan],
       [-17.989594, -18.596909, -18.620834, ...,        nan,        nan,
               nan],
       [-17.135468, -18.006424, -18.126862, ...,        nan,        nan,
               nan],
       ...,
       [-17.056915, -17.642578, -17.642654, ...,        nan,        nan,
               nan],
       [-17.3172  , -17.903625, -17.959457, ...,        nan,        nan,
               nan],
       [-17.90384 , -18.5457  , -18.590149, ...,        nan,        nan,
               nan]], dtype=float32)
Coordinates:
  * lat      (lat) float64 1kB -89.5 -88.5 -87.5 -86.5 ... 86.5 87.5 88.5 89.5
  * time     (time) object 400B 6951-12-31 00:00:00 ... 7000-12-31 00:00:00
Attributes:
    units:         °C
    long_name:     Zonal Mean Land Surface Temperature (Annual)
    cell_methods:  time: mean
    path:          /glade/campaign/univ/ubrn0018/fengzhu/CESM_output/timeseri...
    gw:            <xarray.DataArray 'gw' (lat: 180, lon: 360)> Size: 518kB\n...
    lat:           <xarray.DataArray 'lat' (lat: 180)> Size: 1kB\narray([-89....
    lon:           <xarray.DataArray 'lon' (lon: 360)> Size: 3kB\narray([  0....
    comp:          atm
    grid:          ne16
[31]:
fig, ax = case.plot(spell)
../_images/notebooks_diags-spell_23_0.png

A vertical 2D plot#

[35]:
spell = 'MOC:ann:yz'
case.calc(spell)
case.diags[spell]
>>> case.ds["MOC"] created
>>> case.diags["MOC:ann:yz"] created
[35]:
<xarray.DataArray 'MOC' (time: 50, moc_z: 61, lat_aux_grid: 91)> Size: 1MB
array([[[ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00, ...,
          2.36021541e-03,  8.10216938e-04,  3.16757913e-04],
        [ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00, ...,
          8.38778690e-02,  7.99491182e-02,  7.37172067e-02],
        [ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00, ...,
          1.06880188e-01,  9.84256342e-02,  8.74157026e-02],
        ...,
        [ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00, ...,
          2.72689181e-06,  2.72689181e-06,  2.72689181e-06],
        [ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00, ...,
          7.71718305e-07,  7.71718305e-07,  7.71718305e-07],
        [ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00, ...,
          0.00000000e+00,  0.00000000e+00,  0.00000000e+00]],

       [[ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00, ...,
         -7.30628439e-04, -8.62350353e-05,  1.25391569e-04],
        [ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00, ...,
          7.74025843e-02,  6.72006086e-02,  6.18883558e-02],
        [ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00, ...,
          8.21162239e-02,  8.27210248e-02,  7.43025541e-02],
...
         -6.49816911e-07, -6.49816911e-07, -6.49816911e-07],
        [ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00, ...,
         -3.18197493e-07, -3.18197493e-07, -3.18197493e-07],
        [ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00, ...,
          0.00000000e+00,  0.00000000e+00,  0.00000000e+00]],

       [[ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00, ...,
         -4.25623963e-04, -1.90087245e-04, -1.15045346e-04],
        [ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00, ...,
          4.39730100e-02,  4.85592298e-02,  4.60209064e-02],
        [ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00, ...,
          6.86945692e-02,  7.88548887e-02,  7.23393336e-02],
        ...,
        [ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00, ...,
          3.27784420e-07,  3.27784420e-07,  3.27784420e-07],
        [ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00, ...,
         -1.13812291e-06, -1.13812291e-06, -1.13812291e-06],
        [ 0.00000000e+00,  0.00000000e+00,  0.00000000e+00, ...,
          0.00000000e+00,  0.00000000e+00,  0.00000000e+00]]],
      dtype=float32)
Coordinates:
    moc_components  |S256 256B ...
  * lat_aux_grid    (lat_aux_grid) float32 364B -90.0 -88.0 -86.0 ... 88.0 90.0
  * moc_z           (moc_z) float32 244B 0.0 0.01 0.02 0.03 ... 5.0 5.25 5.5
  * time            (time) object 400B 6951-12-31 00:00:00 ... 7000-12-31 00:...
Attributes:
    long_name:     Meridional Overturning Circulation (Annual)
    units:         Sverdrups
    cell_methods:  time: mean
    path:          /glade/campaign/univ/ubrn0018/fengzhu/CESM_output/timeseri...
    gw:            <xarray.DataArray 'gw' (nlat: 384, nlon: 320)> Size: 983kB...
    lat:           <xarray.DataArray 'lat' (nlat: 384, nlon: 320)> Size: 983k...
    lon:           <xarray.DataArray 'lon' (nlat: 384, nlon: 320)> Size: 983k...
    comp:          ocn
    grid:          g16
[39]:
x4c.set_style('journal_spines', font_scale=1.2)
fig, ax = case.plot(spell)
../_images/notebooks_diags-spell_26_0.png
[ ]: