Beispiel #1
0
def balance_conversion_plus_tiers_constraint_rule(backend_model, tier,
                                                  loc_tech, timestep):
    """
    Force all carrier_in_2/carrier_in_3 and carrier_out_2/carrier_out_3 to follow
    carrier_in and carrier_out (respectively).

    If `tier` in ['out_2', 'out_3']:

    .. container:: scrolling-wrapper

        .. math::

            \\sum_{loc::tech::carrier \\in loc::tech::carriers_{out}} (
            \\frac{\\boldsymbol{carrier_{prod}}(loc::tech::carrier, timestep)}{
                carrier\\_ratio(loc::tech::carrier, `out')} =
            \\sum_{loc::tech::carrier \\in loc::tech::carriers_{tier}} (
            \\frac{\\boldsymbol{carrier_{prod}}(loc::tech::carrier, timestep)}{
                carrier\\_ratio(loc::tech::carrier, tier)}
            \\quad \\forall \\text { tier } \\in [`out_2', `out_3'], \\forall loc::tech
                \\in loc::techs_{conversion^{+}}, \\forall timestep \\in timesteps

    If `tier` in ['in_2', 'in_3']:

    .. container:: scrolling-wrapper

        .. math::

            \\sum_{loc::tech::carrier \\in loc::tech::carriers_{in}}
            \\frac{\\boldsymbol{carrier_{con}}(loc::tech::carrier, timestep)}{
                carrier\\_ratio(loc::tech::carrier, `in')} =
            \\sum_{loc::tech::carrier \\in loc::tech::carriers_{tier}}
            \\frac{\\boldsymbol{carrier_{prod}}(loc::tech::carrier, timestep)}{
                carrier\\_ratio(loc::tech::carrier, tier)}
            \\quad \\forall \\text{ tier } \\in [`in_2', `in_3'], \\forall loc::tech
                \\in loc::techs_{conversion^{+}}, \\forall timestep \\in timesteps
    """
    primary_tier, decision_variable = get_conversion_plus_io(
        backend_model, tier)
    model_data_dict = backend_model.__calliope_model_data['data']

    loc_tech_carriers_1 = split_comma_list(
        model_data_dict['lookup_loc_techs_conversion_plus'][primary_tier,
                                                            loc_tech])
    loc_tech_carriers_2 = split_comma_list(
        model_data_dict['lookup_loc_techs_conversion_plus'][tier, loc_tech])

    c_1 = sum(decision_variable[loc_tech_carrier, timestep] /
              get_param(backend_model, 'carrier_ratios', (primary_tier,
                                                          loc_tech_carrier))
              for loc_tech_carrier in loc_tech_carriers_1)
    c_2 = sum(
        decision_variable[loc_tech_carrier, timestep] /
        get_param(backend_model, 'carrier_ratios', (tier, loc_tech_carrier))
        for loc_tech_carrier in loc_tech_carriers_2)

    return c_1 == c_2
