Heatwave Diagnostics Package (HDP) Live DemoΒΆ

What are heatwave metrics?ΒΆ

Heatwave metrics are designed to answer questions at scale that temperature analysis cannot. Consider the two temperature scenarios below:

(LENS1 001 ALL-Forcing, lat=30.63, lon=262.5, two different summers)

InΒ [4]:
import matplotlib.pyplot as plt
import numpy as np
import cftime
import xarray


path1 = "/projects/dgs/persad_research/SIMULATION_DATA/ZARR/LENS1/SIM_VARIABLES/all_day_TREFHTMN.zarr"
path2 = "/projects/dgs/persad_research/SIMULATION_DATA/ZARR/LENS1/SIM_VARIABLES/all_day_TREFHTMX.zarr"
ds1 = xarray.open_zarr(path1)["TREFHTMN"].sel(member="001").sel(lat=30.26, lon=360-97.74, method='nearest')
ds2 = xarray.open_zarr(path2)["TREFHTMX"].sel(member="001").sel(lat=30.26, lon=360-97.74, method='nearest')

ds = (ds1 + ds2) / 2

start_a = cftime.DatetimeNoLeap(2021, 7, 1, 0, 0, 0, 0, has_year_zero=True)
end_a = cftime.DatetimeNoLeap(2021, 8, 30, 0, 0, 0, 0, has_year_zero=True)

start_b = cftime.DatetimeNoLeap(2024, 7, 1, 0, 0, 0, 0, has_year_zero=True)
end_b = cftime.DatetimeNoLeap(2024, 8, 30, 0, 0, 0, 0, has_year_zero=True)

scenario_a = (ds - 273.15).sel(time=slice(start_a, end_a))
scenario_b = (ds - 273.15).sel(time=slice(start_b, end_b))

f, (ax1, ax2) = plt.subplots(1, 2, figsize=(20, 6), facecolor='w')

scenario_a.plot(ax=ax1, color="Red", label="TREFHT")
scenario_b.plot(ax=ax2, color="Red", label="TREFHT")

ax1.plot([start_a, end_a], [scenario_a.mean(), scenario_a.mean()], color="Black", label="Time Average", linestyle="--")
ax2.plot([start_b, end_b], [scenario_b.mean(), scenario_b.mean()], color="Black", label="Time Average", linestyle="--")

ax1.set_title("Temperature Scenario A", fontsize=20)
ax2.set_title("Temperature Scenario B", fontsize=20)

ax1.set_ylabel("Temperature ($\\degree$C)", fontsize=15)
ax2.set_ylabel("Temperature ($\\degree$C)", fontsize=15)

ax1.set_xlabel("Time (Date)", fontsize=15)
ax2.set_xlabel("Time (Date)", fontsize=15)

ax1.set_ylim(22, 34)
ax2.set_ylim(22, 34)

ax1.set_xticks(
    [
        cftime.DatetimeNoLeap(2021, 7, 1, 0, 0, 0, 0, has_year_zero=True),
        cftime.DatetimeNoLeap(2021, 7, 15, 0, 0, 0, 0, has_year_zero=True),
        cftime.DatetimeNoLeap(2021, 8, 1, 0, 0, 0, 0, has_year_zero=True),
        cftime.DatetimeNoLeap(2021, 8, 15, 0, 0, 0, 0, has_year_zero=True),
        cftime.DatetimeNoLeap(2021, 8, 30, 0, 0, 0, 0, has_year_zero=True)
    ]
)

ax2.set_xticks(
    [
        cftime.DatetimeNoLeap(2024, 7, 1, 0, 0, 0, 0, has_year_zero=True),
        cftime.DatetimeNoLeap(2024, 7, 15, 0, 0, 0, 0, has_year_zero=True),
        cftime.DatetimeNoLeap(2024, 8, 1, 0, 0, 0, 0, has_year_zero=True),
        cftime.DatetimeNoLeap(2024, 8, 15, 0, 0, 0, 0, has_year_zero=True),
        cftime.DatetimeNoLeap(2024, 8, 30, 0, 0, 0, 0, has_year_zero=True)
    ]
)

ax1.set_xlim(start_a, end_a)
ax2.set_xlim(start_b, end_b)

ax1.grid()
ax2.grid()

ax1.legend(fontsize=12)
ax2.legend(fontsize=12)
f.show()
No description has been provided for this image

The mean state for these two summers is the same, but the temporal structures are very different. We can easily compare the heatwave patterns between the two summers by hand, but what about the other summers? Probably not, and this is just for one grid cell:

InΒ [5]:
f, ax = plt.subplots(1, 1, figsize=(12, 6), facecolor='w')

(ds - 273.15).plot(ax=ax, color="Red")
ax.set_xlim(cftime.DatetimeNoLeap(2015, 12, 31, 0, 0, 0, 0, has_year_zero=True), cftime.DatetimeNoLeap(2080, 12, 31, 0, 0, 0, 0, has_year_zero=True))

ax.set_title("TREFHT LENS1 001 ALL-Forcing, lat=30.63, lon=262.5", fontsize=16)
ax.set_ylabel("Temperature ($\\degree$C)", fontsize=15)
ax.set_xlabel("Time (Date)", fontsize=15)
ax.set_ylim(-10, 40)
ax.grid()
No description has been provided for this image

Can we develop a system for automatically identifying heatwaves? Answer: yes!ΒΆ

First, we will use an extreme heat threshold for determining days of extreme heat. In the figure below, the red dots indicate hot days above that threshold:

image.png

A fixed or constant threshold may be useful for physical effects, such as material deformation, but is less useful for capturing physiological and environmental effects. Let's consider a seasonally variable threshold:

image.png

A seasonal threshold is typically generated by measuring the some percentile of day-of-year temperatures from a baseline dataset such as a preindustrial control or historical simulation. For example, the ETCCDI uses 90th percentile temperatures from 1961-1990.

The hot days identified by the threshold may or may not constitute a heatwave. Now we can start to identify heatwaves using a heatwave definition. The yellow dots in the figure below identify heatwave days alongside labels identifying each distinct heatwave.

We can sum the number of heatwave days to obtain a heatwave metric known as heatwave frequency (HWF).ΒΆ

image.png

We can modify the heatwave definition to filter for different "flavors" of heatwave. Notice how changing the definition influences which days constitute a heatwave, how many heatwaves are detected, and the value of HWF:

image.pngimage.png

The Heatwave Parameter SpaceΒΆ

This system takes in several inputs and choices to produce the heatwave metrics. We can generalize these inputs and choices to describe the "heatwave parameter space":

image.png

What is the HDP and what problem does it solve?ΒΆ

All of these parameters makes systematically quantifying heatwave metrics a non-trivial task, particularly when working with large ensembles of global climate model data. If we streamline this process and develop software that is computationally fast enough, we can efficicently sample large samples of this parameter space to better understand how heatwave patterns evolve in the climate system. The HDP therefore adheres to the FAIR software principles:

image.png

Live DemonstrationΒΆ

First, we import the packages we need:

InΒ [1]:
import xarray
import matplotlib.pyplot as plt
from dask.distributed import Client, LocalCluster
import src.hdp as hdp
import numpy as np
import cftime
import cartopy.crs as ccrs

Spin up a dask cluster to take advantage of parallel and distributed computing.

InΒ [2]:
cluster = LocalCluster(
    dashboard_address=":8004",
    memory_limit="50GB",
    threads_per_worker=2,
    processes=True
)
client = Client(cluster)
cluster.scale(20)
client
Out[2]:

Client

Client-c4fb3064-444c-11ef-b143-1423f23d0d20

Connection method: Cluster object Cluster type: distributed.LocalCluster
Dashboard: http://127.0.0.1:8004/status

Cluster Info

LocalCluster

ab351c75

Dashboard: http://127.0.0.1:8004/status Workers: 168
Total threads: 336 Total memory: 7.64 TiB
Status: running Using processes: True

Scheduler Info

Scheduler

Scheduler-5d13b6f3-672b-4059-a9b9-f1dfc372c8c3

Comm: tcp://127.0.0.1:46541 Workers: 168
Dashboard: http://127.0.0.1:8004/status Total threads: 336
Started: Just now Total memory: 7.64 TiB

Workers

Worker: 0

Comm: tcp://127.0.0.1:40235 Total threads: 2
Dashboard: http://127.0.0.1:32893/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:45913
Local directory: /tmp/dask-scratch-space/worker-vqneos_w

Worker: 1

Comm: tcp://127.0.0.1:38673 Total threads: 2
Dashboard: http://127.0.0.1:46825/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:43751
Local directory: /tmp/dask-scratch-space/worker-dd3fwhv6

Worker: 2

Comm: tcp://127.0.0.1:34569 Total threads: 2
Dashboard: http://127.0.0.1:38357/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:40723
Local directory: /tmp/dask-scratch-space/worker-3l34vhlz

Worker: 3

Comm: tcp://127.0.0.1:46361 Total threads: 2
Dashboard: http://127.0.0.1:38619/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:34131
Local directory: /tmp/dask-scratch-space/worker-af7jq2t1

Worker: 4

Comm: tcp://127.0.0.1:32933 Total threads: 2
Dashboard: http://127.0.0.1:33591/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:41017
Local directory: /tmp/dask-scratch-space/worker-ppd6wltj

Worker: 5

