Transmission Link

Contents

Overview | Asset Structure | Input File (Standard Format) | Types - Asset Structure | Constructors | Examples | Best Practices | Input File (Advanced Format)

Transmission Link assets in Macro represent a general commodity transmission infrastructure that links various geographic regions or nodes. These assets are specified using JSON or CSV input files located in the assets directory, usually named with descriptive identifiers such as transmissions.json or transmissions.csv.

A Transmission Link asset consists of one main component:

  1. Transmission Edge: Represents the flow of a commodity between two nodes with capacity constraints and losses

Here is a graphical representation of the Transmission Link asset:

%%{init: {'theme': 'base', 'themeVariables': { 'background': '#D1EBDE' }}}%% flowchart LR subgraph TransmissionLink direction LR A((Commodity)) e1@-->|Transmission| B((Commodity)) e1@{ animate: true } end style A r:40,fill:#FFD700,stroke:black,color:black,stroke-dasharray: 3,5; style B r:40,fill:#FFD700,stroke:black,color:black,stroke-dasharray: 3,5; linkStyle 0 stroke:#FFD700, stroke-width: 2px;

The easiest way to include a Transmission Link asset in a model is to create a new file (either JSON or CSV) and place it in the assets directory together with the other assets.

your_case/
├── assets/
│   ├── transmissions.json    # or transmissions.csv
│   ├── other_assets.json
│   └── ...
├── system/
├── settings/
└── ...

This file can either be created manually, or using the template_asset function, as shown in the Adding an Asset to a System section of the User Guide. The file will be automatically loaded when you run your Macro model.

The following is an example of a Transmission Link asset input file:

{
    "link": [
        {
            "type": "TransmissionLink",
            "instance_data": [
                {
                    "id": "SE_to_MIDAT",
                    "commodity": "Electricity",
                    "transmission_origin": "elec_SE",
                    "transmission_dest": "elec_MIDAT",
                    "distance": 491.4512001,
                    "existing_capacity": 5552,
                    "max_capacity": 27760,
                    "investment_cost": 40219,
                    "loss_fraction": 0.04914512,
                    "transmission_constraints": {
                        "MaxCapacityConstraint": true
                    }
                }
            ]
        }
    ]
}
Global Data vs Instance Data

When working with JSON input files, the global_data field can be used to group data that is common to all instances of the same asset type. This is useful for setting constraints that are common to all instances of the same asset type and avoid repeating the same data for each instance. See the Examples section below for an example.

The following tables outline the attributes that can be set for a Transmission Link asset.

Essential Attributes

FieldTypeDescription
TypeStringAsset type identifier: "TransmissionLink"
idStringUnique identifier for the Transmission Link instance
commodityStringCommodity type being transmitted (e.g., "Electricity")
transmission_originStringOrigin node identifier
transmission_destStringDestination node identifier

Transmission Link assets can have different constraints applied to them, and the user can configure them using the following fields:

FieldTypeDescription
transmission_constraintsDict{String,Bool}List of constraints applied to the transmission edge.

Users can refer to the Adding Asset Constraints to a System section of the User Guide for a list of all the constraints that can be applied to a Transmission Link asset.

Default constraints

To simplify the input file and the asset configuration, the following constraints are applied to the Transmission Link asset by default:

Investment Parameters

FieldTypeDescriptionUnitsDefault
can_retireBooleanWhether capacity can be retired-false
can_expandBooleanWhether capacity can be expanded-true
existing_capacityFloat64Initial installed capacityMW0.0
capacity_sizeFloat64Unit size for capacity decisions-1.0

Additional Investment Parameters

Maximum and minimum capacity constraints

If MaxCapacityConstraint or MinCapacityConstraint are added to the constraints dictionary for the transmission edge, the following parameters are used by Macro:

FieldTypeDescriptionUnitsDefault
max_capacityFloat64Maximum allowed capacityMWInf
min_capacityFloat64Minimum allowed capacityMW0.0

Economic Parameters

FieldTypeDescriptionUnitsDefault
investment_costFloat64CAPEX per unit capacity$/MW0.0
annualized_investment_costUnion{Nothing,Float64}Annualized CAPEX$/MW/yrcalculated
fixed_om_costFloat64Fixed O&M costs$/MW/yr0.0
variable_om_costFloat64Variable O&M costs$/MWh0.0
waccFloat64Weighted average cost of capitalfraction0.0
lifetimeIntAsset lifetime in yearsyears1
capital_recovery_periodIntInvestment recovery periodyears1
retirement_periodIntRetirement periodyears0

Operational Parameters

FieldTypeDescriptionUnitsDefault
distanceFloat64Distance between nodeskm0.0
loss_fractionFloat64Fraction of power lost during transmissionfraction0.0
unidirectionalBooleanWhether the transmission is unidirectional-false

The TransmissionLink asset is defined as follows:

struct TransmissionLink{T} <: AbstractAsset
    id::AssetId
    transmission_edge::Edge{<:T}
end

Default constructor

TransmissionLink(id::AssetId, transmission_edge::Edge{<:T})

Factory constructor

