python-awips/_sources/examples/generated/Model_Sounding_Data.rst.txt
2021-03-23 16:15:37 +00:00

1194 lines
18 KiB
ReStructuredText

===================
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**.
.. 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.plots import SkewT, Hodograph
from metpy.units import units, concatenate
import warnings
warnings.filterwarnings("ignore",category =RuntimeWarning)
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")
Available Locations
-------------------
.. code:: ipython3
locations = DataAccessLayer.getAvailableLocationNames(request)
locations.sort()
list(locations)
.. parsed-literal::
['',
'1V4',
'3J2',
'4BL',
'4BQ',
'4HV',
'4OM',
'5AF',
'5AG',
'5SZ',
'6RO',
'8V7',
'9B6',
'A#2',
'A#3',
'A#4',
'A#5',
'A#6',
'A#7',
'A#8',
'A#9',
'A#A',
'A#B',
'ABL',
'ADM',
'AFA',
'AGR',
'AHN',
'AIA',
'AIH',
'AJO',
'ANJ',
'APX',
'AQQ',
'ATH',
'ATL1',
'ATL2',
'ATL3',
'ATL4',
'ATLH',
'AWH',
'AWR',
'B#1',
'B#2',
'B#3',
'B#4',
'B#5',
'B#6',
'B#7',
'B#8',
'B#9',
'B#A',
'B#B',
'B#C',
'B#D',
'B#E',
'B#F',
'B#G',
'B#H',
'B#J',
'B#K',
'B#L',
'B#M',
'B#N',
'B#O',
'B#P',
'B#Q',
'B#S',
'BAB',
'BDG',
'BDP',
'BFL',
'BGTL',
'BH1',
'BH2',
'BH3',
'BH4',
'BH5',
'BHK',
'BID',
'BIR',
'BLS',
'BLU',
'BMX',
'BNA',
'BOD',
'BRA',
'BTL',
'BVR',
'C01',
'C02',
'C03',
'C04',
'C06',
'C07',
'C08',
'C09',
'C10',
'C11',
'C12',
'C13',
'C14',
'C17',
'C18',
'C19',
'C20',
'C21',
'C22',
'C23',
'C24',
'C25',
'C27',
'C28',
'C30',
'C31',
'C32',
'C33',
'C34',
'C35',
'C36',
'C7H',
'CAI',
'CAN',
'CBE',
'CBN',
'CHE',
'CKN',
'CLD',
'CLE',
'CLN',
'COL1',
'COL2',
'COL3',
'COL4',
'COT',
'CQV',
'CRL',
'CRR',
'CTY',
'CVM',
'CVS',
'CWEU',
'CWFN',
'CWKX',
'CWLB',
'CWLO',
'CWLT',
'CWLW',
'CWMW',
'CWOS',
'CWPH',
'CWQG',
'CWSA',
'CWSE',
'CWZB',
'CWZC',
'CWZV',
'CYAH',
'CYAW',
'CYBK',
'CYBU',
'CYCB',
'CYCG',
'CYCX',
'CYDA',
'CYEG',
'CYEV',
'CYFB',
'CYFO',
'CYFS',
'CYGQ',
'CYHM',
'CYHZ',
'CYJT',
'CYLH',
'CYLJ',
'CYMD',
'CYMO',
'CYMT',
'CYMX',
'CYOC',
'CYOW',
'CYPA',
'CYPE',
'CYPL',
'CYPQ',
'CYQA',
'CYQD',
'CYQG',
'CYQH',
'CYQI',
'CYQK',
'CYQQ',
'CYQR',
'CYQT',
'CYQX',
'CYQY',
'CYRB',
'CYSM',
'CYSY',
'CYTH',
'CYTL',
'CYTS',
'CYUL',
'CYUX',
'CYVO',
'CYVP',
'CYVQ',
'CYVR',
'CYVV',
'CYWA',
'CYWG',
'CYWO',
'CYXC',
'CYXE',
'CYXH',
'CYXS',
'CYXU',
'CYXX',
'CYXY',
'CYXZ',
'CYYB',
'CYYC',
'CYYE',
'CYYJ',
'CYYQ',
'CYYR',
'CYYT',
'CYYZ',
'CYZF',
'CYZS',
'CYZT',
'CYZV',
'DEN',
'DOV',
'DPG',
'DSC',
'DSD',
'DTX',
'DVN',
'DYS',
'E28',
'E74',
'EAT',
'EAX',
'EDW',
'EFL',
'EMP',
'END',
'ENL',
'ESTC',
'FCS',
'FDR',
'FFC',
'FHU',
'FLG',
'FLP',
'FPK',
'FRI',
'FSI',
'FTR',
'FWD',
'G#1',
'G#2',
'G#3',
'G#4',
'G#5',
'G#6',
'G#7',
'G#8',
'G#9',
'G#A',
'G#B',
'G#C',
'G#D',
'G#E',
'G#F',
'G#G',
'G001',
'G003',
'G004',
'G005',
'G007',
'G009',
'GDP',
'GDV',
'GLRY',
'GMX1',
'GNB',
'GNC',
'GRF',
'GTB',
'GTP',
'GVL',
'GVS',
'GYX',
'H02',
'HAY',
'HGR',
'HMN',
'HOM',
'HOO',
'HSI',
'HYR',
'HYS',
'ICC',
'IGM',
'ILN',
'ILS',
'ILX',
'IMT',
'INK',
'IPX',
'JACK',
'JDN',
'K40B',
'K9V9',
'KABE',
'KABI',
'KABQ',
'KABR',
'KABY',
'KACK',
'KACT',
'KACV',
'KACY',
'KAGC',
'KAGS',
'KAHN',
'KAK',
'KALB',
'KALI',
'KALO',
'KALS',
'KALW',
'KAMA',
'KAN',
'KANB',
'KAND',
'KAOO',
'KAPA',
'KAPN',
'KART',
'KASE',
'KAST',
'KATL',
'KATY',
'KAUG',
'KAUS',
'KAUW',
'KAVL',
'KAVP',
'KAXN',
'KAYS',
'KAZO',
'KBAF',
'KBCE',
'KBDE',
'KBDL',
'KBDR',
'KBED',
'KBFD',
'KBFF',
'KBFI',
'KBFL',
'KBGM',
'KBGR',
'KBHB',
'KBHM',
'KBIH',
'KBIL',
'KBIS',
'KBJC',
'KBJI',
'KBKE',
'KBKW',
'KBLF',
'KBLH',
'KBLI',
'KBML',
'KBNA',
'KBNO',
'KBNV',
'KBOI',
'KBOS',
'KBPT',
'KBQK',
'KBRD',
'KBRL',
'KBRO',
'KBTL',
'KBTM',
'KBTR',
'KBTV',
'KBUF',
'KBUR',
'KBVI',
'KBVX',
'KBVY',
'KBWG',
'KBWI',
'KBYI',
'KBZN',
'KCAE',
'KCAK',
'KCAR',
'KCDC',
'KCDR',
'KCDS',
'KCEC',
'KCEF',
'KCGI',
'KCGX',
'KCHA',
'KCHH',
'KCHO',
'KCHS',
'KCID',
'KCIU',
'KCKB',
'KCKL',
'KCLE',
'KCLL',
'KCLM',
'KCLT',
'KCMH',
'KCMI',
'KCMX',
'KCNM',
'KCNU',
'KCOD',
'KCOE',
'KCON',
'KCOS',
'KCOU',
'KCPR',
'KCRE',
'KCRP',
'KCRQ',
'KCRW',
'KCSG',
'KCSV',
'KCTB',
'KCVG',
'KCWA',
'KCYS',
'KDAB',
'KDAG',
'KDAL',
'KDAN',
'KDAY',
'KDBQ',
'KDCA',
'KDDC',
'KDEC',
'KDEN',
'KDET',
'KDFW',
'KDHN',
'KDHT',
'KDIK',
'KDLH',
'KDLS',
'KDMN',
'KDPA',
'KDRA',
'KDRO',
'KDRT',
'KDSM',
'KDTW',
'KDUG',
'KDUJ',
'KEAT',
'KEAU',
'KECG',
'KEED',
'KEGE',
'KEKN',
'KEKO',
'KEL',
'KELD',
'KELM',
'KELO',
'KELP',
'KELY',
'KENV',
'KEPH',
'KEPO',
'KEPZ',
'KERI',
'KESF',
'KEUG',
'KEVV',
'KEWB',
'KEWN',
'KEWR',
'KEYW',
'KFAM',
'KFAR',
'KFAT',
'KFAY',
'KFCA',
'KFDY',
'KFKL',
'KFLG',
'KFLL',
'KFLO',
'KFMN',
'KFMY',
'KFNT',
'KFOE',
'KFPR',
'KFRM',
'KFSD',
'KFSM',
'KFTW',
'KFTY',
'KFVE',
'KFVX',
'KFWA',
'KFXE',
'KFYV',
'KGAG',
'KGCC',
'KGCK',
'KGCN',
'KGEG',
'KGFK',
'KGFL',
'KGGG',
'KGGW',
'KGJT',
'KGLD',
'KGLH',
'KGLS',
'KGMU',
'KGNR',
'KGNV',
'KGON',
'KGPT',
'KGRB',
'KGRI',
'KGRR',
'KGSO',
'KGSP',
'KGTF',
'KGUC',
'KGUP',
'KGWO',
'KGYY',
'KGZH',
'KHAT',
'KHBR',
'KHDN',
'KHIB',
'KHIO',
'KHKY',
'KHLG',
'KHLN',
'KHOB',
'KHON',
'KHOT',
'KHOU',
'KHPN',
'KHQM',
'KHRL',
'KHRO',
'KHSV',
'KHTH',
'KHTS',
'KHUF',
'KHUL',
'KHUT',
'KHVN',
'KHVR',
'KHYA',
'KIAD',
'KIAG',
'KIAH',
'KICT',
'KIDA',
'KIL',
'KILG',
'KILM',
'KIND',
'KINK',
'KINL',
'KINT',
'KINW',
'KIPL',
'KIPT',
'KISN',
'KISP',
'KITH',
'KIWD',
'KJAC',
'KJAN',
'KJAX',
'KJBR',
'KJFK',
'KJHW',
'KJKL',
'KJLN',
'KJMS',
'KJST',
'KJXN',
'KKL',
'KLAF',
'KLAN',
'KLAR',
'KLAS',
'KLAX',
'KLBB',
'KLBE',
'KLBF',
'KLCB',
'KLCH',
'KLEB',
'KLEX',
'KLFK',
'KLFT',
'KLGA',
'KLGB',
'KLGU',
'KLIT',
'KLMT',
'KLND',
'KLNK',
'KLOL',
'KLOZ',
'KLRD',
'KLSE',
'KLUK',
'KLVS',
'KLWB',
'KLWM',
'KLWS',
'KLWT',
'KLYH',
'KLZK',
'KMAF',
'KMBS',
'KMCB',
'KMCE',
'KMCI',
'KMCN',
'KMCO',
'KMCW',
'KMDN',
'KMDT',
'KMDW',
'KMEI',
'KMEM',
'KMFD',
'KMFE',
'KMFR',
'KMGM',
'KMGW',
'KMHE',
'KMHK',
'KMHT',
'KMHX',
'KMIA',
'KMIV',
'KMKC',
'KMKE',
'KMKG',
'KMKL',
'KMLB',
'KMLC',
'KMLI',
'KMLS',
'KMLT',
'KMLU',
'KMMU',
'KMOB',
'KMOT',
'KMPV',
'KMQT',
'KMRB',
'KMRY',
'KMSL',
'KMSN',
'KMSO',
'KMSP',
'KMSS',
'KMSY',
'KMTJ',
'KMTN',
'KMWH',
'KMYR',
'KNA',
'KNEW',
'KNL',
'KNSI',
'KOAK',
'KOFK',
'KOGD',
'KOKC',
'KOLM',
'KOMA',
'KONT',
'KOPF',
'KOQU',
'KORD',
'KORF',
'KORH',
'KOSH',
'KOTH',
'KOTM',
'KP11',
'KP38',
'KPAE',
'KPAH',
'KPBF',
'KPBI',
'KPDK',
'KPDT',
'KPDX',
'KPFN',
'KPGA',
'KPHF',
'KPHL',
'KPHN',
'KPHX',
'KPIA',
'KPIB',
'KPIE',
'KPIH',
'KPIR',
'KPIT',
'KPKB',
'KPLN',
'KPMD',
'KPNC',
'KPNE',
'KPNS',
'KPOU',
'KPQI',
'KPRB',
'KPRC',
'KPSC',
'KPSM',
'KPSP',
'KPTK',
'KPUB',
'KPVD',
'KPVU',
'KPWM',
'KRAD',
'KRAP',
'KRBL',
'KRDD',
'KRDG',
'KRDM',
'KRDU',
'KRFD',
'KRIC',
'KRIW',
'KRKD',
'KRKS',
'KRNO',
'KRNT',
'KROA',
'KROC',
'KROW',
'KRSL',
'KRST',
'KRSW',
'KRUM',
'KRWF',
'KRWI',
'KRWL',
'KSAC',
'KSAF',
'KSAN',
'KSAT',
'KSAV',
'KSBA',
'KSBN',
'KSBP',
'KSBY',
'KSCH',
'KSCK',
'KSDF',
'KSDM',
'KSDY',
'KSEA',
'KSEP',
'KSFF',
'KSFO',
'KSGF',
'KSGU',
'KSHR',
'KSHV',
'KSJC',
'KSJT',
'KSLC',
'KSLE',
'KSLK',
'KSLN',
'KSMF',
'KSMX',
'KSNA',
'KSNS',
'KSPI',
'KSPS',
'KSRQ',
'KSSI',
'KSTJ',
'KSTL',
'KSTP',
'KSTS',
'KSUN',
'KSUS',
'KSUX',
'KSVE',
'KSWF',
'KSYR',
'KTCC',
'KTCL',
'KTCS',
'KTEB',
'KTIW',
'KTLH',
'KTMB',
'KTOL',
'KTOP',
'KTPA',
'KTPH',
'KTRI',
'KTRK',
'KTRM',
'KTTD',
'KTTN',
'KTUL',
'KTUP',
'KTUS',
'KTVC',
'KTVL',
'KTWF',
'KTXK',
'KTYR',
'KTYS',
'KUCA',
'KUIN',
'KUKI',
'KUNV',
'KVCT',
'KVEL',
'KVLD',
'KVNY',
'KVRB',
'KWJF',
'KWMC',
'KWRL',
'KWYS',
'KY22',
'KY26',
'KYKM',
'KYKN',
'KYNG',
'KYUM',
'KZZV',
'LAA',
'LAP',
'LBY',
'LDL',
'LHX',
'LIC',
'LOR',
'LRR',
'LSF',
'LUS',
'LVM',
'LW1',
'MAC',
'MAX',
'MAZ',
'MDPC',
'MDPP',
'MDSD',
'MDST',
'MGFL',
'MGGT',
'MGHT',
'MGPB',
'MGSJ',
'MHAM',
'MHCA',
'MHCH',
'MHLC',
'MHLE',
'MHLM',
'MHNJ',
'MHPL',
'MHRO',
'MHSR',
'MHTE',
'MHTG',
'MHYR',
'MIB',
'MIE',
'MKJP',
'MKJS',
'MLD',
'MMAA',
'MMAS',
'MMBT',
'MMCE',
'MMCL',
'MMCN',
'MMCS',
'MMCU',
'MMCV',
'MMCZ',
'MMDO',
'MMGL',
'MMGM',
'MMHO',
'MMLP',
'MMMA',
'MMMD',
'MMML',
'MMMM',
'MMMT',
'MMMX',
'MMMY',
'MMMZ',
'MMNL',
'MMPR',
'MMRX',
'MMSD',
'MMSP',
'MMTC',
'MMTJ',
'MMTM',
'MMTO',
'MMTP',
'MMUN',
'MMVR',
'MMZC',
'MMZH',
'MMZO',
'MNMG',
'MNPC',
'MOR',
'MPBO',
'MPCH',
'MPDA',
'MPMG',
'MPSA',
'MPTO',
'MPX',
'MRCH',
'MRF',
'MRLB',
'MRLM',
'MROC',
'MRPV',
'MRS',
'MSAC',
'MSLP',
'MSSS',
'MTCH',
'MTL',
'MTPP',
'MTV',
'MTY',
'MUBA',
'MUBY',
'MUCA',
'MUCL',
'MUCM',
'MUCU',
'MUGM',
'MUGT',
'MUHA',
'MUMO',
'MUMZ',
'MUNG',
'MUVR',
'MUVT',
'MWCR',
'MYBS',
'MYEG',
'MYGF',
'MYGW',
'MYL',
'MYNN',
'MZBZ',
'MZT',
'NCK',
'NGX',
'NHK',
'NID',
'NKX',
'NOA',
'NRU',
'NTD',
...]
.. code:: ipython3
request.setLocationNames("KFRM")
cycles = DataAccessLayer.getAvailableTimes(request, True)
times = DataAccessLayer.getAvailableTimes(request)
try:
fcstRun = DataAccessLayer.getForecastRun(cycles[-1], times)
list(fcstRun)
response = DataAccessLayer.getGeometryData(request,[fcstRun[0]])
except:
print('No times available')
exit
Model Sounding Parameters
-------------------------
Construct arrays for each parameter to plot (temperature, pressure,
moisutre (spec. humidity), wind components, and cloud cover)
.. code:: ipython3
tmp,prs,sh = np.array([]),np.array([]),np.array([])
uc,vc,om,cld = np.array([]),np.array([]),np.array([]),np.array([])
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()))
.. parsed-literal::
parms = ['temperature', 'pressure', 'vComp', 'uComp', 'cldCvr', 'specHum', 'omega']
site = KFRM
geom = POINT (-94.41999816894531 43.65000152587891)
datetime = 2020-09-04 12:00:00
reftime = Sep 04 20 12:00:00 GMT
fcstHour = 0
period = (Sep 04 20 12:00:00 , Sep 04 20 12:00:00 )
Calculating 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**
.. code:: ipython3
t = (tmp-273.15) * units.degC
p = prs/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
.. 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**
.. code:: ipython3
td2 = dewpoint(vapor_pressure(p, sh))
**3) NCEP AWIPS soundingrequest plugin**
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
.. code:: ipython3
# new arrays
ntmp = tmp
# 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)))
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
-------------------------
.. code:: ipython3
%matplotlib inline
plt.rcParams['figure.figsize'] = (12, 14)
# Create a skewT plot
skew = SkewT()
# Plot the data
skew.plot(p, t, 'r', linewidth=2)
skew.plot(p, td, 'b', linewidth=2)
skew.plot(p, td2, 'y')
skew.plot(p, dwpc, 'g', linewidth=2)
skew.plot_barbs(p, u, v)
skew.ax.set_ylim(1000, 100)
skew.ax.set_xlim(-40, 60)
plt.title( forecastModel + " " \
+ ob.getLocationName() \
+ "("+ str(ob.getGeometry()) + ")" \
+ ", " + str(ob.getDataTime())
)
# 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)
# Draw hodograph
ax_hod = inset_axes(skew.ax, '40%', '40%', loc=1)
h = Hodograph(ax_hod, component_range=spd.max()/units.knots)
h.add_grid(increment=20)
h.plot_colormapped(u, v, spd)
# Show the plot
plt.show()
.. image:: Model_Sounding_Data_files/Model_Sounding_Data_15_0.png