示例#1
0
def test_init_dict_brackets():
    """Test
    """
    first_level_keys = ["a", "b"]
    one_level_dict = helpers.init_dict_brackets(first_level_keys)
    expected = {"a": {}, "b": {}}

    assert one_level_dict == expected
示例#2
0
def get_s_fueltype_tech(
        enduses,
        fuel_p_tech_by,
        fuels,
        technologies,
        sector=False
    ):
    """Calculate total energy service fractions per technology.
    This calculation converts fuels into energy services (e.g. heating
    for fuel into heat demand) and then calculates how much an invidual
    technology contributes as a fraction of total energy service demand.

    This is calculated to determine how much the technology
    has already diffused up to the base year to define the
    first point on the sigmoid technology diffusion curve.

    Arguments
    ----------
    enduses : dict
        Enduses
    fuel_p_tech_by : dict
        Assumed fraction of fuel for each technology within a fueltype
    fuels : array
        Base year fuel demand
    technologies : object
        Technology of base year (region dependent)

    Return
    ------
    s_tech_by_p : dict
        Percentage of total energy service per technology for base year
    s_fueltype_by_p : dict
        Percentage of energy service per fueltype
    """
    fueltypes =  lookup_tables.basic_lookups()['fueltypes']

    service = init_nested_dict_brackets(fuels, fueltypes.values()) # Energy service per technology for base year
    s_tech_by_p = helpers.init_dict_brackets(fuels) # Percentage of total energy service per technology for base year
    s_fueltype_by_p = init_nested_dict_zero(sector, s_tech_by_p.keys(), range(len(fueltypes))) # Percentage of service per fueltype

    for enduse in enduses:

        # Depending if sector or not sector specific
        fuel = fuels[enduse][sector]

        for fueltype, fuel_fueltype in enumerate(fuel):
            tot_s_fueltype = 0

            # Initialise
            for tech in fuel_p_tech_by[enduse][sector][fueltype]:
                service[enduse][fueltype][tech] = 0

            # Iterate technologies to calculate share of energy service depending on fuel and efficiencies
            for tech, fuel_alltech_by in fuel_p_tech_by[enduse][sector][fueltype].items():

                # Fuel share based on defined shares within fueltype (share of fuel * total fuel)
                fuel_tech = fuel_alltech_by * fuel_fueltype

                # Get efficiency for base year
                if technologies[tech].tech_type == 'heat_pump':
                    eff_tech = tech_related.eff_heat_pump(
                        temp_diff=10,
                        efficiency_intersect=technologies[tech].eff_by)
                else:
                    eff_tech = technologies[tech].eff_by

                # Energy service: Service == Fuel of technoloy * efficiency
                s_fueltype_tech = fuel_tech * eff_tech

                # Add energy service demand
                service[enduse][fueltype][tech] += s_fueltype_tech

                # Total energy service demand within a fueltype
                tot_s_fueltype += s_fueltype_tech

            # Calculate percentage of service enduse within fueltype
            for tech in fuel_p_tech_by[enduse][sector][fueltype]:
                if tot_s_fueltype == 0: # No fuel in this fueltype
                    s_fueltype_by_p[enduse][sector][fueltype] += 0
                else:
                    s_fueltype_by_p[enduse][sector][fueltype] += service[enduse][fueltype][tech]

        # Calculate percentage of service of all technologies
        total_s = sum_2_level_dict(service[enduse])

        # Percentage of energy service per technology
        for fueltype, technology_s_enduse in service[enduse].items():
            for technology, s_tech in technology_s_enduse.items():

                with np.errstate(divide='ignore'):

                    if total_s == 0:
                        s_p_tech = 0
                    else:
                        # Calculate service
                        s_p_tech = s_tech / total_s

                     # Do not add dummy technology with zero service
                    if technology == 'placeholder_tech' and s_p_tech == 0:
                        pass
                    else:
                        try:
                            s_tech_by_p[enduse][technology] += s_p_tech
                        except:
                            s_tech_by_p[enduse][technology] = s_p_tech

        # Convert service per enduse
        for fueltype in s_fueltype_by_p[enduse][sector]:
            with np.errstate(divide='ignore'):
                s_fueltype_by_p[enduse][sector][fueltype] = s_fueltype_by_p[enduse][sector][fueltype] / total_s

    #warnings.filterwarnings('ignore') # Ignore warnings
    # Test if the energy service for all technologies is 100%
    # Test if within fueltype always 100 energy service 
    for enduse, s_p_techs in s_tech_by_p.items():
        sum_enduse = sum(s_p_techs.values())
        if round(sum_enduse, 2) != 0: # if total is zero, no demand provided
            assert round(sum_enduse, 2) == 1.0

    return s_tech_by_p, s_fueltype_by_p