Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(weather): Ensure model year is interpreted correctly #228

Merged
merged 1 commit into from Sep 1, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Binary file modified dragonfly_grasshopper/icon/DF Create EPW.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
6 changes: 3 additions & 3 deletions dragonfly_grasshopper/json/DF_Create_EPW.json
@@ -1,5 +1,5 @@
{
"version": "1.5.0",
"version": "1.5.1",
"nickname": "CreateEPW",
"outputs": [
[
Expand Down Expand Up @@ -122,7 +122,7 @@
"access": "item",
"name": "base_epw_",
"description": "File path to an optional .epw to fill empty slots for data\nthat has not been connected here.",
"type": "System.Object",
"type": "string",
"default": null
},
{
Expand All @@ -134,7 +134,7 @@
}
],
"subcategory": "4 :: AlternativeWeather",
"code": "\nimport math\n\ntry:\n from ladybug.epw import EPW\n from ladybug.wea import Wea\n from ladybug.datacollection import HourlyContinuousCollection\n from ladybug.sunpath import Sunpath\n from ladybug.datatype.temperature import Temperature\n from ladybug.datatype.fraction import Fraction, RelativeHumidity\n from ladybug.datatype.speed import Speed\n from ladybug.datatype.angle import Angle\n from ladybug.datatype.energyflux import EnergyFlux\n from ladybug.datatype.illuminance import Illuminance\n from ladybug.datatype.pressure import Pressure\n from ladybug.datatype.distance import Distance\n from ladybug.psychrometrics import rel_humid_from_db_dpt\nexcept ImportError as e:\n raise ImportError('\\nFailed to import ladybug:\\n\\t{}'.format(e))\n\ntry:\n from ladybug_{{cad}}.{{plugin}} import all_required_inputs\nexcept ImportError as e:\n raise ImportError('\\nFailed to import ladybug_{{cad}}:\\n\\t{}'.format(e))\n\n\ndef check_data(name, data_coll, data_type, unit, is_leap_year):\n assert isinstance(data_coll, HourlyContinuousCollection), \\\n '{} must be an hourly continuous data collection. Got {}.'.format(\n name, type(data_coll))\n assert data_coll.header.analysis_period.is_annual, '{} analysis_period must ' \\\n 'be annual. Got {}'.format(header.analysis_period)\n assert data_coll.header.analysis_period.is_leap_year == is_leap_year, \\\n '{} analysis_period must is_leap_year must match across input data collections.'\n assert isinstance(data_coll.header.data_type, data_type), '{} data_type is not {}. '\\\n 'Got {}.'.format(name, data_type(), data_coll.header.data_type)\n assert data_coll.header.unit == unit, '{} unit is not {}. '\\\n 'Got {}.'.format(name, unit, data_coll.header.unit)\n return data_coll.values\n\n\nif all_required_inputs(ghenv.Component) and _run:\n # initialize the EPW\n if base_epw_ is not None:\n epw_obj = EPW(base_epw_)\n leap_yr = epw_obj.is_leap_year\n else:\n if _model_year_:\n leap_yr = _model_year_.header.analysis_period.is_leap_year\n else:\n leap_yr = False\n epw_obj = EPW.from_missing_values(is_leap_year=leap_yr)\n \n # assign data to the EPW\n epw_obj.location = _location\n if _dry_bulb_temp_:\n epw_obj.dry_bulb_temperature.values = check_data(\n '_dry_bulb_temp_', _dry_bulb_temp_, Temperature, 'C', leap_yr)\n if _dew_point_temp_:\n epw_obj.dew_point_temperature.values = check_data(\n '_dew_point_temp_', _dew_point_temp_, Temperature, 'C', leap_yr)\n if _wind_speed_:\n epw_obj.wind_speed.values = check_data(\n '_wind_speed_', _wind_speed_, Speed, 'm/s', leap_yr)\n if _wind_direction_:\n epw_obj.wind_direction.values = check_data(\n '_wind_direction_', _wind_direction_, Angle, 'degrees', leap_yr)\n if _direct_normal_rad_:\n epw_obj.direct_normal_radiation.values = _direct_normal_rad_.values\n if _diffuse_horiz_rad_:\n epw_obj.diffuse_horizontal_radiation.values = _diffuse_horiz_rad_.values\n if _horiz_infrared_rad_:\n epw_obj.horizontal_infrared_radiation_intensity.values = check_data(\n '_horiz_infrared_rad_', _horiz_infrared_rad_, EnergyFlux, 'W/m2', leap_yr)\n if _direct_normal_ill_:\n epw_obj.direct_normal_illuminance.values = check_data(\n '_direct_normal_ill_', _direct_normal_ill_, Illuminance, 'lux', leap_yr)\n if _diffuse_horiz_ill_:\n epw_obj.diffuse_horizontal_illuminance.values = check_data(\n '_diffuse_horiz_ill_', _diffuse_horiz_ill_, Illuminance, 'lux', leap_yr)\n if _total_sky_cover_:\n epw_obj.total_sky_cover.values = check_data(\n '_total_sky_cover_', _total_sky_cover_, Fraction, 'tenths', leap_yr)\n epw_obj.opaque_sky_cover.values = _total_sky_cover_.values\n if _atmos_pressure_:\n epw_obj.atmospheric_station_pressure.values = check_data(\n '_atmos_pressure_', _atmos_pressure_, Pressure, 'Pa', leap_yr)\n if _visibility_:\n epw_obj.visibility.values = check_data(\n '_visibility_', _visibility_, Distance, 'km', leap_yr)\n if _ceiling_height_:\n epw_obj.ceiling_height.values = check_data(\n '_ceiling_height_', _ceiling_height_, Distance, 'm', leap_yr)\n if _model_year_:\n epw_obj.years.values = _model_year_.values\n \n # calculate properties that are derived from other inputs\n if _dry_bulb_temp_ and _dew_point_temp_:\n rel_humid = HourlyContinuousCollection.compute_function_aligned(\n rel_humid_from_db_dpt, [_dry_bulb_temp_, _dew_point_temp_],\n RelativeHumidity(), '%')\n epw_obj.relative_humidity.values = rel_humid.values\n if _direct_normal_rad_ and _diffuse_horiz_rad_:\n wea = Wea(_location, _direct_normal_rad_, _diffuse_horiz_rad_)\n epw_obj.global_horizontal_radiation.values = wea.global_horizontal_irradiance.values\n if _direct_normal_ill_ and _diffuse_horiz_ill_:\n glob_horiz = []\n sp = Sunpath.from_location(_location)\n sp.is_leap_year = leap_yr\n for dt, dni, dhi in zip(_direct_normal_ill_.datetimes,\n _direct_normal_ill_, _diffuse_horiz_ill_):\n sun = sp.calculate_sun_from_date_time(dt)\n glob_horiz.append(dhi + dni * math.sin(math.radians(sun.altitude)))\n epw_obj.global_horizontal_illuminance.values = glob_horiz\n",
"code": "\nimport math\n\ntry:\n from ladybug.epw import EPW\n from ladybug.wea import Wea\n from ladybug.datacollection import HourlyContinuousCollection\n from ladybug.sunpath import Sunpath\n from ladybug.datatype.temperature import Temperature\n from ladybug.datatype.fraction import Fraction, RelativeHumidity\n from ladybug.datatype.speed import Speed\n from ladybug.datatype.angle import Angle\n from ladybug.datatype.energyflux import EnergyFlux\n from ladybug.datatype.illuminance import Illuminance\n from ladybug.datatype.pressure import Pressure\n from ladybug.datatype.distance import Distance\n from ladybug.psychrometrics import rel_humid_from_db_dpt\nexcept ImportError as e:\n raise ImportError('\\nFailed to import ladybug:\\n\\t{}'.format(e))\n\ntry:\n from ladybug_{{cad}}.{{plugin}} import all_required_inputs\nexcept ImportError as e:\n raise ImportError('\\nFailed to import ladybug_{{cad}}:\\n\\t{}'.format(e))\n\n\ndef check_data(name, data_coll, data_type, unit, is_leap_year):\n assert isinstance(data_coll, HourlyContinuousCollection), \\\n '{} must be an hourly continuous data collection. Got {}.'.format(\n name, type(data_coll))\n assert data_coll.header.analysis_period.is_annual, '{} analysis_period must ' \\\n 'be annual. Got {}'.format(header.analysis_period)\n assert data_coll.header.analysis_period.is_leap_year == is_leap_year, \\\n '{} analysis_period must is_leap_year must match across input data collections.'\n assert isinstance(data_coll.header.data_type, data_type), '{} data_type is not {}. '\\\n 'Got {}.'.format(name, data_type(), data_coll.header.data_type)\n assert data_coll.header.unit == unit, '{} unit is not {}. '\\\n 'Got {}.'.format(name, unit, data_coll.header.unit)\n return data_coll.values\n\n\nif all_required_inputs(ghenv.Component) and _run:\n # initialize the EPW\n if base_epw_ is not None:\n epw_obj = EPW(base_epw_)\n leap_yr = epw_obj.is_leap_year\n else:\n if _model_year_:\n leap_yr = _model_year_.header.analysis_period.is_leap_year\n else:\n leap_yr = False\n epw_obj = EPW.from_missing_values(is_leap_year=leap_yr)\n\n # assign data to the EPW\n epw_obj.location = _location\n if _dry_bulb_temp_:\n epw_obj.dry_bulb_temperature.values = check_data(\n '_dry_bulb_temp_', _dry_bulb_temp_, Temperature, 'C', leap_yr)\n if _dew_point_temp_:\n epw_obj.dew_point_temperature.values = check_data(\n '_dew_point_temp_', _dew_point_temp_, Temperature, 'C', leap_yr)\n if _wind_speed_:\n epw_obj.wind_speed.values = check_data(\n '_wind_speed_', _wind_speed_, Speed, 'm/s', leap_yr)\n if _wind_direction_:\n epw_obj.wind_direction.values = check_data(\n '_wind_direction_', _wind_direction_, Angle, 'degrees', leap_yr)\n if _direct_normal_rad_:\n epw_obj.direct_normal_radiation.values = _direct_normal_rad_.values\n if _diffuse_horiz_rad_:\n epw_obj.diffuse_horizontal_radiation.values = _diffuse_horiz_rad_.values\n if _horiz_infrared_rad_:\n epw_obj.horizontal_infrared_radiation_intensity.values = check_data(\n '_horiz_infrared_rad_', _horiz_infrared_rad_, EnergyFlux, 'W/m2', leap_yr)\n if _direct_normal_ill_:\n epw_obj.direct_normal_illuminance.values = check_data(\n '_direct_normal_ill_', _direct_normal_ill_, Illuminance, 'lux', leap_yr)\n if _diffuse_horiz_ill_:\n epw_obj.diffuse_horizontal_illuminance.values = check_data(\n '_diffuse_horiz_ill_', _diffuse_horiz_ill_, Illuminance, 'lux', leap_yr)\n if _total_sky_cover_:\n epw_obj.total_sky_cover.values = check_data(\n '_total_sky_cover_', _total_sky_cover_, Fraction, 'tenths', leap_yr)\n epw_obj.opaque_sky_cover.values = _total_sky_cover_.values\n if _atmos_pressure_:\n epw_obj.atmospheric_station_pressure.values = check_data(\n '_atmos_pressure_', _atmos_pressure_, Pressure, 'Pa', leap_yr)\n if _visibility_:\n epw_obj.visibility.values = check_data(\n '_visibility_', _visibility_, Distance, 'km', leap_yr)\n if _ceiling_height_:\n epw_obj.ceiling_height.values = check_data(\n '_ceiling_height_', _ceiling_height_, Distance, 'm', leap_yr)\n if _model_year_:\n epw_obj.years.values = [int(val) for val in _model_year_.values]\n\n # calculate properties that are derived from other inputs\n if _dry_bulb_temp_ and _dew_point_temp_:\n rel_humid = HourlyContinuousCollection.compute_function_aligned(\n rel_humid_from_db_dpt, [_dry_bulb_temp_, _dew_point_temp_],\n RelativeHumidity(), '%')\n epw_obj.relative_humidity.values = rel_humid.values\n if _direct_normal_rad_ and _diffuse_horiz_rad_:\n wea = Wea(_location, _direct_normal_rad_, _diffuse_horiz_rad_)\n epw_obj.global_horizontal_radiation.values = wea.global_horizontal_irradiance.values\n if _direct_normal_ill_ and _diffuse_horiz_ill_:\n glob_horiz = []\n sp = Sunpath.from_location(_location)\n sp.is_leap_year = leap_yr\n for dt, dni, dhi in zip(_direct_normal_ill_.datetimes,\n _direct_normal_ill_, _diffuse_horiz_ill_):\n sun = sp.calculate_sun_from_date_time(dt)\n glob_horiz.append(dhi + dni * math.sin(math.radians(sun.altitude)))\n epw_obj.global_horizontal_illuminance.values = glob_horiz\n",
"category": "Dragonfly",
"name": "DF Create EPW",
"description": "Create a custom EPW object from a location and data collections of annual\nhourly data.\n-"
Expand Down
8 changes: 4 additions & 4 deletions dragonfly_grasshopper/src/DF Create EPW.py
Expand Up @@ -49,7 +49,7 @@

ghenv.Component.Name = 'DF Create EPW'
ghenv.Component.NickName = 'CreateEPW'
ghenv.Component.Message = '1.5.0'
ghenv.Component.Message = '1.5.1'
ghenv.Component.Category = "Dragonfly"
ghenv.Component.SubCategory = '4 :: AlternativeWeather'
ghenv.Component.AdditionalHelpFromDocStrings = '3'
Expand Down Expand Up @@ -105,7 +105,7 @@ def check_data(name, data_coll, data_type, unit, is_leap_year):
else:
leap_yr = False
epw_obj = EPW.from_missing_values(is_leap_year=leap_yr)

# assign data to the EPW
epw_obj.location = _location
if _dry_bulb_temp_:
Expand Down Expand Up @@ -147,8 +147,8 @@ def check_data(name, data_coll, data_type, unit, is_leap_year):
epw_obj.ceiling_height.values = check_data(
'_ceiling_height_', _ceiling_height_, Distance, 'm', leap_yr)
if _model_year_:
epw_obj.years.values = _model_year_.values
epw_obj.years.values = [int(val) for val in _model_year_.values]

# calculate properties that are derived from other inputs
if _dry_bulb_temp_ and _dew_point_temp_:
rel_humid = HourlyContinuousCollection.compute_function_aligned(
Expand Down
Binary file modified dragonfly_grasshopper/user_objects/DF Create EPW.ghuser
Binary file not shown.
Binary file modified samples/alternative_weather.gh
Binary file not shown.