Comm: tcp://127.0.0.1:36721 Total threads: 2
Dashboard: http://127.0.0.1:42935/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:41771
Local directory: /tmp/dask-scratch-space/worker-z05cxcke

Worker: 6

Comm: tcp://127.0.0.1:40871 Total threads: 2
Dashboard: http://127.0.0.1:45173/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:34813
Local directory: /tmp/dask-scratch-space/worker-u51ss259

Worker: 7

Comm: tcp://127.0.0.1:41237 Total threads: 2
Dashboard: http://127.0.0.1:37295/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:36717
Local directory: /tmp/dask-scratch-space/worker-gurzc9ae

Worker: 8

Comm: tcp://127.0.0.1:40159 Total threads: 2
Dashboard: http://127.0.0.1:45973/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:41553
Local directory: /tmp/dask-scratch-space/worker-jcokhyty

Worker: 9

Comm: tcp://127.0.0.1:38099 Total threads: 2
Dashboard: http://127.0.0.1:33515/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:41779
Local directory: /tmp/dask-scratch-space/worker-3evfwe4n

Worker: 10

Comm: tcp://127.0.0.1:44813 Total threads: 2
Dashboard: http://127.0.0.1:37639/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:42645
Local directory: /tmp/dask-scratch-space/worker-46qdnx5e

Worker: 11

Comm: tcp://127.0.0.1:33309 Total threads: 2
Dashboard: http://127.0.0.1:40167/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:38555
Local directory: /tmp/dask-scratch-space/worker-pl28afya

Worker: 12

Comm: tcp://127.0.0.1:41907 Total threads: 2
Dashboard: http://127.0.0.1:34767/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:35613
Local directory: /tmp/dask-scratch-space/worker-f93w9_0l

Worker: 13

Comm: tcp://127.0.0.1:44957 Total threads: 2
Dashboard: http://127.0.0.1:41873/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:44303
Local directory: /tmp/dask-scratch-space/worker-owg3_gp5

Worker: 14

Comm: tcp://127.0.0.1:39887 Total threads: 2
Dashboard: http://127.0.0.1:42949/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:40125
Local directory: /tmp/dask-scratch-space/worker-1j6_ze2j

Worker: 15

Comm: tcp://127.0.0.1:36661 Total threads: 2
Dashboard: http://127.0.0.1:43607/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:46271
Local directory: /tmp/dask-scratch-space/worker-viv2bg0e

Worker: 16

Comm: tcp://127.0.0.1:38807 Total threads: 2
Dashboard: http://127.0.0.1:46477/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:38785
Local directory: /tmp/dask-scratch-space/worker-xkx7iml8

Worker: 17

Comm: tcp://127.0.0.1:43737 Total threads: 2
Dashboard: http://127.0.0.1:45383/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:46321
Local directory: /tmp/dask-scratch-space/worker-zcuequtb

Worker: 18

Comm: tcp://127.0.0.1:41021 Total threads: 2
Dashboard: http://127.0.0.1:39257/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:32967
Local directory: /tmp/dask-scratch-space/worker-pel9k7b7

Worker: 19

Comm: tcp://127.0.0.1:34243 Total threads: 2
Dashboard: http://127.0.0.1:33585/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:39899
Local directory: /tmp/dask-scratch-space/worker-gf5b7s13

Worker: 20

Comm: tcp://127.0.0.1:44581 Total threads: 2
Dashboard: http://127.0.0.1:44671/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:34805
Local directory: /tmp/dask-scratch-space/worker-ka01o4og

Worker: 21

Comm: tcp://127.0.0.1:45263 Total threads: 2
Dashboard: http://127.0.0.1:46279/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:38343
Local directory: /tmp/dask-scratch-space/worker-0m1bplso

Worker: 22

Comm: tcp://127.0.0.1:41421 Total threads: 2
Dashboard: http://127.0.0.1:42723/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:38837
Local directory: /tmp/dask-scratch-space/worker-my9bfqns

Worker: 23

Comm: tcp://127.0.0.1:37183 Total threads: 2
Dashboard: http://127.0.0.1:33729/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:42717
Local directory: /tmp/dask-scratch-space/worker-a2820bfr

Worker: 24

Comm: tcp://127.0.0.1:35551 Total threads: 2
Dashboard: http://127.0.0.1:45083/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:45993
Local directory: /tmp/dask-scratch-space/worker-z3016u4s

Worker: 25

Comm: tcp://127.0.0.1:41789 Total threads: 2
Dashboard: http://127.0.0.1:35889/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:44507
Local directory: /tmp/dask-scratch-space/worker-aeteqo7t

Worker: 26

Comm: tcp://127.0.0.1:38889 Total threads: 2
Dashboard: http://127.0.0.1:33297/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:42719
Local directory: /tmp/dask-scratch-space/worker-2e42q3y9

Worker: 27

Comm: tcp://127.0.0.1:45833 Total threads: 2
Dashboard: http://127.0.0.1:34057/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:42849
Local directory: /tmp/dask-scratch-space/worker-4dp6s5pq

Worker: 28

Comm: tcp://127.0.0.1:34667 Total threads: 2
Dashboard: http://127.0.0.1:43253/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:46153
Local directory: /tmp/dask-scratch-space/worker-gp88_cis

Worker: 29

Comm: tcp://127.0.0.1:38871 Total threads: 2
Dashboard: http://127.0.0.1:40201/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:35781
Local directory: /tmp/dask-scratch-space/worker-_dwc2j5r

Worker: 30

Comm: tcp://127.0.0.1:34077 Total threads: 2
Dashboard: http://127.0.0.1:33231/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:39995
Local directory: /tmp/dask-scratch-space/worker-5ikqwgv9

Worker: 31

Comm: tcp://127.0.0.1:32781 Total threads: 2
Dashboard: http://127.0.0.1:42177/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:39719
Local directory: /tmp/dask-scratch-space/worker-yx61_8df

Worker: 32

Comm: tcp://127.0.0.1:33289 Total threads: 2
Dashboard: http://127.0.0.1:42363/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:35763
Local directory: /tmp/dask-scratch-space/worker-2zg0m92a

Worker: 33

Comm: tcp://127.0.0.1:36063 Total threads: 2
Dashboard: http://127.0.0.1:36247/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:35149
Local directory: /tmp/dask-scratch-space/worker-u8yrzw9o

Worker: 34

Comm: tcp://127.0.0.1:33371 Total threads: 2
Dashboard: http://127.0.0.1:33607/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:32779
Local directory: /tmp/dask-scratch-space/worker-spjpe582

Worker: 35

Comm: tcp://127.0.0.1:46085 Total threads: 2
Dashboard: http://127.0.0.1:34849/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:42597
Local directory: /tmp/dask-scratch-space/worker-5_zo_sm9

Worker: 36

Comm: tcp://127.0.0.1:39983 Total threads: 2
Dashboard: http://127.0.0.1:35419/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:40131
Local directory: /tmp/dask-scratch-space/worker-iftj4gn1

Worker: 37

Comm: tcp://127.0.0.1:43891 Total threads: 2
Dashboard: http://127.0.0.1:39515/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:38107
Local directory: /tmp/dask-scratch-space/worker-lqlktjsq

Worker: 38

Comm: tcp://127.0.0.1:40257 Total threads: 2
Dashboard: http://127.0.0.1:40147/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:43949
Local directory: /tmp/dask-scratch-space/worker-5ozju3e_

Worker: 39

Comm: tcp://127.0.0.1:37041 Total threads: 2
Dashboard: http://127.0.0.1:41171/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:36713
Local directory: /tmp/dask-scratch-space/worker-99cueyxx

Worker: 40

Comm: tcp://127.0.0.1:43461 Total threads: 2
Dashboard: http://127.0.0.1:44363/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:41947
Local directory: /tmp/dask-scratch-space/worker-msb5rz8e

Worker: 41

Comm: tcp://127.0.0.1:44599 Total threads: 2
Dashboard: http://127.0.0.1:43905/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:33333
Local directory: /tmp/dask-scratch-space/worker-hxz2q7mr

Worker: 42

Comm: tcp://127.0.0.1:40293 Total threads: 2
Dashboard: http://127.0.0.1:39513/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:36295
Local directory: /tmp/dask-scratch-space/worker-n3od5rxk

Worker: 43

Comm: tcp://127.0.0.1:38517 Total threads: 2
Dashboard: http://127.0.0.1:45707/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:36341
Local directory: /tmp/dask-scratch-space/worker-vg_04mg1

Worker: 44

Comm: tcp://127.0.0.1:36951 Total threads: 2
Dashboard: http://127.0.0.1:37817/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:46015
Local directory: /tmp/dask-scratch-space/worker-8enkq434

Worker: 45

Comm: tcp://127.0.0.1:33749 Total threads: 2
Dashboard: http://127.0.0.1:35511/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:35509
Local directory: /tmp/dask-scratch-space/worker-blip8c4u

Worker: 46

Comm: tcp://127.0.0.1:39611 Total threads: 2
Dashboard: http://127.0.0.1:42981/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:36715
Local directory: /tmp/dask-scratch-space/worker-7_f3lf7o

Worker: 47

Comm: tcp://127.0.0.1:46121 Total threads: 2
Dashboard: http://127.0.0.1:45495/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:44341
Local directory: /tmp/dask-scratch-space/worker-a7p7tpe8

Worker: 48

Comm: tcp://127.0.0.1:41981 Total threads: 2
Dashboard: http://127.0.0.1:43893/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:36615
Local directory: /tmp/dask-scratch-space/worker-bf34avme

