cloudnetpy 1.92.1__tar.gz → 1.92.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {cloudnetpy-1.92.1/cloudnetpy.egg-info → cloudnetpy-1.92.2}/PKG-INFO +1 -1
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/weather_station.py +50 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/plotting/plot_meta.py +3 -2
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/plotting/plotting.py +1 -2
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/products/der.py +44 -36
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/products/epsilon_radar.py +7 -9
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/version.py +1 -1
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2/cloudnetpy.egg-info}/PKG-INFO +1 -1
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/LICENSE +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/MANIFEST.in +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/README.md +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/__init__.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/__init__.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/atmos_utils.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/attenuation.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/attenuations/__init__.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/attenuations/gas_attenuation.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/attenuations/liquid_attenuation.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/attenuations/melting_attenuation.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/attenuations/rain_attenuation.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/categorize.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/classify.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/containers.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/disdrometer.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/droplet.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/falling.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/freezing.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/insects.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/lidar.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/melting.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/model.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/mwr.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/radar.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/cli.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/cloudnetarray.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/concat_lib.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/constants.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/datasource.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/disdronator/__init__.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/disdronator/lpm.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/disdronator/parsivel.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/disdronator/rd80.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/disdronator/utils.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/exceptions.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/__init__.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/basta.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/bowtie.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/ceilo.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/ceilometer.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/cl61d.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/cloudnet_instrument.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/copernicus.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/da10.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/disdrometer/__init__.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/disdrometer/common.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/disdrometer/parsivel.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/disdrometer/rd80.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/disdrometer/thies.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/fd12p.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/galileo.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/hatpro.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/instruments.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/lufft.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/mira.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/mrr.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/nc_lidar.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/nc_radar.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/pollyxt.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/radiometrics.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/rain_e_h3.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/rpg.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/rpg_reader.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/toa5.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/vaisala.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/instruments/weather_radar.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/metadata.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/__init__.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/file_handler.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/metadata.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/model_metadata.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/plotting/__init__.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/plotting/plot_meta.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/plotting/plot_tools.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/plotting/plotting.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/products/__init__.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/products/advance_methods.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/products/grid_methods.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/products/model_products.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/products/observation_products.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/products/product_resampling.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/products/tools.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/statistics/__init__.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/statistics/statistical_methods.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/__init__.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/e2e/__init__.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/e2e/conftest.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/e2e/process_cf/__init__.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/e2e/process_cf/main.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/e2e/process_cf/tests.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/__init__.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/main.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/tests.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/__init__.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/main.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/tests.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/unit/__init__.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/unit/conftest.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/unit/test_advance_methods.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/unit/test_grid_methods.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/unit/test_model_products.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/unit/test_observation_products.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/unit/test_plot_tools.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/unit/test_plotting.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/unit/test_statistical_methods.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/unit/test_tools.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/utils.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/output.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/plotting/__init__.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/products/__init__.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/products/classification.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/products/drizzle.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/products/drizzle_error.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/products/drizzle_tools.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/products/epsilon_lidar.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/products/ier.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/products/iwc.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/products/lwc.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/products/mie_lu_tables.nc +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/products/mwr_tools.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/products/product_tools.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/py.typed +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/utils.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy.egg-info/SOURCES.txt +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy.egg-info/dependency_links.txt +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy.egg-info/entry_points.txt +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy.egg-info/requires.txt +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy.egg-info/top_level.txt +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/docs/source/conf.py +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/pyproject.toml +0 -0
- {cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/setup.cfg +0 -0
|
@@ -76,6 +76,8 @@ def ws2nc(
|
|
|
76
76
|
ws = MaidoWS(weather_station_file, site_meta)
|
|
77
77
|
elif site_meta["name"] == "Cluj-Napoca":
|
|
78
78
|
ws = ClujWS(weather_station_file, site_meta)
|
|
79
|
+
elif site_meta["name"] == "Falkenberg":
|
|
80
|
+
ws = FalkenbergWS(weather_station_file, site_meta)
|
|
79
81
|
else:
|
|
80
82
|
msg = "Unsupported site"
|
|
81
83
|
raise ValueError(msg)
|
|
@@ -824,6 +826,54 @@ class ClujWS(WS):
|
|
|
824
826
|
) # mm/10min => m/s
|
|
825
827
|
|
|
826
828
|
|
|
829
|
+
class FalkenbergWS(WS):
|
|
830
|
+
def __init__(self, filenames: Sequence[str | PathLike], site_meta: dict) -> None:
|
|
831
|
+
if len(filenames) != 1:
|
|
832
|
+
raise ValueError
|
|
833
|
+
super().__init__(site_meta)
|
|
834
|
+
self.filename = filenames[0]
|
|
835
|
+
self._data = self._read_data()
|
|
836
|
+
|
|
837
|
+
def _read_data(self) -> dict:
|
|
838
|
+
keymap = {
|
|
839
|
+
"TIMESTAMP": "time",
|
|
840
|
+
"WS500_air_temperature": "air_temperature",
|
|
841
|
+
"WS500_relative_humidity": "relative_humidity",
|
|
842
|
+
"WS500_absolute_air_pressure": "air_pressure",
|
|
843
|
+
"WS500_wind_speed_avg": "wind_speed",
|
|
844
|
+
"WS500_wind_direction_avg": "wind_direction",
|
|
845
|
+
}
|
|
846
|
+
expected_units = {
|
|
847
|
+
"WS500_air_temperature": "degC",
|
|
848
|
+
"WS500_relative_humidity": "%",
|
|
849
|
+
"WS500_absolute_air_pressure": "hPa",
|
|
850
|
+
"WS500_wind_speed_avg": "m s-1",
|
|
851
|
+
"WS500_wind_direction_avg": "deg",
|
|
852
|
+
}
|
|
853
|
+
units, _process, rows = read_toa5(self.filename)
|
|
854
|
+
for key in units:
|
|
855
|
+
if key in expected_units and expected_units[key] != units[key]:
|
|
856
|
+
msg = (
|
|
857
|
+
f"Expected {key} to have units {expected_units[key]},"
|
|
858
|
+
f" got {units[key]} instead"
|
|
859
|
+
)
|
|
860
|
+
raise ValueError(msg)
|
|
861
|
+
|
|
862
|
+
data: dict[str, list] = {keymap[key]: [] for key in units if key in keymap}
|
|
863
|
+
for row in rows:
|
|
864
|
+
for key, value in row.items():
|
|
865
|
+
if key not in keymap:
|
|
866
|
+
continue
|
|
867
|
+
parsed = value
|
|
868
|
+
if keymap[key] != "time":
|
|
869
|
+
try:
|
|
870
|
+
parsed = float(value)
|
|
871
|
+
except ValueError:
|
|
872
|
+
parsed = math.nan
|
|
873
|
+
data[keymap[key]].append(parsed)
|
|
874
|
+
return self.format_data(data)
|
|
875
|
+
|
|
876
|
+
|
|
827
877
|
ATTRIBUTES = {
|
|
828
878
|
"visibility": MetaData(
|
|
829
879
|
long_name="Meteorological optical range (MOR) visibility",
|
|
@@ -317,7 +317,7 @@ ATTRIBUTES = {
|
|
|
317
317
|
log_scale=True,
|
|
318
318
|
),
|
|
319
319
|
"N_scaled": PlotMeta(
|
|
320
|
-
plot_range=(1.
|
|
320
|
+
plot_range=(1.0e6, 1.0e9),
|
|
321
321
|
log_scale=True,
|
|
322
322
|
),
|
|
323
323
|
"der_error": PlotMeta(
|
|
@@ -414,6 +414,7 @@ ATTRIBUTES = {
|
|
|
414
414
|
"cloud_fraction": PlotMeta(
|
|
415
415
|
cmap="Blues",
|
|
416
416
|
plot_range=(0, 1),
|
|
417
|
+
mask_zeros=True,
|
|
417
418
|
),
|
|
418
419
|
"Tw": PlotMeta(
|
|
419
420
|
cmap="RdBu_r",
|
|
@@ -428,7 +429,7 @@ ATTRIBUTES = {
|
|
|
428
429
|
plot_range=(1e-5, 1e-2),
|
|
429
430
|
log_scale=True,
|
|
430
431
|
),
|
|
431
|
-
"rh": PlotMeta(plot_range=(0,
|
|
432
|
+
"rh": PlotMeta(plot_range=(0, 120)),
|
|
432
433
|
"number_concentration": PlotMeta(
|
|
433
434
|
plot_range=(1e-2, 1e3), log_scale=True, mask_zeros=True
|
|
434
435
|
),
|
|
@@ -410,6 +410,7 @@ class Plot:
|
|
|
410
410
|
"precipitation_rate": (multiply, 3600000, "mm h$^{-1}$"),
|
|
411
411
|
"air_pressure": (multiply, 0.01, "hPa"),
|
|
412
412
|
"relative_humidity": (multiply, 100, "%"),
|
|
413
|
+
"rh": (multiply, 100, "%"),
|
|
413
414
|
"rainfall_amount": (multiply, 1000, "mm"),
|
|
414
415
|
"snowfall_amount": (multiply, 1000, "mm"),
|
|
415
416
|
"precipitation_amount": (multiply, 1000, "mm"),
|
|
@@ -635,8 +636,6 @@ class Plot2D(Plot):
|
|
|
635
636
|
else:
|
|
636
637
|
min_x, max_x = 0, 24
|
|
637
638
|
self._mark_gaps(figure_data, min_x=min_x, max_x=max_x)
|
|
638
|
-
if self.sub_plot.variable.name == "cloud_fraction":
|
|
639
|
-
self._data[self._data == 0] = ma.masked
|
|
640
639
|
if any(
|
|
641
640
|
key in self.sub_plot.variable.name for key in ("status", "classification")
|
|
642
641
|
):
|
|
@@ -24,11 +24,11 @@ from cloudnetpy.products.product_tools import (
|
|
|
24
24
|
|
|
25
25
|
class Parameters(NamedTuple):
|
|
26
26
|
ddBZ: float
|
|
27
|
-
N: float
|
|
28
|
-
dN: float
|
|
27
|
+
N: float # m-3
|
|
28
|
+
dN: float # m-3
|
|
29
29
|
sigma_x: float
|
|
30
30
|
dsigma_x: float
|
|
31
|
-
dQ: float
|
|
31
|
+
dQ: float # kg m-2
|
|
32
32
|
|
|
33
33
|
|
|
34
34
|
def generate_der(
|
|
@@ -76,8 +76,8 @@ def generate_der(
|
|
|
76
76
|
der_source.append_der()
|
|
77
77
|
der_source.append_retrieval_status(droplet_classification)
|
|
78
78
|
date = der_source.get_date()
|
|
79
|
-
attributes = output.add_time_attribute(
|
|
80
|
-
attributes =
|
|
79
|
+
attributes = output.add_time_attribute(DER_ATTRIBUTES, date)
|
|
80
|
+
attributes = _add_der_error_comments(attributes, der_source)
|
|
81
81
|
output.update_attributes(der_source.data, attributes)
|
|
82
82
|
output.save_product_file("der", der_source, output_file, uuid)
|
|
83
83
|
return uuid
|
|
@@ -132,7 +132,7 @@ class DerSource(DataSource):
|
|
|
132
132
|
def append_der(self) -> None:
|
|
133
133
|
"""Estimate liquid droplet effective radius using Frisch et al. 2002."""
|
|
134
134
|
params = self.parameters
|
|
135
|
-
rho_l = 1000 # density of liquid water(kg m-3)
|
|
135
|
+
rho_l = 1000 # density of liquid water (kg m-3)
|
|
136
136
|
|
|
137
137
|
var_x = params.sigma_x * params.sigma_x
|
|
138
138
|
|
|
@@ -140,7 +140,7 @@ class DerSource(DataSource):
|
|
|
140
140
|
Z = utils.db2lin(Z)
|
|
141
141
|
dZ = ma.abs(utils.db2lin(params.ddBZ)) * Z
|
|
142
142
|
|
|
143
|
-
lwp = self.getvar("lwp")
|
|
143
|
+
lwp = self.getvar("lwp") # kg m-2
|
|
144
144
|
lwp[lwp < 0] = 0
|
|
145
145
|
|
|
146
146
|
der = np.zeros(Z.shape)
|
|
@@ -172,7 +172,7 @@ class DerSource(DataSource):
|
|
|
172
172
|
# der formula (5)
|
|
173
173
|
A = (Z[ind_t, idx_layer] / params.N) ** (1 / 6)
|
|
174
174
|
B = ma.exp(-0.5 * var_x)
|
|
175
|
-
der[ind_t, idx_layer] = 0.5 * A * B
|
|
175
|
+
der[ind_t, idx_layer] = 0.5 * A * B # mm
|
|
176
176
|
|
|
177
177
|
# der error formula (7)
|
|
178
178
|
A = params.dN / (6 * params.N)
|
|
@@ -180,26 +180,28 @@ class DerSource(DataSource):
|
|
|
180
180
|
C = dZ[ind_t, idx_layer] / (6 * Z[ind_t, idx_layer])
|
|
181
181
|
der_error[ind_t, idx_layer] = der[ind_t, idx_layer] * ma.sqrt(
|
|
182
182
|
A * A + B * B + C * C,
|
|
183
|
-
)
|
|
183
|
+
) # mm
|
|
184
184
|
|
|
185
185
|
# der scaled formula (6)
|
|
186
186
|
A = Z[ind_t, idx_layer] ** (1 / 6) / (2 * lwp[ind_t] ** (1 / 3))
|
|
187
187
|
B = (np.pi * rho_l / 6) ** (1 / 3)
|
|
188
188
|
C = integral ** (1 / 3) * ma.exp(-2 * var_x)
|
|
189
|
-
der_scaled[ind_t, idx_layer] = 1.0e-3 * A * B * C
|
|
189
|
+
der_scaled[ind_t, idx_layer] = 1.0e-3 * A * B * C # μm => mm
|
|
190
190
|
|
|
191
|
-
# der scaled formula (
|
|
191
|
+
# solve N in der formula (5) assuming rₑ from der scaled formula (6)
|
|
192
192
|
N_scaled[ind_t, idx_layer] = Z[ind_t, idx_layer] / (
|
|
193
193
|
((2 * der_scaled[ind_t, idx_layer]) / (ma.exp(-0.5 * var_x))) ** 6
|
|
194
|
-
)
|
|
194
|
+
) # m-3
|
|
195
|
+
|
|
196
|
+
# der scaled error formula (9)
|
|
195
197
|
A = dZ[ind_t, idx_layer] / (6 * Z[ind_t, idx_layer])
|
|
196
198
|
B = 4 * params.sigma_x * params.dsigma_x
|
|
197
199
|
C = params.dQ / (3 * lwp[ind_t])
|
|
198
200
|
der_scaled_error[ind_t, idx_layer] = der_scaled[ind_t, idx_layer] * ma.sqrt(
|
|
199
201
|
A * A + B * B + C * C,
|
|
200
|
-
)
|
|
202
|
+
) # mm
|
|
201
203
|
|
|
202
|
-
N_scaled = ma.masked_less_equal(ma.masked_invalid(N_scaled), 0.0)
|
|
204
|
+
N_scaled = ma.masked_less_equal(ma.masked_invalid(N_scaled), 0.0)
|
|
203
205
|
der = ma.masked_less_equal(ma.masked_invalid(der), 0.0) * 1.0e-3
|
|
204
206
|
der_error = ma.masked_less_equal(ma.masked_invalid(der_error), 0.0) * 1.0e-3
|
|
205
207
|
der_scaled = ma.masked_less_equal(ma.masked_invalid(der_scaled), 0.0) * 1.0e-3
|
|
@@ -263,22 +265,20 @@ COMMENTS = {
|
|
|
263
265
|
),
|
|
264
266
|
"der": (
|
|
265
267
|
"This variable was calculated for the profiles where the categorization\n"
|
|
266
|
-
"data has diagnosed that liquid water is present
|
|
267
|
-
"effective radius is calculated
|
|
268
|
-
"with
|
|
269
|
-
"number concentration of the cloud
|
|
268
|
+
"data has diagnosed that liquid water is present. The cloud droplet\n"
|
|
269
|
+
"effective radius is calculated using the method 1 of Frisch et al.\n"
|
|
270
|
+
"(2002), relating Z with effective radius by assuming a lognormal size\n"
|
|
271
|
+
"distribution and its width and the number concentration of the cloud\n"
|
|
272
|
+
"droplets."
|
|
270
273
|
),
|
|
271
274
|
"der_scaled": (
|
|
272
|
-
"This variable was calculated for the profiles where the\n"
|
|
273
|
-
"
|
|
274
|
-
"
|
|
275
|
-
"
|
|
276
|
-
"
|
|
277
|
-
"
|
|
278
|
-
"
|
|
279
|
-
),
|
|
280
|
-
"der_scaled_error": (
|
|
281
|
-
"This variable was calculated for the profiles where the categorization data"
|
|
275
|
+
"This variable was calculated for the profiles where the categorization\n"
|
|
276
|
+
"data has diagnosed that liquid water is present. The cloud droplet\n"
|
|
277
|
+
"effective radius is calculated using the method 2 of Frisch et al.\n"
|
|
278
|
+
"(2002), relating Z with effective radius by assuming a lognormal size\n"
|
|
279
|
+
"distribution and its width. The number concentration required to\n"
|
|
280
|
+
"represent the size distribution is derived by scaling the LWP measured\n"
|
|
281
|
+
"with microwave radiometer over the observed (single) cloud layer."
|
|
282
282
|
),
|
|
283
283
|
"N_scaled": (
|
|
284
284
|
"From scaled Frisch method the cloud droplet number concentration\n"
|
|
@@ -287,21 +287,28 @@ COMMENTS = {
|
|
|
287
287
|
}
|
|
288
288
|
|
|
289
289
|
|
|
290
|
-
def
|
|
290
|
+
def _add_der_error_comments(attributes: dict, der_source: DerSource) -> dict:
|
|
291
291
|
params = der_source.parameters
|
|
292
292
|
attributes["der_error"] = attributes["der_error"]._replace(
|
|
293
293
|
comment="This variable is an estimate of the random error in effective\n"
|
|
294
|
-
f"radius assuming an error in Z of
|
|
295
|
-
f"dN = {params.dN} and in the spectral width
|
|
296
|
-
f"
|
|
294
|
+
f"radius assuming an error in Z of dZ = {params.ddBZ} dBZ, in N of\n"
|
|
295
|
+
f"dN = {params.dN} m-3, and in the spectral width of "
|
|
296
|
+
f"dsigma_x = {params.dsigma_x}."
|
|
297
|
+
)
|
|
298
|
+
attributes["der_scaled_error"] = attributes["der_scaled_error"]._replace(
|
|
299
|
+
comment="This variable is an estimate of the random error in scaled effective\n"
|
|
300
|
+
f"radius assuming an error in Z of dZ = {params.ddBZ} dBZ, in the spectral\n"
|
|
301
|
+
f"width of dsigma_x = {params.dsigma_x}, and in the LWP of dQ = {params.dQ} "
|
|
302
|
+
"kg m-2."
|
|
297
303
|
)
|
|
298
304
|
return attributes
|
|
299
305
|
|
|
300
306
|
|
|
301
|
-
|
|
307
|
+
DER_ATTRIBUTES = {
|
|
302
308
|
"comment": COMMENTS["general"],
|
|
303
309
|
"der": MetaData(
|
|
304
310
|
long_name="Droplet effective radius",
|
|
311
|
+
standard_name="effective_radius_of_cloud_liquid_water_particles",
|
|
305
312
|
units="m",
|
|
306
313
|
ancillary_variables="der_error",
|
|
307
314
|
comment=COMMENTS["der"],
|
|
@@ -315,6 +322,7 @@ REFF_ATTRIBUTES = {
|
|
|
315
322
|
),
|
|
316
323
|
"der_scaled": MetaData(
|
|
317
324
|
long_name="Droplet effective radius (scaled to LWP)",
|
|
325
|
+
standard_name="effective_radius_of_cloud_liquid_water_particles",
|
|
318
326
|
units="m",
|
|
319
327
|
ancillary_variables="der_scaled_error",
|
|
320
328
|
comment=COMMENTS["der_scaled"],
|
|
@@ -323,13 +331,13 @@ REFF_ATTRIBUTES = {
|
|
|
323
331
|
"der_scaled_error": MetaData(
|
|
324
332
|
long_name="Absolute error in droplet effective radius (scaled to LWP)",
|
|
325
333
|
units="m",
|
|
326
|
-
comment=
|
|
334
|
+
comment="",
|
|
327
335
|
dimensions=("time", "height"),
|
|
328
336
|
),
|
|
329
337
|
"N_scaled": MetaData(
|
|
330
338
|
long_name="Cloud droplet number concentration",
|
|
331
|
-
|
|
332
|
-
|
|
339
|
+
standard_name="number_concentration_of_cloud_liquid_water_particles_in_air",
|
|
340
|
+
units="m-3",
|
|
333
341
|
comment=COMMENTS["N_scaled"],
|
|
334
342
|
dimensions=("time", "height"),
|
|
335
343
|
),
|
|
@@ -44,17 +44,15 @@ def generate_epsilon_from_radar(
|
|
|
44
44
|
>>> generate_epsilon_from_radar('radar.nc', 'ecmwf.nc', 'epsilon.nc')
|
|
45
45
|
|
|
46
46
|
References:
|
|
47
|
-
Griesche
|
|
48
|
-
Velasco, C., Bühl, J., Engelmann, R., Radenz, M., Zhenping, Y., and
|
|
49
|
-
Macke, A. (2020): Application of the shipborne remote sensing
|
|
47
|
+
Griesche et al. (2020). Application of the shipborne remote sensing
|
|
50
48
|
supersite OCEANET for profiling of Arctic aerosols and clouds during
|
|
51
|
-
Polarstern cruise PS106
|
|
52
|
-
https://doi.org/10.5194/amt-13-5335-2020
|
|
49
|
+
Polarstern cruise PS106. Atmos. Meas. Tech., 13(10), 5335-5358.
|
|
50
|
+
https://doi.org/10.5194/amt-13-5335-2020
|
|
51
|
+
|
|
52
|
+
Borque et al. (2016). On the unified estimation of turbulence eddy
|
|
53
|
+
dissipation rate using Doppler cloud radars and lidars. JGR Atmospheres,
|
|
54
|
+
121(10), 5972-5989. https://doi.org/10.1002/2015JD024543
|
|
53
55
|
|
|
54
|
-
Borque, P., Luke, E., and Kollias, P. (2016): On the unified
|
|
55
|
-
estimation of turbulence eddy dissipation rate using Doppler cloud
|
|
56
|
-
radars and lidars, J. Geophys. Res. Atmos., 120, 5972-5989,
|
|
57
|
-
https://doi.org/10.1002/2015JD024543.
|
|
58
56
|
"""
|
|
59
57
|
uuid = get_uuid(uuid)
|
|
60
58
|
with (
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/attenuations/gas_attenuation.py
RENAMED
|
File without changes
|
{cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/attenuations/liquid_attenuation.py
RENAMED
|
File without changes
|
{cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/attenuations/melting_attenuation.py
RENAMED
|
File without changes
|
{cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/categorize/attenuations/rain_attenuation.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/products/advance_methods.py
RENAMED
|
File without changes
|
{cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/products/grid_methods.py
RENAMED
|
File without changes
|
{cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/products/model_products.py
RENAMED
|
File without changes
|
{cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/products/observation_products.py
RENAMED
|
File without changes
|
{cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/products/product_resampling.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/e2e/process_cf/__init__.py
RENAMED
|
File without changes
|
{cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/e2e/process_cf/main.py
RENAMED
|
File without changes
|
{cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/e2e/process_cf/tests.py
RENAMED
|
File without changes
|
|
File without changes
|
{cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/main.py
RENAMED
|
File without changes
|
{cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/e2e/process_iwc/tests.py
RENAMED
|
File without changes
|
|
File without changes
|
{cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/main.py
RENAMED
|
File without changes
|
{cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/e2e/process_lwc/tests.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/unit/test_grid_methods.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/unit/test_plot_tools.py
RENAMED
|
File without changes
|
{cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/unit/test_plotting.py
RENAMED
|
File without changes
|
|
File without changes
|
{cloudnetpy-1.92.1 → cloudnetpy-1.92.2}/cloudnetpy/model_evaluation/tests/unit/test_tools.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|