python-awips/examples/notebooks/Model_Sounding_Data.ipynb

431 lines
234 KiB
Text
Raw Normal View History

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The EDEX modelsounding plugin creates 64-level vertical profiles from GFS and ETA (NAM) BUFR products distirubted over NOAAport. Paramters which are requestable are **pressure**, **temperature**, **specHum**, **uComp**, **vComp**, **omega**, **cldCvr**."
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [],
"source": [
"from awips.dataaccess import DataAccessLayer\n",
"DataAccessLayer.changeEDEXHost(\"edex-cloud.unidata.ucar.edu\")\n",
"request = DataAccessLayer.newDataRequest()\n",
"request.setDatatype(\"modelsounding\")\n",
"forecastModel = \"ETA\"\n",
"request.addIdentifier(\"reportType\", forecastModel)\n",
"request.setParameters(\"pressure\",\"temperature\",\"specHum\",\"uComp\",\"vComp\",\"omega\",\"cldCvr\")\n",
"\n",
"#availableLocs = DataAccessLayer.getAvailableLocationNames(request)\n",
"#availableLocs.sort()\n",
"request.setLocationNames(\"KDSM\")"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {
"collapsed": false,
"scrolled": true
},
"outputs": [
{
"data": {
"text/plain": [
"[<DataTime instance: 2016-10-21 18:00:00 (0) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (1) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (2) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (3) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (4) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (5) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (6) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (7) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (8) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (9) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (10) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (11) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (12) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (13) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (14) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (15) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (16) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (17) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (18) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (19) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (20) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (21) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (22) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (23) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (24) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (25) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (26) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (27) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (28) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (29) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (30) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (31) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (32) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (33) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (34) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (35) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (36) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (37) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (38) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (39) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (40) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (41) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (42) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (43) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (44) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (45) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (46) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (47) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (48) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (49) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (50) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (51) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (52) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (53) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (54) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (55) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (56) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (57) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (58) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (59) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (60) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (61) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (62) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (63) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (64) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (65) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (66) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (67) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (68) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (69) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (70) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (71) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (72) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (73) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (74) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (75) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (76) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (77) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (78) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (79) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (80) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (81) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (82) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (83) >,\n",
" <DataTime instance: 2016-10-21 18:00:00 (84) >]"
]
},
"execution_count": 24,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"cycles = DataAccessLayer.getAvailableTimes(request, True)\n",
"times = DataAccessLayer.getAvailableTimes(request)\n",
"fcstRun = DataAccessLayer.getForecastCycle(cycles[-1], times)\n",
"list(fcstRun)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Request data for a single time"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"response = DataAccessLayer.getGeometryData(request,[fcstRun[0]])"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"parms = ['uComp', 'cldCvr', 'temperature', 'vComp', 'pressure', 'omega', 'specHum']\n",
"site = KDSM\n",
"geom = POINT (-93.68000030517578 41.52000045776367)\n",
"datetime = 1970-01-18 02:17:52.800000 (0)\n",
"reftime = Jan 18 70 02:17:52 GMT\n",
"fcstHour = 0\n",
"period = (Jan 18 70 02:17:52 , Jan 18 70 02:17:52 )\n"
]
}
],
"source": [
"# initialize arrays\n",
"tmp,prs,sh,uc,vc,om,cld = [],[],[],[],[],[],[]\n",
"\n",
"for ob in response:\n",
" tmp.append(float(ob.getString(b\"temperature\")))\n",
" prs.append(float(ob.getString(b\"pressure\")))\n",
" sh.append(float(ob.getString(b\"specHum\")))\n",
" uc.append(float(ob.getString(b\"uComp\")))\n",
" vc.append(float(ob.getString(b\"vComp\")))\n",
" om.append(float(ob.getString(b\"omega\")))\n",
" cld.append(float(ob.getString(b\"cldCvr\")))\n",
"\n",
" \n",
"print(\"parms = \" + str(ob.getParameters()))\n",
"print(\"site = \" + str(ob.getLocationName()))\n",
"print(\"geom = \" + str(ob.getGeometry()))\n",
"print(\"datetime = \" + str(ob.getDataTime()))\n",
"print(\"reftime = \" + str(ob.getDataTime().getRefTime()))\n",
"print(\"fcstHour = \" + str(ob.getDataTime().getFcstTime()))\n",
"print(\"period = \" + str(ob.getDataTime().getValidPeriod()))\n",
"sounding_title = forecastModel + \" \" + str(ob.getLocationName()) + \"(\"+ str(ob.getGeometry())+\")\" + str(ob.getDataTime())"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Create data arrays and calculate dewpoint from spec. humidity"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [],
"source": [
"import matplotlib.tri as mtri\n",
"import matplotlib.pyplot as plt\n",
"from mpl_toolkits.axes_grid1.inset_locator import inset_axes\n",
"from math import exp, log\n",
"import numpy as np\n",
"\n",
"from metpy.calc import get_wind_components, lcl, dry_lapse, parcel_profile, dewpoint\n",
"from metpy.calc import get_wind_speed,get_wind_dir, thermo, vapor_pressure\n",
"from metpy.plots import SkewT, Hodograph\n",
"from metpy.units import units, concatenate\n",
"\n",
"pres = np.array(prs)\n",
"# we can use units.* here...\n",
"t = (np.array(tmp)-273.16) * units.degC\n",
"p = np.array(pres)/100 * units.mbar\n",
"s = np.array(sh)\n",
"\n",
"u,v = np.array(uc)*1.94384,np.array(vc)*1.94384 # m/s to knots\n",
"spd = get_wind_speed(u, v) * units.knots\n",
"dir = get_wind_dir(u, v) * units.deg\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
2016-07-15 12:40:48 -05:00
"## Dewpoint from Specific Humidity\n",
"\n",
2016-07-15 12:40:48 -05:00
"Because the modelsounding plugin does not return dewpoint values, we must calculate the profile ourselves. Here are three examples of dewpoint calculated from specific humidity, including a manual calculation following NCEP AWIPS/NSHARP. \n",
"\n",
"### 1) metpy calculated mixing ratio and vapor pressure"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"rmix = (s/(1-s)) *1000 * units('g/kg')\n",
"e = vapor_pressure(p, rmix)\n",
"td = dewpoint(e)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2) metpy calculated assuming spec. humidity = mixing ratio"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"td2 = dewpoint(vapor_pressure(p, s))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 3) NCEP AWIPS soundingrequest plugin\n",
"based on GEMPAK/NSHARP, from https://github.com/Unidata/awips2-ncep/blob/unidata_16.2.2/edex/gov.noaa.nws.ncep.edex.plugin.soundingrequest/src/gov/noaa/nws/ncep/edex/plugin/soundingrequest/handler/MergeSounding.java#L1783"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"/awips2/python/lib/python2.7/site-packages/ipykernel/__main__.py:8: RuntimeWarning: divide by zero encountered in log\n",
"/awips2/python/lib/python2.7/site-packages/ipykernel/__main__.py:8: RuntimeWarning: invalid value encountered in divide\n"
]
}
],
"source": [
"# new arrays\n",
"ntmp,nprs,nsh = np.array(tmp)-273.16,np.array(prs),np.array(sh)\n",
"\n",
"# where p=pressure(pa), T=temp(C), T0=reference temp(273.16)\n",
"rh = 0.263*nprs*nsh / (np.exp(17.67*ntmp/(ntmp+273.16-29.65)))\n",
"vaps = 6.112 * np.exp((17.67 * ntmp) / (ntmp + 243.5))\n",
"vapr = rh * vaps / 100\n",
"dwpc = np.array(243.5 * (np.log(6.112) - np.log(vapr)) / (np.log(vapr) - np.log(6.112) - 17.67)) * units.degC"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"-88.7121665973 degC 4.83328438212 degC\n",
"-88.7122779647 degC 4.75580440789 degC\n",
"-88.7145460976 degC 4.87830433896 degC\n"
]
}
],
"source": [
"print min(td), max(td)\n",
"print min(td2), max(td2)\n",
"print min(dwpc), max(dwpc)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Plot with MetPy"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n+sxCbTvWtU9xnK6QdHg
"text/plain": [
"<matplotlib.figure.Figure at 0x7f54251b3150>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%matplotlib inline\n",
"\n",
"plt.rcParams['figure.figsize'] = (12, 14)\n",
"\n",
"# Create a skewT plot\n",
"skew = SkewT()\n",
"\n",
"# Plot the data\n",
"skew.plot(p, t, 'r')\n",
"skew.plot(p, td, 'b')\n",
"skew.plot(p, td2, 'y')\n",
"skew.plot(p, dwpc, 'g')\n",
"\n",
"skew.plot_barbs(p, u, v)\n",
"skew.ax.set_ylim(1000, 100)\n",
"skew.ax.set_xlim(-40, 60)\n",
"\n",
"\n",
"plt.title(sounding_title)\n",
"\n",
"# Calculate LCL height and plot as black dot\n",
"l = lcl(p[0], t[0], td[0])\n",
"lcl_temp = dry_lapse(concatenate((p[0], l)), t[0])[-1].to('degC')\n",
"skew.plot(l, lcl_temp, 'ko', markerfacecolor='black')\n",
"\n",
"\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",
"\n",
"# Draw hodograph\n",
"ax_hod = inset_axes(skew.ax, '40%', '40%', loc=2)\n",
"h = Hodograph(ax_hod, component_range=get_wind_speed(u, v).max())\n",
"h.add_grid(increment=20)\n",
"h.plot_colormapped(u, v, spd)\n",
"\n",
"# Show the plot\n",
"plt.show()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.10"
}
},
"nbformat": 4,
"nbformat_minor": 0
}