Worker: 49

Comm: tcp://127.0.0.1:37109 Total threads: 2
Dashboard: http://127.0.0.1:42851/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:41429
Local directory: /tmp/dask-scratch-space/worker-n7ay6jnl

Worker: 50

Comm: tcp://127.0.0.1:42599 Total threads: 2
Dashboard: http://127.0.0.1:38489/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:45657
Local directory: /tmp/dask-scratch-space/worker-1i7xnpzj

Worker: 51

Comm: tcp://127.0.0.1:46467 Total threads: 2
Dashboard: http://127.0.0.1:46281/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:41401
Local directory: /tmp/dask-scratch-space/worker-4r475m88

Worker: 52

Comm: tcp://127.0.0.1:39497 Total threads: 2
Dashboard: http://127.0.0.1:39715/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:42937
Local directory: /tmp/dask-scratch-space/worker-35z4mb6t

Worker: 53

Comm: tcp://127.0.0.1:34321 Total threads: 2
Dashboard: http://127.0.0.1:39145/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:36377
Local directory: /tmp/dask-scratch-space/worker-fv46n4dr

Worker: 54

Comm: tcp://127.0.0.1:35925 Total threads: 2
Dashboard: http://127.0.0.1:33701/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:36445
Local directory: /tmp/dask-scratch-space/worker-m_vlm58n

Worker: 55

Comm: tcp://127.0.0.1:39563 Total threads: 2
Dashboard: http://127.0.0.1:36461/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:36795
Local directory: /tmp/dask-scratch-space/worker-95t50rfw

Worker: 56

Comm: tcp://127.0.0.1:45313 Total threads: 2
Dashboard: http://127.0.0.1:45365/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:36743
Local directory: /tmp/dask-scratch-space/worker-sncaay64

Worker: 57

Comm: tcp://127.0.0.1:44409 Total threads: 2
Dashboard: http://127.0.0.1:40177/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:33287
Local directory: /tmp/dask-scratch-space/worker-gh9tawlg

Worker: 58

Comm: tcp://127.0.0.1:37487 Total threads: 2
Dashboard: http://127.0.0.1:33709/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:36483
Local directory: /tmp/dask-scratch-space/worker-2xq5fiax

Worker: 59

Comm: tcp://127.0.0.1:40835 Total threads: 2
Dashboard: http://127.0.0.1:37245/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:45949
Local directory: /tmp/dask-scratch-space/worker-zdhppmib

Worker: 60

Comm: tcp://127.0.0.1:42925 Total threads: 2
Dashboard: http://127.0.0.1:34827/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:42093
Local directory: /tmp/dask-scratch-space/worker-np_luekh

Worker: 61

Comm: tcp://127.0.0.1:45201 Total threads: 2
Dashboard: http://127.0.0.1:42139/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:37165
Local directory: /tmp/dask-scratch-space/worker-ns2xg6xl

Worker: 62

Comm: tcp://127.0.0.1:35979 Total threads: 2
Dashboard: http://127.0.0.1:43105/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:45413
Local directory: /tmp/dask-scratch-space/worker-e915cpcl

Worker: 63

Comm: tcp://127.0.0.1:34665 Total threads: 2
Dashboard: http://127.0.0.1:38983/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:43545
Local directory: /tmp/dask-scratch-space/worker-bj8l_a_l

Worker: 64

Comm: tcp://127.0.0.1:45475 Total threads: 2
Dashboard: http://127.0.0.1:41963/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:35677
Local directory: /tmp/dask-scratch-space/worker-nyw5lbu1

Worker: 65

Comm: tcp://127.0.0.1:41423 Total threads: 2
Dashboard: http://127.0.0.1:46817/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:41083
Local directory: /tmp/dask-scratch-space/worker-klwaeefx

Worker: 66

Comm: tcp://127.0.0.1:44645 Total threads: 2
Dashboard: http://127.0.0.1:40505/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:45615
Local directory: /tmp/dask-scratch-space/worker-f7f10x5k

Worker: 67

Comm: tcp://127.0.0.1:40015 Total threads: 2
Dashboard: http://127.0.0.1:40263/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:41003
Local directory: /tmp/dask-scratch-space/worker-rcwidb9w

Worker: 68

Comm: tcp://127.0.0.1:38175 Total threads: 2
Dashboard: http://127.0.0.1:38017/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:42813
Local directory: /tmp/dask-scratch-space/worker-zgqlb_kt

Worker: 69

Comm: tcp://127.0.0.1:44291 Total threads: 2
Dashboard: http://127.0.0.1:45667/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:45571
Local directory: /tmp/dask-scratch-space/worker-7fotqv4p

Worker: 70

Comm: tcp://127.0.0.1:43535 Total threads: 2
Dashboard: http://127.0.0.1:45747/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:36177
Local directory: /tmp/dask-scratch-space/worker-f2jz4u0c

Worker: 71

Comm: tcp://127.0.0.1:35625 Total threads: 2
Dashboard: http://127.0.0.1:37801/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:36025
Local directory: /tmp/dask-scratch-space/worker-pnlmvini

Worker: 72

Comm: tcp://127.0.0.1:34389 Total threads: 2
Dashboard: http://127.0.0.1:43179/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:42247
Local directory: /tmp/dask-scratch-space/worker-mhkw6q5o

Worker: 73

Comm: tcp://127.0.0.1:40645 Total threads: 2
Dashboard: http://127.0.0.1:37269/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:36729
Local directory: /tmp/dask-scratch-space/worker-d87xchl2

Worker: 74

Comm: tcp://127.0.0.1:44111 Total threads: 2
Dashboard: http://127.0.0.1:34615/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:37969
Local directory: /tmp/dask-scratch-space/worker-g3z0vn9j

Worker: 75

Comm: tcp://127.0.0.1:34605 Total threads: 2
Dashboard: http://127.0.0.1:40457/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:40971
Local directory: /tmp/dask-scratch-space/worker-d5l19vfi

Worker: 76

Comm: tcp://127.0.0.1:41685 Total threads: 2
Dashboard: http://127.0.0.1:39487/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:45155
Local directory: /tmp/dask-scratch-space/worker-n8qogpws

Worker: 77

Comm: tcp://127.0.0.1:43875 Total threads: 2
Dashboard: http://127.0.0.1:43379/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:36719
Local directory: /tmp/dask-scratch-space/worker-h4vepwq9

Worker: 78

Comm: tcp://127.0.0.1:34413 Total threads: 2
Dashboard: http://127.0.0.1:42823/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:44389
Local directory: /tmp/dask-scratch-space/worker-x_l92yvk

Worker: 79

Comm: tcp://127.0.0.1:33761 Total threads: 2
Dashboard: http://127.0.0.1:40043/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:45633
Local directory: /tmp/dask-scratch-space/worker-_afm18lw

Worker: 80

Comm: tcp://127.0.0.1:40615 Total threads: 2
Dashboard: http://127.0.0.1:34107/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:46029
Local directory: /tmp/dask-scratch-space/worker-a9rg4wu2

Worker: 81

Comm: tcp://127.0.0.1:43045 Total threads: 2
Dashboard: http://127.0.0.1:43941/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:35815
Local directory: /tmp/dask-scratch-space/worker-wffm1ehq

Worker: 82

Comm: tcp://127.0.0.1:44275 Total threads: 2
Dashboard: http://127.0.0.1:46819/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:40561
Local directory: /tmp/dask-scratch-space/worker-vcow_l31

Worker: 83

Comm: tcp://127.0.0.1:33335 Total threads: 2
Dashboard: http://127.0.0.1:43039/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:37315
Local directory: /tmp/dask-scratch-space/worker-j81sra61

Worker: 84

Comm: tcp://127.0.0.1:33437 Total threads: 2
Dashboard: http://127.0.0.1:36279/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:43629
Local directory: /tmp/dask-scratch-space/worker-4naegvbc

Worker: 85

Comm: tcp://127.0.0.1:40987 Total threads: 2
Dashboard: http://127.0.0.1:40867/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:46295
Local directory: /tmp/dask-scratch-space/worker-of27b_80

Worker: 86

Comm: tcp://127.0.0.1:39979 Total threads: 2
Dashboard: http://127.0.0.1:42939/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:34795
Local directory: /tmp/dask-scratch-space/worker-2l_lq3a5

Worker: 87

Comm: tcp://127.0.0.1:39553 Total threads: 2
Dashboard: http://127.0.0.1:44399/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:36771
Local directory: /tmp/dask-scratch-space/worker-bw7oqzw_

Worker: 88

Comm: tcp://127.0.0.1:43689 Total threads: 2
Dashboard: http://127.0.0.1:37545/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:43141
Local directory: /tmp/dask-scratch-space/worker-lylwyzib

Worker: 89

Comm: tcp://127.0.0.1:37157 Total threads: 2
Dashboard: http://127.0.0.1:46067/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:32827
Local directory: /tmp/dask-scratch-space/worker-45f29nfx

Worker: 90

Comm: tcp://127.0.0.1:35069 Total threads: 2
Dashboard: http://127.0.0.1:39927/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:45895
Local directory: /tmp/dask-scratch-space/worker-qy3nh7ib

Worker: 91

Comm: tcp://127.0.0.1:39671 Total threads: 2
Dashboard: http://127.0.0.1:42433/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:33209
Local directory: /tmp/dask-scratch-space/worker-liw58u8a

