Release Notes
Changelog
All major changes are listed here.
Unreleased
0.7.0 (2024-06-04)
PyWAsP 0.7.0 is a major release with new features, improvements, and bug fixes.
Dependency updates
Following SPEC 0 this release supports python 3.10-3.12 and numpy 1.24-1.26.
Windkit =0.8.0 is required
PyWake is pinned to version 2.5.0 (commit 36da70b2335321e435194d277511c17d8f012571).
New features
New climate extrapolation functions
New function
pywasp.wasp.predict_wwc()to predict a weibull wind climate from a binned wind climate without using a generalized wind climate lookup-table, thus reducing interpolation errorsNew function
pywasp.wasp.predict_bwc(), same as above but to predict a binned wind climate instead.New function
pywasp.wasp.predict_wwc_from_site_effects(), same aspywasp.wasp.predict_wwc()but using the outputs of calls topywasp.wasp.TopographyMap.get_site_effects()instead of a mapfile.New function
pywasp.wasp.predict_bwc_from_site_effects(), same aspywasp.wasp.predict_bwc()but using the outputs of calls topywasp.wasp.get_site_effects()instead of a mapfile.New function
pywasp.wasp.generalize_from_site_effects(), same aspywasp.wasp.generalize()but using the output of a call topywasp.wasp.TopographyMap.get_site_effects()instead of a mapfile.New function
pywasp.wasp.generalize_from_site_effects_to_geowc(), generalize a binned geostrophic wind climate from a site effects dataset.New function
pywasp.wasp.downscale_from_geostrophic_and_site_effects_to_bwc(), downscale a binned geostrophic wind climate from a site effects dataset and geostrophic binned wind climate
BWC resampling functions added
New function
pywasp.wasp.bwc_resample_like(), to resample a binned wind climate using a different sector or wind speed bin structure.New function
pywasp.wasp.bwc_resample_sectors(), to resample a binned wind climate using a different number of sectors.New function
pywasp.wasp.bwc_resample_wsbins_like(), to resample a binned wind climate using a different wind speed bin structure.
I/O added to TopographyMap and new CFD data-extraction method
New methods
.saveand.loadadded topywasp.wasp.TopographyMapto save and load the topography map to/from a ZipFile Archieve.pywasp.wasp.get_site_effects_cfd()also accepts a list of xr.datasets (read by theread_cfdresfunction in windkit) as input. It will extract the site effects in the order specified in the list.
Support for custom root CA certificates
In case of running
pywaspunder a proxy or another similar network setup, the filepath to a root CA certificate can be set onpywaspso it can connect to the licensing server.
Improvements
For typical usage
pywasp.wasp.TopographyMap.get_site_effects()is 2-6 times fasterFor typical usage
pywasp.io.rastermap_to_vectormap()is 15-30 times fasterFor typical usage
pywasp.io.vectormap_to_rastermap()is 15-30 times fasterFor typical usage
pywasp.io.vectormap_to_waspformat()is 2-20 times fasterFor typical usage
pywasp.io.waspformat_to_vectormap()is 2-80 times fasterFor typical usage
pywasp.wasp.TopographyMapis >1000 times fasterImproved input error checking in
pywasp.wasp.generalize()Improved input error checking in
pywasp.wasp.generalize(), check that thegen_roughnessesandgen_heightshave at least 2 entries, as required by the WAsP core.Improved input error checking in
pywasp.wasp.TopographyMap: make sure that all your landcover lines have a corresponding entry in the landcover table.More accurate setting of generalized heights and roughness using the function
pywasp.wasp.set_hgts()andpywasp.wasp.set_z0s(). Now a percentile mapping technique is used when the number of heights or roughnesses exceeds the maximum number of entries allowed in agwc(5).More descriptive error codes when having problems reading a pywasp config file.
TopographyMap now throws an error when the lctable has more than 100 entries. Before this condition was unhandled and could crash the fortran.
pywasp.wasp.Configobject now is read only and does not do any modifications of the fortran behaviour itself (before it was creating lookup tables and setting some parameters on each update of conf.terrain.)
Deprecations
WaspVectorMap will be deprecated
windkit.WindTurbinesdeprecated for AEP functions. Use a dict of WTGxr.Dataset’s and a wind_turbinexr.Datasetinstead.
Changes
pywasp.wasp.generalize()now usespywasp.wasp.generalize_from_site_effects()instead of duplicating codepywasp.wasp.interpolate_gwc()-> Can now also interpolate geostrophic wind climates. Code from windkit has been implemented in pywasp and can be used by using the argumentengine="windkit".pywasp.wasp.TopographyMap.get_site_effects()now reports an extra variableflow_sep_height, which can report the height where flow separation is expected based on slopes exceeding some given slope. Theflow_sep_heightis only active when usingconf.terrain[64] == 1.In all the downscale and generalize function an additional variable
flow_sep_heightcan be used. This is added to the displacement height that is used for transformation of the wind climate. If this data array is not present on thesite_effectsdataset, it is added automatically.Using a point dataset with multiple heights now gives a warning instead of a ValueError, because it is typically used in combination with
pywasp.wasp.interpolate_gwc()and interp_method=”given” where it is fine to have more than one height.
Breaking changes
pywasp.wasp.get_wasp_down()renamed topywasp.wasp.downscale_from_site_effects()Changed order of arguments in
pywasp.wasp.generalize_and_downscale()to bwc, topo_map, output_locs for consistency with generalize and downscalepywasp.wasp.set_hgts()-> returns slightly more accurate generalized roughnesses whenheight_fromandheight_toare providedpywasp.wasp.set_z0s()-> returns slightly more accurate generalized roughnesses whenz0meso_fromandz0meso_toare providedpywasp.wasp.calc_temp_scale()the output of the dataset now returns the correct nameustar_over_pblhpywasp.wasp.stability_histogram()now produces a dataset with the more correct namesmean_pblh_scale_landandmean_pblh_scale_seainstead ofmean_pblh_landandmean_pblh_sea. See for more details: https://link.springer.com/article/10.1007/s10546-023-00803-3genwc_interpargument indownscaleandgeneralizehas been renamed tointerp_methodpywasp.wasp.gross_aep(),pywasp.wasp.potential_aep(), andpywasp.wasp.wind_farm_flow_map()now uses a dict{"wtg_key1": wtg1, "wtg_key2": wtg2}and a turbinesxarray.Datasetinstead of awindkit.WindTurbinesobject. WTGs are mapped to turbines via the wtg_keys present in both the dict and the turbines dataset.
0.6.0 (2023-11-30)
Dependency updates
Following SPEC 0 this release supports python 3.10-3.12 and numpy 1.22-1.26. Due to build issues with numpy 1.26, neither it nor python 3.12 are supported on Windows.
Windkit =0.7.0 is required
PyWake is now pinned to version 2.5.0 (commit 36da70b2335321e435194d277511c17d8f012571).
New features
Support for WAsP CFD results
New function
pywasp.wasp.get_site_effects_cfd()interpolates the speedups and turnings from awindkitCFD volumexarray.Dataset.pywasp.wasp.generalize(),pywasp.wasp.downscale(), andpywasp.wasp.generalize_and_downscale()now have an extracfd_volumeargument, which can be used to pass in WAsP CFD results that will be used for the site effects.
Breaking changes
pywasp.wasp.wind_farm_flow_map()now requires awk.WindTurbinesobject, not separate wtg and locations arguments.pywasp.wasp.wind_farm_flow_map()requires the new argumentoutput_locs, which should be a “cuboid”xr.Dataset, which is where the flow map will be calculated.output_locsshould be covered by the predicted wind climate object.
Changes
Interpolation errors have been eliminated during the downscale step when using
pywasp.wasp.generalize_and_downscale(), by including the output heights in the generalize step.Update ERA5 mesoclimate netCDF file according to latest revision of Using Observed and Modelled Heat Fluxes for Improved Extrapolation of Wind Distributions.
pywasp.wasp.gross_aep()andpywasp.wasp.potential_aep()can now accept awk.WindTurbinesobject to thewtgargument. This allows for different WTGs to be used for different turbine locations.Added
interp_methodargument topywasp.wasp.get_climate(), “nearest” is used by default
Improvements
Reduction of approximately 50% for calculations of wake-affected AEP.
Bug Fixes
PyWAsP on windows now can use the license.windenergy.dtu.dk licensing server.
Interpolation of
mean_dgdzandmean_dgdz_dirare now carried out by interpolating the vector components, when a method other than"nearest"is used.
Deprecations
Deprecated options “PARK2_onshore_with_blockage” and “PARK2_offshore_with_blockage” in
pywasp.wasp.wind_farm_flow_map()andpywasp.wasp.potential_aep(). Use, custom PyWake wind_farm_models to build complex models instead.
0.5.2 (2023-06-21)
Changes
Dependency updates: Python 3.8 & numpy 1.21 no longer supported following NEP 29. Windkit 0.6.3 is now required to support the
regulation_typevariable forwtgobjects.pywasp.wasp.TopographyMap.get_rou_rose()now allows to add displacements to the orographic grid, using the newelev_roseargument. Ifelev_roseis None, a dummy elevation rose is created.pywasp.wasp.interpolate_gwc()now returns an interpolated generalized wind climate dataset with height coordinates.
Setting
download_prompt=Falseanddownload_global_nc_filesin the pywasp.cfg file, will not prevent any text from showing when importing PyWAsP. Previously it would print a message about how to get the files on each import. If you need the files, you will be prompted to download at that time. See the User Configuration Documentation to see all options of the config file.
Improvements
Update netCDF file with CFSR baroclinicity information. The data is the same but the data variable names are updated. It does not affect the behavior.
pywasp.wasp.interpolate_gwc()will issue a warning if it is used with datasets with geographical coordinates for “nearest” and “natural” methods.
Bug Fixes
pywasp.io.rastermap_to_vectormap()will only raises errors related with the parameterdzwhen the raster map type iselevation.pywasp.wasp.aep.gross_aep()incorrectly assumed most wind turbines were stall regulated. This means that when using theinterpolation=Trueoption, that incorrect air density corrections were applied. This has been fixed by an update in WindKit that requires thecontrol_systemvariable to be defined on a wind turbine generator. This value is now used to apply the correct air density correction to the power curves.
0.5.1 (2023-04-19)
New Features
pywasp.wasp.get_climate_by_config()takes apywasp.wasp.Configobject and returns anxarray.Datasetmeso climate object compatible with the profile model set in the config.
Changes
pywasp.wasp.get_climate()argumentsstab_sourceandbaro_sourcenow both allow forNoneto be set. This creates a dataset with 0-valued fields for the given source.
Improvements
Update netCDF file with CFSR baroclinicity information to version 3. The data is the same, but the data variable names are updated. This does not affect the behavior.
Bug Fixes
Fixed license check error for new version of DTU License server
Corrected import of
combine_bwcsinpywasp.wasp.cross_predict().pywasp.wasp.interpolate_gwc()now returns an interpolated generalized wind climate dataset with height coordinates. This makes it more robust to different spatial structures of generalized wind climates and output_locs, when used for downscaling.
Deprecations
getparandsetparmethods ofpywasp.wasp.config.Configobjects are deprecated. Use square brackets instead.