def balance_conversion_plus_tiers_constraint_rule(backend_model, tier, loc_tech, timestep):
    """
    Force all carrier_in_2/carrier_in_3 and carrier_out_2/carrier_out_3 to follow
    carrier_in and carrier_out (respectively).

    If `tier` in ['out_2', 'out_3']:

    .. container:: scrolling-wrapper

        .. math::

            \\sum_{loc::tech::carrier \\in loc::tech::carriers_{out}} (
            \\frac{\\boldsymbol{carrier_{prod}}(loc::tech::carrier, timestep)}{
                carrier\\_ratio(loc::tech::carrier, `out')} =
            \\sum_{loc::tech::carrier \\in loc::tech::carriers_{tier}} (
            \\frac{\\boldsymbol{carrier_{prod}}(loc::tech::carrier, timestep)}{
                carrier\\_ratio(loc::tech::carrier, tier)}
            \\quad \\forall \\text { tier } \\in [`out_2', `out_3'], \\forall loc::tech
                \\in loc::techs_{conversion^{+}}, \\forall timestep \\in timesteps

    If `tier` in ['in_2', 'in_3']:

    .. container:: scrolling-wrapper

        .. math::

            \\sum_{loc::tech::carrier \\in loc::tech::carriers_{in}}
            \\frac{\\boldsymbol{carrier_{con}}(loc::tech::carrier, timestep)}{
                carrier\\_ratio(loc::tech::carrier, `in')} =
            \\sum_{loc::tech::carrier \\in loc::tech::carriers_{tier}}
            \\frac{\\boldsymbol{carrier_{prod}}(loc::tech::carrier, timestep)}{
                carrier\\_ratio(loc::tech::carrier, tier)}
            \\quad \\forall \\text{ tier } \\in [`in_2', `in_3'], \\forall loc::tech
                \\in loc::techs_{conversion^{+}}, \\forall timestep \\in timesteps
    """
    primary_tier, decision_variable = get_conversion_plus_io(backend_model, tier)
    model_data_dict = backend_model.__calliope_model_data__['data']

    loc_tech_carriers_1 = split_comma_list(
        model_data_dict['lookup_loc_techs_conversion_plus'][primary_tier, loc_tech]
    )
    loc_tech_carriers_2 = split_comma_list(
        model_data_dict['lookup_loc_techs_conversion_plus'][tier, loc_tech]
    )

    c_1 = sum(decision_variable[loc_tech_carrier, timestep]
        / get_param(backend_model, 'carrier_ratios', (primary_tier, loc_tech_carrier))
        for loc_tech_carrier in loc_tech_carriers_1)
    c_2 = sum(decision_variable[loc_tech_carrier, timestep]
        / get_param(backend_model, 'carrier_ratios', (tier, loc_tech_carrier))
        for loc_tech_carrier in loc_tech_carriers_2)

    return c_1 == c_2
Beispiel #3
0
def carrier_production_min_conversion_plus_milp_constraint_rule(
        backend_model, loc_tech, timestep):
    """
    Set minimum carrier production of conversion_plus MILP techs

    .. container:: scrolling-wrapper

        .. math::
            \sum_{loc::tech::carrier \\in loc::tech::carriers_{out}}
            \\boldsymbol{carrier_{prod}}(loc::tech::carrier, timestep)
            \\geq energy_{cap, per unit}(loc::tech) \\times timestep\_resolution(timestep)
            \\times \\boldsymbol{operating\_units}(loc::tech, timestep)
            \\times energy_{cap, min use}(loc::tech)
            \\quad \\forall loc::tech \\in loc::techs_{milp, conversion^{+}},
            \\forall timestep \\in timesteps

    """
    model_data_dict = backend_model.__calliope_model_data__['data']
    timestep_resolution = backend_model.timestep_resolution[timestep]
    energy_cap = get_param(backend_model, 'energy_cap_per_unit', loc_tech)
    min_use = get_param(backend_model, 'energy_cap_min_use',
                        (loc_tech, timestep))
    loc_tech_carriers_out = (split_comma_list(
        model_data_dict['lookup_loc_techs_conversion_plus']['out', loc_tech]))

    carrier_prod = sum(backend_model.carrier_prod[loc_tech_carrier, timestep]
                       for loc_tech_carrier in loc_tech_carriers_out)

    return carrier_prod >= (backend_model.operating_units[loc_tech, timestep] *
                            timestep_resolution * energy_cap * min_use)
