Exemplo n.º 1
0
def heating_source_activator(Q_therm_req_W, hour, master_to_slave_vars, mdot_DH_req_kgpers, tdhsup_K, tdhret_req_K, TretsewArray_K,
                             gv, prices, lca, T_ground):
    """
    :param Q_therm_req_W:
    :param hour:
    :param context:
    :type Q_therm_req_W: float
    :type hour: int
    :type context: list
    :return: cost_data_centralPlant_op, source_info, Q_source_data, E_coldsource_data, E_PP_el_data, E_gas_data, E_wood_data, Q_excess
    :rtype:
    """

    current_source = ACT_FIRST  # Start with first source, no cost yet
    Q_therm_req_W_copy = Q_therm_req_W
    # Initializing resulting values (necessairy as not all of them are over-written):
    Q_uncovered_W = 0
    cost_HPSew_USD, cost_HPLake_USD, cost_GHP_USD, cost_CHP_USD, cost_Furnace_USD, cost_BaseBoiler_USD, cost_PeakBoiler_USD = 0, 0, 0, 0, 0, 0, 0

    # initialize all sources to be off = 0 (turn to "on" with setting to 1)
    source_HP_Sewage = 0
    source_HP_Lake = 0
    source_GHP = 0
    source_CHP = 0
    source_Furnace = 0
    source_BaseBoiler = 0
    source_PeakBoiler = 0
    Q_excess_W = 0
    Q_HPSew_gen_W, Q_HPLake_gen_W, Q_GHP_gen_W, Q_CHP_gen_W, Q_Furnace_gen_W, Q_BaseBoiler_gen_W, Q_PeakBoiler_gen_W = 0, 0, 0, 0, 0, 0, 0
    E_HPSew_req_W, E_HPLake_req_W, E_GHP_req_W, E_CHP_gen_W, E_Furnace_gen_W, E_BaseBoiler_req_W, E_PeakBoiler_req_W = 0, 0, 0, 0, 0, 0, 0
    Gas_used_HPSew_W, Gas_used_HPLake_W, Gas_used_GHP_W, Gas_used_CHP_W, Gas_used_Furnace_W, Gas_used_BaseBoiler_W, Gas_used_PeakBoiler_W = 0, 0, 0, 0, 0, 0, 0
    Wood_used_HPSew_W, Wood_used_HPLake_W, Wood_used_GHP_W, Wood_used_CHP_W, Wood_used_Furnace_W, Wood_used_BaseBoiler_W, Wood_used_PeakBoiler_W = 0, 0, 0, 0, 0, 0, 0
    Q_coldsource_HPSew_W, Q_coldsource_HPLake_W, Q_coldsource_GHP_W, Q_coldsource_CHP_W, \
    Q_coldsource_Furnace_W, Q_coldsource_BaseBoiler_W, Q_coldsource_PeakBoiler_W = 0, 0, 0, 0, 0, 0, 0

    while Q_therm_req_W > 1E-1:  # cover demand as long as the supply is lower than demand!
        if current_source == 'HP':  # use heat pumps available!

            if (master_to_slave_vars.HP_Sew_on) == 1 and Q_therm_req_W > 0 and HP_SEW_ALLOWED == 1:  # activate if its available

                source_HP_Sewage = 0
                cost_HPSew_USD = 0.0
                Q_HPSew_gen_W = 0.0
                E_HPSew_req_W = 0.0
                Q_coldsource_HPSew_W = 0.0

                if Q_therm_req_W > master_to_slave_vars.HPSew_maxSize_W:
                    Q_therm_Sew_W = master_to_slave_vars.HPSew_maxSize_W
                    mdot_DH_to_Sew_kgpers = mdot_DH_req_kgpers * Q_therm_Sew_W / Q_therm_req_W.copy()  # scale down the mass flow if the thermal demand is lowered

                else:
                    Q_therm_Sew_W = float(Q_therm_req_W.copy())
                    mdot_DH_to_Sew_kgpers = float(mdot_DH_req_kgpers.copy())

                C_HPSew_el_pure, C_HPSew_per_kWh_th_pure, Q_HPSew_cold_primary_W, Q_HPSew_therm_W, E_HPSew_req_W = HPSew_op_cost(mdot_DH_to_Sew_kgpers, tdhsup_K, tdhret_req_K, TretsewArray_K,
                                                  lca, Q_therm_Sew_W)
                Q_therm_req_W -= Q_HPSew_therm_W

                # Storing data for further processing
                if Q_HPSew_therm_W > 0:
                    source_HP_Sewage = 1
                cost_HPSew_USD = float(C_HPSew_el_pure)
                Q_HPSew_gen_W = float(Q_HPSew_therm_W)
                E_HPSew_req_W = float(E_HPSew_req_W)
                Q_coldsource_HPSew_W = float(Q_HPSew_cold_primary_W)

            if (master_to_slave_vars.GHP_on) == 1 and hour >= master_to_slave_vars.GHP_SEASON_ON and hour <= master_to_slave_vars.GHP_SEASON_OFF and Q_therm_req_W > 0 and not np.isclose(
                    tdhsup_K, tdhret_req_K):
                # activating GHP plant if possible

                source_GHP = 0
                cost_GHP_USD = 0.0
                Q_GHP_gen_W = 0.0
                E_GHP_req_W = 0.0
                Q_coldsource_GHP_W = 0.0

                Q_max_W, GHP_COP = GHP_Op_max(tdhsup_K, T_ground, master_to_slave_vars.GHP_number)

                if Q_therm_req_W > Q_max_W:
                    mdot_DH_to_GHP_kgpers = Q_max_W / (HEAT_CAPACITY_OF_WATER_JPERKGK * (tdhsup_K - tdhret_req_K))
                    Q_therm_req_W -= Q_max_W

                else:  # regular operation possible, demand is covered
                    mdot_DH_to_GHP_kgpers = Q_therm_req_W.copy() / (HEAT_CAPACITY_OF_WATER_JPERKGK * (tdhsup_K - tdhret_req_K))
                    Q_therm_req_W = 0

                C_GHP_el, E_GHP_req_W, Q_GHP_cold_primary_W, Q_GHP_therm_W = GHP_op_cost(mdot_DH_to_GHP_kgpers, tdhsup_K, tdhret_req_K, GHP_COP, lca)

                # Storing data for further processing
                source_GHP = 1
                cost_GHP_USD = C_GHP_el
                Q_GHP_gen_W = Q_GHP_therm_W
                E_GHP_req_W = E_GHP_req_W
                Q_coldsource_GHP_W = Q_GHP_cold_primary_W

            if (master_to_slave_vars.HP_Lake_on) == 1 and Q_therm_req_W > 0 and HP_LAKE_ALLOWED == 1 and not np.isclose(tdhsup_K,
                                                                                                          tdhret_req_K):  # run Heat Pump Lake
                source_HP_Lake = 0
                cost_HPLake_USD = 0
                Q_HPLake_gen_W = 0
                E_HPLake_req_W = 0
                Q_coldsource_HPLake_W = 0

                if Q_therm_req_W > master_to_slave_vars.HPLake_maxSize_W:  # Scale down Load, 100% load achieved
                    Q_therm_HPL_W = master_to_slave_vars.HPLake_maxSize_W
                    mdot_DH_to_Lake_kgpers = Q_therm_HPL_W / (
                            HEAT_CAPACITY_OF_WATER_JPERKGK * (
                            tdhsup_K - tdhret_req_K))  # scale down the mass flow if the thermal demand is lowered
                    Q_therm_req_W -= master_to_slave_vars.HPLake_maxSize_W

                else:  # regular operation possible
                    Q_therm_HPL_W = Q_therm_req_W.copy()
                    mdot_DH_to_Lake_kgpers = Q_therm_HPL_W / (HEAT_CAPACITY_OF_WATER_JPERKGK * (tdhsup_K - tdhret_req_K))
                    Q_therm_req_W = 0
                C_HPL_el, E_HPLake_req_W, Q_HPL_cold_primary_W, Q_HPL_therm_W = HPLake_op_cost(mdot_DH_to_Lake_kgpers, tdhsup_K, tdhret_req_K, T_LAKE, lca)

                # Storing Data
                source_HP_Lake = 1
                cost_HPLake_USD = C_HPL_el
                Q_HPLake_gen_W = Q_therm_HPL_W
                E_HPLake_req_W = E_HPLake_req_W
                Q_coldsource_HPLake_W = Q_HPL_cold_primary_W

        if current_source == 'CHP' and Q_therm_req_W > 0:  # start activating the combined cycles

            # By definition, one can either activate the CHP (NG-CC) or ORC (Furnace) BUT NOT BOTH at the same time (not activated by Master)
            Cost_CC = 0.0
            source_CHP = 0
            cost_CHP_USD = 0.0
            Q_CHP_gen_W = 0.0
            Gas_used_CHP_W = 0.0
            E_CHP_gen_W = 0

            if (master_to_slave_vars.CC_on) == 1 and Q_therm_req_W > 0 and CC_ALLOWED == 1:  # only operate if the plant is available
                CC_op_cost_data = calc_cop_CCGT(master_to_slave_vars.CC_GT_SIZE_W, tdhsup_K, master_to_slave_vars.gt_fuel,
                                                prices, lca)  # create cost information
                Q_used_prim_CC_fn_W = CC_op_cost_data['q_input_fn_q_output_W']
                cost_per_Wh_CC_fn = CC_op_cost_data['fuel_cost_per_Wh_th_fn_q_output_W']  # gets interpolated cost function
                q_output_CC_min_W = CC_op_cost_data['q_output_min_W']
                Q_output_CC_max_W = CC_op_cost_data['q_output_max_W']
                eta_elec_interpol = CC_op_cost_data['eta_el_fn_q_input']

                if Q_therm_req_W > q_output_CC_min_W:  # operation Possible if above minimal load
                    if Q_therm_req_W < Q_output_CC_max_W:  # Normal operation Possible within partload regime
                        cost_per_Wh_CC = cost_per_Wh_CC_fn(Q_therm_req_W)
                        Q_used_prim_CC_W = Q_used_prim_CC_fn_W(Q_therm_req_W)
                        Q_CC_delivered_W = Q_therm_req_W.copy()
                        Q_therm_req_W = 0
                        E_CHP_gen_W = np.float(eta_elec_interpol(Q_used_prim_CC_W)) * Q_used_prim_CC_W


                    else:  # Only part of the demand can be delivered as 100% load achieved
                        cost_per_Wh_CC = cost_per_Wh_CC_fn(Q_output_CC_max_W)
                        Q_used_prim_CC_W = Q_used_prim_CC_fn_W(Q_output_CC_max_W)
                        Q_CC_delivered_W = Q_output_CC_max_W
                        Q_therm_req_W -= Q_output_CC_max_W
                        E_CHP_gen_W = np.float(eta_elec_interpol(Q_output_CC_max_W)) * Q_used_prim_CC_W

                    Cost_CC = cost_per_Wh_CC * Q_CC_delivered_W
                    source_CHP = 1
                    cost_CHP_USD = Cost_CC
                    Q_CHP_gen_W = Q_CC_delivered_W
                    Gas_used_CHP_W = Q_used_prim_CC_W

            if (master_to_slave_vars.Furnace_on) == 1 and Q_therm_req_W > 0:  # Activate Furnace if its there. By definition, either ORC or NG-CC!
                Q_Furn_therm_W = 0
                source_Furnace = 0
                cost_Furnace_USD = 0.0
                Q_Furnace_gen_W = 0.0
                Wood_used_Furnace_W = 0.0
                Q_Furn_prim_W = 0.0

                if Q_therm_req_W > (
                        gv.Furn_min_Load * master_to_slave_vars.Furnace_Q_max_W):  # Operate only if its above minimal load

                    if Q_therm_req_W > master_to_slave_vars.Furnace_Q_max_W:  # scale down if above maximum load, Furnace operates at max. capacity
                        Furnace_Cost_Data = furnace_op_cost(master_to_slave_vars.Furnace_Q_max_W, master_to_slave_vars.Furnace_Q_max_W, tdhret_req_K,
                                                            master_to_slave_vars.Furn_Moist_type, gv)

                        C_Furn_therm = Furnace_Cost_Data[0]
                        Q_Furn_prim_W = Furnace_Cost_Data[2]
                        Q_Furn_therm_W = master_to_slave_vars.Furnace_Q_max_W
                        Q_therm_req_W -= Q_Furn_therm_W
                        E_Furnace_gen_W = Furnace_Cost_Data[4]

                    else:  # Normal Operation Possible
                        Furnace_Cost_Data = furnace_op_cost(Q_therm_req_W, master_to_slave_vars.Furnace_Q_max_W, tdhret_req_K,
                                                            master_to_slave_vars.Furn_Moist_type, gv)

                        Q_Furn_prim_W = Furnace_Cost_Data[2]
                        C_Furn_therm = Furnace_Cost_Data[0]
                        Q_Furn_therm_W = Q_therm_req_W.copy()
                        E_Furnace_gen_W = Furnace_Cost_Data[4]

                        Q_therm_req_W = 0

                    source_Furnace = 1
                    cost_Furnace_USD = C_Furn_therm.copy()
                    Q_Furnace_gen_W = Q_Furn_therm_W
                    Wood_used_Furnace_W = Q_Furn_prim_W


        if current_source == 'BoilerBase' and Q_therm_req_W > 0:

            Q_therm_boiler_W = 0
            if (master_to_slave_vars.Boiler_on) == 1:
                source_BaseBoiler = 0
                cost_BaseBoiler_USD = 0.0
                Q_BaseBoiler_gen_W = 0.0
                Gas_used_BaseBoiler_W = 0.0
                E_BaseBoiler_req_W = 0.0

                if Q_therm_req_W >= BOILER_MIN * master_to_slave_vars.Boiler_Q_max_W:  # Boiler can be activated?
                    # Q_therm_boiler = Q_therm_req

                    if Q_therm_req_W >= master_to_slave_vars.Boiler_Q_max_W:  # Boiler above maximum Load?
                        Q_therm_boiler_W = master_to_slave_vars.Boiler_Q_max_W
                    else:
                        Q_therm_boiler_W = Q_therm_req_W.copy()

                    C_boil_therm, C_boil_per_Wh, Q_primary_W, E_aux_Boiler_req_W = cond_boiler_op_cost(Q_therm_boiler_W, master_to_slave_vars.Boiler_Q_max_W, tdhret_req_K, \
                                                           master_to_slave_vars.BoilerType, master_to_slave_vars.EL_TYPE, gv, prices, lca)

                    source_BaseBoiler = 1
                    cost_BaseBoiler_USD = C_boil_therm
                    Q_BaseBoiler_gen_W = Q_therm_boiler_W
                    Gas_used_BaseBoiler_W = Q_primary_W
                    E_BaseBoiler_req_W = E_aux_Boiler_req_W
                    Q_therm_req_W -= Q_therm_boiler_W


        if current_source == 'BoilerPeak' and Q_therm_req_W > 0:

            if (master_to_slave_vars.BoilerPeak_on) == 1:
                source_PeakBoiler = 0
                cost_PeakBoiler_USD = 0.0
                Q_PeakBoiler_gen_W = 0.0
                Gas_used_PeakBoiler_W = 0
                E_PeakBoiler_req_W = 0

                if Q_therm_req_W > 0:  # gv.Boiler_min*master_to_slave_vars.BoilerPeak_Q_max: # Boiler can be activated?

                    if Q_therm_req_W > master_to_slave_vars.BoilerPeak_Q_max_W:  # Boiler above maximum Load?
                        Q_therm_boilerP_W = master_to_slave_vars.BoilerPeak_Q_max_W
                        Q_therm_req_W -= Q_therm_boilerP_W
                    else:
                        Q_therm_boilerP_W = Q_therm_req_W.copy()
                        Q_therm_req_W = 0

                    C_boil_thermP, C_boil_per_WhP, Q_primaryP_W, E_aux_BoilerP_W = cond_boiler_op_cost(Q_therm_boilerP_W, master_to_slave_vars.BoilerPeak_Q_max_W, tdhret_req_K, \
                                                            master_to_slave_vars.BoilerPeakType, master_to_slave_vars.EL_TYPE, gv, prices, lca)

                    source_PeakBoiler = 1
                    cost_PeakBoiler_USD = C_boil_thermP
                    Q_PeakBoiler_gen_W = Q_therm_boilerP_W
                    Gas_used_PeakBoiler_W = Q_primaryP_W
                    E_PeakBoiler_req_W = E_aux_BoilerP_W

        Q_excess_W = 0
        if np.floor(Q_therm_req_W) > 0:
            if current_source == ACT_FIRST:
                current_source = ACT_SECOND
            elif current_source == ACT_SECOND:
                current_source = ACT_THIRD
            elif current_source == ACT_THIRD:
                current_source = ACT_FOURTH
            else:
                Q_uncovered_W = Q_therm_req_W
                break

        elif round(Q_therm_req_W, 0) != 0:
            Q_uncovered_W = 0  # Q_therm_req
            Q_excess_W = -Q_therm_req_W
            Q_therm_req_W = 0
            # break
        else:
            Q_therm_req_W = 0

    source_info = source_HP_Sewage, source_HP_Lake, source_GHP, source_CHP, source_Furnace, source_BaseBoiler, source_PeakBoiler
    Q_source_data_W = Q_HPSew_gen_W, Q_HPLake_gen_W, Q_GHP_gen_W, Q_CHP_gen_W, Q_Furnace_gen_W, Q_BaseBoiler_gen_W, Q_PeakBoiler_gen_W, Q_uncovered_W
    E_PP_el_data_W = E_HPSew_req_W, E_HPLake_req_W, E_GHP_req_W, E_CHP_gen_W, E_Furnace_gen_W, E_BaseBoiler_req_W, E_PeakBoiler_req_W
    E_gas_data_W = Gas_used_HPSew_W, Gas_used_HPLake_W, Gas_used_GHP_W, Gas_used_CHP_W, Gas_used_Furnace_W, Gas_used_BaseBoiler_W, Gas_used_PeakBoiler_W
    E_wood_data_W = Wood_used_HPSew_W, Wood_used_HPLake_W, Wood_used_GHP_W, Wood_used_CHP_W, Wood_used_Furnace_W, Wood_used_BaseBoiler_W, Wood_used_PeakBoiler_W
    E_coldsource_data_W = Q_coldsource_HPSew_W, Q_coldsource_HPLake_W, Q_coldsource_GHP_W, Q_coldsource_CHP_W, \
                          Q_coldsource_Furnace_W, Q_coldsource_BaseBoiler_W, Q_coldsource_PeakBoiler_W

    opex_output = {'Opex_var_HP_Sewage_USD':cost_HPSew_USD,
              'Opex_var_HP_Lake_USD': cost_HPLake_USD,
              'Opex_var_GHP_USD': cost_GHP_USD,
              'Opex_var_CHP_USD': cost_CHP_USD,
              'Opex_var_Furnace_USD': cost_Furnace_USD,
              'Opex_var_BaseBoiler_USD': cost_BaseBoiler_USD,
              'Opex_var_PeakBoiler_USD': cost_PeakBoiler_USD}

    source_output = {'HP_Sewage': source_HP_Sewage,
                     'HP_Lake': source_HP_Lake,
                     'GHP': source_GHP,
                     'CHP': source_CHP,
                     'Furnace': source_Furnace,
                     'BaseBoiler': source_BaseBoiler,
                     'PeakBoiler': source_PeakBoiler}

    Q_output = {'Q_HPSew_gen_W': Q_HPSew_gen_W,
                'Q_HPLake_gen_W': Q_HPLake_gen_W,
                'Q_GHP_gen_W': Q_GHP_gen_W,
                'Q_CHP_gen_W': Q_CHP_gen_W,
                'Q_Furnace_gen_W': Q_Furnace_gen_W,
                'Q_BaseBoiler_gen_W': Q_BaseBoiler_gen_W,
                'Q_PeakBoiler_gen_W': Q_PeakBoiler_gen_W,
                'Q_uncovered_W': Q_uncovered_W}

    E_output = {'E_HPSew_req_W': E_HPSew_req_W,
                'E_HPLake_req_W': E_HPLake_req_W,
                'E_GHP_req_W': E_GHP_req_W,
                'E_CHP_gen_W': E_CHP_gen_W,
                'E_Furnace_gen_W': E_Furnace_gen_W,
                'E_BaseBoiler_req_W': E_BaseBoiler_req_W,
                'E_PeakBoiler_req_W': E_PeakBoiler_req_W}

    Gas_output = {'Gas_used_HPSew_W': Gas_used_HPSew_W,
                  'Gas_used_HPLake_W': Gas_used_HPLake_W,
                  'Gas_used_GHP_W': Gas_used_GHP_W,
                  'Gas_used_CHP_W': Gas_used_CHP_W,
                  'Gas_used_Furnace_W': Gas_used_Furnace_W,
                  'Gas_used_BaseBoiler_W': Gas_used_BaseBoiler_W,
                  'Gas_used_PeakBoiler_W': Gas_used_PeakBoiler_W}

    Wood_output = {'Wood_used_HPSew_W': Wood_used_HPSew_W,
                   'Wood_used_HPLake_W': Wood_used_HPLake_W,
                   'Wood_used_GHP_W': Wood_used_GHP_W,
                   'Wood_used_CHP_W': Wood_used_CHP_W,
                   'Wood_used_Furnace_W': Wood_used_Furnace_W,
                   'Wood_used_BaseBoiler_W': Wood_used_BaseBoiler_W,
                   'Wood_used_PeakBoiler_W': Wood_used_PeakBoiler_W}

    coldsource_output = {'Q_coldsource_HPSew_W': Q_coldsource_HPSew_W,
                         'Q_coldsource_HPLake_W': Q_coldsource_HPLake_W,
                         'Q_coldsource_GHP_W': Q_coldsource_GHP_W,
                         'Q_coldsource_CHP_W': Q_coldsource_CHP_W,
                         'Q_coldsource_Furnace_W': Q_coldsource_Furnace_W,
                         'Q_coldsource_BaseBoiler_W': Q_coldsource_BaseBoiler_W,
                         'Q_coldsource_PeakBoiler_W': Q_coldsource_PeakBoiler_W}

    return opex_output, source_output, Q_output, E_output, Gas_output, Wood_output, coldsource_output, Q_excess_W
