2018-10-11 20:33:23 -06:00
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The [SoundingsSupport](https://python-awips.readthedocs.io/en/latest/api/SoundingsSupport.html) class allows us to create a vertical sounding from any available AWIPS model."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"(Oct 12 18 00:00:00 , Oct 12 18 00:00:00 )\n"
]
}
],
"source": [
"from awips.dataaccess import SoundingsSupport\n",
"from awips.dataaccess import DataAccessLayer\n",
"from shapely.geometry import Point\n",
"import matplotlib.pyplot as plt\n",
"from datetime import datetime\n",
"import numpy as np\n",
"from metpy.units import units\n",
"\n",
"model = 'NAM40'\n",
"parms = ['T','DpT','wSp','uW','vW']\n",
"all_pres_levels = ['50.0MB','75.0MB','100.0MB','125.0MB','150.0MB','175.0MB',\n",
" '200.0MB','225.0MB','250.0MB','275.0MB','300.0MB','325.0MB',\n",
" '350.0MB','375.0MB','400.0MB','425.0MB','450.0MB','475.0MB',\n",
" '500.0MB','525.0MB','550.0MB','575.0MB','600.0MB','625.0MB',\n",
" '650.0MB','675.0MB','700.0MB','725.0MB','750.0MB','775.0MB',\n",
" '800.0MB','825.0MB','850.0MB','875.0MB','900.0MB','925.0MB',\n",
" '950.0MB','975.0MB','1000.0MB']\n",
"pres_levels = ['100.0MB','200.0MB','300.0MB','400.0MB','500.0MB','600.0MB',\n",
" '700.0MB','800.0MB','900.0MB','1000.0MB']\n",
"height_levels = ['0.0FHAG', '100.0FHAG', '500.0FHAG', \n",
" '750.0FHAG', '1000.0FHAG', '1250.0FHAG', '1500.0FHAG', \n",
" '2000.0FHAG', '2500.0FHAG', '3000.0FHAG', '3500.0FHAG', \n",
" '4000.0FHAG', '4500.0FHAG', '5000.0FHAG', '5500.0FHAG', \n",
" '6000.0FHAG', '7000.0FHAG', '7620.0FHAG', '8000.0FHAG', \n",
" '9000.0FHAG', '10000.0FHAG']\n",
"# use KDEN lat/lon\n",
"envelope = Point(39.87, -104.67)\n",
"\n",
"server = 'edex-cloud.unidata.ucar.edu'\n",
"DataAccessLayer.changeEDEXHost(server)\n",
"request = DataAccessLayer.newDataRequest(\"grid\", envelope=envelope)\n",
"request.setLocationNames(model)\n",
"request.setParameters('T')\n",
"response = DataAccessLayer.getAvailableTimes(request, True)\n",
"cycle = response[1]\n",
"refTime = cycle.getValidPeriod().getStart()\n",
2018-10-11 20:48:59 -06:00
"print(cycle.getValidPeriod())\n",
"\n",
2018-10-11 20:33:23 -06:00
"SoundingsSupport.changeEDEXHost(server)\n",
"sndObject = SoundingsSupport.getSounding(\n",
" model, parms, all_pres_levels, envelope, refTime=refTime)\n",
"print(\"Found \" + str(len(sndObject)) + \" records\")"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"50.0 1000.0\n"
]
}
],
"source": [
"pres, tmpc, dwpt, wsp, u, v = [], [], [], [], [], []\n",
"\n",
"for t in sndObject._dataDict: # times\n",
" if t.getFcstTime() == 0: # analysis time only\n",
" for lvl in sndObject._dataDict[t].levels(): # levels \n",
" for parm in sndObject._dataDict[t][lvl].parameters(): # parms\n",
" if parm == \"T\":\n",
" tmpc.append(float(sndObject._dataDict[t][lvl][parm]))\n",
" elif parm == \"DpT\":\n",
" dwpt.append(float(sndObject._dataDict[t][lvl][parm])) \n",
" elif parm == 'wSp':\n",
" wsp.append(float(sndObject._dataDict[t][lvl][parm])) \n",
" elif parm == 'uW':\n",
" u.append(float(sndObject._dataDict[t][lvl][parm])) \n",
" elif parm == 'vW':\n",
" v.append(float(sndObject._dataDict[t][lvl][parm])) \n",
" elif parm == 'P':\n",
" pres.append(float(sndObject._dataDict[t][lvl][parm]))\n",
"\n",
"pres = np.flip(np.array([l.replace('MB','') for l in all_pres_levels], dtype=float))\n",
"tmpc = (np.array(tmpc)-273.15) * units.degC\n",
"dwpt = (np.array(dwpt)-273.15) * units.degC\n",
"wsp = np.array(wsp, dtype=float)\n",
"u = np.array(u, dtype=float)\n",
"v = np.array(v, dtype=float)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"---\n",
"\n",
"## MetPy SkewT and Hodograph"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"39 39 39 39\n"
]
},
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 864x1008 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"%matplotlib inline\n",
"from metpy.plots import SkewT, Hodograph\n",
"from mpl_toolkits.axes_grid1.inset_locator import inset_axes\n",
"\n",
"plt.rcParams['figure.figsize'] = (12, 14)\n",
"# Create a skewT plot\n",
"skew = SkewT()\n",
"# Plot the data\n",
"skew.plot(pres, tmpc, 'r', linewidth=2)\n",
"skew.plot(pres, dwpt, 'g', linewidth=2)\n",
"skew.plot_barbs(pres, u, v)\n",
"skew.ax.set_ylim(1000, 100)\n",
"skew.ax.set_xlim(-40, 60)\n",
"plt.title( model + \" (\" + str(envelope) + \") \" + str(response[0].getRefTime()))\n",
"# An example of a slanted line at constant T -- in this case the 0 isotherm\n",
"l = skew.ax.axvline(0, color='c', linestyle='--', linewidth=2)\n",
"# Draw hodograph\n",
"ax_hod = inset_axes(skew.ax, '40%', '40%', loc=2)\n",
"h = Hodograph(ax_hod, component_range=wsp.max())\n",
"h.add_grid(increment=20)\n",
"h.plot_colormapped(u, v, wsp)\n",
"# Show the plot\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# TODO: use FHAG as levels and retrieve pres as a parameter"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.6.6"
}
},
"nbformat": 4,
"nbformat_minor": 1
}