Beispiel #4
0
def carrier_production_min_conversion_plus_milp_constraint_rule(backend_model, loc_tech, timestep):
    """
    Set minimum carrier production of conversion_plus MILP techs

    .. container:: scrolling-wrapper

        .. math::
            \\sum_{loc::tech::carrier \\in loc::tech::carriers_{out}}
            \\boldsymbol{carrier_{prod}}(loc::tech::carrier, timestep)
            \\geq energy_{cap, per unit}(loc::tech) \\times timestep\\_resolution(timestep)
            \\times \\boldsymbol{operating\\_units}(loc::tech, timestep)
            \\times energy_{cap, min use}(loc::tech)
            \\quad \\forall loc::tech \\in loc::techs_{milp, conversion^{+}},
            \\forall timestep \\in timesteps

    """
    model_data_dict = backend_model.__calliope_model_data__['data']
    timestep_resolution = backend_model.timestep_resolution[timestep]
    energy_cap = get_param(backend_model, 'energy_cap_per_unit', loc_tech)
    min_use = get_param(backend_model, 'energy_cap_min_use', (loc_tech, timestep))
    loc_tech_carriers_out = (
        split_comma_list(model_data_dict['lookup_loc_techs_conversion_plus']['out', loc_tech])
    )

    carrier_prod = sum(backend_model.carrier_prod[loc_tech_carrier, timestep]
                       for loc_tech_carrier in loc_tech_carriers_out)

    return carrier_prod >= (
        backend_model.operating_units[loc_tech, timestep] *
        timestep_resolution * energy_cap * min_use
    )
Beispiel #5
0
def carrier_production_min_conversion_plus_constraint_rule(
        backend_model, loc_tech, timestep):
    """
    Set minimum conversion_plus carrier production.

    .. container:: scrolling-wrapper

        .. math::

            \\sum_{loc::tech::carrier \\in loc::tech::carriers_{out}}
            \\boldsymbol{carrier_{prod}}(loc::tech::carrier, timestep)
            \\leq \\boldsymbol{energy_{cap}}(loc::tech) \\times timestep\\_resolution(timestep)
            \\times energy_{cap, min use}(loc::tech)
            \\quad \\forall loc::tech \\in loc::techs_{conversion^{+}},
            \\forall timestep \\in timesteps
    """
    model_data_dict = backend_model.__calliope_model_data["data"]

    timestep_resolution = backend_model.timestep_resolution[timestep]
    min_use = get_param(backend_model, "energy_cap_min_use",
                        (loc_tech, timestep))

    loc_tech_carriers_out = split_comma_list(
        model_data_dict["lookup_loc_techs_conversion_plus"]["out", loc_tech])

    carrier_prod = sum(backend_model.carrier_prod[loc_tech_carrier, timestep]
                       for loc_tech_carrier in loc_tech_carriers_out)

    return carrier_prod >= (timestep_resolution *
                            backend_model.energy_cap[loc_tech] * min_use)
Beispiel #6
0
def carrier_production_max_conversion_plus_constraint_rule(
        backend_model, loc_tech, timestep):
    """
    Set maximum conversion_plus carrier production.

    .. container:: scrolling-wrapper

        .. math::

            \\sum_{loc::tech::carrier \\in loc::tech::carriers_{out}}
            \\boldsymbol{carrier_{prod}}(loc::tech::carrier, timestep)
            \\leq \\boldsymbol{energy_{cap}}(loc::tech) \\times timestep\\_resolution(timestep)
            \\quad \\forall loc::tech \\in loc::techs_{conversion^{+}},
            \\forall timestep \\in timesteps
    """
    model_data_dict = backend_model.__calliope_model_data['data']

    timestep_resolution = backend_model.timestep_resolution[timestep]
    loc_tech_carriers_out = split_comma_list(
        model_data_dict['lookup_loc_techs_conversion_plus']['out', loc_tech])

    carrier_prod = sum(backend_model.carrier_prod[loc_tech_carrier, timestep]
                       for loc_tech_carrier in loc_tech_carriers_out)

    return carrier_prod <= timestep_resolution * backend_model.energy_cap[
        loc_tech]
