thundeR

thundeR is a freeware R package and collection of functions for rapid computation and visualisation of convective parameters commonly used in the operational forecasting of severe convective storms. Core algorithm is based on C++ code implemented into R language via Rcpp. This solution allows to compute over 200 thermodynamic and kinematic parameters in less than 0.02s per profile and process large datasets such as reanalyses or operational NWP models in a reasonable amount of time. Package has been developed since 2017 by research meteorologists specializing in severe convective storms and is constantly updated with new features.

Online browser:

Online rawinsonde browser of thundeR package is available at http://rawinsonde.com

Main functions:

  • sounding_compute() - A core function for calculating convective parameters commonly used in the operational prediction of severe convective storms. Returns a vector of parameters.

  • sounding_plot() - Function to plot a composite of Skew-T, hodograph and selected convective parameters on a single layout

  • sounding_save()- Auxiliary function tosounding_plot` that plots a composite of Skew-T, hodograph and selected convective parameters on a single layout and exports graphical file.

  • get_sounding() - Download rawinsonde measurement from sounding database of the University of Wyoming in a form convenient to use with thundeR package.

Examples

Examples show aplication of selected thundeR package functions

Example 1

Draw Skew-T, hodograph and convective parameters on a single layout and export to png file:

library(thunder)
data("sounding_vienna") # load example dataset (Vienna rawinsonde profile for 23 Aug 2011 12UTC):
pressure = sounding_vienna$pressure # vector of pressure [hPa]
altitude = sounding_vienna$altitude # vector of altitude [meters]
temp = sounding_vienna$temp  # vector of temperature [degree Celsius]
dpt = sounding_vienna$dpt # vector of dew point temperature [degree Celsius]
wd = sounding_vienna$wd # vector of wind direction [azimuth in degrees]
ws = sounding_vienna$ws # vector of wind speed [knots]
sounding_save(filename = "Vienna.png",
              title = "Vienna - 23 August 2011 1200 UTC",
              pressure, altitude, temp, dpt, wd, ws)
#> Your display device is 10 x 6 in. 
#> It is recommended to use at least 10 x 7.5 in. plotting window 
#> or consider saving the layout into file

Vienna

Example 2

Download North Platte rawinsonde profile for 03 Jul 1999 00UTC and export to png file:

profile = get_sounding(wmo_id = 72562, yy = 1999, mm = 7, dd = 3, hh = 0)
head(profile) # show first few rows of downloaded dataset
#>   pressure altitude temp  dpt  wd ws
#> 2    972.0      287 24.0 13.0 130 12
#> 3    970.0      305 24.1 12.8 130 13
#> 4    964.0      359 24.2 12.2 134 16
#> 5    936.6      610 22.2 11.6 150 31
#> 6    925.0      718 21.4 11.4 150 32
#> 7    904.1      914 19.9 10.2 160 33
sounding_save(filename = "NorthPlatte.png", title = "North Platte - 03 July 1999 0000 UTC", profile$pressure, profile$altitude, profile$temp, profile$dpt, profile$wd, profile$ws)
#> Your display device is 10 x 6 in. 
#> It is recommended to use at least 10 x 7.5 in. plotting window 
#> or consider saving the layout into file

North Platte

Example 3

Compute convective parameters based on a sample vertical profile data:

pressure = c(1000, 855, 700, 500, 300, 100, 10) # pressure [hPa]
altitude = c(0, 1500, 2500, 6000, 8500, 12000, 25000) # altitude [meters]
temp = c(25, 10, 0, -15, -30, -50, -92) # temperature [degree Celsius]
dpt = c(20, 5, -5, -30, -55, -80, -99) # dew point temperature [degree Celsius]
wd = c(0, 90, 135, 180, 270, 350, 0) # wind direction [azimuth in degress]
ws = c(5, 10, 20, 30, 40, 5, 0) # wind speed [knots]
accuracy = 2 # accuracy of computations where 3 = high (slow), 2 = medium (recommended), 1 = low (fast)
sounding_compute(pressure, altitude, temp, dpt, wd, ws, accuracy)
#>              MU_CAPE          MU_CAPE_M10       MU_CAPE_M10_PT 
#>       2269.925733301        998.144308627        313.074714966 
#>         MU_02km_CAPE         MU_03km_CAPE          MU_HGL_CAPE 
#>        247.979380820        575.629305978       1616.538411895 
#>               MU_CIN           MU_LCL_HGT           MU_LFC_HGT 
#>          0.000000000        730.000000000        730.000000000 
#>            MU_EL_HGT                MU_LI            MU_LI_M10 
#>       8300.000000000        -10.111930240        -10.853947310 
#>              MU_WMAX           MU_EL_TEMP          MU_LCL_TEMP 
#>         67.378419888        -28.800000000         17.700000000 
#>          MU_LFC_TEMP              MU_MIXR          MU_CAPE_500 
#>         17.700000000         14.875917910       1076.032178138 
#>      MU_CAPE_500_M10   MU_CAPE_500_M10_PT           MU_CIN_500 
#>        389.365140754        137.081449189          0.000000000 
#>            MU_LI_500        MU_LI_500_M10              SB_CAPE 
#>         -5.041702392         -6.234631722       2269.925733301 
#>          SB_CAPE_M10       SB_CAPE_M10_PT         SB_02km_CAPE 
#>        998.144308627        313.074714966        247.979380820 
#>         SB_03km_CAPE          SB_HGL_CAPE               SB_CIN 
#>        575.629305978       1616.538411895          0.000000000 
#>           SB_LCL_HGT           SB_LFC_HGT            SB_EL_HGT 
#>        730.000000000        730.000000000       8300.000000000 
#>                SB_LI            SB_LI_M10              SB_WMAX 
#>        -10.111930240        -10.853947310         67.378419888 
#>           SB_EL_TEMP          SB_LCL_TEMP          SB_LFC_TEMP 
#>        -28.800000000         17.700000000         17.700000000 
#>              SB_MIXR              ML_CAPE          ML_CAPE_M10 
#>         14.875917910       1646.063927273        670.100095437 
#>       ML_CAPE_M10_PT         ML_02km_CAPE         ML_03km_CAPE 
#>        225.281641180        164.079828657        422.429000173 
#>          ML_HGL_CAPE               ML_CIN           ML_LCL_HGT 
#>       1250.022127396          0.000000000        975.000000000 
#>           ML_LFC_HGT            ML_EL_HGT                ML_LI 
#>        975.000000000       7900.000000000         -7.620329500 
#>            ML_LI_M10              ML_WMAX           ML_EL_TEMP 
#>         -8.584526572         57.377067323        -26.400000000 
#>          ML_LCL_TEMP          ML_LFC_TEMP              ML_MIXR 
#>         15.250000000         15.250000000         13.048747763 
#>             LR_0500m              LR_01km              LR_02km 
#>        -10.000000000        -10.000000000        -10.000000000 
#>              LR_03km              LR_04km              LR_06km 
#>         -9.047619048         -7.857142857         -6.666666667 
#>              LR_16km              LR_26km              LR_24km 
#>         -6.000000000         -5.000000000         -5.767195767 
#>              LR_36km          LR_26km_MAX         LR_500700hPa 
#>         -4.285714286         -5.714285714         -4.285714286 
#>         LR_500800hPa         LR_600800hPa             FRZG_HGT 
#>         -5.180722892         -5.833333333       2500.000000000 
#>     FRZG_wetbulb_HGT  HGT_max_thetae_03km  HGT_min_thetae_04km 
#>       2275.000000000          0.000000000       3750.000000000 
#>         Delta_thetae Delta_thetae_min04km          Thetae_01km 
#>         28.069785504         28.834554624        330.532272184 
#>          Thetae_02km                DCAPE   Cold_Pool_Strength 
#>        323.619051941        598.310049405         12.632184321 
#>           Wind_Index           PRCP_WATER   Moisture_Flux_02km 
#>         33.906407176         27.104631918         30.425480722 
#>              RH_01km              RH_02km              RH_14km 
#>          0.729103473          0.719706866          0.645204350 
#>              RH_25km              RH_36km               RH_HGL 
#>          0.555017886          0.443603638          0.460317694 
#>             BS_0500m              BS_01km              BS_02km 
#>          1.917219591          3.834439182          8.782108409 
#>              BS_03km              BS_06km              BS_08km 
#>         12.655968060         18.005540000         17.407678201 
#>              BS_36km              BS_26km              BS_16km 
#>          9.369289559         13.330420492         16.647826116 
#>              BS_18km            BS_EFF_MU            BS_EFF_SB 
#>         20.279072460         14.223187917         14.223187917 
#>            BS_EFF_ML        BS_SFC_to_M10        BS_1km_to_M10 
#>         13.896750821         15.510376997         13.649859352 
#>        BS_2km_to_M10     BS_MU_LFC_to_M10     BS_SB_LFC_to_M10 
#>          9.883032095         14.073701016         14.073701016 
#>     BS_ML_LFC_to_M10        BS_MW02_to_SM        BS_MW02_to_RM 
#>         13.686365658          7.304027597         10.140964728 
#>        BS_MW02_to_LM         BS_HGL_to_SM         BS_HGL_to_RM 
#>         10.786958453          4.893411960          7.785950290 
#>         BS_HGL_to_LM             MW_0500m              MW_01km 
#>          9.988490342          2.308638103          2.425112273 
#>              MW_02km              MW_03km              MW_06km 
#>          3.347646594          4.800331697          7.810700539 
#>              MW_13km          SRH_100m_RM          SRH_250m_RM 
#>          6.838886565          4.253473515         10.053664673 
#>          SRH_500m_RM           SRH_1km_RM           SRH_3km_RM 
#>         19.720649935         39.634639574        152.521946573 
#>          SRH_36km_RM          SRH_100m_LM          SRH_250m_LM 
#>        236.590130791          1.502688386          3.551808913 
#>          SRH_500m_LM           SRH_1km_LM           SRH_3km_LM 
#>          6.967009791         14.002323601        -13.130823085 
#>          SRH_36km_LM           SV_500m_RM           SV_01km_RM 
#>        -24.378976558          0.003904164          0.003879744 
#>           SV_03km_RM           SV_500m_LM           SV_01km_LM 
#>          0.004796086          0.001013916          0.001100521 
#>           SV_03km_LM        MW_SR_500m_RM        MW_SR_01km_RM 
#>         -0.001435868         10.086252358         10.150075094 
#>        MW_SR_03km_RM        MW_SR_500m_LM        MW_SR_01km_LM 
#>          9.535939066         13.782126361         12.858486067 
#>        MW_SR_03km_LM     MW_SR_VM_500m_RM     MW_SR_VM_01km_RM 
#>          8.457941382         10.107849533         10.225339777 
#>     MW_SR_VM_03km_RM     MW_SR_VM_500m_LM     MW_SR_VM_01km_LM 
#>         10.535820052         13.764654240         12.837090856 
#>     MW_SR_VM_03km_LM       SV_FRA_500m_RM       SV_FRA_01km_RM 
#>          8.834244774          0.998219354          0.987136746 
#>       SV_FRA_03km_RM       SV_FRA_500m_LM       SV_FRA_01km_LM 
#>          0.956008752          0.259238846          0.280009490 
#>       SV_FRA_03km_LM         Bunkers_RM_A         Bunkers_RM_M 
#>         -0.286213018        209.404566875          7.793284819 
#>         Bunkers_LM_A         Bunkers_LM_M         Bunkers_MW_A 
#>        122.058537262         13.182518634        151.949436108 
#>         Bunkers_MW_M   Corfidi_downwind_A   Corfidi_downwind_M 
#>          7.810700539        218.695496108         14.698235841 
#>     Corfidi_upwind_A     Corfidi_upwind_M              K_Index 
#>        231.328321825          9.179441145         24.354838710 
#>      Showalter_Index    TotalTotals_Index          SWEAT_Index 
#>          3.750147453         44.354838710        106.416793661 
#>              STP_fix              STP_new           STP_fix_LM 
#>          0.359981513          0.200492750          0.127176069 
#>           STP_new_LM              SCP_fix              SCP_new 
#>          0.070831081          6.233760868          4.924259548 
#>           SCP_fix_LM           SCP_new_LM                 SHIP 
#>         -0.536673003         -0.423936243          0.628661858 
#>                  HSI                  DCP         MU_WMAXSHEAR 
#>          1.715903102          1.150670745       1213.184834430 
#>         SB_WMAXSHEAR         ML_WMAXSHEAR     MU_EFF_WMAXSHEAR 
#>       1213.184834430       1033.105080761        958.335927637 
#>     SB_EFF_WMAXSHEAR     ML_EFF_WMAXSHEAR             EHI_500m 
#>        958.335927637        797.354807442          0.279777567 
#>             EHI_01km             EHI_03km          EHI_500m_LM 
#>          0.562298052          2.163834321          0.098841218 
#>          EHI_01km_LM          EHI_03km_LM              SHERBS3 
#>          0.198651467         -0.186287458          0.648168875 
#>               SHERBE           SHERBS3_v2            SHERBE_v2 
#>          0.701454223          0.864225167          0.935272297 
#>                  DEI              DEI_eff                  TIP 
#>          1.519761039          1.188457460          2.435630415

Example 4

Download sounding and draw hodograph:

data("northplatte")
sounding_hodograph(ws = northplatte$ws, wd = northplatte$wd, 
                   altitude = northplatte$altitude,max_speed = 40)
title("North Platte - 03.07.1999, 00:00 UTC")

Example 5 - thunder in Python

It is possible to launch thunder under Python via rpy2 library. Below you can find the minimum reproducible example. Make sure that pandas and rpy2 libraries are available for your Python environment. If not install required python packages with pip install pandas and pip install rpy2

Launch thunder under Python with rpy2 and numpy:

### load required packages
#> from rpy2.robjects.packages import importr
#> from rpy2.robjects import r,pandas2ri
#> import rpy2.robjects as robjects
#> pandas2ri.activate()

### load thunder package (make sure that it was installed in R before)
#> importr('thunder')

### download North Platte sounding 
#> profile = robjects.r['get_sounding'](wmo_id = 72562, yy = 1999, mm = 7, dd = 3,hh = 0)

### compute convective parameters
#> parameters = robjects.r['sounding_compute'](profile['pressure'], profile['altitude'], #> profile['temp'], profile['dpt'], profile['wd'], profile['ws'], accuracy = 2)


### customize output and print all computed variables, e.g. most-unstable CAPE (first element) equals 9413 J/kg

#> print(list(map('{:.2f}'.format, parameters)))
# '9413.29', '233.35', '1713.74', '0.00', '775.00', '775.00', '15500.00', '-16.55', 
# '137.21', '-66.63', '23.98', '23.98', '23.36', '9413.29', '233.35', '1713.74', '0.00', 
# '775.00', '775.00', '15500.00', '-16.55', '137.21', '-66.63', '23.98', '23.98', '23.36',
# '7805.13', '115.22', '1515.81', '-4.35', '950.00', '950.00', '15000.00', '-14.66', 
# '124.94', '-68.41', '22.46', '22.46', '21.17', '-9.57', '-6.68', '-8.80', '-8.68', 
# '-9.06', '-7.70', '4250.00', '3500.00', '0.00', '2866.00', '50.57', '52.93', '1381.81', 
# '308.98', '29.00', '37.59', '87.03', '0.58', '0.40', '0.47', '8.85', '11.21', '13.88', 
# '20.28', '29.33', '6.84', '21.70', '28.32', '28.32', '27.17', '17.06', '12.53', '12.53',
# '11.74', '7.09', '6.08', '7.77', '7.69', '19.89', '62.07', '110.06', '156.48', '6.25', 
# '7.77', '4.26', '-42.78', '284.67', '5.65', '197.60', '14.19', '218.89', '7.77',
# '31.50', '-12.14', '60.40', '677.12', '4.67', '6.10', '29.46', '29.46', '3.86', '12.35',
# '2783.07', '2783.07', '2534.22', '3886.07', '3886.07', '3395.00']

Important notes

  • Remember to always input wind speed data in knots.
  • Script will always consider first height level as the surface (h = 0), therefore input height data can be as above sea level (ASL) or above ground level (AGL).
  • For efficiency purposes it is highly recommended to input data for a maximum of 16-18 km AGL or lower.
  • Values of parameters will be different for different accuracy settings.