Exemplo n.º 2
0
def heating_calculations_of_DH_buildings(locator, master_to_slave_vars, gv,
                                         config, prices, lca):
    """
    Computes the parameters for the heating of the complete DHN

    :param locator: locator class
    :param master_to_slave_vars: class MastertoSlaveVars containing the value of variables to be passed to the
        slave optimization for each individual
    :param solar_features: solar features class
    :param gv: global variables class
    :type locator: class
    :type master_to_slave_vars: class
    :type solar_features: class
    :type gv: class
    :return:
        - E_oil_eq_MJ: MJ oil Equivalent used during operation
        - CO2_kg_eq: kg of CO2-Equivalent emitted during operation
        - cost_sum: total cost in CHF used for operation
        - Q_source_data[:,7]: uncovered demand

    :rtype: float, float, float, array

    """
    t = time.time()

    # Import data from storage optimization
    centralized_plant_data = pd.read_csv(
        locator.get_optimization_slave_storage_operation_data(
            master_to_slave_vars.individual_number,
            master_to_slave_vars.generation_number))
    E_aux_ch_W = np.array(centralized_plant_data['E_aux_ch_W'])
    E_aux_dech_W = np.array(centralized_plant_data['E_aux_dech_W'])
    Q_missing_W = np.array(centralized_plant_data['Q_missing_W'])
    E_aux_solar_and_heat_recovery_W = np.array(
        centralized_plant_data['E_aux_solar_and_heat_recovery_Wh'])
    Q_SC_ET_gen_Wh = np.array(centralized_plant_data['Q_SC_ET_gen_Wh'])
    Q_SC_FP_gen_Wh = np.array(centralized_plant_data['Q_SC_FP_gen_Wh'])
    Q_PVT_gen_Wh = np.array(centralized_plant_data['Q_PVT_gen_Wh'])
    Q_SCandPVT_gen_Wh = Q_SC_ET_gen_Wh + Q_SC_FP_gen_Wh + Q_PVT_gen_Wh
    E_PV_gen_W = np.array(centralized_plant_data['E_PV_Wh'])
    E_PVT_gen_W = np.array(centralized_plant_data['E_PVT_Wh'])
    E_produced_solar_W = np.array(
        centralized_plant_data['E_produced_from_solar_W'])

    E_solar_gen_W = np.add(E_PV_gen_W, E_PVT_gen_W)

    Q_missing_copy_W = Q_missing_W.copy()

    # Import Temperatures from Network Summary:
    network_data = pd.read_csv(
        locator.get_optimization_network_data_folder(
            master_to_slave_vars.network_data_file_heating))
    tdhret_K = network_data['T_DHNf_re_K']

    mdot_DH_kgpers = network_data['mdot_DH_netw_total_kgpers']
    tdhsup_K = network_data['T_DHNf_sup_K']
    # import Marginal Cost of PP Data :
    # os.chdir(Cost_Maps_Path)

    # FIXED ORDER ACTIVATION STARTS
    # Import Data - Sewage
    if HP_SEW_ALLOWED == 1:
        HPSew_Data = pd.read_csv(locator.get_sewage_heat_potential())
        QcoldsewArray = np.array(HPSew_Data['Qsw_kW']) * 1E3
        TretsewArray_K = np.array(HPSew_Data['ts_C']) + 273

    # Initiation of the variables
    Opex_var_HP_Sewage_USD = np.zeros(8760)
    Opex_var_HP_Lake_USD = np.zeros(8760)
    Opex_var_GHP_USD = np.zeros(8760)
    Opex_var_CHP_USD = np.zeros(8760)
    Opex_var_Furnace_USD = np.zeros(8760)
    Opex_var_BaseBoiler_USD = np.zeros(8760)
    Opex_var_PeakBoiler_USD = np.zeros(8760)

    source_HP_Sewage = np.zeros(8760)
    source_HP_Lake = np.zeros(8760)
    source_GHP = np.zeros(8760)
    source_CHP = np.zeros(8760)
    source_Furnace = np.zeros(8760)
    source_BaseBoiler = np.zeros(8760)
    source_PeakBoiler = np.zeros(8760)

    Q_HPSew_gen_W = np.zeros(8760)
    Q_HPLake_gen_W = np.zeros(8760)
    Q_GHP_gen_W = np.zeros(8760)
    Q_CHP_gen_W = np.zeros(8760)
    Q_Furnace_gen_W = np.zeros(8760)
    Q_BaseBoiler_gen_W = np.zeros(8760)
    Q_PeakBoiler_gen_W = np.zeros(8760)
    Q_uncovered_W = np.zeros(8760)

    E_HPSew_req_W = np.zeros(8760)
    E_HPLake_req_W = np.zeros(8760)
    E_GHP_req_W = np.zeros(8760)
    E_CHP_gen_W = np.zeros(8760)
    E_Furnace_gen_W = np.zeros(8760)
    E_BaseBoiler_req_W = np.zeros(8760)
    E_PeakBoiler_req_W = np.zeros(8760)

    NG_used_HPSew_W = np.zeros(8760)
    NG_used_HPLake_W = np.zeros(8760)
    NG_used_GHP_W = np.zeros(8760)
    NG_used_CHP_W = np.zeros(8760)
    NG_used_Furnace_W = np.zeros(8760)
    NG_used_BaseBoiler_W = np.zeros(8760)
    NG_used_PeakBoiler_W = np.zeros(8760)
    NG_used_BackupBoiler_W = np.zeros(8760)

    BG_used_HPSew_W = np.zeros(8760)
    BG_used_HPLake_W = np.zeros(8760)
    BG_used_GHP_W = np.zeros(8760)
    BG_used_CHP_W = np.zeros(8760)
    BG_used_Furnace_W = np.zeros(8760)
    BG_used_BaseBoiler_W = np.zeros(8760)
    BG_used_PeakBoiler_W = np.zeros(8760)

    Wood_used_HPSew_W = np.zeros(8760)
    Wood_used_HPLake_W = np.zeros(8760)
    Wood_used_GHP_W = np.zeros(8760)
    Wood_used_CHP_W = np.zeros(8760)
    Wood_used_Furnace_W = np.zeros(8760)
    Wood_used_BaseBoiler_W = np.zeros(8760)
    Wood_used_PeakBoiler_W = np.zeros(8760)

    Q_coldsource_HPSew_W = np.zeros(8760)
    Q_coldsource_HPLake_W = np.zeros(8760)
    Q_coldsource_GHP_W = np.zeros(8760)
    Q_coldsource_CHP_W = np.zeros(8760)
    Q_coldsource_Furnace_W = np.zeros(8760)
    Q_coldsource_BaseBoiler_W = np.zeros(8760)
    Q_coldsource_PeakBoiler_W = np.zeros(8760)

    Q_excess_W = np.zeros(8760)
    weather_data = epwreader.epw_reader(config.weather)[[
        'year', 'drybulb_C', 'wetbulb_C', 'relhum_percent', 'windspd_ms',
        'skytemp_C'
    ]]
    ground_temp = calc_ground_temperature(locator,
                                          weather_data['drybulb_C'],
                                          depth_m=10)

    weather_data = epwreader.epw_reader(config.weather)[[
        'year', 'drybulb_C', 'wetbulb_C', 'relhum_percent', 'windspd_ms',
        'skytemp_C'
    ]]
    ground_temp = calc_ground_temperature(locator,
                                          weather_data['drybulb_C'],
                                          depth_m=10)

    for hour in range(8760):
        Q_therm_req_W = Q_missing_W[hour]
        # cost_data_centralPlant_op[hour, :], source_info[hour, :], Q_source_data_W[hour, :], E_coldsource_data_W[hour,
        #                                                                                     :], \
        # E_PP_el_data_W[hour, :], E_gas_data_W[hour, :], E_wood_data_W[hour, :], Q_excess_W[hour] = source_activator(
        #     Q_therm_req_W, hour, master_to_slave_vars, mdot_DH_kgpers[hour], tdhsup_K,
        #     tdhret_K[hour], TretsewArray_K[hour], gv, prices)
        opex_output, source_output, Q_output, E_output, Gas_output, Wood_output, coldsource_output, Q_excess_W[
            hour] = heating_source_activator(Q_therm_req_W, hour,
                                             master_to_slave_vars,
                                             mdot_DH_kgpers[hour],
                                             tdhsup_K[hour], tdhret_K[hour],
                                             TretsewArray_K[hour], gv, prices,
                                             lca, ground_temp[hour])

        Opex_var_HP_Sewage_USD[hour] = opex_output['Opex_var_HP_Sewage_USD']
        Opex_var_HP_Lake_USD[hour] = opex_output['Opex_var_HP_Lake_USD']
        Opex_var_GHP_USD[hour] = opex_output['Opex_var_GHP_USD']
        Opex_var_CHP_USD[hour] = opex_output['Opex_var_CHP_USD']
        Opex_var_Furnace_USD[hour] = opex_output['Opex_var_Furnace_USD']
        Opex_var_BaseBoiler_USD[hour] = opex_output['Opex_var_BaseBoiler_USD']
        Opex_var_PeakBoiler_USD[hour] = opex_output['Opex_var_PeakBoiler_USD']

        source_HP_Sewage[hour] = source_output['HP_Sewage']
        source_HP_Lake[hour] = source_output['HP_Lake']
        source_GHP[hour] = source_output['GHP']
        source_CHP[hour] = source_output['CHP']
        source_Furnace[hour] = source_output['Furnace']
        source_BaseBoiler[hour] = source_output['BaseBoiler']
        source_PeakBoiler[hour] = source_output['PeakBoiler']

        Q_HPSew_gen_W[hour] = Q_output['Q_HPSew_gen_W']
        Q_HPLake_gen_W[hour] = Q_output['Q_HPLake_gen_W']
        Q_GHP_gen_W[hour] = Q_output['Q_GHP_gen_W']
        Q_CHP_gen_W[hour] = Q_output['Q_CHP_gen_W']
        Q_Furnace_gen_W[hour] = Q_output['Q_Furnace_gen_W']
        Q_BaseBoiler_gen_W[hour] = Q_output['Q_BaseBoiler_gen_W']
        Q_PeakBoiler_gen_W[hour] = Q_output['Q_PeakBoiler_gen_W']
        Q_uncovered_W[hour] = Q_output['Q_uncovered_W']

        E_HPSew_req_W[hour] = E_output['E_HPSew_req_W']
        E_HPLake_req_W[hour] = E_output['E_HPLake_req_W']
        E_GHP_req_W[hour] = E_output['E_GHP_req_W']
        E_CHP_gen_W[hour] = E_output['E_CHP_gen_W']
        E_Furnace_gen_W[hour] = E_output['E_Furnace_gen_W']
        E_BaseBoiler_req_W[hour] = E_output['E_BaseBoiler_req_W']
        E_PeakBoiler_req_W[hour] = E_output['E_PeakBoiler_req_W']

        if master_to_slave_vars.gt_fuel == "NG":
            NG_used_HPSew_W[hour] = Gas_output['Gas_used_HPSew_W']
            NG_used_HPLake_W[hour] = Gas_output['Gas_used_HPLake_W']
            NG_used_GHP_W[hour] = Gas_output['Gas_used_GHP_W']
            NG_used_CHP_W[hour] = Gas_output['Gas_used_CHP_W']
            NG_used_Furnace_W[hour] = Gas_output['Gas_used_Furnace_W']
            NG_used_BaseBoiler_W[hour] = Gas_output['Gas_used_BaseBoiler_W']
            NG_used_PeakBoiler_W[hour] = Gas_output['Gas_used_PeakBoiler_W']

        elif master_to_slave_vars.gt_fuel == "BG":
            BG_used_HPSew_W[hour] = Gas_output['Gas_used_HPSew_W']
            BG_used_HPLake_W[hour] = Gas_output['Gas_used_HPLake_W']
            BG_used_GHP_W[hour] = Gas_output['Gas_used_GHP_W']
            BG_used_CHP_W[hour] = Gas_output['Gas_used_CHP_W']
            BG_used_Furnace_W[hour] = Gas_output['Gas_used_Furnace_W']
            BG_used_BaseBoiler_W[hour] = Gas_output['Gas_used_BaseBoiler_W']
            BG_used_PeakBoiler_W[hour] = Gas_output['Gas_used_PeakBoiler_W']

        Wood_used_HPSew_W[hour] = Wood_output['Wood_used_HPSew_W']
        Wood_used_HPLake_W[hour] = Wood_output['Wood_used_HPLake_W']
        Wood_used_GHP_W[hour] = Wood_output['Wood_used_GHP_W']
        Wood_used_CHP_W[hour] = Wood_output['Wood_used_CHP_W']
        Wood_used_Furnace_W[hour] = Wood_output['Wood_used_Furnace_W']
        Wood_used_BaseBoiler_W[hour] = Wood_output['Wood_used_BaseBoiler_W']
        Wood_used_PeakBoiler_W[hour] = Wood_output['Wood_used_PeakBoiler_W']

        Q_coldsource_HPSew_W[hour] = coldsource_output['Q_coldsource_HPSew_W']
        Q_coldsource_HPLake_W[hour] = coldsource_output[
            'Q_coldsource_HPLake_W']
        Q_coldsource_GHP_W[hour] = coldsource_output['Q_coldsource_GHP_W']
        Q_coldsource_CHP_W[hour] = coldsource_output['Q_coldsource_CHP_W']
        Q_coldsource_Furnace_W[hour] = coldsource_output[
            'Q_coldsource_Furnace_W']
        Q_coldsource_BaseBoiler_W[hour] = coldsource_output[
            'Q_coldsource_BaseBoiler_W']
        Q_coldsource_PeakBoiler_W[hour] = coldsource_output[
            'Q_coldsource_PeakBoiler_W']

    # save data

    elapsed = time.time() - t
    # sum up the uncovered demand, get average and peak load
    Q_uncovered_design_W = np.amax(Q_uncovered_W)
    Q_uncovered_annual_W = np.sum(Q_uncovered_W)
    Opex_var_BackupBoiler_USD = np.zeros(8760)
    Q_BackupBoiler_W = np.zeros(8760)
    E_BackupBoiler_req_W = np.zeros(8760)

    Opex_var_Furnace_wet_USD = np.zeros(8760)
    Opex_var_Furnace_dry_USD = np.zeros(8760)
    Opex_var_CHP_NG_USD = np.zeros(8760)
    Opex_var_CHP_BG_USD = np.zeros(8760)
    Opex_var_BaseBoiler_NG_USD = np.zeros(8760)
    Opex_var_BaseBoiler_BG_USD = np.zeros(8760)
    Opex_var_PeakBoiler_NG_USD = np.zeros(8760)
    Opex_var_PeakBoiler_BG_USD = np.zeros(8760)
    Opex_var_BackupBoiler_NG_USD = np.zeros(8760)
    Opex_var_BackupBoiler_BG_USD = np.zeros(8760)

    Opex_var_PV_USD = np.zeros(8760)
    Opex_var_PVT_USD = np.zeros(8760)
    Opex_var_SC_USD = np.zeros(8760)

    if Q_uncovered_design_W != 0:
        for hour in range(8760):
            tdhret_req_K = tdhret_K[hour]
            BoilerBackup_Cost_Data = cond_boiler_op_cost(Q_uncovered_W[hour], Q_uncovered_design_W, tdhret_req_K, \
                                                         master_to_slave_vars.BoilerBackupType,
                                                         master_to_slave_vars.EL_TYPE, gv, prices, lca)
            Opex_var_BackupBoiler_USD[
                hour], Opex_var_BackupBoiler_per_Wh_USD, Q_BackupBoiler_W[
                    hour], E_BackupBoiler_req_W_hour = BoilerBackup_Cost_Data
            E_BackupBoiler_req_W[hour] = E_BackupBoiler_req_W_hour
            NG_used_BackupBoiler_W[hour] = Q_BackupBoiler_W[hour]
        Q_BackupBoiler_sum_W = np.sum(Q_BackupBoiler_W)
        Opex_t_var_BackupBoiler_USD = np.sum(Opex_var_BackupBoiler_USD)

    else:
        Q_BackupBoiler_sum_W = 0.0
        Opex_t_var_BackupBoiler_USD = 0.0

    if master_to_slave_vars.Furn_Moist_type == "wet":
        Opex_var_Furnace_wet_USD = Opex_var_Furnace_USD
    elif master_to_slave_vars.Furn_Moist_type == "dry":
        Opex_var_Furnace_dry_USD = Opex_var_Furnace_USD

    if master_to_slave_vars.gt_fuel == "NG":
        Opex_var_CHP_NG_USD = Opex_var_CHP_USD
        Opex_var_BaseBoiler_NG_USD = Opex_var_BaseBoiler_USD
        Opex_var_PeakBoiler_NG_USD = Opex_var_PeakBoiler_USD
        Opex_var_BackupBoiler_NG_USD = Opex_var_BackupBoiler_USD

    elif master_to_slave_vars.gt_fuel == "BG":
        Opex_var_CHP_BG_USD = Opex_var_CHP_USD
        Opex_var_BaseBoiler_BG_USD = Opex_var_BaseBoiler_USD
        Opex_var_PeakBoiler_BG_USD = Opex_var_PeakBoiler_USD
        Opex_var_BackupBoiler_BG_USD = Opex_var_BackupBoiler_USD

    # saving pattern activation to disk
    date = network_data.DATE.values
    results = pd.DataFrame({
        "DATE": date,
        "Q_Network_Demand_after_Storage_W": Q_missing_copy_W,
        "Opex_var_HP_Sewage": Opex_var_HP_Sewage_USD,
        "Opex_var_HP_Lake": Opex_var_HP_Lake_USD,
        "Opex_var_GHP": Opex_var_GHP_USD,
        "Opex_var_CHP_BG": Opex_var_CHP_BG_USD,
        "Opex_var_CHP_NG": Opex_var_CHP_NG_USD,
        "Opex_var_Furnace_wet": Opex_var_Furnace_wet_USD,
        "Opex_var_Furnace_dry": Opex_var_Furnace_dry_USD,
        "Opex_var_BaseBoiler_BG": Opex_var_BaseBoiler_BG_USD,
        "Opex_var_BaseBoiler_NG": Opex_var_BaseBoiler_NG_USD,
        "Opex_var_PeakBoiler_BG": Opex_var_PeakBoiler_BG_USD,
        "Opex_var_PeakBoiler_NG": Opex_var_PeakBoiler_NG_USD,
        "Opex_var_BackupBoiler_BG": Opex_var_BackupBoiler_BG_USD,
        "Opex_var_BackupBoiler_NG": Opex_var_BackupBoiler_NG_USD,
        "HPSew_Status": source_HP_Sewage,
        "HPLake_Status": source_HP_Lake,
        "GHP_Status": source_GHP,
        "CHP_Status": source_CHP,
        "Furnace_Status": source_Furnace,
        "BoilerBase_Status": source_BaseBoiler,
        "BoilerPeak_Status": source_PeakBoiler,
        "Q_HPSew_W": Q_HPSew_gen_W,
        "Q_HPLake_W": Q_HPLake_gen_W,
        "Q_GHP_W": Q_GHP_gen_W,
        "Q_CHP_W": Q_CHP_gen_W,
        "Q_Furnace_W": Q_Furnace_gen_W,
        "Q_BaseBoiler_W": Q_BaseBoiler_gen_W,
        "Q_PeakBoiler_W": Q_PeakBoiler_gen_W,
        "Q_AddBoiler_W": Q_uncovered_W,
        "Q_coldsource_HPLake_W": Q_coldsource_HPLake_W,
        "Q_coldsource_HPSew_W": Q_coldsource_HPSew_W,
        "Q_coldsource_GHP_W": Q_coldsource_GHP_W,
        "Q_coldsource_CHP_W": Q_coldsource_CHP_W,
        "Q_coldsource_Furnace_W": Q_coldsource_Furnace_W,
        "Q_coldsource_BaseBoiler_W": Q_coldsource_BaseBoiler_W,
        "Q_coldsource_PeakBoiler_W": Q_coldsource_PeakBoiler_W,
        "Q_excess_W": Q_excess_W,
        "E_HPSew_req_W": E_HPSew_req_W,
        "E_HPLake_req_W": E_HPLake_req_W,
        "E_GHP_req_W": E_GHP_req_W,
        "E_CHP_gen_W": E_CHP_gen_W,
        "E_Furnace_gen_W": E_Furnace_gen_W,
        "E_BaseBoiler_req_W": E_BaseBoiler_req_W,
        "E_PeakBoiler_req_W": E_PeakBoiler_req_W,
        "E_BackupBoiler_req_W": E_BackupBoiler_req_W,
        "NG_used_HPSew_W": NG_used_HPSew_W,
        "NG_used_HPLake_W": NG_used_HPLake_W,
        "NG_used_GHP_W": NG_used_GHP_W,
        "NG_used_CHP_W": NG_used_CHP_W,
        "NG_used_Furnace_W": NG_used_Furnace_W,
        "NG_used_BaseBoiler_W": NG_used_BaseBoiler_W,
        "NG_used_PeakBoiler_W": NG_used_PeakBoiler_W,
        "NG_used_BackupBoiler_W": NG_used_BackupBoiler_W,
        "BG_used_HPSew_W": BG_used_HPSew_W,
        "BG_used_HPLake_W": BG_used_HPLake_W,
        "BG_used_GHP_W": BG_used_GHP_W,
        "BG_used_CHP_W": BG_used_CHP_W,
        "BG_used_Furnace_W": BG_used_Furnace_W,
        "BG_used_BaseBoiler_W": BG_used_BaseBoiler_W,
        "BG_used_PeakBoiler_W": BG_used_PeakBoiler_W,
        "Wood_used_HPSew_W": Wood_used_HPSew_W,
        "Wood_used_HPLake_W": Wood_used_HPLake_W,
        "Wood_used_GHP_W": Wood_used_GHP_W,
        "Wood_used_CHP_": Wood_used_CHP_W,
        "Wood_used_Furnace_W": Wood_used_Furnace_W,
        "Wood_used_BaseBoiler_W": Wood_used_BaseBoiler_W,
        "Wood_used_PeakBoiler_W": Wood_used_PeakBoiler_W
    })

    results.to_csv(locator.get_optimization_slave_heating_activation_pattern(
        master_to_slave_vars.individual_number,
        master_to_slave_vars.generation_number),
                   index=False)

    if master_to_slave_vars.gt_fuel == "NG":

        CO2_emitted, PEN_used = calc_primary_energy_and_CO2(
            Q_HPSew_gen_W, Q_HPLake_gen_W, Q_GHP_gen_W, Q_CHP_gen_W,
            Q_Furnace_gen_W, Q_BaseBoiler_gen_W, Q_PeakBoiler_gen_W,
            Q_uncovered_W, Q_coldsource_HPSew_W, Q_coldsource_HPLake_W,
            Q_coldsource_GHP_W, E_CHP_gen_W, E_Furnace_gen_W,
            E_BaseBoiler_req_W, E_PeakBoiler_req_W, NG_used_CHP_W,
            NG_used_BaseBoiler_W, NG_used_PeakBoiler_W,
            Wood_used_Furnace_W, Q_BackupBoiler_sum_W,
            np.sum(E_BackupBoiler_req_W), master_to_slave_vars, locator, lca)
    elif master_to_slave_vars.gt_fuel == "BG":

        CO2_emitted, PEN_used = calc_primary_energy_and_CO2(
            Q_HPSew_gen_W, Q_HPLake_gen_W, Q_GHP_gen_W, Q_CHP_gen_W,
            Q_Furnace_gen_W, Q_BaseBoiler_gen_W, Q_PeakBoiler_gen_W,
            Q_uncovered_W, Q_coldsource_HPSew_W, Q_coldsource_HPLake_W,
            Q_coldsource_GHP_W, E_CHP_gen_W, E_Furnace_gen_W,
            E_BaseBoiler_req_W, E_PeakBoiler_req_W, BG_used_CHP_W,
            BG_used_BaseBoiler_W, BG_used_PeakBoiler_W,
            Wood_used_Furnace_W, Q_BackupBoiler_sum_W,
            np.sum(E_BackupBoiler_req_W), master_to_slave_vars, locator, lca)

    cost_sum = np.sum(Opex_var_HP_Sewage_USD) + np.sum(
        Opex_var_HP_Lake_USD) + np.sum(Opex_var_GHP_USD) + np.sum(
            Opex_var_CHP_USD) + np.sum(Opex_var_Furnace_USD) + np.sum(
                Opex_var_BaseBoiler_USD) + np.sum(
                    Opex_var_PeakBoiler_USD) + Opex_t_var_BackupBoiler_USD

    E_oil_eq_MJ = PEN_used
    CO2_kg_eq = CO2_emitted

    return E_oil_eq_MJ, CO2_kg_eq, cost_sum, Q_uncovered_design_W, Q_uncovered_annual_W