def carrier_production_min_conversion_plus_constraint_rule(backend_model, loc_tech, timestep):
    """
    Set minimum conversion_plus carrier production.

    .. container:: scrolling-wrapper

        .. math::

            \\sum_{loc::tech::carrier \\in loc::tech::carriers_{out}}
            \\boldsymbol{carrier_{prod}}(loc::tech::carrier, timestep)
            \\leq \\boldsymbol{energy_{cap}}(loc::tech) \\times timestep\\_resolution(timestep)
            \\times energy_{cap, min use}(loc::tech)
            \\quad \\forall loc::tech \\in loc::techs_{conversion^{+}},
            \\forall timestep \\in timesteps
    """
    model_data_dict = backend_model.__calliope_model_data__['data']

    timestep_resolution = backend_model.timestep_resolution[timestep]
    min_use = get_param(backend_model, 'energy_cap_min_use', (loc_tech, timestep))

    loc_tech_carriers_out = split_comma_list(
        model_data_dict['lookup_loc_techs_conversion_plus']['out', loc_tech]
    )

    carrier_prod = sum(backend_model.carrier_prod[loc_tech_carrier, timestep]
                       for loc_tech_carrier in loc_tech_carriers_out)

    return carrier_prod >= (
        timestep_resolution * backend_model.energy_cap[loc_tech] * min_use
    )
Beispiel #8
0
def carrier_production_max_conversion_plus_milp_constraint_rule(
    backend_model, loc_tech, timestep
):
    """
    Set maximum carrier production of conversion_plus MILP techs

    .. container:: scrolling-wrapper

        .. math::

            \\sum_{loc::tech::carrier \\in loc::tech::carriers_{out}}
            \\boldsymbol{carrier_{prod}}(loc::tech::carrier, timestep)
            \\leq energy_{cap, per unit}(loc::tech) \\times timestep\\_resolution(timestep)
            \\times \\boldsymbol{operating\\_units}(loc::tech, timestep)
            \\times \\eta_{parasitic}(loc::tech, timestep)
            \\quad \\forall loc::tech \\in loc::techs_{milp, conversion^{+}}, \\forall timestep \\in timesteps

    """
    model_data_dict = backend_model.__calliope_model_data["data"]
    timestep_resolution = backend_model.timestep_resolution[timestep]
    energy_cap = get_param(backend_model, "energy_cap_per_unit", loc_tech)
    loc_tech_carriers_out = split_comma_list(
        model_data_dict["lookup_loc_techs_conversion_plus"]["out", loc_tech]
    )

    carrier_prod = sum(
        backend_model.carrier_prod[loc_tech_carrier, timestep]
        for loc_tech_carrier in loc_tech_carriers_out
    )

    return carrier_prod <= (
        backend_model.operating_units[loc_tech, timestep]
        * timestep_resolution
        * energy_cap
    )
Beispiel #9
0
def balance_conversion_plus_primary_constraint_rule(backend_model, loc_tech, timestep):
    """
    Balance energy carrier consumption and production for carrier_in and carrier_out

    .. container:: scrolling-wrapper

        .. math::

            \\sum_{loc::tech::carrier \\in loc::tech::carriers_{out}}
            \\frac{\\boldsymbol{carrier_{prod}}(loc::tech::carrier, timestep)}{
                carrier\\_ratio(loc::tech::carrier, `out')} =
            -1 * \\sum_{loc::tech::carrier \\in loc::tech::carriers_{in}} (
            \\boldsymbol{carrier_{con}}(loc::tech::carrier, timestep)
            * carrier\\_ratio(loc::tech::carrier, `in') * \\eta_{energy}(loc::tech, timestep))
            \\quad \\forall loc::tech \\in loc::techs_{conversion^{+}}, \\forall timestep \\in timesteps
    """
    model_data_dict = backend_model.__calliope_model_data['data']

    loc_tech_carriers_out = split_comma_list(
        model_data_dict['lookup_loc_techs_conversion_plus']['out', loc_tech]
    )
    loc_tech_carriers_in = split_comma_list(
        model_data_dict['lookup_loc_techs_conversion_plus']['in', loc_tech]
    )

    energy_eff = get_param(backend_model, 'energy_eff', (loc_tech, timestep))

    carrier_prod = []
    for loc_tech_carrier in loc_tech_carriers_out:
        carrier_ratio = get_param(
            backend_model, 'carrier_ratios', ('out', loc_tech_carrier, timestep)
        )
        if po.value(carrier_ratio) != 0:
            carrier_prod.append(
                backend_model.carrier_prod[loc_tech_carrier, timestep] / carrier_ratio
            )

    carrier_con = sum(
        backend_model.carrier_con[loc_tech_carrier, timestep] *
        get_param(backend_model, 'carrier_ratios', ('in', loc_tech_carrier, timestep))
        for loc_tech_carrier in loc_tech_carriers_in
    )

    return sum(carrier_prod) == -1 * carrier_con * energy_eff