Worker: 92

Comm: tcp://127.0.0.1:45367 Total threads: 2
Dashboard: http://127.0.0.1:35357/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:46831
Local directory: /tmp/dask-scratch-space/worker-opdvmc_5

Worker: 93

Comm: tcp://127.0.0.1:40821 Total threads: 2
Dashboard: http://127.0.0.1:41653/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:43763
Local directory: /tmp/dask-scratch-space/worker-5fc8byhz

Worker: 94

Comm: tcp://127.0.0.1:34117 Total threads: 2
Dashboard: http://127.0.0.1:32891/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:43067
Local directory: /tmp/dask-scratch-space/worker-s5k1_w4m

Worker: 95

Comm: tcp://127.0.0.1:44287 Total threads: 2
Dashboard: http://127.0.0.1:46417/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:35223
Local directory: /tmp/dask-scratch-space/worker-aparuqwz

Worker: 96

Comm: tcp://127.0.0.1:41315 Total threads: 2
Dashboard: http://127.0.0.1:45473/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:40191
Local directory: /tmp/dask-scratch-space/worker-vhx5kf_s

Worker: 97

Comm: tcp://127.0.0.1:44875 Total threads: 2
Dashboard: http://127.0.0.1:41425/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:43363
Local directory: /tmp/dask-scratch-space/worker-jni6qrw0

Worker: 98

Comm: tcp://127.0.0.1:36755 Total threads: 2
Dashboard: http://127.0.0.1:40307/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:45897
Local directory: /tmp/dask-scratch-space/worker-52dxf0rg

Worker: 99

Comm: tcp://127.0.0.1:33495 Total threads: 2
Dashboard: http://127.0.0.1:36575/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:40979
Local directory: /tmp/dask-scratch-space/worker-3ty_2748

Worker: 100

Comm: tcp://127.0.0.1:40551 Total threads: 2
Dashboard: http://127.0.0.1:44913/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:35405
Local directory: /tmp/dask-scratch-space/worker-d73_cq83

Worker: 101

Comm: tcp://127.0.0.1:36551 Total threads: 2
Dashboard: http://127.0.0.1:34199/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:34217
Local directory: /tmp/dask-scratch-space/worker-hox28jah

Worker: 102

Comm: tcp://127.0.0.1:43817 Total threads: 2
Dashboard: http://127.0.0.1:44727/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:41773
Local directory: /tmp/dask-scratch-space/worker-2a4lzgh0

Worker: 103

Comm: tcp://127.0.0.1:43759 Total threads: 2
Dashboard: http://127.0.0.1:42615/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:44871
Local directory: /tmp/dask-scratch-space/worker-6__fih0q

Worker: 104

Comm: tcp://127.0.0.1:38085 Total threads: 2
Dashboard: http://127.0.0.1:37745/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:38075
Local directory: /tmp/dask-scratch-space/worker-8bbroc3g

Worker: 105

Comm: tcp://127.0.0.1:38797 Total threads: 2
Dashboard: http://127.0.0.1:45397/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:43071
Local directory: /tmp/dask-scratch-space/worker-m2iyu1x9

Worker: 106

Comm: tcp://127.0.0.1:37195 Total threads: 2
Dashboard: http://127.0.0.1:35199/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:44071
Local directory: /tmp/dask-scratch-space/worker-wvxevix5

Worker: 107

Comm: tcp://127.0.0.1:40763 Total threads: 2
Dashboard: http://127.0.0.1:44209/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:35669
Local directory: /tmp/dask-scratch-space/worker-zksabfak

Worker: 108

Comm: tcp://127.0.0.1:33541 Total threads: 2
Dashboard: http://127.0.0.1:35853/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:42257
Local directory: /tmp/dask-scratch-space/worker-eqj1swn0

Worker: 109

Comm: tcp://127.0.0.1:45839 Total threads: 2
Dashboard: http://127.0.0.1:36471/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:40117
Local directory: /tmp/dask-scratch-space/worker-59dlma9t

Worker: 110

Comm: tcp://127.0.0.1:46431 Total threads: 2
Dashboard: http://127.0.0.1:37607/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:46763
Local directory: /tmp/dask-scratch-space/worker-2j6nzdui

Worker: 111

Comm: tcp://127.0.0.1:40981 Total threads: 2
Dashboard: http://127.0.0.1:34895/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:45059
Local directory: /tmp/dask-scratch-space/worker-68vucuu7

Worker: 112

Comm: tcp://127.0.0.1:45009 Total threads: 2
Dashboard: http://127.0.0.1:44493/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:36027
Local directory: /tmp/dask-scratch-space/worker-upjafwvq

Worker: 113

Comm: tcp://127.0.0.1:45269 Total threads: 2
Dashboard: http://127.0.0.1:43133/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:34281
Local directory: /tmp/dask-scratch-space/worker-vun0v2wi

Worker: 114

Comm: tcp://127.0.0.1:46211 Total threads: 2
Dashboard: http://127.0.0.1:33543/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:40499
Local directory: /tmp/dask-scratch-space/worker-tobdzmvv

Worker: 115

Comm: tcp://127.0.0.1:45497 Total threads: 2
Dashboard: http://127.0.0.1:35463/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:37189
Local directory: /tmp/dask-scratch-space/worker-fdiu5u97

Worker: 116

Comm: tcp://127.0.0.1:45825 Total threads: 2
Dashboard: http://127.0.0.1:43483/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:43257
Local directory: /tmp/dask-scratch-space/worker-7uacstnz

Worker: 117

Comm: tcp://127.0.0.1:45485 Total threads: 2
Dashboard: http://127.0.0.1:37163/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:43643
Local directory: /tmp/dask-scratch-space/worker-i5k5vwb5

Worker: 118

Comm: tcp://127.0.0.1:36633 Total threads: 2
Dashboard: http://127.0.0.1:37895/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:37887
Local directory: /tmp/dask-scratch-space/worker-lmmj6f7y

Worker: 119

Comm: tcp://127.0.0.1:37821 Total threads: 2
Dashboard: http://127.0.0.1:35353/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:33015
Local directory: /tmp/dask-scratch-space/worker-ghyrtq2m

Worker: 120

Comm: tcp://127.0.0.1:37413 Total threads: 2
Dashboard: http://127.0.0.1:42137/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:44283
Local directory: /tmp/dask-scratch-space/worker-9miinvnr

Worker: 121

Comm: tcp://127.0.0.1:33279 Total threads: 2
Dashboard: http://127.0.0.1:38123/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:35255
Local directory: /tmp/dask-scratch-space/worker-ayn49kvq

Worker: 122

Comm: tcp://127.0.0.1:39007 Total threads: 2
Dashboard: http://127.0.0.1:42097/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:40681
Local directory: /tmp/dask-scratch-space/worker-higj94bj

Worker: 123

Comm: tcp://127.0.0.1:43687 Total threads: 2
Dashboard: http://127.0.0.1:40663/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:39593
Local directory: /tmp/dask-scratch-space/worker-2ux24z7u

Worker: 124

Comm: tcp://127.0.0.1:44497 Total threads: 2
Dashboard: http://127.0.0.1:44031/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:37605
Local directory: /tmp/dask-scratch-space/worker-w80qb5ds

Worker: 125

Comm: tcp://127.0.0.1:37229 Total threads: 2
Dashboard: http://127.0.0.1:36507/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:40689
Local directory: /tmp/dask-scratch-space/worker-4xzhtkro

Worker: 126

Comm: tcp://127.0.0.1:40379 Total threads: 2
Dashboard: http://127.0.0.1:34727/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:45231
Local directory: /tmp/dask-scratch-space/worker-mci43e8g

Worker: 127

Comm: tcp://127.0.0.1:45499 Total threads: 2
Dashboard: http://127.0.0.1:45159/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:46409
Local directory: /tmp/dask-scratch-space/worker-8aa9haj0

Worker: 128

Comm: tcp://127.0.0.1:45635 Total threads: 2
Dashboard: http://127.0.0.1:40055/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:38299
Local directory: /tmp/dask-scratch-space/worker-w8b359bv

Worker: 129

Comm: tcp://127.0.0.1:34369 Total threads: 2
Dashboard: http://127.0.0.1:33439/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:45261
Local directory: /tmp/dask-scratch-space/worker-0ex7i6zc

Worker: 130

Comm: tcp://127.0.0.1:38845 Total threads: 2
Dashboard: http://127.0.0.1:35367/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:43623
Local directory: /tmp/dask-scratch-space/worker-6z4dgp20

Worker: 131

Comm: tcp://127.0.0.1:33789 Total threads: 2
Dashboard: http://127.0.0.1:42735/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:33201
Local directory: /tmp/dask-scratch-space/worker-1svqpv10

Worker: 132

Comm: tcp://127.0.0.1:37391 Total threads: 2
Dashboard: http://127.0.0.1:44517/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:35835
Local directory: /tmp/dask-scratch-space/worker-8aee6vyq

Worker: 133

Comm: tcp://127.0.0.1:44831 Total threads: 2
Dashboard: http://127.0.0.1:34325/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:43405
Local directory: /tmp/dask-scratch-space/worker-31jhipcg

Worker: 134

Comm: tcp://127.0.0.1:35549 Total threads: 2
Dashboard: http://127.0.0.1:41191/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:42379
Local directory: /tmp/dask-scratch-space/worker-nnkzq_yz