Exemplo n.º 3
0
def least_cost_main(locator, master_to_slave_vars, solar_features, gv, prices, lca, config):
    """
    This function runs the least cost optimization code and returns cost, co2 and primary energy required. \
    On the go, it saves the operation pattern

    :param locator: locator class
    :param master_to_slave_vars: class MastertoSlaveVars containing the value of variables to be passed to the
        slave optimization for each individual
    :param solar_features: solar features class
    :param gv: global variables class
    :type locator: class
    :type master_to_slave_vars: class
    :type solar_features: class
    :type gv: class
    :return:
        - E_oil_eq_MJ: MJ oil Equivalent used during operation
        - CO2_kg_eq: kg of CO2-Equivalent emitted during operation
        - cost_sum: total cost in CHF used for operation
        - Q_source_data[:,7]: uncovered demand

    :rtype: float, float, float, array

    """

    MS_Var = master_to_slave_vars

    t = time.time()

    # Import data from storage optimization
    centralized_plant_data = pd.read_csv(
        locator.get_optimization_slave_storage_operation_data(MS_Var.individual_number,
                                                              MS_Var.generation_number))
    Q_DH_networkload_W = np.array(centralized_plant_data['Q_DH_networkload_W'])
    E_aux_ch_W = np.array(centralized_plant_data['E_aux_ch_W'])
    E_aux_dech_W = np.array(centralized_plant_data['E_aux_dech_W'])
    Q_missing_W = np.array(centralized_plant_data['Q_missing_W'])
    Q_storage_content_W = np.array(centralized_plant_data['Q_storage_content_W'])
    Q_to_storage_W = np.array(centralized_plant_data['Q_to_storage_W'])
    Q_from_storage_W = np.array(centralized_plant_data['Q_from_storage_used_W'])
    Q_uncontrollable_W = np.array(centralized_plant_data['Q_uncontrollable_hot_W'])
    E_PV_gen_W = np.array(centralized_plant_data['E_PV_Wh'])
    E_PVT_gen_W = np.array(centralized_plant_data['E_PVT_Wh'])
    E_aux_solar_and_heat_recovery_W = np.array(centralized_plant_data['E_aux_solar_and_heat_recovery_Wh'])
    Q_SC_ET_gen_Wh = np.array(centralized_plant_data['Q_SC_ET_gen_Wh'])
    Q_SC_FP_gen_Wh = np.array(centralized_plant_data['Q_SC_FP_gen_Wh'])
    Q_PVT_gen_Wh = np.array(centralized_plant_data['Q_PVT_gen_Wh'])
    Q_SCandPVT_gen_Wh = Q_SC_ET_gen_Wh + Q_SC_FP_gen_Wh + Q_PVT_gen_Wh
    E_produced_solar_W = np.array(centralized_plant_data['E_produced_from_solar_W'])

    # Q_StorageToDHNpipe_sum = np.sum(E_aux_dech_W) + np.sum(Q_from_storage_W)
    #
    # HP_operation_Data_sum_array = np.sum(HPServerHeatDesignArray_kWh), \
    #                               np.sum(HPpvt_designArray_Wh), \
    #                               np.sum(HPCompAirDesignArray_kWh), \
    #                               np.sum(HPScDesignArray_Wh)

    Q_missing_copy_W = Q_missing_W.copy()

    # Import Temperatures from Network Summary:
    network_data = pd.read_csv(locator.get_optimization_network_data_folder(MS_Var.network_data_file_heating))
    tdhret_K = network_data['T_DHNf_re_K']

    mdot_DH_kgpers = network_data['mdot_DH_netw_total_kgpers']
    tdhsup_K = network_data['T_DHNf_sup_K']
    # import Marginal Cost of PP Data :
    # os.chdir(Cost_Maps_Path)

    # FIXED ORDER ACTIVATION STARTS
    # Import Data - Sewage
    if HP_SEW_ALLOWED == 1:
        HPSew_Data = pd.read_csv(locator.get_sewage_heat_potential())
        QcoldsewArray = np.array(HPSew_Data['Qsw_kW']) * 1E3
        TretsewArray_K = np.array(HPSew_Data['ts_C']) + 273

    # Initiation of the variables
    Opex_var_HP_Sewage = []
    Opex_var_HP_Lake = []
    Opex_var_GHP = []
    Opex_var_CHP = []
    Opex_var_Furnace = []
    Opex_var_BaseBoiler = []
    Opex_var_PeakBoiler = []

    source_HP_Sewage = []
    source_HP_Lake = []
    source_GHP = []
    source_CHP = []
    source_Furnace = []
    source_BaseBoiler = []
    source_PeakBoiler = []

    Q_HPSew_gen_W = []
    Q_HPLake_gen_W = []
    Q_GHP_gen_W = []
    Q_CHP_gen_W = []
    Q_Furnace_gen_W = []
    Q_BaseBoiler_gen_W = []
    Q_PeakBoiler_gen_W = []
    Q_uncovered_W = []

    E_HPSew_req_W = []
    E_HPLake_req_W = []
    E_GHP_req_W = []
    E_CHP_gen_W = []
    E_Furnace_gen_W = []
    E_BaseBoiler_req_W = []
    E_PeakBoiler_req_W = []

    E_gas_HPSew_W = []
    E_gas_HPLake_W = []
    E_gas_GHP_W = []
    E_gas_CHP_W = []
    E_gas_Furnace_W = []
    E_gas_BaseBoiler_W = []
    E_gas_PeakBoiler_W = []

    E_wood_HPSew_W = []
    E_wood_HPLake_W = []
    E_wood_GHP_W = []
    E_wood_CHP_W = []
    E_wood_Furnace_W = []
    E_wood_BaseBoiler_W = []
    E_wood_PeakBoiler_W = []

    E_coldsource_HPSew_W = []
    E_coldsource_HPLake_W = []
    E_coldsource_GHP_W = []
    E_coldsource_CHP_W = []
    E_coldsource_Furnace_W = []
    E_coldsource_BaseBoiler_W = []
    E_coldsource_PeakBoiler_W = []

    Q_excess_W = np.zeros(8760)
    weather_data = epwreader.epw_reader(config.weather)[['year', 'drybulb_C', 'wetbulb_C','relhum_percent',
                                                              'windspd_ms', 'skytemp_C']]
    ground_temp = calc_ground_temperature(locator, weather_data['drybulb_C'], depth_m=10)

    weather_data = epwreader.epw_reader(config.weather)[['year', 'drybulb_C', 'wetbulb_C',
                                                         'relhum_percent', 'windspd_ms', 'skytemp_C']]
    ground_temp = calc_ground_temperature(locator, weather_data['drybulb_C'], depth_m=10)

    for hour in range(8760):
        Q_therm_req_W = Q_missing_W[hour]
        # cost_data_centralPlant_op[hour, :], source_info[hour, :], Q_source_data_W[hour, :], E_coldsource_data_W[hour,
        #                                                                                     :], \
        # E_PP_el_data_W[hour, :], E_gas_data_W[hour, :], E_wood_data_W[hour, :], Q_excess_W[hour] = source_activator(
        #     Q_therm_req_W, hour, master_to_slave_vars, mdot_DH_kgpers[hour], tdhsup_K,
        #     tdhret_K[hour], TretsewArray_K[hour], gv, prices)
        opex_output, source_output, Q_output, E_output, Gas_output, Wood_output, coldsource_output, Q_excess_W[
            hour] = heating_source_activator(
            Q_therm_req_W, hour, master_to_slave_vars, mdot_DH_kgpers[hour], tdhsup_K[hour],
            tdhret_K[hour], TretsewArray_K[hour], gv, prices, lca, ground_temp[hour])

        Opex_var_HP_Sewage.append(opex_output['Opex_var_HP_Sewage'])
        Opex_var_HP_Lake.append(opex_output['Opex_var_HP_Lake'])
        Opex_var_GHP.append(opex_output['Opex_var_GHP'])
        Opex_var_CHP.append(opex_output['Opex_var_CHP'])
        Opex_var_Furnace.append(opex_output['Opex_var_Furnace'])
        Opex_var_BaseBoiler.append(opex_output['Opex_var_BaseBoiler'])
        Opex_var_PeakBoiler.append(opex_output['Opex_var_PeakBoiler'])

        source_HP_Sewage.append(source_output['HP_Sewage'])
        source_HP_Lake.append(source_output['HP_Lake'])
        source_GHP.append(source_output['GHP'])
        source_CHP.append(source_output['CHP'])
        source_Furnace.append(source_output['Furnace'])
        source_BaseBoiler.append(source_output['BaseBoiler'])
        source_PeakBoiler.append(source_output['PeakBoiler'])

        Q_HPSew_gen_W.append(Q_output['Q_HPSew_gen_W'])
        Q_HPLake_gen_W.append(Q_output['Q_HPLake_gen_W'])
        Q_GHP_gen_W.append(Q_output['Q_GHP_gen_W'])
        Q_CHP_gen_W.append(Q_output['Q_CHP_gen_W'])
        Q_Furnace_gen_W.append(Q_output['Q_Furnace_gen_W'])
        Q_BaseBoiler_gen_W.append(Q_output['Q_BaseBoiler_gen_W'])
        Q_PeakBoiler_gen_W.append(Q_output['Q_PeakBoiler_gen_W'])
        Q_uncovered_W.append(Q_output['Q_uncovered_W'])

        E_HPSew_req_W.append(E_output['E_HPSew_req_W'])
        E_HPLake_req_W.append(E_output['E_HPLake_req_W'])
        E_GHP_req_W.append(E_output['E_GHP_req_W'])
        E_CHP_gen_W.append(E_output['E_CHP_gen_W'])
        E_Furnace_gen_W.append(E_output['E_Furnace_gen_W'])
        E_BaseBoiler_req_W.append(E_output['E_BaseBoiler_req_W'])
        E_PeakBoiler_req_W.append(E_output['E_PeakBoiler_req_W'])

        E_gas_HPSew_W.append(Gas_output['E_gas_HPSew_W'])
        E_gas_HPLake_W.append(Gas_output['E_gas_HPLake_W'])
        E_gas_GHP_W.append(Gas_output['E_gas_GHP_W'])
        E_gas_CHP_W.append(Gas_output['E_gas_CHP_W'])
        E_gas_Furnace_W.append(Gas_output['E_gas_Furnace_W'])
        E_gas_BaseBoiler_W.append(Gas_output['E_gas_BaseBoiler_W'])
        E_gas_PeakBoiler_W.append(Gas_output['E_gas_PeakBoiler_W'])

        E_wood_HPSew_W.append(Wood_output['E_wood_HPSew_W'])
        E_wood_HPLake_W.append(Wood_output['E_wood_HPLake_W'])
        E_wood_GHP_W.append(Wood_output['E_wood_GHP_W'])
        E_wood_CHP_W.append(Wood_output['E_wood_CHP_W'])
        E_wood_Furnace_W.append(Wood_output['E_wood_Furnace_W'])
        E_wood_BaseBoiler_W.append(Wood_output['E_wood_BaseBoiler_W'])
        E_wood_PeakBoiler_W.append(Wood_output['E_wood_PeakBoiler_W'])

        E_coldsource_HPSew_W.append(coldsource_output['E_coldsource_HPSew_W'])
        E_coldsource_HPLake_W.append(coldsource_output['E_coldsource_HPLake_W'])
        E_coldsource_GHP_W.append(coldsource_output['E_coldsource_GHP_W'])
        E_coldsource_CHP_W.append(coldsource_output['E_coldsource_CHP_W'])
        E_coldsource_Furnace_W.append(coldsource_output['E_coldsource_Furnace_W'])
        E_coldsource_BaseBoiler_W.append(coldsource_output['E_coldsource_BaseBoiler_W'])
        E_coldsource_PeakBoiler_W.append(coldsource_output['E_coldsource_PeakBoiler_W'])

    # save data

    elapsed = time.time() - t
    # sum up the uncovered demand, get average and peak load
    Q_uncovered_design_W = np.amax(Q_uncovered_W)
    Q_uncovered_annual_W = np.sum(Q_uncovered_W)
    Opex_var_BackupBoiler = np.zeros(8760)
    Q_BackupBoiler_W = np.zeros(8760)
    E_aux_AddBoiler_req_W = []

    Opex_var_Furnace_wet = np.zeros(8760)
    Opex_var_Furnace_dry = np.zeros(8760)
    Opex_var_CHP_NG = np.zeros(8760)
    Opex_var_CHP_BG = np.zeros(8760)
    Opex_var_BaseBoiler_NG = np.zeros(8760)
    Opex_var_BaseBoiler_BG = np.zeros(8760)
    Opex_var_PeakBoiler_NG = np.zeros(8760)
    Opex_var_PeakBoiler_BG = np.zeros(8760)
    Opex_var_BackupBoiler_NG = np.zeros(8760)
    Opex_var_BackupBoiler_BG = np.zeros(8760)

    Opex_var_PV = np.zeros(8760)
    Opex_var_PVT = np.zeros(8760)
    Opex_var_SC = np.zeros(8760)

    if Q_uncovered_design_W != 0:
        for hour in range(8760):
            tdhret_req_K = tdhret_K[hour]
            BoilerBackup_Cost_Data = cond_boiler_op_cost(Q_uncovered_W[hour], Q_uncovered_design_W, tdhret_req_K, \
                                                         master_to_slave_vars.BoilerBackupType,
                                                         master_to_slave_vars.EL_TYPE, gv, prices, lca)
            Opex_var_BackupBoiler[hour], C_boil_per_WhBackup, Q_BackupBoiler_W[
                hour], E_aux_AddBoiler_req_W_hour = BoilerBackup_Cost_Data
            E_aux_AddBoiler_req_W.append(E_aux_AddBoiler_req_W_hour)
        Q_BackupBoiler_sum_W = np.sum(Q_BackupBoiler_W)
        Opex_var_BackupBoiler_total = np.sum(Opex_var_BackupBoiler)

    else:
        for hour in range(8760):
            E_aux_AddBoiler_req_W.append(0)
        Q_BackupBoiler_sum_W = 0.0
        Opex_var_BackupBoiler_total = 0.0

    if master_to_slave_vars.Furn_Moist_type == "wet":
        Opex_var_Furnace_wet = Opex_var_Furnace
    elif master_to_slave_vars.Furn_Moist_type == "dry":
        Opex_var_Furnace_dry = Opex_var_Furnace

    if master_to_slave_vars.gt_fuel == "NG":
        Opex_var_CHP_NG = Opex_var_CHP
        Opex_var_BaseBoiler_NG = Opex_var_BaseBoiler
        Opex_var_PeakBoiler_NG = Opex_var_PeakBoiler
        Opex_var_BackupBoiler_NG = Opex_var_BackupBoiler

    elif master_to_slave_vars.gt_fuel == "BG":
        Opex_var_CHP_BG = Opex_var_CHP
        Opex_var_BaseBoiler_BG = Opex_var_BaseBoiler
        Opex_var_PeakBoiler_BG = Opex_var_PeakBoiler
        Opex_var_BackupBoiler_BG = Opex_var_BackupBoiler

    # Sum up all electricity needs
    intermediate_sum_1 = np.add(E_HPSew_req_W, E_HPLake_req_W)
    intermediate_sum_2 = np.add(E_GHP_req_W, E_BaseBoiler_req_W)
    intermediate_sum_3 = np.add(E_PeakBoiler_req_W, E_aux_AddBoiler_req_W)
    intermediate_sum_4 = np.add(intermediate_sum_1, intermediate_sum_2)
    E_aux_activation_req_W = np.add(intermediate_sum_3, intermediate_sum_4)
    E_aux_storage_solar_and_heat_recovery_req_W = np.add(np.add(E_aux_ch_W, E_aux_dech_W),
                                                         E_aux_solar_and_heat_recovery_W)

    # Sum up all electricity produced by CHP (CC and Furnace)
    # cost already accounted for in System Models (selling electricity --> cheaper thermal energy)
    E_CHP_and_Furnace_gen_W = np.add(E_CHP_gen_W, E_Furnace_gen_W)
    # price from PV and PVT electricity (both are in E_PV_Wh, see Storage_Design_and..., about Line 133)
    E_solar_gen_W = np.add(E_PV_gen_W, E_PVT_gen_W)
    E_total_gen_W = np.add(E_produced_solar_W, E_CHP_and_Furnace_gen_W)
    E_without_buildingdemand_req_W = np.add(E_aux_storage_solar_and_heat_recovery_req_W, E_aux_activation_req_W)

    E_total_req_W = np.add(np.array(network_data['Electr_netw_total_W']), E_without_buildingdemand_req_W)

    E_PV_to_grid_W = np.zeros(8760)
    E_PVT_to_grid_W = np.zeros(8760)
    E_CHP_to_grid_W = np.zeros(8760)
    E_Furnace_to_grid_W = np.zeros(8760)
    E_PV_directload_W = np.zeros(8760)
    E_PVT_directload_W = np.zeros(8760)
    E_CHP_directload_W = np.zeros(8760)
    E_Furnace_directload_W = np.zeros(8760)
    E_from_grid_W = np.zeros(8760)

    for hour in range(8760):
        E_hour_W = E_total_req_W[hour]

        if E_PV_gen_W[hour] <= E_hour_W:
            E_PV_directload_W[hour] = E_PV_gen_W[hour]
            E_hour_W = E_hour_W - E_PV_directload_W[hour]
        else:
            E_PV_directload_W[hour] = E_hour_W
            E_PV_to_grid_W[hour] = E_PV_gen_W[hour] - E_hour_W
            E_hour_W = 0

        if E_PVT_gen_W[hour] <= E_hour_W:
            E_PVT_directload_W[hour] = E_PVT_gen_W[hour]
            E_hour_W = E_hour_W - E_PVT_directload_W[hour]
        else:
            E_PVT_directload_W[hour] = E_hour_W
            E_PVT_to_grid_W[hour] = E_PVT_gen_W[hour] - E_hour_W
            E_hour_W = 0

        if E_CHP_gen_W[hour] <= E_hour_W:
            E_CHP_directload_W[hour] = E_CHP_gen_W[hour]
            E_hour_W = E_hour_W - E_CHP_directload_W[hour]
        else:
            E_CHP_directload_W[hour] = E_hour_W
            E_CHP_to_grid_W[hour] = E_CHP_gen_W[hour] - E_hour_W
            E_hour_W = 0

        if E_Furnace_gen_W[hour] <= E_hour_W:
            E_Furnace_directload_W[hour] = E_Furnace_gen_W[hour]
            E_hour_W = E_hour_W - E_Furnace_directload_W[hour]
        else:
            E_Furnace_directload_W[hour] = E_hour_W
            E_Furnace_to_grid_W[hour] = E_Furnace_gen_W[hour] - E_hour_W
            E_hour_W = 0

        E_from_grid_W[hour] = E_hour_W

    # saving pattern activation to disk
    date = network_data.DATE.values
    results = pd.DataFrame({"DATE": date,
                            "Q_Network_Demand_after_Storage_W": Q_missing_copy_W,
                            "Opex_var_HP_Sewage": Opex_var_HP_Sewage,
                            "Opex_var_HP_Lake": Opex_var_HP_Lake,
                            "Opex_var_GHP": Opex_var_GHP,
                            "Opex_var_CHP_BG": Opex_var_CHP_BG,
                            "Opex_var_CHP_NG": Opex_var_CHP_NG,
                            "Opex_var_Furnace_wet": Opex_var_Furnace_wet,
                            "Opex_var_Furnace_dry": Opex_var_Furnace_dry,
                            "Opex_var_BaseBoiler_BG": Opex_var_BaseBoiler_BG,
                            "Opex_var_BaseBoiler_NG": Opex_var_BaseBoiler_NG,
                            "Opex_var_PeakBoiler_BG": Opex_var_PeakBoiler_BG,
                            "Opex_var_PeakBoiler_NG": Opex_var_PeakBoiler_NG,
                            "Opex_var_BackupBoiler_BG": Opex_var_BackupBoiler_BG,
                            "Opex_var_BackupBoiler_NG": Opex_var_BackupBoiler_NG,
                            "HPSew_Status": source_HP_Sewage,
                            "HPLake_Status": source_HP_Lake,
                            "GHP_Status": source_GHP,
                            "CHP_Status": source_CHP,
                            "Furnace_Status": source_Furnace,
                            "BoilerBase_Status": source_BaseBoiler,
                            "BoilerPeak_Status": source_PeakBoiler,
                            "Q_HPSew_W": Q_HPSew_gen_W,
                            "Q_HPLake_W": Q_HPLake_gen_W,
                            "Q_GHP_W": Q_GHP_gen_W,
                            "Q_CHP_W": Q_CHP_gen_W,
                            "Q_Furnace_W": Q_Furnace_gen_W,
                            "Q_BaseBoiler_W": Q_BaseBoiler_gen_W,
                            "Q_PeakBoiler_W": Q_PeakBoiler_gen_W,
                            "Q_AddBoiler_W": Q_uncovered_W,
                            "Q_coldsource_HPLake_W": E_coldsource_HPLake_W,
                            "Q_coldsource_HPSew_W": E_coldsource_HPSew_W,
                            "Q_coldsource_GHP_W": E_coldsource_GHP_W,
                            "Q_coldsource_CHP_W": E_coldsource_CHP_W,
                            "Q_coldsource_Furnace_W": E_coldsource_Furnace_W,
                            "Q_coldsource_BaseBoiler_W": E_coldsource_BaseBoiler_W,
                            "Q_coldsource_PeakBoiler_W": E_coldsource_PeakBoiler_W,
                            "Q_excess_W": Q_excess_W
                            })

    results.to_csv(locator.get_optimization_slave_heating_activation_pattern(MS_Var.individual_number,
                                                                             MS_Var.generation_number), index=False)

    results = pd.DataFrame({"DATE": date,
                            "E_total_req_W": E_total_req_W,
                            "E_HPSew_req_W": E_HPSew_req_W,
                            "E_HPLake_req_W": E_HPLake_req_W,
                            "E_GHP_req_W": E_GHP_req_W,
                            "E_CHP_gen_W": E_CHP_gen_W,
                            "E_Furnace_gen_W": E_Furnace_gen_W,
                            "E_BaseBoiler_req_W": E_BaseBoiler_req_W,
                            "E_PeakBoiler_req_W": E_PeakBoiler_req_W,
                            "E_AddBoiler_req_W": E_aux_AddBoiler_req_W,
                            "E_PV_gen_W": E_PV_gen_W,
                            "E_PVT_gen_W": E_PVT_gen_W,
                            "E_CHP_and_Furnace_gen_W": E_CHP_and_Furnace_gen_W,
                            "E_gen_total_W": E_total_gen_W,
                            "E_PV_to_directload_W": E_PV_directload_W,
                            "E_PVT_to_directload_W": E_PVT_directload_W,
                            "E_CHP_to_directload_W": E_CHP_directload_W,
                            "E_Furnace_to_directload_W": E_Furnace_directload_W,
                            "E_PV_to_grid_W": E_PV_to_grid_W,
                            "E_PVT_to_grid_W": E_PVT_to_grid_W,
                            "E_CHP_to_grid_W": E_CHP_to_grid_W,
                            "E_Furnace_to_grid_W": E_Furnace_to_grid_W,
                            "E_aux_storage_solar_and_heat_recovery_req_W": E_aux_storage_solar_and_heat_recovery_req_W,
                            "E_consumed_without_buildingdemand_W": E_without_buildingdemand_req_W,
                            "E_from_grid_W": E_from_grid_W
                            })

    results.to_csv(locator.get_optimization_slave_electricity_activation_pattern_heating(MS_Var.individual_number,
                                                                                         MS_Var.generation_number), index=False)

    E_aux_storage_operation_sum_W = np.sum(E_aux_storage_solar_and_heat_recovery_req_W)
    E_aux_solar_and_heat_recovery_W = np.sum(E_aux_solar_and_heat_recovery_W)

    CO2_emitted, Eprim_used = calc_primary_energy_and_CO2(Q_HPSew_gen_W, Q_HPLake_gen_W, Q_GHP_gen_W, Q_CHP_gen_W,
                                                          Q_Furnace_gen_W, Q_BaseBoiler_gen_W, Q_PeakBoiler_gen_W,
                                                          Q_uncovered_W,
                                                          E_coldsource_HPSew_W, E_coldsource_HPLake_W,
                                                          E_coldsource_GHP_W,
                                                          E_CHP_gen_W, E_Furnace_gen_W, E_BaseBoiler_req_W,
                                                          E_PeakBoiler_req_W,
                                                          E_gas_CHP_W, E_gas_BaseBoiler_W, E_gas_PeakBoiler_W,
                                                          E_wood_Furnace_W, Q_BackupBoiler_sum_W,
                                                          np.sum(E_aux_AddBoiler_req_W),
                                                          np.sum(E_solar_gen_W), np.sum(Q_SCandPVT_gen_Wh),
                                                          Q_storage_content_W,
                                                          master_to_slave_vars, locator,
                                                          E_aux_solar_and_heat_recovery_W,
                                                          E_aux_storage_operation_sum_W, gv, lca)

    # sum up results from PP Activation
    E_consumed_sum_W = np.sum(E_aux_storage_solar_and_heat_recovery_req_W) + np.sum(E_aux_activation_req_W)

    # Differenciate between Normal and green electricity for
    if MS_Var.EL_TYPE == 'green':
        ELEC_PRICE = gv.ELEC_PRICE_GREEN

    else:
        ELEC_PRICE = lca.ELEC_PRICE

    # Area available in NEtwork
    Area_AvailablePV_m2 = solar_features.A_PV_m2 * MS_Var.SOLAR_PART_PV
    Area_AvailablePVT_m2 = solar_features.A_PVT_m2 * MS_Var.SOLAR_PART_PVT
    #    import from master
    eta_m2_to_kW = ETA_AREA_TO_PEAK  # Data from Jimeno
    Q_PowerPeakAvailablePV_kW = Area_AvailablePV_m2 * eta_m2_to_kW
    Q_PowerPeakAvailablePVT_kW = Area_AvailablePVT_m2 * eta_m2_to_kW
    # calculate with conversion factor m'2-kWPeak

    KEV_RpPerkWhPVT = calc_Crem_pv(Q_PowerPeakAvailablePVT_kW * 1000.0)
    KEV_RpPerkWhPV = calc_Crem_pv(Q_PowerPeakAvailablePV_kW * 1000.0)

    KEV_total = KEV_RpPerkWhPVT / 100 * np.sum(E_PVT_gen_W) / 1000 + KEV_RpPerkWhPV / 100 * np.sum(E_PV_gen_W) / 1000
    # Units: from Rp/kWh to CHF/Wh

    price_obtained_from_KEV_for_PVandPVT = KEV_total
    cost_CHP_maintenance = np.sum(E_CHP_gen_W) * prices.CC_MAINTENANCE_PER_KWHEL / 1000.0

    # Fill up storage if end-of-season energy is lower than beginning of season
    Q_Storage_SeasonEndReheat_W = Q_storage_content_W[-1] - Q_storage_content_W[0]

    gas_price = prices.NG_PRICE

    if Q_Storage_SeasonEndReheat_W > 0:
        cost_Boiler_for_Storage_reHeat_at_seasonend = float(Q_Storage_SeasonEndReheat_W) / 0.8 * gas_price
    else:
        cost_Boiler_for_Storage_reHeat_at_seasonend = 0

    # CHANGED AS THE COST_DATA INCLUDES COST_ELECTRICITY_TOTAL ALREADY! (= double accounting)
    cost_HP_aux_uncontrollable = np.sum(E_aux_solar_and_heat_recovery_W) * ELEC_PRICE
    cost_HP_storage_operation = np.sum(E_aux_storage_solar_and_heat_recovery_req_W) * ELEC_PRICE

    cost_sum = np.sum(Opex_var_HP_Sewage) + np.sum(Opex_var_HP_Lake) + np.sum(Opex_var_GHP) + np.sum(
        Opex_var_CHP) + np.sum(Opex_var_Furnace) + np.sum(Opex_var_BaseBoiler) + np.sum(
        Opex_var_PeakBoiler) - price_obtained_from_KEV_for_PVandPVT - lca.ELEC_PRICE * np.sum(
        E_CHP_gen_W) + Opex_var_BackupBoiler_total + cost_CHP_maintenance + \
               cost_Boiler_for_Storage_reHeat_at_seasonend + cost_HP_aux_uncontrollable + cost_HP_storage_operation

    save_cost = 1

    E_oil_eq_MJ = Eprim_used
    CO2_kg_eq = CO2_emitted

    # Calculate primary energy from ressources:
    E_gas_Primary_W = Q_BackupBoiler_sum_W + np.sum(E_gas_HPSew_W) + np.sum(E_gas_HPLake_W) + np.sum(
        E_gas_GHP_W) + np.sum(E_gas_CHP_W) + np.sum(E_gas_Furnace_W) + np.sum(E_gas_BaseBoiler_W) + np.sum(
        E_gas_PeakBoiler_W)
    E_wood_Primary_W = np.sum(E_wood_HPSew_W) + np.sum(E_wood_HPLake_W) + np.sum(E_wood_GHP_W) + np.sum(
        E_wood_CHP_W) + np.sum(E_wood_Furnace_W) + np.sum(E_wood_BaseBoiler_W) + np.sum(E_wood_PeakBoiler_W)
    E_Import_Slave_req_W = E_consumed_sum_W + np.sum(E_aux_AddBoiler_req_W)
    E_Export_gen_W = np.sum(E_total_gen_W)
    E_groundheat_W = np.sum(E_coldsource_HPSew_W) + np.sum(E_coldsource_HPLake_W) + np.sum(E_coldsource_GHP_W) + np.sum(
        E_coldsource_CHP_W) + np.sum(E_coldsource_Furnace_W) + np.sum(E_coldsource_BaseBoiler_W) + np.sum(
        E_coldsource_PeakBoiler_W)
    E_solar_gen_W = np.sum(E_solar_gen_W) + np.sum(Q_SCandPVT_gen_Wh)
    intermediate_max_1 = max(np.amax(E_gas_HPSew_W), np.amax(E_gas_HPLake_W))
    intermediate_max_2 = max(intermediate_max_1, np.amax(E_gas_GHP_W))
    intermediate_max_3 = max(intermediate_max_2, np.amax(E_gas_CHP_W))
    intermediate_max_4 = max(intermediate_max_3, np.amax(E_gas_Furnace_W))
    intermediate_max_5 = max(intermediate_max_4, np.amax(E_gas_BaseBoiler_W))
    intermediate_max_6 = max(intermediate_max_5, np.amax(E_gas_PeakBoiler_W))
    E_gas_PrimaryPeakPower_W = intermediate_max_6 + np.amax(Q_BackupBoiler_W)

    if save_cost == 1:
        results = pd.DataFrame({
            "total cost": [cost_sum],
            "KEV_Remuneration": [price_obtained_from_KEV_for_PVandPVT],
            "costAddBackup_total": [Opex_var_BackupBoiler_total],
            "cost_CHP_maintenance": [cost_CHP_maintenance],
            "costHPSew_sum": np.sum(Opex_var_HP_Sewage),
            "costHPLake_sum": np.sum(Opex_var_HP_Lake),
            "costGHP_sum": np.sum(Opex_var_GHP),
            "costCHP_sum": np.sum(Opex_var_CHP),
            "costFurnace_sum": np.sum(Opex_var_Furnace),
            "costBaseBoiler_sum": np.sum(Opex_var_BaseBoiler),
            "costPeakBoiler_sum": np.sum(Opex_var_PeakBoiler),
            "cost_Boiler_for_Storage_reHeat_at_seasonend": [cost_Boiler_for_Storage_reHeat_at_seasonend],
            "cost_HP_aux_uncontrollable": [cost_HP_aux_uncontrollable],
            "cost_HP_storage_operation": [cost_HP_storage_operation],
            "E_oil_eq_MJ": [E_oil_eq_MJ],
            "CO2_kg_eq": [CO2_kg_eq],
            "cost_sum": [cost_sum],
            "E_gas_Primary_W": [E_gas_Primary_W],
            "E_gas_PrimaryPeakPower_W": [E_gas_PrimaryPeakPower_W],
            "E_wood_Primary_W": [E_wood_Primary_W],
            "E_Import_Slave_req_W": [E_Import_Slave_req_W],
            "E_Export_gen_W": [E_Export_gen_W],
            "E_groundheat_W": [E_groundheat_W],
            "E_solar_gen_Wh": [E_solar_gen_W]
        })
        results.to_csv(locator.get_optimization_slave_cost_prime_primary_energy_data(MS_Var.individual_number,
                                                                                     MS_Var.generation_number), sep=',')

    return E_oil_eq_MJ, CO2_kg_eq, cost_sum, Q_uncovered_design_W, Q_uncovered_annual_W
