mirror of
https://github.com/Unidata/python-awips.git
synced 2025-02-23 14:57:56 -05:00
deploy: df281efc06
This commit is contained in:
parent
5836029f97
commit
fe2fa2678e
9 changed files with 602 additions and 190 deletions
Binary file not shown.
Before Width: | Height: | Size: 114 KiB |
BIN
_images/Model_Sounding_Data_34_0.png
Normal file
BIN
_images/Model_Sounding_Data_34_0.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 117 KiB |
|
@ -2,34 +2,118 @@
|
|||
Model Sounding Data
|
||||
===================
|
||||
`Notebook <http://nbviewer.ipython.org/github/Unidata/python-awips/blob/master/examples/notebooks/Model_Sounding_Data.ipynb>`_
|
||||
The EDEX modelsounding plugin creates 64-level vertical profiles from
|
||||
GFS and ETA (NAM) BUFR products distirubted over NOAAport. Paramters
|
||||
which are requestable are **pressure**, **temperature**, **specHum**,
|
||||
**uComp**, **vComp**, **omega**, **cldCvr**.
|
||||
Python-AWIPS Tutorial Notebook
|
||||
|
||||
--------------
|
||||
|
||||
Objectives
|
||||
==========
|
||||
|
||||
- Use python-awips to connect to an edex server
|
||||
- Define and filter data request for model sounding data
|
||||
- Create vertical profiles from GFS BUFR products
|
||||
- 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
|
||||
|
||||
--------------
|
||||
|
||||
Table of Contents
|
||||
-----------------
|
||||
|
||||
| `1
|
||||
Imports <https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#imports>`__\
|
||||
| `2 EDEX
|
||||
Connection <https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#edex-connection>`__\
|
||||
| `3 Setting
|
||||
Location <https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#setting-location>`__\
|
||||
| `3.1 Available Location
|
||||
Names <https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#available-location-names>`__\
|
||||
| `3.2 Setting the Location
|
||||
Name <https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#setting-the-location-name>`__\
|
||||
| `4 Filtering by
|
||||
Time <https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#filtering-by-time>`__\
|
||||
| `5 Get the
|
||||
Data! <https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#get-the-data>`__\
|
||||
| `6 Use the
|
||||
Data! <https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#use-the-data>`__\
|
||||
| `6.1 Prepare the
|
||||
Data! <https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#prepare-the-data>`__\
|
||||
| `6.2 Calculate Dewpoint from Specific
|
||||
Humidity <https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#calculate-dewpoint-from-specific-humidity>`__\
|
||||
| `6.2.1 Method
|
||||
1 <https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#method-1>`__\
|
||||
| `6.2.2 Method
|
||||
2 <https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#method-2>`__\
|
||||
| `6.2.3 Method
|
||||
3 <https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#method-3>`__\
|
||||
| `7 Plot the
|
||||
Data! <https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#plot-the-data>`__\
|
||||
| `8 See
|
||||
Also <https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#see-also>`__\
|
||||
| `8.1 Related
|
||||
Notebooks <https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#related-notebooks>`__\
|
||||
| `8.2 Additional
|
||||
Documentation <https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#additional-documentation>`__\
|
||||
|
||||
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
|
||||
|
||||
from awips.dataaccess import DataAccessLayer
|
||||
import matplotlib.tri as mtri
|
||||
import matplotlib.pyplot as plt
|
||||
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
|
||||
from math import exp, log
|
||||
import numpy as np
|
||||
from metpy.calc import wind_components, lcl, dry_lapse, parcel_profile, dewpoint
|
||||
from metpy.calc import wind_speed, wind_direction, thermo, vapor_pressure
|
||||
from metpy.calc import dewpoint, vapor_pressure, wind_speed, wind_direction
|
||||
from metpy.plots import SkewT, Hodograph
|
||||
from metpy.units import units, concatenate
|
||||
import warnings
|
||||
warnings.filterwarnings("ignore",category =RuntimeWarning)
|
||||
|
||||
from metpy.units import units
|
||||
|
||||
`Top <https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html>`__
|
||||
|
||||
--------------
|
||||
|
||||
2 EDEX Connection
|
||||
-----------------
|
||||
|
||||
First we establish a connection to Unidata’s public EDEX server. With
|
||||
that connection made, we can create a `new data request
|
||||
object <http://unidata.github.io/python-awips/api/IDataRequest.html>`__
|
||||
and set the data type to **modelsounding**, and define additional
|
||||
parameters and an identifier on the request.
|
||||
|
||||
.. code:: ipython3
|
||||
|
||||
DataAccessLayer.changeEDEXHost("edex-cloud.unidata.ucar.edu")
|
||||
request = DataAccessLayer.newDataRequest("modelsounding")
|
||||
forecastModel = "GFS"
|
||||
request.addIdentifier("reportType", forecastModel)
|
||||
request.setParameters("pressure","temperature","specHum","uComp","vComp","omega","cldCvr")
|
||||
request.setParameters("pressure","temperature","specHum","uComp","vComp")
|
||||
|
||||
Available Locations
|
||||
-------------------
|
||||
`Top <https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html>`__
|
||||
|
||||
--------------
|
||||
|
||||
3 Setting Location
|
||||
------------------
|
||||
|
||||
3.1 Available Location Names
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
When working with a new data type, it is often useful to investigate all
|
||||
available options for a particular setting. Shown below is how to see
|
||||
all available location names for a data request with type
|
||||
``modelsounding`` and ``reportType`` identifier of ``GFS``. This step is
|
||||
not necessary if you already know exactly what the location name(s)
|
||||
you’re interested in is.
|
||||
|
||||
.. code:: ipython3
|
||||
|
||||
|
@ -1046,9 +1130,28 @@ Available Locations
|
|||
|
||||
|
||||
|
||||
3.2 Setting the Location Name
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
In this case we’re setting the location name to ``KFRM`` which is the
|
||||
Municipal Airport in Fairmont, Minnesota.
|
||||
|
||||
.. code:: ipython3
|
||||
|
||||
request.setLocationNames("KFRM")
|
||||
|
||||
`Top <https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html>`__
|
||||
|
||||
--------------
|
||||
|
||||
4 Filtering by Time
|
||||
-------------------
|
||||
|
||||
Models produce many different time variants during their runs, so let’s
|
||||
limit the data to the most recent time and forecast run.
|
||||
|
||||
.. code:: ipython3
|
||||
|
||||
cycles = DataAccessLayer.getAvailableTimes(request, True)
|
||||
times = DataAccessLayer.getAvailableTimes(request)
|
||||
|
||||
|
@ -1060,120 +1163,217 @@ Available Locations
|
|||
print('No times available')
|
||||
exit
|
||||
|
||||
Model Sounding Parameters
|
||||
-------------------------
|
||||
`Top <https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html>`__
|
||||
|
||||
Construct arrays for each parameter to plot (temperature, pressure,
|
||||
moisutre (spec. humidity), wind components, and cloud cover)
|
||||
--------------
|
||||
|
||||
5 Get the Data!
|
||||
---------------
|
||||
|
||||
Here we can now request our data response from the EDEX server with our
|
||||
defined time filter. Printing out some data about the response verifies
|
||||
we received the data we were interested in.
|
||||
|
||||
.. code:: ipython3
|
||||
|
||||
tmp,prs,sh = np.array([]),np.array([]),np.array([])
|
||||
uc,vc,om,cld = np.array([]),np.array([]),np.array([]),np.array([])
|
||||
obj = response[0]
|
||||
|
||||
for ob in response:
|
||||
tmp = np.append(tmp,ob.getNumber("temperature"))
|
||||
prs = np.append(prs,ob.getNumber("pressure"))
|
||||
sh = np.append(sh,ob.getNumber("specHum"))
|
||||
uc = np.append(uc,ob.getNumber("uComp"))
|
||||
vc = np.append(vc,ob.getNumber("vComp"))
|
||||
om = np.append(om,ob.getNumber("omega"))
|
||||
cld = np.append(cld,ob.getNumber("cldCvr"))
|
||||
|
||||
print("parms = " + str(ob.getParameters()))
|
||||
print("site = " + str(ob.getLocationName()))
|
||||
print("geom = " + str(ob.getGeometry()))
|
||||
print("datetime = " + str(ob.getDataTime()))
|
||||
print("reftime = " + str(ob.getDataTime().getRefTime()))
|
||||
print("fcstHour = " + str(ob.getDataTime().getFcstTime()))
|
||||
print("period = " + str(ob.getDataTime().getValidPeriod()))
|
||||
print("parms = " + str(obj.getParameters()))
|
||||
print("site = " + str(obj.getLocationName()))
|
||||
print("geom = " + str(obj.getGeometry()))
|
||||
print("datetime = " + str(obj.getDataTime()))
|
||||
print("reftime = " + str(obj.getDataTime().getRefTime()))
|
||||
print("fcstHour = " + str(obj.getDataTime().getFcstTime()))
|
||||
print("period = " + str(obj.getDataTime().getValidPeriod()))
|
||||
|
||||
|
||||
.. parsed-literal::
|
||||
|
||||
parms = ['temperature', 'pressure', 'vComp', 'uComp', 'cldCvr', 'specHum', 'omega']
|
||||
parms = ['temperature', 'pressure', 'vComp', 'uComp', 'specHum']
|
||||
site = KFRM
|
||||
geom = POINT (-94.41999816894531 43.65000152587891)
|
||||
datetime = 2020-09-04 12:00:00
|
||||
reftime = Sep 04 20 12:00:00 GMT
|
||||
datetime = 2022-08-19 12:00:00
|
||||
reftime = Aug 19 22 12:00:00 GMT
|
||||
fcstHour = 0
|
||||
period = (Sep 04 20 12:00:00 , Sep 04 20 12:00:00 )
|
||||
period = (Aug 19 22 12:00:00 , Aug 19 22 12:00:00 )
|
||||
|
||||
|
||||
Calculating Dewpoint from Specific Humidity
|
||||
-------------------------------------------
|
||||
`Top <https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html>`__
|
||||
|
||||
--------------
|
||||
|
||||
6 Use the Data!
|
||||
---------------
|
||||
|
||||
Since we filtered on time, and requested the data in the previous cell,
|
||||
we now have a ``response`` object we can work with.
|
||||
|
||||
6.2 Prepare data objects
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Here we construct arrays for each parameter to plot (temperature,
|
||||
pressure, moisture (spec. humidity), wind components, and cloud cover).
|
||||
We have two sets of arrays for temperature and pressure, where the
|
||||
second set only has values as long as the specific humidity is not zero.
|
||||
That is because we are going to do some calculations with specific
|
||||
humidity, temperature, and pressure and we need all those arrays to be
|
||||
the same length, and for the specific humidty to not equal zero.
|
||||
|
||||
.. code:: ipython3
|
||||
|
||||
# Create new arrays to populate from our response objects
|
||||
tmp,prs,sh,prs2,tmp2 = np.array([]),np.array([]),np.array([]),np.array([]),np.array([])
|
||||
uc,vc = np.array([]),np.array([])
|
||||
|
||||
# Cycle through all response objects to populate new arrays
|
||||
for ob in response:
|
||||
tmp = np.append(tmp,ob.getNumber("temperature"))
|
||||
prs = np.append(prs,ob.getNumber("pressure"))
|
||||
uc = np.append(uc,ob.getNumber("uComp"))
|
||||
vc = np.append(vc,ob.getNumber("vComp"))
|
||||
# don't include data with 0 specific humidity
|
||||
if(ob.getNumber("specHum")==0):
|
||||
continue
|
||||
sh = np.append(sh,ob.getNumber("specHum"))
|
||||
prs2 = np.append(prs2,ob.getNumber("pressure"))
|
||||
tmp2 = np.append(tmp2,ob.getNumber("temperature"))
|
||||
|
||||
6.2 Calculate Dewpoint from Specific Humidity
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Because the modelsounding plugin does not return dewpoint values, we
|
||||
must calculate the profile ourselves. Here are three examples of
|
||||
dewpoint calculated from specific humidity, including a manual
|
||||
calculation following NCEP AWIPS/NSHARP.
|
||||
|
||||
**1) MetPy calculated mixing ratio and vapor pressure**
|
||||
First, we’ll set up variables that are used in all three methods (and
|
||||
later in the notebook).
|
||||
|
||||
.. code:: ipython3
|
||||
|
||||
t = (tmp-273.15) * units.degC
|
||||
p = prs/100 * units.mbar
|
||||
tfull = (tmp-273.15) * units.degC
|
||||
t = (tmp2-273.15) * units.degC
|
||||
|
||||
pfull = prs/100 * units.mbar
|
||||
p = prs2/100 * units.mbar
|
||||
|
||||
u,v = uc*1.94384,vc*1.94384 # m/s to knots
|
||||
spd = wind_speed(u*units.knots, v*units.knots)
|
||||
dir = wind_direction(u*units.knots, v*units.knots) * units.deg
|
||||
|
||||
6.2.1 Method 1
|
||||
^^^^^^^^^^^^^^
|
||||
|
||||
Here we’ll calculate the dewpoint using MetPy calculated mixing ratio
|
||||
and the vapor pressure.
|
||||
|
||||
.. code:: ipython3
|
||||
|
||||
rmix = (sh/(1-sh)) *1000 * units('g/kg')
|
||||
e = vapor_pressure(p, rmix)
|
||||
td = dewpoint(e)
|
||||
|
||||
**2) metpy calculated assuming spec. humidity = mixing ratio**
|
||||
6.2.2 Method 2
|
||||
^^^^^^^^^^^^^^
|
||||
|
||||
Here we’ll calculate dewpoint using MetPy while assuming the mixing
|
||||
ratio is equal to the specific humidity.
|
||||
|
||||
.. code:: ipython3
|
||||
|
||||
td2 = dewpoint(vapor_pressure(p, sh))
|
||||
|
||||
**3) NCEP AWIPS soundingrequest plugin**
|
||||
6.2.3 Method 3
|
||||
^^^^^^^^^^^^^^
|
||||
|
||||
based on GEMPAK/NSHARP, from
|
||||
https://github.com/Unidata/awips2-ncep/blob/unidata_16.2.2/edex/gov.noaa.nws.ncep.edex.plugin.soundingrequest/src/gov/noaa/nws/ncep/edex/plugin/soundingrequest/handler/MergeSounding.java#L1783
|
||||
Here we use logic from the NCEP AWIPS soundingrequest plugin. This logic
|
||||
was based on `GEMPAK and NSHARP
|
||||
calculations <https://github.com/Unidata/awips2-ncep/blob/unidata_16.2.2/edex/gov.noaa.nws.ncep.edex.plugin.soundingrequest/src/gov/noaa/nws/ncep/edex/plugin/soundingrequest/handler/MergeSounding.java#L1783>`__.
|
||||
|
||||
.. code:: ipython3
|
||||
|
||||
# new arrays
|
||||
ntmp = tmp
|
||||
ntmp = tmp2
|
||||
|
||||
# where p=pressure(pa), T=temp(C), T0=reference temp(273.16)
|
||||
rh = 0.263*prs*sh / (np.exp(17.67*ntmp/(ntmp+273.15-29.65)))
|
||||
rh = 0.263*prs2*sh / (np.exp(17.67*ntmp/(ntmp+273.15-29.65)))
|
||||
vaps = 6.112 * np.exp((17.67 * ntmp) / (ntmp + 243.5))
|
||||
vapr = rh * vaps / 100
|
||||
dwpc = np.array(243.5 * (np.log(6.112) - np.log(vapr)) / (np.log(vapr) - np.log(6.112) - 17.67)) * units.degC
|
||||
|
||||
MetPy SkewT and Hodograph
|
||||
-------------------------
|
||||
`Top <https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html>`__
|
||||
|
||||
--------------
|
||||
|
||||
7 Plot the Data!
|
||||
----------------
|
||||
|
||||
Create and display SkewT and Hodograph plots using MetPy.
|
||||
|
||||
Since we’re displaying all three dewpoint plots, we also create a
|
||||
“zoomed in” view to highlight the slight differences between the three
|
||||
calculations.
|
||||
|
||||
.. code:: ipython3
|
||||
|
||||
%matplotlib inline
|
||||
|
||||
plt.rcParams['figure.figsize'] = (12, 14)
|
||||
# Create a new figure and define the size
|
||||
fig = plt.figure(figsize=(12, 14))
|
||||
|
||||
# Create a skewT plot
|
||||
skew = SkewT()
|
||||
skew = SkewT(fig)
|
||||
|
||||
# Plot the data
|
||||
skew.plot(p, t, 'r', linewidth=2)
|
||||
skew.plot(pfull, tfull, 'r', linewidth=2)
|
||||
skew.plot(p, td, 'b', linewidth=2)
|
||||
skew.plot(p, td2, 'y')
|
||||
skew.plot(p, td2, 'y', linewidth=2)
|
||||
skew.plot(p, dwpc, 'g', linewidth=2)
|
||||
|
||||
skew.plot_barbs(p, u, v)
|
||||
skew.plot_barbs(pfull, u, v)
|
||||
# set the domain and range (these may need to be adjusted
|
||||
# depending on the exact data for best viewing purposes)
|
||||
skew.ax.set_ylim(1000, 100)
|
||||
skew.ax.set_xlim(-40, 60)
|
||||
skew.ax.set_xlim(-70, 40)
|
||||
|
||||
plt.title( forecastModel + " " \
|
||||
+ ob.getLocationName() \
|
||||
+ "("+ str(ob.getGeometry()) + ")" \
|
||||
+ ", " + str(ob.getDataTime())
|
||||
)
|
||||
# Add title to the plot
|
||||
# format: "2022-08-18 18Z FH 0 | GFS KFRM (43.65,-94.42)"
|
||||
datetime = str(ob.getDataTime())[0:-6]+"Z"
|
||||
forecastHr = str(ob.getDataTime().getFcstTime())
|
||||
site = ob.getLocationName()
|
||||
lat = "{:.2f}".format(ob.getGeometry().y)
|
||||
lon = "{:.2f}".format(ob.getGeometry().x)
|
||||
coords = "(" + lat + ", " + lon +")"
|
||||
|
||||
title = datetime + " FH " + forecastHr + " | " + forecastModel + " " + site + " " + coords
|
||||
plt.title(title)
|
||||
|
||||
# Create a secondary axes for the "zoomed in" view
|
||||
zoom_ax = inset_axes(skew.ax, '35%', '35%', loc=3,
|
||||
bbox_to_anchor=(.05, .05, 1, 1),
|
||||
bbox_transform=skew.ax.transAxes)
|
||||
# create a secondary plot for zoomed in section
|
||||
fig2 = plt.figure()
|
||||
skew2 = SkewT(fig2)
|
||||
skew2.ax = zoom_ax
|
||||
skew2.plot(p, td, 'b', linewidth=2, label='MetPy calculated mixing ratio')
|
||||
skew2.plot(p, td2, 'y', linewidth=2, label='MetPy spec. hum = mixing ratio')
|
||||
skew2.plot(p, dwpc, 'g', linewidth=2, label='GEMPAK legacy caluclation')
|
||||
# create a legend to explain the three lines
|
||||
skew2.ax.legend(loc=1)
|
||||
# remove the axis title on the zoomed plot since they
|
||||
# are redundant and just clutter the plot
|
||||
skew2.ax.set_xlabel("")
|
||||
skew2.ax.set_ylabel("")
|
||||
# these exact bounds may need to change depending on
|
||||
# the most recent data
|
||||
skew2.ax.set_ylim(970, 900)
|
||||
skew2.ax.set_xlim(11, 14)
|
||||
|
||||
# draw an indicator in the main plot of the "zoomed in" region
|
||||
skew.ax.indicate_inset_zoom(zoom_ax, edgecolor="black")
|
||||
|
||||
# dispose of the second figure, since creating a new
|
||||
# skewt in metpy automatically creates a new figure
|
||||
# which is unnecessary in this case
|
||||
plt.close(fig2)
|
||||
|
||||
# An example of a slanted line at constant T -- in this case the 0 isotherm
|
||||
l = skew.ax.axvline(0, color='c', linestyle='--', linewidth=2)
|
||||
|
@ -1189,6 +1389,39 @@ MetPy SkewT and Hodograph
|
|||
|
||||
|
||||
|
||||
.. image:: Model_Sounding_Data_files/Model_Sounding_Data_15_0.png
|
||||
.. image:: Model_Sounding_Data_files/Model_Sounding_Data_34_0.png
|
||||
|
||||
|
||||
`Top <https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html>`__
|
||||
|
||||
--------------
|
||||
|
||||
See Also
|
||||
--------
|
||||
|
||||
Related Notebooks
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
- `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>`__
|
||||
- `Forecast Model Vertical
|
||||
Sounding <http://unidata.github.io/python-awips/examples/generated/Forecast_Model_Vertical_Sounding.html>`__
|
||||
|
||||
Additional Documentation
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
**python-awips:** \*
|
||||
`awips.DataAccessLayer <http://unidata.github.io/python-awips/api/DataAccessLayer.html>`__
|
||||
\*
|
||||
`awips.PyGeometryData <http://unidata.github.io/python-awips/api/PyGeometryData.html>`__
|
||||
|
||||
**matplotlib:** \*
|
||||
`matplotlib.pyplot <https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.html>`__
|
||||
\*
|
||||
`metpy.skewt <https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.SkewT.html>`__
|
||||
|
||||
`Top <https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html>`__
|
||||
|
||||
--------------
|
||||
|
|
|
@ -236,7 +236,6 @@ div.body p, div.body dd, div.body li, div.body blockquote {
|
|||
a.headerlink {
|
||||
visibility: hidden;
|
||||
}
|
||||
|
||||
a.brackets:before,
|
||||
span.brackets > a:before{
|
||||
content: "[";
|
||||
|
@ -247,6 +246,7 @@ span.brackets > a:after {
|
|||
content: "]";
|
||||
}
|
||||
|
||||
|
||||
h1:hover > a.headerlink,
|
||||
h2:hover > a.headerlink,
|
||||
h3:hover > a.headerlink,
|
||||
|
@ -334,14 +334,12 @@ aside.sidebar {
|
|||
p.sidebar-title {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
div.admonition, div.topic, aside.topic, blockquote {
|
||||
div.admonition, div.topic, blockquote {
|
||||
clear: left;
|
||||
}
|
||||
|
||||
/* -- topics ---------------------------------------------------------------- */
|
||||
|
||||
div.topic, aside.topic {
|
||||
div.topic {
|
||||
border: 1px solid #ccc;
|
||||
padding: 7px;
|
||||
margin: 10px 0 10px 0;
|
||||
|
@ -380,7 +378,6 @@ div.body p.centered {
|
|||
div.sidebar > :last-child,
|
||||
aside.sidebar > :last-child,
|
||||
div.topic > :last-child,
|
||||
aside.topic > :last-child,
|
||||
div.admonition > :last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
@ -388,7 +385,6 @@ div.admonition > :last-child {
|
|||
div.sidebar::after,
|
||||
aside.sidebar::after,
|
||||
div.topic::after,
|
||||
aside.topic::after,
|
||||
div.admonition::after,
|
||||
blockquote::after {
|
||||
display: block;
|
||||
|
@ -612,8 +608,6 @@ ol.simple p,
|
|||
ul.simple p {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
|
||||
/* Docutils 0.17 and older (footnotes & citations) */
|
||||
dl.footnote > dt,
|
||||
dl.citation > dt {
|
||||
float: left;
|
||||
|
@ -631,33 +625,6 @@ dl.citation > dd:after {
|
|||
clear: both;
|
||||
}
|
||||
|
||||
/* Docutils 0.18+ (footnotes & citations) */
|
||||
aside.footnote > span,
|
||||
div.citation > span {
|
||||
float: left;
|
||||
}
|
||||
aside.footnote > span:last-of-type,
|
||||
div.citation > span:last-of-type {
|
||||
padding-right: 0.5em;
|
||||
}
|
||||
aside.footnote > p {
|
||||
margin-left: 2em;
|
||||
}
|
||||
div.citation > p {
|
||||
margin-left: 4em;
|
||||
}
|
||||
aside.footnote > p:last-of-type,
|
||||
div.citation > p:last-of-type {
|
||||
margin-bottom: 0em;
|
||||
}
|
||||
aside.footnote > p:last-of-type:after,
|
||||
div.citation > p:last-of-type:after {
|
||||
content: "";
|
||||
clear: both;
|
||||
}
|
||||
|
||||
/* Footnotes & citations ends */
|
||||
|
||||
dl.field-list {
|
||||
display: grid;
|
||||
grid-template-columns: fit-content(30%) auto;
|
||||
|
@ -669,11 +636,11 @@ dl.field-list > dt {
|
|||
padding-left: 0.5em;
|
||||
padding-right: 5px;
|
||||
}
|
||||
|
||||
dl.field-list > dt:after {
|
||||
content: ":";
|
||||
}
|
||||
|
||||
|
||||
dl.field-list > dd {
|
||||
padding-left: 0.5em;
|
||||
margin-top: 0em;
|
||||
|
|
|
@ -10,5 +10,5 @@ var DOCUMENTATION_OPTIONS = {
|
|||
SOURCELINK_SUFFIX: '.txt',
|
||||
NAVIGATION_WITH_KEYS: false,
|
||||
SHOW_SEARCH_SUMMARY: true,
|
||||
ENABLE_SEARCH_SHORTCUTS: false,
|
||||
ENABLE_SEARCH_SHORTCUTS: true,
|
||||
};
|
|
@ -88,7 +88,7 @@ const _displayItem = (item, highlightTerms, searchTerms) => {
|
|||
linkEl.href = linkUrl + "?" + params.toString() + anchor;
|
||||
linkEl.innerHTML = title;
|
||||
if (descr)
|
||||
listItem.appendChild(document.createElement("span")).innerText =
|
||||
listItem.appendChild(document.createElement("span")).innerHTML =
|
||||
" (" + descr + ")";
|
||||
else if (showSearchSummary)
|
||||
fetch(requestUrl)
|
||||
|
@ -155,10 +155,8 @@ const Search = {
|
|||
_pulse_status: -1,
|
||||
|
||||
htmlToText: (htmlString) => {
|
||||
const htmlElement = document
|
||||
.createRange()
|
||||
.createContextualFragment(htmlString);
|
||||
_removeChildren(htmlElement.querySelectorAll(".headerlink"));
|
||||
const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html');
|
||||
htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() });
|
||||
const docContent = htmlElement.querySelector('[role="main"]');
|
||||
if (docContent !== undefined) return docContent.textContent;
|
||||
console.warn(
|
||||
|
@ -504,11 +502,12 @@ const Search = {
|
|||
* latter for highlighting it.
|
||||
*/
|
||||
makeSearchSummary: (htmlText, keywords, highlightWords) => {
|
||||
const text = Search.htmlToText(htmlText).toLowerCase();
|
||||
const text = Search.htmlToText(htmlText);
|
||||
if (text === "") return null;
|
||||
|
||||
const textLower = text.toLowerCase();
|
||||
const actualStartPosition = [...keywords]
|
||||
.map((k) => text.indexOf(k.toLowerCase()))
|
||||
.map((k) => textLower.indexOf(k.toLowerCase()))
|
||||
.filter((i) => i > -1)
|
||||
.slice(-1)[0];
|
||||
const startWithContext = Math.max(actualStartPosition - 120, 0);
|
||||
|
@ -516,9 +515,9 @@ const Search = {
|
|||
const top = startWithContext === 0 ? "" : "...";
|
||||
const tail = startWithContext + 240 < text.length ? "..." : "";
|
||||
|
||||
let summary = document.createElement("div");
|
||||
let summary = document.createElement("p");
|
||||
summary.classList.add("context");
|
||||
summary.innerText = top + text.substr(startWithContext, 240).trim() + tail;
|
||||
summary.textContent = top + text.substr(startWithContext, 240).trim() + tail;
|
||||
|
||||
highlightWords.forEach((highlightWord) =>
|
||||
_highlightText(summary, highlightWord, "highlighted")
|
||||
|
|
|
@ -55,10 +55,18 @@
|
|||
<li class="toctree-l2"><a class="reference internal" href="METAR_Station_Plot_with_MetPy.html">METAR Station Plot with MetPy</a></li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="Map_Resources_and_Topography.html">Map Resources and Topography</a></li>
|
||||
<li class="toctree-l2 current"><a class="current reference internal" href="#">Model Sounding Data</a><ul>
|
||||
<li class="toctree-l3"><a class="reference internal" href="#available-locations">Available Locations</a></li>
|
||||
<li class="toctree-l3"><a class="reference internal" href="#model-sounding-parameters">Model Sounding Parameters</a></li>
|
||||
<li class="toctree-l3"><a class="reference internal" href="#calculating-dewpoint-from-specific-humidity">Calculating Dewpoint from Specific Humidity</a></li>
|
||||
<li class="toctree-l3"><a class="reference internal" href="#metpy-skewt-and-hodograph">MetPy SkewT and Hodograph</a></li>
|
||||
<li class="toctree-l3"><a class="reference internal" href="#objectives">Objectives</a><ul>
|
||||
<li class="toctree-l4"><a class="reference internal" href="#table-of-contents">Table of Contents</a></li>
|
||||
<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="#setting-location">3 Setting Location</a></li>
|
||||
<li class="toctree-l4"><a class="reference internal" href="#filtering-by-time">4 Filtering by Time</a></li>
|
||||
<li class="toctree-l4"><a class="reference internal" href="#get-the-data">5 Get the Data!</a></li>
|
||||
<li class="toctree-l4"><a class="reference internal" href="#use-the-data">6 Use the Data!</a></li>
|
||||
<li class="toctree-l4"><a class="reference internal" href="#plot-the-data">7 Plot the Data!</a></li>
|
||||
<li class="toctree-l4"><a class="reference internal" href="#see-also">See Also</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="toctree-l2"><a class="reference internal" href="NEXRAD_Level3_Radar.html">NEXRAD Level3 Radar</a></li>
|
||||
|
@ -102,32 +110,106 @@
|
|||
<section id="model-sounding-data">
|
||||
<h1>Model Sounding Data<a class="headerlink" href="#model-sounding-data" 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/Model_Sounding_Data.ipynb">Notebook</a>
|
||||
The EDEX modelsounding plugin creates 64-level vertical profiles from
|
||||
GFS and ETA (NAM) BUFR products distirubted over NOAAport. Paramters
|
||||
which are requestable are <strong>pressure</strong>, <strong>temperature</strong>, <strong>specHum</strong>,
|
||||
<strong>uComp</strong>, <strong>vComp</strong>, <strong>omega</strong>, <strong>cldCvr</strong>.</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>Use python-awips to connect to an edex server</p></li>
|
||||
<li><p>Define and filter data request for model sounding data</p></li>
|
||||
<li><p>Create vertical profiles from GFS BUFR products</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>
|
||||
<hr class="docutils" />
|
||||
<section id="table-of-contents">
|
||||
<h3>Table of Contents<a class="headerlink" href="#table-of-contents" title="Permalink to this heading"></a></h3>
|
||||
<div class="line-block">
|
||||
<div class="line"><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#imports">1
|
||||
Imports</a></div>
|
||||
<div class="line"><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#edex-connection">2 EDEX
|
||||
Connection</a></div>
|
||||
<div class="line"><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#setting-location">3 Setting
|
||||
Location</a></div>
|
||||
<div class="line"> <a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#available-location-names">3.1 Available Location
|
||||
Names</a></div>
|
||||
<div class="line"> <a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#setting-the-location-name">3.2 Setting the Location
|
||||
Name</a></div>
|
||||
<div class="line"><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#filtering-by-time">4 Filtering by
|
||||
Time</a></div>
|
||||
<div class="line"><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#get-the-data">5 Get the
|
||||
Data!</a></div>
|
||||
<div class="line"><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#use-the-data">6 Use the
|
||||
Data!</a></div>
|
||||
<div class="line"> <a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#prepare-the-data">6.1 Prepare the
|
||||
Data!</a></div>
|
||||
<div class="line"> <a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#calculate-dewpoint-from-specific-humidity">6.2 Calculate Dewpoint from Specific
|
||||
Humidity</a></div>
|
||||
<div class="line"> <a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#method-1">6.2.1 Method
|
||||
1</a></div>
|
||||
<div class="line"> <a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#method-2">6.2.2 Method
|
||||
2</a></div>
|
||||
<div class="line"> <a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#method-3">6.2.3 Method
|
||||
3</a></div>
|
||||
<div class="line"><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#plot-the-data">7 Plot the
|
||||
Data!</a></div>
|
||||
<div class="line"><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#see-also">8 See
|
||||
Also</a></div>
|
||||
<div class="line"> <a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#related-notebooks">8.1 Related
|
||||
Notebooks</a></div>
|
||||
<div class="line"> <a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#additional-documentation">8.2 Additional
|
||||
Documentation</a></div>
|
||||
</div>
|
||||
</section>
|
||||
<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="kn">import</span> <span class="nn">matplotlib.tri</span> <span class="k">as</span> <span class="nn">mtri</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">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">exp</span><span class="p">,</span> <span class="n">log</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.calc</span> <span class="kn">import</span> <span class="n">wind_components</span><span class="p">,</span> <span class="n">lcl</span><span class="p">,</span> <span class="n">dry_lapse</span><span class="p">,</span> <span class="n">parcel_profile</span><span class="p">,</span> <span class="n">dewpoint</span>
|
||||
<span class="kn">from</span> <span class="nn">metpy.calc</span> <span class="kn">import</span> <span class="n">wind_speed</span><span class="p">,</span> <span class="n">wind_direction</span><span class="p">,</span> <span class="n">thermo</span><span class="p">,</span> <span class="n">vapor_pressure</span>
|
||||
<span class="kn">from</span> <span class="nn">metpy.calc</span> <span class="kn">import</span> <span class="n">dewpoint</span><span class="p">,</span> <span class="n">vapor_pressure</span><span class="p">,</span> <span class="n">wind_speed</span><span class="p">,</span> <span class="n">wind_direction</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="p">,</span> <span class="n">concatenate</span>
|
||||
<span class="kn">import</span> <span class="nn">warnings</span>
|
||||
<span class="n">warnings</span><span class="o">.</span><span class="n">filterwarnings</span><span class="p">(</span><span class="s2">"ignore"</span><span class="p">,</span><span class="n">category</span> <span class="o">=</span><span class="ne">RuntimeWarning</span><span class="p">)</span>
|
||||
|
||||
<span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">changeEDEXHost</span><span class="p">(</span><span class="s2">"edex-cloud.unidata.ucar.edu"</span><span class="p">)</span>
|
||||
<span class="kn">from</span> <span class="nn">metpy.units</span> <span class="kn">import</span> <span class="n">units</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.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. With
|
||||
that connection made, we can create a <a class="reference external" href="http://unidata.github.io/python-awips/api/IDataRequest.html">new data request
|
||||
object</a>
|
||||
and set the data type to <strong>modelsounding</strong>, and define additional
|
||||
parameters and an identifier on the request.</p>
|
||||
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">changeEDEXHost</span><span class="p">(</span><span class="s2">"edex-cloud.unidata.ucar.edu"</span><span class="p">)</span>
|
||||
<span class="n">request</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">"modelsounding"</span><span class="p">)</span>
|
||||
<span class="n">forecastModel</span> <span class="o">=</span> <span class="s2">"GFS"</span>
|
||||
<span class="n">request</span><span class="o">.</span><span class="n">addIdentifier</span><span class="p">(</span><span class="s2">"reportType"</span><span class="p">,</span> <span class="n">forecastModel</span><span class="p">)</span>
|
||||
<span class="n">request</span><span class="o">.</span><span class="n">setParameters</span><span class="p">(</span><span class="s2">"pressure"</span><span class="p">,</span><span class="s2">"temperature"</span><span class="p">,</span><span class="s2">"specHum"</span><span class="p">,</span><span class="s2">"uComp"</span><span class="p">,</span><span class="s2">"vComp"</span><span class="p">,</span><span class="s2">"omega"</span><span class="p">,</span><span class="s2">"cldCvr"</span><span class="p">)</span>
|
||||
<span class="n">request</span><span class="o">.</span><span class="n">setParameters</span><span class="p">(</span><span class="s2">"pressure"</span><span class="p">,</span><span class="s2">"temperature"</span><span class="p">,</span><span class="s2">"specHum"</span><span class="p">,</span><span class="s2">"uComp"</span><span class="p">,</span><span class="s2">"vComp"</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<section id="available-locations">
|
||||
<h2>Available Locations<a class="headerlink" href="#available-locations" title="Permalink to this heading"></a></h2>
|
||||
<p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html">Top</a></p>
|
||||
</section>
|
||||
<hr class="docutils" />
|
||||
<section id="setting-location">
|
||||
<h3>3 Setting Location<a class="headerlink" href="#setting-location" title="Permalink to this heading"></a></h3>
|
||||
<section id="available-location-names">
|
||||
<h4>3.1 Available Location Names<a class="headerlink" href="#available-location-names" title="Permalink to this heading"></a></h4>
|
||||
<p>When working with a new data type, it is often useful to investigate all
|
||||
available options for a particular setting. Shown below is how to see
|
||||
all available location names for a data request with type
|
||||
<code class="docutils literal notranslate"><span class="pre">modelsounding</span></code> and <code class="docutils literal notranslate"><span class="pre">reportType</span></code> identifier of <code class="docutils literal notranslate"><span class="pre">GFS</span></code>. This step is
|
||||
not necessary if you already know exactly what the location name(s)
|
||||
you’re interested in is.</p>
|
||||
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">locations</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">getAvailableLocationNames</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
|
||||
<span class="n">locations</span><span class="o">.</span><span class="n">sort</span><span class="p">()</span>
|
||||
<span class="nb">list</span><span class="p">(</span><span class="n">locations</span><span class="p">)</span>
|
||||
|
@ -1136,8 +1218,23 @@ which are requestable are <strong>pressure</strong>, <strong>temperature</strong
|
|||
<span class="o">...</span><span class="p">]</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</section>
|
||||
<section id="setting-the-location-name">
|
||||
<h4>3.2 Setting the Location Name<a class="headerlink" href="#setting-the-location-name" title="Permalink to this heading"></a></h4>
|
||||
<p>In this case we’re setting the location name to <code class="docutils literal notranslate"><span class="pre">KFRM</span></code> which is the
|
||||
Municipal Airport in Fairmont, Minnesota.</p>
|
||||
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">request</span><span class="o">.</span><span class="n">setLocationNames</span><span class="p">(</span><span class="s2">"KFRM"</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">request</span><span class="p">,</span> <span class="kc">True</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html">Top</a></p>
|
||||
</section>
|
||||
</section>
|
||||
<hr class="docutils" />
|
||||
<section id="filtering-by-time">
|
||||
<h3>4 Filtering by Time<a class="headerlink" href="#filtering-by-time" title="Permalink to this heading"></a></h3>
|
||||
<p>Models produce many different time variants during their runs, so let’s
|
||||
limit the data to the most recent time and forecast run.</p>
|
||||
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></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">request</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">request</span><span class="p">)</span>
|
||||
|
||||
<span class="k">try</span><span class="p">:</span>
|
||||
|
@ -1149,104 +1246,190 @@ which are requestable are <strong>pressure</strong>, <strong>temperature</strong
|
|||
<span class="n">exit</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html">Top</a></p>
|
||||
</section>
|
||||
<section id="model-sounding-parameters">
|
||||
<h2>Model Sounding Parameters<a class="headerlink" href="#model-sounding-parameters" title="Permalink to this heading"></a></h2>
|
||||
<p>Construct arrays for each parameter to plot (temperature, pressure,
|
||||
moisutre (spec. humidity), wind components, and cloud cover)</p>
|
||||
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">tmp</span><span class="p">,</span><span class="n">prs</span><span class="p">,</span><span class="n">sh</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">np</span><span class="o">.</span><span class="n">array</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">uc</span><span class="p">,</span><span class="n">vc</span><span class="p">,</span><span class="n">om</span><span class="p">,</span><span class="n">cld</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">np</span><span class="o">.</span><span class="n">array</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">np</span><span class="o">.</span><span class="n">array</span><span class="p">([])</span>
|
||||
<hr class="docutils" />
|
||||
<section id="get-the-data">
|
||||
<h3>5 Get the Data!<a class="headerlink" href="#get-the-data" title="Permalink to this heading"></a></h3>
|
||||
<p>Here we can now request our data response from the EDEX server with our
|
||||
defined time filter. Printing out some data about the response verifies
|
||||
we received the data we were interested in.</p>
|
||||
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">obj</span> <span class="o">=</span> <span class="n">response</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">"parms = "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">getParameters</span><span class="p">()))</span>
|
||||
<span class="nb">print</span><span class="p">(</span><span class="s2">"site = "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">getLocationName</span><span class="p">()))</span>
|
||||
<span class="nb">print</span><span class="p">(</span><span class="s2">"geom = "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">getGeometry</span><span class="p">()))</span>
|
||||
<span class="nb">print</span><span class="p">(</span><span class="s2">"datetime = "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">getDataTime</span><span class="p">()))</span>
|
||||
<span class="nb">print</span><span class="p">(</span><span class="s2">"reftime = "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">getDataTime</span><span class="p">()</span><span class="o">.</span><span class="n">getRefTime</span><span class="p">()))</span>
|
||||
<span class="nb">print</span><span class="p">(</span><span class="s2">"fcstHour = "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">getDataTime</span><span class="p">()</span><span class="o">.</span><span class="n">getFcstTime</span><span class="p">()))</span>
|
||||
<span class="nb">print</span><span class="p">(</span><span class="s2">"period = "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="n">getDataTime</span><span class="p">()</span><span class="o">.</span><span class="n">getValidPeriod</span><span class="p">()))</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">parms</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'temperature'</span><span class="p">,</span> <span class="s1">'pressure'</span><span class="p">,</span> <span class="s1">'vComp'</span><span class="p">,</span> <span class="s1">'uComp'</span><span class="p">,</span> <span class="s1">'specHum'</span><span class="p">]</span>
|
||||
<span class="n">site</span> <span class="o">=</span> <span class="n">KFRM</span>
|
||||
<span class="n">geom</span> <span class="o">=</span> <span class="n">POINT</span> <span class="p">(</span><span class="o">-</span><span class="mf">94.41999816894531</span> <span class="mf">43.65000152587891</span><span class="p">)</span>
|
||||
<span class="n">datetime</span> <span class="o">=</span> <span class="mi">2022</span><span class="o">-</span><span class="mi">08</span><span class="o">-</span><span class="mi">19</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">reftime</span> <span class="o">=</span> <span class="n">Aug</span> <span class="mi">19</span> <span class="mi">22</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">GMT</span>
|
||||
<span class="n">fcstHour</span> <span class="o">=</span> <span class="mi">0</span>
|
||||
<span class="n">period</span> <span class="o">=</span> <span class="p">(</span><span class="n">Aug</span> <span class="mi">19</span> <span class="mi">22</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="p">,</span> <span class="n">Aug</span> <span class="mi">19</span> <span class="mi">22</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="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html">Top</a></p>
|
||||
</section>
|
||||
<hr class="docutils" />
|
||||
<section id="use-the-data">
|
||||
<h3>6 Use the Data!<a class="headerlink" href="#use-the-data" title="Permalink to this heading"></a></h3>
|
||||
<p>Since we filtered on time, and requested the data in the previous cell,
|
||||
we now have a <code class="docutils literal notranslate"><span class="pre">response</span></code> object we can work with.</p>
|
||||
<section id="prepare-data-objects">
|
||||
<h4>6.2 Prepare data objects<a class="headerlink" href="#prepare-data-objects" title="Permalink to this heading"></a></h4>
|
||||
<p>Here we construct arrays for each parameter to plot (temperature,
|
||||
pressure, moisture (spec. humidity), wind components, and cloud cover).
|
||||
We have two sets of arrays for temperature and pressure, where the
|
||||
second set only has values as long as the specific humidity is not zero.
|
||||
That is because we are going to do some calculations with specific
|
||||
humidity, temperature, and pressure and we need all those arrays to be
|
||||
the same length, and for the specific humidty to not equal zero.</p>
|
||||
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># Create new arrays to populate from our response objects</span>
|
||||
<span class="n">tmp</span><span class="p">,</span><span class="n">prs</span><span class="p">,</span><span class="n">sh</span><span class="p">,</span><span class="n">prs2</span><span class="p">,</span><span class="n">tmp2</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">np</span><span class="o">.</span><span class="n">array</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">np</span><span class="o">.</span><span class="n">array</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">uc</span><span class="p">,</span><span class="n">vc</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">np</span><span class="o">.</span><span class="n">array</span><span class="p">([])</span>
|
||||
|
||||
<span class="c1"># Cycle through all response objects to populate new arrays</span>
|
||||
<span class="k">for</span> <span class="n">ob</span> <span class="ow">in</span> <span class="n">response</span><span class="p">:</span>
|
||||
<span class="n">tmp</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tmp</span><span class="p">,</span><span class="n">ob</span><span class="o">.</span><span class="n">getNumber</span><span class="p">(</span><span class="s2">"temperature"</span><span class="p">))</span>
|
||||
<span class="n">prs</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">prs</span><span class="p">,</span><span class="n">ob</span><span class="o">.</span><span class="n">getNumber</span><span class="p">(</span><span class="s2">"pressure"</span><span class="p">))</span>
|
||||
<span class="n">sh</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">sh</span><span class="p">,</span><span class="n">ob</span><span class="o">.</span><span class="n">getNumber</span><span class="p">(</span><span class="s2">"specHum"</span><span class="p">))</span>
|
||||
<span class="n">uc</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">uc</span><span class="p">,</span><span class="n">ob</span><span class="o">.</span><span class="n">getNumber</span><span class="p">(</span><span class="s2">"uComp"</span><span class="p">))</span>
|
||||
<span class="n">vc</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">vc</span><span class="p">,</span><span class="n">ob</span><span class="o">.</span><span class="n">getNumber</span><span class="p">(</span><span class="s2">"vComp"</span><span class="p">))</span>
|
||||
<span class="n">om</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">om</span><span class="p">,</span><span class="n">ob</span><span class="o">.</span><span class="n">getNumber</span><span class="p">(</span><span class="s2">"omega"</span><span class="p">))</span>
|
||||
<span class="n">cld</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">cld</span><span class="p">,</span><span class="n">ob</span><span class="o">.</span><span class="n">getNumber</span><span class="p">(</span><span class="s2">"cldCvr"</span><span class="p">))</span>
|
||||
|
||||
<span class="nb">print</span><span class="p">(</span><span class="s2">"parms = "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">ob</span><span class="o">.</span><span class="n">getParameters</span><span class="p">()))</span>
|
||||
<span class="nb">print</span><span class="p">(</span><span class="s2">"site = "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">ob</span><span class="o">.</span><span class="n">getLocationName</span><span class="p">()))</span>
|
||||
<span class="nb">print</span><span class="p">(</span><span class="s2">"geom = "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">ob</span><span class="o">.</span><span class="n">getGeometry</span><span class="p">()))</span>
|
||||
<span class="nb">print</span><span class="p">(</span><span class="s2">"datetime = "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">ob</span><span class="o">.</span><span class="n">getDataTime</span><span class="p">()))</span>
|
||||
<span class="nb">print</span><span class="p">(</span><span class="s2">"reftime = "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">ob</span><span class="o">.</span><span class="n">getDataTime</span><span class="p">()</span><span class="o">.</span><span class="n">getRefTime</span><span class="p">()))</span>
|
||||
<span class="nb">print</span><span class="p">(</span><span class="s2">"fcstHour = "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">ob</span><span class="o">.</span><span class="n">getDataTime</span><span class="p">()</span><span class="o">.</span><span class="n">getFcstTime</span><span class="p">()))</span>
|
||||
<span class="nb">print</span><span class="p">(</span><span class="s2">"period = "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">ob</span><span class="o">.</span><span class="n">getDataTime</span><span class="p">()</span><span class="o">.</span><span class="n">getValidPeriod</span><span class="p">()))</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">parms</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'temperature'</span><span class="p">,</span> <span class="s1">'pressure'</span><span class="p">,</span> <span class="s1">'vComp'</span><span class="p">,</span> <span class="s1">'uComp'</span><span class="p">,</span> <span class="s1">'cldCvr'</span><span class="p">,</span> <span class="s1">'specHum'</span><span class="p">,</span> <span class="s1">'omega'</span><span class="p">]</span>
|
||||
<span class="n">site</span> <span class="o">=</span> <span class="n">KFRM</span>
|
||||
<span class="n">geom</span> <span class="o">=</span> <span class="n">POINT</span> <span class="p">(</span><span class="o">-</span><span class="mf">94.41999816894531</span> <span class="mf">43.65000152587891</span><span class="p">)</span>
|
||||
<span class="n">datetime</span> <span class="o">=</span> <span class="mi">2020</span><span class="o">-</span><span class="mi">09</span><span class="o">-</span><span class="mi">04</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">reftime</span> <span class="o">=</span> <span class="n">Sep</span> <span class="mi">04</span> <span class="mi">20</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">GMT</span>
|
||||
<span class="n">fcstHour</span> <span class="o">=</span> <span class="mi">0</span>
|
||||
<span class="n">period</span> <span class="o">=</span> <span class="p">(</span><span class="n">Sep</span> <span class="mi">04</span> <span class="mi">20</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="p">,</span> <span class="n">Sep</span> <span class="mi">04</span> <span class="mi">20</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="p">)</span>
|
||||
<span class="c1"># don't include data with 0 specific humidity</span>
|
||||
<span class="k">if</span><span class="p">(</span><span class="n">ob</span><span class="o">.</span><span class="n">getNumber</span><span class="p">(</span><span class="s2">"specHum"</span><span class="p">)</span><span class="o">==</span><span class="mi">0</span><span class="p">):</span>
|
||||
<span class="k">continue</span>
|
||||
<span class="n">sh</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">sh</span><span class="p">,</span><span class="n">ob</span><span class="o">.</span><span class="n">getNumber</span><span class="p">(</span><span class="s2">"specHum"</span><span class="p">))</span>
|
||||
<span class="n">prs2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">prs2</span><span class="p">,</span><span class="n">ob</span><span class="o">.</span><span class="n">getNumber</span><span class="p">(</span><span class="s2">"pressure"</span><span class="p">))</span>
|
||||
<span class="n">tmp2</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tmp2</span><span class="p">,</span><span class="n">ob</span><span class="o">.</span><span class="n">getNumber</span><span class="p">(</span><span class="s2">"temperature"</span><span class="p">))</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
</section>
|
||||
<section id="calculating-dewpoint-from-specific-humidity">
|
||||
<h2>Calculating Dewpoint from Specific Humidity<a class="headerlink" href="#calculating-dewpoint-from-specific-humidity" title="Permalink to this heading"></a></h2>
|
||||
<section id="calculate-dewpoint-from-specific-humidity">
|
||||
<h4>6.2 Calculate Dewpoint from Specific Humidity<a class="headerlink" href="#calculate-dewpoint-from-specific-humidity" title="Permalink to this heading"></a></h4>
|
||||
<p>Because the modelsounding plugin does not return dewpoint values, we
|
||||
must calculate the profile ourselves. Here are three examples of
|
||||
dewpoint calculated from specific humidity, including a manual
|
||||
calculation following NCEP AWIPS/NSHARP.</p>
|
||||
<p><strong>1) MetPy calculated mixing ratio and vapor pressure</strong></p>
|
||||
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">t</span> <span class="o">=</span> <span class="p">(</span><span class="n">tmp</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">p</span> <span class="o">=</span> <span class="n">prs</span><span class="o">/</span><span class="mi">100</span> <span class="o">*</span> <span class="n">units</span><span class="o">.</span><span class="n">mbar</span>
|
||||
<p>First, we’ll set up variables that are used in all three methods (and
|
||||
later in the notebook).</p>
|
||||
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">tfull</span> <span class="o">=</span> <span class="p">(</span><span class="n">tmp</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">t</span> <span class="o">=</span> <span class="p">(</span><span class="n">tmp2</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">pfull</span> <span class="o">=</span> <span class="n">prs</span><span class="o">/</span><span class="mi">100</span> <span class="o">*</span> <span class="n">units</span><span class="o">.</span><span class="n">mbar</span>
|
||||
<span class="n">p</span> <span class="o">=</span> <span class="n">prs2</span><span class="o">/</span><span class="mi">100</span> <span class="o">*</span> <span class="n">units</span><span class="o">.</span><span class="n">mbar</span>
|
||||
|
||||
<span class="n">u</span><span class="p">,</span><span class="n">v</span> <span class="o">=</span> <span class="n">uc</span><span class="o">*</span><span class="mf">1.94384</span><span class="p">,</span><span class="n">vc</span><span class="o">*</span><span class="mf">1.94384</span> <span class="c1"># m/s to knots</span>
|
||||
<span class="n">spd</span> <span class="o">=</span> <span class="n">wind_speed</span><span class="p">(</span><span class="n">u</span><span class="o">*</span><span class="n">units</span><span class="o">.</span><span class="n">knots</span><span class="p">,</span> <span class="n">v</span><span class="o">*</span><span class="n">units</span><span class="o">.</span><span class="n">knots</span><span class="p">)</span>
|
||||
<span class="nb">dir</span> <span class="o">=</span> <span class="n">wind_direction</span><span class="p">(</span><span class="n">u</span><span class="o">*</span><span class="n">units</span><span class="o">.</span><span class="n">knots</span><span class="p">,</span> <span class="n">v</span><span class="o">*</span><span class="n">units</span><span class="o">.</span><span class="n">knots</span><span class="p">)</span> <span class="o">*</span> <span class="n">units</span><span class="o">.</span><span class="n">deg</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<section id="method-1">
|
||||
<h5>6.2.1 Method 1<a class="headerlink" href="#method-1" title="Permalink to this heading"></a></h5>
|
||||
<p>Here we’ll calculate the dewpoint using MetPy calculated mixing ratio
|
||||
and the vapor pressure.</p>
|
||||
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">rmix</span> <span class="o">=</span> <span class="p">(</span><span class="n">sh</span><span class="o">/</span><span class="p">(</span><span class="mi">1</span><span class="o">-</span><span class="n">sh</span><span class="p">))</span> <span class="o">*</span><span class="mi">1000</span> <span class="o">*</span> <span class="n">units</span><span class="p">(</span><span class="s1">'g/kg'</span><span class="p">)</span>
|
||||
<span class="n">e</span> <span class="o">=</span> <span class="n">vapor_pressure</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">rmix</span><span class="p">)</span>
|
||||
<span class="n">td</span> <span class="o">=</span> <span class="n">dewpoint</span><span class="p">(</span><span class="n">e</span><span class="p">)</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p><strong>2) metpy calculated assuming spec. humidity = mixing ratio</strong></p>
|
||||
</section>
|
||||
<section id="method-2">
|
||||
<h5>6.2.2 Method 2<a class="headerlink" href="#method-2" title="Permalink to this heading"></a></h5>
|
||||
<p>Here we’ll calculate dewpoint using MetPy while assuming the mixing
|
||||
ratio is equal to the specific humidity.</p>
|
||||
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">td2</span> <span class="o">=</span> <span class="n">dewpoint</span><span class="p">(</span><span class="n">vapor_pressure</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">sh</span><span class="p">))</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p><strong>3) NCEP AWIPS soundingrequest plugin</strong></p>
|
||||
<p>based on GEMPAK/NSHARP, from
|
||||
<a class="reference external" href="https://github.com/Unidata/awips2-ncep/blob/unidata_16.2.2/edex/gov.noaa.nws.ncep.edex.plugin.soundingrequest/src/gov/noaa/nws/ncep/edex/plugin/soundingrequest/handler/MergeSounding.java#L1783">https://github.com/Unidata/awips2-ncep/blob/unidata_16.2.2/edex/gov.noaa.nws.ncep.edex.plugin.soundingrequest/src/gov/noaa/nws/ncep/edex/plugin/soundingrequest/handler/MergeSounding.java#L1783</a></p>
|
||||
</section>
|
||||
<section id="method-3">
|
||||
<h5>6.2.3 Method 3<a class="headerlink" href="#method-3" title="Permalink to this heading"></a></h5>
|
||||
<p>Here we use logic from the NCEP AWIPS soundingrequest plugin. This logic
|
||||
was based on <a class="reference external" href="https://github.com/Unidata/awips2-ncep/blob/unidata_16.2.2/edex/gov.noaa.nws.ncep.edex.plugin.soundingrequest/src/gov/noaa/nws/ncep/edex/plugin/soundingrequest/handler/MergeSounding.java#L1783">GEMPAK and NSHARP
|
||||
calculations</a>.</p>
|
||||
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># new arrays</span>
|
||||
<span class="n">ntmp</span> <span class="o">=</span> <span class="n">tmp</span>
|
||||
<span class="n">ntmp</span> <span class="o">=</span> <span class="n">tmp2</span>
|
||||
|
||||
<span class="c1"># where p=pressure(pa), T=temp(C), T0=reference temp(273.16)</span>
|
||||
<span class="n">rh</span> <span class="o">=</span> <span class="mf">0.263</span><span class="o">*</span><span class="n">prs</span><span class="o">*</span><span class="n">sh</span> <span class="o">/</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">exp</span><span class="p">(</span><span class="mf">17.67</span><span class="o">*</span><span class="n">ntmp</span><span class="o">/</span><span class="p">(</span><span class="n">ntmp</span><span class="o">+</span><span class="mf">273.15</span><span class="o">-</span><span class="mf">29.65</span><span class="p">)))</span>
|
||||
<span class="n">rh</span> <span class="o">=</span> <span class="mf">0.263</span><span class="o">*</span><span class="n">prs2</span><span class="o">*</span><span class="n">sh</span> <span class="o">/</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">exp</span><span class="p">(</span><span class="mf">17.67</span><span class="o">*</span><span class="n">ntmp</span><span class="o">/</span><span class="p">(</span><span class="n">ntmp</span><span class="o">+</span><span class="mf">273.15</span><span class="o">-</span><span class="mf">29.65</span><span class="p">)))</span>
|
||||
<span class="n">vaps</span> <span class="o">=</span> <span class="mf">6.112</span> <span class="o">*</span> <span class="n">np</span><span class="o">.</span><span class="n">exp</span><span class="p">((</span><span class="mf">17.67</span> <span class="o">*</span> <span class="n">ntmp</span><span class="p">)</span> <span class="o">/</span> <span class="p">(</span><span class="n">ntmp</span> <span class="o">+</span> <span class="mf">243.5</span><span class="p">))</span>
|
||||
<span class="n">vapr</span> <span class="o">=</span> <span class="n">rh</span> <span class="o">*</span> <span class="n">vaps</span> <span class="o">/</span> <span class="mi">100</span>
|
||||
<span class="n">dwpc</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="mf">243.5</span> <span class="o">*</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="mf">6.112</span><span class="p">)</span> <span class="o">-</span> <span class="n">np</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="n">vapr</span><span class="p">))</span> <span class="o">/</span> <span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="n">vapr</span><span class="p">)</span> <span class="o">-</span> <span class="n">np</span><span class="o">.</span><span class="n">log</span><span class="p">(</span><span class="mf">6.112</span><span class="p">)</span> <span class="o">-</span> <span class="mf">17.67</span><span class="p">))</span> <span class="o">*</span> <span class="n">units</span><span class="o">.</span><span class="n">degC</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html">Top</a></p>
|
||||
</section>
|
||||
<section id="metpy-skewt-and-hodograph">
|
||||
<h2>MetPy SkewT and Hodograph<a class="headerlink" href="#metpy-skewt-and-hodograph" title="Permalink to this heading"></a></h2>
|
||||
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="o">%</span><span class="k">matplotlib</span> inline
|
||||
|
||||
<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>
|
||||
</section>
|
||||
<hr class="docutils" />
|
||||
<section id="plot-the-data">
|
||||
<h3>7 Plot the Data!<a class="headerlink" href="#plot-the-data" title="Permalink to this heading"></a></h3>
|
||||
<p>Create and display SkewT and Hodograph plots using MetPy.</p>
|
||||
<p>Since we’re displaying all three dewpoint plots, we also create a
|
||||
“zoomed in” view to highlight the slight differences between the three
|
||||
calculations.</p>
|
||||
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># Create a new figure and define the size</span>
|
||||
<span class="n">fig</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">figure</span><span class="p">(</span><span class="n">figsize</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"># Create a skewT plot</span>
|
||||
<span class="n">skew</span> <span class="o">=</span> <span class="n">SkewT</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">fig</span><span class="p">)</span>
|
||||
|
||||
<span class="c1"># Plot the data</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">pfull</span><span class="p">,</span> <span class="n">tfull</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">td</span><span class="p">,</span> <span class="s1">'b'</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">td2</span><span class="p">,</span> <span class="s1">'y'</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">td2</span><span class="p">,</span> <span class="s1">'y'</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">dwpc</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_barbs</span><span class="p">(</span><span class="n">pfull</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"># set the domain and range (these may need to be adjusted</span>
|
||||
<span class="c1"># depending on the exact data for best viewing purposes)</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">40</span><span class="p">,</span> <span class="mi">60</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">70</span><span class="p">,</span> <span class="mi">40</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">forecastModel</span> <span class="o">+</span> <span class="s2">" "</span> \
|
||||
<span class="o">+</span> <span class="n">ob</span><span class="o">.</span><span class="n">getLocationName</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">ob</span><span class="o">.</span><span class="n">getGeometry</span><span class="p">())</span> <span class="o">+</span> <span class="s2">")"</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">ob</span><span class="o">.</span><span class="n">getDataTime</span><span class="p">())</span>
|
||||
<span class="p">)</span>
|
||||
<span class="c1"># Add title to the plot</span>
|
||||
<span class="c1"># format: "2022-08-18 18Z FH 0 | GFS KFRM (43.65,-94.42)"</span>
|
||||
<span class="n">datetime</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">ob</span><span class="o">.</span><span class="n">getDataTime</span><span class="p">())[</span><span class="mi">0</span><span class="p">:</span><span class="o">-</span><span class="mi">6</span><span class="p">]</span><span class="o">+</span><span class="s2">"Z"</span>
|
||||
<span class="n">forecastHr</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">ob</span><span class="o">.</span><span class="n">getDataTime</span><span class="p">()</span><span class="o">.</span><span class="n">getFcstTime</span><span class="p">())</span>
|
||||
<span class="n">site</span> <span class="o">=</span> <span class="n">ob</span><span class="o">.</span><span class="n">getLocationName</span><span class="p">()</span>
|
||||
<span class="n">lat</span> <span class="o">=</span> <span class="s2">"</span><span class="si">{:.2f}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ob</span><span class="o">.</span><span class="n">getGeometry</span><span class="p">()</span><span class="o">.</span><span class="n">y</span><span class="p">)</span>
|
||||
<span class="n">lon</span> <span class="o">=</span> <span class="s2">"</span><span class="si">{:.2f}</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ob</span><span class="o">.</span><span class="n">getGeometry</span><span class="p">()</span><span class="o">.</span><span class="n">x</span><span class="p">)</span>
|
||||
<span class="n">coords</span> <span class="o">=</span> <span class="s2">"("</span> <span class="o">+</span> <span class="n">lat</span> <span class="o">+</span> <span class="s2">", "</span> <span class="o">+</span> <span class="n">lon</span> <span class="o">+</span><span class="s2">")"</span>
|
||||
|
||||
<span class="n">title</span> <span class="o">=</span> <span class="n">datetime</span> <span class="o">+</span> <span class="s2">" FH "</span> <span class="o">+</span> <span class="n">forecastHr</span> <span class="o">+</span> <span class="s2">" | "</span> <span class="o">+</span> <span class="n">forecastModel</span> <span class="o">+</span> <span class="s2">" "</span> <span class="o">+</span> <span class="n">site</span> <span class="o">+</span> <span class="s2">" "</span> <span class="o">+</span> <span class="n">coords</span>
|
||||
<span class="n">plt</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="n">title</span><span class="p">)</span>
|
||||
|
||||
<span class="c1"># Create a secondary axes for the "zoomed in" view</span>
|
||||
<span class="n">zoom_ax</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">'35%'</span><span class="p">,</span> <span class="s1">'35%'</span><span class="p">,</span> <span class="n">loc</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span>
|
||||
<span class="n">bbox_to_anchor</span><span class="o">=</span><span class="p">(</span><span class="mf">.05</span><span class="p">,</span> <span class="mf">.05</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">),</span>
|
||||
<span class="n">bbox_transform</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">transAxes</span><span class="p">)</span>
|
||||
<span class="c1"># create a secondary plot for zoomed in section</span>
|
||||
<span class="n">fig2</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">figure</span><span class="p">()</span>
|
||||
<span class="n">skew2</span> <span class="o">=</span> <span class="n">SkewT</span><span class="p">(</span><span class="n">fig2</span><span class="p">)</span>
|
||||
<span class="n">skew2</span><span class="o">.</span><span class="n">ax</span> <span class="o">=</span> <span class="n">zoom_ax</span>
|
||||
<span class="n">skew2</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">td</span><span class="p">,</span> <span class="s1">'b'</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">label</span><span class="o">=</span><span class="s1">'MetPy calculated mixing ratio'</span><span class="p">)</span>
|
||||
<span class="n">skew2</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">td2</span><span class="p">,</span> <span class="s1">'y'</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">label</span><span class="o">=</span><span class="s1">'MetPy spec. hum = mixing ratio'</span><span class="p">)</span>
|
||||
<span class="n">skew2</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">dwpc</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">label</span><span class="o">=</span><span class="s1">'GEMPAK legacy caluclation'</span><span class="p">)</span>
|
||||
<span class="c1"># create a legend to explain the three lines</span>
|
||||
<span class="n">skew2</span><span class="o">.</span><span class="n">ax</span><span class="o">.</span><span class="n">legend</span><span class="p">(</span><span class="n">loc</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span>
|
||||
<span class="c1"># remove the axis title on the zoomed plot since they</span>
|
||||
<span class="c1"># are redundant and just clutter the plot</span>
|
||||
<span class="n">skew2</span><span class="o">.</span><span class="n">ax</span><span class="o">.</span><span class="n">set_xlabel</span><span class="p">(</span><span class="s2">""</span><span class="p">)</span>
|
||||
<span class="n">skew2</span><span class="o">.</span><span class="n">ax</span><span class="o">.</span><span class="n">set_ylabel</span><span class="p">(</span><span class="s2">""</span><span class="p">)</span>
|
||||
<span class="c1"># these exact bounds may need to change depending on</span>
|
||||
<span class="c1"># the most recent data</span>
|
||||
<span class="n">skew2</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">970</span><span class="p">,</span> <span class="mi">900</span><span class="p">)</span>
|
||||
<span class="n">skew2</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="mi">11</span><span class="p">,</span> <span class="mi">14</span><span class="p">)</span>
|
||||
|
||||
<span class="c1"># draw an indicator in the main plot of the "zoomed in" region</span>
|
||||
<span class="n">skew</span><span class="o">.</span><span class="n">ax</span><span class="o">.</span><span class="n">indicate_inset_zoom</span><span class="p">(</span><span class="n">zoom_ax</span><span class="p">,</span> <span class="n">edgecolor</span><span class="o">=</span><span class="s2">"black"</span><span class="p">)</span>
|
||||
|
||||
<span class="c1"># dispose of the second figure, since creating a new</span>
|
||||
<span class="c1"># skewt in metpy automatically creates a new figure</span>
|
||||
<span class="c1"># which is unnecessary in this case</span>
|
||||
<span class="n">plt</span><span class="o">.</span><span class="n">close</span><span class="p">(</span><span class="n">fig2</span><span class="p">)</span>
|
||||
|
||||
<span class="c1"># An example of a slanted line at constant T -- in this case the 0 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">2</span><span class="p">)</span>
|
||||
|
@ -1261,7 +1444,37 @@ calculation following NCEP AWIPS/NSHARP.</p>
|
|||
<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
|
||||
</pre></div>
|
||||
</div>
|
||||
<img alt="../../_images/Model_Sounding_Data_15_0.png" src="../../_images/Model_Sounding_Data_15_0.png" />
|
||||
<img alt="../../_images/Model_Sounding_Data_34_0.png" src="../../_images/Model_Sounding_Data_34_0.png" />
|
||||
<p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html">Top</a></p>
|
||||
</section>
|
||||
<hr class="docutils" />
|
||||
<section id="see-also">
|
||||
<h3>See Also<a class="headerlink" href="#see-also" title="Permalink to this heading"></a></h3>
|
||||
<section id="related-notebooks">
|
||||
<h4>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/Forecast_Model_Vertical_Sounding.html">Forecast Model Vertical
|
||||
Sounding</a></p></li>
|
||||
</ul>
|
||||
</section>
|
||||
<section id="additional-documentation">
|
||||
<h4>Additional Documentation<a class="headerlink" href="#additional-documentation" title="Permalink to this heading"></a></h4>
|
||||
<p><strong>python-awips:</strong> *
|
||||
<a class="reference external" href="http://unidata.github.io/python-awips/api/DataAccessLayer.html">awips.DataAccessLayer</a>
|
||||
*
|
||||
<a class="reference external" href="http://unidata.github.io/python-awips/api/PyGeometryData.html">awips.PyGeometryData</a></p>
|
||||
<p><strong>matplotlib:</strong> *
|
||||
<a class="reference external" href="https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.html">matplotlib.pyplot</a>
|
||||
*
|
||||
<a class="reference external" href="https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.SkewT.html">metpy.skewt</a></p>
|
||||
<p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html">Top</a></p>
|
||||
<hr class="docutils" />
|
||||
</section>
|
||||
</section>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
|
|
BIN
objects.inv
BIN
objects.inv
Binary file not shown.
File diff suppressed because one or more lines are too long
Loading…
Add table
Reference in a new issue