This commit is contained in:
srcarter3 2023-07-25 21:32:54 +00:00
parent 7cca759efb
commit 3cb979afe7
13 changed files with 582 additions and 421 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 160 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 182 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 162 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 159 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 161 KiB

View file

@ -2,50 +2,83 @@
Forecast Model Vertical Sounding
================================
`Notebook <http://nbviewer.ipython.org/github/Unidata/python-awips/blob/master/examples/notebooks/Forecast_Model_Vertical_Sounding.ipynb>`_
The ModelSounding class allows us to create a vertical sounding through
any available AWIPS model with isobaric levels.
Python-AWIPS Tutorial Notebook
- A Shapely Point geometry is used to select longitude and latitude:
from shapely.geometry import Point point = Point(-104.67,39.87)
--------------
- Parameters ``['T','DpT','uW','vW']`` are requested for all isobaric
levels available for the selected model.
Objectives
==========
- There is a single-record query performed for ``level = "0.0FHAG"`` to
determine the surface pressure level.
- Use python-awips to connect to an edex server
- 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>`__
- Create and compare vertical sounding from different AWIPS model data
with isobaric levels
- Use `Shapely Point
geometry <https://shapely.readthedocs.io/en/stable/reference/shapely.Point.html>`__
to define a point
- Convert between units when necessary
- 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
- Pay attention to units when switching models. This notebook was
written for the NAM 40km AWIPS model where temperature and dewpoint
are returned as Kelvin and wind components as m/s.
--------------
1 Imports
---------
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.
.. code:: ipython3
%matplotlib inline
from awips.dataaccess import DataAccessLayer, ModelSounding
from awips import ThriftClient
import matplotlib.pyplot as plt
import numpy as np
from metpy.plots import SkewT, Hodograph
from metpy.units import units
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
from math import sqrt
from datetime import datetime, timedelta
from shapely.geometry import Point, Polygon
import shapely.wkb
import timeit
model="NAM40"
parms = ['T','DpT','uW','vW']
from shapely.geometry import Point
`Top <https://unidata.github.io/python-awips/examples/generated/Forecast_Model_Vertical_Sounding.html>`__
--------------
2 EDEX Connection
-----------------
First we establish a connection to Unidatas public EDEX server. This
sets the proper server on the **DataAccessLayer**, which we will use
numerous times throughout the notebook.
.. code:: ipython3
server = 'edex-cloud.unidata.ucar.edu'
DataAccessLayer.changeEDEXHost(server)
# note the order is LON,lat and not lat,LON
point = Point(-104.67,39.87)
`Top <https://unidata.github.io/python-awips/examples/generated/Forecast_Model_Vertical_Sounding.html>`__
inc = 0.005
bbox=[point.y-inc, point.y+inc, point.x-inc, point.x+inc]
polygon = Polygon([(bbox[0],bbox[2]),(bbox[0],bbox[3]),
(bbox[1],bbox[3]),(bbox[1],bbox[2]),
(bbox[0],bbox[2])])
--------------
3 Define Useful Variables
-------------------------
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.
.. code:: ipython3
# Note the order is Lon,Lat and not Lat,Lon
point = Point(-104.67,39.87)
model="NAM40"
# Get latest forecast cycle run
timeReq = DataAccessLayer.newDataRequest("grid")
@ -54,48 +87,87 @@ any available AWIPS model with isobaric levels.
times = DataAccessLayer.getAvailableTimes(timeReq)
fcstRun = DataAccessLayer.getForecastRun(cycles[-2], times)
print("Using " + model + " forecast time " + str(fcstRun[0]))
timeRange = [fcstRun[0]]
print("Using " + model + " forecast time " + str(timeRange))
.. parsed-literal::
Using NAM40 forecast time 2023-05-17 12:00:00
Using NAM40 forecast time [<DataTime instance: 2023-07-25 12:00:00 >]
`Top <https://unidata.github.io/python-awips/examples/generated/Forecast_Model_Vertical_Sounding.html>`__
--------------
4 Function: get_surface_data()
------------------------------
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.
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.
.. code:: ipython3
p,t,d,u,v = [],[],[],[],[]
def get_surface_data(modelName, location, time):
""" model name, location, and timeRange desire """
# request data and sort response
pressure,temp,dpt,ucomp,vcomp = [],[],[],[],[]
use_parms = ['T','DpT','uW','vW','P']
use_level = "0.0FHAG"
sndObject = ModelSounding.getSounding(model, use_parms,
["0.0FHAG"], point, timeRange=[fcstRun[0]])
sndObject = ModelSounding.getSounding(modelName, use_parms, [use_level], location, time)
if len(sndObject) > 0:
for time in sndObject._dataDict:
p.append(float(sndObject._dataDict[time][use_level]['P']))
t.append(float(sndObject._dataDict[time][use_level]['T']))
d.append(float(sndObject._dataDict[time][use_level]['DpT']))
u.append(float(sndObject._dataDict[time][use_level]['uW']))
v.append(float(sndObject._dataDict[time][use_level]['vW']))
print("Found surface record at " + "%.1f" % p[0] + "MB")
pressure.append(float(sndObject._dataDict[time][use_level]['P']))
temp.append(float(sndObject._dataDict[time][use_level]['T']))
dpt.append(float(sndObject._dataDict[time][use_level]['DpT']))
ucomp.append(float(sndObject._dataDict[time][use_level]['uW']))
vcomp.append(float(sndObject._dataDict[time][use_level]['vW']))
print("Found surface record at " + "%.1f" % pressure[0] + "MB")
else:
raise ValueError("sndObject returned empty for query ["
+ ', '.join(str(x) for x in (model, use_parms, point, use_level)) +"]")
+ ', '.join(str(x) for x in (modelName, use_parms, point, use_level)) +"]")
# return information for plotting
return pressure,temp,dpt,ucomp,vcomp
Top
--------------
.. parsed-literal::
5 Function: get_levels_data()
-----------------------------
Found surface record at 830.1MB
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.
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.
It returns the fully populated pressure, temperature, dewpoint,
u-component, v-component, and computed wind arrays.
.. code:: ipython3
def get_levels_data(modelName, location, time, pressure, temp, dpt, ucomp, vcomp):
# Get isobaric levels with our requested parameters
parms = ['T','DpT','uW','vW']
levelReq = DataAccessLayer.newDataRequest("grid", envelope=point)
levelReq.setLocationNames(model)
levelReq.setParameters('T','DpT','uW','vW')
levelReq.setParameters(*(parms))
availableLevels = DataAccessLayer.getAvailableLevels(levelReq)
# Clean levels list of unit string (MB, FHAG, etc.)
@ -104,12 +176,11 @@ any available AWIPS model with isobaric levels.
name=str(lvl)
if 'MB' in name and '_' not in name:
# If this level is above (less than in mb) our 0.0FHAG record
if float(name.replace('MB','')) < p[0]:
if float(name.replace('MB','')) < pressure[0]:
levels.append(lvl)
# Get Sounding
sndObject = ModelSounding.getSounding(model, parms, levels, point,
timeRange=[fcstRun[0]])
sndObject = ModelSounding.getSounding(modelName, parms, levels, location, time)
if not len(sndObject) > 0:
raise ValueError("sndObject returned empty for query ["
@ -119,211 +190,229 @@ any available AWIPS model with isobaric levels.
for lvl in sndObject._dataDict[time].levels():
for parm in sndObject._dataDict[time][lvl].parameters():
if parm == "T":
t.append(float(sndObject._dataDict[time][lvl][parm]))
temp.append(float(sndObject._dataDict[time][lvl][parm]))
elif parm == "DpT":
d.append(float(sndObject._dataDict[time][lvl][parm]))
dpt.append(float(sndObject._dataDict[time][lvl][parm]))
elif parm == 'uW':
u.append(float(sndObject._dataDict[time][lvl][parm]))
ucomp.append(float(sndObject._dataDict[time][lvl][parm]))
elif parm == 'vW':
v.append(float(sndObject._dataDict[time][lvl][parm]))
vcomp.append(float(sndObject._dataDict[time][lvl][parm]))
else:
print("WHAT IS THIS")
print(sndObject._dataDict[time][lvl][parm])
# Pressure is our requested level rather than a returned parameter
p.append(float(lvl.replace('MB','')))
pressure.append(float(lvl.replace('MB','')))
# convert to numpy.array()
p = np.array(p, dtype=float)
t = (np.array(t, dtype=float) - 273.15) * units.degC
d = (np.array(d, dtype=float) - 273.15) * units.degC
u = (np.array(u, dtype=float) * units('m/s')).to('knots')
v = (np.array(v, dtype=float) * units('m/s')).to('knots')
w = np.sqrt(u**2 + v**2)
pressure = np.array(pressure, dtype=float)
temp = (np.array(temp, dtype=float) - 273.15) * units.degC
dpt = (np.array(dpt, dtype=float) - 273.15) * units.degC
ucomp = (np.array(ucomp, dtype=float) * units('m/s')).to('knots')
vcomp = (np.array(vcomp, dtype=float) * units('m/s')).to('knots')
wind = np.sqrt(ucomp**2 + vcomp**2)
print("Using " + str(len(levels)) + " levels between " +
str("%.1f" % max(p)) + " and " + str("%.1f" % min(p)) + "MB")
.. parsed-literal::
Using 32 levels between 830.1 and 50.0MB
str("%.1f" % max(pressure)) + " and " + str("%.1f" % min(pressure)) + "MB")
return pressure,temp,dpt,ucomp,vcomp,wind
`Top <https://unidata.github.io/python-awips/examples/generated/Forecast_Model_Vertical_Sounding.html>`__
--------------
Skew-T/Log-P
------------
6 Function: plot_skewT()
------------------------
Since were plotting many different models for comparison, all that code
was used to create this function.
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.
.. code:: ipython3
def plot_skewT(modelName, pressure, temp, dpt, ucomp, vcomp, wind, refTime):
plt.rcParams['figure.figsize'] = (12, 14)
# Skew-T
skew = SkewT(rotation=45)
skew.plot(p, t, 'r', linewidth=2)
skew.plot(p, d, 'g', linewidth=2)
skew.plot_barbs(p, u, v)
skew.plot(pressure, temp, 'r', linewidth=2)
skew.plot(pressure, dpt, 'g', linewidth=2)
skew.plot_barbs(pressure, ucomp, vcomp)
skew.plot_dry_adiabats()
skew.plot_moist_adiabats()
skew.plot_mixing_lines(linestyle=':')
skew.ax.set_ylim(1000, np.min(p))
skew.ax.set_ylim(1000, np.min(pressure))
skew.ax.set_xlim(-50, 40)
# Title
plt.title( model + " (" + str(point) + ") " + str(time.getRefTime()))
plt.title(modelName + " (" + str(point) + ") " + str(refTime))
# Hodograph
ax_hod = inset_axes(skew.ax, '40%', '40%', loc=2)
h = Hodograph(ax_hod, component_range=max(w.magnitude))
h = Hodograph(ax_hod, component_range=max(wind.magnitude))
h.add_grid(increment=20)
h.plot_colormapped(u, v, w)
h.plot_colormapped(ucomp, vcomp, wind)
# Dotted line at 0C isotherm
l = skew.ax.axvline(0, color='c', linestyle='-', linewidth=1)
plt.show()
`Top <https://unidata.github.io/python-awips/examples/generated/Forecast_Model_Vertical_Sounding.html>`__
--------------
7 Retrieve Necessary Plotting Data
----------------------------------
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. 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.
.. code:: ipython3
p,t,d,u,v = get_surface_data(model,point,timeRange)
p,t,d,u,v,w = get_levels_data(model,point,timeRange,p,t,d,u,v)
.. image:: Forecast_Model_Vertical_Sounding_files/Forecast_Model_Vertical_Sounding_5_0.png
.. parsed-literal::
Found surface record at 833.2MB
Using 32 levels between 833.2 and 50.0MB
Model Sounding Comparison
-------------------------
`Top <https://unidata.github.io/python-awips/examples/generated/Forecast_Model_Vertical_Sounding.html>`__
--------------
8 Skew-T/Log-P
--------------
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.
.. code:: ipython3
plot_skewT(model, p, t, d, u, v, w, timeRange[0])
.. image:: Forecast_Model_Vertical_Sounding_files/Forecast_Model_Vertical_Sounding_24_0.png
`Top <https://unidata.github.io/python-awips/examples/generated/Forecast_Model_Vertical_Sounding.html>`__
--------------
9 Model Sounding Comparison
---------------------------
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 well also plot RAP13 and GFS20 data to
compare with NAM40.
This is also where our functions become so important, because we can
easily recall all that logic and keep this for-loop fairly simple.
.. code:: ipython3
models = ["RAP13", "GFS20", "NAM40"]
parms = ['T','DpT','uW','vW']
for modelName in models:
timeReq = DataAccessLayer.newDataRequest("grid")
timeReq.setLocationNames(modelName)
cycles = DataAccessLayer.getAvailableTimes(timeReq, True)
times = DataAccessLayer.getAvailableTimes(timeReq)
fcstRun = DataAccessLayer.getForecastRun(cycles[-1], times)
print("Using " + modelName + " forecast time " + str(fcstRun[0]))
fr = DataAccessLayer.getForecastRun(cycles[-1], times)
print("Using " + modelName + " forecast time " + str(fr[0]))
tr = [fr[0]]
p,t,d,u,v = [],[],[],[],[]
use_parms = ['T','DpT','uW','vW','P']
use_level = "0.0FHAG"
sndObject = ModelSounding.getSounding(modelName, use_parms,
[use_level], point, timeRange=[fcstRun[0]])
if len(sndObject) > 0:
for time in sndObject._dataDict:
p.append(float(sndObject._dataDict[time][use_level]['P']))
t.append(float(sndObject._dataDict[time][use_level]['T']))
d.append(float(sndObject._dataDict[time][use_level]['DpT']))
u.append(float(sndObject._dataDict[time][use_level]['uW']))
v.append(float(sndObject._dataDict[time][use_level]['vW']))
print("Found surface record at " + "%.1f" % p[0] + "MB")
else:
raise ValueError("sndObject returned empty for query ["
+ ', '.join(str(x) for x in (modelName, use_parms, point, use_level)) +"]")
# Get isobaric levels with our requested parameters
levelReq = DataAccessLayer.newDataRequest("grid", envelope=point)
levelReq.setLocationNames(modelName)
levelReq.setParameters('T','DpT','uW','vW')
availableLevels = DataAccessLayer.getAvailableLevels(levelReq)
# Clean levels list of unit string (MB, FHAG, etc.)
levels = []
for lvl in availableLevels:
name=str(lvl)
if 'MB' in name and '_' not in name:
# If this level is above (less than in mb) our 0.0FHAG record
if float(name.replace('MB','')) < p[0]:
levels.append(lvl)
# Get Sounding
sndObject = ModelSounding.getSounding(modelName, parms, levels, point,
timeRange=[fcstRun[0]])
if not len(sndObject) > 0:
raise ValueError("sndObject returned empty for query ["
+ ', '.join(str(x) for x in (modelName, parms, point, levels)) +"]")
for time in sndObject._dataDict:
for lvl in sndObject._dataDict[time].levels():
for parm in sndObject._dataDict[time][lvl].parameters():
if parm == "T":
t.append(float(sndObject._dataDict[time][lvl][parm]))
elif parm == "DpT":
d.append(float(sndObject._dataDict[time][lvl][parm]))
elif parm == 'uW':
u.append(float(sndObject._dataDict[time][lvl][parm]))
elif parm == 'vW':
v.append(float(sndObject._dataDict[time][lvl][parm]))
else:
print("WHAT IS THIS")
print(sndObject._dataDict[time][lvl][parm])
# Pressure is our requested level rather than a returned parameter
p.append(float(lvl.replace('MB','')))
# convert to numpy.array()
p = np.array(p, dtype=float)
t = (np.array(t, dtype=float) - 273.15) * units.degC
d = (np.array(d, dtype=float) - 273.15) * units.degC
u = (np.array(u, dtype=float) * units('m/s')).to('knots')
v = (np.array(v, dtype=float) * units('m/s')).to('knots')
w = np.sqrt(u**2 + v**2)
print("Using " + str(len(levels)) + " levels between " +
str("%.1f" % max(p)) + " and " + str("%.1f" % min(p)) + "MB")
p,t,d,u,v = get_surface_data(modelName,point,tr)
p,t,d,u,v,w = get_levels_data(modelName,point,tr,p,t,d,u,v)
# Skew-T
plt.rcParams['figure.figsize'] = (12, 14)
skew = SkewT(rotation=45)
skew.plot(p, t, 'r', linewidth=2)
skew.plot(p, d, 'g', linewidth=2)
skew.plot_barbs(p, u, v)
skew.plot_dry_adiabats()
skew.plot_moist_adiabats()
skew.plot_mixing_lines(linestyle=':')
skew.ax.set_ylim(1000, 100)
skew.ax.set_xlim(-50, 40)
# Title
plt.title( modelName + " (" + str(point) + ") " + str(time.getRefTime()))
# Hodograph
ax_hod = inset_axes(skew.ax, '40%', '40%', loc=2)
h = Hodograph(ax_hod, component_range=max(w.magnitude))
h.add_grid(increment=20)
h.plot_colormapped(u, v, w)
# Dotted line at 0C isotherm
l = skew.ax.axvline(0, color='c', linestyle='-', linewidth=1)
plt.show()
plot_skewT(modelName,p,t,d,u,v,w,tr[0])
.. parsed-literal::
Using RAP13 forecast time 2023-05-17 20:00:00
Using RAP13 forecast time 2023-07-25 19:00:00
Found surface record at 839.4MB
Using 32 levels between 839.4 and 100.0MB
.. image:: Forecast_Model_Vertical_Sounding_files/Forecast_Model_Vertical_Sounding_27_1.png
.. parsed-literal::
Using GFS20 forecast time 2023-07-25 12:00:00
Found surface record at 842.5MB
Using 32 levels between 842.5 and 100.0MB
.. image:: Forecast_Model_Vertical_Sounding_files/Forecast_Model_Vertical_Sounding_27_3.png
.. parsed-literal::
Using NAM40 forecast time 2023-07-25 18:00:00
Found surface record at 833.8MB
Using 30 levels between 833.8 and 100.0MB
Using 32 levels between 833.8 and 50.0MB
.. image:: Forecast_Model_Vertical_Sounding_files/Forecast_Model_Vertical_Sounding_7_1.png
.. image:: Forecast_Model_Vertical_Sounding_files/Forecast_Model_Vertical_Sounding_27_5.png
.. parsed-literal::
`Top <https://unidata.github.io/python-awips/examples/generated/Forecast_Model_Vertical_Sounding.html>`__
Using GFS20 forecast time 2023-05-17 12:00:00
Found surface record at 839.9MB
Using 22 levels between 839.9 and 100.0MB
--------------
10 See Also
-----------
10.1 Related Notebooks
~~~~~~~~~~~~~~~~~~~~~~
.. image:: Forecast_Model_Vertical_Sounding_files/Forecast_Model_Vertical_Sounding_7_3.png
- `Grid Levels and
Parameters <https://unidata.github.io/python-awips/examples/generated/Grid_Levels_and_Parameters.html>`__
- `Upper Air BUFR
Soundings <http://unidata.github.io/python-awips/examples/generated/Upper_Air_BUFR_Soundings.html>`__
- `Model Sounding
Data <http://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html>`__
10.2 Additional Documentation
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. parsed-literal::
**python-awips:**
Using NAM40 forecast time 2023-05-17 18:00:00
Found surface record at 829.4MB
Using 32 levels between 829.4 and 50.0MB
- `awips.DataAccessLayer <http://unidata.github.io/python-awips/api/DataAccessLayer.html>`__
- `awips.ModelSounding <https://unidata.github.io/python-awips/api/ModelSounding.html>`__
**matplotlib:**
- `matplotlib.pyplot <https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.html>`__
.. image:: Forecast_Model_Vertical_Sounding_files/Forecast_Model_Vertical_Sounding_7_5.png
**MetPy**
- `metpy.wind_speed <https://unidata.github.io/MetPy/latest/api/generated/metpy.calc.wind_speed.html>`__
- `metpy.wind_direction <https://unidata.github.io/MetPy/latest/api/generated/metpy.calc.wind_direction.html>`__
- `metpy.vapor_pressure <https://unidata.github.io/MetPy/latest/api/generated/metpy.calc.vapor_pressure.html>`__
- `metpy.dewpoint <https://unidata.github.io/MetPy/latest/api/generated/metpy.calc.dewpoint.html>`__
- `metpy.skewt <https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.SkewT.html>`__
- `metpy.hodograph <https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.Hodograph.html>`__
`Top <https://unidata.github.io/python-awips/examples/generated/Forecast_Model_Vertical_Sounding.html>`__
--------------

