@@ -16,7 +16,8 @@ def optimise_load_profile_power(
1616 max_peak_heating : float = None ,
1717 max_peak_cooling : float = None ,
1818 dhw_preferential : bool = None
19- ) -> tuple [HourlyBuildingLoad , HourlyBuildingLoad ]:
19+ ) -> tuple [
20+ Union [HourlyBuildingLoad , HourlyBuildingLoadMultiYear ], Union [HourlyBuildingLoad , HourlyBuildingLoadMultiYear ]]:
2021 """
2122 This function optimises the load for maximum power in extraction and injection based on the given borefield and
2223 the given hourly building load. It does so based on a load-duration curve.
@@ -43,7 +44,7 @@ def optimise_load_profile_power(
4344
4445 Returns
4546 -------
46- tuple [HourlyBuildingLoad, HourlyBuildingLoad]
47+ tuple [HourlyBuildingLoad, HourlyBuildingLoad] or tuple [HourlyBuildingLoadMultiYear, HourlyBuildingLoadMultiYear]
4748 borefield load, external load
4849
4950 Raises
@@ -70,7 +71,6 @@ def optimise_load_profile_power(
7071
7172 # set load
7273 borefield .load = copy .deepcopy (building_load )
73-
7474 # set initial peak loads
7575 init_peak_heating : float = borefield .load .max_peak_heating
7676 init_peak_dhw : float = borefield .load .max_peak_dhw
@@ -92,10 +92,10 @@ def optimise_load_profile_power(
9292 while not cool_ok or not heat_ok :
9393 # limit the primary geothermal extraction and injection load to peak_heat_load and peak_cool_load
9494 borefield .load .set_hourly_cooling_load (
95- np .minimum (peak_cool_load , building_load .hourly_cooling_load
95+ np .minimum (peak_cool_load , building_load ._hourly_cooling_load
9696 if isinstance (borefield .load , HourlyBuildingLoad ) else building_load .hourly_cooling_load_simulation_period ))
9797 borefield .load .set_hourly_heating_load (
98- np .minimum (peak_heat_load , building_load .hourly_heating_load
98+ np .minimum (peak_heat_load , building_load ._hourly_heating_load
9999 if isinstance (borefield .load , HourlyBuildingLoad ) else building_load .hourly_heating_load_simulation_period ))
100100 borefield .load .set_hourly_dhw_load (
101101 np .minimum (peak_dhw_load , building_load .hourly_dhw_load
@@ -145,13 +145,29 @@ def optimise_load_profile_power(
145145 cool_ok = True
146146
147147 # calculate external load
148- external_load = HourlyBuildingLoad (simulation_period = building_load .simulation_period )
148+ if isinstance (building_load , HourlyBuildingLoad ):
149+ external_load = HourlyBuildingLoad (simulation_period = building_load .simulation_period )
150+ external_load .start_month = building_load .start_month
151+
152+ external_load .set_hourly_heating_load (
153+ np .maximum (0 , building_load ._hourly_heating_load - borefield .load ._hourly_heating_load ))
154+ external_load .set_hourly_cooling_load (
155+ np .maximum (0 , building_load ._hourly_cooling_load - borefield .load ._hourly_cooling_load ))
156+ external_load .set_hourly_dhw_load (
157+ np .maximum (0 , building_load .hourly_dhw_load - borefield .load .hourly_dhw_load ))
158+
159+ return borefield .load , external_load
160+
161+ external_load = HourlyBuildingLoadMultiYear ()
149162 external_load .set_hourly_heating_load (
150- np .maximum (0 , building_load .hourly_heating_load - borefield .load .hourly_heating_load ))
163+ np .maximum (0 ,
164+ building_load .hourly_heating_load_simulation_period - borefield .load .hourly_heating_load_simulation_period ))
151165 external_load .set_hourly_cooling_load (
152- np .maximum (0 , building_load .hourly_cooling_load - borefield .load .hourly_cooling_load ))
166+ np .maximum (0 ,
167+ building_load .hourly_cooling_load_simulation_period - borefield .load .hourly_cooling_load_simulation_period ))
153168 external_load .set_hourly_dhw_load (
154- np .maximum (0 , building_load .hourly_dhw_load - borefield .load .hourly_dhw_load ))
169+ np .maximum (0 ,
170+ building_load .hourly_dhw_load_simulation_period - borefield .load .hourly_dhw_load_simulation_period ))
155171
156172 return borefield .load , external_load
157173
@@ -454,7 +470,8 @@ def optimise_load_profile_balance(
454470 max_peak_cooling : float = None ,
455471 dhw_preferential : bool = None ,
456472 imbalance_factor : float = 0.01 ,
457- ) -> tuple [HourlyBuildingLoad , HourlyBuildingLoad ]:
473+ ) -> tuple [
474+ Union [HourlyBuildingLoad , HourlyBuildingLoadMultiYear ], Union [HourlyBuildingLoad , HourlyBuildingLoadMultiYear ]]:
458475 """
459476 This function optimises the load for maximum power in extraction and injection based on the given borefield and
460477 the given hourly building load, by maintaining a zero imbalance. It does so based on a load-duration curve.
@@ -484,7 +501,7 @@ def optimise_load_profile_balance(
484501
485502 Returns
486503 -------
487- tuple [HourlyBuildingLoad, HourlyBuildingLoad]
504+ tuple [HourlyBuildingLoad, HourlyBuildingLoad] or tuple [HourlyBuildingLoadMultiYear, HourlyBuildingLoadMultiYear]
488505 borefield load, external load
489506
490507 Raises
@@ -536,10 +553,10 @@ def optimise_load_profile_balance(
536553 while not cool_ok or not heat_ok :
537554 # limit the primary geothermal extraction and injection load to peak_heat_load and peak_cool_load
538555 borefield .load .set_hourly_cooling_load (
539- np .minimum (peak_cool_load , building_load .hourly_cooling_load
556+ np .minimum (peak_cool_load , building_load ._hourly_cooling_load
540557 if isinstance (borefield .load , HourlyBuildingLoad ) else building_load .hourly_cooling_load_simulation_period ))
541558 borefield .load .set_hourly_heating_load (
542- np .minimum (peak_heat_load , building_load .hourly_heating_load
559+ np .minimum (peak_heat_load , building_load ._hourly_heating_load
543560 if isinstance (borefield .load , HourlyBuildingLoad ) else building_load .hourly_heating_load_simulation_period ))
544561 borefield .load .set_hourly_dhw_load (
545562 np .minimum (peak_dhw_load , building_load .hourly_dhw_load
@@ -616,12 +633,28 @@ def optimise_load_profile_balance(
616633 cool_ok = True
617634
618635 # calculate external load
619- external_load = HourlyBuildingLoad (simulation_period = building_load .simulation_period )
636+ if isinstance (building_load , HourlyBuildingLoad ):
637+ external_load = HourlyBuildingLoad (simulation_period = building_load .simulation_period )
638+ external_load .start_month = building_load .start_month
639+
640+ external_load .set_hourly_heating_load (
641+ np .maximum (0 , building_load ._hourly_heating_load - borefield .load ._hourly_heating_load ))
642+ external_load .set_hourly_cooling_load (
643+ np .maximum (0 , building_load ._hourly_cooling_load - borefield .load ._hourly_cooling_load ))
644+ external_load .set_hourly_dhw_load (
645+ np .maximum (0 , building_load .hourly_dhw_load - borefield .load .hourly_dhw_load ))
646+
647+ return borefield .load , external_load
648+
649+ external_load = HourlyBuildingLoadMultiYear ()
620650 external_load .set_hourly_heating_load (
621- np .maximum (0 , building_load .hourly_heating_load - borefield .load .hourly_heating_load ))
651+ np .maximum (0 ,
652+ building_load .hourly_heating_load_simulation_period - borefield .load .hourly_heating_load_simulation_period ))
622653 external_load .set_hourly_cooling_load (
623- np .maximum (0 , building_load .hourly_cooling_load - borefield .load .hourly_cooling_load ))
654+ np .maximum (0 ,
655+ building_load .hourly_cooling_load_simulation_period - borefield .load .hourly_cooling_load_simulation_period ))
624656 external_load .set_hourly_dhw_load (
625- np .maximum (0 , building_load .hourly_dhw_load - borefield .load .hourly_dhw_load ))
657+ np .maximum (0 ,
658+ building_load .hourly_dhw_load_simulation_period - borefield .load .hourly_dhw_load_simulation_period ))
626659
627660 return borefield .load , external_load
0 commit comments