deploy: e13726cf63
BIN
_images/Forecast_Model_Vertical_Sounding_24_0.png
Normal file
After Width: | Height: | Size: 182 KiB |
BIN
_images/Forecast_Model_Vertical_Sounding_27_1.png
Normal file
After Width: | Height: | Size: 160 KiB |
BIN
_images/Forecast_Model_Vertical_Sounding_27_3.png
Normal file
After Width: | Height: | Size: 158 KiB |
BIN
_images/Forecast_Model_Vertical_Sounding_27_5.png
Normal file
After Width: | Height: | Size: 182 KiB |
Before Width: | Height: | Size: 182 KiB |
Before Width: | Height: | Size: 162 KiB |
Before Width: | Height: | Size: 159 KiB |
Before Width: | Height: | Size: 161 KiB |
|
@ -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 Unidata’s 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 we’re 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 we’ll 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>`__
|
||||
|
||||
--------------
|
||||
|
|
|
@ -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">"0.0FHAG"</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">"NAM40"</span>
|
||||
<span class="n">parms</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'T'</span><span class="p">,</span><span class="s1">'DpT'</span><span class="p">,</span><span class="s1">'uW'</span><span class="p">,</span><span class="s1">'vW'</span><span class="p">]</span>
|
||||
<span class="n">server</span> <span class="o">=</span> <span class="s1">'edex-cloud.unidata.ucar.edu'</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 Unidata’s 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">'edex-cloud.unidata.ucar.edu'</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">"NAM40"</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">"grid"</span><span class="p">)</span>
|
||||
|
@ -150,37 +184,73 @@ 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">"Using "</span> <span class="o">+</span> <span class="n">model</span> <span class="o">+</span> <span class="s2">" forecast time "</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">"Using "</span> <span class="o">+</span> <span class="n">model</span> <span class="o">+</span> <span class="s2">" forecast time "</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"><</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">></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>
|
||||
<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-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">""" model name, location, and timeRange desire """</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">'T'</span><span class="p">,</span><span class="s1">'DpT'</span><span class="p">,</span><span class="s1">'uW'</span><span class="p">,</span><span class="s1">'vW'</span><span class="p">,</span><span class="s1">'P'</span><span class="p">]</span>
|
||||
<span class="n">use_level</span> <span class="o">=</span> <span class="s2">"0.0FHAG"</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">"0.0FHAG"</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">></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">'P'</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">'T'</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">'DpT'</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">'uW'</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">'vW'</span><span class="p">]))</span>
|
||||
<span class="nb">print</span><span class="p">(</span><span class="s2">"Found surface record at "</span> <span class="o">+</span> <span class="s2">"</span><span class="si">%.1f</span><span class="s2">"</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">"MB"</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">'P'</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">'T'</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">'DpT'</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">'uW'</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">'vW'</span><span class="p">]))</span>
|
||||
<span class="nb">print</span><span class="p">(</span><span class="s2">"Found surface record at "</span> <span class="o">+</span> <span class="s2">"</span><span class="si">%.1f</span><span class="s2">"</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">"MB"</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">"sndObject returned empty for query ["</span>
|
||||
<span class="o">+</span> <span class="s1">', '</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">"]"</span><span class="p">)</span>
|
||||
<span class="o">+</span> <span class="s1">', '</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">"]"</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>
|
||||
<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>
|
||||
<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">'T'</span><span class="p">,</span><span class="s1">'DpT'</span><span class="p">,</span><span class="s1">'uW'</span><span class="p">,</span><span class="s1">'vW'</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">"grid"</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">'T'</span><span class="p">,</span><span class="s1">'DpT'</span><span class="p">,</span><span class="s1">'uW'</span><span class="p">,</span><span class="s1">'vW'</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>
|
||||
|
@ -189,12 +259,11 @@ are returned as Kelvin and wind components as m/s.</p></li>
|
|||
<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">'MB'</span> <span class="ow">in</span> <span class="n">name</span> <span class="ow">and</span> <span class="s1">'_'</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">'MB'</span><span class="p">,</span><span class="s1">''</span><span class="p">))</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="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">'MB'</span><span class="p">,</span><span class="s1">''</span><span class="p">))</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="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="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">></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">"sndObject returned empty for query ["</span>
|
||||
|
@ -204,59 +273,65 @@ are returned as Kelvin and wind components as m/s.</p></li>
|
|||
<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">"T"</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">"DpT"</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">'uW'</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">'vW'</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">"WHAT IS THIS"</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">'MB'</span><span class="p">,</span><span class="s1">''</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">'MB'</span><span class="p">,</span><span class="s1">''</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">'m/s'</span><span class="p">))</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="s1">'knots'</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">'m/s'</span><span class="p">))</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="s1">'knots'</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">'m/s'</span><span class="p">))</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="s1">'knots'</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">'m/s'</span><span class="p">))</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="s1">'knots'</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">"Using "</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">" levels between "</span> <span class="o">+</span>
|
||||
<span class="nb">str</span><span class="p">(</span><span class="s2">"</span><span class="si">%.1f</span><span class="s2">"</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">" and "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="s2">"</span><span class="si">%.1f</span><span class="s2">"</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">"MB"</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>
|
||||
<span class="nb">str</span><span class="p">(</span><span class="s2">"</span><span class="si">%.1f</span><span class="s2">"</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">" and "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="s2">"</span><span class="si">%.1f</span><span class="s2">"</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">"MB"</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="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">'figure.figsize'</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>
|
||||
<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 we’re 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">'figure.figsize'</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">'r'</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">'g'</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">'r'</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">'g'</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">':'</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_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">model</span> <span class="o">+</span> <span class="s2">" ("</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">") "</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">" ("</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">") "</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">'40%'</span><span class="p">,</span> <span class="s1">'40%'</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">'c'</span><span class="p">,</span> <span class="n">linestyle</span><span class="o">=</span><span class="s1">'-'</span><span class="p">,</span> <span class="n">linewidth</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
|
||||
|
@ -264,128 +339,125 @@ are returned as Kelvin and wind components as m/s.</p></li>
|
|||
<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>
|
||||
<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 & 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">
|
||||
<h2>Model Sounding Comparison<a class="headerlink" href="#model-sounding-comparison" title="Permalink to this heading"></a></h2>
|
||||
<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 we’ll 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">"RAP13"</span><span class="p">,</span> <span class="s2">"GFS20"</span><span class="p">,</span> <span class="s2">"NAM40"</span><span class="p">]</span>
|
||||
<span class="n">parms</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'T'</span><span class="p">,</span><span class="s1">'DpT'</span><span class="p">,</span><span class="s1">'uW'</span><span class="p">,</span><span class="s1">'vW'</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">"grid"</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">"Using "</span> <span class="o">+</span> <span class="n">modelName</span> <span class="o">+</span> <span class="s2">" forecast time "</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">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">"Using "</span> <span class="o">+</span> <span class="n">modelName</span> <span class="o">+</span> <span class="s2">" forecast time "</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="p">[],[],[],[],[]</span>
|
||||
<span class="n">use_parms</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'T'</span><span class="p">,</span><span class="s1">'DpT'</span><span class="p">,</span><span class="s1">'uW'</span><span class="p">,</span><span class="s1">'vW'</span><span class="p">,</span><span class="s1">'P'</span><span class="p">]</span>
|
||||
<span class="n">use_level</span> <span class="o">=</span> <span class="s2">"0.0FHAG"</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="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">sndObject</span><span class="p">)</span> <span class="o">></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">'P'</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">'T'</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">'DpT'</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">'uW'</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">'vW'</span><span class="p">]))</span>
|
||||
<span class="nb">print</span><span class="p">(</span><span class="s2">"Found surface record at "</span> <span class="o">+</span> <span class="s2">"</span><span class="si">%.1f</span><span class="s2">"</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">"MB"</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">"sndObject returned empty for query ["</span>
|
||||
<span class="o">+</span> <span class="s1">', '</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">"]"</span><span class="p">)</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">"grid"</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">'T'</span><span class="p">,</span><span class="s1">'DpT'</span><span class="p">,</span><span class="s1">'uW'</span><span class="p">,</span><span class="s1">'vW'</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">'MB'</span> <span class="ow">in</span> <span class="n">name</span> <span class="ow">and</span> <span class="s1">'_'</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">'MB'</span><span class="p">,</span><span class="s1">''</span><span class="p">))</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="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="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">></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">"sndObject returned empty for query ["</span>
|
||||
<span class="o">+</span> <span class="s1">', '</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">"]"</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">"T"</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">"DpT"</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">'uW'</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">'vW'</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">"WHAT IS THIS"</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">'MB'</span><span class="p">,</span><span class="s1">''</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">'m/s'</span><span class="p">))</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="s1">'knots'</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">'m/s'</span><span class="p">))</span><span class="o">.</span><span class="n">to</span><span class="p">(</span><span class="s1">'knots'</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">"Using "</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">" levels between "</span> <span class="o">+</span>
|
||||
<span class="nb">str</span><span class="p">(</span><span class="s2">"</span><span class="si">%.1f</span><span class="s2">"</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">" and "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="s2">"</span><span class="si">%.1f</span><span class="s2">"</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">"MB"</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">plt</span><span class="o">.</span><span class="n">rcParams</span><span class="p">[</span><span class="s1">'figure.figsize'</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">'r'</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">'g'</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">':'</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_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">" ("</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">") "</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">'40%'</span><span class="p">,</span> <span class="s1">'40%'</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">'c'</span><span class="p">,</span> <span class="n">linestyle</span><span class="o">=</span><span class="s1">'-'</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>
|
||||
<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">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>
|
||||
<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>
|
||||
|
||||
|
|