{ "cells": [ { "cell_type": "markdown", "id": "43161ac7", "metadata": {}, "source": [ "# Idealized tropical cyclone\n", "This is the simplified tropical cyclone test of Reed and Jablownowski, using their simple surface flux and PBL scheme with the GFDL microphysics. This test uses an aquaplanet with a uniform 30C SST, allowing pretty rapid intensification even at minimal resolutions. For our test, since the TC is the only thing going on in the entire global domain, we use the grid stretching to reach 25-km resolution in a C128 grid over the TC. We also use the new do_cube_transform option so that the stretched tile (tile6) is oriented with North at the top, as we expect. We show four simulations:\n", "\n", "1) The control or \"essentially-inviscid\" case, using hord = 5, eighth-order divergence damping, and positive-definite tracer advection. This is like what we were using in nonhydrostatic HiRAM and what we are using in SHiELD and S-SHiELD\n", "2) \"4th-order damping\", which uses strictly-monotonic advection for all quantities and fourth-order divergence damping. This is like what is used in hydrostatic HiRAM and in AM4.\n", "3) \"Minimally-viscous\" diffusion, which is like (1) except hord = 6. Note that while this doesn't give great results at 25-km resolution it is very useful at controlling the behavior of convective systems at 3-km resolution while maintaining strong storms, and is used in T-SHiELD and HAFS. (**Moral**: What works at 3-km resolution need not work at 25-km or coarser resolutions.)\n", "4) Monotonic tracer advection, which is like (1) except with strictly-monotonic advection applied to passive tracers. This is like what is used in the operational GFS v16 and GEFS.\n", "\n", "While this test is crude ( it does demonstrate some nice characteristics of the dynamics on tropical cyclone vortices; most noticably it reproduces the results of Gao et al (JAS, 2021), behavior seen in SHiELD and the GFS regarding advection types, and the results from HiRAM regarding divergence damping and intense vortices." ] }, { "cell_type": "code", "execution_count": 1, "id": "310394ef", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt #xarray isn't much help for these native grid plots\n", "from matplotlib import ticker, cm, colors\n", "import cartopy.crs as ccrs\n", "import colorsys\n", "import xarray as xa" ] }, { "cell_type": "code", "execution_count": 2, "id": "440ffd0a", "metadata": {}, "outputs": [], "source": [ "large = 24; med = 20; small = 16\n", "params = {'axes.titlesize': large,\n", " 'legend.fontsize': med,\n", " 'figure.figsize': (8, 4),\n", " 'axes.labelsize': med,\n", " 'axes.titlesize': large,\n", " 'xtick.labelsize': small,\n", " 'ytick.labelsize': small,\n", " 'figure.titlesize': large,\n", " 'axes.titlepad': 6}\n", "plt.rcParams.update(params)" ] }, { "cell_type": "markdown", "id": "5fe34110", "metadata": {}, "source": [ "Here we load just tile6. It is easy to plot on the native grid, although the axes should be taken as grid cells and not physical units." ] }, { "cell_type": "code", "execution_count": 3, "id": "1b738d01", "metadata": {}, "outputs": [], "source": [ "root=\"/archive/Lucas.Harris/SHiELD/202103/C128r3.solo.TC%s/history/0000000000/atmos_4xdaily.tile6.nc\"\n", "ds_ctl=xa.open_dataset(root%(''),decode_times=False,chunks={'time': 1})\n", "ds_d1 =xa.open_dataset(root%('.d1'),decode_times=False,chunks={'time': 1})\n", "ds_h6 =xa.open_dataset(root%('.h6'),decode_times=False,chunks={'time': 1})\n", "ds_tr8=xa.open_dataset(root%('.tr8'),decode_times=False,chunks={'time': 1})\n" ] }, { "cell_type": "code", "execution_count": 4, "id": "1c9d67b2", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
<xarray.Dataset>\n", "Dimensions: (grid_xt: 128, grid_yt: 128, time: 40)\n", "Coordinates:\n", " * grid_xt (grid_xt) float32 1.0 2.0 3.0 4.0 ... 125.0 126.0 127.0 128.0\n", " * grid_yt (grid_yt) float32 1.0 2.0 3.0 4.0 ... 125.0 126.0 127.0 128.0\n", " * time (time) float32 0.25 0.5 0.75 1.0 1.25 ... 9.25 9.5 9.75 10.0\n", "Data variables: (12/14)\n", " vort850 (time, grid_yt, grid_xt) float32 dask.array<chunksize=(1, 128, 128), meta=np.ndarray>\n", " u850 (time, grid_yt, grid_xt) float32 dask.array<chunksize=(1, 128, 128), meta=np.ndarray>\n", " v850 (time, grid_yt, grid_xt) float32 dask.array<chunksize=(1, 128, 128), meta=np.ndarray>\n", " us (time, grid_yt, grid_xt) float32 dask.array<chunksize=(1, 128, 128), meta=np.ndarray>\n", " vs (time, grid_yt, grid_xt) float32 dask.array<chunksize=(1, 128, 128), meta=np.ndarray>\n", " tb (time, grid_yt, grid_xt) float32 dask.array<chunksize=(1, 128, 128), meta=np.ndarray>\n", " ... ...\n", " iw (time, grid_yt, grid_xt) float32 dask.array<chunksize=(1, 128, 128), meta=np.ndarray>\n", " PRESsfc (time, grid_yt, grid_xt) float32 dask.array<chunksize=(1, 128, 128), meta=np.ndarray>\n", " PRESctp (time, grid_yt, grid_xt) float32 dask.array<chunksize=(1, 128, 128), meta=np.ndarray>\n", " TMP500_300 (time, grid_yt, grid_xt) float32 dask.array<chunksize=(1, 128, 128), meta=np.ndarray>\n", " condensation (time, grid_yt, grid_xt) float32 dask.array<chunksize=(1, 128, 128), meta=np.ndarray>\n", " evaporation (time, grid_yt, grid_xt) float32 dask.array<chunksize=(1, 128, 128), meta=np.ndarray>\n", "Attributes:\n", " NumFilesInSet: 1\n", " title: C128r3.64bit\n", " grid_type: regular\n", " grid_tile: N/A
array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12.,\n", " 13., 14., 15., 16., 17., 18., 19., 20., 21., 22., 23., 24.,\n", " 25., 26., 27., 28., 29., 30., 31., 32., 33., 34., 35., 36.,\n", " 37., 38., 39., 40., 41., 42., 43., 44., 45., 46., 47., 48.,\n", " 49., 50., 51., 52., 53., 54., 55., 56., 57., 58., 59., 60.,\n", " 61., 62., 63., 64., 65., 66., 67., 68., 69., 70., 71., 72.,\n", " 73., 74., 75., 76., 77., 78., 79., 80., 81., 82., 83., 84.,\n", " 85., 86., 87., 88., 89., 90., 91., 92., 93., 94., 95., 96.,\n", " 97., 98., 99., 100., 101., 102., 103., 104., 105., 106., 107., 108.,\n", " 109., 110., 111., 112., 113., 114., 115., 116., 117., 118., 119., 120.,\n", " 121., 122., 123., 124., 125., 126., 127., 128.], dtype=float32)
array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11., 12.,\n", " 13., 14., 15., 16., 17., 18., 19., 20., 21., 22., 23., 24.,\n", " 25., 26., 27., 28., 29., 30., 31., 32., 33., 34., 35., 36.,\n", " 37., 38., 39., 40., 41., 42., 43., 44., 45., 46., 47., 48.,\n", " 49., 50., 51., 52., 53., 54., 55., 56., 57., 58., 59., 60.,\n", " 61., 62., 63., 64., 65., 66., 67., 68., 69., 70., 71., 72.,\n", " 73., 74., 75., 76., 77., 78., 79., 80., 81., 82., 83., 84.,\n", " 85., 86., 87., 88., 89., 90., 91., 92., 93., 94., 95., 96.,\n", " 97., 98., 99., 100., 101., 102., 103., 104., 105., 106., 107., 108.,\n", " 109., 110., 111., 112., 113., 114., 115., 116., 117., 118., 119., 120.,\n", " 121., 122., 123., 124., 125., 126., 127., 128.], dtype=float32)
array([ 0.25, 0.5 , 0.75, 1. , 1.25, 1.5 , 1.75, 2. , 2.25, 2.5 ,\n", " 2.75, 3. , 3.25, 3.5 , 3.75, 4. , 4.25, 4.5 , 4.75, 5. ,\n", " 5.25, 5.5 , 5.75, 6. , 6.25, 6.5 , 6.75, 7. , 7.25, 7.5 ,\n", " 7.75, 8. , 8.25, 8.5 , 8.75, 9. , 9.25, 9.5 , 9.75, 10. ],\n", " dtype=float32)
\n",
"
| \n",
"\n", "\n", " | \n", "
\n",
"
| \n",
"\n", "\n", " | \n", "
\n",
"
| \n",
"\n", "\n", " | \n", "
\n",
"
| \n",
"\n", "\n", " | \n", "
\n",
"
| \n",
"\n", "\n", " | \n", "
\n",
"
| \n",
"\n", "\n", " | \n", "
\n",
"
| \n",
"\n", "\n", " | \n", "
\n",
"
| \n",
"\n", "\n", " | \n", "
\n",
"
| \n",
"\n", "\n", " | \n", "
\n",
"
| \n",
"\n", "\n", " | \n", "
\n",
"
| \n",
"\n", "\n", " | \n", "
\n",
"
| \n",
"\n", "\n", " | \n", "
\n",
"
| \n",
"\n", "\n", " | \n", "
\n",
"
| \n",
"\n", "\n", " | \n", "