16
16
fetch_gfs_file_return_dataset ,
17
17
fetch_hiresw_file_return_dataset ,
18
18
fetch_nam_file_return_dataset ,
19
- fetch_noaaruc_sounding ,
20
19
fetch_open_elevation ,
21
20
fetch_rap_file_return_dataset ,
22
21
fetch_wyoming_sounding ,
@@ -142,11 +141,11 @@ class Environment:
142
141
Environment.atmospheric_model_type : string
143
142
Describes the atmospheric model which is being used. Can only assume the
144
143
following values: ``standard_atmosphere``, ``custom_atmosphere``,
145
- ``wyoming_sounding``, ``NOAARucSounding``, `` Forecast``, ``Reanalysis``,
144
+ ``wyoming_sounding``, ``Forecast``, ``Reanalysis``,
146
145
``Ensemble``.
147
146
Environment.atmospheric_model_file : string
148
147
Address of the file used for the atmospheric model being used. Only
149
- defined for ``wyoming_sounding``, ``NOAARucSounding``, `` Forecast``,
148
+ defined for ``wyoming_sounding``, ``Forecast``,
150
149
``Reanalysis``, ``Ensemble``
151
150
Environment.atmospheric_model_dict : dictionary
152
151
Dictionary used to properly interpret ``netCDF`` and ``OPeNDAP`` files.
@@ -1053,24 +1052,6 @@ def set_atmospheric_model( # pylint: disable=too-many-statements
1053
1052
1054
1053
.. _weather.uwyo: http://weather.uwyo.edu/upperair/sounding.html
1055
1054
1056
- - ``NOAARucSounding``: sets pressure, temperature, wind-u
1057
- and wind-v profiles and surface elevation obtained from
1058
- an upper air sounding given by the file parameter through
1059
- an URL. This URL should point to a data webpage obtained
1060
- through NOAA's Ruc Sounding servers, which can be accessed
1061
- in `rucsoundings`_. Selecting ROABs as the
1062
- initial data source, specifying the station through it's
1063
- WMO-ID and opting for the ASCII (GSD format) button, the
1064
- following example URL opens up:
1065
-
1066
- https://rucsoundings.noaa.gov/get_raobs.cgi?data_source=RAOB&latest=latest&start_year=2019&start_month_name=Feb&start_mday=5&start_hour=12&start_min=0&n_hrs=1.0&fcst_len=shortest&airport=83779&text=Ascii%20text%20%28GSD%20format%29&hydrometeors=false&start=latest
1067
-
1068
- Any ASCII GSD format page from this server can be read,
1069
- so information from virtual soundings such as GFS and NAM
1070
- can also be imported.
1071
-
1072
- .. _rucsoundings: https://rucsoundings.noaa.gov/
1073
-
1074
1055
- ``windy_atmosphere``: sets pressure, temperature, wind-u and
1075
1056
wind-v profiles and surface elevation obtained from the Windy API.
1076
1057
See file argument to specify the model as either ``ECMWF``,
@@ -1279,8 +1260,6 @@ def set_atmospheric_model( # pylint: disable=too-many-statements
1279
1260
self .process_standard_atmosphere ()
1280
1261
elif type == "wyoming_sounding" :
1281
1262
self .process_wyoming_sounding (file )
1282
- elif type == "noaarucsounding" :
1283
- self .process_noaaruc_sounding (file )
1284
1263
elif type == "custom_atmosphere" :
1285
1264
self .process_custom_atmosphere (pressure , temperature , wind_u , wind_v )
1286
1265
elif type == "windy" :
@@ -1334,7 +1313,7 @@ def process_standard_atmosphere(self):
1334
1313
self .__set_wind_speed_function (0 )
1335
1314
1336
1315
# 80k meters is the limit of the standard atmosphere
1337
- self .max_expected_height = 80000
1316
+ self ._max_expected_height = 80000
1338
1317
1339
1318
def process_custom_atmosphere (
1340
1319
self , pressure = None , temperature = None , wind_u = 0 , wind_v = 0
@@ -1411,7 +1390,7 @@ def process_custom_atmosphere(
1411
1390
None
1412
1391
"""
1413
1392
# Initialize an estimate of the maximum expected atmospheric model height
1414
- max_expected_height = 1000
1393
+ max_expected_height = self . max_expected_height or 1000
1415
1394
1416
1395
# Save pressure profile
1417
1396
if pressure is None :
@@ -1455,7 +1434,7 @@ def wind_heading_func(h): # TODO: create another custom reset for heading
1455
1434
self .__reset_wind_direction_function ()
1456
1435
self .__reset_wind_speed_function ()
1457
1436
1458
- self .max_expected_height = max_expected_height
1437
+ self ._max_expected_height = max_expected_height
1459
1438
1460
1439
def process_windy_atmosphere (
1461
1440
self , model = "ECMWF"
@@ -1530,7 +1509,7 @@ def process_windy_atmosphere(
1530
1509
self .__set_wind_speed_function (data_array [:, (1 , 7 )])
1531
1510
1532
1511
# Save maximum expected height
1533
- self .max_expected_height = max (altitude_array [0 ], altitude_array [- 1 ])
1512
+ self ._max_expected_height = max (altitude_array [0 ], altitude_array [- 1 ])
1534
1513
1535
1514
# Get elevation data from file
1536
1515
self .elevation = float (response ["header" ]["elevation" ])
@@ -1668,7 +1647,7 @@ def process_wyoming_sounding(self, file): # pylint: disable=too-many-statements
1668
1647
)
1669
1648
1670
1649
# Save maximum expected height
1671
- self .max_expected_height = data_array [- 1 , 1 ]
1650
+ self ._max_expected_height = data_array [- 1 , 1 ]
1672
1651
1673
1652
def process_noaaruc_sounding (self , file ): # pylint: disable=too-many-statements
1674
1653
"""Import and process the upper air sounding data from `NOAA
@@ -1689,107 +1668,18 @@ def process_noaaruc_sounding(self, file): # pylint: disable=too-many-statements
1689
1668
1690
1669
See also
1691
1670
--------
1692
- More details can be found at: https://rucsoundings.noaa.gov/ .
1671
+ This method is deprecated and will be fully deleted in version 1.8.0 .
1693
1672
1694
1673
Returns
1695
1674
-------
1696
1675
None
1697
1676
"""
1698
- # Request NOAA Ruc Sounding from file url
1699
- response = fetch_noaaruc_sounding (file )
1700
-
1701
- # Split response into lines
1702
- lines = response .text .split ("\n " )
1703
-
1704
- # Process GSD format (https://rucsoundings.noaa.gov/raob_format.html)
1705
-
1706
- # Extract elevation data
1707
- for line in lines :
1708
- # Split line into columns
1709
- columns = re .split (" +" , line )[1 :]
1710
- if len (columns ) > 0 :
1711
- if columns [0 ] == "1" and columns [5 ] != "99999" :
1712
- # Save elevation
1713
- self .elevation = float (columns [5 ])
1714
- else :
1715
- # No elevation data available
1716
- pass
1717
-
1718
- pressure_array = []
1719
- barometric_height_array = []
1720
- temperature_array = []
1721
- wind_speed_array = []
1722
- wind_direction_array = []
1723
-
1724
- for line in lines :
1725
- # Split line into columns
1726
- columns = re .split (" +" , line )[1 :]
1727
- if len (columns ) < 6 :
1728
- # skip lines with less than 6 columns
1729
- continue
1730
- if columns [0 ] in ["4" , "5" , "6" , "7" , "8" , "9" ]:
1731
- # Convert columns to floats
1732
- columns = np .array (columns , dtype = float )
1733
- # Select relevant columns
1734
- altitude , pressure , temperature , wind_direction , wind_speed = columns [
1735
- [2 , 1 , 3 , 5 , 6 ]
1736
- ]
1737
- # Check for missing values
1738
- if altitude == 99999 :
1739
- continue
1740
- # Save values only if they are not missing
1741
- if pressure != 99999 :
1742
- pressure_array .append ([altitude , pressure ])
1743
- barometric_height_array .append ([pressure , altitude ])
1744
- if temperature != 99999 :
1745
- temperature_array .append ([altitude , temperature ])
1746
- if wind_direction != 99999 :
1747
- wind_direction_array .append ([altitude , wind_direction ])
1748
- if wind_speed != 99999 :
1749
- wind_speed_array .append ([altitude , wind_speed ])
1750
-
1751
- # Convert lists to arrays
1752
- pressure_array = np .array (pressure_array )
1753
- barometric_height_array = np .array (barometric_height_array )
1754
- temperature_array = np .array (temperature_array )
1755
- wind_speed_array = np .array (wind_speed_array )
1756
- wind_direction_array = np .array (wind_direction_array )
1757
-
1758
- # Converts 10*hPa to Pa and save values
1759
- pressure_array [:, 1 ] = 10 * pressure_array [:, 1 ]
1760
- self .__set_pressure_function (pressure_array )
1761
- # Converts 10*hPa to Pa and save values
1762
- barometric_height_array [:, 0 ] = 10 * barometric_height_array [:, 0 ]
1763
- self .__set_barometric_height_function (barometric_height_array )
1764
-
1765
- # Convert C to K and save values
1766
- temperature_array [:, 1 ] = temperature_array [:, 1 ] / 10 + 273.15
1767
- self .__set_temperature_function (temperature_array )
1768
-
1769
- # Process wind-u and wind-v
1770
- # Converts Knots to m/s
1771
- wind_speed_array [:, 1 ] = wind_speed_array [:, 1 ] * 1.852 / 3.6
1772
- wind_heading_array = wind_direction_array [:, :] * 1
1773
- # Convert wind direction to wind heading
1774
- wind_heading_array [:, 1 ] = (wind_direction_array [:, 1 ] + 180 ) % 360
1775
- wind_u = wind_speed_array [:, :] * 1
1776
- wind_v = wind_speed_array [:, :] * 1
1777
- wind_u [:, 1 ] = wind_speed_array [:, 1 ] * np .sin (
1778
- np .deg2rad (wind_heading_array [:, 1 ])
1779
- )
1780
- wind_v [:, 1 ] = wind_speed_array [:, 1 ] * np .cos (
1781
- np .deg2rad (wind_heading_array [:, 1 ])
1677
+ warnings .warn (
1678
+ "NOAA RUC models are no longer available. "
1679
+ "This method is deprecated and will be fully deleted in version 1.8.0." ,
1680
+ DeprecationWarning ,
1782
1681
)
1783
-
1784
- # Save wind data
1785
- self .__set_wind_direction_function (wind_direction_array )
1786
- self .__set_wind_heading_function (wind_heading_array )
1787
- self .__set_wind_speed_function (wind_speed_array )
1788
- self .__set_wind_velocity_x_function (wind_u )
1789
- self .__set_wind_velocity_y_function (wind_v )
1790
-
1791
- # Save maximum expected height
1792
- self .max_expected_height = pressure_array [- 1 , 0 ]
1682
+ return file
1793
1683
1794
1684
def process_forecast_reanalysis (
1795
1685
self , file , dictionary
@@ -2009,7 +1899,7 @@ def process_forecast_reanalysis(
2009
1899
self .__set_wind_speed_function (data_array [:, (1 , 7 )])
2010
1900
2011
1901
# Save maximum expected height
2012
- self .max_expected_height = max (height [0 ], height [- 1 ])
1902
+ self ._max_expected_height = max (height [0 ], height [- 1 ])
2013
1903
2014
1904
# Get elevation data from file
2015
1905
if dictionary ["surface_geopotential_height" ] is not None :
@@ -2354,7 +2244,7 @@ def select_ensemble_member(self, member=0):
2354
2244
self .__set_wind_speed_function (data_array [:, (1 , 7 )])
2355
2245
2356
2246
# Save other attributes
2357
- self .max_expected_height = max (height [0 ], height [- 1 ])
2247
+ self ._max_expected_height = max (height [0 ], height [- 1 ])
2358
2248
self .ensemble_member = member
2359
2249
2360
2250
# Update air density, speed of sound and dynamic viscosity
0 commit comments