Worker: 135

Comm: tcp://127.0.0.1:33563 Total threads: 2
Dashboard: http://127.0.0.1:38491/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:40895
Local directory: /tmp/dask-scratch-space/worker-mb34hiww

Worker: 136

Comm: tcp://127.0.0.1:34555 Total threads: 2
Dashboard: http://127.0.0.1:40839/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:43929
Local directory: /tmp/dask-scratch-space/worker-0wnnr_jm

Worker: 137

Comm: tcp://127.0.0.1:36287 Total threads: 2
Dashboard: http://127.0.0.1:46517/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:43259
Local directory: /tmp/dask-scratch-space/worker-gea0eipo

Worker: 138

Comm: tcp://127.0.0.1:38443 Total threads: 2
Dashboard: http://127.0.0.1:35407/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:35519
Local directory: /tmp/dask-scratch-space/worker-948we71n

Worker: 139

Comm: tcp://127.0.0.1:33205 Total threads: 2
Dashboard: http://127.0.0.1:38185/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:39975
Local directory: /tmp/dask-scratch-space/worker-bae67e4j

Worker: 140

Comm: tcp://127.0.0.1:44903 Total threads: 2
Dashboard: http://127.0.0.1:37933/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:39357
Local directory: /tmp/dask-scratch-space/worker-6qo16chz

Worker: 141

Comm: tcp://127.0.0.1:33101 Total threads: 2
Dashboard: http://127.0.0.1:35795/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:35349
Local directory: /tmp/dask-scratch-space/worker-ctq2qczo

Worker: 142

Comm: tcp://127.0.0.1:44467 Total threads: 2
Dashboard: http://127.0.0.1:39221/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:44909
Local directory: /tmp/dask-scratch-space/worker-r7k88u22

Worker: 143

Comm: tcp://127.0.0.1:44815 Total threads: 2
Dashboard: http://127.0.0.1:45621/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:40027
Local directory: /tmp/dask-scratch-space/worker-u_3mtxtt

Worker: 144

Comm: tcp://127.0.0.1:32953 Total threads: 2
Dashboard: http://127.0.0.1:40683/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:43425
Local directory: /tmp/dask-scratch-space/worker-w6_ue73r

Worker: 145

Comm: tcp://127.0.0.1:35921 Total threads: 2
Dashboard: http://127.0.0.1:34817/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:44799
Local directory: /tmp/dask-scratch-space/worker-23vfokjj

Worker: 146

Comm: tcp://127.0.0.1:40859 Total threads: 2
Dashboard: http://127.0.0.1:39049/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:33203
Local directory: /tmp/dask-scratch-space/worker-dhxgeh0g

Worker: 147

Comm: tcp://127.0.0.1:38783 Total threads: 2
Dashboard: http://127.0.0.1:37945/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:37369
Local directory: /tmp/dask-scratch-space/worker-l3rlasqj

Worker: 148

Comm: tcp://127.0.0.1:36849 Total threads: 2
Dashboard: http://127.0.0.1:45681/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:37565
Local directory: /tmp/dask-scratch-space/worker-eajazkxl

Worker: 149

Comm: tcp://127.0.0.1:34419 Total threads: 2
Dashboard: http://127.0.0.1:44843/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:33511
Local directory: /tmp/dask-scratch-space/worker-2f83jqca

Worker: 150

Comm: tcp://127.0.0.1:42399 Total threads: 2
Dashboard: http://127.0.0.1:38003/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:35851
Local directory: /tmp/dask-scratch-space/worker-y9b9js1l

Worker: 151

Comm: tcp://127.0.0.1:45105 Total threads: 2
Dashboard: http://127.0.0.1:46779/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:40059
Local directory: /tmp/dask-scratch-space/worker-nx8zk6s_

Worker: 152

Comm: tcp://127.0.0.1:41519 Total threads: 2
Dashboard: http://127.0.0.1:35849/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:44349
Local directory: /tmp/dask-scratch-space/worker-94i8v7a4

Worker: 153

Comm: tcp://127.0.0.1:42467 Total threads: 2
Dashboard: http://127.0.0.1:33353/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:44095
Local directory: /tmp/dask-scratch-space/worker-9tfbqmo4

Worker: 154

Comm: tcp://127.0.0.1:41809 Total threads: 2
Dashboard: http://127.0.0.1:37435/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:37491
Local directory: /tmp/dask-scratch-space/worker-_ufoeio1

Worker: 155

Comm: tcp://127.0.0.1:36387 Total threads: 2
Dashboard: http://127.0.0.1:36635/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:45243
Local directory: /tmp/dask-scratch-space/worker-gp2elojv

Worker: 156

Comm: tcp://127.0.0.1:46109 Total threads: 2
Dashboard: http://127.0.0.1:41745/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:41705
Local directory: /tmp/dask-scratch-space/worker-06uh0r9z

Worker: 157

Comm: tcp://127.0.0.1:35939 Total threads: 2
Dashboard: http://127.0.0.1:35493/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:39203
Local directory: /tmp/dask-scratch-space/worker-q9zq3k9l

Worker: 158

Comm: tcp://127.0.0.1:46143 Total threads: 2
Dashboard: http://127.0.0.1:33593/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:44695
Local directory: /tmp/dask-scratch-space/worker-w05xg1bi

Worker: 159

Comm: tcp://127.0.0.1:35247 Total threads: 2
Dashboard: http://127.0.0.1:34445/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:36159
Local directory: /tmp/dask-scratch-space/worker-43sn9dqo

Worker: 160

Comm: tcp://127.0.0.1:40445 Total threads: 2
Dashboard: http://127.0.0.1:37145/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:34573
Local directory: /tmp/dask-scratch-space/worker-34wpxhqu

Worker: 161

Comm: tcp://127.0.0.1:39873 Total threads: 2
Dashboard: http://127.0.0.1:43423/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:40013
Local directory: /tmp/dask-scratch-space/worker-oxj4pycn

Worker: 162

Comm: tcp://127.0.0.1:36687 Total threads: 2
Dashboard: http://127.0.0.1:37653/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:43593
Local directory: /tmp/dask-scratch-space/worker-ipkct5oy

Worker: 163

Comm: tcp://127.0.0.1:39041 Total threads: 2
Dashboard: http://127.0.0.1:43121/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:40803
Local directory: /tmp/dask-scratch-space/worker-9gk7omzm

Worker: 164

Comm: tcp://127.0.0.1:46243 Total threads: 2
Dashboard: http://127.0.0.1:46429/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:35197
Local directory: /tmp/dask-scratch-space/worker-w28i9g2j

Worker: 165

Comm: tcp://127.0.0.1:38901 Total threads: 2
Dashboard: http://127.0.0.1:44775/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:41555
Local directory: /tmp/dask-scratch-space/worker-cv0o5i_1

Worker: 166

Comm: tcp://127.0.0.1:39055 Total threads: 2
Dashboard: http://127.0.0.1:39617/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:36143
Local directory: /tmp/dask-scratch-space/worker-vmvo1iuo

Worker: 167

Comm: tcp://127.0.0.1:37095 Total threads: 2
Dashboard: http://127.0.0.1:39925/status Memory: 46.57 GiB
Nanny: tcp://127.0.0.1:42047
Local directory: /tmp/dask-scratch-space/worker-xhibsmei

Load our pre-industrial control dataset, selecting a smaller time range for the sake of time.

InΒ [3]:
lens1_PIC_ensemble_trefhtmn_path = "/projects/dgs/persad_research/SIMULATION_DATA/ZARR/LENS1/SIM_VARIABLES/preindustrial_day_TREFHTMN.zarr"
lens1_PIC_ensemble_trefhtmn = xarray.open_zarr(lens1_PIC_ensemble_trefhtmn_path)["TREFHTMN"]

start_time = cftime.DatetimeNoLeap(1800, 1, 1, 0, 0, 0, 0, has_year_zero=True)
end_time = cftime.DatetimeNoLeap(1849, 12, 31, 0, 0, 0, 0, has_year_zero=True)
lens1_PIC_ensemble_trefhtmn = lens1_PIC_ensemble_trefhtmn.sel(time=slice(start_time, end_time))

Then call the HDP to compute a seasonally-varying threshold for a range of percentiles.

InΒ [4]:
pic_threshold_ds = hdp.compute_threshold(lens1_PIC_ensemble_trefhtmn, percentiles=np.array([0.9, 0.95, 0.99]))
pic_threshold_ds
Out[4]:
<xarray.Dataset> Size: 484MB
Dimensions:     (lat: 192, lon: 288, day: 365, percentile: 3)
Coordinates:
  * lon         (lon) float64 2kB 0.0 1.25 2.5 3.75 ... 355.0 356.2 357.5 358.8
  * lat         (lat) float64 2kB -90.0 -89.06 -88.12 ... 88.12 89.06 90.0
  * day         (day) int64 3kB 0 1 2 3 4 5 6 7 ... 358 359 360 361 362 363 364
  * percentile  (percentile) float64 24B 0.9 0.95 0.99
Data variables:
    threshold   (lat, lon, day, percentile) float64 484MB dask.array<chunksize=(48, 36, 365, 3), meta=np.ndarray>
Attributes:
    description:               Percentile temperatures.
    percentiles:               [0.9  0.95 0.99]
    temperature dataset path:  No path provided.