File diff suppressed because one or more lines are too long

View file

@ -53,8 +53,19 @@
<li class="toctree-l2"><a class="reference internal" href="Colored_Surface_Temperature_Plot.html">Colored Surface Temperature Plot</a></li>
<li class="toctree-l2"><a class="reference internal" href="Colorized_Grid_Data.html">Colorized Grid Data</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">Forecast Model Vertical Sounding</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#skew-t-log-p">Skew-T/Log-P</a></li>
<li class="toctree-l3"><a class="reference internal" href="#model-sounding-comparison">Model Sounding Comparison</a></li>
<li class="toctree-l3"><a class="reference internal" href="#objectives">Objectives</a><ul>
<li class="toctree-l4"><a class="reference internal" href="#imports">1 Imports</a></li>
<li class="toctree-l4"><a class="reference internal" href="#edex-connection">2 EDEX Connection</a></li>
<li class="toctree-l4"><a class="reference internal" href="#define-useful-variables">3 Define Useful Variables</a></li>
<li class="toctree-l4"><a class="reference internal" href="#function-get-surface-data">4 Function: get_surface_data()</a></li>
<li class="toctree-l4"><a class="reference internal" href="#function-get-levels-data">5 Function: get_levels_data()</a></li>
<li class="toctree-l4"><a class="reference internal" href="#function-plot-skewt">6 Function: plot_skewT()</a></li>
<li class="toctree-l4"><a class="reference internal" href="#retrieve-necessary-plotting-data">7 Retrieve Necessary Plotting Data</a></li>
<li class="toctree-l4"><a class="reference internal" href="#skew-t-log-p">8 Skew-T/Log-P</a></li>
<li class="toctree-l4"><a class="reference internal" href="#model-sounding-comparison">9 Model Sounding Comparison</a></li>
<li class="toctree-l4"><a class="reference internal" href="#see-also">10 See Also</a></li>
</ul>
</li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="GOES_CIRA_Product_Writer.html">GOES CIRA Product Writer</a></li>
@ -103,45 +114,68 @@
<section id="forecast-model-vertical-sounding">
<h1>Forecast Model Vertical Sounding<a class="headerlink" href="#forecast-model-vertical-sounding" title="Permalink to this heading"></a></h1>
<p><a class="reference external" href="http://nbviewer.ipython.org/github/Unidata/python-awips/blob/master/examples/notebooks/Forecast_Model_Vertical_Sounding.ipynb">Notebook</a>
The ModelSounding class allows us to create a vertical sounding through
any available AWIPS model with isobaric levels.</p>
Python-AWIPS Tutorial Notebook</p>
<hr class="docutils" />
<section id="objectives">
<h2>Objectives<a class="headerlink" href="#objectives" title="Permalink to this heading"></a></h2>
<ul class="simple">
<li><p>A Shapely Point geometry is used to select longitude and latitude:
from shapely.geometry import Point point = Point(-104.67,39.87)</p></li>
<li><p>Parameters <code class="docutils literal notranslate"><span class="pre">['T','DpT','uW','vW']</span></code> are requested for all isobaric
levels available for the selected model.</p></li>
<li><p>There is a single-record query performed for <code class="docutils literal notranslate"><span class="pre">level</span> <span class="pre">=</span> <span class="pre">&quot;0.0FHAG&quot;</span></code> to
determine the surface pressure level.</p></li>
<li><p>Pay attention to units when switching models. This notebook was
written for the NAM 40km AWIPS model where temperature and dewpoint
are returned as Kelvin and wind components as m/s.</p></li>
<li><p>Use python-awips to connect to an edex server</p></li>
<li><p>Request data using the <a class="reference external" href="http://unidata.github.io/python-awips/api/ModelSounding.html">ModelSounding
class</a>
in addition to using the normal <a class="reference external" href="http://unidata.github.io/python-awips/api/DataAccessLayer.html">DataAccess
class</a></p></li>
<li><p>Create and compare vertical sounding from different AWIPS model data
with isobaric levels</p></li>
<li><p>Use <a class="reference external" href="https://shapely.readthedocs.io/en/stable/reference/shapely.Point.html">Shapely Point
geometry</a>
to define a point</p></li>
<li><p>Convert between units when necessary</p></li>
<li><p>Use MetPy to create
<a class="reference external" href="https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.SkewT.html">SkewT</a>
and
<a class="reference external" href="https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.Hodograph.html">Hodograph</a>
plots</p></li>
</ul>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="o">%</span><span class="k">matplotlib</span> inline
<span class="kn">from</span> <span class="nn">awips.dataaccess</span> <span class="kn">import</span> <span class="n">DataAccessLayer</span><span class="p">,</span> <span class="n">ModelSounding</span>
<span class="kn">from</span> <span class="nn">awips</span> <span class="kn">import</span> <span class="n">ThriftClient</span>
<hr class="docutils" />
<section id="imports">
<h3>1 Imports<a class="headerlink" href="#imports" title="Permalink to this heading"></a></h3>
<p>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.</p>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">awips.dataaccess</span> <span class="kn">import</span> <span class="n">DataAccessLayer</span><span class="p">,</span> <span class="n">ModelSounding</span>
<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
<span class="kn">from</span> <span class="nn">metpy.plots</span> <span class="kn">import</span> <span class="n">SkewT</span><span class="p">,</span> <span class="n">Hodograph</span>
<span class="kn">from</span> <span class="nn">metpy.units</span> <span class="kn">import</span> <span class="n">units</span>
<span class="kn">from</span> <span class="nn">mpl_toolkits.axes_grid1.inset_locator</span> <span class="kn">import</span> <span class="n">inset_axes</span>
<span class="kn">from</span> <span class="nn">math</span> <span class="kn">import</span> <span class="n">sqrt</span>
<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span>
<span class="kn">from</span> <span class="nn">shapely.geometry</span> <span class="kn">import</span> <span class="n">Point</span><span class="p">,</span> <span class="n">Polygon</span>
<span class="kn">import</span> <span class="nn">shapely.wkb</span>
<span class="kn">import</span> <span class="nn">timeit</span>
<span class="n">model</span><span class="o">=</span><span class="s2">&quot;NAM40&quot;</span>
<span class="n">parms</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;T&#39;</span><span class="p">,</span><span class="s1">&#39;DpT&#39;</span><span class="p">,</span><span class="s1">&#39;uW&#39;</span><span class="p">,</span><span class="s1">&#39;vW&#39;</span><span class="p">]</span>
<span class="n">server</span> <span class="o">=</span> <span class="s1">&#39;edex-cloud.unidata.ucar.edu&#39;</span>
<span class="kn">from</span> <span class="nn">shapely.geometry</span> <span class="kn">import</span> <span class="n">Point</span>
</pre></div>
</div>
<p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Forecast_Model_Vertical_Sounding.html">Top</a></p>
</section>
<hr class="docutils" />
<section id="edex-connection">
<h3>2 EDEX Connection<a class="headerlink" href="#edex-connection" title="Permalink to this heading"></a></h3>
<p>First we establish a connection to Unidatas public EDEX server. This
sets the proper server on the <strong>DataAccessLayer</strong>, which we will use
numerous times throughout the notebook.</p>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">server</span> <span class="o">=</span> <span class="s1">&#39;edex-cloud.unidata.ucar.edu&#39;</span>
<span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">changeEDEXHost</span><span class="p">(</span><span class="n">server</span><span class="p">)</span>
<span class="c1"># note the order is LON,lat and not lat,LON</span>
</pre></div>
</div>
<p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Forecast_Model_Vertical_Sounding.html">Top</a></p>
</section>
<hr class="docutils" />
<section id="define-useful-variables">
<h3>3 Define Useful Variables<a class="headerlink" href="#define-useful-variables" title="Permalink to this heading"></a></h3>
<p>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.</p>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># Note the order is Lon,Lat and not Lat,Lon</span>
<span class="n">point</span> <span class="o">=</span> <span class="n">Point</span><span class="p">(</span><span class="o">-</span><span class="mf">104.67</span><span class="p">,</span><span class="mf">39.87</span><span class="p">)</span>
<span class="n">inc</span> <span class="o">=</span> <span class="mf">0.005</span>
<span class="n">bbox</span><span class="o">=</span><span class="p">[</span><span class="n">point</span><span class="o">.</span><span class="n">y</span><span class="o">-</span><span class="n">inc</span><span class="p">,</span> <span class="n">point</span><span class="o">.</span><span class="n">y</span><span class="o">+</span><span class="n">inc</span><span class="p">,</span> <span class="n">point</span><span class="o">.</span><span class="n">x</span><span class="o">-</span><span class="n">inc</span><span class="p">,</span> <span class="n">point</span><span class="o">.</span><span class="n">x</span><span class="o">+</span><span class="n">inc</span><span class="p">]</span>
<span class="n">polygon</span> <span class="o">=</span> <span class="n">Polygon</span><span class="p">([(</span><span class="n">bbox</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="n">bbox</span><span class="p">[</span><span class="mi">2</span><span class="p">]),(</span><span class="n">bbox</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="n">bbox</span><span class="p">[</span><span class="mi">3</span><span class="p">]),</span>
<span class="p">(</span><span class="n">bbox</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span><span class="n">bbox</span><span class="p">[</span><span class="mi">3</span><span class="p">]),(</span><span class="n">bbox</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span><span class="n">bbox</span><span class="p">[</span><span class="mi">2</span><span class="p">]),</span>
<span class="p">(</span><span class="n">bbox</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="n">bbox</span><span class="p">[</span><span class="mi">2</span><span class="p">])])</span>
<span class="n">model</span><span class="o">=</span><span class="s2">&quot;NAM40&quot;</span>
<span class="c1"># Get latest forecast cycle run</span>
<span class="n">timeReq</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">newDataRequest</span><span class="p">(</span><span class="s2">&quot;grid&quot;</span><span class="p">)</span>
@ -150,242 +184,280 @@ are returned as Kelvin and wind components as m/s.</p></li>
<span class="n">times</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">getAvailableTimes</span><span class="p">(</span><span class="n">timeReq</span><span class="p">)</span>
<span class="n">fcstRun</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">getForecastRun</span><span class="p">(</span><span class="n">cycles</span><span class="p">[</span><span class="o">-</span><span class="mi">2</span><span class="p">],</span> <span class="n">times</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Using &quot;</span> <span class="o">+</span> <span class="n">model</span> <span class="o">+</span> <span class="s2">&quot; forecast time &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">fcstRun</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span>
<span class="n">timeRange</span> <span class="o">=</span> <span class="p">[</span><span class="n">fcstRun</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Using &quot;</span> <span class="o">+</span> <span class="n">model</span> <span class="o">+</span> <span class="s2">&quot; forecast time &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">timeRange</span><span class="p">))</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Using</span> <span class="n">NAM40</span> <span class="n">forecast</span> <span class="n">time</span> <span class="mi">2023</span><span class="o">-</span><span class="mi">05</span><span class="o">-</span><span class="mi">17</span> <span class="mi">12</span><span class="p">:</span><span class="mi">00</span><span class="p">:</span><span class="mi">00</span>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Using</span> <span class="n">NAM40</span> <span class="n">forecast</span> <span class="n">time</span> <span class="p">[</span><span class="o">&lt;</span><span class="n">DataTime</span> <span class="n">instance</span><span class="p">:</span> <span class="mi">2023</span><span class="o">-</span><span class="mi">07</span><span class="o">-</span><span class="mi">25</span> <span class="mi">12</span><span class="p">:</span><span class="mi">00</span><span class="p">:</span><span class="mi">00</span> <span class="o">&gt;</span><span class="p">]</span>
</pre></div>
</div>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">p</span><span class="p">,</span><span class="n">t</span><span class="p">,</span><span class="n">d</span><span class="p">,</span><span class="n">u</span><span class="p">,</span><span class="n">v</span> <span class="o">=</span> <span class="p">[],[],[],[],[]</span>
<span class="n">use_parms</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;T&#39;</span><span class="p">,</span><span class="s1">&#39;DpT&#39;</span><span class="p">,</span><span class="s1">&#39;uW&#39;</span><span class="p">,</span><span class="s1">&#39;vW&#39;</span><span class="p">,</span><span class="s1">&#39;P&#39;</span><span class="p">]</span>
<span class="n">use_level</span> <span class="o">=</span> <span class="s2">&quot;0.0FHAG&quot;</span>
<span class="n">sndObject</span> <span class="o">=</span> <span class="n">ModelSounding</span><span class="o">.</span><span class="n">getSounding</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">use_parms</span><span class="p">,</span>
<span class="p">[</span><span class="s2">&quot;0.0FHAG&quot;</span><span class="p">],</span> <span class="n">point</span><span class="p">,</span> <span class="n">timeRange</span><span class="o">=</span><span class="p">[</span><span class="n">fcstRun</span><span class="p">[</span><span class="mi">0</span><span class="p">]])</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">sndObject</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">for</span> <span class="n">time</span> <span class="ow">in</span> <span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">:</span>
<span class="n">p</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">[</span><span class="n">time</span><span class="p">][</span><span class="n">use_level</span><span class="p">][</span><span class="s1">&#39;P&#39;</span><span class="p">]))</span>
<span class="n">t</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">[</span><span class="n">time</span><span class="p">][</span><span class="n">use_level</span><span class="p">][</span><span class="s1">&#39;T&#39;</span><span class="p">]))</span>
<span class="n">d</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">[</span><span class="n">time</span><span class="p">][</span><span class="n">use_level</span><span class="p">][</span><span class="s1">&#39;DpT&#39;</span><span class="p">]))</span>
<span class="n">u</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">[</span><span class="n">time</span><span class="p">][</span><span class="n">use_level</span><span class="p">][</span><span class="s1">&#39;uW&#39;</span><span class="p">]))</span>
<span class="n">v</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">[</span><span class="n">time</span><span class="p">][</span><span class="n">use_level</span><span class="p">][</span><span class="s1">&#39;vW&#39;</span><span class="p">]))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Found surface record at &quot;</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="si">%.1f</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="s2">&quot;MB&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;sndObject returned empty for query [&quot;</span>
<span class="o">+</span> <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">use_parms</span><span class="p">,</span> <span class="n">point</span><span class="p">,</span> <span class="n">use_level</span><span class="p">))</span> <span class="o">+</span><span class="s2">&quot;]&quot;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Found</span> <span class="n">surface</span> <span class="n">record</span> <span class="n">at</span> <span class="mf">830.1</span><span class="n">MB</span>
</pre></div>
</div>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># Get isobaric levels with our requested parameters</span>
<span class="n">levelReq</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">newDataRequest</span><span class="p">(</span><span class="s2">&quot;grid&quot;</span><span class="p">,</span> <span class="n">envelope</span><span class="o">=</span><span class="n">point</span><span class="p">)</span>
<span class="n">levelReq</span><span class="o">.</span><span class="n">setLocationNames</span><span class="p">(</span><span class="n">model</span><span class="p">)</span>
<span class="n">levelReq</span><span class="o">.</span><span class="n">setParameters</span><span class="p">(</span><span class="s1">&#39;T&#39;</span><span class="p">,</span><span class="s1">&#39;DpT&#39;</span><span class="p">,</span><span class="s1">&#39;uW&#39;</span><span class="p">,</span><span class="s1">&#39;vW&#39;</span><span class="p">)</span>
<span class="n">availableLevels</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">getAvailableLevels</span><span class="p">(</span><span class="n">levelReq</span><span class="p">)</span>
<span class="c1"># Clean levels list of unit string (MB, FHAG, etc.)</span>
<span class="n">levels</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">lvl</span> <span class="ow">in</span> <span class="n">availableLevels</span><span class="p">:</span>
<span class="n">name</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">lvl</span><span class="p">)</span>
<span class="k">if</span> <span class="s1">&#39;MB&#39;</span> <span class="ow">in</span> <span class="n">name</span> <span class="ow">and</span> <span class="s1">&#39;_&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">name</span><span class="p">:</span>
<span class="c1"># If this level is above (less than in mb) our 0.0FHAG record</span>
<span class="k">if</span> <span class="nb">float</span><span class="p">(</span><span class="n">name</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;MB&#39;</span><span class="p">,</span><span class="s1">&#39;&#39;</span><span class="p">))</span> <span class="o">&lt;</span> <span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]:</span>
<span class="n">levels</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">lvl</span><span class="p">)</span>
<span class="c1"># Get Sounding</span>
<span class="n">sndObject</span> <span class="o">=</span> <span class="n">ModelSounding</span><span class="o">.</span><span class="n">getSounding</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">parms</span><span class="p">,</span> <span class="n">levels</span><span class="p">,</span> <span class="n">point</span><span class="p">,</span>
<span class="n">timeRange</span><span class="o">=</span><span class="p">[</span><span class="n">fcstRun</span><span class="p">[</span><span class="mi">0</span><span class="p">]])</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">len</span><span class="p">(</span><span class="n">sndObject</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;sndObject returned empty for query [&quot;</span>
<span class="o">+</span> <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">parms</span><span class="p">,</span> <span class="n">point</span><span class="p">,</span> <span class="n">levels</span><span class="p">))</span> <span class="o">+</span><span class="s2">&quot;]&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">time</span> <span class="ow">in</span> <span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">:</span>
<span class="k">for</span> <span class="n">lvl</span> <span class="ow">in</span> <span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">[</span><span class="n">time</span><span class="p">]</span><span class="o">.</span><span class="n">levels</span><span class="p">():</span>
<span class="k">for</span> <span class="n">parm</span> <span class="ow">in</span> <span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">[</span><span class="n">time</span><span class="p">][</span><span class="n">lvl</span><span class="p">]</span><span class="o">.</span><span class="n">parameters</span><span class="p">():</span>
<span class="k">if</span> <span class="n">parm</span> <span class="o">==</span> <span class="s2">&quot;T&quot;</span><span class="p">:</span>
<span class="n">t</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">[</span><span class="n">time</span><span class="p">][</span><span class="n">lvl</span><span class="p">][</span><span class="n">parm</span><span class="p">]))</span>
<span class="k">elif</span> <span class="n">parm</span> <span class="o">==</span> <span class="s2">&quot;DpT&quot;</span><span class="p">:</span>
<span class="n">d</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">[</span><span class="n">time</span><span class="p">][</span><span class="n">lvl</span><span class="p">][</span><span class="n">parm</span><span class="p">]))</span>
<span class="k">elif</span> <span class="n">parm</span> <span class="o">==</span> <span class="s1">&#39;uW&#39;</span><span class="p">:</span>
<span class="n">u</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">[</span><span class="n">time</span><span class="p">][</span><span class="n">lvl</span><span class="p">][</span><span class="n">parm</span><span class="p">]))</span>
<span class="k">elif</span> <span class="n">parm</span> <span class="o">==</span> <span class="s1">&#39;vW&#39;</span><span class="p">:</span>
<span class="n">v</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">[</span><span class="n">time</span><span class="p">][</span><span class="n">lvl</span><span class="p">][</span><span class="n">parm</span><span class="p">]))</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;WHAT IS THIS&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">[</span><span class="n">time</span><span class="p">][</span><span class="n">lvl</span><span class="p">][</span><span class="n">parm</span><span class="p">])</span>
<span class="c1"># Pressure is our requested level rather than a returned parameter</span>
<span class="n">p</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">lvl</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;MB&#39;</span><span class="p">,</span><span class="s1">&#39;&#39;</span><span class="p">)))</span>
<span class="c1"># convert to numpy.array()</span>
<span class="n">p</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span>
<span class="n">t</span> <span class="o">=</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span> <span class="o">-</span> <span class="mf">273.15</span><span class="p">)</span> <span class="o">*</span> <span class="n">units</span><span class="o">.</span><span class="n">degC</span>
<span class="n">d</span> <span class="o">=</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span> <span class="o">-</span> <span class="mf">273.15</span><span class="p">)</span> <span class="o">*</span> <span class="n">units</span><span class="o">.</span><span class="n">degC</span>
<span class="n">u</span> <span class="o">=</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">u</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span> <span class="o">*</span> <span class="n">units</span><span class="p">(</span><span class="s1">&#39;m/s&#39;</span><span class="p">))</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="s1">&#39;knots&#39;</span><span class="p">)</span>
<span class="n">v</span> <span class="o">=</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span> <span class="o">*</span> <span class="n">units</span><span class="p">(</span><span class="s1">&#39;m/s&#39;</span><span class="p">))</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="s1">&#39;knots&#39;</span><span class="p">)</span>
<span class="n">w</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">u</span><span class="o">**</span><span class="mi">2</span> <span class="o">+</span> <span class="n">v</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Using &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">levels</span><span class="p">))</span> <span class="o">+</span> <span class="s2">&quot; levels between &quot;</span> <span class="o">+</span>
<span class="nb">str</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%.1f</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="nb">max</span><span class="p">(</span><span class="n">p</span><span class="p">))</span> <span class="o">+</span> <span class="s2">&quot; and &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%.1f</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="nb">min</span><span class="p">(</span><span class="n">p</span><span class="p">))</span> <span class="o">+</span> <span class="s2">&quot;MB&quot;</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Using</span> <span class="mi">32</span> <span class="n">levels</span> <span class="n">between</span> <span class="mf">830.1</span> <span class="ow">and</span> <span class="mf">50.0</span><span class="n">MB</span>
</pre></div>
</div>
<hr class="docutils" />
<section id="skew-t-log-p">
<h2>Skew-T/Log-P<a class="headerlink" href="#skew-t-log-p" title="Permalink to this heading"></a></h2>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">plt</span><span class="o">.</span><span class="n">rcParams</span><span class="p">[</span><span class="s1">&#39;figure.figsize&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="mi">12</span><span class="p">,</span> <span class="mi">14</span><span class="p">)</span>
<span class="c1"># Skew-T</span>
<span class="n">skew</span> <span class="o">=</span> <span class="n">SkewT</span><span class="p">(</span><span class="n">rotation</span><span class="o">=</span><span class="mi">45</span><span class="p">)</span>
<span class="n">skew</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">t</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">,</span> <span class="n">linewidth</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="n">skew</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">d</span><span class="p">,</span> <span class="s1">&#39;g&#39;</span><span class="p">,</span> <span class="n">linewidth</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="n">skew</span><span class="o">.</span><span class="n">plot_barbs</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
<span class="n">skew</span><span class="o">.</span><span class="n">plot_dry_adiabats</span><span class="p">()</span>
<span class="n">skew</span><span class="o">.</span><span class="n">plot_moist_adiabats</span><span class="p">()</span>
<span class="n">skew</span><span class="o">.</span><span class="n">plot_mixing_lines</span><span class="p">(</span><span class="n">linestyle</span><span class="o">=</span><span class="s1">&#39;:&#39;</span><span class="p">)</span>
<span class="n">skew</span><span class="o">.</span><span class="n">ax</span><span class="o">.</span><span class="n">set_ylim</span><span class="p">(</span><span class="mi">1000</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">min</span><span class="p">(</span><span class="n">p</span><span class="p">))</span>
<span class="n">skew</span><span class="o">.</span><span class="n">ax</span><span class="o">.</span><span class="n">set_xlim</span><span class="p">(</span><span class="o">-</span><span class="mi">50</span><span class="p">,</span> <span class="mi">40</span><span class="p">)</span>
<span class="c1"># Title</span>
<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span> <span class="n">model</span> <span class="o">+</span> <span class="s2">&quot; (&quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">point</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;) &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">getRefTime</span><span class="p">()))</span>
<span class="c1"># Hodograph</span>
<span class="n">ax_hod</span> <span class="o">=</span> <span class="n">inset_axes</span><span class="p">(</span><span class="n">skew</span><span class="o">.</span><span class="n">ax</span><span class="p">,</span> <span class="s1">&#39;40%&#39;</span><span class="p">,</span> <span class="s1">&#39;40%&#39;</span><span class="p">,</span> <span class="n">loc</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="n">h</span> <span class="o">=</span> <span class="n">Hodograph</span><span class="p">(</span><span class="n">ax_hod</span><span class="p">,</span> <span class="n">component_range</span><span class="o">=</span><span class="nb">max</span><span class="p">(</span><span class="n">w</span><span class="o">.</span><span class="n">magnitude</span><span class="p">))</span>
<span class="n">h</span><span class="o">.</span><span class="n">add_grid</span><span class="p">(</span><span class="n">increment</span><span class="o">=</span><span class="mi">20</span><span class="p">)</span>
<span class="n">h</span><span class="o">.</span><span class="n">plot_colormapped</span><span class="p">(</span><span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">w</span><span class="p">)</span>
<span class="c1"># Dotted line at 0C isotherm</span>
<span class="n">l</span> <span class="o">=</span> <span class="n">skew</span><span class="o">.</span><span class="n">ax</span><span class="o">.</span><span class="n">axvline</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s1">&#39;c&#39;</span><span class="p">,</span> <span class="n">linestyle</span><span class="o">=</span><span class="s1">&#39;-&#39;</span><span class="p">,</span> <span class="n">linewidth</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
<img alt="../../_images/Forecast_Model_Vertical_Sounding_5_0.png" src="../../_images/Forecast_Model_Vertical_Sounding_5_0.png" />
<p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Forecast_Model_Vertical_Sounding.html">Top</a></p>
</section>
<section id="model-sounding-comparison">
<h2>Model Sounding Comparison<a class="headerlink" href="#model-sounding-comparison" title="Permalink to this heading"></a></h2>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">models</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;RAP13&quot;</span><span class="p">,</span> <span class="s2">&quot;GFS20&quot;</span><span class="p">,</span> <span class="s2">&quot;NAM40&quot;</span><span class="p">]</span>
<span class="n">parms</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;T&#39;</span><span class="p">,</span><span class="s1">&#39;DpT&#39;</span><span class="p">,</span><span class="s1">&#39;uW&#39;</span><span class="p">,</span><span class="s1">&#39;vW&#39;</span><span class="p">]</span>
<hr class="docutils" />
<section id="function-get-surface-data">
<h3>4 Function: get_surface_data()<a class="headerlink" href="#function-get-surface-data" title="Permalink to this heading"></a></h3>
<p>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
<a class="reference external" href="http://unidata.github.io/python-awips/api/ModelSounding.html">ModelSounding</a>
data object from python-awips to retrieve all the relevant information.</p>
<p>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.</p>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">get_surface_data</span><span class="p">(</span><span class="n">modelName</span><span class="p">,</span> <span class="n">location</span><span class="p">,</span> <span class="n">time</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot; model name, location, and timeRange desire &quot;&quot;&quot;</span>
<span class="k">for</span> <span class="n">modelName</span> <span class="ow">in</span> <span class="n">models</span><span class="p">:</span>
<span class="n">timeReq</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">newDataRequest</span><span class="p">(</span><span class="s2">&quot;grid&quot;</span><span class="p">)</span>
<span class="n">timeReq</span><span class="o">.</span><span class="n">setLocationNames</span><span class="p">(</span><span class="n">modelName</span><span class="p">)</span>
<span class="n">cycles</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">getAvailableTimes</span><span class="p">(</span><span class="n">timeReq</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
<span class="n">times</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">getAvailableTimes</span><span class="p">(</span><span class="n">timeReq</span><span class="p">)</span>
<span class="n">fcstRun</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">getForecastRun</span><span class="p">(</span><span class="n">cycles</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">times</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Using &quot;</span> <span class="o">+</span> <span class="n">modelName</span> <span class="o">+</span> <span class="s2">&quot; forecast time &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">fcstRun</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span>
<span class="n">p</span><span class="p">,</span><span class="n">t</span><span class="p">,</span><span class="n">d</span><span class="p">,</span><span class="n">u</span><span class="p">,</span><span class="n">v</span> <span class="o">=</span> <span class="p">[],[],[],[],[]</span>
<span class="c1"># request data and sort response</span>
<span class="n">pressure</span><span class="p">,</span><span class="n">temp</span><span class="p">,</span><span class="n">dpt</span><span class="p">,</span><span class="n">ucomp</span><span class="p">,</span><span class="n">vcomp</span> <span class="o">=</span> <span class="p">[],[],[],[],[]</span>
<span class="n">use_parms</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;T&#39;</span><span class="p">,</span><span class="s1">&#39;DpT&#39;</span><span class="p">,</span><span class="s1">&#39;uW&#39;</span><span class="p">,</span><span class="s1">&#39;vW&#39;</span><span class="p">,</span><span class="s1">&#39;P&#39;</span><span class="p">]</span>
<span class="n">use_level</span> <span class="o">=</span> <span class="s2">&quot;0.0FHAG&quot;</span>
<span class="n">sndObject</span> <span class="o">=</span> <span class="n">ModelSounding</span><span class="o">.</span><span class="n">getSounding</span><span class="p">(</span><span class="n">modelName</span><span class="p">,</span> <span class="n">use_parms</span><span class="p">,</span>
<span class="p">[</span><span class="n">use_level</span><span class="p">],</span> <span class="n">point</span><span class="p">,</span> <span class="n">timeRange</span><span class="o">=</span><span class="p">[</span><span class="n">fcstRun</span><span class="p">[</span><span class="mi">0</span><span class="p">]])</span>
<span class="n">sndObject</span> <span class="o">=</span> <span class="n">ModelSounding</span><span class="o">.</span><span class="n">getSounding</span><span class="p">(</span><span class="n">modelName</span><span class="p">,</span> <span class="n">use_parms</span><span class="p">,</span> <span class="p">[</span><span class="n">use_level</span><span class="p">],</span> <span class="n">location</span><span class="p">,</span> <span class="n">time</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">sndObject</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">for</span> <span class="n">time</span> <span class="ow">in</span> <span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">:</span>
<span class="n">p</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">[</span><span class="n">time</span><span class="p">][</span><span class="n">use_level</span><span class="p">][</span><span class="s1">&#39;P&#39;</span><span class="p">]))</span>
<span class="n">t</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">[</span><span class="n">time</span><span class="p">][</span><span class="n">use_level</span><span class="p">][</span><span class="s1">&#39;T&#39;</span><span class="p">]))</span>
<span class="n">d</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">[</span><span class="n">time</span><span class="p">][</span><span class="n">use_level</span><span class="p">][</span><span class="s1">&#39;DpT&#39;</span><span class="p">]))</span>
<span class="n">u</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">[</span><span class="n">time</span><span class="p">][</span><span class="n">use_level</span><span class="p">][</span><span class="s1">&#39;uW&#39;</span><span class="p">]))</span>
<span class="n">v</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">[</span><span class="n">time</span><span class="p">][</span><span class="n">use_level</span><span class="p">][</span><span class="s1">&#39;vW&#39;</span><span class="p">]))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Found surface record at &quot;</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="si">%.1f</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="s2">&quot;MB&quot;</span><span class="p">)</span>
<span class="n">pressure</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">[</span><span class="n">time</span><span class="p">][</span><span class="n">use_level</span><span class="p">][</span><span class="s1">&#39;P&#39;</span><span class="p">]))</span>
<span class="n">temp</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">[</span><span class="n">time</span><span class="p">][</span><span class="n">use_level</span><span class="p">][</span><span class="s1">&#39;T&#39;</span><span class="p">]))</span>
<span class="n">dpt</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">[</span><span class="n">time</span><span class="p">][</span><span class="n">use_level</span><span class="p">][</span><span class="s1">&#39;DpT&#39;</span><span class="p">]))</span>
<span class="n">ucomp</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">[</span><span class="n">time</span><span class="p">][</span><span class="n">use_level</span><span class="p">][</span><span class="s1">&#39;uW&#39;</span><span class="p">]))</span>
<span class="n">vcomp</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">[</span><span class="n">time</span><span class="p">][</span><span class="n">use_level</span><span class="p">][</span><span class="s1">&#39;vW&#39;</span><span class="p">]))</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Found surface record at &quot;</span> <span class="o">+</span> <span class="s2">&quot;</span><span class="si">%.1f</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="n">pressure</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">+</span> <span class="s2">&quot;MB&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;sndObject returned empty for query [&quot;</span>
<span class="o">+</span> <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="p">(</span><span class="n">modelName</span><span class="p">,</span> <span class="n">use_parms</span><span class="p">,</span> <span class="n">point</span><span class="p">,</span> <span class="n">use_level</span><span class="p">))</span> <span class="o">+</span><span class="s2">&quot;]&quot;</span><span class="p">)</span>
<span class="c1"># return information for plotting</span>
<span class="k">return</span> <span class="n">pressure</span><span class="p">,</span><span class="n">temp</span><span class="p">,</span><span class="n">dpt</span><span class="p">,</span><span class="n">ucomp</span><span class="p">,</span><span class="n">vcomp</span>
</pre></div>
</div>
<p>Top</p>
</section>
<hr class="docutils" />
<section id="function-get-levels-data">
<h3>5 Function: get_levels_data()<a class="headerlink" href="#function-get-levels-data" title="Permalink to this heading"></a></h3>
<p>This function is similar to <em>get_surface_data()</em>, except it gets data
values for presure heights above the surface. It uses the
<a class="reference external" href="http://unidata.github.io/python-awips/api/ModelSounding.html">ModelSounding</a>
data object from python-awips to retrieve all the relevant information.</p>
<p>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.</p>
<p>It returns the fully populated pressure, temperature, dewpoint,
u-component, v-component, and computed wind arrays.</p>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">get_levels_data</span><span class="p">(</span><span class="n">modelName</span><span class="p">,</span> <span class="n">location</span><span class="p">,</span> <span class="n">time</span><span class="p">,</span> <span class="n">pressure</span><span class="p">,</span> <span class="n">temp</span><span class="p">,</span> <span class="n">dpt</span><span class="p">,</span> <span class="n">ucomp</span><span class="p">,</span> <span class="n">vcomp</span><span class="p">):</span>
<span class="c1"># Get isobaric levels with our requested parameters</span>
<span class="n">parms</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;T&#39;</span><span class="p">,</span><span class="s1">&#39;DpT&#39;</span><span class="p">,</span><span class="s1">&#39;uW&#39;</span><span class="p">,</span><span class="s1">&#39;vW&#39;</span><span class="p">]</span>
<span class="n">levelReq</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">newDataRequest</span><span class="p">(</span><span class="s2">&quot;grid&quot;</span><span class="p">,</span> <span class="n">envelope</span><span class="o">=</span><span class="n">point</span><span class="p">)</span>
<span class="n">levelReq</span><span class="o">.</span><span class="n">setLocationNames</span><span class="p">(</span><span class="n">modelName</span><span class="p">)</span>
<span class="n">levelReq</span><span class="o">.</span><span class="n">setParameters</span><span class="p">(</span><span class="s1">&#39;T&#39;</span><span class="p">,</span><span class="s1">&#39;DpT&#39;</span><span class="p">,</span><span class="s1">&#39;uW&#39;</span><span class="p">,</span><span class="s1">&#39;vW&#39;</span><span class="p">)</span>
<span class="n">levelReq</span><span class="o">.</span><span class="n">setLocationNames</span><span class="p">(</span><span class="n">model</span><span class="p">)</span>
<span class="n">levelReq</span><span class="o">.</span><span class="n">setParameters</span><span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="n">parms</span><span class="p">))</span>
<span class="n">availableLevels</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">getAvailableLevels</span><span class="p">(</span><span class="n">levelReq</span><span class="p">)</span>
<span class="c1"># Clean levels list of unit string (MB, FHAG, etc.)</span>
<span class="n">levels</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">lvl</span> <span class="ow">in</span> <span class="n">availableLevels</span><span class="p">:</span>
<span class="n">name</span><span class="o">=</span><span class="nb">str</span><span class="p">(</span><span class="n">lvl</span><span class="p">)</span>
<span class="k">if</span> <span class="s1">&#39;MB&#39;</span> <span class="ow">in</span> <span class="n">name</span> <span class="ow">and</span> <span class="s1">&#39;_&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">name</span><span class="p">:</span>
<span class="c1"># If this level is above (less than in mb) our 0.0FHAG record</span>
<span class="k">if</span> <span class="nb">float</span><span class="p">(</span><span class="n">name</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;MB&#39;</span><span class="p">,</span><span class="s1">&#39;&#39;</span><span class="p">))</span> <span class="o">&lt;</span> <span class="n">p</span><span class="p">[</span><span class="mi">0</span><span class="p">]:</span>
<span class="k">if</span> <span class="nb">float</span><span class="p">(</span><span class="n">name</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;MB&#39;</span><span class="p">,</span><span class="s1">&#39;&#39;</span><span class="p">))</span> <span class="o">&lt;</span> <span class="n">pressure</span><span class="p">[</span><span class="mi">0</span><span class="p">]:</span>
<span class="n">levels</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">lvl</span><span class="p">)</span>
<span class="c1"># Get Sounding</span>
<span class="n">sndObject</span> <span class="o">=</span> <span class="n">ModelSounding</span><span class="o">.</span><span class="n">getSounding</span><span class="p">(</span><span class="n">modelName</span><span class="p">,</span> <span class="n">parms</span><span class="p">,</span> <span class="n">levels</span><span class="p">,</span> <span class="n">point</span><span class="p">,</span>
<span class="n">timeRange</span><span class="o">=</span><span class="p">[</span><span class="n">fcstRun</span><span class="p">[</span><span class="mi">0</span><span class="p">]])</span>
<span class="n">sndObject</span> <span class="o">=</span> <span class="n">ModelSounding</span><span class="o">.</span><span class="n">getSounding</span><span class="p">(</span><span class="n">modelName</span><span class="p">,</span> <span class="n">parms</span><span class="p">,</span> <span class="n">levels</span><span class="p">,</span> <span class="n">location</span><span class="p">,</span> <span class="n">time</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">len</span><span class="p">(</span><span class="n">sndObject</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;sndObject returned empty for query [&quot;</span>
<span class="o">+</span> <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="p">(</span><span class="n">modelName</span><span class="p">,</span> <span class="n">parms</span><span class="p">,</span> <span class="n">point</span><span class="p">,</span> <span class="n">levels</span><span class="p">))</span> <span class="o">+</span><span class="s2">&quot;]&quot;</span><span class="p">)</span>
<span class="o">+</span> <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">parms</span><span class="p">,</span> <span class="n">point</span><span class="p">,</span> <span class="n">levels</span><span class="p">))</span> <span class="o">+</span><span class="s2">&quot;]&quot;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">time</span> <span class="ow">in</span> <span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">:</span>
<span class="k">for</span> <span class="n">lvl</span> <span class="ow">in</span> <span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">[</span><span class="n">time</span><span class="p">]</span><span class="o">.</span><span class="n">levels</span><span class="p">():</span>
<span class="k">for</span> <span class="n">parm</span> <span class="ow">in</span> <span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">[</span><span class="n">time</span><span class="p">][</span><span class="n">lvl</span><span class="p">]</span><span class="o">.</span><span class="n">parameters</span><span class="p">():</span>
<span class="k">if</span> <span class="n">parm</span> <span class="o">==</span> <span class="s2">&quot;T&quot;</span><span class="p">:</span>
<span class="n">t</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">[</span><span class="n">time</span><span class="p">][</span><span class="n">lvl</span><span class="p">][</span><span class="n">parm</span><span class="p">]))</span>
<span class="n">temp</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">[</span><span class="n">time</span><span class="p">][</span><span class="n">lvl</span><span class="p">][</span><span class="n">parm</span><span class="p">]))</span>
<span class="k">elif</span> <span class="n">parm</span> <span class="o">==</span> <span class="s2">&quot;DpT&quot;</span><span class="p">:</span>
<span class="n">d</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">[</span><span class="n">time</span><span class="p">][</span><span class="n">lvl</span><span class="p">][</span><span class="n">parm</span><span class="p">]))</span>
<span class="n">dpt</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">[</span><span class="n">time</span><span class="p">][</span><span class="n">lvl</span><span class="p">][</span><span class="n">parm</span><span class="p">]))</span>
<span class="k">elif</span> <span class="n">parm</span> <span class="o">==</span> <span class="s1">&#39;uW&#39;</span><span class="p">:</span>
<span class="n">u</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">[</span><span class="n">time</span><span class="p">][</span><span class="n">lvl</span><span class="p">][</span><span class="n">parm</span><span class="p">]))</span>
<span class="n">ucomp</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">[</span><span class="n">time</span><span class="p">][</span><span class="n">lvl</span><span class="p">][</span><span class="n">parm</span><span class="p">]))</span>
<span class="k">elif</span> <span class="n">parm</span> <span class="o">==</span> <span class="s1">&#39;vW&#39;</span><span class="p">:</span>
<span class="n">v</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">[</span><span class="n">time</span><span class="p">][</span><span class="n">lvl</span><span class="p">][</span><span class="n">parm</span><span class="p">]))</span>
<span class="n">vcomp</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">[</span><span class="n">time</span><span class="p">][</span><span class="n">lvl</span><span class="p">][</span><span class="n">parm</span><span class="p">]))</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;WHAT IS THIS&quot;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">sndObject</span><span class="o">.</span><span class="n">_dataDict</span><span class="p">[</span><span class="n">time</span><span class="p">][</span><span class="n">lvl</span><span class="p">][</span><span class="n">parm</span><span class="p">])</span>
<span class="c1"># Pressure is our requested level rather than a returned parameter</span>
<span class="n">p</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">lvl</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;MB&#39;</span><span class="p">,</span><span class="s1">&#39;&#39;</span><span class="p">)))</span>
<span class="n">pressure</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">float</span><span class="p">(</span><span class="n">lvl</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;MB&#39;</span><span class="p">,</span><span class="s1">&#39;&#39;</span><span class="p">)))</span>
<span class="c1"># convert to numpy.array()</span>
<span class="n">p</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span>
<span class="n">t</span> <span class="o">=</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">t</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span> <span class="o">-</span> <span class="mf">273.15</span><span class="p">)</span> <span class="o">*</span> <span class="n">units</span><span class="o">.</span><span class="n">degC</span>
<span class="n">d</span> <span class="o">=</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span> <span class="o">-</span> <span class="mf">273.15</span><span class="p">)</span> <span class="o">*</span> <span class="n">units</span><span class="o">.</span><span class="n">degC</span>
<span class="n">u</span> <span class="o">=</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">u</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span> <span class="o">*</span> <span class="n">units</span><span class="p">(</span><span class="s1">&#39;m/s&#39;</span><span class="p">))</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="s1">&#39;knots&#39;</span><span class="p">)</span>
<span class="n">v</span> <span class="o">=</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span> <span class="o">*</span> <span class="n">units</span><span class="p">(</span><span class="s1">&#39;m/s&#39;</span><span class="p">))</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="s1">&#39;knots&#39;</span><span class="p">)</span>
<span class="n">w</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">u</span><span class="o">**</span><span class="mi">2</span> <span class="o">+</span> <span class="n">v</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span>
<span class="n">pressure</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">pressure</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span>
<span class="n">temp</span> <span class="o">=</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">temp</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span> <span class="o">-</span> <span class="mf">273.15</span><span class="p">)</span> <span class="o">*</span> <span class="n">units</span><span class="o">.</span><span class="n">degC</span>
<span class="n">dpt</span> <span class="o">=</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">dpt</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span> <span class="o">-</span> <span class="mf">273.15</span><span class="p">)</span> <span class="o">*</span> <span class="n">units</span><span class="o">.</span><span class="n">degC</span>
<span class="n">ucomp</span> <span class="o">=</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">ucomp</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span> <span class="o">*</span> <span class="n">units</span><span class="p">(</span><span class="s1">&#39;m/s&#39;</span><span class="p">))</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="s1">&#39;knots&#39;</span><span class="p">)</span>
<span class="n">vcomp</span> <span class="o">=</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">vcomp</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span> <span class="o">*</span> <span class="n">units</span><span class="p">(</span><span class="s1">&#39;m/s&#39;</span><span class="p">))</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="s1">&#39;knots&#39;</span><span class="p">)</span>
<span class="n">wind</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">sqrt</span><span class="p">(</span><span class="n">ucomp</span><span class="o">**</span><span class="mi">2</span> <span class="o">+</span> <span class="n">vcomp</span><span class="o">**</span><span class="mi">2</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Using &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">levels</span><span class="p">))</span> <span class="o">+</span> <span class="s2">&quot; levels between &quot;</span> <span class="o">+</span>
<span class="nb">str</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%.1f</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="nb">max</span><span class="p">(</span><span class="n">p</span><span class="p">))</span> <span class="o">+</span> <span class="s2">&quot; and &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%.1f</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="nb">min</span><span class="p">(</span><span class="n">p</span><span class="p">))</span> <span class="o">+</span> <span class="s2">&quot;MB&quot;</span><span class="p">)</span>
<span class="nb">str</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%.1f</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="nb">max</span><span class="p">(</span><span class="n">pressure</span><span class="p">))</span> <span class="o">+</span> <span class="s2">&quot; and &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="s2">&quot;</span><span class="si">%.1f</span><span class="s2">&quot;</span> <span class="o">%</span> <span class="nb">min</span><span class="p">(</span><span class="n">pressure</span><span class="p">))</span> <span class="o">+</span> <span class="s2">&quot;MB&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">pressure</span><span class="p">,</span><span class="n">temp</span><span class="p">,</span><span class="n">dpt</span><span class="p">,</span><span class="n">ucomp</span><span class="p">,</span><span class="n">vcomp</span><span class="p">,</span><span class="n">wind</span>
</pre></div>
</div>
<p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Forecast_Model_Vertical_Sounding.html">Top</a></p>
</section>
<hr class="docutils" />
<section id="function-plot-skewt">
<h3>6 Function: plot_skewT()<a class="headerlink" href="#function-plot-skewt" title="Permalink to this heading"></a></h3>
<p>Since were plotting many different models for comparison, all that code
was used to create this function.</p>
<p>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.</p>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">plot_skewT</span><span class="p">(</span><span class="n">modelName</span><span class="p">,</span> <span class="n">pressure</span><span class="p">,</span> <span class="n">temp</span><span class="p">,</span> <span class="n">dpt</span><span class="p">,</span> <span class="n">ucomp</span><span class="p">,</span> <span class="n">vcomp</span><span class="p">,</span> <span class="n">wind</span><span class="p">,</span> <span class="n">refTime</span><span class="p">):</span>
<span class="n">plt</span><span class="o">.</span><span class="n">rcParams</span><span class="p">[</span><span class="s1">&#39;figure.figsize&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="mi">12</span><span class="p">,</span> <span class="mi">14</span><span class="p">)</span>
<span class="c1"># Skew-T</span>
<span class="n">plt</span><span class="o">.</span><span class="n">rcParams</span><span class="p">[</span><span class="s1">&#39;figure.figsize&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="mi">12</span><span class="p">,</span> <span class="mi">14</span><span class="p">)</span>
<span class="n">skew</span> <span class="o">=</span> <span class="n">SkewT</span><span class="p">(</span><span class="n">rotation</span><span class="o">=</span><span class="mi">45</span><span class="p">)</span>
<span class="n">skew</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">t</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">,</span> <span class="n">linewidth</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="n">skew</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">d</span><span class="p">,</span> <span class="s1">&#39;g&#39;</span><span class="p">,</span> <span class="n">linewidth</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="n">skew</span><span class="o">.</span><span class="n">plot_barbs</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
<span class="n">skew</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">pressure</span><span class="p">,</span> <span class="n">temp</span><span class="p">,</span> <span class="s1">&#39;r&#39;</span><span class="p">,</span> <span class="n">linewidth</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="n">skew</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">pressure</span><span class="p">,</span> <span class="n">dpt</span><span class="p">,</span> <span class="s1">&#39;g&#39;</span><span class="p">,</span> <span class="n">linewidth</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="n">skew</span><span class="o">.</span><span class="n">plot_barbs</span><span class="p">(</span><span class="n">pressure</span><span class="p">,</span> <span class="n">ucomp</span><span class="p">,</span> <span class="n">vcomp</span><span class="p">)</span>
<span class="n">skew</span><span class="o">.</span><span class="n">plot_dry_adiabats</span><span class="p">()</span>
<span class="n">skew</span><span class="o">.</span><span class="n">plot_moist_adiabats</span><span class="p">()</span>
<span class="n">skew</span><span class="o">.</span><span class="n">plot_mixing_lines</span><span class="p">(</span><span class="n">linestyle</span><span class="o">=</span><span class="s1">&#39;:&#39;</span><span class="p">)</span>
<span class="n">skew</span><span class="o">.</span><span class="n">ax</span><span class="o">.</span><span class="n">set_ylim</span><span class="p">(</span><span class="mi">1000</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
<span class="n">skew</span><span class="o">.</span><span class="n">ax</span><span class="o">.</span><span class="n">set_ylim</span><span class="p">(</span><span class="mi">1000</span><span class="p">,</span> <span class="n">np</span><span class="o">.</span><span class="n">min</span><span class="p">(</span><span class="n">pressure</span><span class="p">))</span>
<span class="n">skew</span><span class="o">.</span><span class="n">ax</span><span class="o">.</span><span class="n">set_xlim</span><span class="p">(</span><span class="o">-</span><span class="mi">50</span><span class="p">,</span> <span class="mi">40</span><span class="p">)</span>
<span class="c1"># Title</span>
<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span> <span class="n">modelName</span> <span class="o">+</span> <span class="s2">&quot; (&quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">point</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;) &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">time</span><span class="o">.</span><span class="n">getRefTime</span><span class="p">()))</span>
<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="n">modelName</span> <span class="o">+</span> <span class="s2">&quot; (&quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">point</span><span class="p">)</span> <span class="o">+</span> <span class="s2">&quot;) &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">refTime</span><span class="p">))</span>
<span class="c1"># Hodograph</span>
<span class="n">ax_hod</span> <span class="o">=</span> <span class="n">inset_axes</span><span class="p">(</span><span class="n">skew</span><span class="o">.</span><span class="n">ax</span><span class="p">,</span> <span class="s1">&#39;40%&#39;</span><span class="p">,</span> <span class="s1">&#39;40%&#39;</span><span class="p">,</span> <span class="n">loc</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
<span class="n">h</span> <span class="o">=</span> <span class="n">Hodograph</span><span class="p">(</span><span class="n">ax_hod</span><span class="p">,</span> <span class="n">component_range</span><span class="o">=</span><span class="nb">max</span><span class="p">(</span><span class="n">w</span><span class="o">.</span><span class="n">magnitude</span><span class="p">))</span>
<span class="n">h</span> <span class="o">=</span> <span class="n">Hodograph</span><span class="p">(</span><span class="n">ax_hod</span><span class="p">,</span> <span class="n">component_range</span><span class="o">=</span><span class="nb">max</span><span class="p">(</span><span class="n">wind</span><span class="o">.</span><span class="n">magnitude</span><span class="p">))</span>
<span class="n">h</span><span class="o">.</span><span class="n">add_grid</span><span class="p">(</span><span class="n">increment</span><span class="o">=</span><span class="mi">20</span><span class="p">)</span>
<span class="n">h</span><span class="o">.</span><span class="n">plot_colormapped</span><span class="p">(</span><span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">w</span><span class="p">)</span>
<span class="n">h</span><span class="o">.</span><span class="n">plot_colormapped</span><span class="p">(</span><span class="n">ucomp</span><span class="p">,</span> <span class="n">vcomp</span><span class="p">,</span> <span class="n">wind</span><span class="p">)</span>
<span class="c1"># Dotted line at 0C isotherm</span>
<span class="n">l</span> <span class="o">=</span> <span class="n">skew</span><span class="o">.</span><span class="n">ax</span><span class="o">.</span><span class="n">axvline</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s1">&#39;c&#39;</span><span class="p">,</span> <span class="n">linestyle</span><span class="o">=</span><span class="s1">&#39;-&#39;</span><span class="p">,</span> <span class="n">linewidth</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Using</span> <span class="n">RAP13</span> <span class="n">forecast</span> <span class="n">time</span> <span class="mi">2023</span><span class="o">-</span><span class="mi">05</span><span class="o">-</span><span class="mi">17</span> <span class="mi">20</span><span class="p">:</span><span class="mi">00</span><span class="p">:</span><span class="mi">00</span>
<p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Forecast_Model_Vertical_Sounding.html">Top</a></p>
</section>
<hr class="docutils" />
<section id="retrieve-necessary-plotting-data">
<h3>7 Retrieve Necessary Plotting Data<a class="headerlink" href="#retrieve-necessary-plotting-data" title="Permalink to this heading"></a></h3>
<p>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. 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.</p>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">p</span><span class="p">,</span><span class="n">t</span><span class="p">,</span><span class="n">d</span><span class="p">,</span><span class="n">u</span><span class="p">,</span><span class="n">v</span> <span class="o">=</span> <span class="n">get_surface_data</span><span class="p">(</span><span class="n">model</span><span class="p">,</span><span class="n">point</span><span class="p">,</span><span class="n">timeRange</span><span class="p">)</span>
<span class="n">p</span><span class="p">,</span><span class="n">t</span><span class="p">,</span><span class="n">d</span><span class="p">,</span><span class="n">u</span><span class="p">,</span><span class="n">v</span><span class="p">,</span><span class="n">w</span> <span class="o">=</span> <span class="n">get_levels_data</span><span class="p">(</span><span class="n">model</span><span class="p">,</span><span class="n">point</span><span class="p">,</span><span class="n">timeRange</span><span class="p">,</span><span class="n">p</span><span class="p">,</span><span class="n">t</span><span class="p">,</span><span class="n">d</span><span class="p">,</span><span class="n">u</span><span class="p">,</span><span class="n">v</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Found</span> <span class="n">surface</span> <span class="n">record</span> <span class="n">at</span> <span class="mf">833.2</span><span class="n">MB</span>
<span class="n">Using</span> <span class="mi">32</span> <span class="n">levels</span> <span class="n">between</span> <span class="mf">833.2</span> <span class="ow">and</span> <span class="mf">50.0</span><span class="n">MB</span>
</pre></div>
</div>
<p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Forecast_Model_Vertical_Sounding.html">Top</a></p>
</section>
<hr class="docutils" />
<section id="skew-t-log-p">
<h3>8 Skew-T/Log-P<a class="headerlink" href="#skew-t-log-p" title="Permalink to this heading"></a></h3>
<p>Here we use our plot_skewT function to generate our skewT &amp; hodograph
charts for the data we retreived so far. This is where the pressure,
temperature, dewpoint, and wind data is needed.</p>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">plot_skewT</span><span class="p">(</span><span class="n">model</span><span class="p">,</span> <span class="n">p</span><span class="p">,</span> <span class="n">t</span><span class="p">,</span> <span class="n">d</span><span class="p">,</span> <span class="n">u</span><span class="p">,</span> <span class="n">v</span><span class="p">,</span> <span class="n">w</span><span class="p">,</span> <span class="n">timeRange</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</pre></div>
</div>
<img alt="../../_images/Forecast_Model_Vertical_Sounding_24_0.png" src="../../_images/Forecast_Model_Vertical_Sounding_24_0.png" />
<p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Forecast_Model_Vertical_Sounding.html">Top</a></p>
</section>
<hr class="docutils" />
<section id="model-sounding-comparison">
<h3>9 Model Sounding Comparison<a class="headerlink" href="#model-sounding-comparison" title="Permalink to this heading"></a></h3>
<p>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 well also plot RAP13 and GFS20 data to
compare with NAM40.</p>
<p>This is also where our functions become so important, because we can
easily recall all that logic and keep this for-loop fairly simple.</p>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">models</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;RAP13&quot;</span><span class="p">,</span> <span class="s2">&quot;GFS20&quot;</span><span class="p">,</span> <span class="s2">&quot;NAM40&quot;</span><span class="p">]</span>
<span class="k">for</span> <span class="n">modelName</span> <span class="ow">in</span> <span class="n">models</span><span class="p">:</span>
<span class="n">timeReq</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">newDataRequest</span><span class="p">(</span><span class="s2">&quot;grid&quot;</span><span class="p">)</span>
<span class="n">timeReq</span><span class="o">.</span><span class="n">setLocationNames</span><span class="p">(</span><span class="n">modelName</span><span class="p">)</span>
<span class="n">cycles</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">getAvailableTimes</span><span class="p">(</span><span class="n">timeReq</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
<span class="n">times</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">getAvailableTimes</span><span class="p">(</span><span class="n">timeReq</span><span class="p">)</span>
<span class="n">fr</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">getForecastRun</span><span class="p">(</span><span class="n">cycles</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">times</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Using &quot;</span> <span class="o">+</span> <span class="n">modelName</span> <span class="o">+</span> <span class="s2">&quot; forecast time &quot;</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">fr</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span>
<span class="n">tr</span> <span class="o">=</span> <span class="p">[</span><span class="n">fr</span><span class="p">[</span><span class="mi">0</span><span class="p">]]</span>
<span class="n">p</span><span class="p">,</span><span class="n">t</span><span class="p">,</span><span class="n">d</span><span class="p">,</span><span class="n">u</span><span class="p">,</span><span class="n">v</span> <span class="o">=</span> <span class="n">get_surface_data</span><span class="p">(</span><span class="n">modelName</span><span class="p">,</span><span class="n">point</span><span class="p">,</span><span class="n">tr</span><span class="p">)</span>
<span class="n">p</span><span class="p">,</span><span class="n">t</span><span class="p">,</span><span class="n">d</span><span class="p">,</span><span class="n">u</span><span class="p">,</span><span class="n">v</span><span class="p">,</span><span class="n">w</span> <span class="o">=</span> <span class="n">get_levels_data</span><span class="p">(</span><span class="n">modelName</span><span class="p">,</span><span class="n">point</span><span class="p">,</span><span class="n">tr</span><span class="p">,</span><span class="n">p</span><span class="p">,</span><span class="n">t</span><span class="p">,</span><span class="n">d</span><span class="p">,</span><span class="n">u</span><span class="p">,</span><span class="n">v</span><span class="p">)</span>
<span class="c1"># Skew-T</span>
<span class="n">plot_skewT</span><span class="p">(</span><span class="n">modelName</span><span class="p">,</span><span class="n">p</span><span class="p">,</span><span class="n">t</span><span class="p">,</span><span class="n">d</span><span class="p">,</span><span class="n">u</span><span class="p">,</span><span class="n">v</span><span class="p">,</span><span class="n">w</span><span class="p">,</span><span class="n">tr</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</pre></div>
</div>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Using</span> <span class="n">RAP13</span> <span class="n">forecast</span> <span class="n">time</span> <span class="mi">2023</span><span class="o">-</span><span class="mi">07</span><span class="o">-</span><span class="mi">25</span> <span class="mi">19</span><span class="p">:</span><span class="mi">00</span><span class="p">:</span><span class="mi">00</span>
<span class="n">Found</span> <span class="n">surface</span> <span class="n">record</span> <span class="n">at</span> <span class="mf">839.4</span><span class="n">MB</span>
<span class="n">Using</span> <span class="mi">32</span> <span class="n">levels</span> <span class="n">between</span> <span class="mf">839.4</span> <span class="ow">and</span> <span class="mf">100.0</span><span class="n">MB</span>
</pre></div>
</div>
<img alt="../../_images/Forecast_Model_Vertical_Sounding_27_1.png" src="../../_images/Forecast_Model_Vertical_Sounding_27_1.png" />
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Using</span> <span class="n">GFS20</span> <span class="n">forecast</span> <span class="n">time</span> <span class="mi">2023</span><span class="o">-</span><span class="mi">07</span><span class="o">-</span><span class="mi">25</span> <span class="mi">12</span><span class="p">:</span><span class="mi">00</span><span class="p">:</span><span class="mi">00</span>
<span class="n">Found</span> <span class="n">surface</span> <span class="n">record</span> <span class="n">at</span> <span class="mf">842.5</span><span class="n">MB</span>
<span class="n">Using</span> <span class="mi">32</span> <span class="n">levels</span> <span class="n">between</span> <span class="mf">842.5</span> <span class="ow">and</span> <span class="mf">100.0</span><span class="n">MB</span>
</pre></div>
</div>
<img alt="../../_images/Forecast_Model_Vertical_Sounding_27_3.png" src="../../_images/Forecast_Model_Vertical_Sounding_27_3.png" />
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Using</span> <span class="n">NAM40</span> <span class="n">forecast</span> <span class="n">time</span> <span class="mi">2023</span><span class="o">-</span><span class="mi">07</span><span class="o">-</span><span class="mi">25</span> <span class="mi">18</span><span class="p">:</span><span class="mi">00</span><span class="p">:</span><span class="mi">00</span>
<span class="n">Found</span> <span class="n">surface</span> <span class="n">record</span> <span class="n">at</span> <span class="mf">833.8</span><span class="n">MB</span>
<span class="n">Using</span> <span class="mi">30</span> <span class="n">levels</span> <span class="n">between</span> <span class="mf">833.8</span> <span class="ow">and</span> <span class="mf">100.0</span><span class="n">MB</span>
<span class="n">Using</span> <span class="mi">32</span> <span class="n">levels</span> <span class="n">between</span> <span class="mf">833.8</span> <span class="ow">and</span> <span class="mf">50.0</span><span class="n">MB</span>
</pre></div>
</div>
<img alt="../../_images/Forecast_Model_Vertical_Sounding_7_1.png" src="../../_images/Forecast_Model_Vertical_Sounding_7_1.png" />
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Using</span> <span class="n">GFS20</span> <span class="n">forecast</span> <span class="n">time</span> <span class="mi">2023</span><span class="o">-</span><span class="mi">05</span><span class="o">-</span><span class="mi">17</span> <span class="mi">12</span><span class="p">:</span><span class="mi">00</span><span class="p">:</span><span class="mi">00</span>
<span class="n">Found</span> <span class="n">surface</span> <span class="n">record</span> <span class="n">at</span> <span class="mf">839.9</span><span class="n">MB</span>
<span class="n">Using</span> <span class="mi">22</span> <span class="n">levels</span> <span class="n">between</span> <span class="mf">839.9</span> <span class="ow">and</span> <span class="mf">100.0</span><span class="n">MB</span>
</pre></div>
</div>
<img alt="../../_images/Forecast_Model_Vertical_Sounding_7_3.png" src="../../_images/Forecast_Model_Vertical_Sounding_7_3.png" />
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Using</span> <span class="n">NAM40</span> <span class="n">forecast</span> <span class="n">time</span> <span class="mi">2023</span><span class="o">-</span><span class="mi">05</span><span class="o">-</span><span class="mi">17</span> <span class="mi">18</span><span class="p">:</span><span class="mi">00</span><span class="p">:</span><span class="mi">00</span>
<span class="n">Found</span> <span class="n">surface</span> <span class="n">record</span> <span class="n">at</span> <span class="mf">829.4</span><span class="n">MB</span>
<span class="n">Using</span> <span class="mi">32</span> <span class="n">levels</span> <span class="n">between</span> <span class="mf">829.4</span> <span class="ow">and</span> <span class="mf">50.0</span><span class="n">MB</span>
</pre></div>
</div>
<img alt="../../_images/Forecast_Model_Vertical_Sounding_7_5.png" src="../../_images/Forecast_Model_Vertical_Sounding_7_5.png" />
<img alt="../../_images/Forecast_Model_Vertical_Sounding_27_5.png" src="../../_images/Forecast_Model_Vertical_Sounding_27_5.png" />
<p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Forecast_Model_Vertical_Sounding.html">Top</a></p>
</section>
<hr class="docutils" />
<section id="see-also">
<h3>10 See Also<a class="headerlink" href="#see-also" title="Permalink to this heading"></a></h3>
<section id="related-notebooks">
<h4>10.1 Related Notebooks<a class="headerlink" href="#related-notebooks" title="Permalink to this heading"></a></h4>
<ul class="simple">
<li><p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Grid_Levels_and_Parameters.html">Grid Levels and
Parameters</a></p></li>
<li><p><a class="reference external" href="http://unidata.github.io/python-awips/examples/generated/Upper_Air_BUFR_Soundings.html">Upper Air BUFR
Soundings</a></p></li>
<li><p><a class="reference external" href="http://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html">Model Sounding
Data</a></p></li>
</ul>
</section>
<section id="additional-documentation">
<h4>10.2 Additional Documentation<a class="headerlink" href="#additional-documentation" title="Permalink to this heading"></a></h4>
<p><strong>python-awips:</strong></p>
<ul class="simple">
<li><p><a class="reference external" href="http://unidata.github.io/python-awips/api/DataAccessLayer.html">awips.DataAccessLayer</a></p></li>
<li><p><a class="reference external" href="https://unidata.github.io/python-awips/api/ModelSounding.html">awips.ModelSounding</a></p></li>
</ul>
<p><strong>matplotlib:</strong></p>
<ul class="simple">
<li><p><a class="reference external" href="https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.html">matplotlib.pyplot</a></p></li>
</ul>
<p><strong>MetPy</strong></p>
<ul class="simple">
<li><p><a class="reference external" href="https://unidata.github.io/MetPy/latest/api/generated/metpy.calc.wind_speed.html">metpy.wind_speed</a></p></li>
<li><p><a class="reference external" href="https://unidata.github.io/MetPy/latest/api/generated/metpy.calc.wind_direction.html">metpy.wind_direction</a></p></li>
<li><p><a class="reference external" href="https://unidata.github.io/MetPy/latest/api/generated/metpy.calc.vapor_pressure.html">metpy.vapor_pressure</a></p></li>
<li><p><a class="reference external" href="https://unidata.github.io/MetPy/latest/api/generated/metpy.calc.dewpoint.html">metpy.dewpoint</a></p></li>
<li><p><a class="reference external" href="https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.SkewT.html">metpy.skewt</a></p></li>
<li><p><a class="reference external" href="https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.Hodograph.html">metpy.hodograph</a></p></li>
</ul>
<p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Forecast_Model_Vertical_Sounding.html">Top</a></p>
<hr class="docutils" />
</section>
</section>
</section>
</section>

Binary file not shown.

File diff suppressed because one or more lines are too long