Skip to content
Snippets Groups Projects
Select Git revision
  • 32a73e395cea57c2e74880619e750239ee4531ad
  • dev default
2 results

main.js

Blame
  • 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))