From 7548441c82d0455d1221f9263f2e50af6406dfae Mon Sep 17 00:00:00 2001 From: g_gutierrez Date: Tue, 1 Aug 2023 16:41:04 -0400 Subject: [PATCH] cost completed --- cerc_costs.egg-info/PKG-INFO | 2 +- cerc_costs.egg-info/SOURCES.txt | 2 ++ costs/capital_costs.py | 19 +++++++++---------- costs/cost.py | 2 -- costs/cost_base.py | 5 ++--- costs/peak_load.py | 20 ++++---------------- costs/total_operational_costs.py | 6 +++++- dist/cerc-costs-0.1.0.0.tar.gz | Bin 7337 -> 0 bytes dist/cerc_costs-0.1.0.0-py3-none-any.whl | Bin 11214 -> 0 bytes 9 files changed, 23 insertions(+), 33 deletions(-) delete mode 100644 dist/cerc-costs-0.1.0.0.tar.gz delete mode 100644 dist/cerc_costs-0.1.0.0-py3-none-any.whl diff --git a/cerc_costs.egg-info/PKG-INFO b/cerc_costs.egg-info/PKG-INFO index cbfe54b..5e62c0a 100644 --- a/cerc_costs.egg-info/PKG-INFO +++ b/cerc_costs.egg-info/PKG-INFO @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: cerc-costs -Version: 0.1.0.0 +Version: 0.1.0.2 Summary: CERC costs contains the basic cost calculation per CERC-Hub building Classifier: License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL) Classifier: Programming Language :: Python diff --git a/cerc_costs.egg-info/SOURCES.txt b/cerc_costs.egg-info/SOURCES.txt index 9cc7c29..6271666 100644 --- a/cerc_costs.egg-info/SOURCES.txt +++ b/cerc_costs.egg-info/SOURCES.txt @@ -1,3 +1,4 @@ +README.md pyproject.toml requirements.txt setup.py @@ -14,6 +15,7 @@ costs/constants.py costs/cost.py costs/cost_base.py costs/end_of_life_costs.py +costs/peak_load.py costs/total_maintenance_costs.py costs/total_operational_costs.py costs/total_operational_incomes.py diff --git a/costs/capital_costs.py b/costs/capital_costs.py index 3dc7933..6add872 100644 --- a/costs/capital_costs.py +++ b/costs/capital_costs.py @@ -81,16 +81,15 @@ class CapitalCosts(CostBase): capital_cost_other_hvac_ahu = 0 capital_cost_lighting = 0 - for internal_zone in self._building.internal_zones: - for thermal_zone in internal_zone.thermal_zones: - for thermal_boundary in thermal_zone.thermal_boundaries: - if thermal_boundary.type == 'Ground': - surface_ground += thermal_boundary.opaque_area - elif thermal_boundary.type == 'Roof': - surface_roof += thermal_boundary.opaque_area - elif thermal_boundary.type == 'Wall': - surface_opaque += thermal_boundary.opaque_area * (1 - thermal_boundary.window_ratio) - surface_transparent += thermal_boundary.opaque_area * thermal_boundary.window_ratio + for thermal_zone in self._building.thermal_zones: + for thermal_boundary in thermal_zone.thermal_boundaries: + if thermal_boundary.type == 'Ground': + surface_ground += thermal_boundary.opaque_area + elif thermal_boundary.type == 'Roof': + surface_roof += thermal_boundary.opaque_area + elif thermal_boundary.type == 'Wall': + surface_opaque += thermal_boundary.opaque_area * (1 - thermal_boundary.window_ratio) + surface_transparent += thermal_boundary.opaque_area * thermal_boundary.window_ratio peak_heating = self._building.heating_peak_load[cte.YEAR][0] / 1000 peak_cooling = self._building.cooling_peak_load[cte.YEAR][0] / 1000 diff --git a/costs/cost.py b/costs/cost.py index 027c184..8be3685 100644 --- a/costs/cost.py +++ b/costs/cost.py @@ -94,8 +94,6 @@ class Cost: df_end_of_life_costs = global_end_of_life_costs['End_of_life_costs'] df_operational_costs = ( - global_operational_costs['Fixed_costs_electricity_peak'] + - global_operational_costs['Fixed_costs_electricity_monthly'] + global_operational_costs['Fixed_costs_electricity_peak'] + global_operational_costs['Fixed_costs_electricity_monthly'] + global_operational_costs['Variable_costs_electricity'] + diff --git a/costs/cost_base.py b/costs/cost_base.py index e6aeb13..7ffdd26 100644 --- a/costs/cost_base.py +++ b/costs/cost_base.py @@ -19,9 +19,8 @@ class CostBase: self._building = building self._configuration = configuration self._total_floor_area = 0 - for internal_zone in building.internal_zones: - for thermal_zone in internal_zone.thermal_zones: - self._total_floor_area += thermal_zone.total_floor_area + for thermal_zone in building.thermal_zones: + self._total_floor_area += thermal_zone.total_floor_area self._archetype = None self._capital_costs_chapter = None for archetype in self._configuration.costs_catalog.entries().archetypes: diff --git a/costs/peak_load.py b/costs/peak_load.py index b45a085..fc22799 100644 --- a/costs/peak_load.py +++ b/costs/peak_load.py @@ -34,19 +34,8 @@ class PeakLoad: if demand_type == cte.COOLING: cooling = 1 if cte.MONTH in self._building.heating_peak_load.keys() and cte.MONTH in self._building.cooling_peak_load.keys(): - peak_lighting = 0 - peak_appliances = 0 - for thermal_zone in self._building.internal_zones[0].thermal_zones: - lighting = thermal_zone.lighting - for schedule in lighting.schedules: - peak = max(schedule.values) * lighting.density * thermal_zone.total_floor_area - if peak > peak_lighting: - peak_lighting = peak - appliances = thermal_zone.appliances - for schedule in appliances.schedules: - peak = max(schedule.values) * appliances.density * thermal_zone.total_floor_area - if peak > peak_appliances: - peak_appliances = peak + peak_lighting = self._building.lighting_peak_load[cte.YEAR][0] + peak_appliances = self._building.appliances_peak_load[cte.YEAR][0] monthly_electricity_peak = [0.9 * peak_lighting + 0.7 * peak_appliances] * 12 conditioning_peak = [] for i, value in enumerate(self._building.heating_peak_load[cte.MONTH]): @@ -57,9 +46,8 @@ class PeakLoad: monthly_electricity_peak[i] += 0.8 * conditioning_peak[i] electricity_peak_load_results = pd.DataFrame( monthly_electricity_peak, - columns=[f'{self._building.name} electricity peak load W'] + columns=[f'electricity peak load W'] ) else: - electricity_peak_load_results = pd.DataFrame(array, columns=[f'{self._building.name} electricity peak load W']) - + electricity_peak_load_results = pd.DataFrame(array, columns=[f'electricity peak load W']) return electricity_peak_load_results diff --git a/costs/total_operational_costs.py b/costs/total_operational_costs.py index ee076f6..17cd70e 100644 --- a/costs/total_operational_costs.py +++ b/costs/total_operational_costs.py @@ -85,8 +85,12 @@ class TotalOperationalCosts(CostBase): self._yearly_operational_costs.at[year, 'Fixed_costs_electricity_monthly'] = ( monthly_electricity_cost_year_0 * price_increase_peak_electricity ) + if not isinstance(variable_electricity_cost_year_0, pd.DataFrame): + variable_costs_electricity = variable_electricity_cost_year_0 * price_increase_electricity + else: + variable_costs_electricity = float(variable_electricity_cost_year_0.iloc[0] * price_increase_electricity) self._yearly_operational_costs.at[year, 'Variable_costs_electricity'] = ( - float(variable_electricity_cost_year_0.iloc[0] * price_increase_electricity) + variable_costs_electricity ) self._yearly_operational_costs.at[year, 'Fixed_costs_gas'] = fixed_gas_cost_year_0 * price_increase_gas self._yearly_operational_costs.at[year, 'Variable_costs_gas'] = ( diff --git a/dist/cerc-costs-0.1.0.0.tar.gz b/dist/cerc-costs-0.1.0.0.tar.gz deleted file mode 100644 index 44bda906b2eb36d49837bb1a140365cf7691c807..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7337 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 P*ZuuJo$ws&06+l%RQS_o diff --git a/dist/cerc_costs-0.1.0.0-py3-none-any.whl b/dist/cerc_costs-0.1.0.0-py3-none-any.whl deleted file mode 100644 index c5a217597b6a1fcd53e63f2a1a2e13220f9ed605..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11214 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