def heating_source_activator(Q_therm_req_W, master_to_slave_vars,
                             Q_therm_GHP_W, TretGHPArray_K, TretLakeArray_K,
                             Q_therm_Lake_W, Q_therm_Sew_W, TretsewArray_K,
                             tdhsup_K, tdhret_req_K):
    """
    :param Q_therm_req_W:
    :param hour:
    :param context:
    :type Q_therm_req_W: float
    :type hour: int
    :type context: list
    :return: cost_data_centralPlant_op, source_info, Q_source_data, E_coldsource_data, E_PP_el_data, E_gas_data, E_wood_data, Q_excess
    :rtype:
    """

    ## initializing unmet heating load
    Q_heat_unmet_W = Q_therm_req_W

    # ACTIVATE THE COGEN
    if master_to_slave_vars.CC_on == 1 and Q_heat_unmet_W > 0.0:

        CC_op_cost_data = calc_cop_CCGT(master_to_slave_vars.CCGT_SIZE_W,
                                        tdhsup_K,
                                        "NG")  # create cost information
        Q_used_prim_CC_fn_W = CC_op_cost_data['q_input_fn_q_output_W']
        q_output_CC_min_W = CC_op_cost_data['q_output_min_W']
        Q_output_CC_max_W = CC_op_cost_data['q_output_max_W']
        eta_elec_interpol = CC_op_cost_data['eta_el_fn_q_input']

        if Q_heat_unmet_W >= q_output_CC_min_W:
            # operation Possible if above minimal load
            if Q_heat_unmet_W <= Q_output_CC_max_W:  # Normal operation Possible within partload regime
                Q_CHP_gen_W = Q_heat_unmet_W
                NG_CHP_req_W = Q_used_prim_CC_fn_W(Q_CHP_gen_W)
                E_CHP_gen_W = np.float(
                    eta_elec_interpol(NG_CHP_req_W)) * NG_CHP_req_W
            else:  # Only part of the demand can be delivered as 100% load achieved
                Q_CHP_gen_W = Q_output_CC_max_W
                NG_CHP_req_W = Q_used_prim_CC_fn_W(Q_CHP_gen_W)
                E_CHP_gen_W = np.float(
                    eta_elec_interpol(NG_CHP_req_W)) * NG_CHP_req_W
        else:
            NG_CHP_req_W = 0.0
            E_CHP_gen_W = 0.0
            Q_CHP_gen_W = 0.0
        Q_heat_unmet_W = Q_heat_unmet_W - Q_CHP_gen_W
    else:
        NG_CHP_req_W = 0.0
        E_CHP_gen_W = 0.0
        Q_CHP_gen_W = 0.0

    # WET FURNACE
    if master_to_slave_vars.Furnace_wet_on == 1 and Q_heat_unmet_W > 0.0:  # Activate Furnace if its there.
        # Operate only if its above minimal load
        if Q_heat_unmet_W > master_to_slave_vars.WBFurnace_Q_max_W:
            if Q_heat_unmet_W > master_to_slave_vars.WBFurnace_Q_max_W:
                Q_Furnace_wet_gen_W = master_to_slave_vars.WBFurnace_Q_max_W
                # scale down if above maximum load, Furnace operates at max. capacity
                DryBiomass_Furnace_req_W, E_Furnace_wet_gen_W = furnace_op_cost(
                    Q_Furnace_wet_gen_W,
                    master_to_slave_vars.WBFurnace_Q_max_W, tdhret_req_K,
                    "wet")

            else:  # Normal Operation Possible
                Q_Furnace_wet_gen_W = Q_heat_unmet_W
                DryBiomass_Furnace_req_W, E_Furnace_wet_gen_W = furnace_op_cost(
                    Q_Furnace_wet_gen_W,
                    master_to_slave_vars.WBFurnace_Q_max_W, tdhret_req_K,
                    "wet")
        else:
            E_Furnace_wet_gen_W = 0.0
            DryBiomass_Furnace_req_W = 0.0
            Q_Furnace_wet_gen_W = 0.0

        Q_heat_unmet_W = Q_heat_unmet_W - Q_Furnace_wet_gen_W

    else:
        E_Furnace_wet_gen_W = 0.0
        DryBiomass_Furnace_req_W = 0.0
        Q_Furnace_wet_gen_W = 0.0

    # DRY FURNACE
    if master_to_slave_vars.Furnace_dry_on == 1 and Q_heat_unmet_W > 0.0:  # Activate Furnace if its there.
        # Operate only if its above minimal load
        if Q_heat_unmet_W > master_to_slave_vars.DBFurnace_Q_max_W:
            if Q_heat_unmet_W > master_to_slave_vars.DBFurnace_Q_max_W:
                Q_Furnace_dry_gen_W = master_to_slave_vars.DBFurnace_Q_max_W
                # scale down if above maximum load, Furnace operates at max. capacity
                WetBiomass_Furnace_req_W, E_Furnace_dry_gen_W = furnace_op_cost(
                    Q_Furnace_dry_gen_W,
                    master_to_slave_vars.DBFurnace_Q_max_W, tdhret_req_K,
                    "dry")

            else:  # Normal Operation Possible
                Q_Furnace_dry_gen_W = Q_heat_unmet_W
                WetBiomass_Furnace_req_W, E_Furnace_dry_gen_W = furnace_op_cost(
                    Q_Furnace_dry_gen_W,
                    master_to_slave_vars.DBFurnace_Q_max_W, tdhret_req_K,
                    "dry")
        else:
            E_Furnace_dry_gen_W = 0.0
            WetBiomass_Furnace_req_W = 0.0
            Q_Furnace_dry_gen_W = 0.0

        Q_heat_unmet_W = Q_heat_unmet_W - Q_Furnace_dry_gen_W
    else:
        E_Furnace_dry_gen_W = 0.0
        WetBiomass_Furnace_req_W = 0.0
        Q_Furnace_dry_gen_W = 0.0

    if (master_to_slave_vars.HPSew_on
        ) == 1 and Q_heat_unmet_W > 0.0 and not np.isclose(
            tdhsup_K, tdhret_req_K):  # activate if its available

        if Q_heat_unmet_W > Q_therm_Sew_W:
            Q_HPSew_gen_W = Q_therm_Sew_W
            mdot_DH_to_Sew_kgpers = Q_HPSew_gen_W / (
                HEAT_CAPACITY_OF_WATER_JPERKGK * (tdhsup_K - tdhret_req_K))
        else:
            Q_HPSew_gen_W = Q_heat_unmet_W
            mdot_DH_to_Sew_kgpers = Q_HPSew_gen_W / (
                HEAT_CAPACITY_OF_WATER_JPERKGK * (tdhsup_K - tdhret_req_K))

        E_HPSew_req_W, \
        Q_coldsource_HPSew_W, \
        Q_HPSew_gen_W = HPSew_op_cost(mdot_DH_to_Sew_kgpers,
                                      tdhsup_K,
                                      tdhret_req_K,
                                      TretsewArray_K,
                                      Q_HPSew_gen_W
                                      )

        Q_heat_unmet_W = Q_heat_unmet_W - Q_HPSew_gen_W

    else:
        E_HPSew_req_W = 0.0
        Q_HPSew_gen_W = 0.0

    if (master_to_slave_vars.HPLake_on
        ) == 1 and Q_heat_unmet_W > 0.0 and not np.isclose(
            tdhsup_K, tdhret_req_K):
        if Q_heat_unmet_W > Q_therm_Lake_W:  # Scale down Load, 100% load achieved
            Q_HPLake_gen_W = Q_therm_Lake_W
        else:  # regular operation possible
            Q_HPLake_gen_W = Q_heat_unmet_W

        E_HPLake_req_W, Q_coldsource_HPLake_W, Q_HPLake_gen_W = HPLake_op_cost(
            Q_HPLake_gen_W, tdhsup_K, tdhret_req_K, TretLakeArray_K)
        E_pump_req_W = calc_water_body_uptake_pumping(Q_HPLake_gen_W,
                                                      tdhret_req_K, tdhsup_K)

        E_HPLake_req_W += E_pump_req_W

        Q_heat_unmet_W = Q_heat_unmet_W - Q_HPLake_gen_W

    else:
        E_HPLake_req_W = 0.0
        Q_HPLake_gen_W = 0.0

    if (master_to_slave_vars.GHP_on
        ) == 1 and Q_heat_unmet_W > 0.0 and not np.isclose(
            tdhsup_K, tdhret_req_K):
        if Q_heat_unmet_W > Q_therm_GHP_W:
            Q_GHP_gen_W = Q_therm_GHP_W
            mdot_DH_to_GHP_kgpers = Q_GHP_gen_W / (
                HEAT_CAPACITY_OF_WATER_JPERKGK * (tdhsup_K - tdhret_req_K))
        else:  # regular operation possible, demand is covered
            Q_GHP_gen_W = Q_heat_unmet_W
            mdot_DH_to_GHP_kgpers = Q_GHP_gen_W / (
                HEAT_CAPACITY_OF_WATER_JPERKGK * (tdhsup_K - tdhret_req_K))

        E_GHP_req_W, Q_coldsource_GHP_W, Q_GHP_gen_W = GHP_op_cost(
            mdot_DH_to_GHP_kgpers, tdhsup_K, tdhret_req_K, TretGHPArray_K,
            Q_GHP_gen_W)
        Q_heat_unmet_W = Q_heat_unmet_W - Q_GHP_gen_W

    else:
        E_GHP_req_W = 0.0
        Q_GHP_gen_W = 0.0

    if (master_to_slave_vars.Boiler_on) == 1 and Q_heat_unmet_W > 0:
        if Q_heat_unmet_W >= BOILER_MIN * master_to_slave_vars.Boiler_Q_max_W:  # Boiler can be activated?
            if Q_heat_unmet_W >= master_to_slave_vars.Boiler_Q_max_W:  # Boiler above maximum Load?
                Q_BaseBoiler_gen_W = master_to_slave_vars.Boiler_Q_max_W
            else:
                Q_BaseBoiler_gen_W = Q_heat_unmet_W

            NG_BaseBoiler_req_W, E_BaseBoiler_req_W = cond_boiler_op_cost(
                Q_BaseBoiler_gen_W, master_to_slave_vars.Boiler_Q_max_W,
                tdhret_req_K)
        else:
            Q_BaseBoiler_gen_W = 0.0
            NG_BaseBoiler_req_W = 0.0
            E_BaseBoiler_req_W = 0.0

        Q_heat_unmet_W = Q_heat_unmet_W - Q_BaseBoiler_gen_W

    else:
        Q_BaseBoiler_gen_W = 0.0
        NG_BaseBoiler_req_W = 0.0
        E_BaseBoiler_req_W = 0.0

    if master_to_slave_vars.BoilerPeak_on == 1 and Q_heat_unmet_W > 0:
        if Q_heat_unmet_W >= BOILER_MIN * master_to_slave_vars.BoilerPeak_Q_max_W:  # Boiler can be activated?
            if Q_heat_unmet_W > master_to_slave_vars.BoilerPeak_Q_max_W:  # Boiler above maximum Load?
                Q_PeakBoiler_gen_W = master_to_slave_vars.BoilerPeak_Q_max_W
            else:
                Q_PeakBoiler_gen_W = Q_heat_unmet_W

            NG_PeakBoiler_req_W, E_PeakBoiler_req_W = cond_boiler_op_cost(
                Q_PeakBoiler_gen_W, master_to_slave_vars.BoilerPeak_Q_max_W,
                tdhret_req_K)
        else:
            Q_PeakBoiler_gen_W = 0.0
            NG_PeakBoiler_req_W = 0
            E_PeakBoiler_req_W = 0.0

        Q_heat_unmet_W = Q_heat_unmet_W - Q_PeakBoiler_gen_W

    else:
        Q_PeakBoiler_gen_W = 0.0
        NG_PeakBoiler_req_W = 0
        E_PeakBoiler_req_W = 0.0

    if Q_heat_unmet_W > 1.0E-3:
        Q_uncovered_W = Q_heat_unmet_W  # this will become the back-up boiler
    else:
        Q_uncovered_W = 0.0

    return Q_HPSew_gen_W, \
           Q_HPLake_gen_W, \
           Q_GHP_gen_W, \
           Q_CHP_gen_W, \
           Q_Furnace_dry_gen_W, \
           Q_Furnace_wet_gen_W, \
           Q_BaseBoiler_gen_W, \
           Q_PeakBoiler_gen_W, \
           Q_uncovered_W, \
           E_HPSew_req_W, \
           E_HPLake_req_W, \
           E_BaseBoiler_req_W, \
           E_PeakBoiler_req_W, \
           E_GHP_req_W, \
           E_CHP_gen_W, \
           E_Furnace_dry_gen_W, \
           E_Furnace_wet_gen_W, \
           NG_CHP_req_W, \
           NG_BaseBoiler_req_W, \
           NG_PeakBoiler_req_W, \
           WetBiomass_Furnace_req_W, \
           DryBiomass_Furnace_req_W