def balance_conversion_plus_primary_constraint_rule(backend_model, loc_tech, timestep):
    """
    Balance energy carrier consumption and production for carrier_in and carrier_out

    .. container:: scrolling-wrapper

        .. math::

            \\sum_{loc::tech::carrier \\in loc::tech::carriers_{out}}
            \\frac{\\boldsymbol{carrier_{prod}}(loc::tech::carrier, timestep)}{
                carrier\\_ratio(loc::tech::carrier, `out')} =
            -1 * \\sum_{loc::tech::carrier \\in loc::tech::carriers_{in}} (
            \\boldsymbol{carrier_{con}}(loc::tech::carrier, timestep)
            * carrier\\_ratio(loc::tech::carrier, `in') * \\eta_{energy}(loc::tech, timestep))
            \\quad \\forall loc::tech \\in loc::techs_{conversion^{+}}, \\forall timestep \\in timesteps
    """
    model_data_dict = backend_model.__calliope_model_data__['data']

    loc_tech_carriers_out = split_comma_list(
        model_data_dict['lookup_loc_techs_conversion_plus']['out', loc_tech]
    )
    loc_tech_carriers_in = split_comma_list(
        model_data_dict['lookup_loc_techs_conversion_plus']['in', loc_tech]
    )

    energy_eff = get_param(backend_model, 'energy_eff', (loc_tech, timestep))

    carrier_prod = sum(
        backend_model.carrier_prod[loc_tech_carrier, timestep] /
        get_param(backend_model, 'carrier_ratios', ('out', loc_tech_carrier))
        for loc_tech_carrier in loc_tech_carriers_out
    )
    carrier_con = sum(
        backend_model.carrier_con[loc_tech_carrier, timestep] *
        get_param(backend_model, 'carrier_ratios', ('in', loc_tech_carrier))
        for loc_tech_carrier in loc_tech_carriers_in
    )

    return carrier_prod == -1 * carrier_con * energy_eff
Beispiel #11
0
def resource_area_capacity_per_loc_constraint_rule(backend_model, loc):
    """
    Set upper bound on use of area for all locations which have `available_area`
    constraint set. Does not consider resource_area applied to demand technologies

    .. container:: scrolling-wrapper

        .. math::

            \\sum_{tech} \\boldsymbol{resource_{area}}(loc::tech) \\leq available\_area
            \\quad \\forall loc \in locs \\text{ if } available\_area(loc)
    """
    model_data_dict = backend_model.__calliope_model_data__['data']
    available_area = model_data_dict['available_area'][loc]

    loc_techs = split_comma_list(model_data_dict['lookup_loc_techs_area'][loc])

    return (sum(backend_model.resource_area[loc_tech]
                for loc_tech in loc_techs) <= available_area)