xarray.Dataset
    • lat: 192
    • lon: 288
    • day: 365
    • percentile: 3
    • lon
      (lon)
      float64
      0.0 1.25 2.5 ... 356.2 357.5 358.8
      array([  0.  ,   1.25,   2.5 , ..., 356.25, 357.5 , 358.75])
    • lat
      (lat)
      float64
      -90.0 -89.06 -88.12 ... 89.06 90.0
      array([-90.      , -89.057592, -88.115183, -87.172775, -86.230366, -85.287958,
             -84.34555 , -83.403141, -82.460733, -81.518325, -80.575916, -79.633508,
             -78.691099, -77.748691, -76.806283, -75.863874, -74.921466, -73.979058,
             -73.036649, -72.094241, -71.151832, -70.209424, -69.267016, -68.324607,
             -67.382199, -66.439791, -65.497382, -64.554974, -63.612565, -62.670157,
             -61.727749, -60.78534 , -59.842932, -58.900524, -57.958115, -57.015707,
             -56.073298, -55.13089 , -54.188482, -53.246073, -52.303665, -51.361257,
             -50.418848, -49.47644 , -48.534031, -47.591623, -46.649215, -45.706806,
             -44.764398, -43.82199 , -42.879581, -41.937173, -40.994764, -40.052356,
             -39.109948, -38.167539, -37.225131, -36.282723, -35.340314, -34.397906,
             -33.455497, -32.513089, -31.570681, -30.628272, -29.685864, -28.743455,
             -27.801047, -26.858639, -25.91623 , -24.973822, -24.031414, -23.089005,
             -22.146597, -21.204188, -20.26178 , -19.319372, -18.376963, -17.434555,
             -16.492147, -15.549738, -14.60733 , -13.664921, -12.722513, -11.780105,
             -10.837696,  -9.895288,  -8.95288 ,  -8.010471,  -7.068063,  -6.125654,
              -5.183246,  -4.240838,  -3.298429,  -2.356021,  -1.413613,  -0.471204,
               0.471204,   1.413613,   2.356021,   3.298429,   4.240838,   5.183246,
               6.125654,   7.068063,   8.010471,   8.95288 ,   9.895288,  10.837696,
              11.780105,  12.722513,  13.664921,  14.60733 ,  15.549738,  16.492147,
              17.434555,  18.376963,  19.319372,  20.26178 ,  21.204188,  22.146597,
              23.089005,  24.031414,  24.973822,  25.91623 ,  26.858639,  27.801047,
              28.743455,  29.685864,  30.628272,  31.570681,  32.513089,  33.455497,
              34.397906,  35.340314,  36.282723,  37.225131,  38.167539,  39.109948,
              40.052356,  40.994764,  41.937173,  42.879581,  43.82199 ,  44.764398,
              45.706806,  46.649215,  47.591623,  48.534031,  49.47644 ,  50.418848,
              51.361257,  52.303665,  53.246073,  54.188482,  55.13089 ,  56.073298,
              57.015707,  57.958115,  58.900524,  59.842932,  60.78534 ,  61.727749,
              62.670157,  63.612565,  64.554974,  65.497382,  66.439791,  67.382199,
              68.324607,  69.267016,  70.209424,  71.151832,  72.094241,  73.036649,
              73.979058,  74.921466,  75.863874,  76.806283,  77.748691,  78.691099,
              79.633508,  80.575916,  81.518325,  82.460733,  83.403141,  84.34555 ,
              85.287958,  86.230366,  87.172775,  88.115183,  89.057592,  90.      ])
    • day
      (day)
      int64
      0 1 2 3 4 5 ... 360 361 362 363 364
      array([  0,   1,   2, ..., 362, 363, 364])
    • percentile
      (percentile)
      float64
      0.9 0.95 0.99
      array([0.9 , 0.95, 0.99])
    • threshold
      (lat, lon, day, percentile)
      float64
      dask.array<chunksize=(48, 36, 365, 3), meta=np.ndarray>
      Array Chunk
      Bytes 461.95 MiB 14.44 MiB
      Shape (192, 288, 365, 3) (48, 36, 365, 3)
      Dask graph 32 chunks in 9 graph layers
      Data type float64 numpy.ndarray
      192 1 3 365 288
    • lon
      PandasIndex
      PandasIndex(Index([   0.0,   1.25,    2.5,   3.75,    5.0,   6.25,    7.5,   8.75,   10.0,
              11.25,
             ...
              347.5, 348.75,  350.0, 351.25,  352.5, 353.75,  355.0, 356.25,  357.5,
             358.75],
            dtype='float64', name='lon', length=288))
    • lat
      PandasIndex
      PandasIndex(Index([             -90.0, -89.05759162303664,  -88.1151832460733,
             -87.17277486910994,  -86.2303664921466, -85.28795811518324,
              -84.3455497382199, -83.40314136125654, -82.46073298429319,
             -81.51832460732984,
             ...
              81.51832460732984,   82.4607329842932,  83.40314136125653,
              84.34554973821989,  85.28795811518324,   86.2303664921466,
              87.17277486910996,  88.11518324607329,  89.05759162303664,
                           90.0],
            dtype='float64', name='lat', length=192))
    • day
      PandasIndex
      PandasIndex(Index([  0,   1,   2,   3,   4,   5,   6,   7,   8,   9,
             ...
             355, 356, 357, 358, 359, 360, 361, 362, 363, 364],
            dtype='int64', name='day', length=365))
    • percentile
      PandasIndex
      PandasIndex(Index([0.9, 0.95, 0.99], dtype='float64', name='percentile'))
  • description :
    Percentile temperatures.
    percentiles :
    [0.9 0.95 0.99]
    temperature dataset path :
    No path provided.
InΒ [5]:
%%time
pic_threshold_ds = pic_threshold_ds.compute()
CPU times: user 3.77 s, sys: 1.79 s, total: 5.56 s
Wall time: 32.9 s

To confirm our threshold, let's plot the global mean for a percentile:

InΒ [6]:
pic_threshold_ds["threshold"].weighted(np.cos(np.deg2rad(pic_threshold_ds.lat))).mean(dim=["lat", "lon"]).sel(percentile=0.9, method="nearest").plot()
Out[6]:
[<matplotlib.lines.Line2D at 0x7f75b71bc3b0>]
No description has been provided for this image

Now let's load the dataset we are interested in calculating heatwave metrics for. LENS1, ALL-forcing, we will select one ensemble member for the sake of time, but it is entirely possible to select more and add as many additional dimensions to the xarray dataset.

InΒ [7]:
lens1_ALL_ensemble_trefhtmn_path = "/projects/dgs/persad_research/SIMULATION_DATA/ZARR/LENS1/SIM_VARIABLES/all_day_TREFHTMN.zarr"
lens1_ALL_ensemble_trefhtmn = xarray.open_zarr(lens1_ALL_ensemble_trefhtmn_path)["TREFHTMN"].sel(member='001')

start_time = cftime.DatetimeNoLeap(2015, 1, 1, 0, 0, 0, 0, has_year_zero=True)
end_time = cftime.DatetimeNoLeap(2090, 12, 31, 0, 0, 0, 0, has_year_zero=True)

lens1_ALL_ensemble_trefhtmn = lens1_ALL_ensemble_trefhtmn.sel(time=slice(start_time, end_time))

We then call the HDP again to build our metric dataset, supplying our definitions. Note that it will only compute heatwave metrics for the warm seasons for bot hemispheres separately by default. In a future update, this will be easily configured.

InΒ [8]:
definitions = [
    [3, 0, 0],
    [3, 1, 1],
    [4, 0, 0],
    [4, 1, 1]
]

hw_metrics = hdp.sample_heatwave_metrics(lens1_ALL_ensemble_trefhtmn, pic_threshold_ds["threshold"], definitions)
hw_metrics
Out[8]:
<xarray.Dataset> Size: 807MB
Dimensions:     (percentile: 3, definition: 4, lat: 192, lon: 288, year: 76)
Coordinates:
  * lat         (lat) float64 2kB -90.0 -89.06 -88.12 ... 88.12 89.06 90.0
  * lon         (lon) float64 2kB 0.0 1.25 2.5 3.75 ... 355.0 356.2 357.5 358.8
    member      <U3 12B '001'
  * percentile  (percentile) float64 24B 0.9 0.95 0.99
  * year        (year) int64 608B 2015 2016 2017 2018 ... 2087 2088 2089 2090
  * definition  (definition) <U5 80B '3-0-0' '3-1-1' '4-0-0' '4-1-1'
Data variables:
    HWF         (percentile, definition, lat, lon, year) int64 403MB dask.array<chunksize=(1, 1, 96, 72, 76), meta=np.ndarray>
    HWD         (percentile, definition, lat, lon, year) int64 403MB dask.array<chunksize=(1, 1, 96, 72, 76), meta=np.ndarray>