make(asset_type::Type{TransmissionLink}, data::AbstractDict{Symbol,Any}, system::System)
FieldTypeDescription
asset_typeType{TransmissionLink}Macro type of the asset
dataAbstractDict{Symbol,Any}Dictionary containing the input data for the asset
systemSystemSystem to which the asset belongs

This section contains examples of how to use the Transmission Link asset in a Macro model.

This example shows two transmission links between the SE and MIDAT regions, and the MIDAT and NE regions. Each transmission link has a maximum capacity constraint applied to it.

JSON Format:

Note that the global_data field is used to set the fields and constraints that are common to all instances of the same asset type.

{
    "link": [
        {
            "type": "TransmissionLink",
            "global_data": {
                "transmission_constraints": {
                    "MaxCapacityConstraint": true
                }
            },
            "instance_data": [
                {
                    "id": "SE_to_MIDAT",
                    "commodity": "Electricity",
                    "transmission_origin": "elec_SE",
                    "transmission_dest": "elec_MIDAT",
                    "distance": 491.4512001,
                    "existing_capacity": 5552,
                    "max_capacity": 27760,
                    "investment_cost": 40219,
                    "loss_fraction": 0.04914512
                },
                {
                    "id": "MIDAT_to_NE",
                    "commodity": "Electricity",
                    "transmission_origin": "elec_MIDAT",
                    "transmission_dest": "elec_NE",
                    "distance": 473.6625536,
                    "existing_capacity": 1915,
                    "max_capacity": 9575,
                    "investment_cost": 62316,
                    "loss_fraction": 0.047366255
                }
            ]
        }
    ]
}

CSV Format:

Typeidcommoditytransmission_origintransmission_destdistanceexisting_capacitymax_capacityinvestment_costloss_fractiontransmission_constraints–MaxCapacityConstraint
TransmissionLinkSE_to_MIDATElectricityelec_SEelec_MIDAT491.4512001555227760402190.04914512true
TransmissionLinkMIDAT_to_NEElectricityelec_MIDATelec_NE473.662553619159575623160.047366255true
  1. Use global data for common fields and constraints: Use the global_data field to set the fields and constraints that are common to all instances of the same asset type.
  2. Set realistic transmission losses: Ensure loss fractions reflect actual transmission line characteristics
  3. Use meaningful IDs: Choose descriptive identifiers that indicate origin and destination nodes
  4. Consider capacity constraints: Set appropriate maximum capacity limits based on technology and distance
  5. Use constraints selectively: Only enable constraints that are necessary for your modeling needs
  6. Validate costs: Ensure investment and O&M costs are in appropriate units
  7. Test configurations: Start with simple configurations and gradually add complexity

Macro provides an advanced format for defining Transmission Link assets, offering users and modelers detailed control over asset specifications. This format builds upon the standard format and is ideal for those who need more comprehensive customization.

To understand the advanced format, consider the graph representation and the type definition of a Transmission Link asset. The input file mirrors this hierarchical structure.

A Transmission Link asset in Macro is composed of a single transmission edge, represented by an Edge object. The input file for a Transmission Link asset is therefore organized as follows:

{
    "edges": {
        "transmission_edge": {
            // ... transmission_edge-specific attributes ...
        }
    }
}

Each top-level key (e.g., "edges") denotes a component type. The second-level keys either specify the attributes of the component (when there is a single instance) or identify the instances of the component (e.g., "transmission_edge") when there are multiple instances. For multiple instances, a third-level key details the attributes for each instance.

Below is an example of an input file for a Transmission Link asset that sets up two transmission lines between different regions.

{
    "link": [
        {
            "type": "TransmissionLink",
            "global_data": {
                "edges": {
                    "transmission_edge": {
                        "commodity": "Electricity",
                        "has_capacity": true,
                        "unidirectional": false,
                        "can_expand": true,
                        "can_retire": false,
                        "integer_decisions": false,
                        "constraints": {
                            "CapacityConstraint": true,
                            "MaxCapacityConstraint": true
                        }
                    }
                }
            },
            "instance_data": [
                {
                    "id": "SE_to_MIDAT",
                    "edges": {
                        "transmission_edge": {
                            "start_vertex": "elec_SE",
                            "end_vertex": "elec_MIDAT",
                            "distance": 491.4512001,
                            "existing_capacity": 5552,
                            "max_capacity": 27760,
                            "investment_cost": 40219,
                            "loss_fraction": 0.04914512
                        }
                    }
                },
                {
                    "id": "MIDAT_to_NE",
                    "edges": {
                        "transmission_edge": {
                            "start_vertex": "elec_MIDAT",
                            "end_vertex": "elec_NE",
                            "distance": 473.6625536,
                            "existing_capacity": 1915,
                            "max_capacity": 9575,
                            "investment_cost": 62316,
                            "loss_fraction": 0.047366255
                        }
                    }
                }
            ]
        }
    ]
}

Key Points

  • The global_data field is utilized to define attributes and constraints that apply universally to all instances of a particular asset type.
  • The start_vertex and end_vertex fields indicate the nodes to which the transmission edge is connected. These nodes must be defined in the nodes.json file.
  • For a comprehensive list of attributes that can be configured for the edge component, refer to the edges page of the Macro manual.