From ea2b3817405b80d44623fc88c3c32320e9dd242d Mon Sep 17 00:00:00 2001 From: Youssef Miftah Date: Fri, 15 Mar 2024 19:04:36 +1100 Subject: [PATCH 1/3] add dewpoint temperature from ERA5 --- atlite/convert.py | 19 +++++++++++++++++++ atlite/cutout.py | 3 +++ atlite/datasets/era5.py | 17 ++++++++++++++--- test/test_preparation_and_conversion.py | 14 ++++++++++++++ 4 files changed, 50 insertions(+), 3 deletions(-) diff --git a/atlite/convert.py b/atlite/convert.py index 3c41e75e..1835065a 100644 --- a/atlite/convert.py +++ b/atlite/convert.py @@ -241,6 +241,25 @@ def soil_temperature(cutout, **params): return cutout.convert_and_aggregate(convert_func=convert_soil_temperature, **params) +# dewpoint temperature +def convert_dewpoint_temperature(ds): + """ + Return dewpoint temperature. + """ + # Temperature is in Kelvin + + # There are nans where there is sea; by setting them + # to zero we guarantee they do not contribute when multiplied + # by matrix in atlite/aggregate.py + return (ds["dewpoint temperature"] - 273.15).fillna(0.0) + + +def dewpoint_temperature(cutout, **params): + return cutout.convert_and_aggregate( + convert_func=convert_dewpoint_temperature, **params + ) + + def convert_coefficient_of_performance(ds, source, sink_T, c0, c1, c2): assert source in ["air", "soil"], NotImplementedError( "'source' must be one of ['air', 'soil']" diff --git a/atlite/cutout.py b/atlite/cutout.py index 7c2aeeef..5a636e6f 100644 --- a/atlite/cutout.py +++ b/atlite/cutout.py @@ -35,6 +35,7 @@ coefficient_of_performance, convert_and_aggregate, csp, + dewpoint_temperature, heat_demand, hydro, irradiation, @@ -681,6 +682,8 @@ def layout_from_capacity_list(self, data, col="Capacity"): soil_temperature = soil_temperature + dewpoint_temperature = dewpoint_temperature + coefficient_of_performance = coefficient_of_performance solar_thermal = solar_thermal diff --git a/atlite/datasets/era5.py b/atlite/datasets/era5.py index f234ba71..58a62dda 100644 --- a/atlite/datasets/era5.py +++ b/atlite/datasets/era5.py @@ -53,7 +53,7 @@ def nullcontext(): "solar_altitude", "solar_azimuth", ], - "temperature": ["temperature", "soil temperature"], + "temperature": ["temperature", "soil temperature", "dewpoint temperature"], "runoff": ["runoff"], } @@ -199,11 +199,22 @@ def get_data_temperature(retrieval_params): Get wind temperature for given retrieval parameters. """ ds = retrieve_data( - variable=["2m_temperature", "soil_temperature_level_4"], **retrieval_params + variable=[ + "2m_temperature", + "soil_temperature_level_4", + "2m_dewpoint_temperature", + ], + **retrieval_params, ) ds = _rename_and_clean_coords(ds) - ds = ds.rename({"t2m": "temperature", "stl4": "soil temperature"}) + ds = ds.rename( + { + "t2m": "temperature", + "stl4": "soil temperature", + "d2m": "dewpoint temperature", + } + ) return ds diff --git a/test/test_preparation_and_conversion.py b/test/test_preparation_and_conversion.py index c8a5ecdb..b1f4ec09 100644 --- a/test/test_preparation_and_conversion.py +++ b/test/test_preparation_and_conversion.py @@ -273,6 +273,16 @@ def soil_temperature_test(cutout): assert demand.sum() > 0 +def dewpoint_temperature_test(cutout): + """ + Test the atlite.Cutout.dewpoint_temperature function with different + settings. + """ + demand = cutout.dewpoint_temperature() + assert demand.notnull().all() + assert demand.sum() > 0 + + def wind_test(cutout): """ Test the atlite.Cutout.wind function with two different layouts. @@ -684,6 +694,10 @@ def test_heat_demand_era5(cutout_era5): def test_soil_temperature_era5(cutout_era5): return soil_temperature_test(cutout_era5) + @staticmethod + def test_dewpoint_temperature_era5(cutout_era5): + return dewpoint_temperature_test(cutout_era5) + @staticmethod def test_line_rating_era5(cutout_era5): return line_rating_test(cutout_era5) From e4e85897c2a7ed7d28ee9bcd41a2b4aeedd0bdc1 Mon Sep 17 00:00:00 2001 From: Youssef Miftah Date: Sat, 16 Mar 2024 08:36:20 +1100 Subject: [PATCH 2/3] docstring --- atlite/convert.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/atlite/convert.py b/atlite/convert.py index 1835065a..d275843d 100644 --- a/atlite/convert.py +++ b/atlite/convert.py @@ -247,11 +247,7 @@ def convert_dewpoint_temperature(ds): Return dewpoint temperature. """ # Temperature is in Kelvin - - # There are nans where there is sea; by setting them - # to zero we guarantee they do not contribute when multiplied - # by matrix in atlite/aggregate.py - return (ds["dewpoint temperature"] - 273.15).fillna(0.0) + return ds["dewpoint temperature"] - 273.15 def dewpoint_temperature(cutout, **params): From bf7eb932df35ad11071585afe6a5beb2943c5c3e Mon Sep 17 00:00:00 2001 From: Youssef Miftah Date: Sat, 16 Mar 2024 09:01:06 +1100 Subject: [PATCH 3/3] Added dewpoint temperature --- README.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/README.rst b/README.rst index e8670e79..b2b4fcfb 100644 --- a/README.rst +++ b/README.rst @@ -43,6 +43,7 @@ Atlite can process the following weather data fields and can convert them into f .. * Surface roughness .. * Height maps .. * Soil temperature +.. * Dewpoint temperature .. * Wind power generation for a given turbine type