Energy pathways and resources#

The energy production system is a graph of Energy nodes (primary resources), ProducedEnergy nodes (intermediate energies), ProducedEnergyCarrier nodes (final carriers embarked in aircraft), and ProductionPathway edges. The graph is declared in initialize_base_objects (noads.application.base_objects), and the numeric coefficients are scenario inputs set in single_scenario_setup (noads.application.scenario_setup). The EnergyMix assembles the graph into models for intensive impacts (primary-to-final), extensive production and consumption (final-to-primary), and resource constraints; see the energy-mix model of the paper for the formulation.

Adding a production pathway#

To add a pathway to an existing energy, declare it and list it among the pathways of its output energy. For instance, an additional biofuel route:

bio_new = ProductionPathway(
    "NewRoute",
    impacts=[co2],            # impacts generated directly at production
    input_streams=[biomass],  # what the process consumes
)
biofuel = ProducedEnergy("BIOFUEL", pathways=[bio_ft, bio_atj, bio_hefa, bio_new])

Then provide its coefficients in the constants dictionary of single_scenario_setup (or in interpolated_2025_2035_2050 for values that mature in time, as (2025, 2035, 2050) triplets):

constants.update({
    "NewRoute.direct.CO2_index": 40.0,   # g CO2 per MJ produced
    "NewRoute.BIOMASS.efficiency": 0.4,  # MJ produced per MJ of biomass
})

Every produced energy with more than one pathway automatically gets time-dependent pathway share controls as optimization variables (one per pathway except the last, which takes the remainder), together with the constraint that shares stay in [0, 1]. Nothing else is required: the optimizer decides how much of the new route to use, and the energy sankey diagrams include it automatically.

Adding a primary resource: geological hydrogen#

A new primary resource is an Energy node plus a pathway feeding an existing energy. Natural (geological) hydrogen, for example, would compete with electrolysis and gas reforming to supply gaseous hydrogen:

geo_h2 = Energy("GEO-H2")

geological = ProductionPathway(
    "Geological_extraction",
    impacts=[co2],
    input_streams=[geo_h2],
)
gh2 = ProducedEnergy("GAS-H2", pathways=[electrolysis, gas, geological])

with its coefficients:

constants.update({
    "GEO-H2.CO2_index": 0.0,
    "Geological_extraction.direct.CO2_index": 5.0,   # extraction and purification
    "Geological_extraction.GEO-H2.efficiency": 0.9,
})

Limiting its availability#

Biomass and electricity consumption are limited to a fair share of a global production trajectory. The same mechanism applies to any primary resource: list it in the energy-mix constructor,

energy_mix = EnergyMix(energies, inputs_to_constrain=[electricity, biomass, geo_h2])

and provide the two inputs the constraint model expects: a scalar "GEO-H2.fair_share" (in the constants dictionary) and a time series "GEO-H2.global_production" (in J/year, added to the scenario inputs). For biomass and electricity these trajectories come from the AR6 scenario database (noads.application.background_scenario_data, keys "<RESOURCE>.global_production"); for a resource absent from AR6, interpolate your own trajectory onto temporal_scenario.time_vector the same way single_scenario_setup does for the AR6 series.

Note

Estimates of extractable geological hydrogen are still highly uncertain; treating the global production trajectory as an uncertain input is a natural use case for the uncertainty quantification workflows.