Exemplo n.º 5
0
def district_heating_network(locator, master_to_slave_variables, config,
                             prices, lca, network_features):
    """
    Computes the parameters for the heating of the complete DHN

    :param locator: locator class
    :param master_to_slave_variables: class MastertoSlaveVars containing the value of variables to be passed to the
        slave optimization for each individual
    :param solar_features: solar features class
    :type locator: class
    :type master_to_slave_variables: class
    :type solar_features: class
    :return:
        - E_oil_eq_MJ: MJ oil Equivalent used during operation
        - CO2_kg_eq: kg of CO2-Equivalent emitted during operation
        - cost_sum: total cost in CHF used for operation
        - Q_source_data[:,7]: uncovered demand

    :rtype: float, float, float, array

    """
    # THERMAL STORAGE + NETWORK
    print(
        "CALCULATING ECOLOGICAL COSTS OF SEASONAL STORAGE - DUE TO OPERATION (IF ANY)"
    )
    performance_storage, storage_dispatch = storage_main.storage_optimization(
        locator, master_to_slave_variables, lca, prices, config)
    # Import data from storage optimization
    Q_DH_networkload_W = np.array(storage_dispatch['Q_DH_networkload_W'])
    Q_thermal_req_W = np.array(storage_dispatch['Q_req_after_storage_W'])

    E_PVT_gen_W = storage_dispatch['E_PVT_gen_W']

    Q_PVT_to_directload_W = storage_dispatch["Q_PVT_gen_directload_W"]
    Q_PVT_to_storage_W = storage_dispatch["Q_PVT_gen_storage_W"]

    Q_SC_ET_to_directload_W = storage_dispatch["Q_SC_ET_gen_directload_W"]
    Q_SC_ET_to_storage_W = storage_dispatch["Q_SC_ET_gen_storage_W"]

    Q_SC_FP_to_directload_W = storage_dispatch["Q_SC_FP_gen_directload_W"]
    Q_SC_FP_to_storage_W = storage_dispatch["Q_SC_FP_gen_storage_W"]

    Q_HP_Server_to_directload_W = storage_dispatch[
        "Q_HP_Server_gen_directload_W"]
    Q_HP_Server_to_storage_W = storage_dispatch["Q_HP_Server_gen_storage_W"]

    E_Storage_req_charging_W = storage_dispatch["E_Storage_charging_req_W"]
    E_Storage_req_discharging_W = storage_dispatch[
        "E_Storage_discharging_req_W"]
    E_HP_SC_FP_req_W = storage_dispatch["E_HP_SC_FP_req_W"]
    E_HP_SC_ET_req_W = storage_dispatch["E_HP_SC_ET_req_W"]
    E_HP_PVT_req_W = storage_dispatch["E_HP_PVT_req_W"]
    E_HP_Server_req_W = storage_dispatch["E_HP_Server_req_W"]

    Q_SC_ET_gen_W = storage_dispatch["Q_SC_ET_gen_W"]
    Q_SC_FP_gen_W = storage_dispatch["Q_SC_FP_gen_W"]
    Q_PVT_gen_W = storage_dispatch["Q_PVT_gen_W"]
    Q_Server_gen_W = storage_dispatch["Q_HP_Server_gen_W"]

    Q_Storage_gen_W = storage_dispatch["Q_Storage_gen_W"]

    # HEATING PLANT
    # Import Temperatures from Network Summary:
    mdot_DH_kgpers, T_district_heating_return_K, T_district_heating_supply_K = calc_network_summary_DHN(
        locator, master_to_slave_variables)

    # FIXED ORDER ACTIVATION STARTS
    # Import Data - Sewage heat
    if master_to_slave_variables.HPSew_on == 1:
        HPSew_Data = pd.read_csv(locator.get_sewage_heat_potential())
        Q_therm_Sew = np.array(HPSew_Data['Qsw_kW']) * 1E3
        Q_therm_Sew_W = [
            x if x < master_to_slave_variables.HPSew_maxSize_W else
            master_to_slave_variables.HPSew_maxSize_W for x in Q_therm_Sew
        ]
        T_source_average_sewage_K = np.array(HPSew_Data['Ts_C']) + 273
    else:
        Q_therm_Sew_W = np.zeros(HOURS_IN_YEAR)
        T_source_average_sewage_K = np.zeros(HOURS_IN_YEAR)

    # Import Data - lake heat
    if master_to_slave_variables.HPLake_on == 1:
        HPlake_Data = pd.read_csv(locator.get_lake_potential())
        Q_therm_Lake = np.array(HPlake_Data['QLake_kW']) * 1E3
        Q_therm_Lake_W = [
            x if x < master_to_slave_variables.HPLake_maxSize_W else
            master_to_slave_variables.HPLake_maxSize_W for x in Q_therm_Lake
        ]
        T_source_average_Lake_K = np.array(HPlake_Data['Ts_C']) + 273
    else:
        Q_therm_Lake_W = np.zeros(HOURS_IN_YEAR)
        T_source_average_Lake_K = np.zeros(HOURS_IN_YEAR)

    # Import Data - geothermal (shallow)
    if master_to_slave_variables.GHP_on == 1:
        GHP_Data = pd.read_csv(locator.get_geothermal_potential())
        Q_therm_GHP = np.array(GHP_Data['QGHP_kW']) * 1E3
        Q_therm_GHP_W = [
            x if x < master_to_slave_variables.GHP_maxSize_W else
            master_to_slave_variables.GHP_maxSize_W for x in Q_therm_GHP
        ]
        T_source_average_GHP_W = np.array(GHP_Data['Ts_C']) + 273
    else:
        Q_therm_GHP_W = np.zeros(HOURS_IN_YEAR)
        T_source_average_GHP_W = np.zeros(HOURS_IN_YEAR)

    # Initiation of the variables

    source_HP_Sewage = np.zeros(HOURS_IN_YEAR)
    source_HP_Lake = np.zeros(HOURS_IN_YEAR)
    source_GHP = np.zeros(HOURS_IN_YEAR)
    source_CHP = np.zeros(HOURS_IN_YEAR)
    source_Furnace_dry = np.zeros(HOURS_IN_YEAR)
    source_Furnace_wet = np.zeros(HOURS_IN_YEAR)
    source_BaseBoiler = np.zeros(HOURS_IN_YEAR)
    source_PeakBoiler = np.zeros(HOURS_IN_YEAR)

    Q_HPSew_gen_W = np.zeros(HOURS_IN_YEAR)
    Q_HPLake_gen_W = np.zeros(HOURS_IN_YEAR)
    Q_GHP_gen_W = np.zeros(HOURS_IN_YEAR)
    Q_CHP_gen_W = np.zeros(HOURS_IN_YEAR)
    Q_Furnace_dry_gen_W = np.zeros(HOURS_IN_YEAR)
    Q_Furnace_wet_gen_W = np.zeros(HOURS_IN_YEAR)
    Q_BaseBoiler_gen_W = np.zeros(HOURS_IN_YEAR)
    Q_PeakBoiler_gen_W = np.zeros(HOURS_IN_YEAR)
    Q_AddBoiler_gen_W = np.zeros(HOURS_IN_YEAR)

    E_HPSew_req_W = np.zeros(HOURS_IN_YEAR)
    E_HPLake_req_W = np.zeros(HOURS_IN_YEAR)
    E_GHP_req_W = np.zeros(HOURS_IN_YEAR)
    E_CHP_gen_W = np.zeros(HOURS_IN_YEAR)
    E_Furnace_dry_gen_W = np.zeros(HOURS_IN_YEAR)
    E_Furnace_wet_gen_W = np.zeros(HOURS_IN_YEAR)
    E_BaseBoiler_req_W = np.zeros(HOURS_IN_YEAR)
    E_PeakBoiler_req_W = np.zeros(HOURS_IN_YEAR)
    E_BackupBoiler_req_W = np.zeros(HOURS_IN_YEAR)

    NG_CHP_req_W = np.zeros(HOURS_IN_YEAR)
    NG_BaseBoiler_req_W = np.zeros(HOURS_IN_YEAR)
    NG_PeakBoiler_req_W = np.zeros(HOURS_IN_YEAR)
    NG_BackupBoiler_req_W = np.zeros(HOURS_IN_YEAR)

    WetBiomass_Furnace_req_W = np.zeros(HOURS_IN_YEAR)
    DryBiomass_Furnace_req_W = np.zeros(HOURS_IN_YEAR)

    for hour in range(HOURS_IN_YEAR):
        if Q_thermal_req_W[hour] > 0.0:
            activation_output, \
            thermal_output, \
            electricity_output, \
            gas_output, \
            biomass_output = heating_source_activator(Q_thermal_req_W[hour],
                                                      hour,
                                                      master_to_slave_variables,
                                                      Q_therm_GHP_W[hour],
                                                      T_source_average_GHP_W[hour],
                                                      T_source_average_Lake_K[hour],
                                                      Q_therm_Lake_W[hour],
                                                      Q_therm_Sew_W[hour],
                                                      T_source_average_sewage_K[hour],
                                                      T_district_heating_supply_K[hour],
                                                      T_district_heating_return_K[hour],
                                                      prices,
                                                      lca)

            source_HP_Sewage[hour] = activation_output['Source_HP_Sewage']
            source_HP_Lake[hour] = activation_output['Source_HP_Lake']
            source_GHP[hour] = activation_output['Source_GHP']
            source_CHP[hour] = activation_output['Source_CHP']
            source_Furnace_dry[hour] = activation_output['Source_Furnace_dry']
            source_Furnace_wet[hour] = activation_output['Source_Furnace_wet']
            source_BaseBoiler[hour] = activation_output['Source_BaseBoiler']
            source_PeakBoiler[hour] = activation_output['Source_PeakBoiler']

            Q_HPSew_gen_W[hour] = thermal_output['Q_HPSew_gen_W']
            Q_HPLake_gen_W[hour] = thermal_output['Q_HPLake_gen_W']
            Q_GHP_gen_W[hour] = thermal_output['Q_GHP_gen_W']
            Q_CHP_gen_W[hour] = thermal_output['Q_CHP_gen_W']
            Q_Furnace_dry_gen_W[hour] = thermal_output['Q_Furnace_dry_gen_W']
            Q_Furnace_wet_gen_W[hour] = thermal_output['Q_Furnace_wet_gen_W']
            Q_BaseBoiler_gen_W[hour] = thermal_output['Q_BaseBoiler_gen_W']
            Q_PeakBoiler_gen_W[hour] = thermal_output['Q_PeakBoiler_gen_W']
            Q_AddBoiler_gen_W[hour] = thermal_output['Q_AddBoiler_gen_W']

            E_HPSew_req_W[hour] = electricity_output['E_HPSew_req_W']
            E_HPLake_req_W[hour] = electricity_output['E_HPLake_req_W']
            E_GHP_req_W[hour] = electricity_output['E_GHP_req_W']
            E_CHP_gen_W[hour] = electricity_output['E_CHP_gen_W']
            E_BaseBoiler_req_W[hour] = electricity_output['E_BaseBoiler_req_W']
            E_PeakBoiler_req_W[hour] = electricity_output['E_PeakBoiler_req_W']

            E_Furnace_dry_gen_W[hour] = electricity_output[
                'E_Furnace_dry_gen_W']
            E_Furnace_wet_gen_W[hour] = electricity_output[
                'E_Furnace_wet_gen_W']

            NG_CHP_req_W[hour] = gas_output['Gas_CHP_req_W']
            NG_BaseBoiler_req_W[hour] = gas_output['Gas_BaseBoiler_req_W']
            NG_PeakBoiler_req_W[hour] = gas_output['Gas_PeakBoiler_req_W']
            WetBiomass_Furnace_req_W[hour] = biomass_output[
                'Biomass_Furnace_dry_req_W']
            DryBiomass_Furnace_req_W[hour] = biomass_output[
                'Biomass_Furnace_wet_req_W']

    # BACK-UP BOILER
    master_to_slave_variables.BackupBoiler_size_W = np.amax(Q_AddBoiler_gen_W)
    if master_to_slave_variables.BackupBoiler_size_W != 0:
        master_to_slave_variables.BackupBoiler_on = 1
        for hour in range(HOURS_IN_YEAR):
            tdhret_req_K = T_district_heating_return_K[hour]
            _, \
            _, \
            NG_BackupBoiler_req_W[hour], \
            E_BackupBoiler_req_W[hour] = cond_boiler_op_cost(Q_AddBoiler_gen_W[hour],
                                                             master_to_slave_variables.BackupBoiler_size_W,
                                                             tdhret_req_K,
                                                             "NG",
                                                             prices, lca, hour)

    # CAPEX (ANNUAL, TOTAL) AND OPEX (FIXED, VAR) GENERATION UNITS
    performance_costs_generation = cost_model.calc_generation_costs_heating(
        locator,
        master_to_slave_variables,
        config,
        storage_dispatch,
    )

    # CAPEX (ANNUAL, TOTAL) AND OPEX (FIXED, VAR) NETWORK
    performance_costs_network, \
    E_used_district_heating_network_W = cost_model.calc_network_costs_heating(locator,
                                                                              master_to_slave_variables,
                                                                              network_features,
                                                                              lca,
                                                                              "DH")

    # MERGE COSTS AND EMISSIONS IN ONE FILE
    district_heating_costs = dict(performance_costs_generation,
                                  **performance_costs_network)

    # save data
    district_heating_generation_dispatch = {

        # demand of the network:
        "Q_districtheating_sys_req_W": Q_DH_networkload_W,

        # Status of each technology 1 = on, 0 = off in every hour
        "HPSew_Status": source_HP_Sewage,
        "HPLake_Status": source_HP_Lake,
        "GHP_Status": source_GHP,
        "CHP_Status": source_CHP,
        "Furnace_dry_Status": source_Furnace_dry,
        "Furnace_wet_Status": source_Furnace_wet,
        "BoilerBase_Status": source_BaseBoiler,
        "BoilerPeak_Status": source_PeakBoiler,

        # ENERGY GENERATION
        # heating
        "Q_PVT_gen_storage_W": Q_PVT_to_storage_W,
        "Q_SC_ET_gen_storage_W": Q_SC_ET_to_storage_W,
        "Q_SC_FP_gen_storage_W": Q_SC_FP_to_storage_W,
        "Q_HP_Server_storage_W": Q_HP_Server_to_storage_W,

        # this is what is generated out of all the technologies sent to the storage
        "Q_Storage_gen_directload_W": Q_Storage_gen_W,
        # heating
        "Q_PVT_gen_directload_W": Q_PVT_to_directload_W,
        "Q_SC_ET_gen_directload_W": Q_SC_ET_to_directload_W,
        "Q_SC_FP_gen_directload_W": Q_SC_FP_to_directload_W,
        "Q_HP_Server_gen_directload_W": Q_HP_Server_to_directload_W,
        "Q_HP_Sew_gen_directload_W": Q_HPSew_gen_W,
        "Q_HP_Lake_gen_directload_W": Q_HPLake_gen_W,
        "Q_GHP_gen_directload_W": Q_GHP_gen_W,
        "Q_CHP_gen_directload_W": Q_CHP_gen_W,
        "Q_Furnace_dry_gen_directload_W": Q_Furnace_dry_gen_W,
        "Q_Furnace_wet_gen_directload_W": Q_Furnace_wet_gen_W,
        "Q_BaseBoiler_gen_directload_W": Q_BaseBoiler_gen_W,
        "Q_PeakBoiler_gen_directload_W": Q_PeakBoiler_gen_W,
        "Q_BackupBoiler_gen_directload_W": Q_AddBoiler_gen_W,

        # electricity
        "E_CHP_gen_W": E_CHP_gen_W,
        "E_PVT_gen_W": E_PVT_gen_W,
        "E_Furnace_dry_gen_W": E_Furnace_dry_gen_W,
        "E_Furnace_wet_gen_W": E_Furnace_wet_gen_W,
    }

    district_heating_electricity_requirements_dispatch = {
        # ENERGY REQUIREMENTS
        # Electricity
        "E_Storage_charging_req_W": E_Storage_req_charging_W,
        "E_Storage_discharging_req_W": E_Storage_req_discharging_W,
        "E_DHN_req_W": E_used_district_heating_network_W,
        "E_HP_SC_FP_req_W": E_HP_SC_FP_req_W,
        "E_HP_SC_ET_req_W": E_HP_SC_ET_req_W,
        "E_HP_PVT_req_W": E_HP_PVT_req_W,
        "E_HP_Server_req_W": E_HP_Server_req_W,
        "E_HP_Sew_req_W": E_HPSew_req_W,
        "E_HP_Lake_req_W": E_HPLake_req_W,
        "E_GHP_req_W": E_GHP_req_W,
        "E_BaseBoiler_req_W": E_BaseBoiler_req_W,
        "E_PeakBoiler_req_W": E_PeakBoiler_req_W,
        "E_BackupBoiler_req_W": E_BackupBoiler_req_W,
    }
    district_heating_fuel_requirements_dispatch = {
        # FUEL REQUIREMENTS
        "NG_CHP_req_W": NG_CHP_req_W,
        "NG_BaseBoiler_req_W": NG_BaseBoiler_req_W,
        "NG_PeakBoiler_req_W": NG_PeakBoiler_req_W,
        "NG_BackupBoiler_req_W": NG_BackupBoiler_req_W,
        "WB_Furnace_req_W": WetBiomass_Furnace_req_W,
        "DB_Furnace_req_W": DryBiomass_Furnace_req_W,
    }

    return district_heating_costs, \
           district_heating_generation_dispatch, \
           district_heating_electricity_requirements_dispatch,\
           district_heating_fuel_requirements_dispatch