Select Git revision
runme.py 7.08 KiB
import time
import pandas as pd
import Tooling.input_profile_processor.input_profile_processor
import Model_Library.Prosumer.main as main
import Model_Library.District.main_district as main_district
from functools import partial
from multiprocessing import Pool
from tqdm import tqdm
import os
from enum import Enum
class SimulationScope(Enum):
PROSUMER = 1
COMMUNITY = 2
def process_each_prosumer(prosumer_name, prosumer_specification, input_profiles, t_horizon, t_step, prosumer_strategy):
start_time = time.time()
prosumer = main.Main(prosumer_name, prosumer_specification, input_profiles, t_horizon, t_step)
after_setup_time = time.time()
print("process_each_prosumer:\tProsumer Construction [s]: \t" + str(after_setup_time - start_time))
prosumer.run_optimization(prosumer_strategy)
after_optimization_time = time.time()
print("process_each_prosumer:\tProsumer Optimization [s]: \t" + str(after_optimization_time - after_setup_time))
prosumer.show_results()
return prosumer.prosumer
start_time = time.time()
simulation_scope = SimulationScope.COMMUNITY
t_start = pd.Timestamp("2019-05-10 00:00:00") # start time of simulation
t_horizon = 240 # number of time steps to be simulated
t_step = 1 # length of a time step in hours
input_profile_dict = {'irradiance_1': ['irradiance', 'input_files/data/irradiance/Lindenberg2006BSRN_Irradiance_60sec.csv'],
'temperature_1': ['air_temperature', 'input_files/data/temperature/temperature.csv'],
'demand_electric_1': ['elec_demand', 'generate', 3000],
'demand_heat_1': ['therm_demand', 'generate', 6000, 'temperature_1'],
'demand_hot_water_1': ['hot_water_demand', 'generate', 1500, 'temperature_1'],
'irradiance_2': ['irradiance', 'input_files/data/irradiance/Lindenberg2006BSRN_Irradiance_60sec.csv'],
'temperature_2': ['air_temperature', 'input_files/data/temperature/temperature.csv'],
'demand_electric_2': ['elec_demand', 'generate', 3000],
'demand_heat_2': ['therm_demand', 'generate', 6000, 'temperature_2'],
'demand_hot_water_2': ['hot_water_demand', 'generate', 1500, 'temperature_2'],
'irradiance_3': ['irradiance', 'input_files/data/irradiance/Lindenberg2006BSRN_Irradiance_60sec.csv'],
'temperature_3': ['air_temperature', 'input_files/data/temperature/temperature.csv'],
'demand_electric_3': ['elec_demand', 'generate', 0],
'demand_heat_3': ['therm_demand', 'generate', 0, 'temperature_3'],
'demand_hot_water_3': ['hot_water_demand', 'generate', 0, 'temperature_3'],
'elec_price_1': ['elec_price', 'input_files/data/prices/day-ahead/hourly_price.csv']}
input_profiles = Tooling.input_profile_processor.input_profile_processor.process_input_profiles(input_profile_dict, t_start, t_horizon, t_step)
after_input_processing_time = time.time()
print("runme:\t\t\tProfile Processing [s]: \t" + str(after_input_processing_time - start_time))
# 'topology_path': path to directory that contains the matrices that define the prosumer topology
# 'config_path': path to global configurations like prices, injection prices, emission costs, etc.
prosumer_dict = {'SCN2_CAT1_PV11_3000_6000':{'topology_path': 'input_files/models/prosumer_models/SCN2_CAT1_PV11',
'config_path': 'input_files/models/prosumer_models/SCN2_CAT1_PV11/config.csv',
'profiles': {'pv_roof': ('irradiance_1', 'temperature_1'),
'elec_cns': 'demand_electric_1',
'therm_cns': 'demand_heat_1',
'dhw_dmd': 'demand_hot_water_1'}},
'SCN0_CAT1_3000_6000': {'topology_path': 'input_files/models/prosumer_models/SCN0_CAT1',
'config_path': 'input_files/models/prosumer_models/SCN0_CAT1/config.csv',
'profiles': {'elec_cns': 'demand_electric_2',
'therm_cns': 'demand_heat_2',
'dhw_dmd': 'demand_hot_water_2'}},}
prosumer_strategy = ['annuity']
parallel_processing = False
before_optimization_time = time.time()
print("runme:\t\t\tProsumer Setup [s]: \t\t" + str(before_optimization_time - after_input_processing_time))
# Run multiple independent prosumers in parallel on multiple cores
prosumers = dict.fromkeys(prosumer_dict.keys())
if parallel_processing:
count_processes = len(prosumer_dict.keys())
pool = Pool(os.cpu_count())
parallel_func = partial(process_each_prosumer, input_profiles = input_profiles, t_horizon = t_horizon, t_step = t_step, prosumer_strategy = prosumer_strategy)
mapped_values = list(tqdm(pool.map(parallel_func, list(prosumer_dict.keys()), list(prosumer_dict.values())), total = count_processes))
# Normal processing, one core only
else:
for prosumer_name in list(prosumer_dict.keys()):
prosumers[prosumer_name] = process_each_prosumer(prosumer_name, prosumer_dict[prosumer_name], input_profiles, t_horizon, t_step, prosumer_strategy)
after_optimization_time = time.time()
print("runme:\t\t\tProsumer Optimization [s]: \t" + str(after_optimization_time - before_optimization_time))
if simulation_scope == SimulationScope.PROSUMER:
exit()
start_community_time = time.time()
community_assets_dict = {'ca_bat': {'topology_path': 'input_files/models/district_models/example_CA',
'config_path': 'input_files/models/district_models/example_CA/config.csv',
'profiles': {'elec_cns_ca_bat': 'demand_electric_3'}}}
community_assets_strategy = 'sizing_max_operational_profit'
before_community_assets_time = time.time()
print("runme:\t\t\tCommunity Assets Setup [s]: \t" + str(before_community_assets_time - start_community_time))
community_assets = main.Main_CA(community_assets_dict, input_profiles, t_horizon, t_step).community_assets
after_community_assets_time = time.time()
print("runme:\t\t\tCommunity Assets Constr. [s]: \t" + str(after_community_assets_time - before_community_assets_time))
community_dict = {'community': {'config_path': 'input_files/models/district_models/example_community/config.csv',
'profiles': {'elec_price': 'elec_price_1'}}}
community_strategy = ['max_operational_profit']
before_community_optimization_time = time.time()
print("runme:\t\t\tComm. Optimization Setup [s]: \t" + str(before_community_optimization_time - after_community_assets_time))
community_main = main_district.MainDistrict(community_dict, prosumers, community_assets, input_profiles, t_horizon, t_step, community_assets_strategy, community_strategy)
after_community_optimization_time = time.time()
print("runme:\t\t\tCommunity Optimization [s]: \t" + str(after_community_optimization_time - before_community_optimization_time))