Beispiel #12
0
def resource_area_capacity_per_loc_constraint_rule(backend_model, loc):
    """
    Set upper bound on use of area for all locations which have `available_area`
    constraint set. Does not consider resource_area applied to demand technologies

    .. container:: scrolling-wrapper

        .. math::

            \\sum_{tech} \\boldsymbol{resource_{area}}(loc::tech) \\leq available\\_area
            \\quad \\forall loc \\in locs \\text{ if } available\\_area(loc)
    """
    model_data_dict = backend_model.__calliope_model_data__['data']
    available_area = model_data_dict['available_area'][loc]

    loc_techs = split_comma_list(model_data_dict['lookup_loc_techs_area'][loc])

    return (
        sum(backend_model.resource_area[loc_tech] for loc_tech in loc_techs)
        <= available_area
    )
Beispiel #13
0
def balance_conversion_plus_tiers_constraint_rule(backend_model, tier,
                                                  loc_tech, timestep):
    """
    Force all carrier_in_2/carrier_in_3 and carrier_out_2/carrier_out_3 to follow
    carrier_in and carrier_out (respectively).

    If `tier` in ['out_2', 'out_3']:

    .. container:: scrolling-wrapper

        .. math::

            \\sum_{loc::tech::carrier \\in loc::tech::carriers_{out}} (
            \\frac{\\boldsymbol{carrier_{prod}}(loc::tech::carrier, timestep)}{
                carrier\\_ratio(loc::tech::carrier, `out')} =
            \\sum_{loc::tech::carrier \\in loc::tech::carriers_{tier}} (
            \\frac{\\boldsymbol{carrier_{prod}}(loc::tech::carrier, timestep)}{
                carrier\\_ratio(loc::tech::carrier, tier)}
            \\quad \\forall \\text { tier } \\in [`out_2', `out_3'], \\forall loc::tech
                \\in loc::techs_{conversion^{+}}, \\forall timestep \\in timesteps

    If `tier` in ['in_2', 'in_3']:

    .. container:: scrolling-wrapper

        .. math::

            \\sum_{loc::tech::carrier \\in loc::tech::carriers_{in}}
            \\frac{\\boldsymbol{carrier_{con}}(loc::tech::carrier, timestep)}{
                carrier\\_ratio(loc::tech::carrier, `in')} =
            \\sum_{loc::tech::carrier \\in loc::tech::carriers_{tier}}
            \\frac{\\boldsymbol{carrier_{prod}}(loc::tech::carrier, timestep)}{
                carrier\\_ratio(loc::tech::carrier, tier)}
            \\quad \\forall \\text{ tier } \\in [`in_2', `in_3'], \\forall loc::tech
                \\in loc::techs_{conversion^{+}}, \\forall timestep \\in timesteps
    """
    primary_tier, decision_variable = get_conversion_plus_io(
        backend_model, tier)
    model_data_dict = backend_model.__calliope_model_data["data"]

    loc_tech_carriers_1 = split_comma_list(
        model_data_dict["lookup_loc_techs_conversion_plus"][primary_tier,
                                                            loc_tech])
    loc_tech_carriers_2 = split_comma_list(
        model_data_dict["lookup_loc_techs_conversion_plus"][tier, loc_tech])

    c_1 = []
    c_2 = []
    for loc_tech_carrier in loc_tech_carriers_1:
        carrier_ratio_1 = get_param(backend_model, "carrier_ratios",
                                    (primary_tier, loc_tech_carrier, timestep))
        if po.value(carrier_ratio_1) != 0:
            c_1.append(decision_variable[loc_tech_carrier, timestep] /
                       carrier_ratio_1)
    for loc_tech_carrier in loc_tech_carriers_2:
        carrier_ratio_2 = get_param(backend_model, "carrier_ratios",
                                    (tier, loc_tech_carrier, timestep))
        if po.value(carrier_ratio_2) != 0:
            c_2.append(decision_variable[loc_tech_carrier, timestep] /
                       carrier_ratio_2)
    if len(c_2) == 0:
        return po.Constraint.Skip
    else:
        return sum(c_1) == sum(c_2)