xarray.Dataset
    • percentile: 3
    • definition: 4
    • lat: 192
    • lon: 288
    • year: 76
    • lat
      (lat)
      float64
      -90.0 -89.06 -88.12 ... 89.06 90.0
      array([-90.      , -89.057592, -88.115183, -87.172775, -86.230366, -85.287958,
             -84.34555 , -83.403141, -82.460733, -81.518325, -80.575916, -79.633508,
             -78.691099, -77.748691, -76.806283, -75.863874, -74.921466, -73.979058,
             -73.036649, -72.094241, -71.151832, -70.209424, -69.267016, -68.324607,
             -67.382199, -66.439791, -65.497382, -64.554974, -63.612565, -62.670157,
             -61.727749, -60.78534 , -59.842932, -58.900524, -57.958115, -57.015707,
             -56.073298, -55.13089 , -54.188482, -53.246073, -52.303665, -51.361257,
             -50.418848, -49.47644 , -48.534031, -47.591623, -46.649215, -45.706806,
             -44.764398, -43.82199 , -42.879581, -41.937173, -40.994764, -40.052356,
             -39.109948, -38.167539, -37.225131, -36.282723, -35.340314, -34.397906,
             -33.455497, -32.513089, -31.570681, -30.628272, -29.685864, -28.743455,
             -27.801047, -26.858639, -25.91623 , -24.973822, -24.031414, -23.089005,
             -22.146597, -21.204188, -20.26178 , -19.319372, -18.376963, -17.434555,
             -16.492147, -15.549738, -14.60733 , -13.664921, -12.722513, -11.780105,
             -10.837696,  -9.895288,  -8.95288 ,  -8.010471,  -7.068063,  -6.125654,
              -5.183246,  -4.240838,  -3.298429,  -2.356021,  -1.413613,  -0.471204,
               0.471204,   1.413613,   2.356021,   3.298429,   4.240838,   5.183246,
               6.125654,   7.068063,   8.010471,   8.95288 ,   9.895288,  10.837696,
              11.780105,  12.722513,  13.664921,  14.60733 ,  15.549738,  16.492147,
              17.434555,  18.376963,  19.319372,  20.26178 ,  21.204188,  22.146597,
              23.089005,  24.031414,  24.973822,  25.91623 ,  26.858639,  27.801047,
              28.743455,  29.685864,  30.628272,  31.570681,  32.513089,  33.455497,
              34.397906,  35.340314,  36.282723,  37.225131,  38.167539,  39.109948,
              40.052356,  40.994764,  41.937173,  42.879581,  43.82199 ,  44.764398,
              45.706806,  46.649215,  47.591623,  48.534031,  49.47644 ,  50.418848,
              51.361257,  52.303665,  53.246073,  54.188482,  55.13089 ,  56.073298,
              57.015707,  57.958115,  58.900524,  59.842932,  60.78534 ,  61.727749,
              62.670157,  63.612565,  64.554974,  65.497382,  66.439791,  67.382199,
              68.324607,  69.267016,  70.209424,  71.151832,  72.094241,  73.036649,
              73.979058,  74.921466,  75.863874,  76.806283,  77.748691,  78.691099,
              79.633508,  80.575916,  81.518325,  82.460733,  83.403141,  84.34555 ,
              85.287958,  86.230366,  87.172775,  88.115183,  89.057592,  90.      ])
    • lon
      (lon)
      float64
      0.0 1.25 2.5 ... 356.2 357.5 358.8
      array([  0.  ,   1.25,   2.5 , ..., 356.25, 357.5 , 358.75])
    • member
      ()
      <U3
      '001'
      array('001', dtype='<U3')
    • percentile
      (percentile)
      float64
      0.9 0.95 0.99
      array([0.9 , 0.95, 0.99])
    • year
      (year)
      int64
      2015 2016 2017 ... 2088 2089 2090
      array([2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026,
             2027, 2028, 2029, 2030, 2031, 2032, 2033, 2034, 2035, 2036, 2037, 2038,
             2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, 2048, 2049, 2050,
             2051, 2052, 2053, 2054, 2055, 2056, 2057, 2058, 2059, 2060, 2061, 2062,
             2063, 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2072, 2073, 2074,
             2075, 2076, 2077, 2078, 2079, 2080, 2081, 2082, 2083, 2084, 2085, 2086,
             2087, 2088, 2089, 2090])
    • definition
      (definition)
      <U5
      '3-0-0' '3-1-1' '4-0-0' '4-1-1'
      array(['3-0-0', '3-1-1', '4-0-0', '4-1-1'], dtype='<U5')
    • HWF
      (percentile, definition, lat, lon, year)
      int64
      dask.array<chunksize=(1, 1, 96, 72, 76), meta=np.ndarray>
      Array Chunk
      Bytes 384.75 MiB 4.01 MiB
      Shape (3, 4, 192, 288, 76) (1, 1, 96, 72, 76)
      Dask graph 96 chunks in 85 graph layers
      Data type int64 numpy.ndarray
      4 3 76 288 192
    • HWD
      (percentile, definition, lat, lon, year)
      int64
      dask.array<chunksize=(1, 1, 96, 72, 76), meta=np.ndarray>
      Array Chunk
      Bytes 384.75 MiB 4.01 MiB
      Shape (3, 4, 192, 288, 76) (1, 1, 96, 72, 76)
      Dask graph 96 chunks in 85 graph layers
      Data type int64 numpy.ndarray
      4 3 76 288 192
    • lat
      PandasIndex
      PandasIndex(Index([             -90.0, -89.05759162303664,  -88.1151832460733,
             -87.17277486910994,  -86.2303664921466, -85.28795811518324,
              -84.3455497382199, -83.40314136125654, -82.46073298429319,
             -81.51832460732984,
             ...
              81.51832460732984,   82.4607329842932,  83.40314136125653,
              84.34554973821989,  85.28795811518324,   86.2303664921466,
              87.17277486910996,  88.11518324607329,  89.05759162303664,
                           90.0],
            dtype='float64', name='lat', length=192))
    • lon
      PandasIndex
      PandasIndex(Index([   0.0,   1.25,    2.5,   3.75,    5.0,   6.25,    7.5,   8.75,   10.0,
              11.25,
             ...
              347.5, 348.75,  350.0, 351.25,  352.5, 353.75,  355.0, 356.25,  357.5,
             358.75],
            dtype='float64', name='lon', length=288))
    • percentile
      PandasIndex
      PandasIndex(Index([0.9, 0.95, 0.99], dtype='float64', name='percentile'))
    • year
      PandasIndex
      PandasIndex(Index([2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025, 2026,
             2027, 2028, 2029, 2030, 2031, 2032, 2033, 2034, 2035, 2036, 2037, 2038,
             2039, 2040, 2041, 2042, 2043, 2044, 2045, 2046, 2047, 2048, 2049, 2050,
             2051, 2052, 2053, 2054, 2055, 2056, 2057, 2058, 2059, 2060, 2061, 2062,
             2063, 2064, 2065, 2066, 2067, 2068, 2069, 2070, 2071, 2072, 2073, 2074,
             2075, 2076, 2077, 2078, 2079, 2080, 2081, 2082, 2083, 2084, 2085, 2086,
             2087, 2088, 2089, 2090],
            dtype='int64', name='year'))
    • definition
      PandasIndex
      PandasIndex(Index(['3-0-0', '3-1-1', '4-0-0', '4-1-1'], dtype='object', name='definition'))
