python-awips/examples/notebooks/Forecast_Model_Vertical_Sounding.ipynb

604 lines
1.5 MiB
Text
Raw Permalink Normal View History

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a name=\"top\"></a>\n",
"<div style=\"width:1000 px\">\n",
"\n",
"<div style=\"float:right; width:98 px; height:98px;\">\n",
"<img src=\"https://docs.unidata.ucar.edu/images/logos/unidata_logo_vertical_150x150.png\" alt=\"Unidata Logo\" style=\"height: 98px;\">\n",
"</div>\n",
"\n",
"# Forecast Model Vertical Sounding\n",
"**Python-AWIPS Tutorial Notebook**\n",
"\n",
"<div style=\"clear:both\"></div>\n",
"</div>\n",
"\n",
"---\n",
"\n",
"<div style=\"float:right; width:250 px\"><img src=\"../images/forecast_model_vert_sounding_preview.png\" alt=\"preview image of a model sounding skewt and hodograph\" style=\"height: 300px;\"></div>\n",
"\n",
"\n",
"# Objectives\n",
"\n",
"* Use python-awips to connect to an edex server\n",
"* Request data using the [ModelSounding class](http://unidata.github.io/python-awips/api/ModelSounding.html) in addition to using the normal [DataAccess class](http://unidata.github.io/python-awips/api/DataAccessLayer.html)\n",
"* Create and compare vertical sounding from different AWIPS model data with isobaric levels\n",
"* Use [Shapely Point geometry](https://shapely.readthedocs.io/en/stable/reference/shapely.Point.html) to define a point\n",
"* Convert between units when necessary\n",
"* Use MetPy to create [SkewT](https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.SkewT.html) and [Hodograph](https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.Hodograph.html) plots\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {
"toc": true
},
"source": [
"<h1>Table of Contents<span class=\"tocSkip\"></span></h1>\n",
"<div class=\"toc\"><ul class=\"toc-item\"><li><span><a href=\"#Imports\" data-toc-modified-id=\"Imports-1\"><span class=\"toc-item-num\">1&nbsp;&nbsp;</span>Imports</a></span></li><li><span><a href=\"#EDEX-Connection\" data-toc-modified-id=\"EDEX-Connection-2\"><span class=\"toc-item-num\">2&nbsp;&nbsp;</span>EDEX Connection</a></span></li><li><span><a href=\"#Define-Useful-Variables\" data-toc-modified-id=\"Define-Useful-Variables-3\"><span class=\"toc-item-num\">3&nbsp;&nbsp;</span>Define Useful Variables</a></span></li><li><span><a href=\"#Function:-get_surface_data()\" data-toc-modified-id=\"Function:-get_surface_data()-4\"><span class=\"toc-item-num\">4&nbsp;&nbsp;</span>Function: get_surface_data()</a></span></li><li><span><a href=\"#Function:-get_levels_data()\" data-toc-modified-id=\"Function:-get_levels_data()-5\"><span class=\"toc-item-num\">5&nbsp;&nbsp;</span>Function: get_levels_data()</a></span></li><li><span><a href=\"#Function:-plot_skewT()\" data-toc-modified-id=\"Function:-plot_skewT()-6\"><span class=\"toc-item-num\">6&nbsp;&nbsp;</span>Function: plot_skewT()</a></span></li><li><span><a href=\"#Retrieve-Necessary-Plotting-Data\" data-toc-modified-id=\"Retrieve-Necessary-Plotting-Data-7\"><span class=\"toc-item-num\">7&nbsp;&nbsp;</span>Retrieve Necessary Plotting Data</a></span></li><li><span><a href=\"#Skew-T/Log-P\" data-toc-modified-id=\"Skew-T/Log-P-8\"><span class=\"toc-item-num\">8&nbsp;&nbsp;</span>Skew-T/Log-P</a></span></li><li><span><a href=\"#Model-Sounding-Comparison\" data-toc-modified-id=\"Model-Sounding-Comparison-9\"><span class=\"toc-item-num\">9&nbsp;&nbsp;</span>Model Sounding Comparison</a></span></li><li><span><a href=\"#See-Also\" data-toc-modified-id=\"See-Also-10\"><span class=\"toc-item-num\">10&nbsp;&nbsp;</span>See Also</a></span><ul class=\"toc-item\"><li><span><a href=\"#Related-Notebooks\" data-toc-modified-id=\"Related-Notebooks-10.1\"><span class=\"toc-item-num\">10.1&nbsp;&nbsp;</span>Related Notebooks</a></span></li><li><span><a href=\"#Additional-Documentation\" data-toc-modified-id=\"Additional-Documentation-10.2\"><span class=\"toc-item-num\">10.2&nbsp;&nbsp;</span>Additional Documentation</a></span></li></ul></li></ul></div>"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Imports\n",
"\n",
"The imports below are used throughout the notebook. Note the first import is coming directly from python-awips and allows us to connect to an EDEX server. The subsequent imports are for data manipulation and visualization. "
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"from awips.dataaccess import DataAccessLayer, ModelSounding\n",
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"from metpy.plots import SkewT, Hodograph\n",
"from metpy.units import units\n",
"from mpl_toolkits.axes_grid1.inset_locator import inset_axes\n",
"from math import sqrt\n",
"from shapely.geometry import Point"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## EDEX Connection\n",
"\n",
"First we establish a connection to Unidata's public EDEX server. This sets the proper server on the **DataAccessLayer**, which we will use numerous times throughout the notebook."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"server = 'edex-cloud.unidata.ucar.edu'\n",
"DataAccessLayer.changeEDEXHost(server)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Define Useful Variables\n",
"\n",
"The plotting in this notebook needs a model name, a location point (defined by latitude and longitude), and the most recent time range with the initial forecast run."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Using NAM40 forecast time [<DataTime instance: 2025-02-12 12:00:00 (0) >]\n"
]
}
],
"source": [
"# Note the order is Lon,Lat and not Lat,Lon\n",
"point = Point(-104.67,39.87)\n",
"model=\"NAM40\"\n",
"\n",
"# Get latest forecast cycle run\n",
"timeReq = DataAccessLayer.newDataRequest(\"grid\")\n",
"timeReq.setLocationNames(model)\n",
"cycles = DataAccessLayer.getAvailableTimes(timeReq, True)\n",
"times = DataAccessLayer.getAvailableTimes(timeReq)\n",
2018-10-15 08:25:13 -06:00
"fcstRun = DataAccessLayer.getForecastRun(cycles[-2], times)\n",
"\n",
"timeRange = [fcstRun[0]]\n",
"\n",
"print(\"Using \" + model + \" forecast time \" + str(timeRange))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Function: get_surface_data()\n",
"\n",
"This function is used to get the initial forecast model data for surface height. This is done separately from the rest of the heights to determine the surface pressure. It uses the [**ModelSounding**](http://unidata.github.io/python-awips/api/ModelSounding.html) data object from python-awips to retrieve all the relevant information.\n",
"\n",
"This function takes the model name, location, and time as attributes, and returns arrays for pressure, temperature, dewpoint, and the u and v wind components."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"def get_surface_data(modelName, location, time):\n",
" \"\"\" model name, location, and timeRange desire \"\"\"\n",
" \n",
" # request data and sort response\n",
" pressure,temp,dpt,ucomp,vcomp = [],[],[],[],[]\n",
" use_parms = ['T','DpT','uW','vW','P']\n",
" use_level = \"0.0FHAG\"\n",
" \n",
" sndObject = ModelSounding.getSounding(modelName, use_parms, [use_level], location, time)\n",
" if len(sndObject) > 0:\n",
" for time in sndObject._dataDict:\n",
" pressure.append(float(sndObject._dataDict[time][use_level]['P']))\n",
" temp.append(float(sndObject._dataDict[time][use_level]['T']))\n",
" dpt.append(float(sndObject._dataDict[time][use_level]['DpT']))\n",
" ucomp.append(float(sndObject._dataDict[time][use_level]['uW']))\n",
" vcomp.append(float(sndObject._dataDict[time][use_level]['vW']))\n",
" print(\"Found surface record at \" + \"%.1f\" % pressure[0] + \"MB\")\n",
" else:\n",
" raise ValueError(\"sndObject returned empty for query [\" \n",
" + ', '.join(str(x) for x in (modelName, use_parms, point, use_level)) +\"]\")\n",
"\n",
" # return information for plotting\n",
" return pressure,temp,dpt,ucomp,vcomp"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Function: get_levels_data()\n",
"\n",
"This function is similar to *get_surface_data()*, except it gets data values for presure heights above the surface. It uses the [**ModelSounding**](http://unidata.github.io/python-awips/api/ModelSounding.html) data object from python-awips to retrieve all the relevant information.\n",
"\n",
"It takes the model name, location, and time (similar to the other function), and also takes the instantiated pressure, temperature, dewpoint, and wind vector arrays.\n",
"\n",
"It returns the fully populated pressure, temperature, dewpoint, u-component, v-component, and computed wind arrays."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"def get_levels_data(modelName, location, time, pressure, temp, dpt, ucomp, vcomp):\n",
" \n",
" # Get isobaric levels with our requested parameters\n",
" parms = ['T','DpT','uW','vW']\n",
" levelReq = DataAccessLayer.newDataRequest(\"grid\", envelope=point)\n",
" levelReq.setLocationNames(model)\n",
" levelReq.setParameters(*(parms))\n",
" availableLevels = DataAccessLayer.getAvailableLevels(levelReq)\n",
" \n",
" # Clean levels list of unit string (MB, FHAG, etc.)\n",
" levels = []\n",
" for lvl in availableLevels:\n",
" name=str(lvl)\n",
" if 'MB' in name and '_' not in name:\n",
" # If this level is above (less than in mb) our 0.0FHAG record\n",
" if float(name.replace('MB','')) < pressure[0]:\n",
" levels.append(lvl)\n",
"\n",
" # Get Sounding\n",
" sndObject = ModelSounding.getSounding(modelName, parms, levels, location, time)\n",
"\n",
" if not len(sndObject) > 0:\n",
" raise ValueError(\"sndObject returned empty for query [\" \n",
" + ', '.join(str(x) for x in (model, parms, point, levels)) +\"]\")\n",
"\n",
" for time in sndObject._dataDict:\n",
" for lvl in sndObject._dataDict[time].levels():\n",
" for parm in sndObject._dataDict[time][lvl].parameters():\n",
" if parm == \"T\":\n",
" temp.append(float(sndObject._dataDict[time][lvl][parm]))\n",
" elif parm == \"DpT\":\n",
" dpt.append(float(sndObject._dataDict[time][lvl][parm]))\n",
" elif parm == 'uW':\n",
" ucomp.append(float(sndObject._dataDict[time][lvl][parm]))\n",
" elif parm == 'vW':\n",
" vcomp.append(float(sndObject._dataDict[time][lvl][parm]))\n",
" else:\n",
" print(\"WHAT IS THIS\")\n",
" print(sndObject._dataDict[time][lvl][parm])\n",
" # Pressure is our requested level rather than a returned parameter\n",
" pressure.append(float(lvl.replace('MB','')))\n",
"\n",
" # convert to numpy.array()\n",
" pressure = np.array(pressure, dtype=float)\n",
" temp = (np.array(temp, dtype=float) - 273.15) * units.degC\n",
" dpt = (np.array(dpt, dtype=float) - 273.15) * units.degC\n",
" ucomp = (np.array(ucomp, dtype=float) * units('m/s')).to('knots')\n",
" vcomp = (np.array(vcomp, dtype=float) * units('m/s')).to('knots')\n",
" wind = np.sqrt(ucomp**2 + vcomp**2)\n",
"\n",
" print(\"Using \" + str(len(levels)) + \" levels between \" + \n",
" str(\"%.1f\" % max(pressure)) + \" and \" + str(\"%.1f\" % min(pressure)) + \"MB\")\n",
" return pressure,temp,dpt,ucomp,vcomp,wind"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Function: plot_skewT()\n",
"\n",
"Since we're plotting many different models for comparison, all that code was used to create this function.\n",
"\n",
"The function takes the model name, reference time, and the pressure, temperature, dewpoint, u-component, v-component, and wind arrays. It plots a skewT and hodograph using metpy."
2018-10-15 08:25:13 -06:00
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"def plot_skewT(modelName, pressure, temp, dpt, ucomp, vcomp, wind, refTime):\n",
" plt.rcParams['figure.figsize'] = (12, 14)\n",
"\n",
" # Skew-T\n",
" skew = SkewT(rotation=45)\n",
" skew.plot(pressure, temp, 'r', linewidth=2)\n",
" skew.plot(pressure, dpt, 'g', linewidth=2)\n",
" skew.plot_barbs(pressure, ucomp, vcomp)\n",
" skew.plot_dry_adiabats()\n",
" skew.plot_moist_adiabats()\n",
" skew.plot_mixing_lines(linestyle=':')\n",
"\n",
" skew.ax.set_ylim(1000, np.min(pressure))\n",
" skew.ax.set_xlim(-50, 40)\n",
"\n",
" # Title\n",
" plt.title(modelName + \" (\" + str(point) + \") \" + str(refTime))\n",
"\n",
" # Hodograph\n",
" ax_hod = inset_axes(skew.ax, '40%', '40%', loc=2)\n",
" h = Hodograph(ax_hod, component_range=max(wind.magnitude))\n",
" h.add_grid(increment=20)\n",
" h.plot_colormapped(ucomp, vcomp, wind)\n",
"\n",
" # Dotted line at 0C isotherm\n",
" l = skew.ax.axvline(0, color='c', linestyle='-', linewidth=1)\n",
"\n",
" plt.show()"
]
},
{
"cell_type": "markdown",
2018-10-15 08:25:13 -06:00
"metadata": {},
"source": [
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Retrieve Necessary Plotting Data\n",
"\n",
"First we get the initial data at surface level using the get_surface_data function, and then pass those initial data arrays onto the get_levels_data request to finish populating for additional heights needed for Skew-T plots.\n",
"We want to keep track of the pressure, temeperature, dewpoint, u-component, v-component, and wind arrays so we store them in variables to use later on."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
2018-10-15 08:25:13 -06:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Found surface record at 820.8MB\n",
"Using 31 levels between 820.8 and 50.0MB\n"
2018-10-15 08:25:13 -06:00
]
}
],
"source": [
"p,t,d,u,v = get_surface_data(model,point,timeRange)\n",
"\n",
"p,t,d,u,v,w = get_levels_data(model,point,timeRange,p,t,d,u,v)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Skew-T/Log-P\n",
"\n",
"Here we use our plot_skewT function to generate our skewT & hodograph charts for the data we retreived so far. This is where the pressure, temperature, dewpoint, and wind data is needed."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABDwAAAT2CAYAAADOGbMxAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzs3XdcU/f+x/F3wt5TERy4EFTce++9997a3tbaPX62va293fNe21pbrXtUa917olXrQHErLtyAgMieSb6/P1JSEVDEg+eb5P18PHy0JwnJhxVOXjlDI4QQICIiIiIiIiKyIFq1ByAiIiIiIiIiUhqDBxERERERERFZHAYPIiIiIiIiIrI4DB5EREREREREZHEYPIiIiIiIiIjI4jB4EBEREREREZHFYfAgIiIiIiIiIovD4EFEREREREREFofBg4iIiIiIiIgsDoMHEREREREREVkcBg8iIiIiIiIisjgMHkRERERERERkcRg8iIiIiIiIiMjiMHgQERERERERkcVh8CAiIiIiIiIii8PgQUREREREREQWh8GDiIiIiIiIiCwOgwcRERERERERWRwGDyIiIiIiIiKyOAweRERERERERGRxGDyIiIiIiIiIyOIweBARERERERGRxWHwICIiIiIiIiKLw+BBRERERERERBaHwYOIiIiIiIiILA6DBxERERERERFZHAYPIiIiIiIiIrI4DB5EREREREREZHEYPIiIiIiIiIjI4jB4EBEREREREZHFYfAgIiIiIiIiIovD4EFEREREREREFofBg4iIiIiIiIgsDoMHEREREREREVkcBg8iIiIiIiIisjgMHkRERERERERkcRg8iIiIiIiIiMjiMHgQERERERERkcVh8CAiIiIiIiIii8PgQUREREREREQWh8GDiIiIiIiIiCwOgwcRERERERERWRwGDyIiIiIiIiKyOAweRERERERERGRxGDyIiIiIiIiIyOIweBARERERERGRxWHwICIiIiIiIiKLw+BBRERERERERBaHwYOIiIiIiIiILA6DBxERERERERFZHAYPIiIiIiIiIrI4DB5EREREREREZHEYPIiIiIiIiIjI4jB4EBEREREREZHFYfAgIiIiIiIiIovD4EFEREREREREFofBg4iIiIiIiIgsDoMHEREREREREVkcBg8iIiIiIiIisjgMHkRERERERERk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
"text/plain": [
"<Figure size 1200x1400 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plot_skewT(model, p, t, d, u, v, w, timeRange[0])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
]
2018-10-15 08:25:13 -06:00
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Model Sounding Comparison\n",
"\n",
"Now that we know how to retreive and plot the data for one model, we can run a loop to retreive data for various models and plot them for comparison. In this example we'll also plot RAP13 and GFS20 data to compare with NAM40.\n",
"\n",
"This is also where our functions become so important, because we can easily recall all that logic and keep this for-loop fairly simple."
2018-10-15 08:25:13 -06:00
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
2018-10-15 08:25:13 -06:00
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Using RAP13 forecast time 2025-02-12 21:00:00 (0)\n",
"Found surface record at 828.5MB\n",
"Using 32 levels between 828.5 and 100.0MB\n"
2018-10-15 08:25:13 -06:00
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABEAAAAPYCAYAAADabYzvAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAAPYQAAD2EBqD+naQABAABJREFUeJzs3Xd4VGX2wPHvpFfSgISSUEOHAKH3DiJIsYCAiIii2Fh1Leu6lrWsuvpTV1FUQBRQBJSm0nvvvQYIPQQIpJCevL8/rhkI6WFm7p2Z83keHqbcufdMMjlz33PfYlJKKYQQQgghhBBCCCEcmIveAQghhBBCCCGEEEJYmxRAhBBCCCGEEEII4fCkACKEEEIIIYQQQgiHJwUQIYQQQgghhBBCODwpgAghhBBCCCGEEMLhSQFECCGEEEIIIYQQDk8KIEIIIYQQQgghhHB4UgARQgghhBBCCCGEw5MCiBBCCCGEEEIIIRyeFECEEEIIIYQQQgjh8KQAIoQQQgghhBBCCIcnBRAhhBBCCCGEEEI4PCmACCGEEEIIIYQQwuFJAUQIIYQQQgghhBAOTwogQgghhBBCCCGEcHhSABFCCCGEEEIIIYTDkwKIEEIIIYQQQgghHJ4UQIQQQgghhBBCCOHwpAAihBBCCCGEEEIIhycFECGEEEIIIYQQQjg8KYAIIYQQQgghhBDC4UkBRAghhBBCCCGEEA5PCiBCCCGEEEIIIYRweFIAEUIIIYQQQgghhMOTAogQQgghhBBCCCEcnhRAhBBCCCGEEEII4fCkACKEEEIIIYQQQgiHJwUQIYQQQgghhBBCODwpgAghhBBCCCGEEMLhSQFECCGEEEIIIYQQDk8KIEIIIYQQQgghhHB4UgARQgghhBBCCCGEw5MCiBBCCCGEEEIIIRyeFECEEEIIIYQQQgjh8KQAIoQQQgghhBBCCIcnBRAhhBBCCCGEEEI4PCmACCGEEEIIIYQQwuFJAUQIIYQQQgghhBAOTwogQgghhBBCCCGEcHhSABFCCCGEEEIIIYTDkwKIEEIIIYQQQgghHJ4UQIQQQgghhBBCCOHwpAAihBBCCCGEEEIIhycFECGEEEIIIYQQQjg8KYAIIYQQQgghhBDC4UkBRAghhBBCCCGEEA5PCiBCCCGEEEIIIYRweFIAEUIIIYQQQgghhMOTAogQQgghhBBCCCEcnhRAhBBCCCGEEEII4fCkACKEEEIIIYQQQgiHJwUQIYQQQgghhBBCODwpgAghhBBCCCGEEMLhSQFECCGEEEIIIYQQDk8KIEIIIYQQQgghhHB4UgARQgghhBBCCCGEw5MCiBDC5r7//ntMJpP5n5ubG1WqVGH48OEcP368yNd9/vnnmEwmmjRpUuQ2t+7XZDIREBBAt27d+P333/Ntt3jxYkaPHk3Tpk1xd3fHZDIVur+zZ88yZMgQateuja+vLwEBAbRo0YIvvviC7OzsUr/nt99+m0aNGpGbm1vmWAFu3LjBf/7zH1q0aIGfnx++vr40b96c9957jxs3bhTYvmbNmgwYMKDQn81//vOfAtvn/U527NhBbGxsgdiK+hcbG1vs+z5x4gSenp5s3ry5xJ/RuXPnmDhxIl27diUwMBCTycT3339f5PYrVqygffv2+Pj4ULFiRcaMGUN8fHyxx1ixYoU59itXrpQYU54NGzbQv39/goKC8Pb2JjIykn//+9/5tinu59SgQYMSj/Haa6/RokULgoOD8fLyonbt2jz++OOcPn26wLbHjh3j3nvvJSgoCB8fH9q2bcvChQtL/X52797N4MGDqVq1Kj4+PjRo0IC3336b1NTUcr2nY8eO4eHhwa5duwoc66GHHmLw4MGliispKYl3332Xbt26ERYWhp+fH02bNuWDDz4gPT29wPZZWVm89dZb1KxZE09PTxo0aMD//ve/Att99913DB48mJo1a+Lt7U3dunV58sknuXjxYoFta9asWej7feKJJ0r1HqwVV1FKm8t27tzJU089RdOmTfH39yc0NJRevXqxatWqUh1n1apVjB07lgYNGuDr60u1atUYNGgQO3fuLLDthg0bGDduHNHR0Xh6epYqV9wuJSWFiRMnUrVqVby8vGjevDk///xzodvu2rWLXr164efnR2BgIEOHDuXkyZOGPNb169epWLFigf3Hx8czZswYKlasiI+PD+3bt2flypX5tsnKyqJOnTp8+umnpT6eEEKI2yghhLCxadOmKUBNmzZNbd68Wa1evVq98847ytvbW1WuXFklJCQU+rqoqCgFKEBt2bKl0G0Add9996nNmzerjRs3qh9//FHVr19fmUwmtXjxYvN2Y8eOVZGRkeqBBx5Q0dHRqqh0ePjwYTV69Gg1depUtWLFCvXHH3+op59+WgHq0UcfLdX7PX/+vPL19VVz5swpV6xxcXGqSZMmytvbW7388stq2bJlatmyZeqVV15R3t7eqkmTJiouLi7fvmvUqKHuvvvuAscDVEBAgLp69Wq+5/J+J9u3b1fp6elq8+bN+f61aNFC1a5du8Dj6enpxb73wYMHF4ijKKtXr1YVK1ZUvXr1Ug8++KD5M1KYNWvWKDc3NzVo0CC1bNkyNWPGDFWtWjXVpEmTImNKTk5WNWvWVFWrVlWAunz5cqnimjlzpnJxcVHDhw9XCxcuVKtWrVLffvuteuutt/Jtd/vPZvPmzerTTz9VgHrllVdKPM6ECRPUBx98oBYuXKhWr16tvvzyS1WlShUVGhqqrly5Yt7u1KlTKjg4WDVu3Fj9/PPPavHixeruu+9WJpNJzZ07t8TjHDx4UHl5eamoqCg1e/ZstXLlSvXGG28oV1dXdc8995T7PY0ZM0Z16dKlwPFiYmKUm5ubWrlyZYmx7d+/X1WsWFH97W9/UwsWLFArV65Ub775pvLy8lI9e/ZUubm5+bYfN26c8vT0VB9++KFavXq1euWVV5TJZFLvvvtuvu2qVq2qRo4cqWbOnKnWrFmjJk+erKpXr66qVKlS6N9Ox44dC7zvkydPlhi/NeMqSmlz2QsvvKBatWqlPvnkE7Vy5Uq1cOFC1b9/fwWo6dOnl3ic++67T3Xv3l1NmjRJrVmzRs2ZM0e1a9eu0N/tm2++qWrUqKEGDx6sunXrpgB16tSpUr2fPL1791aBgYHq66+/VqtWrVLjxo1TgJo5c2a+7Q4fPqz8/f1V586d1e+//67mzZunGjdurKpWrari4+MNd6yJEyeqpk2b5vssp6enqyZNmqjq1aurGTNmqGXLlqlBgwYpNzc3tWbNmnyv//7771VQUFC+nCCEEKL0pAAihLC5Wxvbt3rrrbcUoKZOnVrgNdu3b1eAuvvuuxWgHnvssUL3Dainnnoq32MxMTEKUL169TI/lpOTY7791FNPFdloKMoDDzyg3NzcSiwAKKXUSy+9pKpVq5bvmGWJtU+fPsrNzU2tX7++wL7Xr1+v3NzcVN++ffM9XlQBpFevXsrNzU09//zz+Z4r6neSp2vXrqpx48YlvtdbHTp0SAFqyZIlpdr+1p9P3u+7qAJI69atVaNGjVRWVpb5sY0bNypATZo0qdDXPPXUU6pFixbqn//8Z6kLIOfOnVO+vr7qySefLNV7uN2YMWOUyWRSx48fL9fr//jjDwWoKVOmmB8bP3688vLyUufOnTM/lp2drRo2bKjCw8MLfM5u99prrylAxcTE5Hv88ccfV0CRBcg8Rb2nHTt2KEBt3LixwGsGDBigevfuXex+lVIqJSVFpaSkFHj8o48+UkC+v4EDBw4ok8mk3nvvvXzbPvbYY8rb2ztfke/SpUsF9pn3Gfv3v/+d7/HC/nbKwlpxFaW0uaywY2VnZ6tmzZqpOnXqlHicwl6fnJysQkNDVc+ePYuMKe93V5YCyO+//64ANWvWrHyP9+7dW1WtWlVlZ2ebH7v//vtVxYoVVWJiovmx2NhY5e7url566SVDHevq1avK29tbff311/ke//LLLxWgNm3aZH4sKytLNWrUSLVp0ybfthkZGSo4OLhAMU0IIUTpyBAYIYRhtGrVCoBLly4VeG7KlCkA/Oc//6FDhw78/PPPBbr
2018-10-15 08:25:13 -06:00
"text/plain": [
"<Figure size 1200x1400 with 2 Axes>"
2018-10-15 08:25:13 -06:00
]
},
"metadata": {},
2018-10-15 08:25:13 -06:00
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Using GFS20 forecast time 2025-02-12 18:00:00 (0)\n",
"Found surface record at 833.4MB\n",
"Using 32 levels between 833.4 and 100.0MB\n"
2018-10-15 08:25:13 -06:00
]
},
{
"data": {
"image/png": "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
2018-10-15 08:25:13 -06:00
"text/plain": [
"<Figure size 1200x1400 with 2 Axes>"
2018-10-15 08:25:13 -06:00
]
},
"metadata": {},
2018-10-15 08:25:13 -06:00
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Using NAM40 forecast time 2025-02-12 18:00:00 (0)\n",
"Found surface record at 823.4MB\n",
"Using 31 levels between 823.4 and 50.0MB\n"
2018-10-15 08:25:13 -06:00
]
},
{
"data": {
"image/png": "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
2018-10-15 08:25:13 -06:00
"text/plain": [
"<Figure size 1200x1400 with 2 Axes>"
2018-10-15 08:25:13 -06:00
]
},
"metadata": {},
2018-10-15 08:25:13 -06:00
"output_type": "display_data"
}
],
"source": [
"models = [\"RAP13\", \"GFS20\", \"NAM40\"]\n",
2018-10-15 08:25:13 -06:00
"\n",
"for modelName in models:\n",
" timeReq = DataAccessLayer.newDataRequest(\"grid\")\n",
" timeReq.setLocationNames(modelName)\n",
" cycles = DataAccessLayer.getAvailableTimes(timeReq, True)\n",
" times = DataAccessLayer.getAvailableTimes(timeReq)\n",
" fr = DataAccessLayer.getForecastRun(cycles[-1], times)\n",
" print(\"Using \" + modelName + \" forecast time \" + str(fr[0]))\n",
" tr = [fr[0]]\n",
2018-10-15 08:25:13 -06:00
" \n",
" p,t,d,u,v = get_surface_data(modelName,point,tr)\n",
" p,t,d,u,v,w = get_levels_data(modelName,point,tr,p,t,d,u,v)\n",
2018-10-15 08:25:13 -06:00
" \n",
" # Skew-T\n",
" plot_skewT(modelName,p,t,d,u,v,w,tr[0])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"#top\">Top</a>\n",
2018-10-15 08:25:13 -06:00
"\n",
"---"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## See Also\n",
2018-10-15 08:25:13 -06:00
"\n",
"### Related Notebooks\n",
2018-10-15 08:25:13 -06:00
"\n",
"* [Grid Levels and Parameters](https://unidata.github.io/python-awips/examples/generated/Grid_Levels_and_Parameters.html)\n",
"* [Upper Air BUFR Soundings](http://unidata.github.io/python-awips/examples/generated/Upper_Air_BUFR_Soundings.html)\n",
"* [Model Sounding Data](http://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html)\n",
"\n",
"### Additional Documentation\n",
"\n",
"**python-awips:**\n",
"\n",
"* [awips.DataAccessLayer](http://unidata.github.io/python-awips/api/DataAccessLayer.html)\n",
"* [awips.ModelSounding](https://unidata.github.io/python-awips/api/ModelSounding.html)\n",
"\n",
"**matplotlib:**\n",
"\n",
"* [matplotlib.pyplot](https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.html)\n",
"\n",
"**MetPy**\n",
"\n",
"* [metpy.wind_speed](https://unidata.github.io/MetPy/latest/api/generated/metpy.calc.wind_speed.html)\n",
"* [metpy.wind_direction](https://unidata.github.io/MetPy/latest/api/generated/metpy.calc.wind_direction.html)\n",
"* [metpy.vapor_pressure](https://unidata.github.io/MetPy/latest/api/generated/metpy.calc.vapor_pressure.html)\n",
"* [metpy.dewpoint](https://unidata.github.io/MetPy/latest/api/generated/metpy.calc.dewpoint.html)\n",
"* [metpy.skewt](https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.SkewT.html)\n",
"* [metpy.hodograph](https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.Hodograph.html)"
2018-10-15 08:25:13 -06:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<a href=\"#top\">Top</a>\n",
"\n",
"---"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.13.1"
},
"toc": {
"base_numbering": 1,
"nav_menu": {},
"number_sections": true,
"sideBar": true,
"skip_h1_title": true,
"title_cell": "Table of Contents",
"title_sidebar": "Contents",
"toc_cell": true,
"toc_position": {},
"toc_section_display": true,
"toc_window_display": true
}
},
"nbformat": 4,
"nbformat_minor": 4
}