InΒ [9]:
%%time
hw_metrics = hw_metrics.compute()
/home/jupyterhub/miniconda-persad/envs/lab/lib/python3.12/site-packages/distributed/client.py:3164: UserWarning: Sending large graph of size 526.40 MiB.
This may cause some slowdown.
Consider scattering data ahead of time and using futures.
  warnings.warn(
CPU times: user 8.86 s, sys: 4.66 s, total: 13.5 s
Wall time: 1min 12s

We can then explore the results by applying various reductions and plotting. Automatic figure generation is not fully implemented in the HDP, but is planned for the 1.0 release as an integral feature of the package. For now, we can manually generate plots from the dataset:

InΒ [11]:
f, (ax1, ax2) = plt.subplots(1, 2, figsize=(20, 8), facecolor='w')

hw_metrics["HWF"].weighted(np.cos(np.deg2rad(hw_metrics.lat))).mean(dim=["lat", "lon"]).sel(definition="3-0-0").sel(percentile=0.9, method="nearest").plot(ax=ax1, color="Blue", label="90th Perc.")
hw_metrics["HWF"].weighted(np.cos(np.deg2rad(hw_metrics.lat))).mean(dim=["lat", "lon"]).sel(definition="3-0-0").sel(percentile=0.95, method="nearest").plot(ax=ax1, color="Purple", label="95th Perc.")
hw_metrics["HWF"].weighted(np.cos(np.deg2rad(hw_metrics.lat))).mean(dim=["lat", "lon"]).sel(definition="3-0-0").sel(percentile=0.99, method="nearest").plot(ax=ax1, color="Red", label="99th Perc.")

hw_metrics["HWF"].weighted(np.cos(np.deg2rad(hw_metrics.lat))).mean(dim=["lat", "lon"]).sel(definition="3-0-0").sel(percentile=0.9, method="nearest").plot(ax=ax2, color="Blue", label="3-0-0")
hw_metrics["HWF"].weighted(np.cos(np.deg2rad(hw_metrics.lat))).mean(dim=["lat", "lon"]).sel(definition="3-1-1").sel(percentile=0.9, method="nearest").plot(ax=ax2, color="Purple", label="3-1-1")
hw_metrics["HWF"].weighted(np.cos(np.deg2rad(hw_metrics.lat))).mean(dim=["lat", "lon"]).sel(definition="4-0-0").sel(percentile=0.9, method="nearest").plot(ax=ax2, color="Red", label="4-0-0")
hw_metrics["HWF"].weighted(np.cos(np.deg2rad(hw_metrics.lat))).mean(dim=["lat", "lon"]).sel(definition="4-1-1").sel(percentile=0.9, method="nearest").plot(ax=ax2, color="Orange", label="4-1-1")

hw_metrics["HWF"].weighted(np.cos(np.deg2rad(hw_metrics.lat))).mean(dim=["lat", "lon"]).sel(definition="3-0-0").sel(percentile=0.95, method="nearest").plot(ax=ax2, color="Blue",)
hw_metrics["HWF"].weighted(np.cos(np.deg2rad(hw_metrics.lat))).mean(dim=["lat", "lon"]).sel(definition="3-1-1").sel(percentile=0.95, method="nearest").plot(ax=ax2, color="Purple")
hw_metrics["HWF"].weighted(np.cos(np.deg2rad(hw_metrics.lat))).mean(dim=["lat", "lon"]).sel(definition="4-0-0").sel(percentile=0.95, method="nearest").plot(ax=ax2, color="Red")
hw_metrics["HWF"].weighted(np.cos(np.deg2rad(hw_metrics.lat))).mean(dim=["lat", "lon"]).sel(definition="4-1-1").sel(percentile=0.95, method="nearest").plot(ax=ax2, color="Orange")


hw_metrics["HWF"].weighted(np.cos(np.deg2rad(hw_metrics.lat))).mean(dim=["lat", "lon"]).sel(definition="3-0-0").sel(percentile=0.99, method="nearest").plot(ax=ax2, color="Blue")
hw_metrics["HWF"].weighted(np.cos(np.deg2rad(hw_metrics.lat))).mean(dim=["lat", "lon"]).sel(definition="3-1-1").sel(percentile=0.99, method="nearest").plot(ax=ax2, color="Purple")
hw_metrics["HWF"].weighted(np.cos(np.deg2rad(hw_metrics.lat))).mean(dim=["lat", "lon"]).sel(definition="4-0-0").sel(percentile=0.99, method="nearest").plot(ax=ax2, color="Red")
hw_metrics["HWF"].weighted(np.cos(np.deg2rad(hw_metrics.lat))).mean(dim=["lat", "lon"]).sel(definition="4-1-1").sel(percentile=0.99, method="nearest").plot(ax=ax2, color="Orange")

ax1.set_xlim(2015, 2090)
ax1.set_ylim(0, 140)
ax1.grid()
ax1.legend(fontsize=15)
ax1.set_xlabel("Time (Year)", fontsize=15)
ax1.set_ylabel("Heatwave Frequency (Days)", fontsize=15)
ax1.set_title("Fixed at Definition 3-0-0", fontsize=18)

ax2.set_xlim(2015, 2090)
ax2.set_ylim(0, 140)
ax2.grid()
ax2.legend(fontsize=15)
ax2.set_xlabel("Time (Year)", fontsize=15)
ax2.set_ylabel("Heatwave Frequency (Days)", fontsize=15)
ax2.set_title("Fixed at 90th, 95th, and 99th Percentiles", fontsize=18)

f.suptitle("Heatwave Frequency, Global Mean, LENS1 ALL-Forcing, Member 001", fontsize=22)
f.show()
No description has been provided for this image
InΒ [12]:
proj = ccrs.Robinson()
f, axes = plt.subplots(2, 3, figsize=(20, 8), facecolor='w', subplot_kw=dict(projection=proj))

cmap = "Reds"
transform = ccrs.PlateCarree()
levels = np.arange(0, 141, 20)

hw_metrics["HWF"].rename("Heatwave Frequency (Days)").sel(percentile=0.9, method="nearest").sel(definition="3-1-1").mean(dim="year").plot(ax=axes[0, 0], cmap=cmap, transform=transform, levels=levels)
hw_metrics["HWF"].rename("Heatwave Frequency (Days)").sel(percentile=0.9, method="nearest").sel(definition="4-1-1").mean(dim="year").plot(ax=axes[1, 0], cmap=cmap, transform=transform, levels=levels)
hw_metrics["HWF"].rename("Heatwave Frequency (Days)").sel(percentile=0.95, method="nearest").sel(definition="3-1-1").mean(dim="year").plot(ax=axes[0, 1], cmap=cmap, transform=transform, levels=levels)
hw_metrics["HWF"].rename("Heatwave Frequency (Days)").sel(percentile=0.95, method="nearest").sel(definition="4-1-1").mean(dim="year").plot(ax=axes[1, 1], cmap=cmap, transform=transform, levels=levels)
hw_metrics["HWF"].rename("Heatwave Frequency (Days)").sel(percentile=0.99, method="nearest").sel(definition="3-1-1").mean(dim="year").plot(ax=axes[0, 2], cmap=cmap, transform=transform, levels=levels)
hw_metrics["HWF"].rename("Heatwave Frequency (Days)").sel(percentile=0.99, method="nearest").sel(definition="4-1-1").mean(dim="year").plot(ax=axes[1, 2], cmap=cmap, transform=transform, levels=levels)

fz = 12
axes[0, 0].set_title("90th Percentile, 3-1-1", fontsize=fz)
axes[1, 0].set_title("90th Percentile, 4-1-1", fontsize=fz)
axes[0, 1].set_title("95th Percentile, 3-1-1", fontsize=fz)
axes[1, 1].set_title("95th Percentile, 4-1-1", fontsize=fz)
axes[0, 2].set_title("99th Percentile, 3-1-1", fontsize=fz)
axes[1, 2].set_title("99th Percentile, 4-1-1", fontsize=fz)

for ax in axes.flatten():
    ax.coastlines()

f.suptitle("Heatwave Frequency, 2015-2090 Mean, LENS1 ALL-Forcing, Member 001", fontsize=22)
f.show()
No description has been provided for this image
InΒ [13]:
ds1 = hw_metrics["HWF"].sel(percentile=0.9, method="nearest").sel(definition="3-1-1").mean(dim="year")
ds2 = hw_metrics["HWF"].sel(percentile=0.99, method="nearest").sel(definition="4-1-1").mean(dim="year")
diff = (ds1 - ds2).rename("$\\Delta$ Heatwave Frequency (Days)")

proj = ccrs.Robinson()
f, ax1 = plt.subplots(1, 1, figsize=(10, 5), facecolor='w', subplot_kw=dict(projection=proj))

transform = ccrs.PlateCarree()
levels = np.arange(-80, 81, 20)

cmap="Reds"
transform = ccrs.PlateCarree()
diff.plot(ax=ax1, cmap="bwr", vmax=70, vmin=-70, transform=transform, levels=levels)
ax1.coastlines()
ax1.set_title("90th Perc. 3-1-1 minus 99th Perc. 4-1-1", fontsize=16)
f.show()
No description has been provided for this image
InΒ [18]:
f, ax1 = plt.subplots(1, 1, figsize=(10, 5), facecolor='w')


hw_metrics["HWF"].rename("Heatwave Frequency (Days)").weighted(np.cos(np.deg2rad(hw_metrics.lat))).mean(dim=["lat", "lon", "year"]).plot(cmap="Reds", vmin=60, vmax=100)

ax1.set_yticks([0.9, 0.95, 0.99])
ax1.set_ylabel("Percentile (Unitless)", fontsize=12)
ax1.set_xlabel("Heatwave Definition (Code)", fontsize=12)
ax1.set_title("Heatwave Frequency, Spatial-Temporal Mean, LENS1 ALL-Forcing, Member 001", fontsize=14)
f.show()
No description has been provided for this image

Outside of this demo, I ran this same analysis but for a large range in about 20 minutes on the same dask cluster:

InΒ [22]:
hr_ds = xarray.open_zarr("/local1/hw_metrics_large_param_space.zarr")

f, ax1 = plt.subplots(1, 1, figsize=(10, 5), facecolor='w')


hr_ds["HWF"].rename("Heatwave Frequency (Days)").weighted(np.cos(np.deg2rad(hw_metrics.lat))).mean(dim=["lat", "lon", "year"]).plot(cmap="Reds", vmin=60, vmax=100)

ax1.set_ylabel("Percentile (Unitless)", fontsize=12)
ax1.set_xlabel("Heatwave Definition (Code)", fontsize=12)
ax1.set_title("Heatwave Frequency, Global Spatial-Temporal Mean", fontsize=16)
f.show()
No description has been provided for this image

Other Figures Produce by the HDPΒΆ

These figures are from Cummins et al. 2024 (Pending Submission):

image.png image.png image.png image.png image.png

AcknowledgementsΒΆ

These acknowledgements indicate the contributions made by various individuals and their roles in developing the HDP:

Cameron Cummins
Computational Engineer
Contact: cameron.cummins@utexas.edu
Webpage: https://www.jsg.utexas.edu/student/cameron_cummins
Affiliation: Persad Aero-Climate Lab, The University of Texas at Austin

Dr. Geeta Persad
Advisor
Contact: geeta.persad@jsg.utexas.edu
Webpage: https://www.ggpersad.com/
Affiliation: Persad Aero-Climate Lab, The University of Texas at Austin

Dr. Jane Baldwin
Heatwave Specialist
Contact: jane.baldwin@uci.edu
Webpage: https://www.janebaldw.in/
Affiliation: Climate and Extreme Event Risk Group, University of California, Irvine

Dr. Danielle Touma
Heatwave Specialist
Contact: danielle.touma@utexas.edu
Webpage: https://www.jsg.utexas.edu/researcher/danielle_touma/
Affiliation: Institute for Geophysics, The University of Texas at Austin