diff --git a/.github/workflows/transport.yaml b/.github/workflows/transport.yaml index 5c278d7ed4..b2d4bcbbd7 100644 --- a/.github/workflows/transport.yaml +++ b/.github/workflows/transport.yaml @@ -26,20 +26,7 @@ env: # - Ensure there is NO trailing comma on the last line. labels: >- [ - "SSP1", - "SSP1 policy", - "SSP2", - "SSP2 policy", - "SSP3", - "SSP3 policy", - "SSP4", - "SSP4 policy", - "SSP5", - "SSP5 policy", - "EDITS-CA", - "EDITS-HA", - "LED-SSP1", - "LED-SSP2" + "LED-SSP2" ] # Currently disabled: @@ -49,8 +36,8 @@ env: on: # Uncomment these lines for debugging, but leave them commented on 'main' - # pull_request: - # branches: [ main ] + pull_request: + branches: [ main ] # push: # branches: [ main ] schedule: diff --git a/doc/api/tools.rst b/doc/api/tools.rst index 6afbe4c330..db22700d0d 100644 --- a/doc/api/tools.rst +++ b/doc/api/tools.rst @@ -30,70 +30,76 @@ Exogenous data (:mod:`.tools.exo_data`) :members: :exclude-members: ExoDataSource, prepare_computer + The tools in this module support use of data from arbitrary sources and formats in model-building code. + For each source/format, a subclass of :class:`.ExoDataSource` adds tasks to a :class:`genno.Computer` + that retrieve/load and transform the source data into :class:`genno.Quantity`. + + An example using one such class, :class:`message_ix_models.project.advance.data.ADVANCE`. + + .. code-block:: python + + from genno import Computer + + from message_ix_models.project.advance.data import ADVANCE + + # Keyword arguments corresponding to ADVANCE.Options + kw = dict( + measure="Transport|Service demand|Road|Passenger|LDV", + model="MESSAGE", + scenario="ADV3TRAr2_Base", + ) + + # Add tasks to retrieve and transform data + c = Computer() + keys = c.apply(ADVANCE, context=context, **kw) + + # Retrieve some of the data + q_result = c.get(keys[0]) + + # Pass the data into further calculations + c.add("derived", "mul", keys[1], k_other) + .. autosummary:: MEASURES SOURCES + BaseOptions DemoSource ExoDataSource + add_structure iamc_like_data_for_query prepare_computer register_source -.. autofunction:: prepare_computer - - The first returned key, like ``{measure}:n-y``, triggers the following computations: - - 1. Load data by invoking a :class:`ExoDataSource`. - 2. Aggregate on the |n| (node) dimension according to :attr:`.Config.regions`. - 3. Interpolate on the |y| (year) dimension according to :attr:`.Config.years`. - - Additional key(s) include: - - - ``{measure}:n-y:y0 indexed``: same as ``{measure}:n-y``, indexed to values as of |y0| (the first model year). - - See particular data source classes, like :class:`.SSPOriginal`, for particular examples of usage. - - .. todo:: Extend to also prepare to compute values indexed to a particular |n|. - .. autoclass:: ExoDataSource :members: :private-members: _where - :special-members: __init__, __call__ - -.. currentmodule:: message_ix_models.tools.advance + :special-members: __init__ -ADVANCE data (:mod:`.tools.advance`) -==================================== - -.. deprecated:: 2023.11 - Use :mod:`.project.advance` instead. - -.. autosummary:: - get_advance_data - advance_data + As an abstract class ExoDataSource **must** be subclassed to be used. + Concrete subclasses **must** implement at least the :meth:`~ExoDataSource.get` method + that performs the loading of the raw data when executed, + and **may** override others, as described below. -.. autodata:: LOCATION + The class method :meth:`.ExoDataSource.add_tasks` adds tasks to a :class:`genno.Computer`. + It returns a :class:`genno.Key` that refers to the loaded and transformed data. + This method usually **should not** be modified for subclasses. -This is a location relative to a parent directory. -The specific parent directory depends on whether :mod:`message_data` is available: + The behaviour of a subclass can be customized in these ways: -Without :mod:`message_data`: - The code finds the data within :ref:`local-data` (see discussion there for how to configure this location). - Users should: + 1. Create a subclass of :class:`.BaseOptions` + and set it as the :attr:`~.ExoDataSource.Options` class attribute. + 2. Override :meth:`~.ExoDataSource.__init__`, + which receives keyword arguments via :meth:`.add_tasks`. + 3. Override :meth:`~.ExoDataSource.transform`, + which is called to add further tasks which will transform the data. - 1. Visit https://tntcat.iiasa.ac.at/ADVANCEWP2DB/dsd?Action=htmlpage&page=about and register for access to the data. - 2. Log in. - 3. Download the snapshot with the file name given in :data:`LOCATION` to a subdirectory :file:`advance/` within their local data directory. + See the documentation for these methods and attributes for further details. -With :mod:`message_data`: - The code finds the data within :ref:`private-data`. - The snapshot is stored directly in the repository using Git LFS. +.. autofunction:: prepare_computer -.. automodule:: message_ix_models.tools.advance - :members: - :exclude-members: LOCATION - :private-members: + .. deprecated:: 2025-06-06 + Use :py:`c.apply(SOURCE.add_tasks, …)` as shown above. .. currentmodule:: message_ix_models.tools.iamc @@ -103,6 +109,14 @@ IAMC data structures (:mod:`.tools.iamc`) .. automodule:: message_ix_models.tools.iamc :members: +.. currentmodule:: message_ix_models.tools.policy + +Policies (:mod:`.tools.policy`) +=============================== + +.. automodule:: message_ix_models.tools.policy + :members: + .. _tools-wb: World Bank structures (:mod:`.tools.wb`) diff --git a/message_ix_models/data/emission.yaml b/message_ix_models/data/emission.yaml index 13f5c760cf..66f3f73226 100644 --- a/message_ix_models/data/emission.yaml +++ b/message_ix_models/data/emission.yaml @@ -39,6 +39,10 @@ SO2: name: Sulfur dioxide report: Sulfur +TCE: + name: (missing) + type: TCE + VOC: name: Volatile organic compounds @@ -79,7 +83,6 @@ VOC: # SF6 # SO2_LandUseChangeEM # SO2_SavanBurnEM -# TCE # TCE_CO2 # TCE_non-CO2 # VOC_LandUseChangeEM diff --git a/message_ix_models/data/sdmx/IIASA_ECE_AGENCIES(0.1).xml b/message_ix_models/data/sdmx/IIASA_ECE_AGENCIES(0.1).xml index 64b57345b9..0ac08c7bc9 100644 --- a/message_ix_models/data/sdmx/IIASA_ECE_AGENCIES(0.1).xml +++ b/message_ix_models/data/sdmx/IIASA_ECE_AGENCIES(0.1).xml @@ -1,14 +1,17 @@ - + + + none false - 2023-09-04T16:31:44.700655 - Generated by message_ix_models 2023.5.32.dev20+g8d51636 + 2025-05-19T22:09:29.424849 + + Generated by message_ix_models 2025.1.11.dev398+gdaf97af4a.d20250504 - + Agencies referenced by data structures in message_ix_models - + IIASA Energy, Climate, and Environment Program @@ -17,7 +20,7 @@ https://depts.washington.edu/iconics/ - + International Energy Agency https://iea.org diff --git a/message_ix_models/data/sdmx/IIASA_ECE_CL_TRANSPORT_SCENARIO(1.1.0).xml b/message_ix_models/data/sdmx/IIASA_ECE_CL_TRANSPORT_SCENARIO(1.1.0).xml new file mode 100644 index 0000000000..f213439c46 --- /dev/null +++ b/message_ix_models/data/sdmx/IIASA_ECE_CL_TRANSPORT_SCENARIO(1.1.0).xml @@ -0,0 +1,396 @@ + + + + none + false + 2025-06-24T17:29:50.667278 + + Generated by message_ix_models 2025.1.11.dev944+gb683a646d.d20250606 + + + + + + + + 'urn:sdmx:org.sdmx.infomodel.codelist.Code=ICONICS:SSP(2024).1' + + + False + + + None + + + 'ixmp://ixmp-dev/SSP_SSP1_v6.1/baseline_DEFAULT_step_13' + + + None + + + + + + + + 'urn:sdmx:org.sdmx.infomodel.codelist.Code=ICONICS:SSP(2024).1' + + + False + + + None + + + 'ixmp://ixmp-dev/SSP_SSP1_v6.1/baseline_DEFAULT_step_13' + + + TaxEmission(value=1000.0) + + + + + + + + 'urn:sdmx:org.sdmx.infomodel.codelist.Code=ICONICS:SSP(2024).1' + + + False + + + None + + + 'ixmp://ixmp-dev/SSP_SSP1_v6.1/baseline_DEFAULT_step_13' + + + ExogenousEmissionPrice(source_url='ixmp://ixmp-dev/SSP_SSP1_v5.3.1/SSP1 - Low Emissions_v2') + + + + + + + + 'urn:sdmx:org.sdmx.infomodel.codelist.Code=ICONICS:SSP(2024).2' + + + False + + + None + + + 'ixmp://ixmp-dev/SSP_SSP2_v6.1/baseline_DEFAULT_step_13' + + + None + + + + + + + + 'urn:sdmx:org.sdmx.infomodel.codelist.Code=ICONICS:SSP(2024).2' + + + False + + + None + + + 'ixmp://ixmp-dev/SSP_SSP2_v6.1/baseline_DEFAULT_step_13' + + + TaxEmission(value=1000.0) + + + + + + + + 'urn:sdmx:org.sdmx.infomodel.codelist.Code=ICONICS:SSP(2024).2' + + + False + + + None + + + 'ixmp://ixmp-dev/SSP_SSP2_v6.1/baseline_DEFAULT_step_13' + + + ExogenousEmissionPrice(source_url='ixmp://ixmp-dev/SSP_SSP2_v5.3.1/SSP2 - Low Emissions_v2') + + + + + + + + 'urn:sdmx:org.sdmx.infomodel.codelist.Code=ICONICS:SSP(2024).3' + + + False + + + None + + + 'ixmp://ixmp-dev/SSP_SSP3_v6.1/baseline_DEFAULT_step_13' + + + None + + + + + + + + 'urn:sdmx:org.sdmx.infomodel.codelist.Code=ICONICS:SSP(2024).3' + + + False + + + None + + + 'ixmp://ixmp-dev/SSP_SSP3_v6.1/baseline_DEFAULT_step_13' + + + TaxEmission(value=1000.0) + + + + + + + + 'urn:sdmx:org.sdmx.infomodel.codelist.Code=ICONICS:SSP(2024).3' + + + False + + + None + + + 'ixmp://ixmp-dev/SSP_SSP3_v6.1/baseline_DEFAULT_step_13' + + + ExogenousEmissionPrice(source_url='ixmp://ixmp-dev/SSP_SSP3_v5.3.1/baseline_1000f_v1') + + + + + + + + 'urn:sdmx:org.sdmx.infomodel.codelist.Code=ICONICS:SSP(2024).4' + + + False + + + None + + + 'ixmp://ixmp-dev/SSP_SSP4_v6.1/baseline_DEFAULT_step_13' + + + None + + + + + + + + 'urn:sdmx:org.sdmx.infomodel.codelist.Code=ICONICS:SSP(2024).4' + + + False + + + None + + + 'ixmp://ixmp-dev/SSP_SSP4_v6.1/baseline_DEFAULT_step_13' + + + TaxEmission(value=1000.0) + + + + + + + + 'urn:sdmx:org.sdmx.infomodel.codelist.Code=ICONICS:SSP(2024).4' + + + False + + + None + + + 'ixmp://ixmp-dev/SSP_SSP4_v6.1/baseline_DEFAULT_step_13' + + + ExogenousEmissionPrice(source_url='ixmp://ixmp-dev/SSP_SSP4_v5.3.1/SSP4 - Low Overshoot_v2') + + + + + + + + 'urn:sdmx:org.sdmx.infomodel.codelist.Code=ICONICS:SSP(2024).5' + + + False + + + None + + + 'ixmp://ixmp-dev/SSP_SSP5_v6.1/baseline_DEFAULT_step_13' + + + None + + + + + + + + 'urn:sdmx:org.sdmx.infomodel.codelist.Code=ICONICS:SSP(2024).5' + + + False + + + None + + + 'ixmp://ixmp-dev/SSP_SSP5_v6.1/baseline_DEFAULT_step_13' + + + TaxEmission(value=1000.0) + + + + + + + + 'urn:sdmx:org.sdmx.infomodel.codelist.Code=ICONICS:SSP(2024).5' + + + False + + + None + + + 'ixmp://ixmp-dev/SSP_SSP5_v6.1/baseline_DEFAULT_step_13' + + + ExogenousEmissionPrice(source_url='ixmp://ixmp-dev/SSP_SSP5_v5.3.1/SSP5 - Low Overshoot_v2') + + + + + + + + 'urn:sdmx:org.sdmx.infomodel.codelist.Code=ICONICS:SSP(2024).1' + + + True + + + None + + + 'ixmp://ixmp-dev/SSP_SSP1_v6.1/baseline_DEFAULT_step_13' + + + None + + + Low Energy Demand/High-with-Low scenario with SSP{} demographics + + + + + 'urn:sdmx:org.sdmx.infomodel.codelist.Code=ICONICS:SSP(2024).2' + + + True + + + None + + + 'ixmp://ixmp-dev/SSP_SSP2_v6.1/baseline_DEFAULT_step_13' + + + None + + + Low Energy Demand/High-with-Low scenario with SSP{} demographics + + + + + 'urn:sdmx:org.sdmx.infomodel.codelist.Code=ICONICS:SSP(2024).2' + + + False + + + 'CA' + + + 'ixmp://ixmp-dev/SSP_SSP2_v6.1/baseline_DEFAULT_step_13' + + + None + + + EDITS scenario with ITF PASTA 'CA' activity + + + + + 'urn:sdmx:org.sdmx.infomodel.codelist.Code=ICONICS:SSP(2024).2' + + + False + + + 'HA' + + + 'ixmp://ixmp-dev/SSP_SSP2_v6.1/baseline_DEFAULT_step_13' + + + None + + + EDITS scenario with ITF PASTA 'HA' activity + + + + + diff --git a/message_ix_models/data/technology.yaml b/message_ix_models/data/technology.yaml index 5861b32820..09a422c133 100644 --- a/message_ix_models/data/technology.yaml +++ b/message_ix_models/data/technology.yaml @@ -3109,3 +3109,39 @@ LH2_bunker: sector: shipping input: [lh2, final] output: [shipping, useful] + +LH2_tobunker: + description: Added in the ScenarioMIP7/SSP2024 project. + type: bunkers + +LNG_occ_bunker: + description: Added in the ScenarioMIP7/SSP2024 project. + type: bunkers + +LNG_tobunker: + description: Added in the ScenarioMIP7/SSP2024 project. + type: bunkers + +NH3_tobunker: + description: Added in the ScenarioMIP7/SSP2024 project. + type: bunkers + +eth_tobunker: + description: Added in the ScenarioMIP7/SSP2024 project. + type: bunkers + +foil_occ_bunker: + description: Added in the ScenarioMIP7/SSP2024 project. + type: bunkers + +loil_occ_bunker: + description: Added in the ScenarioMIP7/SSP2024 project. + type: bunkers + +loil_tobunker: + description: Added in the ScenarioMIP7/SSP2024 project. + type: bunkers + +meth_tobunker: + description: Added in the ScenarioMIP7/SSP2024 project. + type: bunkers diff --git a/message_ix_models/data/test/advance/advance_compare_20171018-134445.csv.xz b/message_ix_models/data/test/advance/advance_compare_20171018-134445.csv.xz new file mode 100644 index 0000000000..47797e59c8 --- /dev/null +++ b/message_ix_models/data/test/advance/advance_compare_20171018-134445.csv.xz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:997f0588b6dd152a651a34fd28f4c59e87d6e07651ace869357f0b5773b66f29 +size 23483360 diff --git a/message_ix_models/data/test/advance/advance_compare_20171018-134445.csv.zip b/message_ix_models/data/test/advance/advance_compare_20171018-134445.csv.zip deleted file mode 100644 index c27069b01f..0000000000 --- a/message_ix_models/data/test/advance/advance_compare_20171018-134445.csv.zip +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:8b6e855a0ddfc9c7795e390c39118b0656d2642576599cb4ea7a01256f23b2a6 -size 18958621 diff --git a/message_ix_models/data/transport/R12/act-non_ldv.csv b/message_ix_models/data/transport/R12/act-non_ldv.csv index 3d01b12a23..73e0758eb7 100644 --- a/message_ix_models/data/transport/R12/act-non_ldv.csv +++ b/message_ix_models/data/transport/R12/act-non_ldv.csv @@ -3,12 +3,12 @@ # Units: dimensionless # node, technology, year, value -R12_AFR, f road electr, 2020, 0.01 +R12_AFR, f road electr, 2020, 0.001 R12_AFR, FCg_bus, 2020, 0.036 R12_AFR, f road gas fc, 2020, 0.000036 R12_AFR, f road gas ic, 2020, 0.00036 R12_AFR, ICG_bus, 2020, 0.0036 -R12_CHN, f road electr, 2020, 0.036 +R12_CHN, f road electr, 2020, 0.05 R12_CHN, FCg_bus, 2020, 4.56 R12_CHN, f road gas fc, 2020, 4.56 R12_CHN, f road gas ic, 2020, 4.56 @@ -18,12 +18,12 @@ R12_EEU, FCg_bus, 2020, 0.470 R12_EEU, f road gas fc, 2020, 0.470 R12_EEU, f road gas ic, 2020, 0.470 R12_EEU, ICG_bus, 2020, 0.470 -R12_FSU, f road electr, 2020, 0.01 +R12_FSU, f road electr, 2020, 0.007 R12_FSU, FCg_bus, 2020, 3.93 R12_FSU, f road gas fc, 2020, 3.93 R12_FSU, f road gas ic, 2020, 3.93 R12_FSU, ICG_bus, 2020, 3.93 -R12_LAM, f road electr, 2020, 0.01 +R12_LAM, f road electr, 2020, 0.035 R12_LAM, FCg_bus, 2020, 5.28 R12_LAM, f road gas fc, 2020, 5.28 R12_LAM, f road gas ic, 2020, 5.28 @@ -38,12 +38,12 @@ R12_NAM, FCg_bus, 2020, 0.012 R12_NAM, f road gas fc, 2020, 0.001 R12_NAM, f road gas ic, 2020, 0.012 R12_NAM, ICG_bus, 2020, 0.012 -R12_PAO, f road electr, 2020, 0.01 +R12_PAO, f road electr, 2020, 0.001 R12_PAO, FCg_bus, 2020, 0.0019 R12_PAO, f road gas fc, 2020, 0.0019 R12_PAO, f road gas ic, 2020, 0.0019 R12_PAO, ICG_bus, 2020, 0.0019 -R12_PAS, f road electr, 2020, 0.01 +R12_PAS, f road electr, 2020, 0.004 R12_PAS, FCg_bus, 2020, 0.178 R12_PAS, f road gas fc, 2020, 0.178 R12_PAS, f road gas ic, 2020, 0.178 @@ -53,7 +53,7 @@ R12_RCPA, FCg_bus, 2020, 0.0088 R12_RCPA, f road gas fc, 2020, 0.0088 R12_RCPA, f road gas ic, 2020, 0.0088 R12_RCPA, ICG_bus, 2020, 0.0088 -R12_SAS, f road electr, 2020, 0.01 +R12_SAS, f road electr, 2020, 0.00001 R12_SAS, FCg_bus, 2020, 4.41 R12_SAS, f road gas fc, 2020, 4.41 R12_SAS, f road gas ic, 2020, 4.41 diff --git a/message_ix_models/data/transport/R12/elasticity-f.csv b/message_ix_models/data/transport/R12/elasticity-f.csv index 431a82ec73..b6889d7462 100644 --- a/message_ix_models/data/transport/R12/elasticity-f.csv +++ b/message_ix_models/data/transport/R12/elasticity-f.csv @@ -1,226 +1,227 @@ -# ‘Elasticity’ of freight activity with respect to GDP(PPP) -# -# Units: dimensionless -# -scenario, node, year, value -LED, R12_AFR, 2020, 1.0 -LED, R12_AFR, 2030, 1.0 -LED, R12_AFR, 2110, 0.50 -LED, R12_CHN, 2020, 1.0 -LED, R12_CHN, 2030, 0.8 -LED, R12_CHN, 2110, -.39 -LED, R12_EEU, 2020, 1.0 -LED, R12_EEU, 2030, 0.8 -LED, R12_EEU, 2110, -1.07 -LED, R12_FSU, 2020, 1.0 -LED, R12_FSU, 2030, 0.8 -LED, R12_FSU, 2110, -0.72 -LED, R12_LAM, 2020, 1.0 -LED, R12_LAM, 2030, 0.8 -LED, R12_LAM, 2110, -.17 -LED, R12_MEA, 2020, 1.0 -LED, R12_MEA, 2030, 1.0 -LED, R12_MEA, 2110, 0.37 -LED, R12_NAM, 2020, 1.0 -LED, R12_NAM, 2030, 0.8 -LED, R12_NAM, 2110, -1.86 -LED, R12_PAO, 2020, 1.0 -LED, R12_PAO, 2030, 0.8 -LED, R12_PAO, 2110, -0.51 -LED, R12_PAS, 2020, 1.0 -LED, R12_PAS, 2030, 1.0 -LED, R12_PAS, 2110, 0.52 -LED, R12_RCPA, 2020, 1.0 -LED, R12_RCPA, 2030, 1.0 -LED, R12_RCPA, 2110, 0.39 -LED, R12_SAS, 2020, 1.0 -LED, R12_SAS, 2030, 1.0 -LED, R12_SAS, 2110, 0.49 -LED, R12_WEU, 2020, 1.0 -LED, R12_WEU, 2030, 0.8 -LED, R12_WEU, 2110, -0.22 - -SSP(2024).1, R12_AFR, 2020, 1.0 -SSP(2024).1, R12_AFR, 2030, 1.0 -SSP(2024).1, R12_AFR, 2110, 0.6 -SSP(2024).1, R12_CHN, 2020, 1.0 -SSP(2024).1, R12_CHN, 2030, 0.8 -SSP(2024).1, R12_CHN, 2110, 0.5 -SSP(2024).1, R12_EEU, 2020, 1.0 -SSP(2024).1, R12_EEU, 2030, 0.8 -SSP(2024).1, R12_EEU, 2110, 0.48 -SSP(2024).1, R12_FSU, 2020, 1.0 -SSP(2024).1, R12_FSU, 2030, 0.48 -SSP(2024).1, R12_FSU, 2110, 0.48 -SSP(2024).1, R12_LAM, 2020, 1.0 -SSP(2024).1, R12_LAM, 2030, 0.8 -SSP(2024).1, R12_LAM, 2110, 0.6 -SSP(2024).1, R12_MEA, 2020, 1.0 -SSP(2024).1, R12_MEA, 2030, 0.8 -SSP(2024).1, R12_MEA, 2110, 0.6 -SSP(2024).1, R12_NAM, 2020, 1.0 -SSP(2024).1, R12_NAM, 2030, 0.43 -SSP(2024).1, R12_NAM, 2110, 0.30 -SSP(2024).1, R12_PAO, 2020, 1.0 -SSP(2024).1, R12_PAO, 2030, 0.8 -SSP(2024).1, R12_PAO, 2110, 0.48 -SSP(2024).1, R12_PAS, 2020, 1.0 -SSP(2024).1, R12_PAS, 2030, 0.8 -SSP(2024).1, R12_PAS, 2110, 0.6 -SSP(2024).1, R12_RCPA, 2020, 1.0 -SSP(2024).1, R12_RCPA, 2030, 0.8 -SSP(2024).1, R12_RCPA, 2110, 0.6 -SSP(2024).1, R12_SAS, 2020, 1.0 -SSP(2024).1, R12_SAS, 2030, 0.8 -SSP(2024).1, R12_SAS, 2110, 0.6 -SSP(2024).1, R12_WEU, 2020, 1.0 -SSP(2024).1, R12_WEU, 2030, 0.8 -SSP(2024).1, R12_WEU, 2110, 0.48 - -SSP(2024).2, R12_AFR, 2020, 1.0 -SSP(2024).2, R12_AFR, 2030, 1.0 -SSP(2024).2, R12_AFR, 2110, 1.0 -SSP(2024).2, R12_CHN, 2020, 1.0 -SSP(2024).2, R12_CHN, 2030, 0.8 -SSP(2024).2, R12_CHN, 2110, 0.5 -SSP(2024).2, R12_EEU, 2020, 1.0 -SSP(2024).2, R12_EEU, 2030, 0.8 -SSP(2024).2, R12_EEU, 2110, 0.8 -SSP(2024).2, R12_FSU, 2020, 1.0 -SSP(2024).2, R12_FSU, 2030, 0.48 -SSP(2024).2, R12_FSU, 2110, 0.48 -SSP(2024).2, R12_LAM, 2020, 1.0 -SSP(2024).2, R12_LAM, 2030, 1 -SSP(2024).2, R12_LAM, 2110, 1 -SSP(2024).2, R12_MEA, 2020, 1.0 -SSP(2024).2, R12_MEA, 2030, 1 -SSP(2024).2, R12_MEA, 2110, 1 -SSP(2024).2, R12_NAM, 2020, 1.0 -SSP(2024).2, R12_NAM, 2030, 0.43 -SSP(2024).2, R12_NAM, 2110, 0.43 -SSP(2024).2, R12_PAO, 2020, 1.0 -SSP(2024).2, R12_PAO, 2030, 0.8 -SSP(2024).2, R12_PAO, 2110, 0.8 -SSP(2024).2, R12_PAS, 2020, 1.0 -SSP(2024).2, R12_PAS, 2030, 1 -SSP(2024).2, R12_PAS, 2110, 0.6 -SSP(2024).2, R12_RCPA, 2020, 1.0 -SSP(2024).2, R12_RCPA, 2030, 1 -SSP(2024).2, R12_RCPA, 2110, 1 -SSP(2024).2, R12_SAS, 2020, 1.0 -SSP(2024).2, R12_SAS, 2030, 1 -SSP(2024).2, R12_SAS, 2110, 1 -SSP(2024).2, R12_WEU, 2020, 1.0 -SSP(2024).2, R12_WEU, 2030, 0.8 -SSP(2024).2, R12_WEU, 2110, 0.8 - -SSP(2024).3, R12_AFR, 2020, 1.0 -SSP(2024).3, R12_AFR, 2030, 1.0 -SSP(2024).3, R12_AFR, 2110, 1.38 -SSP(2024).3, R12_CHN, 2020, 1.0 -SSP(2024).3, R12_CHN, 2030, 0.8 -SSP(2024).3, R12_CHN, 2110, 0.76 -SSP(2024).3, R12_EEU, 2020, 1.0 -SSP(2024).3, R12_EEU, 2030, 1.0 -SSP(2024).3, R12_EEU, 2110, 1.05 -SSP(2024).3, R12_FSU, 2020, 1.0 -SSP(2024).3, R12_FSU, 2030, 0.48 -SSP(2024).3, R12_FSU, 2110, 0.58 -SSP(2024).3, R12_LAM, 2020, 1.0 -SSP(2024).3, R12_LAM, 2030, 1 -SSP(2024).3, R12_LAM, 2110, 1.38 -SSP(2024).3, R12_MEA, 2020, 1.0 -SSP(2024).3, R12_MEA, 2030, 1 -SSP(2024).3, R12_MEA, 2110, 1.38 -SSP(2024).3, R12_NAM, 2020, 1.0 -SSP(2024).3, R12_NAM, 2030, 0.43 -SSP(2024).3, R12_NAM, 2110, 0.60 -SSP(2024).3, R12_PAO, 2020, 1.0 -SSP(2024).3, R12_PAO, 2030, 1.0 -SSP(2024).3, R12_PAO, 2110, 1.05 -SSP(2024).3, R12_PAS, 2020, 1.0 -SSP(2024).3, R12_PAS, 2030, 1 -SSP(2024).3, R12_PAS, 2110, 1.38 -SSP(2024).3, R12_RCPA, 2020, 1.0 -SSP(2024).3, R12_RCPA, 2030, 1 -SSP(2024).3, R12_RCPA, 2110, 1.38 -SSP(2024).3, R12_SAS, 2020, 1.0 -SSP(2024).3, R12_SAS, 2030, 1 -SSP(2024).3, R12_SAS, 2110, 1.38 -SSP(2024).3, R12_WEU, 2020, 1.0 -SSP(2024).3, R12_WEU, 2030, 1.0 -SSP(2024).3, R12_WEU, 2110, 1.05 - -SSP(2024).4, R12_AFR, 2020, 1.0 -SSP(2024).4, R12_AFR, 2030, 1.0 -SSP(2024).4, R12_AFR, 2110, 0.8 -SSP(2024).4, R12_CHN, 2020, 1.0 -SSP(2024).4, R12_CHN, 2030, 0.8 -SSP(2024).4, R12_CHN, 2110, 0.5 -SSP(2024).4, R12_EEU, 2020, 1.0 -SSP(2024).4, R12_EEU, 2030, 0.8 -SSP(2024).4, R12_EEU, 2110, 0.8 -SSP(2024).4, R12_FSU, 2020, 1.0 -SSP(2024).4, R12_FSU, 2030, 0.48 -SSP(2024).4, R12_FSU, 2110, 0.48 -SSP(2024).4, R12_LAM, 2020, 1.0 -SSP(2024).4, R12_LAM, 2030, 1 -SSP(2024).4, R12_LAM, 2110, 0.8 -SSP(2024).4, R12_MEA, 2020, 1.0 -SSP(2024).4, R12_MEA, 2030, 1 -SSP(2024).4, R12_MEA, 2110, 1 -SSP(2024).4, R12_NAM, 2020, 1.0 -SSP(2024).4, R12_NAM, 2030, 0.43 -SSP(2024).4, R12_NAM, 2110, 0.43 -SSP(2024).4, R12_PAO, 2020, 1.0 -SSP(2024).4, R12_PAO, 2030, 0.8 -SSP(2024).4, R12_PAO, 2110, 0.8 -SSP(2024).4, R12_PAS, 2020, 1.0 -SSP(2024).4, R12_PAS, 2030, 1 -SSP(2024).4, R12_PAS, 2110, 0.6 -SSP(2024).4, R12_RCPA, 2020, 1.0 -SSP(2024).4, R12_RCPA, 2030, 1 -SSP(2024).4, R12_RCPA, 2110, 1 -SSP(2024).4, R12_SAS, 2020, 1.0 -SSP(2024).4, R12_SAS, 2030, 1 -SSP(2024).4, R12_SAS, 2110, 0.8 -SSP(2024).4, R12_WEU, 2020, 1.0 -SSP(2024).4, R12_WEU, 2030, 0.8 -SSP(2024).4, R12_WEU, 2110, 0.8 - -SSP(2024).5, R12_AFR, 2020, 1.0 -SSP(2024).5, R12_AFR, 2030, 1.0 -SSP(2024).5, R12_AFR, 2110, 1.0 -SSP(2024).5, R12_CHN, 2020, 1.0 -SSP(2024).5, R12_CHN, 2030, 0.8 -SSP(2024).5, R12_CHN, 2110, 0.5 -SSP(2024).5, R12_EEU, 2020, 1.0 -SSP(2024).5, R12_EEU, 2030, 0.8 -SSP(2024).5, R12_EEU, 2110, 0.8 -SSP(2024).5, R12_FSU, 2020, 1.0 -SSP(2024).5, R12_FSU, 2030, 0.48 -SSP(2024).5, R12_FSU, 2110, 0.48 -SSP(2024).5, R12_LAM, 2020, 1.0 -SSP(2024).5, R12_LAM, 2030, 1 -SSP(2024).5, R12_LAM, 2110, 1 -SSP(2024).5, R12_MEA, 2020, 1.0 -SSP(2024).5, R12_MEA, 2030, 1 -SSP(2024).5, R12_MEA, 2110, 1 -SSP(2024).5, R12_NAM, 2020, 1.0 -SSP(2024).5, R12_NAM, 2030, 0.43 -SSP(2024).5, R12_NAM, 2110, 0.43 -SSP(2024).5, R12_PAO, 2020, 1.0 -SSP(2024).5, R12_PAO, 2030, 0.8 -SSP(2024).5, R12_PAO, 2110, 0.8 -SSP(2024).5, R12_PAS, 2020, 1.0 -SSP(2024).5, R12_PAS, 2030, 1 -SSP(2024).5, R12_PAS, 2110, 0.6 -SSP(2024).5, R12_RCPA, 2020, 1.0 -SSP(2024).5, R12_RCPA, 2030, 1 -SSP(2024).5, R12_RCPA, 2110, 1 -SSP(2024).5, R12_SAS, 2020, 1.0 -SSP(2024).5, R12_SAS, 2030, 1 -SSP(2024).5, R12_SAS, 2110, 1 -SSP(2024).5, R12_WEU, 2020, 1.0 -SSP(2024).5, R12_WEU, 2030, 0.8 -SSP(2024).5, R12_WEU, 2110, 0.8 +# Elasticity of freight activity with respect to GDP(PPP) +# +# Units: dimensionless +# +scenario, node, year, value +LED, R12_AFR,2020,1 +LED, R12_AFR,2030,1 +LED, R12_AFR,2110,1 +LED, R12_CHN,2020,1 +LED, R12_CHN,2030,0.8 +LED, R12_CHN,2110,0.5 +LED, R12_EEU,2020,1 +LED, R12_EEU,2030,0.8 +LED, R12_EEU,2110,0.8 +LED, R12_FSU,2020,1 +LED, R12_FSU,2030,0.48 +LED, R12_FSU,2110,0.48 +LED, R12_LAM,2020,1 +LED, R12_LAM,2030,1 +LED, R12_LAM,2110,1 +LED, R12_MEA,2020,1 +LED, R12_MEA,2030,1 +LED, R12_MEA,2110,1 +LED, R12_NAM,2020,1 +LED, R12_NAM,2030,0.43 +LED, R12_NAM,2110,0.43 +LED, R12_PAO,2020,1 +LED, R12_PAO,2030,0.8 +LED, R12_PAO,2110,0.8 +LED, R12_PAS,2020,1 +LED, R12_PAS,2030,1 +LED, R12_PAS,2110,0.6 +LED, R12_RCPA,2020,1 +LED, R12_RCPA,2030,1 +LED, R12_RCPA,2110,1 +LED, R12_SAS,2020,1 +LED, R12_SAS,2030,1 +LED, R12_SAS,2110,1 +LED, R12_WEU,2020,1 +LED, R12_WEU,2030,0.8 +LED, R12_WEU,2110,0.8 + +SSP(2024).1, R12_AFR,2020,1 +SSP(2024).1, R12_AFR,2030,1 +SSP(2024).1, R12_AFR,2110,0.6 +SSP(2024).1, R12_CHN,2020,1 +SSP(2024).1, R12_CHN,2030,0.8 +SSP(2024).1, R12_CHN,2110,0.5 +SSP(2024).1, R12_EEU,2020,1 +SSP(2024).1, R12_EEU,2030,0.8 +SSP(2024).1, R12_EEU,2110,0.48 +SSP(2024).1, R12_FSU,2020,1 +SSP(2024).1, R12_FSU,2030,0.48 +SSP(2024).1, R12_FSU,2110,0.48 +SSP(2024).1, R12_LAM,2020,1 +SSP(2024).1, R12_LAM,2030,0.8 +SSP(2024).1, R12_LAM,2110,0.6 +SSP(2024).1, R12_MEA,2020,1 +SSP(2024).1, R12_MEA,2030,0.8 +SSP(2024).1, R12_MEA,2110,0.6 +SSP(2024).1, R12_NAM,2020,1 +SSP(2024).1, R12_NAM,2030,0.43 +SSP(2024).1, R12_NAM,2110,0.3 +SSP(2024).1, R12_PAO,2020,1 +SSP(2024).1, R12_PAO,2030,0.8 +SSP(2024).1, R12_PAO,2110,0.48 +SSP(2024).1, R12_PAS,2020,1 +SSP(2024).1, R12_PAS,2030,0.8 +SSP(2024).1, R12_PAS,2110,0.6 +SSP(2024).1, R12_RCPA,2020,1 +SSP(2024).1, R12_RCPA,2030,0.8 +SSP(2024).1, R12_RCPA,2110,0.6 +SSP(2024).1, R12_SAS,2020,1 +SSP(2024).1, R12_SAS,2030,0.8 +SSP(2024).1, R12_SAS,2110,0.6 +SSP(2024).1, R12_WEU,2020,1 +SSP(2024).1, R12_WEU,2030,0.8 +SSP(2024).1, R12_WEU,2110,0.48 + +SSP(2024).2, R12_AFR,2020,1 +SSP(2024).2, R12_AFR,2030,1 +SSP(2024).2, R12_AFR,2110,1 +SSP(2024).2, R12_CHN,2020,1 +SSP(2024).2, R12_CHN,2030,0.8 +SSP(2024).2, R12_CHN,2110,0.5 +SSP(2024).2, R12_EEU,2020,1 +SSP(2024).2, R12_EEU,2030,0.8 +SSP(2024).2, R12_EEU,2110,0.8 +SSP(2024).2, R12_FSU,2020,1 +SSP(2024).2, R12_FSU,2030,0.48 +SSP(2024).2, R12_FSU,2110,0.48 +SSP(2024).2, R12_LAM,2020,1 +SSP(2024).2, R12_LAM,2030,1 +SSP(2024).2, R12_LAM,2110,1 +SSP(2024).2, R12_MEA,2020,1 +SSP(2024).2, R12_MEA,2030,1 +SSP(2024).2, R12_MEA,2110,1 +SSP(2024).2, R12_NAM,2020,1 +SSP(2024).2, R12_NAM,2030,0.43 +SSP(2024).2, R12_NAM,2110,0.43 +SSP(2024).2, R12_PAO,2020,1 +SSP(2024).2, R12_PAO,2030,0.8 +SSP(2024).2, R12_PAO,2110,0.8 +SSP(2024).2, R12_PAS,2020,1 +SSP(2024).2, R12_PAS,2030,1 +SSP(2024).2, R12_PAS,2110,0.6 +SSP(2024).2, R12_RCPA,2020,1 +SSP(2024).2, R12_RCPA,2030,1 +SSP(2024).2, R12_RCPA,2110,1 +SSP(2024).2, R12_SAS,2020,1 +SSP(2024).2, R12_SAS,2030,1 +SSP(2024).2, R12_SAS,2110,1 +SSP(2024).2, R12_WEU,2020,1 +SSP(2024).2, R12_WEU,2030,0.8 +SSP(2024).2, R12_WEU,2110,0.8 + +SSP(2024).3, R12_AFR,2020,1 +SSP(2024).3, R12_AFR,2030,1 +SSP(2024).3, R12_AFR,2110,1.38 +SSP(2024).3, R12_CHN,2020,1 +SSP(2024).3, R12_CHN,2030,0.8 +SSP(2024).3, R12_CHN,2110,0.76 +SSP(2024).3, R12_EEU,2020,1 +SSP(2024).3, R12_EEU,2030,1 +SSP(2024).3, R12_EEU,2110,1.05 +SSP(2024).3, R12_FSU,2020,1 +SSP(2024).3, R12_FSU,2030,0.48 +SSP(2024).3, R12_FSU,2110,0.58 +SSP(2024).3, R12_LAM,2020,1 +SSP(2024).3, R12_LAM,2030,1 +SSP(2024).3, R12_LAM,2110,1.38 +SSP(2024).3, R12_MEA,2020,1 +SSP(2024).3, R12_MEA,2030,1 +SSP(2024).3, R12_MEA,2110,1.38 +SSP(2024).3, R12_NAM,2020,1 +SSP(2024).3, R12_NAM,2030,0.43 +SSP(2024).3, R12_NAM,2110,0.6 +SSP(2024).3, R12_PAO,2020,1 +SSP(2024).3, R12_PAO,2030,1 +SSP(2024).3, R12_PAO,2110,1.05 +SSP(2024).3, R12_PAS,2020,1 +SSP(2024).3, R12_PAS,2030,1 +SSP(2024).3, R12_PAS,2110,1.38 +SSP(2024).3, R12_RCPA,2020,1 +SSP(2024).3, R12_RCPA,2030,1 +SSP(2024).3, R12_RCPA,2110,1.38 +SSP(2024).3, R12_SAS,2020,1 +SSP(2024).3, R12_SAS,2030,1 +SSP(2024).3, R12_SAS,2110,1.38 +SSP(2024).3, R12_WEU,2020,1 +SSP(2024).3, R12_WEU,2030,1 +SSP(2024).3, R12_WEU,2110,1.05 + +SSP(2024).4, R12_AFR,2020,1 +SSP(2024).4, R12_AFR,2030,1 +SSP(2024).4, R12_AFR,2110,0.8 +SSP(2024).4, R12_CHN,2020,1 +SSP(2024).4, R12_CHN,2030,0.8 +SSP(2024).4, R12_CHN,2110,0.5 +SSP(2024).4, R12_EEU,2020,1 +SSP(2024).4, R12_EEU,2030,0.8 +SSP(2024).4, R12_EEU,2110,0.8 +SSP(2024).4, R12_FSU,2020,1 +SSP(2024).4, R12_FSU,2030,0.48 +SSP(2024).4, R12_FSU,2110,0.48 +SSP(2024).4, R12_LAM,2020,1 +SSP(2024).4, R12_LAM,2030,1 +SSP(2024).4, R12_LAM,2110,0.8 +SSP(2024).4, R12_MEA,2020,1 +SSP(2024).4, R12_MEA,2030,1 +SSP(2024).4, R12_MEA,2110,1 +SSP(2024).4, R12_NAM,2020,1 +SSP(2024).4, R12_NAM,2030,0.43 +SSP(2024).4, R12_NAM,2110,0.43 +SSP(2024).4, R12_PAO,2020,1 +SSP(2024).4, R12_PAO,2030,0.8 +SSP(2024).4, R12_PAO,2110,0.8 +SSP(2024).4, R12_PAS,2020,1 +SSP(2024).4, R12_PAS,2030,1 +SSP(2024).4, R12_PAS,2110,0.6 +SSP(2024).4, R12_RCPA,2020,1 +SSP(2024).4, R12_RCPA,2030,1 +SSP(2024).4, R12_RCPA,2110,1 +SSP(2024).4, R12_SAS,2020,1 +SSP(2024).4, R12_SAS,2030,1 +SSP(2024).4, R12_SAS,2110,0.8 +SSP(2024).4, R12_WEU,2020,1 +SSP(2024).4, R12_WEU,2030,0.8 +SSP(2024).4, R12_WEU,2110,0.8 + +SSP(2024).5, R12_AFR,2020,1 +SSP(2024).5, R12_AFR,2030,1 +SSP(2024).5, R12_AFR,2110,1 +SSP(2024).5, R12_CHN,2020,1 +SSP(2024).5, R12_CHN,2030,0.8 +SSP(2024).5, R12_CHN,2110,0.5 +SSP(2024).5, R12_EEU,2020,1 +SSP(2024).5, R12_EEU,2030,0.8 +SSP(2024).5, R12_EEU,2110,0.8 +SSP(2024).5, R12_FSU,2020,1 +SSP(2024).5, R12_FSU,2030,0.48 +SSP(2024).5, R12_FSU,2110,0.48 +SSP(2024).5, R12_LAM,2020,1 +SSP(2024).5, R12_LAM,2030,1 +SSP(2024).5, R12_LAM,2110,1 +SSP(2024).5, R12_MEA,2020,1 +SSP(2024).5, R12_MEA,2030,1 +SSP(2024).5, R12_MEA,2110,1 +SSP(2024).5, R12_NAM,2020,1 +SSP(2024).5, R12_NAM,2030,0.43 +SSP(2024).5, R12_NAM,2110,0.43 +SSP(2024).5, R12_PAO,2020,1 +SSP(2024).5, R12_PAO,2030,0.8 +SSP(2024).5, R12_PAO,2110,0.8 +SSP(2024).5, R12_PAS,2020,1 +SSP(2024).5, R12_PAS,2030,1 +SSP(2024).5, R12_PAS,2110,0.6 +SSP(2024).5, R12_RCPA,2020,1 +SSP(2024).5, R12_RCPA,2030,1 +SSP(2024).5, R12_RCPA,2110,1 +SSP(2024).5, R12_SAS,2020,1 +SSP(2024).5, R12_SAS,2030,1 +SSP(2024).5, R12_SAS,2110,1 +SSP(2024).5, R12_WEU,2020,1 +SSP(2024).5, R12_WEU,2030,0.8 +SSP(2024).5, R12_WEU,2110,0.8 + diff --git a/message_ix_models/data/transport/R12/freight-activity.csv b/message_ix_models/data/transport/R12/freight-activity.csv index b9062b3263..55603b581b 100644 --- a/message_ix_models/data/transport/R12/freight-activity.csv +++ b/message_ix_models/data/transport/R12/freight-activity.csv @@ -11,14 +11,14 @@ # node, value R12_AFR, 730 -R12_CHN, 11000 -R12_EEU, 900 -R12_FSU, 3900 -R12_LAM, 2900 -R12_MEA, 1150 +R12_CHN, 9000 +R12_EEU, 950 +R12_FSU, 4000 +R12_LAM, 3500 +R12_MEA, 1200 R12_NAM, 7700 -R12_PAO, 1000 -R12_PAS, 1300 +R12_PAO, 1200 +R12_PAS, 1600 R12_RCPA, 300 -R12_SAS, 2500 +R12_SAS, 2250 R12_WEU, 2200 diff --git a/message_ix_models/data/transport/R12/ldv-activity.csv b/message_ix_models/data/transport/R12/ldv-activity.csv index 8ff68d953d..be1e8d3d7b 100644 --- a/message_ix_models/data/transport/R12/ldv-activity.csv +++ b/message_ix_models/data/transport/R12/ldv-activity.csv @@ -81,39 +81,66 @@ scenario, node, year, value # *, R12_WEU, 2020, 12000 # TH high # *, R12_WEU, 2110, 12000 # TH high -LED, R12_AFR, 2020, 15500 -LED, R12_AFR, 2050, 15113 -LED, R12_AFR, 2110, 15113 -LED, R12_CHN, 2020, 15000 -LED, R12_CHN, 2050, 15113 -LED, R12_CHN, 2110, 15113 -LED, R12_EEU, 2020, 9000 -LED, R12_EEU, 2050, 14087 -LED, R12_EEU, 2110, 14087 -LED, R12_FSU, 2020, 13000 -LED, R12_FSU, 2050, 14087 -LED, R12_FSU, 2110, 14087 -LED, R12_LAM, 2020, 13500 -LED, R12_LAM, 2050, 15113 -LED, R12_LAM, 2110, 15113 -LED, R12_MEA, 2020, 14500 -LED, R12_MEA, 2050, 15113 -LED, R12_MEA, 2110, 15113 -LED, R12_NAM, 2020, 18400 -LED, R12_NAM, 2050, 14087 -LED, R12_NAM, 2110, 14087 -LED, R12_PAO, 2020, 9000 -LED, R12_PAO, 2050, 14087 -LED, R12_PAO, 2110, 14087 -LED, R12_PAS, 2020, 13000 -LED, R12_PAS, 2050, 15113 -LED, R12_PAS, 2110, 15113 -LED, R12_RCPA, 2020, 12000 -LED, R12_RCPA, 2050, 15113 -LED, R12_RCPA, 2110, 15113 -LED, R12_SAS, 2020, 12000 -LED, R12_SAS, 2050, 15113 -LED, R12_SAS, 2110, 15113 -LED, R12_WEU, 2020, 11700 -LED, R12_WEU, 2050, 14087 -LED, R12_WEU, 2110, 14087 +# LED, R12_AFR, 2020, 15500 +# LED, R12_AFR, 2050, 15113 +# LED, R12_AFR, 2110, 15113 +# LED, R12_CHN, 2020, 15000 +# LED, R12_CHN, 2050, 15113 +# LED, R12_CHN, 2110, 15113 +# LED, R12_EEU, 2020, 9000 +# LED, R12_EEU, 2050, 14087 +# LED, R12_EEU, 2110, 14087 +# LED, R12_FSU, 2020, 13000 +# LED, R12_FSU, 2050, 14087 +# LED, R12_FSU, 2110, 14087 +# LED, R12_LAM, 2020, 13500 +# LED, R12_LAM, 2050, 15113 +# LED, R12_LAM, 2110, 15113 +# LED, R12_MEA, 2020, 14500 +# LED, R12_MEA, 2050, 15113 +# LED, R12_MEA, 2110, 15113 +# LED, R12_NAM, 2020, 18400 +# LED, R12_NAM, 2050, 14087 +# LED, R12_NAM, 2110, 14087 +# LED, R12_PAO, 2020, 9000 +# LED, R12_PAO, 2050, 14087 +# LED, R12_PAO, 2110, 14087 +# LED, R12_PAS, 2020, 13000 +# LED, R12_PAS, 2050, 15113 +# LED, R12_PAS, 2110, 15113 +# LED, R12_RCPA, 2020, 12000 +# LED, R12_RCPA, 2050, 15113 +# LED, R12_RCPA, 2110, 15113 +# LED, R12_SAS, 2020, 12000 +# LED, R12_SAS, 2050, 15113 +# LED, R12_SAS, 2110, 15113 +# LED, R12_WEU, 2020, 11700 +# LED, R12_WEU, 2050, 14087 +# LED, R12_WEU, 2110, 14087 + +# for DIGSY/MCE we will run the LED setup (exogenous pdt by cap per mode) but with SSP2 properties +LED, R12_AFR, 2020, 15500 +LED, R12_AFR, 2110, 15500 +LED, R12_CHN, 2020, 15000 +LED, R12_CHN, 2110, 15000 +LED, R12_EEU, 2020, 9000 +LED, R12_EEU, 2110, 9000 +LED, R12_FSU, 2020, 13000 +LED, R12_FSU, 2110, 13000 +LED, R12_LAM, 2020, 13500 +LED, R12_LAM, 2110, 13500 +LED, R12_MEA, 2020, 14500 +LED, R12_MEA, 2110, 14500 +LED, R12_NAM, 2020, 18400 +LED, R12_NAM, 2110, 18400 +LED, R12_PAO, 2020, 9000 +LED, R12_PAO, 2110, 9000 +LED, R12_PAS, 2020, 13000 +LED, R12_PAS, 2110, 13000 +LED, R12_RCPA, 2020, 12000 +LED, R12_RCPA, 2110, 12000 +LED, R12_SAS, 2020, 12000 +LED, R12_SAS, 2110, 12000 +LED, R12_WEU, 2020, 11700 +LED, R12_WEU, 2110, 11700 + diff --git a/message_ix_models/data/transport/R12/ldv-t-share.csv b/message_ix_models/data/transport/R12/ldv-t-share.csv index 2ccb57da19..2f3d61cab3 100644 --- a/message_ix_models/data/transport/R12/ldv-t-share.csv +++ b/message_ix_models/data/transport/R12/ldv-t-share.csv @@ -1,144 +1,144 @@ -# Share of LDV technologies in base year (=2020) -# -# Source: (add link to Github issue for full description) -# -# - Values must sum to 1. -# - Technology codes annotated ""historical-only: True"" (e.g. ICE_L_ptrp) must be -# omitted or have zero values. If not, incompatible/infeasible constraint -# values are created. -# -# Units: dimensionless -# -node,technology,value -R12_AFR,ELC_100,0.001 -R12_AFR,HFC_ptrp,0.001 -R12_AFR,IAHe_ptrp,0.002 -R12_AFR,IAHm_ptrp,0.001 -R12_AFR,ICAe_ffv,0.001 -R12_AFR,ICAm_ptrp,0.001 -R12_AFR,ICE_conv,0.9898 -R12_AFR,ICE_nga,0.0001 -R12_AFR,ICH_chyb,0.001 -R12_AFR,IGH_ghyb,0.0001 -R12_AFR,PHEV_ptrp,0.001 -R12_CHN,ELC_100,0.015 -R12_CHN,HFC_ptrp,0.001 -R12_CHN,IAHe_ptrp,0.002 -R12_CHN,IAHm_ptrp,0.001 -R12_CHN,ICAe_ffv,0.001 -R12_CHN,ICAm_ptrp,0.001 -R12_CHN,ICE_conv,0.959 -R12_CHN,ICE_nga,0.001 -R12_CHN,ICH_chyb,0.005 -R12_CHN,IGH_ghyb,0.009 -R12_CHN,PHEV_ptrp,0.005 -R12_EEU,ELC_100,0.002 -R12_EEU,HFC_ptrp,0.001 -R12_EEU,IAHe_ptrp,0.001 -R12_EEU,IAHm_ptrp,0.001 -R12_EEU,ICAe_ffv,0.001 -R12_EEU,ICAm_ptrp,0.001 -R12_EEU,ICE_conv,0.98 -R12_EEU,ICE_nga,0.001 -R12_EEU,ICH_chyb,0.008 -R12_EEU,IGH_ghyb,0.003 -R12_EEU,PHEV_ptrp,0.001 -R12_FSU,ELC_100,0.001 -R12_FSU,HFC_ptrp,0.001 -R12_FSU,IAHe_ptrp,0.001 -R12_FSU,IAHm_ptrp,0.001 -R12_FSU,ICAe_ffv,0.001 -R12_FSU,ICAm_ptrp,0.001 -R12_FSU,ICE_conv,0.981 -R12_FSU,ICE_nga,0.001 -R12_FSU,ICH_chyb,0.008 -R12_FSU,IGH_ghyb,0.003 -R12_FSU,PHEV_ptrp,0.001 -R12_LAM,ELC_100,0.001 -R12_LAM,HFC_ptrp,0.001 -R12_LAM,IAHe_ptrp,0.01 -R12_LAM,IAHm_ptrp,0.001 -R12_LAM,ICAe_ffv,0.2 -R12_LAM,ICAm_ptrp,0.01 -R12_LAM,ICE_conv,0.768 -R12_LAM,ICE_nga,0.005 -R12_LAM,ICH_chyb,0.001 -R12_LAM,IGH_ghyb,0.001 -R12_LAM,PHEV_ptrp,0.002 -R12_MEA,ELC_100,0.001 -R12_MEA,HFC_ptrp,0.001 -R12_MEA,IAHe_ptrp,0.001 -R12_MEA,IAHm_ptrp,0.001 -R12_MEA,ICAe_ffv,0.001 -R12_MEA,ICAm_ptrp,0.001 -R12_MEA,ICE_conv,0.981 -R12_MEA,ICE_nga,0.001 -R12_MEA,ICH_chyb,0.008 -R12_MEA,IGH_ghyb,0.003 -R12_MEA,PHEV_ptrp,0.001 -R12_NAM,ELC_100,0.004 -R12_NAM,HFC_ptrp,0.001 -R12_NAM,IAHe_ptrp,0.001 -R12_NAM,IAHm_ptrp,0.001 -R12_NAM,ICAe_ffv,0.1 -R12_NAM,ICAm_ptrp,0.01 -R12_NAM,ICE_conv,0.878 -R12_NAM,ICE_nga,0.001 -R12_NAM,ICH_chyb,0.001 -R12_NAM,IGH_ghyb,0.001 -R12_NAM,PHEV_ptrp,0.002 -R12_PAO,ELC_100,0.0025 -R12_PAO,HFC_ptrp,0.001 -R12_PAO,IAHe_ptrp,0.002 -R12_PAO,IAHm_ptrp,0.001 -R12_PAO,ICAe_ffv,0.001 -R12_PAO,ICAm_ptrp,0.001 -R12_PAO,ICE_conv,0.9735 -R12_PAO,ICE_nga,0.001 -R12_PAO,ICH_chyb,0.005 -R12_PAO,IGH_ghyb,0.009 -R12_PAO,PHEV_ptrp,0.003 -R12_PAS,ELC_100,0.001 -R12_PAS,HFC_ptrp,0.001 -R12_PAS,IAHe_ptrp,0.001 -R12_PAS,IAHm_ptrp,0.001 -R12_PAS,ICAe_ffv,0.001 -R12_PAS,ICAm_ptrp,0.001 -R12_PAS,ICE_conv,0.981 -R12_PAS,ICE_nga,0.001 -R12_PAS,ICH_chyb,0.008 -R12_PAS,IGH_ghyb,0.003 -R12_PAS,PHEV_ptrp,0.001 -R12_RCPA,ELC_100,0.015 -R12_RCPA,HFC_ptrp,0.001 -R12_RCPA,IAHe_ptrp,0.002 -R12_RCPA,IAHm_ptrp,0.001 -R12_RCPA,ICAe_ffv,0.001 -R12_RCPA,ICAm_ptrp,0.001 -R12_RCPA,ICE_conv,0.959 -R12_RCPA,ICE_nga,0.001 -R12_RCPA,ICH_chyb,0.005 -R12_RCPA,IGH_ghyb,0.009 -R12_RCPA,PHEV_ptrp,0.005 -R12_SAS,ELC_100,0.001 -R12_SAS,HFC_ptrp,0.001 -R12_SAS,IAHe_ptrp,0.003 -R12_SAS,IAHm_ptrp,0.001 -R12_SAS,ICAe_ffv,0.001 -R12_SAS,ICAm_ptrp,0.001 -R12_SAS,ICE_conv,0.979 -R12_SAS,ICE_nga,0.001 -R12_SAS,ICH_chyb,0.008 -R12_SAS,IGH_ghyb,0.003 -R12_SAS,PHEV_ptrp,0.001 -R12_WEU,ELC_100,0.007 -R12_WEU,HFC_ptrp,0.001 -R12_WEU,IAHe_ptrp,0.001 -R12_WEU,IAHm_ptrp,0.001 -R12_WEU,ICAe_ffv,0.001 -R12_WEU,ICAm_ptrp,0.001 -R12_WEU,ICE_conv,0.963 -R12_WEU,ICE_nga,0.001 -R12_WEU,ICH_chyb,0.015 -R12_WEU,IGH_ghyb,0.001 -R12_WEU,PHEV_ptrp,0.008 +# Share of LDV technologies in base year (=2020) +# +# Source: (add link to Github issue for full description) +# +# - Values must sum to 1. +# - Technology codes annotated ""historical-only: True"" (e.g. ICE_L_ptrp) must be +# omitted or have zero values. If not, incompatible/infeasible constraint +# values are created. +# +# Units: dimensionless +# +node,technology,value +R12_AFR,ELC_100,0.0002 +R12_AFR,HFC_ptrp,0.001 +R12_AFR,IAHe_ptrp,0.0003 +R12_AFR,IAHm_ptrp,0.001 +R12_AFR,ICAe_ffv,0.001 +R12_AFR,ICAm_ptrp,0.001 +R12_AFR,ICE_conv,0.99417 +R12_AFR,ICE_nga,0.00002 +R12_AFR,ICH_chyb,0.001 +R12_AFR,IGH_ghyb,0.00001 +R12_AFR,PHEV_ptrp,0.0003 +R12_CHN,ELC_100,0.05 +R12_CHN,HFC_ptrp,0.001 +R12_CHN,IAHe_ptrp,0.025 +R12_CHN,IAHm_ptrp,0.001 +R12_CHN,ICAe_ffv,0.001 +R12_CHN,ICAm_ptrp,0.001 +R12_CHN,ICE_conv,0.696 +R12_CHN,ICE_nga,0.15 +R12_CHN,ICH_chyb,0.005 +R12_CHN,IGH_ghyb,0.03 +R12_CHN,PHEV_ptrp,0.04 +R12_EEU,ELC_100,0.0018 +R12_EEU,HFC_ptrp,0.001 +R12_EEU,IAHe_ptrp,0.07 +R12_EEU,IAHm_ptrp,0.001 +R12_EEU,ICAe_ffv,0.001 +R12_EEU,ICAm_ptrp,0.001 +R12_EEU,ICE_conv,0.9092 +R12_EEU,ICE_nga,0.003 +R12_EEU,ICH_chyb,0.008 +R12_EEU,IGH_ghyb,0.003 +R12_EEU,PHEV_ptrp,0.001 +R12_FSU,ELC_100,0.0004 +R12_FSU,HFC_ptrp,0.001 +R12_FSU,IAHe_ptrp,0.0015 +R12_FSU,IAHm_ptrp,0.001 +R12_FSU,ICAe_ffv,0.001 +R12_FSU,ICAm_ptrp,0.001 +R12_FSU,ICE_conv,0.9223 +R12_FSU,ICE_nga,0.06 +R12_FSU,ICH_chyb,0.008 +R12_FSU,IGH_ghyb,0.003 +R12_FSU,PHEV_ptrp,0.0008 +R12_LAM,ELC_100,0.0012 +R12_LAM,HFC_ptrp,0.001 +R12_LAM,IAHe_ptrp,0.01 +R12_LAM,IAHm_ptrp,0.001 +R12_LAM,ICAe_ffv,0.2 +R12_LAM,ICAm_ptrp,0.01 +R12_LAM,ICE_conv,0.7658 +R12_LAM,ICE_nga,0.007 +R12_LAM,ICH_chyb,0.001 +R12_LAM,IGH_ghyb,0.001 +R12_LAM,PHEV_ptrp,0.002 +R12_MEA,ELC_100,0.0006 +R12_MEA,HFC_ptrp,0.001 +R12_MEA,IAHe_ptrp,0.001 +R12_MEA,IAHm_ptrp,0.001 +R12_MEA,ICAe_ffv,0.001 +R12_MEA,ICAm_ptrp,0.001 +R12_MEA,ICE_conv,0.9424 +R12_MEA,ICE_nga,0.04 +R12_MEA,ICH_chyb,0.008 +R12_MEA,IGH_ghyb,0.003 +R12_MEA,PHEV_ptrp,0.001 +R12_NAM,ELC_100,0.0025 +R12_NAM,HFC_ptrp,0.001 +R12_NAM,IAHe_ptrp,0.001 +R12_NAM,IAHm_ptrp,0.001 +R12_NAM,ICAe_ffv,0.1 +R12_NAM,ICAm_ptrp,0.01 +R12_NAM,ICE_conv,0.879 +R12_NAM,ICE_nga,0.002 +R12_NAM,ICH_chyb,0.001 +R12_NAM,IGH_ghyb,0.001 +R12_NAM,PHEV_ptrp,0.0015 +R12_PAO,ELC_100,0.0002 +R12_PAO,HFC_ptrp,0.001 +R12_PAO,IAHe_ptrp,0.004 +R12_PAO,IAHm_ptrp,0.003 +R12_PAO,ICAe_ffv,0.001 +R12_PAO,ICAm_ptrp,0.001 +R12_PAO,ICE_conv,0.9841 +R12_PAO,ICE_nga,0.0001 +R12_PAO,ICH_chyb,0.005 +R12_PAO,IGH_ghyb,0.0005 +R12_PAO,PHEV_ptrp,0.0001 +R12_PAS,ELC_100,0.001 +R12_PAS,HFC_ptrp,0.001 +R12_PAS,IAHe_ptrp,0.02 +R12_PAS,IAHm_ptrp,0.001 +R12_PAS,ICAe_ffv,0.001 +R12_PAS,ICAm_ptrp,0.001 +R12_PAS,ICE_conv,0.95 +R12_PAS,ICE_nga,0.02 +R12_PAS,ICH_chyb,0.001 +R12_PAS,IGH_ghyb,0.003 +R12_PAS,PHEV_ptrp,0.001 +R12_RCPA,ELC_100,0.01 +R12_RCPA,HFC_ptrp,0.001 +R12_RCPA,IAHe_ptrp,0.0015 +R12_RCPA,IAHm_ptrp,0.001 +R12_RCPA,ICAe_ffv,0.001 +R12_RCPA,ICAm_ptrp,0.001 +R12_RCPA,ICE_conv,0.9645 +R12_RCPA,ICE_nga,0.001 +R12_RCPA,ICH_chyb,0.005 +R12_RCPA,IGH_ghyb,0.009 +R12_RCPA,PHEV_ptrp,0.005 +R12_SAS,ELC_100,0.0000000005 +R12_SAS,HFC_ptrp,0.001 +R12_SAS,IAHe_ptrp,0.03 +R12_SAS,IAHm_ptrp,0.001 +R12_SAS,ICAe_ffv,0.001 +R12_SAS,ICAm_ptrp,0.001 +R12_SAS,ICE_conv,0.9129999992 +R12_SAS,ICE_nga,0.035 +R12_SAS,ICH_chyb,0.01 +R12_SAS,IGH_ghyb,0.008 +R12_SAS,PHEV_ptrp,0.0000000003 +R12_WEU,ELC_100,0.0022 +R12_WEU,HFC_ptrp,0.001 +R12_WEU,IAHe_ptrp,0.07 +R12_WEU,IAHm_ptrp,0.001 +R12_WEU,ICAe_ffv,0.001 +R12_WEU,ICAm_ptrp,0.001 +R12_WEU,ICE_conv,0.9128 +R12_WEU,ICE_nga,0.005 +R12_WEU,ICH_chyb,0.001 +R12_WEU,IGH_ghyb,0.001 +R12_WEU,PHEV_ptrp,0.004 diff --git a/message_ix_models/data/transport/R12/lifetime-ldv.csv b/message_ix_models/data/transport/R12/lifetime-ldv.csv index 278c78d552..c401dde2b3 100644 --- a/message_ix_models/data/transport/R12/lifetime-ldv.csv +++ b/message_ix_models/data/transport/R12/lifetime-ldv.csv @@ -33,39 +33,66 @@ scenario, node_loc, technology, year_vtg, value *, R12_WEU, *, 1990, 20 *, R12_WEU, *, 2110, 20 -LED, R12_AFR, *, 1990, 25 -LED, R12_AFR, *, 2050, 19.36 -LED, R12_AFR, *, 2110, 19.36 -LED, R12_CHN, *, 1990, 15 -LED, R12_CHN, *, 2050, 19.36 -LED, R12_CHN, *, 2110, 19.36 -LED, R12_EEU, *, 1990, 28 -LED, R12_EEU, *, 2050, 19.55 -LED, R12_EEU, *, 2110, 19.55 -LED, R12_FSU, *, 1990, 15 -LED, R12_FSU, *, 2050, 19.55 -LED, R12_FSU, *, 2110, 19.55 -LED, R12_LAM, *, 1990, 25 -LED, R12_LAM, *, 2050, 19.36 -LED, R12_LAM, *, 2110, 19.36 -LED, R12_MEA, *, 1990, 15 -LED, R12_MEA, *, 2050, 19.36 -LED, R12_MEA, *, 2110, 19.36 -LED, R12_NAM, *, 1990, 18 -LED, R12_NAM, *, 2050, 19.55 -LED, R12_NAM, *, 2110, 19.55 -LED, R12_PAO, *, 1990, 13 -LED, R12_PAO, *, 2050, 19.55 -LED, R12_PAO, *, 2110, 19.55 -LED, R12_PAS, *, 1990, 13 -LED, R12_PAS, *, 2050, 19.36 -LED, R12_PAS, *, 2110, 19.36 -LED, R12_RCPA, *, 1990, 15 -LED, R12_RCPA, *, 2050, 19.36 -LED, R12_RCPA, *, 2110, 19.36 -LED, R12_SAS, *, 1990, 25 -LED, R12_SAS, *, 2050, 19.36 -LED, R12_SAS, *, 2110, 19.36 -LED, R12_WEU, *, 1990, 20 -LED, R12_WEU, *, 2050, 19.55 -LED, R12_WEU, *, 2110, 19.55 + +# LED, R12_AFR, *, 1990, 25 +# LED, R12_AFR, *, 2050, 19.36 +# LED, R12_AFR, *, 2110, 19.36 +# LED, R12_CHN, *, 1990, 15 +# LED, R12_CHN, *, 2050, 19.36 +# LED, R12_CHN, *, 2110, 19.36 +# LED, R12_EEU, *, 1990, 28 +# LED, R12_EEU, *, 2050, 19.55 +# LED, R12_EEU, *, 2110, 19.55 +# LED, R12_FSU, *, 1990, 15 +# LED, R12_FSU, *, 2050, 19.55 +# LED, R12_FSU, *, 2110, 19.55 +# LED, R12_LAM, *, 1990, 25 +# LED, R12_LAM, *, 2050, 19.36 +# LED, R12_LAM, *, 2110, 19.36 +# LED, R12_MEA, *, 1990, 15 +# LED, R12_MEA, *, 2050, 19.36 +# LED, R12_MEA, *, 2110, 19.36 +# LED, R12_NAM, *, 1990, 18 +# LED, R12_NAM, *, 2050, 19.55 +# LED, R12_NAM, *, 2110, 19.55 +# LED, R12_PAO, *, 1990, 13 +# LED, R12_PAO, *, 2050, 19.55 +# LED, R12_PAO, *, 2110, 19.55 +# LED, R12_PAS, *, 1990, 13 +# LED, R12_PAS, *, 2050, 19.36 +# LED, R12_PAS, *, 2110, 19.36 +# LED, R12_RCPA, *, 1990, 15 +# LED, R12_RCPA, *, 2050, 19.36 +# LED, R12_RCPA, *, 2110, 19.36 +# LED, R12_SAS, *, 1990, 25 +# LED, R12_SAS, *, 2050, 19.36 +# LED, R12_SAS, *, 2110, 19.36 +# LED, R12_WEU, *, 1990, 20 +# LED, R12_WEU, *, 2050, 19.55 +# LED, R12_WEU, *, 2110, 19.55 + +# for DIGSY/MCE we will run the LED setup (exogenous pdt by cap per mode) but with SSP2 properties +LED, R12_AFR, *, 1990, 25 +LED, R12_AFR, *, 2110, 25 +LED, R12_CHN, *, 1990, 15 +LED, R12_CHN, *, 2110, 15 +LED, R12_EEU, *, 1990, 28 +LED, R12_EEU, *, 2110, 28 +LED, R12_FSU, *, 1990, 15 +LED, R12_FSU, *, 2110, 15 +LED, R12_LAM, *, 1990, 25 +LED, R12_LAM, *, 2110, 25 +LED, R12_MEA, *, 1990, 15 +LED, R12_MEA, *, 2110, 15 +LED, R12_NAM, *, 1990, 18 +LED, R12_NAM, *, 2110, 18 +LED, R12_PAO, *, 1990, 13 +LED, R12_PAO, *, 2110, 13 +LED, R12_PAS, *, 1990, 13 +LED, R12_PAS, *, 2110, 13 +LED, R12_RCPA, *, 1990, 15 +LED, R12_RCPA, *, 2110, 15 +LED, R12_SAS, *, 1990, 25 +LED, R12_SAS, *, 2110, 25 +LED, R12_WEU, *, 1990, 20 +LED, R12_WEU, *, 2110, 20 diff --git a/message_ix_models/data/transport/R12/load-factor-ldv.csv b/message_ix_models/data/transport/R12/load-factor-ldv.csv index d3b6bf2703..fb17e34aee 100644 --- a/message_ix_models/data/transport/R12/load-factor-ldv.csv +++ b/message_ix_models/data/transport/R12/load-factor-ldv.csv @@ -16,15 +16,15 @@ SSP(2024).1, R12_EEU,2020,1.643 SSP(2024).1, R12_EEU,2110,1.8 SSP(2024).1, R12_FSU,2020,1.807 SSP(2024).1, R12_FSU,2110,1.8 -SSP(2024).1, R12_LAM,2020,1.807 +SSP(2024).1, R12_LAM,2020,1.800 SSP(2024).1, R12_LAM,2110,1.8 SSP(2024).1, R12_MEA,2020,1.807 SSP(2024).1, R12_MEA,2110,1.8 SSP(2024).1, R12_NAM,2020,1.53 SSP(2024).1, R12_NAM,2110,1.8 -SSP(2024).1, R12_PAO,2020,1.72 +SSP(2024).1, R12_PAO,2020,1.65 SSP(2024).1, R12_PAO,2110,1.8 -SSP(2024).1, R12_PAS,2020,1.807 +SSP(2024).1, R12_PAS,2020,1.800 SSP(2024).1, R12_PAS,2110,1.8 SSP(2024).1, R12_RCPA,2020,1.892 SSP(2024).1, R12_RCPA,2110,1.8 @@ -41,15 +41,15 @@ SSP(2024).2, R12_EEU,2020,1.643 SSP(2024).2, R12_EEU,2110,1.5 SSP(2024).2, R12_FSU,2020,1.807 SSP(2024).2, R12_FSU,2110,1.5 -SSP(2024).2, R12_LAM,2020,1.807 +SSP(2024).2, R12_LAM,2020,1.800 SSP(2024).2, R12_LAM,2110,1.65 SSP(2024).2, R12_MEA,2020,1.807 SSP(2024).2, R12_MEA,2110,1.65 SSP(2024).2, R12_NAM,2020,1.53 SSP(2024).2, R12_NAM,2110,1.5 -SSP(2024).2, R12_PAO,2020,1.72 +SSP(2024).2, R12_PAO,2020,1.65 SSP(2024).2, R12_PAO,2110,1.5 -SSP(2024).2, R12_PAS,2020,1.807 +SSP(2024).2, R12_PAS,2020,1.800 SSP(2024).2, R12_PAS,2110,1.5 SSP(2024).2, R12_RCPA,2020,1.892 SSP(2024).2, R12_RCPA,2110,1.65 @@ -70,7 +70,7 @@ SSP(2024).3, R12_EEU,2110,1.2 SSP(2024).3, R12_FSU,2020,1.807 SSP(2024).3, R12_FSU,2030,1.807 SSP(2024).3, R12_FSU,2110,1.2 -SSP(2024).3, R12_LAM,2020,1.807 +SSP(2024).3, R12_LAM,2020,1.800 SSP(2024).3, R12_LAM,2030,1.807 SSP(2024).3, R12_LAM,2110,1.2 SSP(2024).3, R12_MEA,2020,1.807 @@ -79,10 +79,10 @@ SSP(2024).3, R12_MEA,2110,1.2 SSP(2024).3, R12_NAM,2020,1.53 SSP(2024).3, R12_NAM,2030,1.53 SSP(2024).3, R12_NAM,2110,1.2 -SSP(2024).3, R12_PAO,2020,1.72 +SSP(2024).3, R12_PAO,2020,1.65 SSP(2024).3, R12_PAO,2030,1.72 SSP(2024).3, R12_PAO,2110,1.2 -SSP(2024).3, R12_PAS,2020,1.807 +SSP(2024).3, R12_PAS,2020,1.800 SSP(2024).3, R12_PAS,2030,1.807 SSP(2024).3, R12_PAS,2110,1.2 SSP(2024).3, R12_RCPA,2020,1.892 @@ -103,15 +103,15 @@ SSP(2024).4, R12_EEU,2020,1.643 SSP(2024).4, R12_EEU,2110,1.7 SSP(2024).4, R12_FSU,2020,1.807 SSP(2024).4, R12_FSU,2110,1.8 -SSP(2024).4, R12_LAM,2020,1.807 +SSP(2024).4, R12_LAM,2020,1.800 SSP(2024).4, R12_LAM,2110,1.8 SSP(2024).4, R12_MEA,2020,1.807 SSP(2024).4, R12_MEA,2110,1.8 SSP(2024).4, R12_NAM,2020,1.53 SSP(2024).4, R12_NAM,2110,1.7 -SSP(2024).4, R12_PAO,2020,1.72 +SSP(2024).4, R12_PAO,2020,1.65 SSP(2024).4, R12_PAO,2110,1.7 -SSP(2024).4, R12_PAS,2020,1.807 +SSP(2024).4, R12_PAS,2020,1.800 SSP(2024).4, R12_PAS,2110,1.8 SSP(2024).4, R12_RCPA,2020,1.892 SSP(2024).4, R12_RCPA,2110,1.8 @@ -128,15 +128,15 @@ SSP(2024).5, R12_EEU,2020,1.643 SSP(2024).5, R12_EEU,2110,1.5 SSP(2024).5, R12_FSU,2020,1.807 SSP(2024).5, R12_FSU,2110,1.5 -SSP(2024).5, R12_LAM,2020,1.807 +SSP(2024).5, R12_LAM,2020,1.800 SSP(2024).5, R12_LAM,2110,1.5 SSP(2024).5, R12_MEA,2020,1.807 SSP(2024).5, R12_MEA,2110,1.5 SSP(2024).5, R12_NAM,2020,1.53 SSP(2024).5, R12_NAM,2110,1.5 -SSP(2024).5, R12_PAO,2020,1.72 +SSP(2024).5, R12_PAO,2020,1.65 SSP(2024).5, R12_PAO,2110,1.5 -SSP(2024).5, R12_PAS,2020,1.807 +SSP(2024).5, R12_PAS,2020,1.800 SSP(2024).5, R12_PAS,2110,1.5 SSP(2024).5, R12_RCPA,2020,1.892 SSP(2024).5, R12_RCPA,2110,1.5 @@ -145,65 +145,91 @@ SSP(2024).5, R12_SAS,2110,1.5 SSP(2024).5, R12_WEU,2020,1.65 SSP(2024).5, R12_WEU,2110,1.5 -# “Global South” -LED, R12_AFR, 2020, 2.100 -LED, R12_AFR, 2030, 2.134 -LED, R12_AFR, 2040, 2.168 -LED, R12_AFR, 2050, 2.201 -LED, R12_AFR, 2110, 2.201 -LED, R12_CHN, 2020, 1.750 -LED, R12_CHN, 2030, 1.900 -LED, R12_CHN, 2040, 2.051 -LED, R12_CHN, 2050, 2.201 -LED, R12_CHN, 2110, 2.201 -LED, R12_LAM, 2020, 1.807 -LED, R12_LAM, 2030, 1.938 -LED, R12_LAM, 2040, 2.070 -LED, R12_LAM, 2050, 2.201 -LED, R12_LAM, 2110, 2.201 -LED, R12_MEA, 2020, 1.807 -LED, R12_MEA, 2030, 1.938 -LED, R12_MEA, 2040, 2.070 -LED, R12_MEA, 2050, 2.201 -LED, R12_MEA, 2110, 2.201 -LED, R12_PAS, 2020, 1.807 -LED, R12_PAS, 2030, 1.938 -LED, R12_PAS, 2040, 2.070 -LED, R12_PAS, 2050, 2.201 -LED, R12_PAS, 2110, 2.201 -LED, R12_RCPA, 2020, 1.892 -LED, R12_RCPA, 2030, 1.995 -LED, R12_RCPA, 2040, 2.098 -LED, R12_RCPA, 2050, 2.201 -LED, R12_RCPA, 2110, 2.201 -LED, R12_SAS, 2020, 2.000 -LED, R12_SAS, 2030, 2.067 -LED, R12_SAS, 2040, 2.134 -LED, R12_SAS, 2050, 2.201 -LED, R12_SAS, 2110, 2.201 +# Global South +# LED, R12_AFR, 2020, 2.100 +# LED, R12_AFR, 2030, 2.134 +# LED, R12_AFR, 2040, 2.168 +# LED, R12_AFR, 2050, 2.201 +# LED, R12_AFR, 2110, 2.201 +# LED, R12_CHN, 2020, 1.750 +# LED, R12_CHN, 2030, 1.900 +# LED, R12_CHN, 2040, 2.051 +# LED, R12_CHN, 2050, 2.201 +# LED, R12_CHN, 2110, 2.201 +# LED, R12_LAM, 2020, 1.807 +# LED, R12_LAM, 2030, 1.938 +# LED, R12_LAM, 2040, 2.070 +# LED, R12_LAM, 2050, 2.201 +# LED, R12_LAM, 2110, 2.201 +# LED, R12_MEA, 2020, 1.807 +# LED, R12_MEA, 2030, 1.938 +# LED, R12_MEA, 2040, 2.070 +# LED, R12_MEA, 2050, 2.201 +# LED, R12_MEA, 2110, 2.201 +# LED, R12_PAS, 2020, 1.807 +# LED, R12_PAS, 2030, 1.938 +# LED, R12_PAS, 2040, 2.070 +# LED, R12_PAS, 2050, 2.201 +# LED, R12_PAS, 2110, 2.201 +# LED, R12_RCPA, 2020, 1.892 +# LED, R12_RCPA, 2030, 1.995 +# LED, R12_RCPA, 2040, 2.098 +# LED, R12_RCPA, 2050, 2.201 +# LED, R12_RCPA, 2110, 2.201 +# LED, R12_SAS, 2020, 2.000 +# LED, R12_SAS, 2030, 2.067 +# LED, R12_SAS, 2040, 2.134 +# LED, R12_SAS, 2050, 2.201 +# LED, R12_SAS, 2110, 2.201 +# Global North +# LED, R12_EEU, 2020, 1.643 +# LED, R12_EEU, 2030, 1.721 +# LED, R12_EEU, 2040, 1.800 +# LED, R12_EEU, 2050, 1.878 +# LED, R12_EEU, 2110, 2.201 +# LED, R12_FSU, 2020, 1.807 +# LED, R12_FSU, 2030, 1.831 +# LED, R12_FSU, 2040, 1.854 +# LED, R12_FSU, 2050, 1.878 +# LED, R12_FSU, 2110, 2.201 +# LED, R12_NAM, 2020, 1.530 +# LED, R12_NAM, 2030, 1.646 +# LED, R12_NAM, 2040, 1.762 +# LED, R12_NAM, 2050, 1.878 +# LED, R12_NAM, 2110, 2.201 +# LED, R12_PAO, 2020, 1.720 +# LED, R12_PAO, 2030, 1.773 +# LED, R12_PAO, 2040, 1.825 +# LED, R12_PAO, 2050, 1.878 +# LED, R12_PAO, 2110, 2.201 +# LED, R12_WEU, 2020, 1.650 +# LED, R12_WEU, 2030, 1.726 +# LED, R12_WEU, 2040, 1.802 +# LED, R12_WEU, 2050, 1.878 +# LED, R12_WEU, 2110, 2.201 -LED, R12_EEU, 2020, 1.643 -LED, R12_EEU, 2030, 1.721 -LED, R12_EEU, 2040, 1.800 -LED, R12_EEU, 2050, 1.878 -LED, R12_EEU, 2110, 2.201 -LED, R12_FSU, 2020, 1.807 -LED, R12_FSU, 2030, 1.831 -LED, R12_FSU, 2040, 1.854 -LED, R12_FSU, 2050, 1.878 -LED, R12_FSU, 2110, 2.201 -LED, R12_NAM, 2020, 1.530 -LED, R12_NAM, 2030, 1.646 -LED, R12_NAM, 2040, 1.762 -LED, R12_NAM, 2050, 1.878 -LED, R12_NAM, 2110, 2.201 -LED, R12_PAO, 2020, 1.720 -LED, R12_PAO, 2030, 1.773 -LED, R12_PAO, 2040, 1.825 -LED, R12_PAO, 2050, 1.878 -LED, R12_PAO, 2110, 2.201 -LED, R12_WEU, 2020, 1.650 -LED, R12_WEU, 2030, 1.726 -LED, R12_WEU, 2040, 1.802 -LED, R12_WEU, 2050, 1.878 -LED, R12_WEU, 2110, 2.201 +# for DIGSY/MCE we will run the LED setup (exogenous pdt by cap per mode) but with SSP2 properties +LED, R12_AFR,2020,2.1 +LED, R12_AFR,2110,1.7 +LED, R12_CHN,2020,1.75 +LED, R12_CHN,2110,1.5 +LED, R12_EEU,2020,1.643 +LED, R12_EEU,2110,1.5 +LED, R12_FSU,2020,1.807 +LED, R12_FSU,2110,1.5 +LED, R12_LAM,2020,1.8 +LED, R12_LAM,2110,1.65 +LED, R12_MEA,2020,1.807 +LED, R12_MEA,2110,1.65 +LED, R12_NAM,2020,1.53 +LED, R12_NAM,2110,1.5 +LED, R12_PAO,2020,1.65 +LED, R12_PAO,2110,1.5 +LED, R12_PAS,2020,1.8 +LED, R12_PAS,2110,1.5 +LED, R12_RCPA,2020,1.892 +LED, R12_RCPA,2110,1.65 +LED, R12_SAS,2020,2 +LED, R12_SAS,2110,1.7 +LED, R12_WEU,2020,1.65 +LED, R12_WEU,2110,1.5 diff --git a/message_ix_models/data/transport/R12/mode-share/default.csv b/message_ix_models/data/transport/R12/mode-share/default.csv index 3e985df677..b69e88ee20 100644 --- a/message_ix_models/data/transport/R12/mode-share/default.csv +++ b/message_ix_models/data/transport/R12/mode-share/default.csv @@ -19,57 +19,57 @@ R12_AFR, BUS, 0.58 R12_AFR, LDV, 0.24 R12_AFR, RAIL, 0.02 R12_CHN, 2W, 0.02 -R12_CHN, AIR, 0.11 -R12_CHN, BUS, 0.18 -R12_CHN, LDV, 0.52 -R12_CHN, RAIL, 0.17 +R12_CHN, AIR, 0.09 +R12_CHN, BUS, 0.19 +R12_CHN, LDV, 0.50 +R12_CHN, RAIL, 0.20 R12_EEU, 2W, 0.01 R12_EEU, AIR, 0.01 R12_EEU, BUS, 0.35 R12_EEU, LDV, 0.46 R12_EEU, RAIL, 0.14 R12_FSU, 2W, 0.01 -R12_FSU, AIR, 0.20 -R12_FSU, BUS, 0.22 -R12_FSU, LDV, 0.45 -R12_FSU, RAIL, 0.12 +R12_FSU, AIR, 0.10 +R12_FSU, BUS, 0.25 +R12_FSU, LDV, 0.48 +R12_FSU, RAIL, 0.16 R12_LAM, 2W, 0.04 -R12_LAM, AIR, 0.08 +R12_LAM, AIR, 0.05 R12_LAM, BUS, 0.36 R12_LAM, LDV, 0.50 -R12_LAM, RAIL, 0.01 -R12_MEA, 2W, 0.05 -R12_MEA, AIR, 0.11 -R12_MEA, BUS, 0.38 -R12_MEA, LDV, 0.445 -R12_MEA, RAIL, 0.015 +R12_LAM, RAIL, 0.05 +R12_MEA, 2W, 0.03 +R12_MEA, AIR, 0.10 +R12_MEA, BUS, 0.33 +R12_MEA, LDV, 0.52 +R12_MEA, RAIL, 0.02 R12_NAM, 2W, 0.005 R12_NAM, AIR, 0.12 R12_NAM, BUS, 0.06 R12_NAM, LDV, 0.805 R12_NAM, RAIL, 0.01 R12_PAO, 2W, 0.01 -R12_PAO, AIR, 0.13 +R12_PAO, AIR, 0.12 R12_PAO, BUS, 0.05 -R12_PAO, LDV, 0.58 +R12_PAO, LDV, 0.59 R12_PAO, RAIL, 0.23 R12_PAS, 2W, 0.06 R12_PAS, AIR, 0.07 -R12_PAS, BUS, 0.42 -R12_PAS, LDV, 0.37 -R12_PAS, RAIL, 0.08 -R12_RCPA, 2W, 0.08 -R12_RCPA, AIR, 0.11 +R12_PAS, BUS, 0.37 +R12_PAS, LDV, 0.44 +R12_PAS, RAIL, 0.06 +R12_RCPA, 2W, 0.10 +R12_RCPA, AIR, 0.08 R12_RCPA, BUS, 0.30 -R12_RCPA, LDV, 0.16 -R12_RCPA, RAIL, 0.30 -R12_SAS, 2W, 0.24 -R12_SAS, AIR, 0.04 -R12_SAS, BUS, 0.34 -R12_SAS, LDV, 0.22 +R12_RCPA, LDV, 0.27 +R12_RCPA, RAIL, 0.25 +R12_SAS, 2W, 0.25 +R12_SAS, AIR, 0.03 +R12_SAS, BUS, 0.36 +R12_SAS, LDV, 0.20 R12_SAS, RAIL, 0.16 -R12_WEU, 2W, 0.02 +R12_WEU, 2W, 0.01 R12_WEU, AIR, 0.09 -R12_WEU, BUS, 0.07 -R12_WEU, LDV, 0.71 -R12_WEU, RAIL, 0.11 +R12_WEU, BUS, 0.06 +R12_WEU, LDV, 0.72 +R12_WEU, RAIL, 0.12 diff --git a/message_ix_models/data/transport/R12/pdt-cap-ref.csv b/message_ix_models/data/transport/R12/pdt-cap-ref.csv index ccf9919e23..83d118e911 100644 --- a/message_ix_models/data/transport/R12/pdt-cap-ref.csv +++ b/message_ix_models/data/transport/R12/pdt-cap-ref.csv @@ -17,14 +17,14 @@ # node, value R12_RCPA, 4800 -R12_PAS, 8000 -R12_CHN, 8700 -R12_EEU, 13000 -R12_WEU, 15000 -R12_SAS, 4000 -R12_LAM, 7000 +R12_PAS, 8800 +R12_CHN, 7900 +R12_EEU, 13200 +R12_WEU, 15200 +R12_SAS, 3500 +R12_LAM, 7900 R12_AFR, 3000 -R12_MEA, 6500 -R12_PAO, 14000 -R12_FSU, 9200 +R12_MEA, 6800 +R12_PAO, 14800 +R12_FSU, 9900 R12_NAM, 31000 diff --git a/message_ix_models/data/transport/R12/pdt-cap.csv b/message_ix_models/data/transport/R12/pdt-cap.csv index a241b2e786..876ce3d99f 100644 --- a/message_ix_models/data/transport/R12/pdt-cap.csv +++ b/message_ix_models/data/transport/R12/pdt-cap.csv @@ -1,845 +1,846 @@ -# Projected passenger-distance travelled (PDT) per capita -# -# Units: km / year -# -scenario, node, technology, year, value -LED, R12_AFR, 2W, 2020, 360 -LED, R12_AFR, 2W, 2025, 349.9388732910156 -LED, R12_AFR, 2W, 2030, 344.4533996582031 -LED, R12_AFR, 2W, 2035, 359.76953125 -LED, R12_AFR, 2W, 2040, 375.1594543457031 -LED, R12_AFR, 2W, 2045, 387.9681701660156 -LED, R12_AFR, 2W, 2050, 394.5455627441406 -LED, R12_AFR, 2W, 2055, 392.1726684570313 -LED, R12_AFR, 2W, 2060, 383.0628967285156 -LED, R12_AFR, 2W, 2070, 352.4614868164063 -LED, R12_AFR, 2W, 2080, 314.2948608398438 -LED, R12_AFR, 2W, 2090, 272.2019653320313 -LED, R12_AFR, 2W, 2100, 226.2328491210938 -LED, R12_AFR, 2W, 2110, 175.4202575683594 -LED, R12_AFR, AIR, 2020, 120 -LED, R12_AFR, AIR, 2025, 121.6760711669922 -LED, R12_AFR, AIR, 2030, 126.8117828369141 -LED, R12_AFR, AIR, 2035, 150.9008636474609 -LED, R12_AFR, AIR, 2040, 186.9391784667969 -LED, R12_AFR, AIR, 2045, 241.0809020996094 -LED, R12_AFR, AIR, 2050, 318.3016357421875 -LED, R12_AFR, AIR, 2055, 424.8207092285156 -LED, R12_AFR, AIR, 2060, 562.3614501953125 -LED, R12_AFR, AIR, 2070, 885.75244140625 -LED, R12_AFR, AIR, 2080, 1123.172607421875 -LED, R12_AFR, AIR, 2090, 1182.782958984375 -LED, R12_AFR, AIR, 2100, 1092.263549804688 -LED, R12_AFR, AIR, 2110, 898.96142578125 -LED, R12_AFR, BUS, 2020, 1740 -LED, R12_AFR, BUS, 2025, 1778.776489257813 -LED, R12_AFR, BUS, 2030, 1833.661743164063 -LED, R12_AFR, BUS, 2035, 1980.210083007813 -LED, R12_AFR, BUS, 2040, 2149.00732421875 -LED, R12_AFR, BUS, 2045, 2337.507568359375 -LED, R12_AFR, BUS, 2050, 2536.154541015625 -LED, R12_AFR, BUS, 2055, 2729.57568359375 -LED, R12_AFR, BUS, 2060, 2925.366943359375 -LED, R12_AFR, BUS, 2070, 3323.26708984375 -LED, R12_AFR, BUS, 2080, 3704.340576171875 -LED, R12_AFR, BUS, 2090, 4028.3525390625 -LED, R12_AFR, BUS, 2100, 4251.63525390625 -LED, R12_AFR, BUS, 2110, 4307.275390625 -LED, R12_AFR, LDV, 2020, 720 -LED, R12_AFR, LDV, 2025, 801.6429443359375 -LED, R12_AFR, LDV, 2030, 904.2127075195313 -LED, R12_AFR, LDV, 2035, 1107.065673828125 -LED, R12_AFR, LDV, 2040, 1363.3330078125 -LED, R12_AFR, LDV, 2045, 1676.234008789063 -LED, R12_AFR, LDV, 2050, 2027.899780273438 -LED, R12_AFR, LDV, 2055, 2388.23046875 -LED, R12_AFR, LDV, 2060, 2733.459716796875 -LED, R12_AFR, LDV, 2070, 3304.86083984375 -LED, R12_AFR, LDV, 2080, 3697.032958984375 -LED, R12_AFR, LDV, 2090, 3960.43017578125 -LED, R12_AFR, LDV, 2100, 4129.09814453125 -LED, R12_AFR, LDV, 2110, 4191.140625 -LED, R12_AFR, RAIL, 2020, 60 -LED, R12_AFR, RAIL, 2025, 111.756965637207 -LED, R12_AFR, RAIL, 2030, 171.0411224365234 -LED, R12_AFR, RAIL, 2035, 256.8528137207031 -LED, R12_AFR, RAIL, 2040, 370.3927917480469 -LED, R12_AFR, RAIL, 2045, 521.0502319335938 -LED, R12_AFR, RAIL, 2050, 715.5304565429688 -LED, R12_AFR, RAIL, 2055, 957.4539184570313 -LED, R12_AFR, RAIL, 2060, 1251.8955078125 -LED, R12_AFR, RAIL, 2070, 2002.273681640625 -LED, R12_AFR, RAIL, 2080, 2960.96142578125 -LED, R12_AFR, RAIL, 2090, 4138.26806640625 -LED, R12_AFR, RAIL, 2100, 5553.3291015625 -LED, R12_AFR, RAIL, 2110, 7172.37744140625 -LED, R12_CHN, 2W, 2020, 174 -LED, R12_CHN, 2W, 2025, 175.9307556152344 -LED, R12_CHN, 2W, 2030, 177.6855316162109 -LED, R12_CHN, 2W, 2035, 180.4618072509766 -LED, R12_CHN, 2W, 2040, 181.5007781982422 -LED, R12_CHN, 2W, 2045, 181.8933715820313 -LED, R12_CHN, 2W, 2050, 181.4909362792969 -LED, R12_CHN, 2W, 2055, 186.2772064208984 -LED, R12_CHN, 2W, 2060, 190.9017944335938 -LED, R12_CHN, 2W, 2070, 195.9137451171875 -LED, R12_CHN, 2W, 2080, 200.9256958007811 -LED, R12_CHN, 2W, 2090, 205.9376464843749 -LED, R12_CHN, 2W, 2100, 210.9495971679687 -LED, R12_CHN, 2W, 2110, 215.9615478515625 -LED, R12_CHN, AIR, 2020, 957 -LED, R12_CHN, AIR, 2025, 1109.2431640625 -LED, R12_CHN, AIR, 2030, 1300.3330078125 -LED, R12_CHN, AIR, 2035, 1593.544067382813 -LED, R12_CHN, AIR, 2040, 1832.28271484375 -LED, R12_CHN, AIR, 2045, 2037.44873046875 -LED, R12_CHN, AIR, 2050, 2182.431396484375 -LED, R12_CHN, AIR, 2055, 2297.244384765625 -LED, R12_CHN, AIR, 2060, 2343.124267578125 -LED, R12_CHN, AIR, 2070, 2130.746899414065 -LED, R12_CHN, AIR, 2080, 1918.369531250006 -LED, R12_CHN, AIR, 2090, 1705.992163085939 -LED, R12_CHN, AIR, 2100, 1493.614794921879 -LED, R12_CHN, AIR, 2110, 1281.237426757813 -LED, R12_CHN, BUS, 2020, 1566 -LED, R12_CHN, BUS, 2025, 1729.110473632813 -LED, R12_CHN, BUS, 2030, 1897.931762695313 -LED, R12_CHN, BUS, 2035, 2084.2626953125 -LED, R12_CHN, BUS, 2040, 2270.526123046875 -LED, R12_CHN, BUS, 2045, 2459.493408203125 -LED, R12_CHN, BUS, 2050, 2644.462158203125 -LED, R12_CHN, BUS, 2055, 2913.446044921875 -LED, R12_CHN, BUS, 2060, 3189.642822265625 -LED, R12_CHN, BUS, 2070, 3635.847558593756 -LED, R12_CHN, BUS, 2080, 4082.052294921887 -LED, R12_CHN, BUS, 2090, 4528.257031250003 -LED, R12_CHN, BUS, 2100, 4974.461767578134 -LED, R12_CHN, BUS, 2110, 5420.66650390625 -LED, R12_CHN, LDV, 2020, 4524 -LED, R12_CHN, LDV, 2025, 4714.4970703125 -LED, R12_CHN, LDV, 2030, 4881.69140625 -LED, R12_CHN, LDV, 2035, 5075.017578125 -LED, R12_CHN, LDV, 2040, 5134.947265625 -LED, R12_CHN, LDV, 2045, 5121.98583984375 -LED, R12_CHN, LDV, 2050, 5039.16015625 -LED, R12_CHN, LDV, 2055, 5052.7080078125 -LED, R12_CHN, LDV, 2060, 5026.86572265625 -LED, R12_CHN, LDV, 2070, 4711.836230468754 -LED, R12_CHN, LDV, 2080, 4396.806738281251 -LED, R12_CHN, LDV, 2090, 4081.777246093756 -LED, R12_CHN, LDV, 2100, 3766.747753906253 -LED, R12_CHN, LDV, 2110, 3451.71826171875 -LED, R12_CHN, RAIL, 2020, 1479 -LED, R12_CHN, RAIL, 2025, 1665.220458984375 -LED, R12_CHN, RAIL, 2030, 1876.697143554688 -LED, R12_CHN, RAIL, 2035, 2136.480224609375 -LED, R12_CHN, RAIL, 2040, 2399.80810546875 -LED, R12_CHN, RAIL, 2045, 2678.806640625 -LED, R12_CHN, RAIL, 2050, 2966.284423828125 -LED, R12_CHN, RAIL, 2055, 3359.0380859375 -LED, R12_CHN, RAIL, 2060, 3779.97705078125 -LED, R12_CHN, RAIL, 2070, 4869.3173828125 -LED, R12_CHN, RAIL, 2080, 5958.65771484375 -LED, R12_CHN, RAIL, 2090, 7047.998046875 -LED, R12_CHN, RAIL, 2100, 8137.33837890625 -LED, R12_CHN, RAIL, 2110, 9226.6787109375 -LED, R12_EEU, 2W, 2020, 134.0206146240234 -LED, R12_EEU, 2W, 2025, 135.9545245700411 -LED, R12_EEU, 2W, 2030, 137.888434516059 -LED, R12_EEU, 2W, 2035, 139.8223444620767 -LED, R12_EEU, 2W, 2040, 141.7562544080947 -LED, R12_EEU, 2W, 2045, 143.6901643541124 -LED, R12_EEU, 2W, 2050, 145.6240743001301 -LED, R12_EEU, 2W, 2055, 147.557984246148 -LED, R12_EEU, 2W, 2060, 149.4918941921658 -LED, R12_EEU, 2W, 2070, 153.3597140842012 -LED, R12_EEU, 2W, 2080, 157.2275339762369 -LED, R12_EEU, 2W, 2090, 161.0953538682725 -LED, R12_EEU, 2W, 2100, 164.9631737603081 -LED, R12_EEU, 2W, 2110, 168.8309936523438 -LED, R12_EEU, AIR, 2020, 134.0206146240234 -LED, R12_EEU, AIR, 2025, 193.9309005737305 -LED, R12_EEU, AIR, 2030, 253.8411865234375 -LED, R12_EEU, AIR, 2035, 313.7514724731445 -LED, R12_EEU, AIR, 2040, 373.6617584228516 -LED, R12_EEU, AIR, 2045, 433.5720443725586 -LED, R12_EEU, AIR, 2050, 493.4823303222656 -LED, R12_EEU, AIR, 2055, 553.3926162719727 -LED, R12_EEU, AIR, 2060, 613.3029022216797 -LED, R12_EEU, AIR, 2070, 733.1234741210938 -LED, R12_EEU, AIR, 2080, 852.9440460205078 -LED, R12_EEU, AIR, 2090, 972.7646179199219 -LED, R12_EEU, AIR, 2100, 1092.585189819336 -LED, R12_EEU, AIR, 2110, 1212.40576171875 -LED, R12_EEU, BUS, 2020, 4690.7216796875 -LED, R12_EEU, BUS, 2025, 4666.10896809896 -LED, R12_EEU, BUS, 2030, 4641.49625651042 -LED, R12_EEU, BUS, 2035, 4616.883544921875 -LED, R12_EEU, BUS, 2040, 4592.270833333335 -LED, R12_EEU, BUS, 2045, 4567.658121744795 -LED, R12_EEU, BUS, 2050, 4543.04541015625 -LED, R12_EEU, BUS, 2055, 4518.43269856771 -LED, R12_EEU, BUS, 2060, 4493.81998697917 -LED, R12_EEU, BUS, 2070, 4444.594563802085 -LED, R12_EEU, BUS, 2080, 4395.369140625 -LED, R12_EEU, BUS, 2090, 4346.14371744792 -LED, R12_EEU, BUS, 2100, 4296.918294270835 -LED, R12_EEU, BUS, 2110, 4247.69287109375 -LED, R12_EEU, LDV, 2020, 6164.9482421875 -LED, R12_EEU, LDV, 2025, 6200.518527560765 -LED, R12_EEU, LDV, 2030, 6236.088812934029 -LED, R12_EEU, LDV, 2035, 6271.659098307295 -LED, R12_EEU, LDV, 2040, 6307.229383680557 -LED, R12_EEU, LDV, 2045, 6342.799669053818 -LED, R12_EEU, LDV, 2050, 6378.369954427083 -LED, R12_EEU, LDV, 2055, 6413.940239800346 -LED, R12_EEU, LDV, 2060, 6449.51052517361 -LED, R12_EEU, LDV, 2070, 6520.65109592014 -LED, R12_EEU, LDV, 2080, 6591.791666666671 -LED, R12_EEU, LDV, 2090, 6662.932237413193 -LED, R12_EEU, LDV, 2100, 6734.07280815972 -LED, R12_EEU, LDV, 2110, 6805.21337890625 -LED, R12_EEU, RAIL, 2020, 1876.288696289063 -LED, R12_EEU, RAIL, 2025, 2174.682461208766 -LED, R12_EEU, RAIL, 2030, 2473.076226128469 -LED, R12_EEU, RAIL, 2035, 2771.469991048187 -LED, R12_EEU, RAIL, 2040, 3069.86375596789 -LED, R12_EEU, RAIL, 2045, 3368.257520887593 -LED, R12_EEU, RAIL, 2050, 3666.651285807297 -LED, R12_EEU, RAIL, 2055, 3965.045050727 -LED, R12_EEU, RAIL, 2060, 4263.438815646703 -LED, R12_EEU, RAIL, 2070, 4860.226345486109 -LED, R12_EEU, RAIL, 2080, 5457.013875325531 -LED, R12_EEU, RAIL, 2090, 6053.801405164937 -LED, R12_EEU, RAIL, 2100, 6650.588935004344 -LED, R12_EEU, RAIL, 2110, 7247.37646484375 -LED, R12_FSU, 2W, 2020, 92 -LED, R12_FSU, 2W, 2025, 94.93177795410156 -LED, R12_FSU, 2W, 2030, 96.25485229492188 -LED, R12_FSU, 2W, 2035, 98.46665954589844 -LED, R12_FSU, 2W, 2040, 100.474479675293 -LED, R12_FSU, 2W, 2045, 102.3958282470703 -LED, R12_FSU, 2W, 2050, 103.9340515136719 -LED, R12_FSU, 2W, 2055, 108.0592422485352 -LED, R12_FSU, 2W, 2060, 112.8334045410156 -LED, R12_FSU, 2W, 2070, 124.8742828369141 -LED, R12_FSU, 2W, 2080, 138.4678611755371 -LED, R12_FSU, 2W, 2090, 152.0614395141602 -LED, R12_FSU, 2W, 2100, 165.6550178527832 -LED, R12_FSU, 2W, 2110, 179.2485961914063 -LED, R12_FSU, AIR, 2020, 1840 -LED, R12_FSU, AIR, 2025, 2047.224243164063 -LED, R12_FSU, AIR, 2030, 2019.646240234375 -LED, R12_FSU, AIR, 2035, 2141.26025390625 -LED, R12_FSU, AIR, 2040, 2232.787841796875 -LED, R12_FSU, AIR, 2045, 2304.1435546875 -LED, R12_FSU, AIR, 2050, 2307.40771484375 -LED, R12_FSU, AIR, 2055, 2335.09130859375 -LED, R12_FSU, AIR, 2060, 2336.400390625 -LED, R12_FSU, AIR, 2070, 2292.949462890625 -LED, R12_FSU, AIR, 2080, 1998.332427978516 -LED, R12_FSU, AIR, 2090, 1703.715393066406 -LED, R12_FSU, AIR, 2100, 1409.098358154297 -LED, R12_FSU, AIR, 2110, 1114.481323242188 -LED, R12_FSU, BUS, 2020, 2024 -LED, R12_FSU, BUS, 2025, 2194.27490234375 -LED, R12_FSU, BUS, 2030, 2352.044189453125 -LED, R12_FSU, BUS, 2035, 2515.581787109375 -LED, R12_FSU, BUS, 2040, 2676.835205078125 -LED, R12_FSU, BUS, 2045, 2836.655517578125 -LED, R12_FSU, BUS, 2050, 2986.236083984375 -LED, R12_FSU, BUS, 2055, 3209.896728515625 -LED, R12_FSU, BUS, 2060, 3454.053955078125 -LED, R12_FSU, BUS, 2070, 4020.845703125 -LED, R12_FSU, BUS, 2080, 4558.314208984375 -LED, R12_FSU, BUS, 2090, 5095.78271484375 -LED, R12_FSU, BUS, 2100, 5633.251220703125 -LED, R12_FSU, BUS, 2110, 6170.7197265625 -LED, R12_FSU, LDV, 2020, 4140 -LED, R12_FSU, LDV, 2025, 4430.03369140625 -LED, R12_FSU, LDV, 2030, 4538.396484375 -LED, R12_FSU, LDV, 2035, 4730.9658203125 -LED, R12_FSU, LDV, 2040, 4887.07568359375 -LED, R12_FSU, LDV, 2045, 5017.23876953125 -LED, R12_FSU, LDV, 2050, 5095.30908203125 -LED, R12_FSU, LDV, 2055, 5278.33544921875 -LED, R12_FSU, LDV, 2060, 5469.8427734375 -LED, R12_FSU, LDV, 2070, 5910.66552734375 -LED, R12_FSU, LDV, 2080, 6197.462524414063 -LED, R12_FSU, LDV, 2090, 6484.259521484375 -LED, R12_FSU, LDV, 2100, 6771.056518554688 -LED, R12_FSU, LDV, 2110, 7057.853515625 -LED, R12_FSU, RAIL, 2020, 1104 -LED, R12_FSU, RAIL, 2025, 1169.922119140625 -LED, R12_FSU, RAIL, 2030, 1212.768920898438 -LED, R12_FSU, RAIL, 2035, 1275.5380859375 -LED, R12_FSU, RAIL, 2040, 1338.635131835938 -LED, R12_FSU, RAIL, 2045, 1403.690185546875 -LED, R12_FSU, RAIL, 2050, 1463.303344726563 -LED, R12_FSU, RAIL, 2055, 1561.185302734375 -LED, R12_FSU, RAIL, 2060, 1670.509887695313 -LED, R12_FSU, RAIL, 2070, 1935.555419921875 -LED, R12_FSU, RAIL, 2080, 2232.322204589844 -LED, R12_FSU, RAIL, 2090, 2529.088989257813 -LED, R12_FSU, RAIL, 2100, 2825.855773925781 -LED, R12_FSU, RAIL, 2110, 3122.62255859375 -LED, R12_LAM, 2W, 2020, 282.8282775878906 -LED, R12_LAM, 2W, 2025, 286.2074584960938 -LED, R12_LAM, 2W, 2030, 282.4873352050781 -LED, R12_LAM, 2W, 2035, 279.4727478027344 -LED, R12_LAM, 2W, 2040, 275.1729736328125 -LED, R12_LAM, 2W, 2045, 269.4774475097656 -LED, R12_LAM, 2W, 2050, 262.18310546875 -LED, R12_LAM, 2W, 2055, 263.8370971679688 -LED, R12_LAM, 2W, 2060, 266.1383056640625 -LED, R12_LAM, 2W, 2070, 271.2558898925781 -LED, R12_LAM, 2W, 2080, 271.85546875 -LED, R12_LAM, 2W, 2090, 251.2715301513672 -LED, R12_LAM, 2W, 2100, 230.6875915527344 -LED, R12_LAM, 2W, 2110, 210.1036529541016 -LED, R12_LAM, AIR, 2020, 565.6565551757813 -LED, R12_LAM, AIR, 2025, 735.6473388671875 -LED, R12_LAM, AIR, 2030, 827.42236328125 -LED, R12_LAM, AIR, 2035, 1004.716003417969 -LED, R12_LAM, AIR, 2040, 1222.008178710938 -LED, R12_LAM, AIR, 2045, 1449.386474609375 -LED, R12_LAM, AIR, 2050, 1641.39111328125 -LED, R12_LAM, AIR, 2055, 1849.807373046875 -LED, R12_LAM, AIR, 2060, 2017.488647460938 -LED, R12_LAM, AIR, 2070, 2236.770263671875 -LED, R12_LAM, AIR, 2080, 2258.97119140625 -LED, R12_LAM, AIR, 2090, 1954.243733723945 -LED, R12_LAM, AIR, 2100, 1649.516276041657 -LED, R12_LAM, AIR, 2110, 1344.788818359375 -LED, R12_LAM, BUS, 2020, 2545.45458984375 -LED, R12_LAM, BUS, 2025, 2786.744873046875 -LED, R12_LAM, BUS, 2030, 2891.935546875 -LED, R12_LAM, BUS, 2035, 3045.83984375 -LED, R12_LAM, BUS, 2040, 3186.902587890625 -LED, R12_LAM, BUS, 2045, 3298.92919921875 -LED, R12_LAM, BUS, 2050, 3370.6728515625 -LED, R12_LAM, BUS, 2055, 3545.942626953125 -LED, R12_LAM, BUS, 2060, 3729.000732421875 -LED, R12_LAM, BUS, 2070, 4128.44189453125 -LED, R12_LAM, BUS, 2080, 4522.92333984375 -LED, R12_LAM, BUS, 2090, 4753.619466145823 -LED, R12_LAM, BUS, 2100, 4984.31559244791 -LED, R12_LAM, BUS, 2110, 5215.01171875 -LED, R12_LAM, LDV, 2020, 3535.353515625 -LED, R12_LAM, LDV, 2025, 3930.378173828125 -LED, R12_LAM, LDV, 2030, 4112.67919921875 -LED, R12_LAM, LDV, 2035, 4367.9443359375 -LED, R12_LAM, LDV, 2040, 4596.90087890625 -LED, R12_LAM, LDV, 2045, 4772.05322265625 -LED, R12_LAM, LDV, 2050, 4876.01953125 -LED, R12_LAM, LDV, 2055, 5118.28955078125 -LED, R12_LAM, LDV, 2060, 5361.18701171875 -LED, R12_LAM, LDV, 2070, 5864.5927734375 -LED, R12_LAM, LDV, 2080, 6320.58740234375 -LED, R12_LAM, LDV, 2090, 6471.947265625 -LED, R12_LAM, LDV, 2100, 6623.30712890625 -LED, R12_LAM, LDV, 2110, 6774.6669921875 -LED, R12_LAM, RAIL, 2020, 70.70706939697266 -LED, R12_LAM, RAIL, 2025, 101.3513946533203 -LED, R12_LAM, RAIL, 2030, 135.6485595703125 -LED, R12_LAM, RAIL, 2035, 178.9000549316406 -LED, R12_LAM, RAIL, 2040, 231.2867889404297 -LED, R12_LAM, RAIL, 2045, 293.3609924316406 -LED, R12_LAM, RAIL, 2050, 364.7527465820313 -LED, R12_LAM, RAIL, 2055, 463.671142578125 -LED, R12_LAM, RAIL, 2060, 585.005615234375 -LED, R12_LAM, RAIL, 2070, 913.465087890625 -LED, R12_LAM, RAIL, 2080, 1376.701171875 -LED, R12_LAM, RAIL, 2090, 2148.289306640625 -LED, R12_LAM, RAIL, 2100, 2919.87744140625 -LED, R12_LAM, RAIL, 2110, 3691.465576171875 -LED, R12_MEA, 2W, 2020, 325 -LED, R12_MEA, 2W, 2025, 309.3935852050781 -LED, R12_MEA, 2W, 2030, 290.0323486328125 -LED, R12_MEA, 2W, 2035, 275.7249755859375 -LED, R12_MEA, 2W, 2040, 261.1125793457031 -LED, R12_MEA, 2W, 2045, 245.8060607910156 -LED, R12_MEA, 2W, 2050, 230.0397186279297 -LED, R12_MEA, 2W, 2055, 222.7287139892578 -LED, R12_MEA, 2W, 2060, 217.0582427978516 -LED, R12_MEA, 2W, 2070, 208.9363403320313 -LED, R12_MEA, 2W, 2080, 200.7229919433594 -LED, R12_MEA, 2W, 2090, 191.5786895751953 -LED, R12_MEA, 2W, 2100, 182.4480590820313 -LED, R12_MEA, 2W, 2110, 173.3174285888672 -LED, R12_MEA, AIR, 2020, 715 -LED, R12_MEA, AIR, 2025, 811.0345458984375 -LED, R12_MEA, AIR, 2030, 866.2398071289063 -LED, R12_MEA, AIR, 2035, 1009.560485839844 -LED, R12_MEA, AIR, 2040, 1169.415283203125 -LED, R12_MEA, AIR, 2045, 1311.547729492188 -LED, R12_MEA, AIR, 2050, 1412.296020507813 -LED, R12_MEA, AIR, 2055, 1529.393188476563 -LED, R12_MEA, AIR, 2060, 1625.591064453125 -LED, R12_MEA, AIR, 2070, 1743.287475585938 -LED, R12_MEA, AIR, 2080, 1727.888305664063 -LED, R12_MEA, AIR, 2090, 1626.22509765625 -LED, R12_MEA, AIR, 2100, 1473.895202636719 -LED, R12_MEA, AIR, 2110, 1321.565307617188 -LED, R12_MEA, BUS, 2020, 2470 -LED, R12_MEA, BUS, 2025, 2607.65673828125 -LED, R12_MEA, BUS, 2030, 2721.515869140625 -LED, R12_MEA, BUS, 2035, 2853.24853515625 -LED, R12_MEA, BUS, 2040, 2981.913330078125 -LED, R12_MEA, BUS, 2045, 3100.300048828125 -LED, R12_MEA, BUS, 2050, 3201.980224609375 -LED, R12_MEA, BUS, 2055, 3413.56201171875 -LED, R12_MEA, BUS, 2060, 3651.654296875 -LED, R12_MEA, BUS, 2070, 4189.3310546875 -LED, R12_MEA, BUS, 2080, 4719.53759765625 -LED, R12_MEA, BUS, 2090, 5198.80126953125 -LED, R12_MEA, BUS, 2100, 5596.095703125 -LED, R12_MEA, BUS, 2110, 5993.39013671875 -LED, R12_MEA, LDV, 2020, 2892.5 -LED, R12_MEA, LDV, 2025, 3195.59765625 -LED, R12_MEA, LDV, 2030, 3398.48291015625 -LED, R12_MEA, LDV, 2035, 3685.160888671875 -LED, R12_MEA, LDV, 2040, 3934.196044921875 -LED, R12_MEA, LDV, 2045, 4116.05859375 -LED, R12_MEA, LDV, 2050, 4225.421875 -LED, R12_MEA, LDV, 2055, 4443.24365234375 -LED, R12_MEA, LDV, 2060, 4665.5712890625 -LED, R12_MEA, LDV, 2070, 5120.501953125 -LED, R12_MEA, LDV, 2080, 5512.27001953125 -LED, R12_MEA, LDV, 2090, 5838.9599609375 -LED, R12_MEA, LDV, 2100, 6135.256591796875 -LED, R12_MEA, LDV, 2110, 6431.55322265625 -LED, R12_MEA, RAIL, 2020, 97.5 -LED, R12_MEA, RAIL, 2025, 142.3753051757813 -LED, R12_MEA, RAIL, 2030, 189.6556549072266 -LED, R12_MEA, RAIL, 2035, 246.8369445800781 -LED, R12_MEA, RAIL, 2040, 311.0320129394531 -LED, R12_MEA, RAIL, 2045, 380.7235412597656 -LED, R12_MEA, RAIL, 2050, 454.429443359375 -LED, R12_MEA, RAIL, 2055, 552.5182495117188 -LED, R12_MEA, RAIL, 2060, 667.4610595703125 -LED, R12_MEA, RAIL, 2070, 956.4922485351563 -LED, R12_MEA, RAIL, 2080, 1321.978515625 -LED, R12_MEA, RAIL, 2090, 1773.24560546875 -LED, R12_MEA, RAIL, 2100, 2409.940551757813 -LED, R12_MEA, RAIL, 2110, 3046.635498046875 -LED, R12_NAM, 2W, 2020, 155 -LED, R12_NAM, 2W, 2025, 158.0689180162217 -LED, R12_NAM, 2W, 2030, 161.1378360324436 -LED, R12_NAM, 2W, 2035, 164.2067540486653 -LED, R12_NAM, 2W, 2040, 167.275672064887 -LED, R12_NAM, 2W, 2045, 170.3445900811089 -LED, R12_NAM, 2W, 2050, 173.4135080973306 -LED, R12_NAM, 2W, 2055, 176.4824261135525 -LED, R12_NAM, 2W, 2060, 179.5513441297742 -LED, R12_NAM, 2W, 2070, 185.6891801622178 -LED, R12_NAM, 2W, 2080, 191.8270161946614 -LED, R12_NAM, 2W, 2090, 197.964852227105 -LED, R12_NAM, 2W, 2100, 204.1026882595486 -LED, R12_NAM, 2W, 2110, 210.2405242919922 -LED, R12_NAM, AIR, 2020, 3720 -LED, R12_NAM, AIR, 2025, 3650.185384114582 -LED, R12_NAM, AIR, 2030, 3580.370768229168 -LED, R12_NAM, AIR, 2035, 3510.55615234375 -LED, R12_NAM, AIR, 2040, 3440.741536458332 -LED, R12_NAM, AIR, 2045, 3370.926920572918 -LED, R12_NAM, AIR, 2050, 3301.1123046875 -LED, R12_NAM, AIR, 2055, 3231.297688802082 -LED, R12_NAM, AIR, 2060, 3161.483072916668 -LED, R12_NAM, AIR, 2070, 3021.853841145832 -LED, R12_NAM, AIR, 2080, 2882.224609375 -LED, R12_NAM, AIR, 2090, 2742.595377604168 -LED, R12_NAM, AIR, 2100, 2602.966145833332 -LED, R12_NAM, AIR, 2110, 2463.3369140625 -LED, R12_NAM, BUS, 2020, 1860 -LED, R12_NAM, BUS, 2025, 2166.510199652766 -LED, R12_NAM, BUS, 2030, 2473.020399305547 -LED, R12_NAM, BUS, 2035, 2779.530598958328 -LED, R12_NAM, BUS, 2040, 3086.040798611109 -LED, R12_NAM, BUS, 2045, 3392.550998263891 -LED, R12_NAM, BUS, 2050, 3699.061197916657 -LED, R12_NAM, BUS, 2055, 4005.571397569438 -LED, R12_NAM, BUS, 2060, 4312.081597222219 -LED, R12_NAM, BUS, 2070, 4925.101996527766 -LED, R12_NAM, BUS, 2080, 5538.122395833328 -LED, R12_NAM, BUS, 2090, 6151.142795138891 -LED, R12_NAM, BUS, 2100, 6764.163194444438 -LED, R12_NAM, BUS, 2110, 7377.18359375 -LED, R12_NAM, LDV, 2020, 24955 -LED, R12_NAM, LDV, 2025, 24002.29402669269 -LED, R12_NAM, LDV, 2030, 23049.58805338544 -LED, R12_NAM, LDV, 2035, 22096.88208007813 -LED, R12_NAM, LDV, 2040, 21144.17610677081 -LED, R12_NAM, LDV, 2045, 20191.47013346356 -LED, R12_NAM, LDV, 2050, 19238.76416015625 -LED, R12_NAM, LDV, 2055, 18286.05818684894 -LED, R12_NAM, LDV, 2060, 17333.35221354169 -LED, R12_NAM, LDV, 2070, 15427.94026692706 -LED, R12_NAM, LDV, 2080, 13522.5283203125 -LED, R12_NAM, LDV, 2090, 11617.11637369794 -LED, R12_NAM, LDV, 2100, 9711.704427083314 -LED, R12_NAM, LDV, 2110, 7806.29248046875 -LED, R12_NAM, RAIL, 2020, 310 -LED, R12_NAM, RAIL, 2025, 504.2324490017345 -LED, R12_NAM, RAIL, 2030, 698.464898003469 -LED, R12_NAM, RAIL, 2035, 892.6973470052035 -LED, R12_NAM, RAIL, 2040, 1086.929796006938 -LED, R12_NAM, RAIL, 2045, 1281.162245008672 -LED, R12_NAM, RAIL, 2050, 1475.394694010407 -LED, R12_NAM, RAIL, 2055, 1669.627143012156 -LED, R12_NAM, RAIL, 2060, 1863.859592013891 -LED, R12_NAM, RAIL, 2070, 2252.324490017359 -LED, R12_NAM, RAIL, 2080, 2640.789388020828 -LED, R12_NAM, RAIL, 2090, 3029.254286024297 -LED, R12_NAM, RAIL, 2100, 3417.719184027781 -LED, R12_NAM, RAIL, 2110, 3806.18408203125 -LED, R12_PAO, 2W, 2020, 140 -LED, R12_PAO, 2W, 2025, 143.0917561848958 -LED, R12_PAO, 2W, 2030, 146.1835123697917 -LED, R12_PAO, 2W, 2035, 149.2752685546875 -LED, R12_PAO, 2W, 2040, 152.3670247395833 -LED, R12_PAO, 2W, 2045, 155.4587809244792 -LED, R12_PAO, 2W, 2050, 158.550537109375 -LED, R12_PAO, 2W, 2055, 161.6422932942708 -LED, R12_PAO, 2W, 2060, 164.7340494791667 -LED, R12_PAO, 2W, 2070, 170.9175618489583 -LED, R12_PAO, 2W, 2080, 177.10107421875 -LED, R12_PAO, 2W, 2090, 183.2845865885417 -LED, R12_PAO, 2W, 2100, 189.4680989583333 -LED, R12_PAO, 2W, 2110, 195.651611328125 -LED, R12_PAO, AIR, 2020, 1820 -LED, R12_PAO, AIR, 2025, 1805.779934353299 -LED, R12_PAO, AIR, 2030, 1791.559868706597 -LED, R12_PAO, AIR, 2035, 1777.339803059896 -LED, R12_PAO, AIR, 2040, 1763.119737413194 -LED, R12_PAO, AIR, 2045, 1748.899671766493 -LED, R12_PAO, AIR, 2050, 1734.679606119792 -LED, R12_PAO, AIR, 2055, 1720.45954047309 -LED, R12_PAO, AIR, 2060, 1706.239474826389 -LED, R12_PAO, AIR, 2070, 1677.799343532986 -LED, R12_PAO, AIR, 2080, 1649.359212239583 -LED, R12_PAO, AIR, 2090, 1620.919080946181 -LED, R12_PAO, AIR, 2100, 1592.478949652777 -LED, R12_PAO, AIR, 2110, 1564.038818359375 -LED, R12_PAO, BUS, 2020, 700 -LED, R12_PAO, BUS, 2025, 938.3261990017345 -LED, R12_PAO, BUS, 2030, 1176.652398003469 -LED, R12_PAO, BUS, 2035, 1414.978597005203 -LED, R12_PAO, BUS, 2040, 1653.304796006938 -LED, R12_PAO, BUS, 2045, 1891.630995008687 -LED, R12_PAO, BUS, 2050, 2129.957194010422 -LED, R12_PAO, BUS, 2055, 2368.283393012156 -LED, R12_PAO, BUS, 2060, 2606.609592013891 -LED, R12_PAO, BUS, 2070, 3083.261990017359 -LED, R12_PAO, BUS, 2080, 3559.914388020828 -LED, R12_PAO, BUS, 2090, 4036.566786024312 -LED, R12_PAO, BUS, 2100, 4513.219184027781 -LED, R12_PAO, BUS, 2110, 4989.87158203125 -LED, R12_PAO, LDV, 2020, 8120 -LED, R12_PAO, LDV, 2025, 7951.610215928813 -LED, R12_PAO, LDV, 2030, 7783.220431857626 -LED, R12_PAO, LDV, 2035, 7614.830647786453 -LED, R12_PAO, LDV, 2040, 7446.440863715266 -LED, R12_PAO, LDV, 2045, 7278.051079644094 -LED, R12_PAO, LDV, 2050, 7109.661295572907 -LED, R12_PAO, LDV, 2055, 6941.271511501734 -LED, R12_PAO, LDV, 2060, 6772.881727430547 -LED, R12_PAO, LDV, 2070, 6436.102159288188 -LED, R12_PAO, LDV, 2080, 6099.322591145828 -LED, R12_PAO, LDV, 2090, 5762.543023003469 -LED, R12_PAO, LDV, 2100, 5425.763454861109 -LED, R12_PAO, LDV, 2110, 5088.98388671875 -LED, R12_PAO, RAIL, 2020, 3220 -LED, R12_PAO, RAIL, 2025, 3520.6865234375 -LED, R12_PAO, RAIL, 2030, 3821.373046875 -LED, R12_PAO, RAIL, 2035, 4122.0595703125 -LED, R12_PAO, RAIL, 2040, 4422.74609375 -LED, R12_PAO, RAIL, 2045, 4723.4326171875 -LED, R12_PAO, RAIL, 2050, 5024.119140625 -LED, R12_PAO, RAIL, 2055, 5324.8056640625 -LED, R12_PAO, RAIL, 2060, 5625.4921875 -LED, R12_PAO, RAIL, 2070, 6226.865234375 -LED, R12_PAO, RAIL, 2080, 6828.23828125 -LED, R12_PAO, RAIL, 2090, 7429.611328125 -LED, R12_PAO, RAIL, 2100, 8030.984375 -LED, R12_PAO, RAIL, 2110, 8632.357421875 -LED, R12_PAS, 2W, 2020, 480 -LED, R12_PAS, 2W, 2025, 458.1196899414063 -LED, R12_PAS, 2W, 2030, 430.0098571777344 -LED, R12_PAS, 2W, 2035, 411.6322021484375 -LED, R12_PAS, 2W, 2040, 394.9012451171875 -LED, R12_PAS, 2W, 2045, 380.2506125313891 -LED, R12_PAS, 2W, 2050, 365.5999799455913 -LED, R12_PAS, 2W, 2055, 350.949347359794 -LED, R12_PAS, 2W, 2060, 336.2987147739956 -LED, R12_PAS, 2W, 2070, 306.9974496023999 -LED, R12_PAS, 2W, 2080, 277.6961844308034 -LED, R12_PAS, 2W, 2090, 248.3949192592081 -LED, R12_PAS, 2W, 2100, 219.0936540876119 -LED, R12_PAS, 2W, 2110, 189.7923889160156 -LED, R12_PAS, AIR, 2020, 560 -LED, R12_PAS, AIR, 2025, 684.7786254882813 -LED, R12_PAS, AIR, 2030, 768.150634765625 -LED, R12_PAS, AIR, 2035, 914.1795043945313 -LED, R12_PAS, AIR, 2040, 1063.96484375 -LED, R12_PAS, AIR, 2045, 1067.016357421875 -LED, R12_PAS, AIR, 2050, 1070.06787109375 -LED, R12_PAS, AIR, 2055, 1073.119384765625 -LED, R12_PAS, AIR, 2060, 1076.1708984375 -LED, R12_PAS, AIR, 2070, 1082.27392578125 -LED, R12_PAS, AIR, 2080, 1088.376953125 -LED, R12_PAS, AIR, 2090, 1094.47998046875 -LED, R12_PAS, AIR, 2100, 1100.5830078125 -LED, R12_PAS, AIR, 2110, 1106.68603515625 -LED, R12_PAS, BUS, 2020, 3360 -LED, R12_PAS, BUS, 2025, 3544.082763671875 -LED, R12_PAS, BUS, 2030, 3699.73046875 -LED, R12_PAS, BUS, 2035, 3910.91015625 -LED, R12_PAS, BUS, 2040, 4138.5869140625 -LED, R12_PAS, BUS, 2045, 4182.387625558036 -LED, R12_PAS, BUS, 2050, 4226.188337053567 -LED, R12_PAS, BUS, 2055, 4269.989048549104 -LED, R12_PAS, BUS, 2060, 4313.789760044642 -LED, R12_PAS, BUS, 2070, 4401.391183035711 -LED, R12_PAS, BUS, 2080, 4488.992606026786 -LED, R12_PAS, BUS, 2090, 4576.594029017852 -LED, R12_PAS, BUS, 2100, 4664.195452008924 -LED, R12_PAS, BUS, 2110, 4751.796875 -LED, R12_PAS, LDV, 2020, 2960 -LED, R12_PAS, LDV, 2025, 3326.063232421875 -LED, R12_PAS, LDV, 2030, 3559.348876953125 -LED, R12_PAS, LDV, 2035, 3860.884033203125 -LED, R12_PAS, LDV, 2040, 4127.01611328125 -LED, R12_PAS, LDV, 2045, 4118.852975027899 -LED, R12_PAS, LDV, 2050, 4110.689836774555 -LED, R12_PAS, LDV, 2055, 4102.526698521206 -LED, R12_PAS, LDV, 2060, 4094.363560267857 -LED, R12_PAS, LDV, 2070, 4078.037283761163 -LED, R12_PAS, LDV, 2080, 4061.711007254462 -LED, R12_PAS, LDV, 2090, 4045.384730747769 -LED, R12_PAS, LDV, 2100, 4029.05845424107 -LED, R12_PAS, LDV, 2110, 4012.732177734375 -LED, R12_PAS, RAIL, 2020, 640 -LED, R12_PAS, RAIL, 2025, 823.7437744140625 -LED, R12_PAS, RAIL, 2030, 1012.065612792969 -LED, R12_PAS, RAIL, 2035, 1248.428100585938 -LED, R12_PAS, RAIL, 2040, 1518.686889648438 -LED, R12_PAS, RAIL, 2045, 1986.467555454816 -LED, R12_PAS, RAIL, 2050, 2454.248221261165 -LED, R12_PAS, RAIL, 2055, 2922.028887067543 -LED, R12_PAS, RAIL, 2060, 3389.809552873892 -LED, R12_PAS, RAIL, 2070, 4325.37088448662 -LED, R12_PAS, RAIL, 2080, 5260.932216099347 -LED, R12_PAS, RAIL, 2090, 6196.493547712074 -LED, R12_PAS, RAIL, 2100, 7132.054879324773 -LED, R12_PAS, RAIL, 2110, 8067.6162109375 -LED, R12_RCPA, 2W, 2020, 404.2105407714844 -LED, R12_RCPA, 2W, 2025, 414.9268798828125 -LED, R12_RCPA, 2W, 2030, 407.9371948242188 -LED, R12_RCPA, 2W, 2035, 402.6095275878906 -LED, R12_RCPA, 2W, 2040, 387.3960571289063 -LED, R12_RCPA, 2W, 2045, 369.0240173339844 -LED, R12_RCPA, 2W, 2050, 351.553955078125 -LED, R12_RCPA, 2W, 2055, 337.7495727539063 -LED, R12_RCPA, 2W, 2060, 326.2267150878906 -LED, R12_RCPA, 2W, 2070, 306.1537475585938 -LED, R12_RCPA, 2W, 2080, 280.5527954101563 -LED, R12_RCPA, 2W, 2090, 247.1678314208984 -LED, R12_RCPA, 2W, 2100, 210.7655944824219 -LED, R12_RCPA, 2W, 2110, 173.7719421386719 -LED, R12_RCPA, AIR, 2020, 555.7894897460938 -LED, R12_RCPA, AIR, 2025, 743.0111694335938 -LED, R12_RCPA, AIR, 2030, 930.9291381835938 -LED, R12_RCPA, AIR, 2035, 1326.715698242188 -LED, R12_RCPA, AIR, 2040, 1783.211547851563 -LED, R12_RCPA, AIR, 2045, 2229.323974609375 -LED, R12_RCPA, AIR, 2050, 2606.019287109375 -LED, R12_RCPA, AIR, 2055, 2906.51513671875 -LED, R12_RCPA, AIR, 2060, 3103.987548828125 -LED, R12_RCPA, AIR, 2070, 3194.685791015625 -LED, R12_RCPA, AIR, 2080, 2868.885986328125 -LED, R12_RCPA, AIR, 2090, 2290.062744140625 -LED, R12_RCPA, AIR, 2100, 1653.263427734375 -LED, R12_RCPA, AIR, 2110, 1039.301025390625 -LED, R12_RCPA, BUS, 2020, 1515.789428710938 -LED, R12_RCPA, BUS, 2025, 1629.23681640625 -LED, R12_RCPA, BUS, 2030, 1721.99365234375 -LED, R12_RCPA, BUS, 2035, 1828.951171875 -LED, R12_RCPA, BUS, 2040, 1935.412353515625 -LED, R12_RCPA, BUS, 2045, 2055.260986328125 -LED, R12_RCPA, BUS, 2050, 2197.220703125 -LED, R12_RCPA, BUS, 2055, 2374.310302734375 -LED, R12_RCPA, BUS, 2060, 2579.6640625 -LED, R12_RCPA, BUS, 2070, 3053.27783203125 -LED, R12_RCPA, BUS, 2080, 3509.964599609375 -LED, R12_RCPA, BUS, 2090, 3870.932373046875 -LED, R12_RCPA, BUS, 2100, 4151.50732421875 -LED, R12_RCPA, BUS, 2110, 4366.8251953125 -LED, R12_RCPA, LDV, 2020, 808.4210815429688 -LED, R12_RCPA, LDV, 2025, 1097.541748046875 -LED, R12_RCPA, LDV, 2030, 1367.50927734375 -LED, R12_RCPA, LDV, 2035, 1711.939086914063 -LED, R12_RCPA, LDV, 2040, 2008.4580078125 -LED, R12_RCPA, LDV, 2045, 2250.578857421875 -LED, R12_RCPA, LDV, 2050, 2452.979248046875 -LED, R12_RCPA, LDV, 2055, 2643.797607421875 -LED, R12_RCPA, LDV, 2060, 2823.57275390625 -LED, R12_RCPA, LDV, 2070, 3150.21337890625 -LED, R12_RCPA, LDV, 2080, 3357.347412109375 -LED, R12_RCPA, LDV, 2090, 3411.498046875 -LED, R12_RCPA, LDV, 2100, 3362.686279296875 -LED, R12_RCPA, LDV, 2110, 3245.838623046875 -LED, R12_RCPA, RAIL, 2020, 1515.789428710938 -LED, R12_RCPA, RAIL, 2025, 1738.481689453125 -LED, R12_RCPA, RAIL, 2030, 1926.163818359375 -LED, R12_RCPA, RAIL, 2035, 2194.227294921875 -LED, R12_RCPA, RAIL, 2040, 2445.875244140625 -LED, R12_RCPA, RAIL, 2045, 2693.321044921875 -LED, R12_RCPA, RAIL, 2050, 2953.88330078125 -LED, R12_RCPA, RAIL, 2055, 3255.673828125 -LED, R12_RCPA, RAIL, 2060, 3595.763427734375 -LED, R12_RCPA, RAIL, 2070, 4385.31396484375 -LED, R12_RCPA, RAIL, 2080, 5200.6513671875 -LED, R12_RCPA, RAIL, 2090, 5951.83837890625 -LED, R12_RCPA, RAIL, 2100, 6684.755859375 -LED, R12_RCPA, RAIL, 2110, 7441.71923828125 -LED, R12_SAS, 2W, 2020, 960 -LED, R12_SAS, 2W, 2025, 1042.705688476563 -LED, R12_SAS, 2W, 2030, 1033.286499023438 -LED, R12_SAS, 2W, 2035, 1043.329223632813 -LED, R12_SAS, 2W, 2040, 1034.383911132813 -LED, R12_SAS, 2W, 2045, 1008.461791992188 -LED, R12_SAS, 2W, 2050, 968.4674072265625 -LED, R12_SAS, 2W, 2055, 921.1128540039063 -LED, R12_SAS, 2W, 2060, 870.3404541015625 -LED, R12_SAS, 2W, 2070, 764.25146484375 -LED, R12_SAS, 2W, 2080, 601.31005859375 -LED, R12_SAS, 2W, 2090, 438.36865234375 -LED, R12_SAS, 2W, 2100, 275.42724609375 -LED, R12_SAS, 2W, 2110, 112.48583984375 -LED, R12_SAS, AIR, 2020, 160 -LED, R12_SAS, AIR, 2025, 229.2143707275391 -LED, R12_SAS, AIR, 2030, 276.7423706054688 -LED, R12_SAS, AIR, 2035, 380.7820739746094 -LED, R12_SAS, AIR, 2040, 535.6256713867188 -LED, R12_SAS, AIR, 2045, 750.5457763671875 -LED, R12_SAS, AIR, 2050, 1003.810852050781 -LED, R12_SAS, AIR, 2055, 1265.242309570313 -LED, R12_SAS, AIR, 2060, 1504.76318359375 -LED, R12_SAS, AIR, 2070, 1866.3857421875 -LED, R12_SAS, AIR, 2080, 1731.321716308594 -LED, R12_SAS, AIR, 2090, 1596.257690429688 -LED, R12_SAS, AIR, 2100, 1461.193664550781 -LED, R12_SAS, AIR, 2110, 1326.129638671875 -LED, R12_SAS, BUS, 2020, 1360 -LED, R12_SAS, BUS, 2025, 1528.346069335938 -LED, R12_SAS, BUS, 2030, 1644.732421875 -LED, R12_SAS, BUS, 2035, 1800.5439453125 -LED, R12_SAS, BUS, 2040, 1971.516845703125 -LED, R12_SAS, BUS, 2045, 2163.057373046875 -LED, R12_SAS, BUS, 2050, 2375.59521484375 -LED, R12_SAS, BUS, 2055, 2613.25146484375 -LED, R12_SAS, BUS, 2060, 2878.544677734375 -LED, R12_SAS, BUS, 2070, 3503.318359375 -LED, R12_SAS, BUS, 2080, 3974.7138671875 -LED, R12_SAS, BUS, 2090, 4446.109375 -LED, R12_SAS, BUS, 2100, 4917.5048828125 -LED, R12_SAS, BUS, 2110, 5388.900390625 -LED, R12_SAS, LDV, 2020, 880 -LED, R12_SAS, LDV, 2025, 1251.051025390625 -LED, R12_SAS, LDV, 2030, 1543.258666992188 -LED, R12_SAS, LDV, 2035, 1972.933227539063 -LED, R12_SAS, LDV, 2040, 2451.87158203125 -LED, R12_SAS, LDV, 2045, 2945.735107421875 -LED, R12_SAS, LDV, 2050, 3407.176513671875 -LED, R12_SAS, LDV, 2055, 3826.67236328125 -LED, R12_SAS, LDV, 2060, 4210.865234375 -LED, R12_SAS, LDV, 2070, 4928.83935546875 -LED, R12_SAS, LDV, 2080, 5132.3271484375 -LED, R12_SAS, LDV, 2090, 5335.81494140625 -LED, R12_SAS, LDV, 2100, 5539.302734375 -LED, R12_SAS, LDV, 2110, 5742.79052734375 -LED, R12_SAS, RAIL, 2020, 640 -LED, R12_SAS, RAIL, 2025, 798.3440551757813 -LED, R12_SAS, RAIL, 2030, 911.1331787109375 -LED, R12_SAS, RAIL, 2035, 1087.655395507813 -LED, R12_SAS, RAIL, 2040, 1296.273315429688 -LED, R12_SAS, RAIL, 2045, 1535.967407226563 -LED, R12_SAS, RAIL, 2050, 1797.759033203125 -LED, R12_SAS, RAIL, 2055, 2082.95751953125 -LED, R12_SAS, RAIL, 2060, 2395.917236328125 -LED, R12_SAS, RAIL, 2070, 3136.677001953125 -LED, R12_SAS, RAIL, 2080, 3936.262145996094 -LED, R12_SAS, RAIL, 2090, 4735.847290039063 -LED, R12_SAS, RAIL, 2100, 5535.432434082031 -LED, R12_SAS, RAIL, 2110, 6335.017578125 -LED, R12_WEU, 2W, 2020, 300 -LED, R12_WEU, 2W, 2025, 294.1039962768555 -LED, R12_WEU, 2W, 2030, 288.2079925537109 -LED, R12_WEU, 2W, 2035, 282.3119888305664 -LED, R12_WEU, 2W, 2040, 276.4159851074219 -LED, R12_WEU, 2W, 2045, 270.5199813842773 -LED, R12_WEU, 2W, 2050, 264.6239776611328 -LED, R12_WEU, 2W, 2055, 258.7279739379883 -LED, R12_WEU, 2W, 2060, 252.8319702148438 -LED, R12_WEU, 2W, 2070, 241.0399627685547 -LED, R12_WEU, 2W, 2080, 229.2479553222656 -LED, R12_WEU, 2W, 2090, 217.4559478759766 -LED, R12_WEU, 2W, 2100, 205.6639404296875 -LED, R12_WEU, 2W, 2110, 193.8719329833984 -LED, R12_WEU, AIR, 2020, 1350 -LED, R12_WEU, AIR, 2025, 1359.249403211805 -LED, R12_WEU, AIR, 2030, 1368.49880642361 -LED, R12_WEU, AIR, 2035, 1377.748209635417 -LED, R12_WEU, AIR, 2040, 1386.997612847222 -LED, R12_WEU, AIR, 2045, 1396.247016059028 -LED, R12_WEU, AIR, 2050, 1405.496419270833 -LED, R12_WEU, AIR, 2055, 1414.74582248264 -LED, R12_WEU, AIR, 2060, 1423.995225694445 -LED, R12_WEU, AIR, 2070, 1442.494032118055 -LED, R12_WEU, AIR, 2080, 1460.992838541667 -LED, R12_WEU, AIR, 2090, 1479.491644965278 -LED, R12_WEU, AIR, 2100, 1497.99045138889 -LED, R12_WEU, AIR, 2110, 1516.4892578125 -LED, R12_WEU, BUS, 2020, 1050 -LED, R12_WEU, BUS, 2025, 1265.618136935766 -LED, R12_WEU, BUS, 2030, 1481.236273871531 -LED, R12_WEU, BUS, 2035, 1696.854410807297 -LED, R12_WEU, BUS, 2040, 1912.472547743062 -LED, R12_WEU, BUS, 2045, 2128.090684678828 -LED, R12_WEU, BUS, 2050, 2343.708821614593 -LED, R12_WEU, BUS, 2055, 2559.326958550359 -LED, R12_WEU, BUS, 2060, 2774.945095486124 -LED, R12_WEU, BUS, 2070, 3206.181369357641 -LED, R12_WEU, BUS, 2080, 3637.417643229172 -LED, R12_WEU, BUS, 2090, 4068.653917100703 -LED, R12_WEU, BUS, 2100, 4499.890190972234 -LED, R12_WEU, BUS, 2110, 4931.12646484375 -LED, R12_WEU, LDV, 2020, 10650 -LED, R12_WEU, LDV, 2025, 10349.64171006944 -LED, R12_WEU, LDV, 2030, 10049.28342013888 -LED, R12_WEU, LDV, 2035, 9748.925130208321 -LED, R12_WEU, LDV, 2040, 9448.566840277759 -LED, R12_WEU, LDV, 2045, 9148.208550347221 -LED, R12_WEU, LDV, 2050, 8847.850260416657 -LED, R12_WEU, LDV, 2055, 8547.491970486095 -LED, R12_WEU, LDV, 2060, 8247.133680555555 -LED, R12_WEU, LDV, 2070, 7646.417100694438 -LED, R12_WEU, LDV, 2080, 7045.700520833324 -LED, R12_WEU, LDV, 2090, 6444.983940972219 -LED, R12_WEU, LDV, 2100, 5844.267361111095 -LED, R12_WEU, LDV, 2110, 5243.55078125 -LED, R12_WEU, RAIL, 2020, 1650 -LED, R12_WEU, RAIL, 2025, 2030.9521484375 -LED, R12_WEU, RAIL, 2030, 2411.904296875 -LED, R12_WEU, RAIL, 2035, 2792.8564453125 -LED, R12_WEU, RAIL, 2040, 3173.80859375 -LED, R12_WEU, RAIL, 2045, 3554.7607421875 -LED, R12_WEU, RAIL, 2050, 3935.712890625 -LED, R12_WEU, RAIL, 2055, 4316.6650390625 -LED, R12_WEU, RAIL, 2060, 4697.6171875 -LED, R12_WEU, RAIL, 2070, 5459.521484375 -LED, R12_WEU, RAIL, 2080, 6221.42578125 -LED, R12_WEU, RAIL, 2090, 6983.330078125 -LED, R12_WEU, RAIL, 2100, 7745.234375 -LED, R12_WEU, RAIL, 2110, 8507.138671875 +# Projected passenger-distance travelled (PDT) per capita +# +# Units: km / year +# +scenario,node,technology,year,value +LED,R12_AFR,2020,2W,360 +LED,R12_AFR,2020,AIR,120 +LED,R12_AFR,2020,BUS,1740 +LED,R12_AFR,2020,LDV,720 +LED,R12_AFR,2020,RAIL,60 +LED,R12_AFR,2025,2W,355.6542051 +LED,R12_AFR,2025,AIR,122.9540528 +LED,R12_AFR,2025,BUS,1745.838841 +LED,R12_AFR,2025,LDV,813.0757299 +LED,R12_AFR,2025,RAIL,107.7461131 +LED,R12_AFR,2030,2W,361.0494758 +LED,R12_AFR,2030,AIR,131.1429028 +LED,R12_AFR,2030,BUS,1793.900233 +LED,R12_AFR,2030,LDV,946.142046 +LED,R12_AFR,2030,RAIL,165.1074214 +LED,R12_AFR,2035,2W,378.8524394 +LED,R12_AFR,2035,AIR,147.3268324 +LED,R12_AFR,2035,BUS,1897.937553 +LED,R12_AFR,2035,LDV,1145.53788 +LED,R12_AFR,2035,RAIL,240.6107073 +LED,R12_AFR,2040,2W,399.0339475 +LED,R12_AFR,2040,AIR,167.7804331 +LED,R12_AFR,2040,BUS,2019.730505 +LED,R12_AFR,2040,LDV,1396.666568 +LED,R12_AFR,2040,RAIL,335.9516493 +LED,R12_AFR,2045,2W,409.9774946 +LED,R12_AFR,2045,AIR,188.9429585 +LED,R12_AFR,2045,BUS,2100.543973 +LED,R12_AFR,2045,LDV,1670.541621 +LED,R12_AFR,2045,RAIL,445.3836397 +LED,R12_AFR,2050,2W,416.7879821 +LED,R12_AFR,2050,AIR,214.0599827 +LED,R12_AFR,2050,BUS,2166.962533 +LED,R12_AFR,2050,LDV,1992.389173 +LED,R12_AFR,2050,RAIL,575.3415005 +LED,R12_AFR,2055,2W,418.397962 +LED,R12_AFR,2055,AIR,244.4269305 +LED,R12_AFR,2055,BUS,2214.51666 +LED,R12_AFR,2055,LDV,2370.110951 +LED,R12_AFR,2055,RAIL,728.5347453 +LED,R12_AFR,2060,2W,413.2283756 +LED,R12_AFR,2060,AIR,281.138267 +LED,R12_AFR,2060,BUS,2236.458918 +LED,R12_AFR,2060,LDV,2806.933818 +LED,R12_AFR,2060,RAIL,906.1474053 +LED,R12_AFR,2070,2W,378.6988773 +LED,R12_AFR,2070,AIR,379.0649336 +LED,R12_AFR,2070,BUS,2184.767497 +LED,R12_AFR,2070,LDV,3853.939916 +LED,R12_AFR,2070,RAIL,1332.150965 +LED,R12_AFR,2080,2W,314.091288 +LED,R12_AFR,2080,AIR,519.0662183 +LED,R12_AFR,2080,BUS,2004.512811 +LED,R12_AFR,2080,LDV,5073.593505 +LED,R12_AFR,2080,RAIL,1830.118481 +LED,R12_AFR,2090,2W,234.107923 +LED,R12_AFR,2090,AIR,713.7585493 +LED,R12_AFR,2090,BUS,1740.249805 +LED,R12_AFR,2090,LDV,6359.950366 +LED,R12_AFR,2090,RAIL,2364.518971 +LED,R12_AFR,2100,2W,155.8269993 +LED,R12_AFR,2100,AIR,964.2162815 +LED,R12_AFR,2100,BUS,1452.801742 +LED,R12_AFR,2100,LDV,7602.680264 +LED,R12_AFR,2100,RAIL,2908.373366 +LED,R12_AFR,2110,2W,87.92869231 +LED,R12_AFR,2110,AIR,1143.018514 +LED,R12_AFR,2110,BUS,1174.260761 +LED,R12_AFR,2110,LDV,8508.541795 +LED,R12_AFR,2110,RAIL,3384.883888 +LED,R12_CHN,2020,2W,158 +LED,R12_CHN,2020,AIR,711 +LED,R12_CHN,2020,BUS,1501 +LED,R12_CHN,2020,LDV,3950 +LED,R12_CHN,2020,RAIL,1580 +LED,R12_CHN,2025,2W,163.7677239 +LED,R12_CHN,2025,AIR,995.1241286 +LED,R12_CHN,2025,BUS,1479.292912 +LED,R12_CHN,2025,LDV,4769.344481 +LED,R12_CHN,2025,RAIL,1787.692123 +LED,R12_CHN,2030,2W,163.4392749 +LED,R12_CHN,2030,AIR,1302.494982 +LED,R12_CHN,2030,BUS,1446.357219 +LED,R12_CHN,2030,LDV,5461.828731 +LED,R12_CHN,2030,RAIL,1955.411805 +LED,R12_CHN,2035,2W,159.9182805 +LED,R12_CHN,2035,AIR,1614.111393 +LED,R12_CHN,2035,BUS,1415.074826 +LED,R12_CHN,2035,LDV,6043.177768 +LED,R12_CHN,2035,RAIL,2099.171387 +LED,R12_CHN,2040,2W,154.8048132 +LED,R12_CHN,2040,AIR,1874.294817 +LED,R12_CHN,2040,BUS,1391.430665 +LED,R12_CHN,2040,LDV,6497.609252 +LED,R12_CHN,2040,RAIL,2223.575341 +LED,R12_CHN,2045,2W,149.326449 +LED,R12_CHN,2045,AIR,2142.875866 +LED,R12_CHN,2045,BUS,1371.181368 +LED,R12_CHN,2045,LDV,6928.955065 +LED,R12_CHN,2045,RAIL,2348.344419 +LED,R12_CHN,2050,2W,143.8521311 +LED,R12_CHN,2050,AIR,2418.333366 +LED,R12_CHN,2050,BUS,1354.929151 +LED,R12_CHN,2050,LDV,7348.126601 +LED,R12_CHN,2050,RAIL,2476.893569 +LED,R12_CHN,2055,2W,138.6036729 +LED,R12_CHN,2055,AIR,2683.115089 +LED,R12_CHN,2055,BUS,1343.409581 +LED,R12_CHN,2055,LDV,7753.760721 +LED,R12_CHN,2055,RAIL,2610.281261 +LED,R12_CHN,2060,2W,133.7933318 +LED,R12_CHN,2060,AIR,2958.420726 +LED,R12_CHN,2060,BUS,1336.529077 +LED,R12_CHN,2060,LDV,8175.443458 +LED,R12_CHN,2060,RAIL,2755.080126 +LED,R12_CHN,2070,2W,125.5897516 +LED,R12_CHN,2070,AIR,3425.076405 +LED,R12_CHN,2070,BUS,1337.463899 +LED,R12_CHN,2070,LDV,9029.08015 +LED,R12_CHN,2070,RAIL,3075.132467 +LED,R12_CHN,2080,2W,118.5998575 +LED,R12_CHN,2080,AIR,3637.552315 +LED,R12_CHN,2080,BUS,1347.780996 +LED,R12_CHN,2080,LDV,9834.650714 +LED,R12_CHN,2080,RAIL,3417.133572 +LED,R12_CHN,2090,2W,112.540252 +LED,R12_CHN,2090,AIR,3677.419939 +LED,R12_CHN,2090,BUS,1360.0393 +LED,R12_CHN,2090,LDV,10658.14245 +LED,R12_CHN,2090,RAIL,3790.057678 +LED,R12_CHN,2100,2W,107.0058554 +LED,R12_CHN,2100,AIR,3563.10739 +LED,R12_CHN,2100,BUS,1368.103569 +LED,R12_CHN,2100,LDV,11495.4287 +LED,R12_CHN,2100,RAIL,4188.514901 +LED,R12_CHN,2110,2W,102.3117315 +LED,R12_CHN,2110,AIR,3376.995898 +LED,R12_CHN,2110,BUS,1375.439218 +LED,R12_CHN,2110,LDV,12439.71371 +LED,R12_CHN,2110,RAIL,4641.145518 +LED,R12_EEU,2020,2W,136.0824742 +LED,R12_EEU,2020,AIR,136.0824742 +LED,R12_EEU,2020,BUS,4762.886598 +LED,R12_EEU,2020,LDV,6259.793814 +LED,R12_EEU,2020,RAIL,1905.154639 +LED,R12_EEU,2025,2W,142.4867401 +LED,R12_EEU,2025,AIR,282.5074999 +LED,R12_EEU,2025,BUS,4617.993067 +LED,R12_EEU,2025,LDV,7376.049921 +LED,R12_EEU,2025,RAIL,2179.412231 +LED,R12_EEU,2030,2W,146.7479764 +LED,R12_EEU,2030,AIR,496.3196521 +LED,R12_EEU,2030,BUS,4469.875132 +LED,R12_EEU,2030,LDV,8446.072289 +LED,R12_EEU,2030,RAIL,2451.755988 +LED,R12_EEU,2035,2W,148.2250577 +LED,R12_EEU,2035,AIR,744.3417105 +LED,R12_EEU,2035,BUS,4306.311677 +LED,R12_EEU,2035,LDV,9288.843233 +LED,R12_EEU,2035,RAIL,2692.290547 +LED,R12_EEU,2040,2W,148.0587794 +LED,R12_EEU,2040,AIR,1007.635277 +LED,R12_EEU,2040,BUS,4133.078652 +LED,R12_EEU,2040,LDV,9965.549192 +LED,R12_EEU,2040,RAIL,2910.883618 +LED,R12_EEU,2045,2W,146.6424614 +LED,R12_EEU,2045,AIR,1260.895279 +LED,R12_EEU,2045,BUS,3948.758457 +LED,R12_EEU,2045,LDV,10487.40664 +LED,R12_EEU,2045,RAIL,3106.50139 +LED,R12_EEU,2050,2W,144.6469617 +LED,R12_EEU,2050,AIR,1505.175707 +LED,R12_EEU,2050,BUS,3760.676459 +LED,R12_EEU,2050,LDV,10923.02222 +LED,R12_EEU,2050,RAIL,3290.338565 +LED,R12_EEU,2055,2W,142.4357174 +LED,R12_EEU,2055,AIR,1744.709225 +LED,R12_EEU,2055,BUS,3573.261511 +LED,R12_EEU,2055,LDV,11313.18544 +LED,R12_EEU,2055,RAIL,3469.56671 +LED,R12_EEU,2060,2W,140.2128544 +LED,R12_EEU,2060,AIR,1984.366512 +LED,R12_EEU,2060,BUS,3388.996828 +LED,R12_EEU,2060,LDV,11683.16055 +LED,R12_EEU,2060,RAIL,3649.112374 +LED,R12_EEU,2070,2W,135.8938347 +LED,R12_EEU,2070,AIR,2460.75882 +LED,R12_EEU,2070,BUS,3028.880582 +LED,R12_EEU,2070,LDV,12382.84684 +LED,R12_EEU,2070,RAIL,4012.32159 +LED,R12_EEU,2080,2W,131.3725904 +LED,R12_EEU,2080,AIR,2886.410556 +LED,R12_EEU,2080,BUS,2667.751165 +LED,R12_EEU,2080,LDV,12973.04617 +LED,R12_EEU,2080,RAIL,4362.260137 +LED,R12_EEU,2090,2W,126.7760918 +LED,R12_EEU,2090,AIR,3255.974718 +LED,R12_EEU,2090,BUS,2305.441627 +LED,R12_EEU,2090,LDV,13474.34053 +LED,R12_EEU,2090,RAIL,4698.304934 +LED,R12_EEU,2100,2W,122.3934675 +LED,R12_EEU,2100,AIR,3592.625473 +LED,R12_EEU,2100,BUS,1946.207879 +LED,R12_EEU,2100,LDV,13938.27688 +LED,R12_EEU,2100,RAIL,5031.643958 +LED,R12_EEU,2110,2W,118.3647098 +LED,R12_EEU,2110,AIR,3915.051387 +LED,R12_EEU,2110,BUS,1591.267895 +LED,R12_EEU,2110,LDV,14397.68197 +LED,R12_EEU,2110,RAIL,5370.974667 +LED,R12_FSU,2020,2W,99 +LED,R12_FSU,2020,AIR,990 +LED,R12_FSU,2020,BUS,2475 +LED,R12_FSU,2020,LDV,4752 +LED,R12_FSU,2020,RAIL,1584 +LED,R12_FSU,2025,2W,99.58353496 +LED,R12_FSU,2025,AIR,1075.911687 +LED,R12_FSU,2025,BUS,2432.374983 +LED,R12_FSU,2025,LDV,5220.485673 +LED,R12_FSU,2025,RAIL,1609.955214 +LED,R12_FSU,2030,2W,99.83756556 +LED,R12_FSU,2030,AIR,1188.391496 +LED,R12_FSU,2030,BUS,2382.65836 +LED,R12_FSU,2030,LDV,5740.841799 +LED,R12_FSU,2030,RAIL,1637.812825 +LED,R12_FSU,2035,2W,99.7810723 +LED,R12_FSU,2035,AIR,1350.263772 +LED,R12_FSU,2035,BUS,2324.791846 +LED,R12_FSU,2035,LDV,6341.437527 +LED,R12_FSU,2035,RAIL,1670.478072 +LED,R12_FSU,2040,2W,99.01962167 +LED,R12_FSU,2040,AIR,1508.447473 +LED,R12_FSU,2040,BUS,2267.302153 +LED,R12_FSU,2040,LDV,6917.666623 +LED,R12_FSU,2040,RAIL,1693.689906 +LED,R12_FSU,2045,2W,97.80176067 +LED,R12_FSU,2045,AIR,1652.74258 +LED,R12_FSU,2045,BUS,2212.772415 +LED,R12_FSU,2045,LDV,7462.662405 +LED,R12_FSU,2045,RAIL,1708.876919 +LED,R12_FSU,2050,2W,96.3523648 +LED,R12_FSU,2050,AIR,1787.18892 +LED,R12_FSU,2050,BUS,2161.307914 +LED,R12_FSU,2050,LDV,7991.636993 +LED,R12_FSU,2050,RAIL,1719.352506 +LED,R12_FSU,2055,2W,94.84094293 +LED,R12_FSU,2055,AIR,1937.224125 +LED,R12_FSU,2055,BUS,2111.714912 +LED,R12_FSU,2055,LDV,8544.322424 +LED,R12_FSU,2055,RAIL,1730.30295 +LED,R12_FSU,2060,2W,93.36628549 +LED,R12_FSU,2060,AIR,2115.546109 +LED,R12_FSU,2060,BUS,2064.966686 +LED,R12_FSU,2060,LDV,9139.080662 +LED,R12_FSU,2060,RAIL,1744.069397 +LED,R12_FSU,2070,2W,90.80437389 +LED,R12_FSU,2070,AIR,2481.654634 +LED,R12_FSU,2070,BUS,1988.312785 +LED,R12_FSU,2070,LDV,10390.25275 +LED,R12_FSU,2070,RAIL,1774.512312 +LED,R12_FSU,2080,2W,89.05954115 +LED,R12_FSU,2080,AIR,2761.115476 +LED,R12_FSU,2080,BUS,1934.719511 +LED,R12_FSU,2080,LDV,11684.23669 +LED,R12_FSU,2080,RAIL,1805.004033 +LED,R12_FSU,2090,2W,88.32975793 +LED,R12_FSU,2090,AIR,2944.966154 +LED,R12_FSU,2090,BUS,1899.2875 +LED,R12_FSU,2090,LDV,13092.47835 +LED,R12_FSU,2090,RAIL,1840.556191 +LED,R12_FSU,2100,2W,88.63057602 +LED,R12_FSU,2100,AIR,3025.587266 +LED,R12_FSU,2100,BUS,1876.691295 +LED,R12_FSU,2100,LDV,14669.63229 +LED,R12_FSU,2100,RAIL,1882.29362 +LED,R12_FSU,2110,2W,89.42770831 +LED,R12_FSU,2110,AIR,2946.834525 +LED,R12_FSU,2110,BUS,1851.279081 +LED,R12_FSU,2110,LDV,16333.99349 +LED,R12_FSU,2110,RAIL,1915.692096 +LED,R12_LAM,2020,2W,316 +LED,R12_LAM,2020,AIR,395 +LED,R12_LAM,2020,BUS,2844 +LED,R12_LAM,2020,LDV,3950 +LED,R12_LAM,2020,RAIL,395 +LED,R12_LAM,2025,2W,314.4528159 +LED,R12_LAM,2025,AIR,469.4591196 +LED,R12_LAM,2025,BUS,2823.463887 +LED,R12_LAM,2025,LDV,4565.365928 +LED,R12_LAM,2025,RAIL,454.3510629 +LED,R12_LAM,2030,2W,302.9449729 +LED,R12_LAM,2030,AIR,516.3241723 +LED,R12_LAM,2030,BUS,2774.780536 +LED,R12_LAM,2030,LDV,5020.337217 +LED,R12_LAM,2030,RAIL,504.2177809 +LED,R12_LAM,2035,2W,291.6920154 +LED,R12_LAM,2035,AIR,591.4423377 +LED,R12_LAM,2035,BUS,2716.716715 +LED,R12_LAM,2035,LDV,5594.918817 +LED,R12_LAM,2035,RAIL,562.437727 +LED,R12_LAM,2040,2W,278.8408478 +LED,R12_LAM,2040,AIR,693.7114575 +LED,R12_LAM,2040,BUS,2646.427519 +LED,R12_LAM,2040,LDV,6249.074254 +LED,R12_LAM,2040,RAIL,626.2809684 +LED,R12_LAM,2045,2W,264.054587 +LED,R12_LAM,2045,AIR,824.9999113 +LED,R12_LAM,2045,BUS,2566.2525 +LED,R12_LAM,2045,LDV,6955.447973 +LED,R12_LAM,2045,RAIL,694.0866836 +LED,R12_LAM,2050,2W,247.7013362 +LED,R12_LAM,2050,AIR,984.1676787 +LED,R12_LAM,2050,BUS,2481.307458 +LED,R12_LAM,2050,LDV,7682.872586 +LED,R12_LAM,2050,RAIL,764.3653763 +LED,R12_LAM,2055,2W,230.5802279 +LED,R12_LAM,2055,AIR,1169.903849 +LED,R12_LAM,2055,BUS,2396.886283 +LED,R12_LAM,2055,LDV,8413.373403 +LED,R12_LAM,2055,RAIL,836.7128346 +LED,R12_LAM,2060,2W,213.4592827 +LED,R12_LAM,2060,AIR,1377.448857 +LED,R12_LAM,2060,BUS,2317.185969 +LED,R12_LAM,2060,LDV,9134.312076 +LED,R12_LAM,2060,RAIL,911.1747129 +LED,R12_LAM,2070,2W,181.3884349 +LED,R12_LAM,2070,AIR,1837.212158 +LED,R12_LAM,2070,BUS,2180.812524 +LED,R12_LAM,2070,LDV,10552.63756 +LED,R12_LAM,2070,RAIL,1069.823837 +LED,R12_LAM,2080,2W,153.4180605 +LED,R12_LAM,2080,AIR,2275.571323 +LED,R12_LAM,2080,BUS,2075.603582 +LED,R12_LAM,2080,LDV,11930.16923 +LED,R12_LAM,2080,RAIL,1244.31941 +LED,R12_LAM,2090,2W,129.0597744 +LED,R12_LAM,2090,AIR,2619.612906 +LED,R12_LAM,2090,BUS,1987.84677 +LED,R12_LAM,2090,LDV,13289.35999 +LED,R12_LAM,2090,RAIL,1436.90967 +LED,R12_LAM,2100,2W,107.2023967 +LED,R12_LAM,2100,AIR,2848.417939 +LED,R12_LAM,2100,BUS,1900.725424 +LED,R12_LAM,2100,LDV,14648.767 +LED,R12_LAM,2100,RAIL,1647.350614 +LED,R12_LAM,2110,2W,87.04982361 +LED,R12_LAM,2110,AIR,2976.685983 +LED,R12_LAM,2110,BUS,1802.432556 +LED,R12_LAM,2110,LDV,16021.46509 +LED,R12_LAM,2110,RAIL,1874.8539 +LED,R12_MEA,2020,2W,204 +LED,R12_MEA,2020,AIR,680 +LED,R12_MEA,2020,BUS,2244 +LED,R12_MEA,2020,LDV,3536 +LED,R12_MEA,2020,RAIL,136 +LED,R12_MEA,2025,2W,200.3015198 +LED,R12_MEA,2025,AIR,738.9115402 +LED,R12_MEA,2025,BUS,2224.353729 +LED,R12_MEA,2025,LDV,3903.459408 +LED,R12_MEA,2025,RAIL,176.7186303 +LED,R12_MEA,2030,2W,196.3580125 +LED,R12_MEA,2030,AIR,827.8110642 +LED,R12_MEA,2030,BUS,2195.295754 +LED,R12_MEA,2030,LDV,4352.978949 +LED,R12_MEA,2030,RAIL,222.7456489 +LED,R12_MEA,2035,2W,190.5471097 +LED,R12_MEA,2035,AIR,928.2644365 +LED,R12_MEA,2035,BUS,2154.815033 +LED,R12_MEA,2035,LDV,4823.038869 +LED,R12_MEA,2035,RAIL,272.4447221 +LED,R12_MEA,2040,2W,183.1371838 +LED,R12_MEA,2040,AIR,1039.932769 +LED,R12_MEA,2040,BUS,2105.534618 +LED,R12_MEA,2040,LDV,5306.664351 +LED,R12_MEA,2040,RAIL,325.5179528 +LED,R12_MEA,2045,2W,174.4741493 +LED,R12_MEA,2045,AIR,1158.726988 +LED,R12_MEA,2045,BUS,2050.703051 +LED,R12_MEA,2045,LDV,5791.651878 +LED,R12_MEA,2045,RAIL,381.4992268 +LED,R12_MEA,2050,2W,165.0749241 +LED,R12_MEA,2050,AIR,1288.470805 +LED,R12_MEA,2050,BUS,1992.714114 +LED,R12_MEA,2050,LDV,6284.508748 +LED,R12_MEA,2050,RAIL,440.6579094 +LED,R12_MEA,2055,2W,155.350664 +LED,R12_MEA,2055,AIR,1436.841397 +LED,R12_MEA,2055,BUS,1933.348234 +LED,R12_MEA,2055,LDV,6796.941963 +LED,R12_MEA,2055,RAIL,503.6387957 +LED,R12_MEA,2060,2W,145.6028291 +LED,R12_MEA,2060,AIR,1605.594606 +LED,R12_MEA,2060,BUS,1874.961187 +LED,R12_MEA,2060,LDV,7330.350046 +LED,R12_MEA,2060,RAIL,570.8866423 +LED,R12_MEA,2070,2W,127.0794949 +LED,R12_MEA,2070,AIR,1968.558547 +LED,R12_MEA,2070,BUS,1771.436058 +LED,R12_MEA,2070,LDV,8432.066671 +LED,R12_MEA,2070,RAIL,719.2210721 +LED,R12_MEA,2080,2W,110.9240249 +LED,R12_MEA,2080,AIR,2275.648386 +LED,R12_MEA,2080,BUS,1693.519374 +LED,R12_MEA,2080,LDV,9561.616965 +LED,R12_MEA,2080,RAIL,889.1514791 +LED,R12_MEA,2090,2W,97.34240203 +LED,R12_MEA,2090,AIR,2466.824715 +LED,R12_MEA,2090,BUS,1638.867339 +LED,R12_MEA,2090,LDV,10777.04958 +LED,R12_MEA,2090,RAIL,1088.587637 +LED,R12_MEA,2100,2W,85.84339472 +LED,R12_MEA,2100,AIR,2507.034949 +LED,R12_MEA,2100,BUS,1600.054086 +LED,R12_MEA,2100,LDV,12139.46024 +LED,R12_MEA,2100,RAIL,1326.350359 +LED,R12_MEA,2110,2W,75.31011136 +LED,R12_MEA,2110,AIR,2328.74797 +LED,R12_MEA,2110,BUS,1558.447828 +LED,R12_MEA,2110,LDV,13572.76253 +LED,R12_MEA,2110,RAIL,1598.052992 +LED,R12_NAM,2020,2W,155 +LED,R12_NAM,2020,AIR,3720 +LED,R12_NAM,2020,BUS,1860 +LED,R12_NAM,2020,LDV,24955 +LED,R12_NAM,2020,RAIL,310 +LED,R12_NAM,2025,2W,156.0845896 +LED,R12_NAM,2025,AIR,4238.051667 +LED,R12_NAM,2025,BUS,1934.371387 +LED,R12_NAM,2025,LDV,25758.89717 +LED,R12_NAM,2025,RAIL,413.1351213 +LED,R12_NAM,2030,2W,156.0542162 +LED,R12_NAM,2030,AIR,4533.302763 +LED,R12_NAM,2030,BUS,2006.116619 +LED,R12_NAM,2030,LDV,26155.75524 +LED,R12_NAM,2030,RAIL,521.9498681 +LED,R12_NAM,2035,2W,155.4391337 +LED,R12_NAM,2035,AIR,4740.206932 +LED,R12_NAM,2035,BUS,2073.359043 +LED,R12_NAM,2035,LDV,26379.89003 +LED,R12_NAM,2035,RAIL,636.5494936 +LED,R12_NAM,2040,2W,154.3927079 +LED,R12_NAM,2040,AIR,4891.624861 +LED,R12_NAM,2040,BUS,2135.614624 +LED,R12_NAM,2040,LDV,26488.62213 +LED,R12_NAM,2040,RAIL,756.3874799 +LED,R12_NAM,2045,2W,154.178549 +LED,R12_NAM,2045,AIR,5045.582752 +LED,R12_NAM,2045,BUS,2209.474323 +LED,R12_NAM,2045,LDV,26717.04316 +LED,R12_NAM,2045,RAIL,887.6702635 +LED,R12_NAM,2050,2W,153.9505825 +LED,R12_NAM,2050,AIR,5180.304374 +LED,R12_NAM,2050,BUS,2283.320963 +LED,R12_NAM,2050,LDV,26925.82056 +LED,R12_NAM,2050,RAIL,1026.930161 +LED,R12_NAM,2055,2W,153.7613881 +LED,R12_NAM,2055,AIR,5312.002498 +LED,R12_NAM,2055,BUS,2357.495407 +LED,R12_NAM,2055,LDV,27137.06594 +LED,R12_NAM,2055,RAIL,1174.746765 +LED,R12_NAM,2060,2W,153.5851529 +LED,R12_NAM,2060,AIR,5435.785058 +LED,R12_NAM,2060,BUS,2431.661157 +LED,R12_NAM,2060,LDV,27342.76854 +LED,R12_NAM,2060,RAIL,1331.009312 +LED,R12_NAM,2070,2W,153.2154179 +LED,R12_NAM,2070,AIR,5654.820022 +LED,R12_NAM,2070,BUS,2578.824811 +LED,R12_NAM,2070,LDV,27725.0795 +LED,R12_NAM,2070,RAIL,1668.466401 +LED,R12_NAM,2080,2W,152.744378 +LED,R12_NAM,2080,AIR,5832.007222 +LED,R12_NAM,2080,BUS,2722.470955 +LED,R12_NAM,2080,LDV,28052.93775 +LED,R12_NAM,2080,RAIL,2037.914224 +LED,R12_NAM,2090,2W,152.3384514 +LED,R12_NAM,2090,AIR,6005.734686 +LED,R12_NAM,2090,BUS,2864.692043 +LED,R12_NAM,2090,LDV,28383.29218 +LED,R12_NAM,2090,RAIL,2442.36607 +LED,R12_NAM,2100,2W,151.9593958 +LED,R12_NAM,2100,AIR,6172.328764 +LED,R12_NAM,2100,BUS,3004.743965 +LED,R12_NAM,2100,LDV,28706.52113 +LED,R12_NAM,2100,RAIL,2881.913795 +LED,R12_NAM,2110,2W,151.4947615 +LED,R12_NAM,2110,AIR,6317.2287 +LED,R12_NAM,2110,BUS,3140.150571 +LED,R12_NAM,2110,LDV,28991.88125 +LED,R12_NAM,2110,RAIL,3353.904412 +LED,R12_PAO,2020,2W,148 +LED,R12_PAO,2020,AIR,1776 +LED,R12_PAO,2020,BUS,740 +LED,R12_PAO,2020,LDV,8732 +LED,R12_PAO,2020,RAIL,3404 +LED,R12_PAO,2025,2W,146.050908 +LED,R12_PAO,2025,AIR,2051.390116 +LED,R12_PAO,2025,BUS,769.4617156 +LED,R12_PAO,2025,LDV,9168.513062 +LED,R12_PAO,2025,RAIL,3535.270807 +LED,R12_PAO,2030,2W,142.9167887 +LED,R12_PAO,2030,AIR,2247.456 +LED,R12_PAO,2030,BUS,797.9568455 +LED,R12_PAO,2030,LDV,9456.064666 +LED,R12_PAO,2030,RAIL,3633.425179 +LED,R12_PAO,2035,2W,139.4512149 +LED,R12_PAO,2035,AIR,2451.629959 +LED,R12_PAO,2035,BUS,825.1714196 +LED,R12_PAO,2035,LDV,9719.300234 +LED,R12_PAO,2035,RAIL,3721.984973 +LED,R12_PAO,2040,2W,135.5836976 +LED,R12_PAO,2040,AIR,2630.082168 +LED,R12_PAO,2040,BUS,850.9143265 +LED,R12_PAO,2040,LDV,9926.171711 +LED,R12_PAO,2040,RAIL,3793.953416 +LED,R12_PAO,2045,2W,133.0853324 +LED,R12_PAO,2045,AIR,2831.027143 +LED,R12_PAO,2045,BUS,885.7438713 +LED,R12_PAO,2045,LDV,10219.99461 +LED,R12_PAO,2045,RAIL,3900.010147 +LED,R12_PAO,2050,2W,130.8673579 +LED,R12_PAO,2050,AIR,3027.720095 +LED,R12_PAO,2050,BUS,923.4803498 +LED,R12_PAO,2050,LDV,10522.59961 +LED,R12_PAO,2050,RAIL,4010.639576 +LED,R12_PAO,2055,2W,128.8533408 +LED,R12_PAO,2055,AIR,3207.825341 +LED,R12_PAO,2055,BUS,963.8280197 +LED,R12_PAO,2055,LDV,10824.3185 +LED,R12_PAO,2055,RAIL,4122.641001 +LED,R12_PAO,2060,2W,127.0231167 +LED,R12_PAO,2060,AIR,3372.915143 +LED,R12_PAO,2060,BUS,1006.614379 +LED,R12_PAO,2060,LDV,11127.73961 +LED,R12_PAO,2060,RAIL,4235.67404 +LED,R12_PAO,2070,2W,123.9174648 +LED,R12_PAO,2070,AIR,3675.827826 +LED,R12_PAO,2070,BUS,1099.658174 +LED,R12_PAO,2070,LDV,11759.46282 +LED,R12_PAO,2070,RAIL,4467.486612 +LED,R12_PAO,2080,2W,121.2298212 +LED,R12_PAO,2080,AIR,3924.244564 +LED,R12_PAO,2080,BUS,1200.561456 +LED,R12_PAO,2080,LDV,12399.023 +LED,R12_PAO,2080,RAIL,4694.872551 +LED,R12_PAO,2090,2W,118.7051447 +LED,R12_PAO,2090,AIR,4115.44228 +LED,R12_PAO,2090,BUS,1306.964401 +LED,R12_PAO,2090,LDV,13029.38616 +LED,R12_PAO,2090,RAIL,4907.448944 +LED,R12_PAO,2100,2W,116.2430014 +LED,R12_PAO,2100,AIR,4258.45958 +LED,R12_PAO,2100,BUS,1417.46614 +LED,R12_PAO,2100,LDV,13647.29188 +LED,R12_PAO,2100,RAIL,5100.477312 +LED,R12_PAO,2110,2W,114.0641201 +LED,R12_PAO,2110,AIR,4390.117936 +LED,R12_PAO,2110,BUS,1534.70452 +LED,R12_PAO,2110,LDV,14296.21338 +LED,R12_PAO,2110,RAIL,5286.337132 +LED,R12_PAS,2020,2W,528 +LED,R12_PAS,2020,AIR,616 +LED,R12_PAS,2020,BUS,3256 +LED,R12_PAS,2020,LDV,3872 +LED,R12_PAS,2020,RAIL,528 +LED,R12_PAS,2025,2W,520.1118242 +LED,R12_PAS,2025,AIR,750.6644625 +LED,R12_PAS,2025,BUS,3189.901105 +LED,R12_PAS,2025,LDV,4488.637599 +LED,R12_PAS,2025,RAIL,693.2168328 +LED,R12_PAS,2030,2W,502.7499882 +LED,R12_PAS,2030,AIR,909.2175894 +LED,R12_PAS,2030,BUS,3095.970109 +LED,R12_PAS,2030,LDV,5117.405823 +LED,R12_PAS,2030,RAIL,870.8473637 +LED,R12_PAS,2035,2W,476.464793 +LED,R12_PAS,2035,AIR,1062.342475 +LED,R12_PAS,2035,BUS,2986.16283 +LED,R12_PAS,2035,LDV,5678.983609 +LED,R12_PAS,2035,RAIL,1051.552244 +LED,R12_PAS,2040,2W,445.4621932 +LED,R12_PAS,2040,AIR,1201.688949 +LED,R12_PAS,2040,BUS,2870.6268 +LED,R12_PAS,2040,LDV,6172.691359 +LED,R12_PAS,2040,RAIL,1233.466385 +LED,R12_PAS,2045,2W,412.8419422 +LED,R12_PAS,2045,AIR,1332.24928 +LED,R12_PAS,2045,BUS,2753.478082 +LED,R12_PAS,2045,LDV,6623.156753 +LED,R12_PAS,2045,RAIL,1417.963587 +LED,R12_PAS,2050,2W,380.1923592 +LED,R12_PAS,2050,AIR,1457.050614 +LED,R12_PAS,2050,BUS,2636.521746 +LED,R12_PAS,2050,LDV,7044.406028 +LED,R12_PAS,2050,RAIL,1605.915412 +LED,R12_PAS,2055,2W,348.4676322 +LED,R12_PAS,2055,AIR,1584.87868 +LED,R12_PAS,2055,BUS,2520.404239 +LED,R12_PAS,2055,LDV,7455.719589 +LED,R12_PAS,2055,RAIL,1799.471701 +LED,R12_PAS,2060,2W,318.0997937 +LED,R12_PAS,2060,AIR,1717.224705 +LED,R12_PAS,2060,BUS,2405.976567 +LED,R12_PAS,2060,LDV,7862.095756 +LED,R12_PAS,2060,RAIL,1999.498287 +LED,R12_PAS,2070,2W,262.2428612 +LED,R12_PAS,2070,AIR,1980.645126 +LED,R12_PAS,2070,BUS,2184.673511 +LED,R12_PAS,2070,LDV,8654.12145 +LED,R12_PAS,2070,RAIL,2419.438315 +LED,R12_PAS,2080,2W,213.2286724 +LED,R12_PAS,2080,AIR,2209.112785 +LED,R12_PAS,2080,BUS,1973.205597 +LED,R12_PAS,2080,LDV,9408.08124 +LED,R12_PAS,2080,RAIL,2865.596388 +LED,R12_PAS,2090,2W,170.6392524 +LED,R12_PAS,2090,AIR,2390.880562 +LED,R12_PAS,2090,BUS,1767.763508 +LED,R12_PAS,2090,LDV,10145.40407 +LED,R12_PAS,2090,RAIL,3342.901384 +LED,R12_PAS,2100,2W,133.5293662 +LED,R12_PAS,2100,AIR,2519.082455 +LED,R12_PAS,2100,BUS,1563.208135 +LED,R12_PAS,2100,LDV,10881.49466 +LED,R12_PAS,2100,RAIL,3855.347433 +LED,R12_PAS,2110,2W,100.884934 +LED,R12_PAS,2110,AIR,2592.464632 +LED,R12_PAS,2110,BUS,1354.234642 +LED,R12_PAS,2110,LDV,11625.87059 +LED,R12_PAS,2110,RAIL,4405.470318 +LED,R12_RCPA,2020,2W,480 +LED,R12_RCPA,2020,AIR,384 +LED,R12_RCPA,2020,BUS,1440 +LED,R12_RCPA,2020,LDV,1296 +LED,R12_RCPA,2020,RAIL,1200 +LED,R12_RCPA,2025,2W,509.5593693 +LED,R12_RCPA,2025,AIR,473.6989847 +LED,R12_RCPA,2025,BUS,1511.487032 +LED,R12_RCPA,2025,LDV,1649.349447 +LED,R12_RCPA,2025,RAIL,1388.102762 +LED,R12_RCPA,2030,2W,547.2066895 +LED,R12_RCPA,2030,AIR,655.6907104 +LED,R12_RCPA,2030,BUS,1577.182331 +LED,R12_RCPA,2030,LDV,2208.238617 +LED,R12_RCPA,2030,RAIL,1660.270271 +LED,R12_RCPA,2035,2W,558.5303854 +LED,R12_RCPA,2035,AIR,891.626729 +LED,R12_RCPA,2035,BUS,1592.15178 +LED,R12_RCPA,2035,LDV,2831.226508 +LED,R12_RCPA,2035,RAIL,1913.399917 +LED,R12_RCPA,2040,2W,544.0476222 +LED,R12_RCPA,2040,AIR,1139.574504 +LED,R12_RCPA,2040,BUS,1574.459114 +LED,R12_RCPA,2040,LDV,3426.326207 +LED,R12_RCPA,2040,RAIL,2116.140981 +LED,R12_RCPA,2045,2W,515.4738786 +LED,R12_RCPA,2045,AIR,1396.180123 +LED,R12_RCPA,2045,BUS,1543.659881 +LED,R12_RCPA,2045,LDV,3996.734304 +LED,R12_RCPA,2045,RAIL,2286.45859 +LED,R12_RCPA,2050,2W,479.9485614 +LED,R12_RCPA,2050,AIR,1659.041738 +LED,R12_RCPA,2050,BUS,1508.941408 +LED,R12_RCPA,2050,LDV,4548.931874 +LED,R12_RCPA,2050,RAIL,2437.063061 +LED,R12_RCPA,2055,2W,441.8121421 +LED,R12_RCPA,2055,AIR,1933.583213 +LED,R12_RCPA,2055,BUS,1474.674439 +LED,R12_RCPA,2055,LDV,5097.371339 +LED,R12_RCPA,2055,RAIL,2579.055315 +LED,R12_RCPA,2060,2W,403.5129257 +LED,R12_RCPA,2060,AIR,2220.466354 +LED,R12_RCPA,2060,BUS,1443.592215 +LED,R12_RCPA,2060,LDV,5651.571059 +LED,R12_RCPA,2060,RAIL,2719.626963 +LED,R12_RCPA,2070,2W,331.5083307 +LED,R12_RCPA,2070,AIR,2794.738464 +LED,R12_RCPA,2070,BUS,1398.695713 +LED,R12_RCPA,2070,LDV,6800.617001 +LED,R12_RCPA,2070,RAIL,3016.153475 +LED,R12_RCPA,2080,2W,267.8749196 +LED,R12_RCPA,2080,AIR,3219.647653 +LED,R12_RCPA,2080,BUS,1380.53444 +LED,R12_RCPA,2080,LDV,8008.667575 +LED,R12_RCPA,2080,RAIL,3347.387629 +LED,R12_RCPA,2090,2W,210.9201163 +LED,R12_RCPA,2090,AIR,3431.619835 +LED,R12_RCPA,2090,BUS,1382.880417 +LED,R12_RCPA,2090,LDV,9339.944882 +LED,R12_RCPA,2090,RAIL,3734.082464 +LED,R12_RCPA,2100,2W,157.8878188 +LED,R12_RCPA,2100,AIR,3438.566083 +LED,R12_RCPA,2100,BUS,1399.652061 +LED,R12_RCPA,2100,LDV,10877.28757 +LED,R12_RCPA,2100,RAIL,4198.086575 +LED,R12_RCPA,2110,2W,105.8659793 +LED,R12_RCPA,2110,AIR,3212.656322 +LED,R12_RCPA,2110,BUS,1422.537294 +LED,R12_RCPA,2110,LDV,12649.65172 +LED,R12_RCPA,2110,RAIL,4743.516289 +LED,R12_SAS,2020,2W,875 +LED,R12_SAS,2020,AIR,105 +LED,R12_SAS,2020,BUS,1260 +LED,R12_SAS,2020,LDV,700 +LED,R12_SAS,2020,RAIL,560 +LED,R12_SAS,2025,2W,974.980074 +LED,R12_SAS,2025,AIR,136.1015155 +LED,R12_SAS,2025,BUS,1399.720701 +LED,R12_SAS,2025,LDV,981.7921057 +LED,R12_SAS,2025,RAIL,683.6275992 +LED,R12_SAS,2030,2W,1078.011389 +LED,R12_SAS,2030,AIR,179.9906166 +LED,R12_SAS,2030,BUS,1550.908362 +LED,R12_SAS,2030,LDV,1367.734973 +LED,R12_SAS,2030,RAIL,837.8461822 +LED,R12_SAS,2035,2W,1163.847499 +LED,R12_SAS,2035,AIR,235.6401667 +LED,R12_SAS,2035,BUS,1698.967031 +LED,R12_SAS,2035,LDV,1855.250262 +LED,R12_SAS,2035,RAIL,1012.74624 +LED,R12_SAS,2040,2W,1236.199126 +LED,R12_SAS,2040,AIR,308.8751184 +LED,R12_SAS,2040,BUS,1851.770238 +LED,R12_SAS,2040,LDV,2477.038319 +LED,R12_SAS,2040,RAIL,1217.153988 +LED,R12_SAS,2045,2W,1228.494827 +LED,R12_SAS,2045,AIR,386.7927815 +LED,R12_SAS,2045,BUS,1909.032271 +LED,R12_SAS,2045,LDV,3103.493406 +LED,R12_SAS,2045,RAIL,1384.006942 +LED,R12_SAS,2050,2W,1187.818399 +LED,R12_SAS,2050,AIR,481.8550775 +LED,R12_SAS,2050,BUS,1936.682397 +LED,R12_SAS,2050,LDV,3799.200537 +LED,R12_SAS,2050,RAIL,1548.81516 +LED,R12_SAS,2055,2W,1119.477985 +LED,R12_SAS,2055,AIR,597.8754047 +LED,R12_SAS,2055,BUS,1938.472394 +LED,R12_SAS,2055,LDV,4553.61088 +LED,R12_SAS,2055,RAIL,1708.778251 +LED,R12_SAS,2060,2W,1029.94565 +LED,R12_SAS,2060,AIR,737.5772893 +LED,R12_SAS,2060,BUS,1918.967575 +LED,R12_SAS,2060,LDV,5348.126291 +LED,R12_SAS,2060,RAIL,1860.477517 +LED,R12_SAS,2070,2W,816.2553852 +LED,R12_SAS,2070,AIR,1087.990747 +LED,R12_SAS,2070,BUS,1837.814937 +LED,R12_SAS,2070,LDV,6965.396195 +LED,R12_SAS,2070,RAIL,2129.299837 +LED,R12_SAS,2080,2W,596.3819394 +LED,R12_SAS,2080,AIR,1496.876549 +LED,R12_SAS,2080,BUS,1732.598537 +LED,R12_SAS,2080,LDV,8481.361366 +LED,R12_SAS,2080,RAIL,2347.293588 +LED,R12_SAS,2090,2W,396.4273203 +LED,R12_SAS,2090,AIR,1883.652338 +LED,R12_SAS,2090,BUS,1625.434242 +LED,R12_SAS,2090,LDV,9810.67408 +LED,R12_SAS,2090,RAIL,2522.117793 +LED,R12_SAS,2100,2W,222.879997 +LED,R12_SAS,2100,AIR,2186.654093 +LED,R12_SAS,2100,BUS,1522.346792 +LED,R12_SAS,2100,LDV,10967.07411 +LED,R12_SAS,2100,RAIL,2668.417241 +LED,R12_SAS,2110,2W,73.792757 +LED,R12_SAS,2110,AIR,2370.27 +LED,R12_SAS,2110,BUS,1419.495355 +LED,R12_SAS,2110,LDV,11955.75668 +LED,R12_SAS,2110,RAIL,2789.411701 +LED,R12_WEU,2020,2W,152 +LED,R12_WEU,2020,AIR,1368 +LED,R12_WEU,2020,BUS,912 +LED,R12_WEU,2020,LDV,10944 +LED,R12_WEU,2020,RAIL,1824 +LED,R12_WEU,2025,2W,151.5656455 +LED,R12_WEU,2025,AIR,1706.989438 +LED,R12_WEU,2025,BUS,943.8712688 +LED,R12_WEU,2025,LDV,11595.11359 +LED,R12_WEU,2025,RAIL,1993.942852 +LED,R12_WEU,2030,2W,148.8762423 +LED,R12_WEU,2030,AIR,1921.617166 +LED,R12_WEU,2030,BUS,972.9811288 +LED,R12_WEU,2030,LDV,11884.32497 +LED,R12_WEU,2030,RAIL,2138.554294 +LED,R12_WEU,2035,2W,145.5691639 +LED,R12_WEU,2035,AIR,2123.032416 +LED,R12_WEU,2035,BUS,999.492949 +LED,R12_WEU,2035,LDV,12089.23042 +LED,R12_WEU,2035,RAIL,2279.612807 +LED,R12_WEU,2040,2W,141.7921084 +LED,R12_WEU,2040,AIR,2310.554094 +LED,R12_WEU,2040,BUS,1023.14023 +LED,R12_WEU,2040,LDV,12222.22156 +LED,R12_WEU,2040,RAIL,2416.628993 +LED,R12_WEU,2045,2W,139.4356124 +LED,R12_WEU,2045,AIR,2511.932701 +LED,R12_WEU,2045,BUS,1057.330287 +LED,R12_WEU,2045,LDV,12448.0296 +LED,R12_WEU,2045,RAIL,2581.684317 +LED,R12_WEU,2050,2W,137.1741539 +LED,R12_WEU,2050,AIR,2701.239849 +LED,R12_WEU,2050,BUS,1092.832466 +LED,R12_WEU,2050,LDV,12654.54796 +LED,R12_WEU,2050,RAIL,2753.536097 +LED,R12_WEU,2055,2W,135.0540613 +LED,R12_WEU,2055,AIR,2886.042937 +LED,R12_WEU,2055,BUS,1129.661996 +LED,R12_WEU,2055,LDV,12855.20079 +LED,R12_WEU,2055,RAIL,2933.736886 +LED,R12_WEU,2060,2W,133.0733938 +LED,R12_WEU,2060,AIR,3067.399044 +LED,R12_WEU,2060,BUS,1167.736124 +LED,R12_WEU,2060,LDV,13052.90177 +LED,R12_WEU,2060,RAIL,3122.689709 +LED,R12_WEU,2070,2W,129.2676023 +LED,R12_WEU,2070,AIR,3396.664601 +LED,R12_WEU,2070,BUS,1245.283284 +LED,R12_WEU,2070,LDV,13407.4507 +LED,R12_WEU,2070,RAIL,3519.754768 +LED,R12_WEU,2080,2W,125.261807 +LED,R12_WEU,2080,AIR,3650.97061 +LED,R12_WEU,2080,BUS,1319.809543 +LED,R12_WEU,2080,LDV,13659.0166 +LED,R12_WEU,2080,RAIL,3926.793799 +LED,R12_WEU,2090,2W,121.176131 +LED,R12_WEU,2090,AIR,3856.042619 +LED,R12_WEU,2090,BUS,1390.686253 +LED,R12_WEU,2090,LDV,13839.79992 +LED,R12_WEU,2090,RAIL,4344.210412 +LED,R12_WEU,2100,2W,117.1085148 +LED,R12_WEU,2100,AIR,4028.686661 +LED,R12_WEU,2100,BUS,1457.930339 +LED,R12_WEU,2100,LDV,13971.12179 +LED,R12_WEU,2100,RAIL,4772.898077 +LED,R12_WEU,2110,2W,113.2081482 +LED,R12_WEU,2110,AIR,4188.997626 +LED,R12_WEU,2110,BUS,1522.873523 +LED,R12_WEU,2110,LDV,14081.47608 +LED,R12_WEU,2110,RAIL,5218.642541 + diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_LED_v5.3.1_INDC2030i_SSP2 - Very Low Emissions_v1.csv b/message_ix_models/data/transport/R12/price-emission/SSP_LED_v5.3.1_INDC2030i_SSP2 - Very Low Emissions_v1.csv new file mode 100644 index 0000000000..53c92df920 --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_LED_v5.3.1_INDC2030i_SSP2 - Very Low Emissions_v1.csv @@ -0,0 +1,15 @@ +# Exported from ixmp://ixmp-dev/SSP_LED_v5.3.1/INDC2030i_SSP2 - Very Low Emissions#1 +# +node,type_emission,type_tec,year,value,mrg +World,TCE,all,2035,207.40452361266262,0.0 +World,TCE,all,2040,239.44693377044635,0.0 +World,TCE,all,2045,276.8424613986644,0.0 +World,TCE,all,2050,321.1752143145132,0.0 +World,TCE,all,2055,372.7503864330568,0.0 +World,TCE,all,2060,432.9253921819444,0.0 +World,TCE,all,2070,537.6738546658032,0.0 +World,TCE,all,2080,537.6738546658032,0.0 +World,TCE,all,2090,537.6738546658032,0.0 +World,TCE,all,2100,537.6738546658032,0.0 +World,TCE,all,2110,537.6738546658032,0.0 +World,TCE_CO2,all,2060,28.245156957904708,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_LED_v5.3.1_SSP2 - Very Low Emissions_v2.csv b/message_ix_models/data/transport/R12/price-emission/SSP_LED_v5.3.1_SSP2 - Very Low Emissions_v2.csv new file mode 100644 index 0000000000..85ea01baae --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_LED_v5.3.1_SSP2 - Very Low Emissions_v2.csv @@ -0,0 +1,15 @@ +# Exported from ixmp://ixmp-dev/SSP_LED_v5.3.1/SSP2 - Very Low Emissions#2 +# +node,type_emission,type_tec,year,value,mrg +World,TCE,all,2035,207.40452361266262,0.0 +World,TCE,all,2040,239.44693377044635,0.0 +World,TCE,all,2045,276.8424613986644,0.0 +World,TCE,all,2050,321.1752143145132,0.0 +World,TCE,all,2055,372.7503864330568,0.0 +World,TCE,all,2060,432.9253921819444,0.0 +World,TCE,all,2070,537.6738546658032,0.0 +World,TCE,all,2080,537.6738546658032,0.0 +World,TCE,all,2090,537.6738546658032,0.0 +World,TCE,all,2100,537.6738546658032,0.0 +World,TCE,all,2110,537.6738546658032,0.0 +World,TCE_CO2,all,2060,28.245156957904708,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_LED_v5.3.1_baseline_1000f_v1.csv b/message_ix_models/data/transport/R12/price-emission/SSP_LED_v5.3.1_baseline_1000f_v1.csv new file mode 100644 index 0000000000..b9956f96dc --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_LED_v5.3.1_baseline_1000f_v1.csv @@ -0,0 +1,19 @@ +# Exported from ixmp://ixmp-dev/SSP_LED_v5.3.1/baseline_1000f#1 +# +node,type_emission,type_tec,year,value,mrg +World,TCE,all,2030,51.061485328280725,0.0 +World,TCE,all,2035,59.19425613632567,0.0 +World,TCE,all,2040,68.62236648631604,0.0 +World,TCE,all,2045,79.55213038469937,0.0 +World,TCE,all,2050,92.22272231031526,0.0 +World,TCE,all,2055,106.91141103571668,0.0 +World,TCE,all,2060,123.93962706053726,0.0 +World,TCE,all,2070,154.27823344792884,0.0 +World,TCE,all,2080,207.33704490694777,0.0 +World,TCE,all,2090,278.6436506952549,0.0 +World,TCE,all,2100,374.47376616959514,0.0 +World,TCE,all,2110,503.2614279899998,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2060,2757.807327674039,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2070,152.73192731696173,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2080,191.81133677029462,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2090,245.52437837712242,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP1_v5.3.1_INDC2030i_SSP1 - Low Emissions_a_v1.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP1_v5.3.1_INDC2030i_SSP1 - Low Emissions_a_v1.csv new file mode 100644 index 0000000000..18410b5d50 --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP1_v5.3.1_INDC2030i_SSP1 - Low Emissions_a_v1.csv @@ -0,0 +1,18 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP1_v5.3.1/INDC2030i_SSP1 - Low Emissions_a#1 +# +node,type_emission,type_tec,year,value,mrg +World,TCE,all,2035,52.96187434565992,0.0 +World,TCE,all,2040,61.69855785410274,0.0 +World,TCE,all,2045,71.24821875462438,0.0 +World,TCE,all,2050,83.84383983418198,0.0 +World,TCE,all,2055,96.26488025936528,0.0 +World,TCE,all,2060,111.40462217881583,0.0 +World,TCE,all,2070,139.2684875312507,0.0 +World,TCE,all,2080,187.08039784558326,0.0 +World,TCE,all,2090,250.3793635073254,0.0 +World,TCE,all,2100,338.0861931915215,0.0 +World,TCE,all,2110,453.7869800235421,0.0 +World,TCE_CO2,all,2040,0.2543966236269902,0.0 +World,TCE_CO2,all,2090,0.6916440927349579,0.0 +World,TCE_CO2,all,2100,1.8477102985288325,0.0 +World,TCE_CO2,all,2110,40.84030774307734,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP1_v5.3.1_INDC2030i_SSP1 - Low Emissions_v1.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP1_v5.3.1_INDC2030i_SSP1 - Low Emissions_v1.csv new file mode 100644 index 0000000000..8e7fdfa51d --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP1_v5.3.1_INDC2030i_SSP1 - Low Emissions_v1.csv @@ -0,0 +1,148 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP1_v5.3.1/INDC2030i_SSP1 - Low Emissions#1 +# +node,type_emission,type_tec,year,value,mrg +R12_AFR,TCE,all,2035,433.1209476008732,0.0 +R12_AFR,TCE,all,2040,87.1653553788375,0.0 +R12_AFR,TCE,all,2045,52.76497477934424,0.0 +R12_AFR,TCE,all,2050,54.067215027048064,0.0 +R12_AFR,TCE,all,2055,241.0775356831742,0.0 +R12_AFR,TCE,all,2060,885.4264107587281,0.0 +R12_AFR,TCE,all,2070,314.4715986579446,0.0 +R12_AFR,TCE,all,2080,385.6033482029556,0.0 +R12_AFR,TCE,all,2090,260.8537232870687,0.0 +R12_AFR,TCE,all,2100,304.57249024521093,0.0 +R12_AFR,TCE,all,2110,303.9331398424499,0.0 +R12_EEU,TCE,all,2035,359.69572976912673,0.0 +R12_EEU,TCE,all,2040,124.36661367107541,0.0 +R12_EEU,TCE,all,2045,188.58585062322862,0.0 +R12_EEU,TCE,all,2050,1160.439594898966,0.0 +R12_EEU,TCE,all,2055,443.6398350834955,0.0 +R12_EEU,TCE,all,2060,547.3459555068698,0.0 +R12_EEU,TCE,all,2070,450.6945183731512,0.0 +R12_EEU,TCE,all,2080,861.9071465386834,0.0 +R12_EEU,TCE,all,2090,678.1146260498967,0.0 +R12_EEU,TCE,all,2100,489.5378289552863,0.0 +R12_EEU,TCE,all,2110,560.8155054543695,0.0 +R12_GLB,TCE,all,2035,989.1491328001483,0.0 +R12_GLB,TCE,all,2040,263.192251387849,0.0 +R12_GLB,TCE,all,2045,332.63551085538455,0.0 +R12_GLB,TCE,all,2050,1288.7565692038715,0.0 +R12_GLB,TCE,all,2055,5471.761707361254,0.0 +R12_GLB,TCE,all,2060,3379.739346073866,0.0 +R12_GLB,TCE,all,2070,1549.6075744857985,0.0 +R12_GLB,TCE,all,2080,1570.95705666784,0.0 +R12_GLB,TCE,all,2090,1271.9315547803578,0.0 +R12_GLB,TCE,all,2100,1328.656252694818,0.0 +R12_GLB,TCE,all,2110,1186.765163280368,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2055,4627.413639271172,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2060,1806.991477243767,0.0 +R12_LAM,TCE,all,2035,185.8298979878312,0.0 +R12_LAM,TCE,all,2040,12.167394918515411,0.0 +R12_LAM,TCE,all,2045,47.77566931431764,0.0 +R12_LAM,TCE,all,2050,54.067215027048064,0.0 +R12_LAM,TCE,all,2055,37.76790132639836,0.0 +R12_LAM,TCE,all,2060,546.927199920939,0.0 +R12_LAM,TCE,all,2070,225.28237782774147,0.0 +R12_LAM,TCE,all,2080,329.3748546960803,0.0 +R12_LAM,TCE,all,2090,258.70955075149385,0.0 +R12_LAM,TCE,all,2100,269.12497635701675,0.0 +R12_LAM,TCE,all,2110,269.2924884855353,0.0 +R12_MEA,TCE,all,2035,989.1491328001483,0.0 +R12_MEA,TCE,all,2040,259.2399040246288,0.0 +R12_MEA,TCE,all,2045,321.88861194482627,0.0 +R12_MEA,TCE,all,2050,328.2494637730984,0.0 +R12_MEA,TCE,all,2055,405.23532353139694,0.0 +R12_MEA,TCE,all,2060,579.3694604384945,0.0 +R12_MEA,TCE,all,2070,446.2034810451769,0.0 +R12_MEA,TCE,all,2080,823.569917561661,0.0 +R12_MEA,TCE,all,2090,630.2017994135532,0.0 +R12_MEA,TCE,all,2100,613.0152187311809,0.0 +R12_MEA,TCE,all,2110,614.8465860262795,0.0 +R12_NAM,TCE,all,2035,105.42376688081373,0.0 +R12_NAM,TCE,all,2040,12.167394918515411,0.0 +R12_NAM,TCE,all,2045,47.77566931431764,0.0 +R12_NAM,TCE,all,2050,53.755621543727905,0.0 +R12_NAM,TCE,all,2055,37.76790132639836,0.0 +R12_NAM,TCE,all,2060,3652.459226541886,0.0 +R12_NAM,TCE,all,2070,334.2101074142313,0.0 +R12_NAM,TCE,all,2080,332.9538019679492,0.0 +R12_NAM,TCE,all,2090,259.7259804698282,0.0 +R12_NAM,TCE,all,2100,270.4909729039268,0.0 +R12_NAM,TCE,all,2110,269.2924884855353,0.0 +R12_SAS,TCE,all,2035,174.6138450030018,0.0 +R12_SAS,TCE,all,2040,63.90059070705087,0.0 +R12_SAS,TCE,all,2045,93.37906117616468,0.0 +R12_SAS,TCE,all,2050,96.75017087861478,0.0 +R12_SAS,TCE,all,2055,82.75719680727134,0.0 +R12_SAS,TCE,all,2060,770.8060741042987,0.0 +R12_SAS,TCE,all,2070,1738.779748639987,0.0 +R12_SAS,TCE,all,2080,1570.95705666784,0.0 +R12_SAS,TCE,all,2090,1980.0305831592127,0.0 +R12_SAS,TCE,all,2100,1427.3333749672809,0.0 +R12_SAS,TCE,all,2110,1427.3333749672806,0.0 +R12_WEU,TCE,all,2035,105.4237668808133,0.0 +R12_WEU,TCE,all,2040,12.167394918515411,0.0 +R12_WEU,TCE,all,2045,47.77566931431764,0.0 +R12_WEU,TCE,all,2050,146.07015667258045,0.0 +R12_WEU,TCE,all,2055,7081.499662056834,0.0 +R12_WEU,TCE,all,2060,1013.4589458003495,0.0 +R12_WEU,TCE,all,2070,455.58920895943976,0.0 +R12_WEU,TCE,all,2080,651.6084753402773,0.0 +R12_WEU,TCE,all,2090,549.4931297433641,0.0 +R12_WEU,TCE,all,2100,790.410094877789,0.0 +R12_WEU,TCE,all,2110,800.7540780983372,0.0 +R12_FSU,TCE,all,2035,193.00764223103627,0.0 +R12_FSU,TCE,all,2040,24.817870527565713,0.0 +R12_FSU,TCE,all,2045,48.04445259018727,0.0 +R12_FSU,TCE,all,2050,53.75562154372594,0.0 +R12_FSU,TCE,all,2055,67.28299200493552,0.0 +R12_FSU,TCE,all,2060,546.927199920939,0.0 +R12_FSU,TCE,all,2070,225.28237782774661,0.0 +R12_FSU,TCE,all,2080,564.708043941384,0.0 +R12_FSU,TCE,all,2090,278.0973873714494,0.0 +R12_FSU,TCE,all,2100,270.4909729039265,0.0 +R12_FSU,TCE,all,2110,271.1282736190647,0.0 +R12_PAO,TCE,all,2035,105.42376688081332,0.0 +R12_PAO,TCE,all,2040,12.167394918515411,0.0 +R12_PAO,TCE,all,2045,47.775669314316936,0.0 +R12_PAO,TCE,all,2050,394.69607315985354,0.0 +R12_PAO,TCE,all,2055,38.129123573332244,0.0 +R12_PAO,TCE,all,2060,546.927199920939,0.0 +R12_PAO,TCE,all,2070,225.8451503186209,0.0 +R12_PAO,TCE,all,2080,330.13117386441024,0.0 +R12_PAO,TCE,all,2090,258.70955075149504,0.0 +R12_PAO,TCE,all,2100,269.12497635700885,0.0 +R12_PAO,TCE,all,2110,269.2924884855353,0.0 +R12_PAS,TCE,all,2035,132.81828021460237,0.0 +R12_PAS,TCE,all,2040,57.11949168040826,0.0 +R12_PAS,TCE,all,2045,62.0811678682821,0.0 +R12_PAS,TCE,all,2050,54.067215027048064,0.0 +R12_PAS,TCE,all,2055,38.129123573332244,0.0 +R12_PAS,TCE,all,2060,547.3459555068698,0.0 +R12_PAS,TCE,all,2070,409.9305477256762,0.0 +R12_PAS,TCE,all,2080,868.5372265296294,0.0 +R12_PAS,TCE,all,2090,404.50894721063077,0.0 +R12_PAS,TCE,all,2100,394.43514290688984,0.0 +R12_PAS,TCE,all,2110,462.6509113862961,0.0 +R12_CHN,TCE,all,2035,105.4237668808133,0.0 +R12_CHN,TCE,all,2040,28.49794871794872,0.0 +R12_CHN,TCE,all,2045,48.04445259018646,0.0 +R12_CHN,TCE,all,2050,53.75562154372762,0.0 +R12_CHN,TCE,all,2055,37.76790132639836,0.0 +R12_CHN,TCE,all,2060,2609.4357323593754,0.0 +R12_CHN,TCE,all,2070,513.5817694463049,0.0 +R12_CHN,TCE,all,2080,590.3376091192773,0.0 +R12_CHN,TCE,all,2090,594.3350682615883,0.0 +R12_CHN,TCE,all,2100,729.9211753812198,0.0 +R12_CHN,TCE,all,2110,691.2549969516557,0.0 +R12_RCPA,TCE,all,2035,139.43388437011885,0.0 +R12_RCPA,TCE,all,2040,53.746382904552455,0.0 +R12_RCPA,TCE,all,2045,89.69729097816136,0.0 +R12_RCPA,TCE,all,2050,1054.656566880576,0.0 +R12_RCPA,TCE,all,2055,271.2065829592962,0.0 +R12_RCPA,TCE,all,2060,649.7843524986879,0.0 +R12_RCPA,TCE,all,2070,392.2582505636408,0.0 +R12_RCPA,TCE,all,2080,558.0873158654972,0.0 +R12_RCPA,TCE,all,2090,409.50203786368775,0.0 +R12_RCPA,TCE,all,2100,586.8368913645033,0.0 +R12_RCPA,TCE,all,2110,460.3912159773911,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP1_v5.3.1_INDC2030i_SSP1 - Very Low Emissions_v1.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP1_v5.3.1_INDC2030i_SSP1 - Very Low Emissions_v1.csv new file mode 100644 index 0000000000..2c6736bb1c --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP1_v5.3.1_INDC2030i_SSP1 - Very Low Emissions_v1.csv @@ -0,0 +1,15 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP1_v5.3.1/INDC2030i_SSP1 - Very Low Emissions#1 +# +node,type_emission,type_tec,year,value,mrg +World,TCE,all,2035,211.72532728311742,0.0 +World,TCE,all,2040,244.8785004157186,0.0 +World,TCE,all,2045,283.61502502329006,0.0 +World,TCE,all,2050,328.81577545811774,0.0 +World,TCE,all,2055,381.8123284340718,0.0 +World,TCE,all,2060,442.5488749689871,0.0 +World,TCE,all,2070,550.4285665627465,0.0 +World,TCE,all,2080,550.4285665627465,0.0 +World,TCE,all,2090,550.4285665627465,0.0 +World,TCE,all,2100,550.4285665627465,0.0 +World,TCE,all,2110,550.4285665627465,0.0 +World,TCE_CO2,all,2070,8.033619076679617,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP1_v5.3.1_SSP1 - Low Emissions_a_v2.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP1_v5.3.1_SSP1 - Low Emissions_a_v2.csv new file mode 100644 index 0000000000..cea896063b --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP1_v5.3.1_SSP1 - Low Emissions_a_v2.csv @@ -0,0 +1,18 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP1_v5.3.1/SSP1 - Low Emissions_a#2 +# +node,type_emission,type_tec,year,value,mrg +World,TCE,all,2035,52.96187434565992,0.0 +World,TCE,all,2040,61.69855785410274,0.0 +World,TCE,all,2045,71.24821875462438,0.0 +World,TCE,all,2050,83.84383983418198,0.0 +World,TCE,all,2055,96.26488025936528,0.0 +World,TCE,all,2060,111.40462217881583,0.0 +World,TCE,all,2070,139.2684875312507,0.0 +World,TCE,all,2080,187.08039784558326,0.0 +World,TCE,all,2090,250.3793635073254,0.0 +World,TCE,all,2100,338.0861931915215,0.0 +World,TCE,all,2110,453.7869800235421,0.0 +World,TCE_CO2,all,2040,0.2543966236269902,0.0 +World,TCE_CO2,all,2090,0.6916440927349579,0.0 +World,TCE_CO2,all,2100,1.8477102985288325,0.0 +World,TCE_CO2,all,2110,40.84030774307734,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP1_v5.3.1_SSP1 - Low Emissions_v2.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP1_v5.3.1_SSP1 - Low Emissions_v2.csv new file mode 100644 index 0000000000..57773b7491 --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP1_v5.3.1_SSP1 - Low Emissions_v2.csv @@ -0,0 +1,148 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP1_v5.3.1/SSP1 - Low Emissions#2 +# +node,type_emission,type_tec,year,value,mrg +R12_AFR,TCE,all,2035,433.1209476008732,0.0 +R12_AFR,TCE,all,2040,87.1653553788375,0.0 +R12_AFR,TCE,all,2045,52.76497477934424,0.0 +R12_AFR,TCE,all,2050,54.067215027048064,0.0 +R12_AFR,TCE,all,2055,241.0775356831742,0.0 +R12_AFR,TCE,all,2060,885.4264107587281,0.0 +R12_AFR,TCE,all,2070,314.4715986579446,0.0 +R12_AFR,TCE,all,2080,385.6033482029556,0.0 +R12_AFR,TCE,all,2090,260.8537232870687,0.0 +R12_AFR,TCE,all,2100,304.57249024521093,0.0 +R12_AFR,TCE,all,2110,303.9331398424499,0.0 +R12_EEU,TCE,all,2035,359.69572976912673,0.0 +R12_EEU,TCE,all,2040,124.36661367107541,0.0 +R12_EEU,TCE,all,2045,188.58585062322862,0.0 +R12_EEU,TCE,all,2050,1160.439594898966,0.0 +R12_EEU,TCE,all,2055,443.6398350834955,0.0 +R12_EEU,TCE,all,2060,547.3459555068698,0.0 +R12_EEU,TCE,all,2070,450.6945183731512,0.0 +R12_EEU,TCE,all,2080,861.9071465386834,0.0 +R12_EEU,TCE,all,2090,678.1146260498967,0.0 +R12_EEU,TCE,all,2100,489.5378289552863,0.0 +R12_EEU,TCE,all,2110,560.8155054543695,0.0 +R12_GLB,TCE,all,2035,989.1491328001483,0.0 +R12_GLB,TCE,all,2040,263.192251387849,0.0 +R12_GLB,TCE,all,2045,332.63551085538455,0.0 +R12_GLB,TCE,all,2050,1288.7565692038715,0.0 +R12_GLB,TCE,all,2055,5471.761707361254,0.0 +R12_GLB,TCE,all,2060,3379.739346073866,0.0 +R12_GLB,TCE,all,2070,1549.6075744857985,0.0 +R12_GLB,TCE,all,2080,1570.95705666784,0.0 +R12_GLB,TCE,all,2090,1271.9315547803578,0.0 +R12_GLB,TCE,all,2100,1328.656252694818,0.0 +R12_GLB,TCE,all,2110,1186.765163280368,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2055,4627.413639271172,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2060,1806.991477243767,0.0 +R12_LAM,TCE,all,2035,185.8298979878312,0.0 +R12_LAM,TCE,all,2040,12.167394918515411,0.0 +R12_LAM,TCE,all,2045,47.77566931431764,0.0 +R12_LAM,TCE,all,2050,54.067215027048064,0.0 +R12_LAM,TCE,all,2055,37.76790132639836,0.0 +R12_LAM,TCE,all,2060,546.927199920939,0.0 +R12_LAM,TCE,all,2070,225.28237782774147,0.0 +R12_LAM,TCE,all,2080,329.3748546960803,0.0 +R12_LAM,TCE,all,2090,258.70955075149385,0.0 +R12_LAM,TCE,all,2100,269.12497635701675,0.0 +R12_LAM,TCE,all,2110,269.2924884855353,0.0 +R12_MEA,TCE,all,2035,989.1491328001483,0.0 +R12_MEA,TCE,all,2040,259.2399040246288,0.0 +R12_MEA,TCE,all,2045,321.88861194482627,0.0 +R12_MEA,TCE,all,2050,328.2494637730984,0.0 +R12_MEA,TCE,all,2055,405.23532353139694,0.0 +R12_MEA,TCE,all,2060,579.3694604384945,0.0 +R12_MEA,TCE,all,2070,446.2034810451769,0.0 +R12_MEA,TCE,all,2080,823.569917561661,0.0 +R12_MEA,TCE,all,2090,630.2017994135532,0.0 +R12_MEA,TCE,all,2100,613.0152187311809,0.0 +R12_MEA,TCE,all,2110,614.8465860262795,0.0 +R12_NAM,TCE,all,2035,105.42376688081373,0.0 +R12_NAM,TCE,all,2040,12.167394918515411,0.0 +R12_NAM,TCE,all,2045,47.77566931431764,0.0 +R12_NAM,TCE,all,2050,53.755621543727905,0.0 +R12_NAM,TCE,all,2055,37.76790132639836,0.0 +R12_NAM,TCE,all,2060,3652.459226541886,0.0 +R12_NAM,TCE,all,2070,334.2101074142313,0.0 +R12_NAM,TCE,all,2080,332.9538019679492,0.0 +R12_NAM,TCE,all,2090,259.7259804698282,0.0 +R12_NAM,TCE,all,2100,270.4909729039268,0.0 +R12_NAM,TCE,all,2110,269.2924884855353,0.0 +R12_SAS,TCE,all,2035,174.6138450030018,0.0 +R12_SAS,TCE,all,2040,63.90059070705087,0.0 +R12_SAS,TCE,all,2045,93.37906117616468,0.0 +R12_SAS,TCE,all,2050,96.75017087861478,0.0 +R12_SAS,TCE,all,2055,82.75719680727134,0.0 +R12_SAS,TCE,all,2060,770.8060741042987,0.0 +R12_SAS,TCE,all,2070,1738.779748639987,0.0 +R12_SAS,TCE,all,2080,1570.95705666784,0.0 +R12_SAS,TCE,all,2090,1980.0305831592127,0.0 +R12_SAS,TCE,all,2100,1427.3333749672809,0.0 +R12_SAS,TCE,all,2110,1427.3333749672806,0.0 +R12_WEU,TCE,all,2035,105.4237668808133,0.0 +R12_WEU,TCE,all,2040,12.167394918515411,0.0 +R12_WEU,TCE,all,2045,47.77566931431764,0.0 +R12_WEU,TCE,all,2050,146.07015667258045,0.0 +R12_WEU,TCE,all,2055,7081.499662056834,0.0 +R12_WEU,TCE,all,2060,1013.4589458003495,0.0 +R12_WEU,TCE,all,2070,455.58920895943976,0.0 +R12_WEU,TCE,all,2080,651.6084753402773,0.0 +R12_WEU,TCE,all,2090,549.4931297433641,0.0 +R12_WEU,TCE,all,2100,790.410094877789,0.0 +R12_WEU,TCE,all,2110,800.7540780983372,0.0 +R12_FSU,TCE,all,2035,193.00764223103627,0.0 +R12_FSU,TCE,all,2040,24.817870527565713,0.0 +R12_FSU,TCE,all,2045,48.04445259018727,0.0 +R12_FSU,TCE,all,2050,53.75562154372594,0.0 +R12_FSU,TCE,all,2055,67.28299200493552,0.0 +R12_FSU,TCE,all,2060,546.927199920939,0.0 +R12_FSU,TCE,all,2070,225.28237782774661,0.0 +R12_FSU,TCE,all,2080,564.708043941384,0.0 +R12_FSU,TCE,all,2090,278.0973873714494,0.0 +R12_FSU,TCE,all,2100,270.4909729039265,0.0 +R12_FSU,TCE,all,2110,271.1282736190647,0.0 +R12_PAO,TCE,all,2035,105.42376688081332,0.0 +R12_PAO,TCE,all,2040,12.167394918515411,0.0 +R12_PAO,TCE,all,2045,47.775669314316936,0.0 +R12_PAO,TCE,all,2050,394.69607315985354,0.0 +R12_PAO,TCE,all,2055,38.129123573332244,0.0 +R12_PAO,TCE,all,2060,546.927199920939,0.0 +R12_PAO,TCE,all,2070,225.8451503186209,0.0 +R12_PAO,TCE,all,2080,330.13117386441024,0.0 +R12_PAO,TCE,all,2090,258.70955075149504,0.0 +R12_PAO,TCE,all,2100,269.12497635700885,0.0 +R12_PAO,TCE,all,2110,269.2924884855353,0.0 +R12_PAS,TCE,all,2035,132.81828021460237,0.0 +R12_PAS,TCE,all,2040,57.11949168040826,0.0 +R12_PAS,TCE,all,2045,62.0811678682821,0.0 +R12_PAS,TCE,all,2050,54.067215027048064,0.0 +R12_PAS,TCE,all,2055,38.129123573332244,0.0 +R12_PAS,TCE,all,2060,547.3459555068698,0.0 +R12_PAS,TCE,all,2070,409.9305477256762,0.0 +R12_PAS,TCE,all,2080,868.5372265296294,0.0 +R12_PAS,TCE,all,2090,404.50894721063077,0.0 +R12_PAS,TCE,all,2100,394.43514290688984,0.0 +R12_PAS,TCE,all,2110,462.6509113862961,0.0 +R12_CHN,TCE,all,2035,105.4237668808133,0.0 +R12_CHN,TCE,all,2040,28.49794871794872,0.0 +R12_CHN,TCE,all,2045,48.04445259018646,0.0 +R12_CHN,TCE,all,2050,53.75562154372762,0.0 +R12_CHN,TCE,all,2055,37.76790132639836,0.0 +R12_CHN,TCE,all,2060,2609.4357323593754,0.0 +R12_CHN,TCE,all,2070,513.5817694463049,0.0 +R12_CHN,TCE,all,2080,590.3376091192773,0.0 +R12_CHN,TCE,all,2090,594.3350682615883,0.0 +R12_CHN,TCE,all,2100,729.9211753812198,0.0 +R12_CHN,TCE,all,2110,691.2549969516557,0.0 +R12_RCPA,TCE,all,2035,139.43388437011885,0.0 +R12_RCPA,TCE,all,2040,53.746382904552455,0.0 +R12_RCPA,TCE,all,2045,89.69729097816136,0.0 +R12_RCPA,TCE,all,2050,1054.656566880576,0.0 +R12_RCPA,TCE,all,2055,271.2065829592962,0.0 +R12_RCPA,TCE,all,2060,649.7843524986879,0.0 +R12_RCPA,TCE,all,2070,392.2582505636408,0.0 +R12_RCPA,TCE,all,2080,558.0873158654972,0.0 +R12_RCPA,TCE,all,2090,409.50203786368775,0.0 +R12_RCPA,TCE,all,2100,586.8368913645033,0.0 +R12_RCPA,TCE,all,2110,460.3912159773911,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP1_v5.3.1_SSP1 - Very Low Emissions_v2.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP1_v5.3.1_SSP1 - Very Low Emissions_v2.csv new file mode 100644 index 0000000000..cabc250078 --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP1_v5.3.1_SSP1 - Very Low Emissions_v2.csv @@ -0,0 +1,15 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP1_v5.3.1/SSP1 - Very Low Emissions#2 +# +node,type_emission,type_tec,year,value,mrg +World,TCE,all,2035,211.72532728311742,0.0 +World,TCE,all,2040,244.8785004157186,0.0 +World,TCE,all,2045,283.61502502329006,0.0 +World,TCE,all,2050,328.81577545811774,0.0 +World,TCE,all,2055,381.8123284340718,0.0 +World,TCE,all,2060,442.5488749689871,0.0 +World,TCE,all,2070,550.4285665627465,0.0 +World,TCE,all,2080,550.4285665627465,0.0 +World,TCE,all,2090,550.4285665627465,0.0 +World,TCE,all,2100,550.4285665627465,0.0 +World,TCE,all,2110,550.4285665627465,0.0 +World,TCE_CO2,all,2070,8.033619076679617,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP1_v5.3.1_baseline_1000f_v1.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP1_v5.3.1_baseline_1000f_v1.csv new file mode 100644 index 0000000000..949d11d341 --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP1_v5.3.1_baseline_1000f_v1.csv @@ -0,0 +1,22 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP1_v5.3.1/baseline_1000f#1 +# +node,type_emission,type_tec,year,value,mrg +World,TCE,all,2030,53.35459581962397,0.0 +World,TCE,all,2035,61.852599678445195,0.0 +World,TCE,all,2040,71.70411523527798,0.0 +World,TCE,all,2045,83.12472181287745,0.0 +World,TCE,all,2050,96.36433493106853,0.0 +World,TCE,all,2055,111.71267517274961,0.0 +World,TCE,all,2060,129.50560809846593,0.0 +World,TCE,all,2070,161.20668516512558,0.0 +World,TCE,all,2080,216.64830465318335,0.0 +World,TCE,all,2090,291.1572051805485,0.0 +World,TCE,all,2100,391.2909370061963,0.0 +World,TCE,all,2110,525.8622993315364,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2055,4785.047226845431,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2060,384.4240826840261,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2070,162.3830701274615,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2080,171.99540559482315,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2090,125.0253205227637,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2100,50.48926284834042,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2110,25.091911261371475,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_INDC2030i_SSP2 - Low Emissions_a_v1.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_INDC2030i_SSP2 - Low Emissions_a_v1.csv new file mode 100644 index 0000000000..0964b2e428 --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_INDC2030i_SSP2 - Low Emissions_a_v1.csv @@ -0,0 +1,14 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP2_v5.3.1/INDC2030i_SSP2 - Low Emissions_a#1 +# +node,type_emission,type_tec,year,value,mrg +World,TCE,all,2035,83.80436441700445,0.0 +World,TCE,all,2040,108.06610135885757,0.0 +World,TCE,all,2045,137.70654767144842,0.0 +World,TCE,all,2050,175.42425850549873,0.0 +World,TCE,all,2055,223.69051884879357,0.0 +World,TCE,all,2060,285.71432489865106,0.0 +World,TCE,all,2070,409.15975445957497,0.0 +World,TCE,all,2080,666.8284505513639,0.0 +World,TCE,all,2090,725.0084398555248,0.0 +World,TCE,all,2100,725.0084398555248,0.0 +World,TCE,all,2110,725.0084398555248,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_INDC2030i_SSP2 - Low Emissions_v1.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_INDC2030i_SSP2 - Low Emissions_v1.csv new file mode 100644 index 0000000000..c260843a7e --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_INDC2030i_SSP2 - Low Emissions_v1.csv @@ -0,0 +1,149 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP2_v5.3.1/INDC2030i_SSP2 - Low Emissions#1 +# +node,type_emission,type_tec,year,value,mrg +R12_AFR,TCE,all,2035,1144.7307441122198,0.0 +R12_AFR,TCE,all,2040,290.02806507965744,0.0 +R12_AFR,TCE,all,2045,635.5421135282805,0.0 +R12_AFR,TCE,all,2050,751.7048155198095,0.0 +R12_AFR,TCE,all,2055,665.5069210564941,0.0 +R12_AFR,TCE,all,2060,1316.0196172950707,0.0 +R12_AFR,TCE,all,2070,577.9917686905636,0.0 +R12_AFR,TCE,all,2080,482.2467298009651,0.0 +R12_AFR,TCE,all,2090,452.45373924864845,0.0 +R12_AFR,TCE,all,2100,470.57504368065634,0.0 +R12_AFR,TCE,all,2110,646.4758898595861,0.0 +R12_EEU,TCE,all,2035,540.9933636792339,0.0 +R12_EEU,TCE,all,2040,274.15877153214996,0.0 +R12_EEU,TCE,all,2045,392.77033384159785,0.0 +R12_EEU,TCE,all,2050,1943.718781257219,0.0 +R12_EEU,TCE,all,2055,481.5608687334595,0.0 +R12_EEU,TCE,all,2060,1315.3423463068914,0.0 +R12_EEU,TCE,all,2070,577.9917686905636,0.0 +R12_EEU,TCE,all,2080,861.4574420047475,0.0 +R12_EEU,TCE,all,2090,801.6476016839207,0.0 +R12_EEU,TCE,all,2100,936.9888527164787,0.0 +R12_EEU,TCE,all,2110,967.0863883987788,0.0 +R12_GLB,TCE,all,2035,1886.585434931456,0.0 +R12_GLB,TCE,all,2040,493.72134962356336,0.0 +R12_GLB,TCE,all,2045,681.7858246064067,0.0 +R12_GLB,TCE,all,2050,1610.9601172741266,0.0 +R12_GLB,TCE,all,2055,4843.4447712080355,0.0 +R12_GLB,TCE,all,2060,2662.3425315002264,0.0 +R12_GLB,TCE,all,2070,1366.7932227578701,0.0 +R12_GLB,TCE,all,2080,1534.3268585360254,0.0 +R12_GLB,TCE,all,2090,1203.15543697706,0.0 +R12_GLB,TCE,all,2100,1133.941519991761,0.0 +R12_GLB,TCE,all,2110,1979.3458857277121,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2090,1389.2913357607752,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2100,2.641918813448744,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2110,217.3510975726432,0.0 +R12_LAM,TCE,all,2035,328.0262441991706,0.0 +R12_LAM,TCE,all,2040,158.44245000366243,0.0 +R12_LAM,TCE,all,2045,207.08265373581006,0.0 +R12_LAM,TCE,all,2050,264.90195966373744,0.0 +R12_LAM,TCE,all,2055,481.03020919243056,0.0 +R12_LAM,TCE,all,2060,1315.34234630689,0.0 +R12_LAM,TCE,all,2070,576.8885656170462,0.0 +R12_LAM,TCE,all,2080,480.44972824226653,0.0 +R12_LAM,TCE,all,2090,449.52661306537345,0.0 +R12_LAM,TCE,all,2100,465.8070635688211,0.0 +R12_LAM,TCE,all,2110,638.7093526748939,0.0 +R12_MEA,TCE,all,2035,2246.749800086071,0.0 +R12_MEA,TCE,all,2040,580.8902073450646,0.0 +R12_MEA,TCE,all,2045,484.39340973814797,0.0 +R12_MEA,TCE,all,2050,403.7748704021168,0.0 +R12_MEA,TCE,all,2055,484.3934097333345,0.0 +R12_MEA,TCE,all,2060,1316.0196172950707,0.0 +R12_MEA,TCE,all,2070,671.3286105046258,0.0 +R12_MEA,TCE,all,2080,680.1915845256253,0.0 +R12_MEA,TCE,all,2090,670.243109602987,0.0 +R12_MEA,TCE,all,2100,739.5139115484221,0.0 +R12_MEA,TCE,all,2110,814.4424252812374,0.0 +R12_NAM,TCE,all,2035,622.2809529349776,0.0 +R12_NAM,TCE,all,2040,238.49664572007958,0.0 +R12_NAM,TCE,all,2045,321.92612312379373,0.0 +R12_NAM,TCE,all,2050,265.31774529961973,0.0 +R12_NAM,TCE,all,2055,505.17897763339107,0.0 +R12_NAM,TCE,all,2060,2562.592133310032,0.0 +R12_NAM,TCE,all,2070,577.9917686905666,0.0 +R12_NAM,TCE,all,2080,480.44972824226653,0.0 +R12_NAM,TCE,all,2090,449.52661306533787,0.0 +R12_NAM,TCE,all,2100,465.8070635688211,0.0 +R12_NAM,TCE,all,2110,638.7093526749958,0.0 +R12_SAS,TCE,all,2035,193.19067831718118,0.0 +R12_SAS,TCE,all,2040,192.20883646140996,0.0 +R12_SAS,TCE,all,2045,260.1457945688015,0.0 +R12_SAS,TCE,all,2050,386.96581469278163,0.0 +R12_SAS,TCE,all,2055,614.9486955356471,0.0 +R12_SAS,TCE,all,2060,1316.0196172950707,0.0 +R12_SAS,TCE,all,2070,1354.5886087174383,0.0 +R12_SAS,TCE,all,2080,1531.2674598648898,0.0 +R12_SAS,TCE,all,2090,1203.15543697706,0.0 +R12_SAS,TCE,all,2100,1133.941519991761,0.0 +R12_SAS,TCE,all,2110,1585.6661933804294,0.0 +R12_WEU,TCE,all,2035,536.8661393347272,0.0 +R12_WEU,TCE,all,2040,158.44245000366243,0.0 +R12_WEU,TCE,all,2045,362.5411947572424,0.0 +R12_WEU,TCE,all,2050,682.6739785464823,0.0 +R12_WEU,TCE,all,2055,6532.974256097925,0.0 +R12_WEU,TCE,all,2060,1316.0196172950707,0.0 +R12_WEU,TCE,all,2070,577.9917686905636,0.0 +R12_WEU,TCE,all,2080,635.5849300066955,0.0 +R12_WEU,TCE,all,2090,766.129653580068,0.0 +R12_WEU,TCE,all,2100,1205.697014209272,0.0 +R12_WEU,TCE,all,2110,1862.8751305826381,0.0 +R12_FSU,TCE,all,2035,370.98714674092844,0.0 +R12_FSU,TCE,all,2040,158.44245000366243,0.0 +R12_FSU,TCE,all,2045,206.75687481045455,0.0 +R12_FSU,TCE,all,2050,264.90195966373744,0.0 +R12_FSU,TCE,all,2055,481.03020919243056,0.0 +R12_FSU,TCE,all,2060,1315.34234630689,0.0 +R12_FSU,TCE,all,2070,576.8885656170472,0.0 +R12_FSU,TCE,all,2080,482.2467298009651,0.0 +R12_FSU,TCE,all,2090,452.4537392486482,0.0 +R12_FSU,TCE,all,2100,470.5750436806933,0.0 +R12_FSU,TCE,all,2110,646.4758898595867,0.0 +R12_PAO,TCE,all,2035,140.9009579757698,0.0 +R12_PAO,TCE,all,2040,158.1871936911625,0.0 +R12_PAO,TCE,all,2045,206.75687481045455,0.0 +R12_PAO,TCE,all,2050,1622.6949704673827,0.0 +R12_PAO,TCE,all,2055,481.03020919243056,0.0 +R12_PAO,TCE,all,2060,1315.3423463068914,0.0 +R12_PAO,TCE,all,2070,576.8885656170452,0.0 +R12_PAO,TCE,all,2080,480.44972824226653,0.0 +R12_PAO,TCE,all,2090,449.5266130653737,0.0 +R12_PAO,TCE,all,2100,465.8070635688211,0.0 +R12_PAO,TCE,all,2110,638.7093526748934,0.0 +R12_PAS,TCE,all,2035,381.95037704564055,0.0 +R12_PAS,TCE,all,2040,272.23924321555876,0.0 +R12_PAS,TCE,all,2045,381.9503770714221,0.0 +R12_PAS,TCE,all,2050,367.5454016689501,0.0 +R12_PAS,TCE,all,2055,481.5608687334595,0.0 +R12_PAS,TCE,all,2060,1316.019617295073,0.0 +R12_PAS,TCE,all,2070,610.13217636962,0.0 +R12_PAS,TCE,all,2080,743.631854558414,0.0 +R12_PAS,TCE,all,2090,552.157699785385,0.0 +R12_PAS,TCE,all,2100,653.1236108423756,0.0 +R12_PAS,TCE,all,2110,802.9746748025088,0.0 +R12_CHN,TCE,all,2035,140.9009579757698,0.0 +R12_CHN,TCE,all,2040,158.18719369116243,0.0 +R12_CHN,TCE,all,2045,206.75687481045455,0.0 +R12_CHN,TCE,all,2050,264.90195966373744,0.0 +R12_CHN,TCE,all,2055,481.03020919243056,0.0 +R12_CHN,TCE,all,2060,2865.7026218752176,0.0 +R12_CHN,TCE,all,2070,577.9917686905742,0.0 +R12_CHN,TCE,all,2080,588.9806129448566,0.0 +R12_CHN,TCE,all,2090,772.8692137477758,0.0 +R12_CHN,TCE,all,2100,976.0906570571235,0.0 +R12_CHN,TCE,all,2110,1039.4418022179545,0.0 +R12_RCPA,TCE,all,2035,289.5166980409089,0.0 +R12_RCPA,TCE,all,2040,198.68458526884862,0.0 +R12_RCPA,TCE,all,2045,343.419435455161,0.0 +R12_RCPA,TCE,all,2050,1267.9874158918515,0.0 +R12_RCPA,TCE,all,2055,481.5608687334595,0.0 +R12_RCPA,TCE,all,2060,1315.34234630689,0.0 +R12_RCPA,TCE,all,2070,577.9917686905636,0.0 +R12_RCPA,TCE,all,2080,578.105309311869,0.0 +R12_RCPA,TCE,all,2090,707.5334858163386,0.0 +R12_RCPA,TCE,all,2100,940.1268220999553,0.0 +R12_RCPA,TCE,all,2110,952.4999453768245,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_NPIREF_price_cap_5$_bkp_v1.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_NPIREF_price_cap_5$_bkp_v1.csv new file mode 100644 index 0000000000..3e635bc438 --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_NPIREF_price_cap_5$_bkp_v1.csv @@ -0,0 +1,135 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP2_v5.3.1/NPIREF_price_cap_5$_bkp#1 +# +node,type_emission,type_tec,year,value,mrg +R12_AFR,TCE,all,2035,4.939501264870909,0.0 +R12_AFR,TCE,all,2040,6.517358881227476,0.0 +R12_AFR,TCE,all,2045,8.735782934835026,0.0 +R12_AFR,TCE,all,2050,11.697116993097785,0.0 +R12_AFR,TCE,all,2055,15.966093226420496,0.0 +R12_AFR,TCE,all,2060,21.83485979441791,0.0 +R12_AFR,TCE,all,2070,40.04767241988174,0.0 +R12_AFR,TCE,all,2080,68.17329124441527,0.0 +R12_AFR,TCE,all,2090,107.15920784293571,0.0 +R12_AFR,TCE,all,2100,160.37503449005862,0.0 +R12_AFR,TCE,all,2110,240.7646380977909,0.0 +R12_EEU,TCE,all,2035,21.01192479422267,0.0 +R12_EEU,TCE,all,2040,23.538878526293356,0.0 +R12_EEU,TCE,all,2045,25.573521588063123,0.0 +R12_EEU,TCE,all,2050,27.507977957511297,0.0 +R12_EEU,TCE,all,2055,29.38675470325586,0.0 +R12_EEU,TCE,all,2060,31.31118492494571,0.0 +R12_EEU,TCE,all,2070,35.12297329883151,0.0 +R12_EEU,TCE,all,2080,38.462905389729826,0.0 +R12_EEU,TCE,all,2090,41.54951293562896,0.0 +R12_EEU,TCE,all,2100,43.80426545834917,0.0 +R12_EEU,TCE,all,2110,46.224635226800885,0.0 +R12_LAM,TCE,all,2035,22.06615126756278,0.0 +R12_LAM,TCE,all,2040,26.753432793879558,0.0 +R12_LAM,TCE,all,2045,32.038855137140786,0.0 +R12_LAM,TCE,all,2050,38.22454800664373,0.0 +R12_LAM,TCE,all,2055,45.01348500509598,0.0 +R12_LAM,TCE,all,2060,52.60983503561255,0.0 +R12_LAM,TCE,all,2070,69.90244472466736,0.0 +R12_LAM,TCE,all,2080,89.96949152996308,0.0 +R12_LAM,TCE,all,2090,113.03037858090501,0.0 +R12_LAM,TCE,all,2100,137.15359797832056,0.0 +R12_LAM,TCE,all,2110,166.74483442342503,0.0 +R12_MEA,TCE,all,2035,7.03317518962529,0.0 +R12_MEA,TCE,all,2040,8.655102650467201,0.0 +R12_MEA,TCE,all,2045,10.384031708333085,0.0 +R12_MEA,TCE,all,2050,12.345985960703475,0.0 +R12_MEA,TCE,all,2055,14.508959152304278,0.0 +R12_MEA,TCE,all,2060,16.97327751341706,0.0 +R12_MEA,TCE,all,2070,22.692910371547672,0.0 +R12_MEA,TCE,all,2080,29.349915464915146,0.0 +R12_MEA,TCE,all,2090,37.19548817544246,0.0 +R12_MEA,TCE,all,2100,46.67483816102774,0.0 +R12_MEA,TCE,all,2110,58.89488094889977,0.0 +R12_NAM,TCE,all,2035,20.259992715470933,0.0 +R12_NAM,TCE,all,2040,22.204829683374243,0.0 +R12_NAM,TCE,all,2045,24.103748042288586,0.0 +R12_NAM,TCE,all,2050,26.05936243412684,0.0 +R12_NAM,TCE,all,2055,28.079131514596686,0.0 +R12_NAM,TCE,all,2060,30.21294153646445,0.0 +R12_NAM,TCE,all,2070,34.31208823415204,0.0 +R12_NAM,TCE,all,2080,37.82978770793861,0.0 +R12_NAM,TCE,all,2090,40.96943405185136,0.0 +R12_NAM,TCE,all,2100,43.94176614074666,0.0 +R12_NAM,TCE,all,2110,47.13005386972103,0.0 +R12_SAS,TCE,all,2035,26.005641955233884,0.0 +R12_SAS,TCE,all,2040,36.37504250029146,0.0 +R12_SAS,TCE,all,2045,48.39533294343941,0.0 +R12_SAS,TCE,all,2050,64.0662454544636,0.0 +R12_SAS,TCE,all,2055,80.8127001796375,0.0 +R12_SAS,TCE,all,2060,101.38623365579171,0.0 +R12_SAS,TCE,all,2070,146.85572468108043,0.0 +R12_SAS,TCE,all,2080,197.39935582886147,0.0 +R12_SAS,TCE,all,2090,252.26265365559,0.0 +R12_SAS,TCE,all,2100,313.53606927642585,0.0 +R12_SAS,TCE,all,2110,391.47185861348197,0.0 +R12_WEU,TCE,all,2035,20.335844127858206,0.0 +R12_WEU,TCE,all,2040,22.49394316675824,0.0 +R12_WEU,TCE,all,2045,24.85939707088851,0.0 +R12_WEU,TCE,all,2050,27.338977773107977,0.0 +R12_WEU,TCE,all,2055,30.00639369488424,0.0 +R12_WEU,TCE,all,2060,32.826669194842886,0.0 +R12_WEU,TCE,all,2070,38.88382757001529,0.0 +R12_WEU,TCE,all,2080,43.9708391586019,0.0 +R12_WEU,TCE,all,2090,48.369920613303144,0.0 +R12_WEU,TCE,all,2100,51.56491673602024,0.0 +R12_WEU,TCE,all,2110,55.00486547962741,0.0 +R12_FSU,TCE,all,2035,4.328488507418115,0.0 +R12_FSU,TCE,all,2040,5.053312884537483,0.0 +R12_FSU,TCE,all,2045,5.735507320476592,0.0 +R12_FSU,TCE,all,2050,6.459840529225125,0.0 +R12_FSU,TCE,all,2055,7.252546501305499,0.0 +R12_FSU,TCE,all,2060,8.164085723085067,0.0 +R12_FSU,TCE,all,2070,10.352378953574918,0.0 +R12_FSU,TCE,all,2080,12.839842328255793,0.0 +R12_FSU,TCE,all,2090,15.85079698566119,0.0 +R12_FSU,TCE,all,2100,19.342033439233397,0.0 +R12_FSU,TCE,all,2110,23.625290716779833,0.0 +R12_PAO,TCE,all,2035,19.82268504538294,0.0 +R12_PAO,TCE,all,2040,21.3112167231149,0.0 +R12_PAO,TCE,all,2045,22.950234656290803,0.0 +R12_PAO,TCE,all,2050,24.715850269991968,0.0 +R12_PAO,TCE,all,2055,26.60507936847149,0.0 +R12_PAO,TCE,all,2060,28.543611166642524,0.0 +R12_PAO,TCE,all,2070,32.9093731387074,0.0 +R12_PAO,TCE,all,2080,37.01764140303216,0.0 +R12_PAO,TCE,all,2090,39.89246579026579,0.0 +R12_PAO,TCE,all,2100,41.570745336486624,0.0 +R12_PAO,TCE,all,2110,43.37936574053836,0.0 +R12_PAS,TCE,all,2035,22.486668546441056,0.0 +R12_PAS,TCE,all,2040,26.97606033613722,0.0 +R12_PAS,TCE,all,2045,31.434036000558486,0.0 +R12_PAS,TCE,all,2050,36.17216462759882,0.0 +R12_PAS,TCE,all,2055,40.402124593417284,0.0 +R12_PAS,TCE,all,2060,44.817635054842,0.0 +R12_PAS,TCE,all,2070,54.16794277369114,0.0 +R12_PAS,TCE,all,2080,64.19638005105108,0.0 +R12_PAS,TCE,all,2090,74.6729097361293,0.0 +R12_PAS,TCE,all,2100,84.57711601121015,0.0 +R12_PAS,TCE,all,2110,96.2300183632933,0.0 +R12_CHN,TCE,all,2035,4.412195006955576,0.0 +R12_CHN,TCE,all,2040,5.105834522427182,0.0 +R12_CHN,TCE,all,2045,5.738503991970496,0.0 +R12_CHN,TCE,all,2050,6.377369901160383,0.0 +R12_CHN,TCE,all,2055,6.949501162364648,0.0 +R12_CHN,TCE,all,2060,7.536747660909567,0.0 +R12_CHN,TCE,all,2070,8.676898743749756,0.0 +R12_CHN,TCE,all,2080,9.621632835139597,0.0 +R12_CHN,TCE,all,2090,10.488358442192343,0.0 +R12_CHN,TCE,all,2100,11.046255664234735,0.0 +R12_CHN,TCE,all,2110,11.633905933184884,0.0 +R12_RCPA,TCE,all,2035,5.010611457557571,0.0 +R12_RCPA,TCE,all,2040,6.434536314135756,0.0 +R12_RCPA,TCE,all,2045,7.81456487462952,0.0 +R12_RCPA,TCE,all,2050,9.254835255846391,0.0 +R12_RCPA,TCE,all,2055,10.725247458549777,0.0 +R12_RCPA,TCE,all,2060,12.28584725436816,0.0 +R12_RCPA,TCE,all,2070,15.65765889905252,0.0 +R12_RCPA,TCE,all,2080,19.155326196212215,0.0 +R12_RCPA,TCE,all,2090,22.891116877280986,0.0 +R12_RCPA,TCE,all,2100,26.415693495404078,0.0 +R12_RCPA,TCE,all,2110,30.57266065009673,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_NPiREF_SSP2 - Low Overshootf_price_cap_5$_bkp_v1.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_NPiREF_SSP2 - Low Overshootf_price_cap_5$_bkp_v1.csv new file mode 100644 index 0000000000..bdfc192033 --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_NPiREF_SSP2 - Low Overshootf_price_cap_5$_bkp_v1.csv @@ -0,0 +1,13 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP2_v5.3.1/NPiREF_SSP2 - Low Overshootf_price_cap_5$_bkp#1 +# +node,type_emission,type_tec,year,value,mrg +World,TCE,all,2040,155.5833194852561,0.0 +World,TCE,all,2045,198.5681220915794,0.0 +World,TCE,all,2050,253.42883312573176,0.0 +World,TCE,all,2055,323.44654712426075,0.0 +World,TCE,all,2060,412.8088645489815,0.0 +World,TCE,all,2070,590.8075278801834,0.0 +World,TCE,all,2080,962.3632076236946,0.0 +World,TCE,all,2090,1567.58825790654,0.0 +World,TCE,all,2100,2553.4360903033744,0.0 +World,TCE,all,2110,4159.278327314766,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_NPiREF_SSP2 - Low Overshootf_v3.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_NPiREF_SSP2 - Low Overshootf_v3.csv new file mode 100644 index 0000000000..a0c39a9395 --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_NPiREF_SSP2 - Low Overshootf_v3.csv @@ -0,0 +1,13 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP2_v5.3.1/NPiREF_SSP2 - Low Overshootf#3 +# +node,type_emission,type_tec,year,value,mrg +World,TCE,all,2040,155.58450773972842,0.0 +World,TCE,all,2045,198.56963863885395,0.0 +World,TCE,all,2050,253.43076866705695,0.0 +World,TCE,all,2055,323.44901741996756,0.0 +World,TCE,all,2060,412.81201734184594,0.0 +World,TCE,all,2070,590.8120401228172,0.0 +World,TCE,all,2080,962.3705575914754,0.0 +World,TCE,all,2090,1567.600230229565,0.0 +World,TCE,all,2100,2553.45559195602,0.0 +World,TCE,all,2110,4159.310093451973,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_NPiREF_SSP2 - Medium-Low Emissionsf_v1.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_NPiREF_SSP2 - Medium-Low Emissionsf_v1.csv new file mode 100644 index 0000000000..928d44c1e5 --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_NPiREF_SSP2 - Medium-Low Emissionsf_v1.csv @@ -0,0 +1,12 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP2_v5.3.1/NPiREF_SSP2 - Medium-Low Emissionsf#1 +# +node,type_emission,type_tec,year,value,mrg +World,TCE,all,2045,32.85059839588945,0.0 +World,TCE,all,2050,41.926613049765784,0.0 +World,TCE,all,2055,53.51016321348798,0.0 +World,TCE,all,2060,68.29403471574047,0.0 +World,TCE,all,2070,97.74167486314363,0.0 +World,TCE,all,2080,159.21088899680245,0.0 +World,TCE,all,2090,259.3377616113513,0.0 +World,TCE,all,2100,422.4338864092193,0.0 +World,TCE,all,2110,688.1002877406897,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_NPiREF_v10.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_NPiREF_v10.csv new file mode 100644 index 0000000000..003be220d1 --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_NPiREF_v10.csv @@ -0,0 +1,124 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP2_v5.3.1/NPiREF#10 +# +node,type_emission,type_tec,year,value,mrg +R12_AFR,TCE,all,2035,3.72,0.0 +R12_AFR,TCE,all,2040,3.7200000000000006,0.0 +R12_AFR,TCE,all,2045,3.72,0.0 +R12_AFR,TCE,all,2050,3.72,0.0 +R12_AFR,TCE,all,2055,3.72,0.0 +R12_AFR,TCE,all,2060,3.72,0.0 +R12_AFR,TCE,all,2070,3.72,0.0 +R12_AFR,TCE,all,2080,3.72,0.0 +R12_AFR,TCE,all,2090,3.72,0.0 +R12_AFR,TCE,all,2100,3.72,0.0 +R12_AFR,TCE,all,2110,3.72,0.0 +R12_EEU,TCE,all,2035,248.45900000000003,0.0 +R12_EEU,TCE,all,2040,248.45900000000003,0.0 +R12_EEU,TCE,all,2045,248.45899999999997,0.0 +R12_EEU,TCE,all,2050,248.45900000000003,0.0 +R12_EEU,TCE,all,2055,248.45900000000003,0.0 +R12_EEU,TCE,all,2060,248.459,0.0 +R12_EEU,TCE,all,2070,248.459,0.0 +R12_EEU,TCE,all,2080,248.459,0.0 +R12_EEU,TCE,all,2090,248.459,0.0 +R12_EEU,TCE,all,2100,248.45899999999997,0.0 +R12_EEU,TCE,all,2110,248.45899999999997,0.0 +R12_LAM,TCE,all,2035,22.723,0.0 +R12_LAM,TCE,all,2040,22.723,0.0 +R12_LAM,TCE,all,2045,22.723,0.0 +R12_LAM,TCE,all,2050,22.723,0.0 +R12_LAM,TCE,all,2055,22.723,0.0 +R12_LAM,TCE,all,2060,22.723,0.0 +R12_LAM,TCE,all,2070,22.723,0.0 +R12_LAM,TCE,all,2080,22.723000000000003,0.0 +R12_LAM,TCE,all,2090,22.723000000000003,0.0 +R12_LAM,TCE,all,2100,22.723,0.0 +R12_LAM,TCE,all,2110,22.723,0.0 +R12_MEA,TCE,all,2035,5.675,0.0 +R12_MEA,TCE,all,2040,5.675,0.0 +R12_MEA,TCE,all,2045,5.675000000000001,0.0 +R12_MEA,TCE,all,2050,5.675,0.0 +R12_MEA,TCE,all,2055,5.675,0.0 +R12_MEA,TCE,all,2060,5.675,0.0 +R12_MEA,TCE,all,2070,5.675,0.0 +R12_MEA,TCE,all,2080,5.675,0.0 +R12_MEA,TCE,all,2090,5.675,0.0 +R12_MEA,TCE,all,2100,5.675,0.0 +R12_MEA,TCE,all,2110,5.675,0.0 +R12_NAM,TCE,all,2035,114.017,0.0 +R12_NAM,TCE,all,2040,114.017,0.0 +R12_NAM,TCE,all,2045,114.017,0.0 +R12_NAM,TCE,all,2050,114.017,0.0 +R12_NAM,TCE,all,2055,114.017,0.0 +R12_NAM,TCE,all,2060,114.01700000000001,0.0 +R12_NAM,TCE,all,2070,114.017,0.0 +R12_NAM,TCE,all,2080,114.017,0.0 +R12_NAM,TCE,all,2090,114.017,0.0 +R12_NAM,TCE,all,2100,114.017,0.0 +R12_NAM,TCE,all,2110,114.017,0.0 +R12_SAS,TCE,all,2035,18.999,0.0 +R12_SAS,TCE,all,2040,18.999,0.0 +R12_SAS,TCE,all,2045,18.999,0.0 +R12_SAS,TCE,all,2050,18.999,0.0 +R12_SAS,TCE,all,2055,18.999,0.0 +R12_SAS,TCE,all,2060,18.999,0.0 +R12_SAS,TCE,all,2070,18.999,0.0 +R12_SAS,TCE,all,2080,18.999,0.0 +R12_SAS,TCE,all,2090,18.999,0.0 +R12_SAS,TCE,all,2100,18.999,0.0 +R12_SAS,TCE,all,2110,18.999,0.0 +R12_WEU,TCE,all,2035,216.40700000000004,0.0 +R12_WEU,TCE,all,2040,216.407,0.0 +R12_WEU,TCE,all,2045,216.40699999999998,0.0 +R12_WEU,TCE,all,2050,216.407,0.0 +R12_WEU,TCE,all,2055,216.407,0.0 +R12_WEU,TCE,all,2060,216.407,0.0 +R12_WEU,TCE,all,2070,216.407,0.0 +R12_WEU,TCE,all,2080,216.40700000000004,0.0 +R12_WEU,TCE,all,2090,216.407,0.0 +R12_WEU,TCE,all,2100,216.407,0.0 +R12_WEU,TCE,all,2110,216.40700000000004,0.0 +R12_FSU,TCE,all,2035,0.321,0.0 +R12_FSU,TCE,all,2040,0.321,0.0 +R12_FSU,TCE,all,2045,0.321,0.0 +R12_FSU,TCE,all,2050,0.321,0.0 +R12_FSU,TCE,all,2055,0.321,0.0 +R12_FSU,TCE,all,2060,0.321,0.0 +R12_FSU,TCE,all,2070,0.321,0.0 +R12_FSU,TCE,all,2080,0.321,0.0 +R12_FSU,TCE,all,2090,0.32100000000000006,0.0 +R12_FSU,TCE,all,2100,0.321,0.0 +R12_FSU,TCE,all,2110,0.321,0.0 +R12_PAO,TCE,all,2035,43.419,0.0 +R12_PAO,TCE,all,2040,43.419,0.0 +R12_PAO,TCE,all,2045,43.419,0.0 +R12_PAO,TCE,all,2050,43.419,0.0 +R12_PAO,TCE,all,2055,43.419,0.0 +R12_PAO,TCE,all,2060,43.419,0.0 +R12_PAO,TCE,all,2070,43.419,0.0 +R12_PAO,TCE,all,2080,43.419,0.0 +R12_PAO,TCE,all,2090,43.419,0.0 +R12_PAO,TCE,all,2100,43.419,0.0 +R12_PAO,TCE,all,2110,43.419,0.0 +R12_PAS,TCE,all,2035,80.127,0.0 +R12_PAS,TCE,all,2040,80.127,0.0 +R12_PAS,TCE,all,2045,80.127,0.0 +R12_PAS,TCE,all,2050,80.127,0.0 +R12_PAS,TCE,all,2055,80.127,0.0 +R12_PAS,TCE,all,2060,80.12700000000001,0.0 +R12_PAS,TCE,all,2070,80.127,0.0 +R12_PAS,TCE,all,2080,80.127,0.0 +R12_PAS,TCE,all,2090,80.127,0.0 +R12_PAS,TCE,all,2100,80.127,0.0 +R12_PAS,TCE,all,2110,80.127,0.0 +R12_RCPA,TCE,all,2035,0.045,0.0 +R12_RCPA,TCE,all,2040,0.045,0.0 +R12_RCPA,TCE,all,2045,0.045,0.0 +R12_RCPA,TCE,all,2050,0.045,0.0 +R12_RCPA,TCE,all,2055,0.045,0.0 +R12_RCPA,TCE,all,2060,0.045,0.0 +R12_RCPA,TCE,all,2070,0.045,0.0 +R12_RCPA,TCE,all,2080,0.045,0.0 +R12_RCPA,TCE,all,2090,0.045000000000000005,0.0 +R12_RCPA,TCE,all,2100,0.045,0.0 +R12_RCPA,TCE,all,2110,0.045,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_SSP2 - Low Emissions_a_v2.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_SSP2 - Low Emissions_a_v2.csv new file mode 100644 index 0000000000..ea45c9b56a --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_SSP2 - Low Emissions_a_v2.csv @@ -0,0 +1,14 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP2_v5.3.1/SSP2 - Low Emissions_a#2 +# +node,type_emission,type_tec,year,value,mrg +World,TCE,all,2035,83.80436441700445,0.0 +World,TCE,all,2040,108.06610135885757,0.0 +World,TCE,all,2045,137.70654767144842,0.0 +World,TCE,all,2050,175.42425850549873,0.0 +World,TCE,all,2055,223.69051884879357,0.0 +World,TCE,all,2060,285.71432489865106,0.0 +World,TCE,all,2070,409.15975445957497,0.0 +World,TCE,all,2080,666.8284505513639,0.0 +World,TCE,all,2090,725.0084398555248,0.0 +World,TCE,all,2100,725.0084398555248,0.0 +World,TCE,all,2110,725.0084398555248,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_SSP2 - Low Emissions_v2.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_SSP2 - Low Emissions_v2.csv new file mode 100644 index 0000000000..d75c50f0ba --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_SSP2 - Low Emissions_v2.csv @@ -0,0 +1,149 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP2_v5.3.1/SSP2 - Low Emissions#2 +# +node,type_emission,type_tec,year,value,mrg +R12_AFR,TCE,all,2035,1144.7307441122198,0.0 +R12_AFR,TCE,all,2040,290.02806507965744,0.0 +R12_AFR,TCE,all,2045,635.5421135282805,0.0 +R12_AFR,TCE,all,2050,751.7048155198095,0.0 +R12_AFR,TCE,all,2055,665.5069210564941,0.0 +R12_AFR,TCE,all,2060,1316.0196172950707,0.0 +R12_AFR,TCE,all,2070,577.9917686905636,0.0 +R12_AFR,TCE,all,2080,482.2467298009651,0.0 +R12_AFR,TCE,all,2090,452.45373924864845,0.0 +R12_AFR,TCE,all,2100,470.57504368065634,0.0 +R12_AFR,TCE,all,2110,646.4758898595861,0.0 +R12_EEU,TCE,all,2035,540.9933636792339,0.0 +R12_EEU,TCE,all,2040,274.15877153214996,0.0 +R12_EEU,TCE,all,2045,392.77033384159785,0.0 +R12_EEU,TCE,all,2050,1943.718781257219,0.0 +R12_EEU,TCE,all,2055,481.5608687334595,0.0 +R12_EEU,TCE,all,2060,1315.3423463068914,0.0 +R12_EEU,TCE,all,2070,577.9917686905636,0.0 +R12_EEU,TCE,all,2080,861.4574420047475,0.0 +R12_EEU,TCE,all,2090,801.6476016839207,0.0 +R12_EEU,TCE,all,2100,936.9888527164787,0.0 +R12_EEU,TCE,all,2110,967.0863883987788,0.0 +R12_GLB,TCE,all,2035,1886.585434931456,0.0 +R12_GLB,TCE,all,2040,493.72134962356336,0.0 +R12_GLB,TCE,all,2045,681.7858246064067,0.0 +R12_GLB,TCE,all,2050,1610.9601172741266,0.0 +R12_GLB,TCE,all,2055,4843.4447712080355,0.0 +R12_GLB,TCE,all,2060,2662.3425315002264,0.0 +R12_GLB,TCE,all,2070,1366.7932227578701,0.0 +R12_GLB,TCE,all,2080,1534.3268585360254,0.0 +R12_GLB,TCE,all,2090,1203.15543697706,0.0 +R12_GLB,TCE,all,2100,1133.941519991761,0.0 +R12_GLB,TCE,all,2110,1979.3458857277121,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2090,1389.2913357607752,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2100,2.641918813448744,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2110,217.3510975726432,0.0 +R12_LAM,TCE,all,2035,328.0262441991706,0.0 +R12_LAM,TCE,all,2040,158.44245000366243,0.0 +R12_LAM,TCE,all,2045,207.08265373581006,0.0 +R12_LAM,TCE,all,2050,264.90195966373744,0.0 +R12_LAM,TCE,all,2055,481.03020919243056,0.0 +R12_LAM,TCE,all,2060,1315.34234630689,0.0 +R12_LAM,TCE,all,2070,576.8885656170462,0.0 +R12_LAM,TCE,all,2080,480.44972824226653,0.0 +R12_LAM,TCE,all,2090,449.52661306537345,0.0 +R12_LAM,TCE,all,2100,465.8070635688211,0.0 +R12_LAM,TCE,all,2110,638.7093526748939,0.0 +R12_MEA,TCE,all,2035,2246.749800086071,0.0 +R12_MEA,TCE,all,2040,580.8902073450646,0.0 +R12_MEA,TCE,all,2045,484.39340973814797,0.0 +R12_MEA,TCE,all,2050,403.7748704021168,0.0 +R12_MEA,TCE,all,2055,484.3934097333345,0.0 +R12_MEA,TCE,all,2060,1316.0196172950707,0.0 +R12_MEA,TCE,all,2070,671.3286105046258,0.0 +R12_MEA,TCE,all,2080,680.1915845256253,0.0 +R12_MEA,TCE,all,2090,670.243109602987,0.0 +R12_MEA,TCE,all,2100,739.5139115484221,0.0 +R12_MEA,TCE,all,2110,814.4424252812374,0.0 +R12_NAM,TCE,all,2035,622.2809529349776,0.0 +R12_NAM,TCE,all,2040,238.49664572007958,0.0 +R12_NAM,TCE,all,2045,321.92612312379373,0.0 +R12_NAM,TCE,all,2050,265.31774529961973,0.0 +R12_NAM,TCE,all,2055,505.17897763339107,0.0 +R12_NAM,TCE,all,2060,2562.592133310032,0.0 +R12_NAM,TCE,all,2070,577.9917686905666,0.0 +R12_NAM,TCE,all,2080,480.44972824226653,0.0 +R12_NAM,TCE,all,2090,449.52661306533787,0.0 +R12_NAM,TCE,all,2100,465.8070635688211,0.0 +R12_NAM,TCE,all,2110,638.7093526749958,0.0 +R12_SAS,TCE,all,2035,193.19067831718118,0.0 +R12_SAS,TCE,all,2040,192.20883646140996,0.0 +R12_SAS,TCE,all,2045,260.1457945688015,0.0 +R12_SAS,TCE,all,2050,386.96581469278163,0.0 +R12_SAS,TCE,all,2055,614.9486955356471,0.0 +R12_SAS,TCE,all,2060,1316.0196172950707,0.0 +R12_SAS,TCE,all,2070,1354.5886087174383,0.0 +R12_SAS,TCE,all,2080,1531.2674598648898,0.0 +R12_SAS,TCE,all,2090,1203.15543697706,0.0 +R12_SAS,TCE,all,2100,1133.941519991761,0.0 +R12_SAS,TCE,all,2110,1585.6661933804294,0.0 +R12_WEU,TCE,all,2035,536.8661393347272,0.0 +R12_WEU,TCE,all,2040,158.44245000366243,0.0 +R12_WEU,TCE,all,2045,362.5411947572424,0.0 +R12_WEU,TCE,all,2050,682.6739785464823,0.0 +R12_WEU,TCE,all,2055,6532.974256097925,0.0 +R12_WEU,TCE,all,2060,1316.0196172950707,0.0 +R12_WEU,TCE,all,2070,577.9917686905636,0.0 +R12_WEU,TCE,all,2080,635.5849300066955,0.0 +R12_WEU,TCE,all,2090,766.129653580068,0.0 +R12_WEU,TCE,all,2100,1205.697014209272,0.0 +R12_WEU,TCE,all,2110,1862.8751305826381,0.0 +R12_FSU,TCE,all,2035,370.98714674092844,0.0 +R12_FSU,TCE,all,2040,158.44245000366243,0.0 +R12_FSU,TCE,all,2045,206.75687481045455,0.0 +R12_FSU,TCE,all,2050,264.90195966373744,0.0 +R12_FSU,TCE,all,2055,481.03020919243056,0.0 +R12_FSU,TCE,all,2060,1315.34234630689,0.0 +R12_FSU,TCE,all,2070,576.8885656170472,0.0 +R12_FSU,TCE,all,2080,482.2467298009651,0.0 +R12_FSU,TCE,all,2090,452.4537392486482,0.0 +R12_FSU,TCE,all,2100,470.5750436806933,0.0 +R12_FSU,TCE,all,2110,646.4758898595867,0.0 +R12_PAO,TCE,all,2035,140.9009579757698,0.0 +R12_PAO,TCE,all,2040,158.1871936911625,0.0 +R12_PAO,TCE,all,2045,206.75687481045455,0.0 +R12_PAO,TCE,all,2050,1622.6949704673827,0.0 +R12_PAO,TCE,all,2055,481.03020919243056,0.0 +R12_PAO,TCE,all,2060,1315.3423463068914,0.0 +R12_PAO,TCE,all,2070,576.8885656170452,0.0 +R12_PAO,TCE,all,2080,480.44972824226653,0.0 +R12_PAO,TCE,all,2090,449.5266130653737,0.0 +R12_PAO,TCE,all,2100,465.8070635688211,0.0 +R12_PAO,TCE,all,2110,638.7093526748934,0.0 +R12_PAS,TCE,all,2035,381.95037704564055,0.0 +R12_PAS,TCE,all,2040,272.23924321555876,0.0 +R12_PAS,TCE,all,2045,381.9503770714221,0.0 +R12_PAS,TCE,all,2050,367.5454016689501,0.0 +R12_PAS,TCE,all,2055,481.5608687334595,0.0 +R12_PAS,TCE,all,2060,1316.019617295073,0.0 +R12_PAS,TCE,all,2070,610.13217636962,0.0 +R12_PAS,TCE,all,2080,743.631854558414,0.0 +R12_PAS,TCE,all,2090,552.157699785385,0.0 +R12_PAS,TCE,all,2100,653.1236108423756,0.0 +R12_PAS,TCE,all,2110,802.9746748025088,0.0 +R12_CHN,TCE,all,2035,140.9009579757698,0.0 +R12_CHN,TCE,all,2040,158.18719369116243,0.0 +R12_CHN,TCE,all,2045,206.75687481045455,0.0 +R12_CHN,TCE,all,2050,264.90195966373744,0.0 +R12_CHN,TCE,all,2055,481.03020919243056,0.0 +R12_CHN,TCE,all,2060,2865.7026218752176,0.0 +R12_CHN,TCE,all,2070,577.9917686905742,0.0 +R12_CHN,TCE,all,2080,588.9806129448566,0.0 +R12_CHN,TCE,all,2090,772.8692137477758,0.0 +R12_CHN,TCE,all,2100,976.0906570571235,0.0 +R12_CHN,TCE,all,2110,1039.4418022179545,0.0 +R12_RCPA,TCE,all,2035,289.5166980409089,0.0 +R12_RCPA,TCE,all,2040,198.68458526884862,0.0 +R12_RCPA,TCE,all,2045,343.419435455161,0.0 +R12_RCPA,TCE,all,2050,1267.9874158918515,0.0 +R12_RCPA,TCE,all,2055,481.5608687334595,0.0 +R12_RCPA,TCE,all,2060,1315.34234630689,0.0 +R12_RCPA,TCE,all,2070,577.9917686905636,0.0 +R12_RCPA,TCE,all,2080,578.105309311869,0.0 +R12_RCPA,TCE,all,2090,707.5334858163386,0.0 +R12_RCPA,TCE,all,2100,940.1268220999553,0.0 +R12_RCPA,TCE,all,2110,952.4999453768245,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_SSP2 - Low Overshoot_v2.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_SSP2 - Low Overshoot_v2.csv new file mode 100644 index 0000000000..c6d49fd8f4 --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_SSP2 - Low Overshoot_v2.csv @@ -0,0 +1,13 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP2_v5.3.1/SSP2 - Low Overshoot#2 +# +node,type_emission,type_tec,year,value,mrg +World,TCE,all,2040,155.58450773972842,0.0 +World,TCE,all,2045,198.56963863885395,0.0 +World,TCE,all,2050,253.43076866705695,0.0 +World,TCE,all,2055,323.44901741996756,0.0 +World,TCE,all,2060,412.81201734184594,0.0 +World,TCE,all,2070,590.8120401228172,0.0 +World,TCE,all,2080,962.3705575914754,0.0 +World,TCE,all,2090,1567.600230229565,0.0 +World,TCE,all,2100,2553.45559195602,0.0 +World,TCE,all,2110,4159.310093451973,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_SSP2 - Medium Emissions_a_v2.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_SSP2 - Medium Emissions_a_v2.csv new file mode 100644 index 0000000000..90f4831ec9 --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_SSP2 - Medium Emissions_a_v2.csv @@ -0,0 +1,135 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP2_v5.3.1/SSP2 - Medium Emissions_a#2 +# +node,type_emission,type_tec,year,value,mrg +R12_AFR,TCE,all,2035,4.939501264870909,0.0 +R12_AFR,TCE,all,2040,6.517358881227476,0.0 +R12_AFR,TCE,all,2045,8.735782934835026,0.0 +R12_AFR,TCE,all,2050,11.697116993097785,0.0 +R12_AFR,TCE,all,2055,15.966093226420496,0.0 +R12_AFR,TCE,all,2060,21.83485979441791,0.0 +R12_AFR,TCE,all,2070,40.04767241988174,0.0 +R12_AFR,TCE,all,2080,68.17329124441527,0.0 +R12_AFR,TCE,all,2090,107.15920784293571,0.0 +R12_AFR,TCE,all,2100,160.37503449005862,0.0 +R12_AFR,TCE,all,2110,240.7646380977909,0.0 +R12_EEU,TCE,all,2035,21.01192479422267,0.0 +R12_EEU,TCE,all,2040,23.538878526293356,0.0 +R12_EEU,TCE,all,2045,25.573521588063123,0.0 +R12_EEU,TCE,all,2050,27.507977957511297,0.0 +R12_EEU,TCE,all,2055,29.38675470325586,0.0 +R12_EEU,TCE,all,2060,31.31118492494571,0.0 +R12_EEU,TCE,all,2070,35.12297329883151,0.0 +R12_EEU,TCE,all,2080,38.462905389729826,0.0 +R12_EEU,TCE,all,2090,41.54951293562896,0.0 +R12_EEU,TCE,all,2100,43.80426545834917,0.0 +R12_EEU,TCE,all,2110,46.224635226800885,0.0 +R12_LAM,TCE,all,2035,22.06615126756278,0.0 +R12_LAM,TCE,all,2040,26.753432793879558,0.0 +R12_LAM,TCE,all,2045,32.038855137140786,0.0 +R12_LAM,TCE,all,2050,38.22454800664373,0.0 +R12_LAM,TCE,all,2055,45.01348500509598,0.0 +R12_LAM,TCE,all,2060,52.60983503561255,0.0 +R12_LAM,TCE,all,2070,69.90244472466736,0.0 +R12_LAM,TCE,all,2080,89.96949152996308,0.0 +R12_LAM,TCE,all,2090,113.03037858090501,0.0 +R12_LAM,TCE,all,2100,137.15359797832056,0.0 +R12_LAM,TCE,all,2110,166.74483442342503,0.0 +R12_MEA,TCE,all,2035,7.03317518962529,0.0 +R12_MEA,TCE,all,2040,8.655102650467201,0.0 +R12_MEA,TCE,all,2045,10.384031708333085,0.0 +R12_MEA,TCE,all,2050,12.345985960703475,0.0 +R12_MEA,TCE,all,2055,14.508959152304278,0.0 +R12_MEA,TCE,all,2060,16.97327751341706,0.0 +R12_MEA,TCE,all,2070,22.692910371547672,0.0 +R12_MEA,TCE,all,2080,29.349915464915146,0.0 +R12_MEA,TCE,all,2090,37.19548817544246,0.0 +R12_MEA,TCE,all,2100,46.67483816102774,0.0 +R12_MEA,TCE,all,2110,58.89488094889977,0.0 +R12_NAM,TCE,all,2035,20.259992715470933,0.0 +R12_NAM,TCE,all,2040,22.204829683374243,0.0 +R12_NAM,TCE,all,2045,24.103748042288586,0.0 +R12_NAM,TCE,all,2050,26.05936243412684,0.0 +R12_NAM,TCE,all,2055,28.079131514596686,0.0 +R12_NAM,TCE,all,2060,30.21294153646445,0.0 +R12_NAM,TCE,all,2070,34.31208823415204,0.0 +R12_NAM,TCE,all,2080,37.82978770793861,0.0 +R12_NAM,TCE,all,2090,40.96943405185136,0.0 +R12_NAM,TCE,all,2100,43.94176614074666,0.0 +R12_NAM,TCE,all,2110,47.13005386972103,0.0 +R12_SAS,TCE,all,2035,26.005641955233884,0.0 +R12_SAS,TCE,all,2040,36.37504250029146,0.0 +R12_SAS,TCE,all,2045,48.39533294343941,0.0 +R12_SAS,TCE,all,2050,64.0662454544636,0.0 +R12_SAS,TCE,all,2055,80.8127001796375,0.0 +R12_SAS,TCE,all,2060,101.38623365579171,0.0 +R12_SAS,TCE,all,2070,146.85572468108043,0.0 +R12_SAS,TCE,all,2080,197.39935582886147,0.0 +R12_SAS,TCE,all,2090,252.26265365559,0.0 +R12_SAS,TCE,all,2100,313.53606927642585,0.0 +R12_SAS,TCE,all,2110,391.47185861348197,0.0 +R12_WEU,TCE,all,2035,20.335844127858206,0.0 +R12_WEU,TCE,all,2040,22.49394316675824,0.0 +R12_WEU,TCE,all,2045,24.85939707088851,0.0 +R12_WEU,TCE,all,2050,27.338977773107977,0.0 +R12_WEU,TCE,all,2055,30.00639369488424,0.0 +R12_WEU,TCE,all,2060,32.826669194842886,0.0 +R12_WEU,TCE,all,2070,38.88382757001529,0.0 +R12_WEU,TCE,all,2080,43.9708391586019,0.0 +R12_WEU,TCE,all,2090,48.369920613303144,0.0 +R12_WEU,TCE,all,2100,51.56491673602024,0.0 +R12_WEU,TCE,all,2110,55.00486547962741,0.0 +R12_FSU,TCE,all,2035,4.328488507418115,0.0 +R12_FSU,TCE,all,2040,5.053312884537483,0.0 +R12_FSU,TCE,all,2045,5.735507320476592,0.0 +R12_FSU,TCE,all,2050,6.459840529225125,0.0 +R12_FSU,TCE,all,2055,7.252546501305499,0.0 +R12_FSU,TCE,all,2060,8.164085723085067,0.0 +R12_FSU,TCE,all,2070,10.352378953574918,0.0 +R12_FSU,TCE,all,2080,12.839842328255793,0.0 +R12_FSU,TCE,all,2090,15.85079698566119,0.0 +R12_FSU,TCE,all,2100,19.342033439233397,0.0 +R12_FSU,TCE,all,2110,23.625290716779833,0.0 +R12_PAO,TCE,all,2035,19.82268504538294,0.0 +R12_PAO,TCE,all,2040,21.3112167231149,0.0 +R12_PAO,TCE,all,2045,22.950234656290803,0.0 +R12_PAO,TCE,all,2050,24.715850269991968,0.0 +R12_PAO,TCE,all,2055,26.60507936847149,0.0 +R12_PAO,TCE,all,2060,28.543611166642524,0.0 +R12_PAO,TCE,all,2070,32.9093731387074,0.0 +R12_PAO,TCE,all,2080,37.01764140303216,0.0 +R12_PAO,TCE,all,2090,39.89246579026579,0.0 +R12_PAO,TCE,all,2100,41.570745336486624,0.0 +R12_PAO,TCE,all,2110,43.37936574053836,0.0 +R12_PAS,TCE,all,2035,22.486668546441056,0.0 +R12_PAS,TCE,all,2040,26.97606033613722,0.0 +R12_PAS,TCE,all,2045,31.434036000558486,0.0 +R12_PAS,TCE,all,2050,36.17216462759882,0.0 +R12_PAS,TCE,all,2055,40.402124593417284,0.0 +R12_PAS,TCE,all,2060,44.817635054842,0.0 +R12_PAS,TCE,all,2070,54.16794277369114,0.0 +R12_PAS,TCE,all,2080,64.19638005105108,0.0 +R12_PAS,TCE,all,2090,74.6729097361293,0.0 +R12_PAS,TCE,all,2100,84.57711601121015,0.0 +R12_PAS,TCE,all,2110,96.2300183632933,0.0 +R12_CHN,TCE,all,2035,4.412195006955576,0.0 +R12_CHN,TCE,all,2040,5.105834522427182,0.0 +R12_CHN,TCE,all,2045,5.738503991970496,0.0 +R12_CHN,TCE,all,2050,6.377369901160383,0.0 +R12_CHN,TCE,all,2055,6.949501162364648,0.0 +R12_CHN,TCE,all,2060,7.536747660909567,0.0 +R12_CHN,TCE,all,2070,8.676898743749756,0.0 +R12_CHN,TCE,all,2080,9.621632835139597,0.0 +R12_CHN,TCE,all,2090,10.488358442192343,0.0 +R12_CHN,TCE,all,2100,11.046255664234735,0.0 +R12_CHN,TCE,all,2110,11.633905933184884,0.0 +R12_RCPA,TCE,all,2035,5.010611457557571,0.0 +R12_RCPA,TCE,all,2040,6.434536314135756,0.0 +R12_RCPA,TCE,all,2045,7.81456487462952,0.0 +R12_RCPA,TCE,all,2050,9.254835255846391,0.0 +R12_RCPA,TCE,all,2055,10.725247458549777,0.0 +R12_RCPA,TCE,all,2060,12.28584725436816,0.0 +R12_RCPA,TCE,all,2070,15.65765889905252,0.0 +R12_RCPA,TCE,all,2080,19.155326196212215,0.0 +R12_RCPA,TCE,all,2090,22.891116877280986,0.0 +R12_RCPA,TCE,all,2100,26.415693495404078,0.0 +R12_RCPA,TCE,all,2110,30.57266065009673,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_SSP2 - Medium Emissions_v2.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_SSP2 - Medium Emissions_v2.csv new file mode 100644 index 0000000000..495822dd00 --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_SSP2 - Medium Emissions_v2.csv @@ -0,0 +1,124 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP2_v5.3.1/SSP2 - Medium Emissions#2 +# +node,type_emission,type_tec,year,value,mrg +R12_AFR,TCE,all,2035,3.72,0.0 +R12_AFR,TCE,all,2040,3.7200000000000006,0.0 +R12_AFR,TCE,all,2045,3.72,0.0 +R12_AFR,TCE,all,2050,3.72,0.0 +R12_AFR,TCE,all,2055,3.72,0.0 +R12_AFR,TCE,all,2060,3.72,0.0 +R12_AFR,TCE,all,2070,3.72,0.0 +R12_AFR,TCE,all,2080,3.72,0.0 +R12_AFR,TCE,all,2090,3.72,0.0 +R12_AFR,TCE,all,2100,3.72,0.0 +R12_AFR,TCE,all,2110,3.72,0.0 +R12_EEU,TCE,all,2035,248.45900000000003,0.0 +R12_EEU,TCE,all,2040,248.45900000000003,0.0 +R12_EEU,TCE,all,2045,248.45899999999997,0.0 +R12_EEU,TCE,all,2050,248.45900000000003,0.0 +R12_EEU,TCE,all,2055,248.45900000000003,0.0 +R12_EEU,TCE,all,2060,248.459,0.0 +R12_EEU,TCE,all,2070,248.459,0.0 +R12_EEU,TCE,all,2080,248.459,0.0 +R12_EEU,TCE,all,2090,248.459,0.0 +R12_EEU,TCE,all,2100,248.45899999999997,0.0 +R12_EEU,TCE,all,2110,248.45899999999997,0.0 +R12_LAM,TCE,all,2035,22.723,0.0 +R12_LAM,TCE,all,2040,22.723,0.0 +R12_LAM,TCE,all,2045,22.723,0.0 +R12_LAM,TCE,all,2050,22.723,0.0 +R12_LAM,TCE,all,2055,22.723,0.0 +R12_LAM,TCE,all,2060,22.723,0.0 +R12_LAM,TCE,all,2070,22.723,0.0 +R12_LAM,TCE,all,2080,22.723000000000003,0.0 +R12_LAM,TCE,all,2090,22.723000000000003,0.0 +R12_LAM,TCE,all,2100,22.723,0.0 +R12_LAM,TCE,all,2110,22.723,0.0 +R12_MEA,TCE,all,2035,5.675,0.0 +R12_MEA,TCE,all,2040,5.675,0.0 +R12_MEA,TCE,all,2045,5.675000000000001,0.0 +R12_MEA,TCE,all,2050,5.675,0.0 +R12_MEA,TCE,all,2055,5.675,0.0 +R12_MEA,TCE,all,2060,5.675,0.0 +R12_MEA,TCE,all,2070,5.675,0.0 +R12_MEA,TCE,all,2080,5.675,0.0 +R12_MEA,TCE,all,2090,5.675,0.0 +R12_MEA,TCE,all,2100,5.675,0.0 +R12_MEA,TCE,all,2110,5.675,0.0 +R12_NAM,TCE,all,2035,114.017,0.0 +R12_NAM,TCE,all,2040,114.017,0.0 +R12_NAM,TCE,all,2045,114.017,0.0 +R12_NAM,TCE,all,2050,114.017,0.0 +R12_NAM,TCE,all,2055,114.017,0.0 +R12_NAM,TCE,all,2060,114.01700000000001,0.0 +R12_NAM,TCE,all,2070,114.017,0.0 +R12_NAM,TCE,all,2080,114.017,0.0 +R12_NAM,TCE,all,2090,114.017,0.0 +R12_NAM,TCE,all,2100,114.017,0.0 +R12_NAM,TCE,all,2110,114.017,0.0 +R12_SAS,TCE,all,2035,18.999,0.0 +R12_SAS,TCE,all,2040,18.999,0.0 +R12_SAS,TCE,all,2045,18.999,0.0 +R12_SAS,TCE,all,2050,18.999,0.0 +R12_SAS,TCE,all,2055,18.999,0.0 +R12_SAS,TCE,all,2060,18.999,0.0 +R12_SAS,TCE,all,2070,18.999,0.0 +R12_SAS,TCE,all,2080,18.999,0.0 +R12_SAS,TCE,all,2090,18.999,0.0 +R12_SAS,TCE,all,2100,18.999,0.0 +R12_SAS,TCE,all,2110,18.999,0.0 +R12_WEU,TCE,all,2035,216.40700000000004,0.0 +R12_WEU,TCE,all,2040,216.407,0.0 +R12_WEU,TCE,all,2045,216.40699999999998,0.0 +R12_WEU,TCE,all,2050,216.407,0.0 +R12_WEU,TCE,all,2055,216.407,0.0 +R12_WEU,TCE,all,2060,216.407,0.0 +R12_WEU,TCE,all,2070,216.407,0.0 +R12_WEU,TCE,all,2080,216.40700000000004,0.0 +R12_WEU,TCE,all,2090,216.407,0.0 +R12_WEU,TCE,all,2100,216.407,0.0 +R12_WEU,TCE,all,2110,216.40700000000004,0.0 +R12_FSU,TCE,all,2035,0.321,0.0 +R12_FSU,TCE,all,2040,0.321,0.0 +R12_FSU,TCE,all,2045,0.321,0.0 +R12_FSU,TCE,all,2050,0.321,0.0 +R12_FSU,TCE,all,2055,0.321,0.0 +R12_FSU,TCE,all,2060,0.321,0.0 +R12_FSU,TCE,all,2070,0.321,0.0 +R12_FSU,TCE,all,2080,0.321,0.0 +R12_FSU,TCE,all,2090,0.32100000000000006,0.0 +R12_FSU,TCE,all,2100,0.321,0.0 +R12_FSU,TCE,all,2110,0.321,0.0 +R12_PAO,TCE,all,2035,43.419,0.0 +R12_PAO,TCE,all,2040,43.419,0.0 +R12_PAO,TCE,all,2045,43.419,0.0 +R12_PAO,TCE,all,2050,43.419,0.0 +R12_PAO,TCE,all,2055,43.419,0.0 +R12_PAO,TCE,all,2060,43.419,0.0 +R12_PAO,TCE,all,2070,43.419,0.0 +R12_PAO,TCE,all,2080,43.419,0.0 +R12_PAO,TCE,all,2090,43.419,0.0 +R12_PAO,TCE,all,2100,43.419,0.0 +R12_PAO,TCE,all,2110,43.419,0.0 +R12_PAS,TCE,all,2035,80.127,0.0 +R12_PAS,TCE,all,2040,80.127,0.0 +R12_PAS,TCE,all,2045,80.127,0.0 +R12_PAS,TCE,all,2050,80.127,0.0 +R12_PAS,TCE,all,2055,80.127,0.0 +R12_PAS,TCE,all,2060,80.12700000000001,0.0 +R12_PAS,TCE,all,2070,80.127,0.0 +R12_PAS,TCE,all,2080,80.127,0.0 +R12_PAS,TCE,all,2090,80.127,0.0 +R12_PAS,TCE,all,2100,80.127,0.0 +R12_PAS,TCE,all,2110,80.127,0.0 +R12_RCPA,TCE,all,2035,0.045,0.0 +R12_RCPA,TCE,all,2040,0.045,0.0 +R12_RCPA,TCE,all,2045,0.045,0.0 +R12_RCPA,TCE,all,2050,0.045,0.0 +R12_RCPA,TCE,all,2055,0.045,0.0 +R12_RCPA,TCE,all,2060,0.045,0.0 +R12_RCPA,TCE,all,2070,0.045,0.0 +R12_RCPA,TCE,all,2080,0.045,0.0 +R12_RCPA,TCE,all,2090,0.045000000000000005,0.0 +R12_RCPA,TCE,all,2100,0.045,0.0 +R12_RCPA,TCE,all,2110,0.045,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_SSP2 - Medium-Low Emissions_v2.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_SSP2 - Medium-Low Emissions_v2.csv new file mode 100644 index 0000000000..148558258f --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_SSP2 - Medium-Low Emissions_v2.csv @@ -0,0 +1,12 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP2_v5.3.1/SSP2 - Medium-Low Emissions#2 +# +node,type_emission,type_tec,year,value,mrg +World,TCE,all,2045,32.85059839588945,0.0 +World,TCE,all,2050,41.926613049765784,0.0 +World,TCE,all,2055,53.51016321348798,0.0 +World,TCE,all,2060,68.29403471574047,0.0 +World,TCE,all,2070,97.74167486314363,0.0 +World,TCE,all,2080,159.21088899680245,0.0 +World,TCE,all,2090,259.3377616113513,0.0 +World,TCE,all,2100,422.4338864092193,0.0 +World,TCE,all,2110,688.1002877406897,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_baselineS_10_v1.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_baselineS_10_v1.csv new file mode 100644 index 0000000000..a2dbe0512e --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_baselineS_10_v1.csv @@ -0,0 +1,18 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP2_v5.3.1/baselineS_10#1 +# +node,type_emission,type_tec,year,value,mrg +World,TCE,all,2030,36.666666666666664,0.0 +World,TCE,all,2035,46.79699062500001,0.0 +World,TCE,all,2040,59.72613631517287,0.0 +World,TCE,all,2045,76.22736657841685,0.0 +World,TCE,all,2050,97.28758252196216,0.0 +World,TCE,all,2055,124.16634783297758,0.0 +World,TCE,all,2060,158.47122042219118,0.0 +World,TCE,all,2070,258.13291944457086,0.0 +World,TCE,all,2080,420.4713254776358,0.0 +World,TCE,all,2090,684.9034827845098,0.0 +World,TCE,all,2100,1115.6356029688443,0.0 +World,TCE,all,2110,1817.2528391175622,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2090,1461.303561850435,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2100,112.5121106366836,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2110,1810.637057272564,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_baselineS_110_v1.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_baselineS_110_v1.csv new file mode 100644 index 0000000000..240b205800 --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_baselineS_110_v1.csv @@ -0,0 +1,17 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP2_v5.3.1/baselineS_110#1 +# +node,type_emission,type_tec,year,value,mrg +World,TCE,all,2030,403.3333333333333,0.0 +World,TCE,all,2035,514.7668968750002,0.0 +World,TCE,all,2040,656.9874994669018,0.0 +World,TCE,all,2045,838.5010323625856,0.0 +World,TCE,all,2050,1070.163407741584,0.0 +World,TCE,all,2055,1365.8298261627538,0.0 +World,TCE,all,2060,1743.1834246441033,0.0 +World,TCE,all,2070,2839.46211389028,0.0 +World,TCE,all,2080,4625.184580253994,0.0 +World,TCE,all,2090,7533.938310629608,0.0 +World,TCE,all,2100,12271.99163265729,0.0 +World,TCE,all,2110,19989.781230293185,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2090,1582.3148131679536,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2100,8256.854603544267,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_baselineS_15_v1.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_baselineS_15_v1.csv new file mode 100644 index 0000000000..ca85fbe790 --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_baselineS_15_v1.csv @@ -0,0 +1,18 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP2_v5.3.1/baselineS_15#1 +# +node,type_emission,type_tec,year,value,mrg +World,TCE,all,2030,55.0,0.0 +World,TCE,all,2035,70.19548593750002,0.0 +World,TCE,all,2040,89.58920447275933,0.0 +World,TCE,all,2045,114.3410498676253,0.0 +World,TCE,all,2050,145.93137378294327,0.0 +World,TCE,all,2055,186.24952174946642,0.0 +World,TCE,all,2060,237.7068306332868,0.0 +World,TCE,all,2070,387.1993791668563,0.0 +World,TCE,all,2080,630.7069882164536,0.0 +World,TCE,all,2090,1027.3552241767648,0.0 +World,TCE,all,2100,1673.4534044532666,0.0 +World,TCE,all,2110,2725.8792586763434,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2090,1133.740610897709,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2100,1437.1265172703802,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2110,2493.3541164307076,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_baselineS_20_v1.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_baselineS_20_v1.csv new file mode 100644 index 0000000000..f983214b20 --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_baselineS_20_v1.csv @@ -0,0 +1,18 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP2_v5.3.1/baselineS_20#1 +# +node,type_emission,type_tec,year,value,mrg +World,TCE,all,2030,73.33333333333333,0.0 +World,TCE,all,2035,93.59398125000001,0.0 +World,TCE,all,2040,119.45227263034575,0.0 +World,TCE,all,2045,152.4547331568337,0.0 +World,TCE,all,2050,194.57516504392433,0.0 +World,TCE,all,2055,248.33269566595516,0.0 +World,TCE,all,2060,316.94244084438236,0.0 +World,TCE,all,2070,516.2658388891417,0.0 +World,TCE,all,2080,840.9426509552716,0.0 +World,TCE,all,2090,1369.8069655690197,0.0 +World,TCE,all,2100,2231.2712059376886,0.0 +World,TCE,all,2110,3634.5056782351244,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2090,1714.45292067055,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2100,2586.213049598414,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2110,2017.8113819577477,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_baselineS_25_v1.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_baselineS_25_v1.csv new file mode 100644 index 0000000000..37397f709b --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_baselineS_25_v1.csv @@ -0,0 +1,17 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP2_v5.3.1/baselineS_25#1 +# +node,type_emission,type_tec,year,value,mrg +World,TCE,all,2030,91.66666666666667,0.0 +World,TCE,all,2035,116.99247656250002,0.0 +World,TCE,all,2040,149.3153407879322,0.0 +World,TCE,all,2045,190.56841644604214,0.0 +World,TCE,all,2050,243.21895630490545,0.0 +World,TCE,all,2055,310.415869582444,0.0 +World,TCE,all,2060,396.1780510554779,0.0 +World,TCE,all,2070,645.3322986114271,0.0 +World,TCE,all,2080,1051.1783136940892,0.0 +World,TCE,all,2090,1712.2587069612744,0.0 +World,TCE,all,2100,2789.0890074221106,0.0 +World,TCE,all,2110,4543.132097793905,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2090,2067.902598211559,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2100,2993.4239524516615,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_baselineS_50_v1.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_baselineS_50_v1.csv new file mode 100644 index 0000000000..bc94028242 --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_baselineS_50_v1.csv @@ -0,0 +1,16 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP2_v5.3.1/baselineS_50#1 +# +node,type_emission,type_tec,year,value,mrg +World,TCE,all,2030,183.33333333333334,0.0 +World,TCE,all,2035,233.98495312500003,0.0 +World,TCE,all,2040,298.6306815758644,0.0 +World,TCE,all,2045,381.13683289208427,0.0 +World,TCE,all,2050,486.4379126098109,0.0 +World,TCE,all,2055,620.831739164888,0.0 +World,TCE,all,2060,792.3561021109558,0.0 +World,TCE,all,2070,1290.6645972228541,0.0 +World,TCE,all,2080,2102.3566273881784,0.0 +World,TCE,all,2090,3424.5174139225487,0.0 +World,TCE,all,2100,5578.178014844221,0.0 +World,TCE,all,2110,9086.26419558781,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2090,3727.869898230397,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_baselineS_5_v3.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_baselineS_5_v3.csv new file mode 100644 index 0000000000..2673053935 --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_baselineS_5_v3.csv @@ -0,0 +1,16 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP2_v5.3.1/baselineS_5#3 +# +node,type_emission,type_tec,year,value,mrg +World,TCE,all,2030,18.333333333333332,0.0 +World,TCE,all,2035,23.398495312500003,0.0 +World,TCE,all,2040,29.863068157586437,0.0 +World,TCE,all,2045,38.113683289208424,0.0 +World,TCE,all,2050,48.64379126098108,0.0 +World,TCE,all,2055,62.08317391648879,0.0 +World,TCE,all,2060,79.23561021109559,0.0 +World,TCE,all,2070,129.06645972228543,0.0 +World,TCE,all,2080,210.2356627388179,0.0 +World,TCE,all,2090,342.4517413922549,0.0 +World,TCE,all,2100,557.8178014844221,0.0 +World,TCE,all,2110,908.6264195587811,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2090,2483.234911431237,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_baseline_1000f_v2.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_baseline_1000f_v2.csv new file mode 100644 index 0000000000..9d635da5e7 --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_baseline_1000f_v2.csv @@ -0,0 +1,18 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP2_v5.3.1/baseline_1000f#2 +# +node,type_emission,type_tec,year,value,mrg +World,TCE,all,2030,59.200865255697884,0.0 +World,TCE,all,2035,75.55697280989408,0.0 +World,TCE,all,2040,96.43197131558165,0.0 +World,TCE,all,2045,123.07434702560575,0.0 +World,TCE,all,2050,157.07751992550735,0.0 +World,TCE,all,2055,200.47514256415144,0.0 +World,TCE,all,2060,255.8627281941855,0.0 +World,TCE,all,2070,366.18793563516033,0.0 +World,TCE,all,2080,596.4815607468365,0.0 +World,TCE,all,2090,971.6056092723444,0.0 +World,TCE,all,2100,1582.6431562905448,0.0 +World,TCE,all,2110,2577.9589333877598,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2090,1118.2796311969184,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2100,1272.514331269968,0.0 +R12_GLB,CO2_shipping_IMO,bunkers,2110,2443.481322540953,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_npiref2035_low_dem_scen2_v1.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_npiref2035_low_dem_scen2_v1.csv new file mode 100644 index 0000000000..13c7c81f36 --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP2_v5.3.1_npiref2035_low_dem_scen2_v1.csv @@ -0,0 +1,13 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP2_v5.3.1/npiref2035_low_dem_scen2#1 +# +node,type_emission,type_tec,year,value,mrg +World,TCE,all,2040,1283.3333333333333,0.0 +World,TCE,all,2045,1637.8946718750003,0.0 +World,TCE,all,2050,2090.414771031051,0.0 +World,TCE,all,2055,2667.95783024459,0.0 +World,TCE,all,2060,3405.0653882686756,0.0 +World,TCE,all,2070,5546.49271477669,0.0 +World,TCE,all,2080,9034.652180559979,0.0 +World,TCE,all,2090,14716.49639171725,0.0 +World,TCE,all,2100,23971.62189745784,0.0 +World,TCE,all,2110,39047.24610390954,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP3_v5.3.1_baseline_1000f_v1.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP3_v5.3.1_baseline_1000f_v1.csv new file mode 100644 index 0000000000..9d44274e24 --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP3_v5.3.1_baseline_1000f_v1.csv @@ -0,0 +1,15 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP3_v5.3.1/baseline_1000f#1 +# +node,type_emission,type_tec,year,value,mrg +World,TCE,all,2030,185.4494151576378,0.0 +World,TCE,all,2035,236.6856693421012,0.0 +World,TCE,all,2040,302.0775558892953,0.0 +World,TCE,all,2045,385.53601502657096,0.0 +World,TCE,all,2050,492.05250765813554,0.0 +World,TCE,all,2055,627.9975433059686,0.0 +World,TCE,all,2060,801.5016858167031,0.0 +World,TCE,all,2070,1147.1004386171053,0.0 +World,TCE,all,2080,1868.5057408374498,0.0 +World,TCE,all,2090,3043.598961352926,0.0 +World,TCE,all,2100,4957.701994213185,0.0 +World,TCE,all,2110,8075.574139537666,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP4_v5.3.1_NPi2030_v1.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP4_v5.3.1_NPi2030_v1.csv new file mode 100644 index 0000000000..9f58821624 --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP4_v5.3.1_NPi2030_v1.csv @@ -0,0 +1,14 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP4_v5.3.1/NPi2030#1 +# +node,type_emission,type_tec,year,value,mrg +R12_AFR,TCE,all,2030,227.13627074180098,0.0 +R12_EEU,TCE,all,2030,256.82486095502566,0.0 +R12_LAM,TCE,all,2030,273.70329116002824,0.0 +R12_MEA,TCE,all,2030,484.393410591876,0.0 +R12_NAM,TCE,all,2030,467.83648108042206,0.0 +R12_SAS,TCE,all,2030,109.44223780981594,0.0 +R12_WEU,TCE,all,2030,447.12958234387827,0.0 +R12_FSU,TCE,all,2030,292.56470198256085,0.0 +R12_PAO,TCE,all,2030,22.859074365711827,0.0 +R12_PAS,TCE,all,2030,208.44350843999626,0.0 +R12_RCPA,TCE,all,2030,72.53529270744751,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP4_v5.3.1_NPiREF_SSP4 - Low Overshootf_v1.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP4_v5.3.1_NPiREF_SSP4 - Low Overshootf_v1.csv new file mode 100644 index 0000000000..fd963a473c --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP4_v5.3.1_NPiREF_SSP4 - Low Overshootf_v1.csv @@ -0,0 +1,133 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP4_v5.3.1/NPiREF_SSP4 - Low Overshootf#1 +# +node,type_emission,type_tec,year,value,mrg +World,TCE,all,2040,90.14607477190589,0.0 +World,TCE,all,2045,115.0517731631299,0.0 +World,TCE,all,2050,146.838456821035,0.0 +World,TCE,all,2055,187.4072151066394,0.0 +World,TCE,all,2060,239.18437332007537,0.0 +World,TCE,all,2070,342.3180567190494,0.0 +World,TCE,all,2080,557.6000432385553,0.0 +World,TCE,all,2090,908.2717143221521,0.0 +World,TCE,all,2100,1479.4789151132895,0.0 +World,TCE,all,2110,2409.9152552585565,0.0 +R12_AFR,TCE,all,2040,5.8907674696059,0.0 +R12_AFR,TCE,all,2045,7.278812625092723,0.0 +R12_AFR,TCE,all,2050,8.917238952748383,0.0 +R12_AFR,TCE,all,2055,10.97895130590336,0.0 +R12_AFR,TCE,all,2060,13.423963898170548,0.0 +R12_AFR,TCE,all,2070,20.19677856546407,0.0 +R12_AFR,TCE,all,2080,30.298154258155307,0.0 +R12_AFR,TCE,all,2090,44.77308108820559,0.0 +R12_AFR,TCE,all,2100,64.54962466971541,0.0 +R12_AFR,TCE,all,2110,93.4076613236253,0.0 +R12_EEU,TCE,all,2040,4.7167698796747795,0.0 +R12_EEU,TCE,all,2045,5.083234174038508,0.0 +R12_EEU,TCE,all,2050,5.367349912350579,0.0 +R12_EEU,TCE,all,2055,5.58563024638947,0.0 +R12_EEU,TCE,all,2060,5.7756044678194565,0.0 +R12_EEU,TCE,all,2070,6.127590469799075,0.0 +R12_EEU,TCE,all,2080,6.246039496956422,0.0 +R12_EEU,TCE,all,2090,6.19733767886878,0.0 +R12_EEU,TCE,all,2100,6.108973005638867,0.0 +R12_EEU,TCE,all,2110,6.029659628072095,0.0 +R12_LAM,TCE,all,2040,5.193582108272449,0.0 +R12_LAM,TCE,all,2045,6.203546145564758,0.0 +R12_LAM,TCE,all,2050,7.382745379586364,0.0 +R12_LAM,TCE,all,2055,8.701585728908618,0.0 +R12_LAM,TCE,all,2060,10.156100938202604,0.0 +R12_LAM,TCE,all,2070,13.484978224454666,0.0 +R12_LAM,TCE,all,2080,17.32896670333695,0.0 +R12_LAM,TCE,all,2090,21.665534534139496,0.0 +R12_LAM,TCE,all,2100,26.64692795026293,0.0 +R12_LAM,TCE,all,2110,32.81216494854147,0.0 +R12_MEA,TCE,all,2040,5.475381030326262,0.0 +R12_MEA,TCE,all,2045,6.374781067898502,0.0 +R12_MEA,TCE,all,2050,7.31691258535464,0.0 +R12_MEA,TCE,all,2055,8.282342943582847,0.0 +R12_MEA,TCE,all,2060,9.331043969386915,0.0 +R12_MEA,TCE,all,2070,11.709666995755915,0.0 +R12_MEA,TCE,all,2080,14.46138284160167,0.0 +R12_MEA,TCE,all,2090,17.75398002258085,0.0 +R12_MEA,TCE,all,2100,21.75573973580903,0.0 +R12_MEA,TCE,all,2110,26.850634450972272,0.0 +R12_NAM,TCE,all,2040,4.552873048779834,0.0 +R12_NAM,TCE,all,2045,4.9767602737485825,0.0 +R12_NAM,TCE,all,2050,5.3617227844424,0.0 +R12_NAM,TCE,all,2055,5.701378940177197,0.0 +R12_NAM,TCE,all,2060,6.031832396859435,0.0 +R12_NAM,TCE,all,2070,6.653725354260283,0.0 +R12_NAM,TCE,all,2080,6.976526045142054,0.0 +R12_NAM,TCE,all,2090,7.163323893342378,0.0 +R12_NAM,TCE,all,2100,7.213695267016787,0.0 +R12_NAM,TCE,all,2110,7.264549519008907,0.0 +R12_SAS,TCE,all,2040,6.142877211914283,0.0 +R12_SAS,TCE,all,2045,7.474566793173175,0.0 +R12_SAS,TCE,all,2050,8.981447531632321,0.0 +R12_SAS,TCE,all,2055,10.621371752111452,0.0 +R12_SAS,TCE,all,2060,12.456421545938875,0.0 +R12_SAS,TCE,all,2070,16.640703263938168,0.0 +R12_SAS,TCE,all,2080,21.553134090377693,0.0 +R12_SAS,TCE,all,2090,27.234613927508974,0.0 +R12_SAS,TCE,all,2100,34.12118852662717,0.0 +R12_SAS,TCE,all,2110,42.86642209972198,0.0 +R12_WEU,TCE,all,2040,4.49345604533295,0.0 +R12_WEU,TCE,all,2045,4.933407813678579,0.0 +R12_WEU,TCE,all,2050,5.347979791381084,0.0 +R12_WEU,TCE,all,2055,5.7308110538146195,0.0 +R12_WEU,TCE,all,2060,6.094655433160913,0.0 +R12_WEU,TCE,all,2070,6.766493449079857,0.0 +R12_WEU,TCE,all,2080,7.240469176502863,0.0 +R12_WEU,TCE,all,2090,7.526289254781724,0.0 +R12_WEU,TCE,all,2100,7.597473573012878,0.0 +R12_WEU,TCE,all,2110,7.673081113970505,0.0 +R12_FSU,TCE,all,2040,4.96845707560629,0.0 +R12_FSU,TCE,all,2045,5.522542874290901,0.0 +R12_FSU,TCE,all,2050,6.068275201793451,0.0 +R12_FSU,TCE,all,2055,6.624601536653188,0.0 +R12_FSU,TCE,all,2060,7.245452038187,0.0 +R12_FSU,TCE,all,2070,8.730516628278268,0.0 +R12_FSU,TCE,all,2080,10.338900733516768,0.0 +R12_FSU,TCE,all,2090,12.120845844762638,0.0 +R12_FSU,TCE,all,2100,14.155181091588782,0.0 +R12_FSU,TCE,all,2110,16.647799879149236,0.0 +R12_PAO,TCE,all,2040,4.35956905153243,0.0 +R12_PAO,TCE,all,2045,4.73302727347445,0.0 +R12_PAO,TCE,all,2050,5.076388126038473,0.0 +R12_PAO,TCE,all,2055,5.377826515063701,0.0 +R12_PAO,TCE,all,2060,5.639186377173411,0.0 +R12_PAO,TCE,all,2070,6.0771880823853115,0.0 +R12_PAO,TCE,all,2080,6.362984589953549,0.0 +R12_PAO,TCE,all,2090,6.560661902956746,0.0 +R12_PAO,TCE,all,2100,6.676112477767165,0.0 +R12_PAO,TCE,all,2110,6.805477438056516,0.0 +R12_PAS,TCE,all,2040,5.099629578574796,0.0 +R12_PAS,TCE,all,2045,5.753324065887796,0.0 +R12_PAS,TCE,all,2050,6.396839370981688,0.0 +R12_PAS,TCE,all,2055,7.0148216334511035,0.0 +R12_PAS,TCE,all,2060,7.645745079614314,0.0 +R12_PAS,TCE,all,2070,8.80483107202742,0.0 +R12_PAS,TCE,all,2080,10.030163048591852,0.0 +R12_PAS,TCE,all,2090,11.376267037564716,0.0 +R12_PAS,TCE,all,2100,12.915206671541496,0.0 +R12_PAS,TCE,all,2110,14.759073061796318,0.0 +R12_CHN,TCE,all,2040,5.010449377409376,0.0 +R12_CHN,TCE,all,2045,5.572118287654559,0.0 +R12_CHN,TCE,all,2050,6.089281601335499,0.0 +R12_CHN,TCE,all,2055,6.479251102833652,0.0 +R12_CHN,TCE,all,2060,6.830125665281457,0.0 +R12_CHN,TCE,all,2070,7.33673146975561,0.0 +R12_CHN,TCE,all,2080,7.454528719539993,0.0 +R12_CHN,TCE,all,2090,7.270861913502662,0.0 +R12_CHN,TCE,all,2100,6.891186283209953,0.0 +R12_CHN,TCE,all,2110,6.531342488540472,0.0 +R12_RCPA,TCE,all,2040,6.027591986479606,0.0 +R12_RCPA,TCE,all,2045,7.082583486278544,0.0 +R12_RCPA,TCE,all,2050,8.170056642914709,0.0 +R12_RCPA,TCE,all,2055,9.269214754873044,0.0 +R12_RCPA,TCE,all,2060,10.422461572120799,0.0 +R12_RCPA,TCE,all,2070,12.856289831223876,0.0 +R12_RCPA,TCE,all,2080,15.39613752102699,0.0 +R12_RCPA,TCE,all,2090,18.131097837953153,0.0 +R12_RCPA,TCE,all,2100,21.289211431670356,0.0 +R12_RCPA,TCE,all,2110,25.04826107930808,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP4_v5.3.1_NPiREF_v1.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP4_v5.3.1_NPiREF_v1.csv new file mode 100644 index 0000000000..e77a592226 --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP4_v5.3.1_NPiREF_v1.csv @@ -0,0 +1,135 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP4_v5.3.1/NPiREF#1 +# +node,type_emission,type_tec,year,value,mrg +R12_AFR,TCE,all,2035,4.691073945922711,0.0 +R12_AFR,TCE,all,2040,5.8907674696059,0.0 +R12_AFR,TCE,all,2045,7.278812625092723,0.0 +R12_AFR,TCE,all,2050,8.917238952748383,0.0 +R12_AFR,TCE,all,2055,10.97895130590336,0.0 +R12_AFR,TCE,all,2060,13.423963898170548,0.0 +R12_AFR,TCE,all,2070,20.19677856546407,0.0 +R12_AFR,TCE,all,2080,30.298154258155307,0.0 +R12_AFR,TCE,all,2090,44.77308108820559,0.0 +R12_AFR,TCE,all,2100,64.54962466971541,0.0 +R12_AFR,TCE,all,2110,93.4076613236253,0.0 +R12_EEU,TCE,all,2035,4.209588047590761,0.0 +R12_EEU,TCE,all,2040,4.7167698796747795,0.0 +R12_EEU,TCE,all,2045,5.083234174038508,0.0 +R12_EEU,TCE,all,2050,5.367349912350579,0.0 +R12_EEU,TCE,all,2055,5.58563024638947,0.0 +R12_EEU,TCE,all,2060,5.7756044678194565,0.0 +R12_EEU,TCE,all,2070,6.127590469799075,0.0 +R12_EEU,TCE,all,2080,6.246039496956422,0.0 +R12_EEU,TCE,all,2090,6.19733767886878,0.0 +R12_EEU,TCE,all,2100,6.108973005638867,0.0 +R12_EEU,TCE,all,2110,6.029659628072095,0.0 +R12_LAM,TCE,all,2035,4.336545922527888,0.0 +R12_LAM,TCE,all,2040,5.193582108272449,0.0 +R12_LAM,TCE,all,2045,6.203546145564758,0.0 +R12_LAM,TCE,all,2050,7.382745379586364,0.0 +R12_LAM,TCE,all,2055,8.701585728908618,0.0 +R12_LAM,TCE,all,2060,10.156100938202604,0.0 +R12_LAM,TCE,all,2070,13.484978224454666,0.0 +R12_LAM,TCE,all,2080,17.32896670333695,0.0 +R12_LAM,TCE,all,2090,21.665534534139496,0.0 +R12_LAM,TCE,all,2100,26.64692795026293,0.0 +R12_LAM,TCE,all,2110,32.81216494854147,0.0 +R12_MEA,TCE,all,2035,4.516270037772223,0.0 +R12_MEA,TCE,all,2040,5.475381030326262,0.0 +R12_MEA,TCE,all,2045,6.374781067898502,0.0 +R12_MEA,TCE,all,2050,7.31691258535464,0.0 +R12_MEA,TCE,all,2055,8.282342943582847,0.0 +R12_MEA,TCE,all,2060,9.331043969386915,0.0 +R12_MEA,TCE,all,2070,11.709666995755915,0.0 +R12_MEA,TCE,all,2080,14.46138284160167,0.0 +R12_MEA,TCE,all,2090,17.75398002258085,0.0 +R12_MEA,TCE,all,2100,21.75573973580903,0.0 +R12_MEA,TCE,all,2110,26.850634450972272,0.0 +R12_NAM,TCE,all,2035,4.101811126202713,0.0 +R12_NAM,TCE,all,2040,4.552873048779834,0.0 +R12_NAM,TCE,all,2045,4.9767602737485825,0.0 +R12_NAM,TCE,all,2050,5.3617227844424,0.0 +R12_NAM,TCE,all,2055,5.701378940177197,0.0 +R12_NAM,TCE,all,2060,6.031832396859435,0.0 +R12_NAM,TCE,all,2070,6.653725354260283,0.0 +R12_NAM,TCE,all,2080,6.976526045142054,0.0 +R12_NAM,TCE,all,2090,7.163323893342378,0.0 +R12_NAM,TCE,all,2100,7.213695267016787,0.0 +R12_NAM,TCE,all,2110,7.264549519008907,0.0 +R12_SAS,TCE,all,2035,4.828206935001563,0.0 +R12_SAS,TCE,all,2040,6.142877211914283,0.0 +R12_SAS,TCE,all,2045,7.474566793173175,0.0 +R12_SAS,TCE,all,2050,8.981447531632321,0.0 +R12_SAS,TCE,all,2055,10.621371752111452,0.0 +R12_SAS,TCE,all,2060,12.456421545938875,0.0 +R12_SAS,TCE,all,2070,16.640703263938168,0.0 +R12_SAS,TCE,all,2080,21.553134090377693,0.0 +R12_SAS,TCE,all,2090,27.234613927508974,0.0 +R12_SAS,TCE,all,2100,34.12118852662717,0.0 +R12_SAS,TCE,all,2110,42.86642209972198,0.0 +R12_WEU,TCE,all,2035,4.0628866584512995,0.0 +R12_WEU,TCE,all,2040,4.49345604533295,0.0 +R12_WEU,TCE,all,2045,4.933407813678579,0.0 +R12_WEU,TCE,all,2050,5.347979791381084,0.0 +R12_WEU,TCE,all,2055,5.7308110538146195,0.0 +R12_WEU,TCE,all,2060,6.094655433160913,0.0 +R12_WEU,TCE,all,2070,6.766493449079857,0.0 +R12_WEU,TCE,all,2080,7.240469176502863,0.0 +R12_WEU,TCE,all,2090,7.526289254781724,0.0 +R12_WEU,TCE,all,2100,7.597473573012878,0.0 +R12_WEU,TCE,all,2110,7.673081113970505,0.0 +R12_FSU,TCE,all,2035,4.301945100682527,0.0 +R12_FSU,TCE,all,2040,4.96845707560629,0.0 +R12_FSU,TCE,all,2045,5.522542874290901,0.0 +R12_FSU,TCE,all,2050,6.068275201793451,0.0 +R12_FSU,TCE,all,2055,6.624601536653188,0.0 +R12_FSU,TCE,all,2060,7.245452038187,0.0 +R12_FSU,TCE,all,2070,8.730516628278268,0.0 +R12_FSU,TCE,all,2080,10.338900733516768,0.0 +R12_FSU,TCE,all,2090,12.120845844762638,0.0 +R12_FSU,TCE,all,2100,14.155181091588782,0.0 +R12_FSU,TCE,all,2110,16.647799879149236,0.0 +R12_PAO,TCE,all,2035,3.9968737137354164,0.0 +R12_PAO,TCE,all,2040,4.35956905153243,0.0 +R12_PAO,TCE,all,2045,4.73302727347445,0.0 +R12_PAO,TCE,all,2050,5.076388126038473,0.0 +R12_PAO,TCE,all,2055,5.377826515063701,0.0 +R12_PAO,TCE,all,2060,5.639186377173411,0.0 +R12_PAO,TCE,all,2070,6.0771880823853115,0.0 +R12_PAO,TCE,all,2080,6.362984589953549,0.0 +R12_PAO,TCE,all,2090,6.560661902956746,0.0 +R12_PAO,TCE,all,2100,6.676112477767165,0.0 +R12_PAO,TCE,all,2110,6.805477438056516,0.0 +R12_PAS,TCE,all,2035,4.385086698627118,0.0 +R12_PAS,TCE,all,2040,5.099629578574796,0.0 +R12_PAS,TCE,all,2045,5.753324065887796,0.0 +R12_PAS,TCE,all,2050,6.396839370981688,0.0 +R12_PAS,TCE,all,2055,7.0148216334511035,0.0 +R12_PAS,TCE,all,2060,7.645745079614314,0.0 +R12_PAS,TCE,all,2070,8.80483107202742,0.0 +R12_PAS,TCE,all,2080,10.030163048591852,0.0 +R12_PAS,TCE,all,2090,11.376267037564716,0.0 +R12_PAS,TCE,all,2100,12.915206671541496,0.0 +R12_PAS,TCE,all,2110,14.759073061796318,0.0 +R12_CHN,TCE,all,2035,4.371367427629199,0.0 +R12_CHN,TCE,all,2040,5.010449377409376,0.0 +R12_CHN,TCE,all,2045,5.572118287654559,0.0 +R12_CHN,TCE,all,2050,6.089281601335499,0.0 +R12_CHN,TCE,all,2055,6.479251102833652,0.0 +R12_CHN,TCE,all,2060,6.830125665281457,0.0 +R12_CHN,TCE,all,2070,7.33673146975561,0.0 +R12_CHN,TCE,all,2080,7.454528719539993,0.0 +R12_CHN,TCE,all,2090,7.270861913502662,0.0 +R12_CHN,TCE,all,2100,6.891186283209953,0.0 +R12_CHN,TCE,all,2110,6.531342488540472,0.0 +R12_RCPA,TCE,all,2035,4.860606345440388,0.0 +R12_RCPA,TCE,all,2040,6.027591986479606,0.0 +R12_RCPA,TCE,all,2045,7.082583486278544,0.0 +R12_RCPA,TCE,all,2050,8.170056642914709,0.0 +R12_RCPA,TCE,all,2055,9.269214754873044,0.0 +R12_RCPA,TCE,all,2060,10.422461572120799,0.0 +R12_RCPA,TCE,all,2070,12.856289831223876,0.0 +R12_RCPA,TCE,all,2080,15.39613752102699,0.0 +R12_RCPA,TCE,all,2090,18.131097837953153,0.0 +R12_RCPA,TCE,all,2100,21.289211431670356,0.0 +R12_RCPA,TCE,all,2110,25.04826107930808,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP4_v5.3.1_SSP4 - Low Overshoot_v2.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP4_v5.3.1_SSP4 - Low Overshoot_v2.csv new file mode 100644 index 0000000000..58b55efba0 --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP4_v5.3.1_SSP4 - Low Overshoot_v2.csv @@ -0,0 +1,133 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP4_v5.3.1/SSP4 - Low Overshoot#2 +# +node,type_emission,type_tec,year,value,mrg +World,TCE,all,2040,90.14607477190589,0.0 +World,TCE,all,2045,115.0517731631299,0.0 +World,TCE,all,2050,146.838456821035,0.0 +World,TCE,all,2055,187.4072151066394,0.0 +World,TCE,all,2060,239.18437332007537,0.0 +World,TCE,all,2070,342.3180567190494,0.0 +World,TCE,all,2080,557.6000432385553,0.0 +World,TCE,all,2090,908.2717143221521,0.0 +World,TCE,all,2100,1479.4789151132895,0.0 +World,TCE,all,2110,2409.9152552585565,0.0 +R12_AFR,TCE,all,2040,5.8907674696059,0.0 +R12_AFR,TCE,all,2045,7.278812625092723,0.0 +R12_AFR,TCE,all,2050,8.917238952748383,0.0 +R12_AFR,TCE,all,2055,10.97895130590336,0.0 +R12_AFR,TCE,all,2060,13.423963898170548,0.0 +R12_AFR,TCE,all,2070,20.19677856546407,0.0 +R12_AFR,TCE,all,2080,30.298154258155307,0.0 +R12_AFR,TCE,all,2090,44.77308108820559,0.0 +R12_AFR,TCE,all,2100,64.54962466971541,0.0 +R12_AFR,TCE,all,2110,93.4076613236253,0.0 +R12_EEU,TCE,all,2040,4.7167698796747795,0.0 +R12_EEU,TCE,all,2045,5.083234174038508,0.0 +R12_EEU,TCE,all,2050,5.367349912350579,0.0 +R12_EEU,TCE,all,2055,5.58563024638947,0.0 +R12_EEU,TCE,all,2060,5.7756044678194565,0.0 +R12_EEU,TCE,all,2070,6.127590469799075,0.0 +R12_EEU,TCE,all,2080,6.246039496956422,0.0 +R12_EEU,TCE,all,2090,6.19733767886878,0.0 +R12_EEU,TCE,all,2100,6.108973005638867,0.0 +R12_EEU,TCE,all,2110,6.029659628072095,0.0 +R12_LAM,TCE,all,2040,5.193582108272449,0.0 +R12_LAM,TCE,all,2045,6.203546145564758,0.0 +R12_LAM,TCE,all,2050,7.382745379586364,0.0 +R12_LAM,TCE,all,2055,8.701585728908618,0.0 +R12_LAM,TCE,all,2060,10.156100938202604,0.0 +R12_LAM,TCE,all,2070,13.484978224454666,0.0 +R12_LAM,TCE,all,2080,17.32896670333695,0.0 +R12_LAM,TCE,all,2090,21.665534534139496,0.0 +R12_LAM,TCE,all,2100,26.64692795026293,0.0 +R12_LAM,TCE,all,2110,32.81216494854147,0.0 +R12_MEA,TCE,all,2040,5.475381030326262,0.0 +R12_MEA,TCE,all,2045,6.374781067898502,0.0 +R12_MEA,TCE,all,2050,7.31691258535464,0.0 +R12_MEA,TCE,all,2055,8.282342943582847,0.0 +R12_MEA,TCE,all,2060,9.331043969386915,0.0 +R12_MEA,TCE,all,2070,11.709666995755915,0.0 +R12_MEA,TCE,all,2080,14.46138284160167,0.0 +R12_MEA,TCE,all,2090,17.75398002258085,0.0 +R12_MEA,TCE,all,2100,21.75573973580903,0.0 +R12_MEA,TCE,all,2110,26.850634450972272,0.0 +R12_NAM,TCE,all,2040,4.552873048779834,0.0 +R12_NAM,TCE,all,2045,4.9767602737485825,0.0 +R12_NAM,TCE,all,2050,5.3617227844424,0.0 +R12_NAM,TCE,all,2055,5.701378940177197,0.0 +R12_NAM,TCE,all,2060,6.031832396859435,0.0 +R12_NAM,TCE,all,2070,6.653725354260283,0.0 +R12_NAM,TCE,all,2080,6.976526045142054,0.0 +R12_NAM,TCE,all,2090,7.163323893342378,0.0 +R12_NAM,TCE,all,2100,7.213695267016787,0.0 +R12_NAM,TCE,all,2110,7.264549519008907,0.0 +R12_SAS,TCE,all,2040,6.142877211914283,0.0 +R12_SAS,TCE,all,2045,7.474566793173175,0.0 +R12_SAS,TCE,all,2050,8.981447531632321,0.0 +R12_SAS,TCE,all,2055,10.621371752111452,0.0 +R12_SAS,TCE,all,2060,12.456421545938875,0.0 +R12_SAS,TCE,all,2070,16.640703263938168,0.0 +R12_SAS,TCE,all,2080,21.553134090377693,0.0 +R12_SAS,TCE,all,2090,27.234613927508974,0.0 +R12_SAS,TCE,all,2100,34.12118852662717,0.0 +R12_SAS,TCE,all,2110,42.86642209972198,0.0 +R12_WEU,TCE,all,2040,4.49345604533295,0.0 +R12_WEU,TCE,all,2045,4.933407813678579,0.0 +R12_WEU,TCE,all,2050,5.347979791381084,0.0 +R12_WEU,TCE,all,2055,5.7308110538146195,0.0 +R12_WEU,TCE,all,2060,6.094655433160913,0.0 +R12_WEU,TCE,all,2070,6.766493449079857,0.0 +R12_WEU,TCE,all,2080,7.240469176502863,0.0 +R12_WEU,TCE,all,2090,7.526289254781724,0.0 +R12_WEU,TCE,all,2100,7.597473573012878,0.0 +R12_WEU,TCE,all,2110,7.673081113970505,0.0 +R12_FSU,TCE,all,2040,4.96845707560629,0.0 +R12_FSU,TCE,all,2045,5.522542874290901,0.0 +R12_FSU,TCE,all,2050,6.068275201793451,0.0 +R12_FSU,TCE,all,2055,6.624601536653188,0.0 +R12_FSU,TCE,all,2060,7.245452038187,0.0 +R12_FSU,TCE,all,2070,8.730516628278268,0.0 +R12_FSU,TCE,all,2080,10.338900733516768,0.0 +R12_FSU,TCE,all,2090,12.120845844762638,0.0 +R12_FSU,TCE,all,2100,14.155181091588782,0.0 +R12_FSU,TCE,all,2110,16.647799879149236,0.0 +R12_PAO,TCE,all,2040,4.35956905153243,0.0 +R12_PAO,TCE,all,2045,4.73302727347445,0.0 +R12_PAO,TCE,all,2050,5.076388126038473,0.0 +R12_PAO,TCE,all,2055,5.377826515063701,0.0 +R12_PAO,TCE,all,2060,5.639186377173411,0.0 +R12_PAO,TCE,all,2070,6.0771880823853115,0.0 +R12_PAO,TCE,all,2080,6.362984589953549,0.0 +R12_PAO,TCE,all,2090,6.560661902956746,0.0 +R12_PAO,TCE,all,2100,6.676112477767165,0.0 +R12_PAO,TCE,all,2110,6.805477438056516,0.0 +R12_PAS,TCE,all,2040,5.099629578574796,0.0 +R12_PAS,TCE,all,2045,5.753324065887796,0.0 +R12_PAS,TCE,all,2050,6.396839370981688,0.0 +R12_PAS,TCE,all,2055,7.0148216334511035,0.0 +R12_PAS,TCE,all,2060,7.645745079614314,0.0 +R12_PAS,TCE,all,2070,8.80483107202742,0.0 +R12_PAS,TCE,all,2080,10.030163048591852,0.0 +R12_PAS,TCE,all,2090,11.376267037564716,0.0 +R12_PAS,TCE,all,2100,12.915206671541496,0.0 +R12_PAS,TCE,all,2110,14.759073061796318,0.0 +R12_CHN,TCE,all,2040,5.010449377409376,0.0 +R12_CHN,TCE,all,2045,5.572118287654559,0.0 +R12_CHN,TCE,all,2050,6.089281601335499,0.0 +R12_CHN,TCE,all,2055,6.479251102833652,0.0 +R12_CHN,TCE,all,2060,6.830125665281457,0.0 +R12_CHN,TCE,all,2070,7.33673146975561,0.0 +R12_CHN,TCE,all,2080,7.454528719539993,0.0 +R12_CHN,TCE,all,2090,7.270861913502662,0.0 +R12_CHN,TCE,all,2100,6.891186283209953,0.0 +R12_CHN,TCE,all,2110,6.531342488540472,0.0 +R12_RCPA,TCE,all,2040,6.027591986479606,0.0 +R12_RCPA,TCE,all,2045,7.082583486278544,0.0 +R12_RCPA,TCE,all,2050,8.170056642914709,0.0 +R12_RCPA,TCE,all,2055,9.269214754873044,0.0 +R12_RCPA,TCE,all,2060,10.422461572120799,0.0 +R12_RCPA,TCE,all,2070,12.856289831223876,0.0 +R12_RCPA,TCE,all,2080,15.39613752102699,0.0 +R12_RCPA,TCE,all,2090,18.131097837953153,0.0 +R12_RCPA,TCE,all,2100,21.289211431670356,0.0 +R12_RCPA,TCE,all,2110,25.04826107930808,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP4_v5.3.1_baseline_1000f_v1.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP4_v5.3.1_baseline_1000f_v1.csv new file mode 100644 index 0000000000..4aecc01c37 --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP4_v5.3.1_baseline_1000f_v1.csv @@ -0,0 +1,15 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP4_v5.3.1/baseline_1000f#1 +# +node,type_emission,type_tec,year,value,mrg +World,TCE,all,2030,42.59968097547217,0.0 +World,TCE,all,2035,54.369187397377154,0.0 +World,TCE,all,2040,69.39039144337984,0.0 +World,TCE,all,2045,88.56167721384347,0.0 +World,TCE,all,2050,113.0296357721048,0.0 +World,TCE,all,2055,144.25764015202785,0.0 +World,TCE,all,2060,184.11336637579285,0.0 +World,TCE,all,2070,263.50103444853227,0.0 +World,TCE,all,2080,429.2154191635119,0.0 +World,TCE,all,2090,699.1466900054721,0.0 +World,TCE,all,2100,1138.8362866791474,0.0 +World,TCE,all,2110,1855.044308150838,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP5_v5.3.1_NPi2030_v1.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP5_v5.3.1_NPi2030_v1.csv new file mode 100644 index 0000000000..56a1d7985b --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP5_v5.3.1_NPi2030_v1.csv @@ -0,0 +1,14 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP5_v5.3.1/NPi2030#1 +# +node,type_emission,type_tec,year,value,mrg +R12_AFR,TCE,all,2030,263.9214891085651,0.0 +R12_EEU,TCE,all,2030,424.4886037288951,0.0 +R12_LAM,TCE,all,2030,368.92391799686914,0.0 +R12_MEA,TCE,all,2030,573.094897786098,0.0 +R12_NAM,TCE,all,2030,933.8022161532716,0.0 +R12_SAS,TCE,all,2030,99.76414772250243,0.0 +R12_WEU,TCE,all,2030,687.6570367939275,0.0 +R12_FSU,TCE,all,2030,292.56470198256085,0.0 +R12_PAO,TCE,all,2030,30.35377387484896,0.0 +R12_PAS,TCE,all,2030,211.60275694768464,0.0 +R12_RCPA,TCE,all,2030,81.72172951882051,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP5_v5.3.1_NPiREF_SSP5 - Low Overshootf_v1.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP5_v5.3.1_NPiREF_SSP5 - Low Overshootf_v1.csv new file mode 100644 index 0000000000..6bcc0f4530 --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP5_v5.3.1_NPiREF_SSP5 - Low Overshootf_v1.csv @@ -0,0 +1,133 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP5_v5.3.1/NPiREF_SSP5 - Low Overshootf#1 +# +node,type_emission,type_tec,year,value,mrg +World,TCE,all,2040,351.3788672897879,0.0 +World,TCE,all,2045,448.4583697740907,0.0 +World,TCE,all,2050,572.3591488914793,0.0 +World,TCE,all,2055,730.4914288583876,0.0 +World,TCE,all,2060,932.3127422162406,0.0 +World,TCE,all,2070,1334.315790533648,0.0 +World,TCE,all,2080,2173.459821624554,0.0 +World,TCE,all,2090,3540.3370249608943,0.0 +World,TCE,all,2100,5766.835956940035,0.0 +World,TCE,all,2110,9393.568103766573,0.0 +R12_AFR,TCE,all,2040,7.580860246565309,0.0 +R12_AFR,TCE,all,2045,11.540070375858738,0.0 +R12_AFR,TCE,all,2050,17.487935483734372,0.0 +R12_AFR,TCE,all,2055,25.626892433619044,0.0 +R12_AFR,TCE,all,2060,37.478969946996386,0.0 +R12_AFR,TCE,all,2070,70.31106460942472,0.0 +R12_AFR,TCE,all,2080,119.12269639628087,0.0 +R12_AFR,TCE,all,2090,191.7819450697399,0.0 +R12_AFR,TCE,all,2100,292.0405604208905,0.0 +R12_AFR,TCE,all,2110,445.89658319400974,0.0 +R12_EEU,TCE,all,2040,5.241320227806287,0.0 +R12_EEU,TCE,all,2045,6.000032160542975,0.0 +R12_EEU,TCE,all,2050,6.716946447891535,0.0 +R12_EEU,TCE,all,2055,7.418044643894401,0.0 +R12_EEU,TCE,all,2060,8.164974610881515,0.0 +R12_EEU,TCE,all,2070,9.737608262593675,0.0 +R12_EEU,TCE,all,2080,11.362570130559396,0.0 +R12_EEU,TCE,all,2090,12.862522465412257,0.0 +R12_EEU,TCE,all,2100,14.064117148110741,0.0 +R12_EEU,TCE,all,2110,15.39458944211999,0.0 +R12_LAM,TCE,all,2040,6.052718468646368,0.0 +R12_LAM,TCE,all,2045,7.802615722504815,0.0 +R12_LAM,TCE,all,2050,9.892688426352063,0.0 +R12_LAM,TCE,all,2055,12.208302436105617,0.0 +R12_LAM,TCE,all,2060,14.85195151413803,0.0 +R12_LAM,TCE,all,2070,21.12814395495319,0.0 +R12_LAM,TCE,all,2080,28.537768653859132,0.0 +R12_LAM,TCE,all,2090,36.071692772737066,0.0 +R12_LAM,TCE,all,2100,42.13155232638874,0.0 +R12_LAM,TCE,all,2110,49.31026020545612,0.0 +R12_MEA,TCE,all,2040,6.344832189197832,0.0 +R12_MEA,TCE,all,2045,8.188486991516994,0.0 +R12_MEA,TCE,all,2050,10.335954752657466,0.0 +R12_MEA,TCE,all,2055,12.739411682137911,0.0 +R12_MEA,TCE,all,2060,15.544207316792082,0.0 +R12_MEA,TCE,all,2070,22.278792686375738,0.0 +R12_MEA,TCE,all,2080,30.36960307481443,0.0 +R12_MEA,TCE,all,2090,40.33821845906993,0.0 +R12_MEA,TCE,all,2100,51.108957760546765,0.0 +R12_MEA,TCE,all,2110,65.04430368673542,0.0 +R12_NAM,TCE,all,2040,4.988846787561552,0.0 +R12_NAM,TCE,all,2045,5.774550243205132,0.0 +R12_NAM,TCE,all,2050,6.610153536490881,0.0 +R12_NAM,TCE,all,2055,7.365998163162242,0.0 +R12_NAM,TCE,all,2060,8.185990031958083,0.0 +R12_NAM,TCE,all,2070,10.042746767565875,0.0 +R12_NAM,TCE,all,2080,12.110269245120119,0.0 +R12_NAM,TCE,all,2090,14.23281922113401,0.0 +R12_NAM,TCE,all,2100,16.269645181828142,0.0 +R12_NAM,TCE,all,2110,18.598744898648224,0.0 +R12_SAS,TCE,all,2040,9.252362686223085,0.0 +R12_SAS,TCE,all,2045,13.305822757133917,0.0 +R12_SAS,TCE,all,2050,18.620094598561916,0.0 +R12_SAS,TCE,all,2055,23.985688668528688,0.0 +R12_SAS,TCE,all,2060,30.45105876633138,0.0 +R12_SAS,TCE,all,2070,45.23968949807314,0.0 +R12_SAS,TCE,all,2080,62.78994904889987,0.0 +R12_SAS,TCE,all,2090,83.19756050583791,0.0 +R12_SAS,TCE,all,2100,105.09689279902145,0.0 +R12_SAS,TCE,all,2110,133.3833403603734,0.0 +R12_WEU,TCE,all,2040,4.95692729807275,0.0 +R12_WEU,TCE,all,2045,5.84769049965736,0.0 +R12_WEU,TCE,all,2050,6.822585741272237,0.0 +R12_WEU,TCE,all,2055,7.893883529188841,0.0 +R12_WEU,TCE,all,2060,9.08694837418355,0.0 +R12_WEU,TCE,all,2070,11.817075830706562,0.0 +R12_WEU,TCE,all,2080,14.477662697747192,0.0 +R12_WEU,TCE,all,2090,16.803818980169655,0.0 +R12_WEU,TCE,all,2100,18.48195416361988,0.0 +R12_WEU,TCE,all,2110,20.338647004358968,0.0 +R12_FSU,TCE,all,2040,5.729984086707182,0.0 +R12_FSU,TCE,all,2045,7.021691095120073,0.0 +R12_FSU,TCE,all,2050,8.436686653178533,0.0 +R12_FSU,TCE,all,2055,9.959465411465308,0.0 +R12_FSU,TCE,all,2060,11.72833234884674,0.0 +R12_FSU,TCE,all,2070,16.067517833674067,0.0 +R12_FSU,TCE,all,2080,21.20350367129636,0.0 +R12_FSU,TCE,all,2090,27.083327130386106,0.0 +R12_FSU,TCE,all,2100,33.29120703770576,0.0 +R12_FSU,TCE,all,2110,40.935645725263136,0.0 +R12_PAO,TCE,all,2040,4.892044778531785,0.0 +R12_PAO,TCE,all,2045,5.7651344655761365,0.0 +R12_PAO,TCE,all,2050,6.704615336798917,0.0 +R12_PAO,TCE,all,2055,7.7101330493066405,0.0 +R12_PAO,TCE,all,2060,8.805390376649088,0.0 +R12_PAO,TCE,all,2070,11.06092128915448,0.0 +R12_PAO,TCE,all,2080,12.794786911549028,0.0 +R12_PAO,TCE,all,2090,14.309735494724393,0.0 +R12_PAO,TCE,all,2100,15.465750830614356,0.0 +R12_PAO,TCE,all,2110,16.744977703490907,0.0 +R12_PAS,TCE,all,2040,6.1595900513363615,0.0 +R12_PAS,TCE,all,2045,7.655509229865127,0.0 +R12_PAS,TCE,all,2050,9.23988822774788,0.0 +R12_PAS,TCE,all,2055,10.777509287263545,0.0 +R12_PAS,TCE,all,2060,12.427658335780649,0.0 +R12_PAS,TCE,all,2070,16.23508009876941,0.0 +R12_PAS,TCE,all,2080,20.52345427864978,0.0 +R12_PAS,TCE,all,2090,23.77033216629504,0.0 +R12_PAS,TCE,all,2100,26.882167394481545,0.0 +R12_PAS,TCE,all,2110,30.508326344277535,0.0 +R12_CHN,TCE,all,2040,5.865429745297453,0.0 +R12_CHN,TCE,all,2045,7.1767795842078685,0.0 +R12_CHN,TCE,all,2050,8.573018574919336,0.0 +R12_CHN,TCE,all,2055,9.881535775461597,0.0 +R12_CHN,TCE,all,2060,11.296036275195732,0.0 +R12_CHN,TCE,all,2070,14.165539132732198,0.0 +R12_CHN,TCE,all,2080,15.884115336347241,0.0 +R12_CHN,TCE,all,2090,17.140112833678025,0.0 +R12_CHN,TCE,all,2100,18.159313682397332,0.0 +R12_CHN,TCE,all,2110,19.239154637529158,0.0 +R12_RCPA,TCE,all,2040,7.488435372464127,0.0 +R12_RCPA,TCE,all,2045,9.727854235091712,0.0 +R12_RCPA,TCE,all,2050,12.07845440128819,0.0 +R12_RCPA,TCE,all,2055,14.443231796611318,0.0 +R12_RCPA,TCE,all,2060,17.052700388419904,0.0 +R12_RCPA,TCE,all,2070,22.827813356758885,0.0 +R12_RCPA,TCE,all,2080,27.438235928788917,0.0 +R12_RCPA,TCE,all,2090,31.648240544250786,0.0 +R12_RCPA,TCE,all,2100,35.74233011002264,0.0 +R12_RCPA,TCE,all,2110,40.46678428229289,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP5_v5.3.1_NPiREF_v1.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP5_v5.3.1_NPiREF_v1.csv new file mode 100644 index 0000000000..edd61c7174 --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP5_v5.3.1_NPiREF_v1.csv @@ -0,0 +1,135 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP5_v5.3.1/NPiREF#1 +# +node,type_emission,type_tec,year,value,mrg +R12_AFR,TCE,all,2035,5.188968453965688,0.0 +R12_AFR,TCE,all,2040,7.580860246565309,0.0 +R12_AFR,TCE,all,2045,11.540070375858738,0.0 +R12_AFR,TCE,all,2050,17.487935483734372,0.0 +R12_AFR,TCE,all,2055,25.626892433619044,0.0 +R12_AFR,TCE,all,2060,37.478969946996386,0.0 +R12_AFR,TCE,all,2070,70.31106460942472,0.0 +R12_AFR,TCE,all,2080,119.12269639628087,0.0 +R12_AFR,TCE,all,2090,191.7819450697399,0.0 +R12_AFR,TCE,all,2100,292.0405604208905,0.0 +R12_AFR,TCE,all,2110,445.89658319400974,0.0 +R12_EEU,TCE,all,2035,4.401008550351292,0.0 +R12_EEU,TCE,all,2040,5.241320227806287,0.0 +R12_EEU,TCE,all,2045,6.000032160542975,0.0 +R12_EEU,TCE,all,2050,6.716946447891535,0.0 +R12_EEU,TCE,all,2055,7.418044643894401,0.0 +R12_EEU,TCE,all,2060,8.164974610881515,0.0 +R12_EEU,TCE,all,2070,9.737608262593675,0.0 +R12_EEU,TCE,all,2080,11.362570130559396,0.0 +R12_EEU,TCE,all,2090,12.862522465412257,0.0 +R12_EEU,TCE,all,2100,14.064117148110741,0.0 +R12_EEU,TCE,all,2110,15.39458944211999,0.0 +R12_LAM,TCE,all,2035,4.625625810187822,0.0 +R12_LAM,TCE,all,2040,6.052718468646368,0.0 +R12_LAM,TCE,all,2045,7.802615722504815,0.0 +R12_LAM,TCE,all,2050,9.892688426352063,0.0 +R12_LAM,TCE,all,2055,12.208302436105617,0.0 +R12_LAM,TCE,all,2060,14.85195151413803,0.0 +R12_LAM,TCE,all,2070,21.12814395495319,0.0 +R12_LAM,TCE,all,2080,28.537768653859132,0.0 +R12_LAM,TCE,all,2090,36.071692772737066,0.0 +R12_LAM,TCE,all,2100,42.13155232638874,0.0 +R12_LAM,TCE,all,2110,49.31026020545612,0.0 +R12_MEA,TCE,all,2035,4.772147575723877,0.0 +R12_MEA,TCE,all,2040,6.344832189197832,0.0 +R12_MEA,TCE,all,2045,8.188486991516994,0.0 +R12_MEA,TCE,all,2050,10.335954752657466,0.0 +R12_MEA,TCE,all,2055,12.739411682137911,0.0 +R12_MEA,TCE,all,2060,15.544207316792082,0.0 +R12_MEA,TCE,all,2070,22.278792686375738,0.0 +R12_MEA,TCE,all,2080,30.36960307481443,0.0 +R12_MEA,TCE,all,2090,40.33821845906993,0.0 +R12_MEA,TCE,all,2100,51.108957760546765,0.0 +R12_MEA,TCE,all,2110,65.04430368673542,0.0 +R12_NAM,TCE,all,2035,4.249490138562791,0.0 +R12_NAM,TCE,all,2040,4.988846787561552,0.0 +R12_NAM,TCE,all,2045,5.774550243205132,0.0 +R12_NAM,TCE,all,2050,6.610153536490881,0.0 +R12_NAM,TCE,all,2055,7.365998163162242,0.0 +R12_NAM,TCE,all,2060,8.185990031958083,0.0 +R12_NAM,TCE,all,2070,10.042746767565875,0.0 +R12_NAM,TCE,all,2080,12.110269245120119,0.0 +R12_NAM,TCE,all,2090,14.23281922113401,0.0 +R12_NAM,TCE,all,2100,16.269645181828142,0.0 +R12_NAM,TCE,all,2110,18.598744898648224,0.0 +R12_SAS,TCE,all,2035,5.737777204602064,0.0 +R12_SAS,TCE,all,2040,9.252362686223085,0.0 +R12_SAS,TCE,all,2045,13.305822757133917,0.0 +R12_SAS,TCE,all,2050,18.620094598561916,0.0 +R12_SAS,TCE,all,2055,23.985688668528688,0.0 +R12_SAS,TCE,all,2060,30.45105876633138,0.0 +R12_SAS,TCE,all,2070,45.23968949807314,0.0 +R12_SAS,TCE,all,2080,62.78994904889987,0.0 +R12_SAS,TCE,all,2090,83.19756050583791,0.0 +R12_SAS,TCE,all,2100,105.09689279902145,0.0 +R12_SAS,TCE,all,2110,133.3833403603734,0.0 +R12_WEU,TCE,all,2035,4.219264289485984,0.0 +R12_WEU,TCE,all,2040,4.95692729807275,0.0 +R12_WEU,TCE,all,2045,5.84769049965736,0.0 +R12_WEU,TCE,all,2050,6.822585741272237,0.0 +R12_WEU,TCE,all,2055,7.893883529188841,0.0 +R12_WEU,TCE,all,2060,9.08694837418355,0.0 +R12_WEU,TCE,all,2070,11.817075830706562,0.0 +R12_WEU,TCE,all,2080,14.477662697747192,0.0 +R12_WEU,TCE,all,2090,16.803818980169655,0.0 +R12_WEU,TCE,all,2100,18.48195416361988,0.0 +R12_WEU,TCE,all,2110,20.338647004358968,0.0 +R12_FSU,TCE,all,2035,4.5433145851809975,0.0 +R12_FSU,TCE,all,2040,5.729984086707182,0.0 +R12_FSU,TCE,all,2045,7.021691095120073,0.0 +R12_FSU,TCE,all,2050,8.436686653178533,0.0 +R12_FSU,TCE,all,2055,9.959465411465308,0.0 +R12_FSU,TCE,all,2060,11.72833234884674,0.0 +R12_FSU,TCE,all,2070,16.067517833674067,0.0 +R12_FSU,TCE,all,2080,21.20350367129636,0.0 +R12_FSU,TCE,all,2090,27.083327130386106,0.0 +R12_FSU,TCE,all,2100,33.29120703770576,0.0 +R12_FSU,TCE,all,2110,40.935645725263136,0.0 +R12_PAO,TCE,all,2035,4.183823334761288,0.0 +R12_PAO,TCE,all,2040,4.892044778531785,0.0 +R12_PAO,TCE,all,2045,5.7651344655761365,0.0 +R12_PAO,TCE,all,2050,6.704615336798917,0.0 +R12_PAO,TCE,all,2055,7.7101330493066405,0.0 +R12_PAO,TCE,all,2060,8.805390376649088,0.0 +R12_PAO,TCE,all,2070,11.06092128915448,0.0 +R12_PAO,TCE,all,2080,12.794786911549028,0.0 +R12_PAO,TCE,all,2090,14.309735494724393,0.0 +R12_PAO,TCE,all,2100,15.465750830614356,0.0 +R12_PAO,TCE,all,2110,16.744977703490907,0.0 +R12_PAS,TCE,all,2035,4.748861681376875,0.0 +R12_PAS,TCE,all,2040,6.1595900513363615,0.0 +R12_PAS,TCE,all,2045,7.655509229865127,0.0 +R12_PAS,TCE,all,2050,9.23988822774788,0.0 +R12_PAS,TCE,all,2055,10.777509287263545,0.0 +R12_PAS,TCE,all,2060,12.427658335780649,0.0 +R12_PAS,TCE,all,2070,16.23508009876941,0.0 +R12_PAS,TCE,all,2080,20.52345427864978,0.0 +R12_PAS,TCE,all,2090,23.77033216629504,0.0 +R12_PAS,TCE,all,2100,26.882167394481545,0.0 +R12_PAS,TCE,all,2110,30.508326344277535,0.0 +R12_CHN,TCE,all,2035,4.668068287741104,0.0 +R12_CHN,TCE,all,2040,5.865429745297453,0.0 +R12_CHN,TCE,all,2045,7.1767795842078685,0.0 +R12_CHN,TCE,all,2050,8.573018574919336,0.0 +R12_CHN,TCE,all,2055,9.881535775461597,0.0 +R12_CHN,TCE,all,2060,11.296036275195732,0.0 +R12_CHN,TCE,all,2070,14.165539132732198,0.0 +R12_CHN,TCE,all,2080,15.884115336347241,0.0 +R12_CHN,TCE,all,2090,17.140112833678025,0.0 +R12_CHN,TCE,all,2100,18.159313682397332,0.0 +R12_CHN,TCE,all,2110,19.239154637529158,0.0 +R12_RCPA,TCE,all,2035,5.366708834641064,0.0 +R12_RCPA,TCE,all,2040,7.488435372464127,0.0 +R12_RCPA,TCE,all,2045,9.727854235091712,0.0 +R12_RCPA,TCE,all,2050,12.07845440128819,0.0 +R12_RCPA,TCE,all,2055,14.443231796611318,0.0 +R12_RCPA,TCE,all,2060,17.052700388419904,0.0 +R12_RCPA,TCE,all,2070,22.827813356758885,0.0 +R12_RCPA,TCE,all,2080,27.438235928788917,0.0 +R12_RCPA,TCE,all,2090,31.648240544250786,0.0 +R12_RCPA,TCE,all,2100,35.74233011002264,0.0 +R12_RCPA,TCE,all,2110,40.46678428229289,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP5_v5.3.1_SSP5 - Low Overshoot_v2.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP5_v5.3.1_SSP5 - Low Overshoot_v2.csv new file mode 100644 index 0000000000..567f73b106 --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP5_v5.3.1_SSP5 - Low Overshoot_v2.csv @@ -0,0 +1,133 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP5_v5.3.1/SSP5 - Low Overshoot#2 +# +node,type_emission,type_tec,year,value,mrg +World,TCE,all,2040,351.3788672897879,0.0 +World,TCE,all,2045,448.4583697740907,0.0 +World,TCE,all,2050,572.3591488914793,0.0 +World,TCE,all,2055,730.4914288583876,0.0 +World,TCE,all,2060,932.3127422162406,0.0 +World,TCE,all,2070,1334.315790533648,0.0 +World,TCE,all,2080,2173.459821624554,0.0 +World,TCE,all,2090,3540.3370249608943,0.0 +World,TCE,all,2100,5766.835956940035,0.0 +World,TCE,all,2110,9393.568103766573,0.0 +R12_AFR,TCE,all,2040,7.580860246565309,0.0 +R12_AFR,TCE,all,2045,11.540070375858738,0.0 +R12_AFR,TCE,all,2050,17.487935483734372,0.0 +R12_AFR,TCE,all,2055,25.626892433619044,0.0 +R12_AFR,TCE,all,2060,37.478969946996386,0.0 +R12_AFR,TCE,all,2070,70.31106460942472,0.0 +R12_AFR,TCE,all,2080,119.12269639628087,0.0 +R12_AFR,TCE,all,2090,191.7819450697399,0.0 +R12_AFR,TCE,all,2100,292.0405604208905,0.0 +R12_AFR,TCE,all,2110,445.89658319400974,0.0 +R12_EEU,TCE,all,2040,5.241320227806287,0.0 +R12_EEU,TCE,all,2045,6.000032160542975,0.0 +R12_EEU,TCE,all,2050,6.716946447891535,0.0 +R12_EEU,TCE,all,2055,7.418044643894401,0.0 +R12_EEU,TCE,all,2060,8.164974610881515,0.0 +R12_EEU,TCE,all,2070,9.737608262593675,0.0 +R12_EEU,TCE,all,2080,11.362570130559396,0.0 +R12_EEU,TCE,all,2090,12.862522465412257,0.0 +R12_EEU,TCE,all,2100,14.064117148110741,0.0 +R12_EEU,TCE,all,2110,15.39458944211999,0.0 +R12_LAM,TCE,all,2040,6.052718468646368,0.0 +R12_LAM,TCE,all,2045,7.802615722504815,0.0 +R12_LAM,TCE,all,2050,9.892688426352063,0.0 +R12_LAM,TCE,all,2055,12.208302436105617,0.0 +R12_LAM,TCE,all,2060,14.85195151413803,0.0 +R12_LAM,TCE,all,2070,21.12814395495319,0.0 +R12_LAM,TCE,all,2080,28.537768653859132,0.0 +R12_LAM,TCE,all,2090,36.071692772737066,0.0 +R12_LAM,TCE,all,2100,42.13155232638874,0.0 +R12_LAM,TCE,all,2110,49.31026020545612,0.0 +R12_MEA,TCE,all,2040,6.344832189197832,0.0 +R12_MEA,TCE,all,2045,8.188486991516994,0.0 +R12_MEA,TCE,all,2050,10.335954752657466,0.0 +R12_MEA,TCE,all,2055,12.739411682137911,0.0 +R12_MEA,TCE,all,2060,15.544207316792082,0.0 +R12_MEA,TCE,all,2070,22.278792686375738,0.0 +R12_MEA,TCE,all,2080,30.36960307481443,0.0 +R12_MEA,TCE,all,2090,40.33821845906993,0.0 +R12_MEA,TCE,all,2100,51.108957760546765,0.0 +R12_MEA,TCE,all,2110,65.04430368673542,0.0 +R12_NAM,TCE,all,2040,4.988846787561552,0.0 +R12_NAM,TCE,all,2045,5.774550243205132,0.0 +R12_NAM,TCE,all,2050,6.610153536490881,0.0 +R12_NAM,TCE,all,2055,7.365998163162242,0.0 +R12_NAM,TCE,all,2060,8.185990031958083,0.0 +R12_NAM,TCE,all,2070,10.042746767565875,0.0 +R12_NAM,TCE,all,2080,12.110269245120119,0.0 +R12_NAM,TCE,all,2090,14.23281922113401,0.0 +R12_NAM,TCE,all,2100,16.269645181828142,0.0 +R12_NAM,TCE,all,2110,18.598744898648224,0.0 +R12_SAS,TCE,all,2040,9.252362686223085,0.0 +R12_SAS,TCE,all,2045,13.305822757133917,0.0 +R12_SAS,TCE,all,2050,18.620094598561916,0.0 +R12_SAS,TCE,all,2055,23.985688668528688,0.0 +R12_SAS,TCE,all,2060,30.45105876633138,0.0 +R12_SAS,TCE,all,2070,45.23968949807314,0.0 +R12_SAS,TCE,all,2080,62.78994904889987,0.0 +R12_SAS,TCE,all,2090,83.19756050583791,0.0 +R12_SAS,TCE,all,2100,105.09689279902145,0.0 +R12_SAS,TCE,all,2110,133.3833403603734,0.0 +R12_WEU,TCE,all,2040,4.95692729807275,0.0 +R12_WEU,TCE,all,2045,5.84769049965736,0.0 +R12_WEU,TCE,all,2050,6.822585741272237,0.0 +R12_WEU,TCE,all,2055,7.893883529188841,0.0 +R12_WEU,TCE,all,2060,9.08694837418355,0.0 +R12_WEU,TCE,all,2070,11.817075830706562,0.0 +R12_WEU,TCE,all,2080,14.477662697747192,0.0 +R12_WEU,TCE,all,2090,16.803818980169655,0.0 +R12_WEU,TCE,all,2100,18.48195416361988,0.0 +R12_WEU,TCE,all,2110,20.338647004358968,0.0 +R12_FSU,TCE,all,2040,5.729984086707182,0.0 +R12_FSU,TCE,all,2045,7.021691095120073,0.0 +R12_FSU,TCE,all,2050,8.436686653178533,0.0 +R12_FSU,TCE,all,2055,9.959465411465308,0.0 +R12_FSU,TCE,all,2060,11.72833234884674,0.0 +R12_FSU,TCE,all,2070,16.067517833674067,0.0 +R12_FSU,TCE,all,2080,21.20350367129636,0.0 +R12_FSU,TCE,all,2090,27.083327130386106,0.0 +R12_FSU,TCE,all,2100,33.29120703770576,0.0 +R12_FSU,TCE,all,2110,40.935645725263136,0.0 +R12_PAO,TCE,all,2040,4.892044778531785,0.0 +R12_PAO,TCE,all,2045,5.7651344655761365,0.0 +R12_PAO,TCE,all,2050,6.704615336798917,0.0 +R12_PAO,TCE,all,2055,7.7101330493066405,0.0 +R12_PAO,TCE,all,2060,8.805390376649088,0.0 +R12_PAO,TCE,all,2070,11.06092128915448,0.0 +R12_PAO,TCE,all,2080,12.794786911549028,0.0 +R12_PAO,TCE,all,2090,14.309735494724393,0.0 +R12_PAO,TCE,all,2100,15.465750830614356,0.0 +R12_PAO,TCE,all,2110,16.744977703490907,0.0 +R12_PAS,TCE,all,2040,6.1595900513363615,0.0 +R12_PAS,TCE,all,2045,7.655509229865127,0.0 +R12_PAS,TCE,all,2050,9.23988822774788,0.0 +R12_PAS,TCE,all,2055,10.777509287263545,0.0 +R12_PAS,TCE,all,2060,12.427658335780649,0.0 +R12_PAS,TCE,all,2070,16.23508009876941,0.0 +R12_PAS,TCE,all,2080,20.52345427864978,0.0 +R12_PAS,TCE,all,2090,23.77033216629504,0.0 +R12_PAS,TCE,all,2100,26.882167394481545,0.0 +R12_PAS,TCE,all,2110,30.508326344277535,0.0 +R12_CHN,TCE,all,2040,5.865429745297453,0.0 +R12_CHN,TCE,all,2045,7.1767795842078685,0.0 +R12_CHN,TCE,all,2050,8.573018574919336,0.0 +R12_CHN,TCE,all,2055,9.881535775461597,0.0 +R12_CHN,TCE,all,2060,11.296036275195732,0.0 +R12_CHN,TCE,all,2070,14.165539132732198,0.0 +R12_CHN,TCE,all,2080,15.884115336347241,0.0 +R12_CHN,TCE,all,2090,17.140112833678025,0.0 +R12_CHN,TCE,all,2100,18.159313682397332,0.0 +R12_CHN,TCE,all,2110,19.239154637529158,0.0 +R12_RCPA,TCE,all,2040,7.488435372464127,0.0 +R12_RCPA,TCE,all,2045,9.727854235091712,0.0 +R12_RCPA,TCE,all,2050,12.07845440128819,0.0 +R12_RCPA,TCE,all,2055,14.443231796611318,0.0 +R12_RCPA,TCE,all,2060,17.052700388419904,0.0 +R12_RCPA,TCE,all,2070,22.827813356758885,0.0 +R12_RCPA,TCE,all,2080,27.438235928788917,0.0 +R12_RCPA,TCE,all,2090,31.648240544250786,0.0 +R12_RCPA,TCE,all,2100,35.74233011002264,0.0 +R12_RCPA,TCE,all,2110,40.46678428229289,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP5_v5.3.1_baseline2055_low_dem_scen_v1.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP5_v5.3.1_baseline2055_low_dem_scen_v1.csv new file mode 100644 index 0000000000..9b31a9e5a4 --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP5_v5.3.1_baseline2055_low_dem_scen_v1.csv @@ -0,0 +1,9 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP5_v5.3.1/baseline2055_low_dem_scen#1 +# +node,type_emission,type_tec,year,value,mrg +World,TCE,all,2060,2016.6666666666665,0.0 +World,TCE,all,2070,3284.937497334508,0.0 +World,TCE,all,2080,5350.817038707918,0.0 +World,TCE,all,2090,8715.917123220512,0.0 +World,TCE,all,2100,14197.31056945139,0.0 +World,TCE,all,2110,23125.922901269954,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP5_v5.3.1_baseline2060_low_dem_scen_v2.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP5_v5.3.1_baseline2060_low_dem_scen_v2.csv new file mode 100644 index 0000000000..e78d240494 --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP5_v5.3.1_baseline2060_low_dem_scen_v2.csv @@ -0,0 +1,8 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP5_v5.3.1/baseline2060_low_dem_scen#2 +# +node,type_emission,type_tec,year,value,mrg +World,TCE,all,2070,2016.6666666666665,0.0 +World,TCE,all,2080,3284.937497334508,0.0 +World,TCE,all,2090,5350.817038707918,0.0 +World,TCE,all,2100,8715.917123220512,0.0 +World,TCE,all,2110,14197.310569451392,0.0 diff --git a/message_ix_models/data/transport/R12/price-emission/SSP_SSP5_v5.3.1_baseline_1000f_v2.csv b/message_ix_models/data/transport/R12/price-emission/SSP_SSP5_v5.3.1_baseline_1000f_v2.csv new file mode 100644 index 0000000000..830ac71fa2 --- /dev/null +++ b/message_ix_models/data/transport/R12/price-emission/SSP_SSP5_v5.3.1_baseline_1000f_v2.csv @@ -0,0 +1,15 @@ +# Exported from ixmp://ixmp-dev/SSP_SSP5_v5.3.1/baseline_1000f#2 +# +node,type_emission,type_tec,year,value,mrg +World,TCE,all,2030,114.8993949119736,0.0 +World,TCE,all,2035,146.64397926855824,0.0 +World,TCE,all,2040,187.15900699209317,0.0 +World,TCE,all,2045,238.8675898798171,0.0 +World,TCE,all,2050,304.8623008424222,0.0 +World,TCE,all,2055,389.0901336665118,0.0 +World,TCE,all,2060,496.5885637492296,0.0 +World,TCE,all,2070,710.7121162303467,0.0 +World,TCE,all,2080,1157.6751473132367,0.0 +World,TCE,all,2090,1885.7308270123153,0.0 +World,TCE,all,2100,3071.6568116689423,0.0 +World,TCE,all,2110,5003.40527583187,0.0 diff --git a/message_ix_models/model/emissions.py b/message_ix_models/model/emissions.py index 592ab6d442..4bd9780bdc 100644 --- a/message_ix_models/model/emissions.py +++ b/message_ix_models/model/emissions.py @@ -1,22 +1,77 @@ import logging import re -from typing import Optional +from dataclasses import dataclass, field +from pathlib import Path +from typing import TYPE_CHECKING, Optional +import genno import pandas as pd -from genno import Quantity +from genno import Key from genno import operator as g from iam_units import convert_gwp from message_ix import Scenario, make_df from message_ix_models import ScenarioInfo +from message_ix_models.tools.exo_data import BaseOptions, ExoDataSource, register_source from message_ix_models.util import package_data_path from .structure import get_codes +if TYPE_CHECKING: + from genno.types import AnyQuantity + log = logging.getLogger(__name__) -def get_emission_factors(units: Optional[str] = None) -> Quantity: +@dataclass +class Options(BaseOptions): + """Options for :class:`PRICE_EMISSION`.""" + + #: Override parent class default of :any:`True`. + aggregate: bool = False + #: Override parent class default of :any:`True`. + interpolate: bool = False + + #: Path containing CSV data files, for instance :py:`package_data_path("transport", + #: "R12", "price-emission)`. + base_path: Path = field(default_factory=Path.cwd) + + #: Information about a scenario used to construct a file name. Specifically, the + #: file name :file:`{scenario_info.path}.csv` is used. See + #: :attr:`~.ScenarioInfo.path`. + scenario_info: "ScenarioInfo" = field(default_factory=ScenarioInfo) + + +@register_source +class PRICE_EMISSION(ExoDataSource): + """Provider of exogenous data for ``PRICE_EMISSION``.""" + + Options = Options + + key = Key("PRICE_EMISSION:n-type_emission-type_tec-y:exo") + + def __init__(self, *args, **kwargs) -> None: + opts = self.options = self.Options.from_args( + f"{__name__}.PRICE_EMISSION", *args, **kwargs + ) + + self.path = opts.base_path.joinpath(f"{opts.scenario_info.path}.csv") + if not self.path.exists(): + msg = f"No file in {self.path.parent} for {opts.scenario_info.url}" + log.error(msg) + raise ValueError(msg) + + def get(self) -> "AnyQuantity": + from genno.operator import load_file + from ixmp.report.common import RENAME_DIMS + + # Map e.g. "type_tec" → "type_tec", even if not in RENAME_DIMS + dims = {d: d for d in self.key.dims} | RENAME_DIMS + + return load_file(self.path, dims=dims) + + +def get_emission_factors(units: Optional[str] = None) -> "AnyQuantity": """Return carbon emission factors. Values are from the file :file:`message_ix_models/data/ipcc/1996_v3_t1-2.csv`, in @@ -67,7 +122,9 @@ def get_emission_factors(units: Optional[str] = None) -> Quantity: # Manually insert a value for methanol result = g.concat( result, - Quantity(pd.Series(17.4, pd.Index(["methanol"], name="c")), units=result.units), + genno.Quantity( + pd.Series(17.4, pd.Index(["methanol"], name="c")), units=result.units + ), ) result.attrs["species"] = "C" @@ -82,7 +139,9 @@ def get_emission_factors(units: Optional[str] = None) -> Quantity: gwp_factor, to_units = 1.0, result.units # Multiply by the GWP factor; let genno/pint handle other conversion - return result.pipe(g.mul, Quantity(gwp_factor)).pipe(g.convert_units, to_units) + return result.pipe(g.mul, genno.Quantity(gwp_factor)).pipe( + g.convert_units, to_units + ) def add_tax_emission( diff --git a/message_ix_models/model/material/data_util.py b/message_ix_models/model/material/data_util.py index 34dfb0978e..446328b1a8 100644 --- a/message_ix_models/model/material/data_util.py +++ b/message_ix_models/model/material/data_util.py @@ -17,7 +17,6 @@ from message_ix_models.model.structure import get_region_codes from message_ix_models.tools.costs.config import Config from message_ix_models.tools.costs.projections import create_cost_projections -from message_ix_models.tools.exo_data import prepare_computer from message_ix_models.util import package_data_path if TYPE_CHECKING: @@ -2207,26 +2206,19 @@ def get_ssp_soc_eco_data( DataFrame with SSP indicator data in "bound_activity_*" parameter format """ - from message_ix_models.project.ssp.data import SSPUpdate # noqa: F401 + from message_ix_models.project.ssp.data import SSPUpdate c = Computer() - keys = prepare_computer( - context, - c, - source="ICONICS:SSP(2024).2", - source_kw=dict(measure=measure, model=model), + keys = SSPUpdate.add_tasks( + c, context=context, release="3.1", measure=measure, model=model, ssp_id="2" ) - df = ( + return ( c.get(keys[0]) .to_dataframe() .reset_index() .rename(columns={"n": "node_loc", "y": "year_act"}) + .assign(mode="P", technology=tec, time="year", unit="GWa") ) - df["mode"] = "P" - df["time"] = "year" - df["unit"] = "GWa" - df["technology"] = tec - return df def add_elec_i_ini_act(scenario: message_ix.Scenario) -> None: diff --git a/message_ix_models/model/transport/base.py b/message_ix_models/model/transport/base.py index e7158d17d7..c5c3ed1b44 100644 --- a/message_ix_models/model/transport/base.py +++ b/message_ix_models/model/transport/base.py @@ -15,14 +15,19 @@ from .key import gdp_exo from .key import report as k_report +from .util import EXTRAPOLATE if TYPE_CHECKING: + from collections.abc import Hashable, Iterable + import message_ix from genno.core.key import KeyLike - from genno.types import AnyQuantity + from genno.types import AnyQuantity, TQuantity + + Coords = dict[Hashable, Iterable[Hashable]] #: Key to trigger the computations set up by :func:`.prepare_computer` -RESULT_KEY = "base model data" +TARGET = "base model data" FE_HEADER = """Final energy input to transport technologies. @@ -54,19 +59,45 @@ def align_and_fill( - qty: "AnyQuantity", ref: "AnyQuantity", value: float = 1.0 -) -> "AnyQuantity": + qty: "TQuantity", ref: "TQuantity", value: float = 1.0 +) -> "TQuantity": """Align `qty` with `ref`, and fill with `value`. The result is guaranteed to have a value for every key in `ref`. """ - return genno.Quantity( + return type(qty)( pd.DataFrame.from_dict( {"ref": ref.to_series(), "data": qty.to_series()} ).fillna(value)["data"] ) +def fixed_scale_1( + qty: "TQuantity", *, commodity: str, technology: str, value: float = 1.0 +) -> "TQuantity": + """Fix certain values for scale-1.""" + from genno.operator import concat, select + + # Coords of `qty` + dims = {d: v.data for d, v in qty.coords.items()} + + # Coords excepting `commodity` and `technology` + c_other: "Coords" = dict(c=sorted(set(dims["c"]) - {commodity})) + t_other: "Coords" = dict(t=sorted(set(dims["t"]) - {technology})) + # Dimensions for the fixed values + dims.update(c=[commodity], t=[technology]) + + # Concatenate: + # 1. Values for all technologies other than `technology`. + # 2. Values for `technology` and all commodities other than `commodity`. + # 3. Fixed values for (t=technology, c=commodity). + return concat( + select(qty, t_other), + select(qty, dict(t=["technology"]) | c_other), + type(qty)(value).expand_dims(dims), + ) + + @minimum_version("pandas 2; python 3.10") def smooth(c: Computer, key: "genno.Key", *, dim: str = "ya") -> "genno.Key": """Implement ‘smoothing’ for `key` along the dimension `dim`. @@ -100,7 +131,7 @@ def first_block_false(column: pd.Series) -> pd.Series: return column - def clip_nan(qty: "AnyQuantity", coord: Any) -> "AnyQuantity": + def clip_nan(qty: "TQuantity", coord: Any) -> "TQuantity": """Clip values below the value for `ya`, replacing with :any:`numpy.nan`. Only the first contiguous block of values below the value for `ya` are clipped. @@ -114,7 +145,7 @@ def clip_nan(qty: "AnyQuantity", coord: Any) -> "AnyQuantity": # - Reorder and sort index. # - Compute condition for clipping. # - Return clipped values. - return genno.Quantity( + return type(qty)( qty.sel({dim: coord}) .expand_dims({dim: qty.coords[dim].data}) .to_series() @@ -147,7 +178,7 @@ def clip_nan(qty: "AnyQuantity", coord: Any) -> "AnyQuantity": def prepare_reporter(rep: "message_ix.Reporter") -> str: """Add tasks that produce data to parametrize transport in MESSAGEix-GLOBIOM. - Returns :data:`.RESULT_KEY`. Retrieving the key results in the creation of files in + Returns :data:`.TARGET`. Retrieving the key results in the creation of files in the reporting output directory for the :class:`.Scenario` being reported (see :func:`.make_output_path`): @@ -170,9 +201,9 @@ def prepare_reporter(rep: "message_ix.Reporter") -> str: # Add an empty list; invoking this key will trigger calculation of all the keys # below added to the list - rep.add(RESULT_KEY, []) + rep.add(TARGET, []) # Add this result key to the list of all reporting keys - rep.graph[k_report.all].append(RESULT_KEY) + rep.graph[k_report.all].append(TARGET) # Create output subdirectory for base model files rep.graph["config"]["output_dir"].joinpath("base").mkdir( @@ -224,25 +255,23 @@ def prepare_reporter(rep: "message_ix.Reporter") -> str: # Restore original "t" labels to scale-1 rep.add(s1[5], "select", s1[4], "indexers::iea to transport") rep.add(s1[6], "rename_dims", s1[5], quote(dict(t_new="t"))) + + # Force scale-1 factor to 1.0 for (t=F ROAD, c=gas) + rep.add(s1[7], fixed_scale_1, s1[6], commodity="gas", technology="F ROAD") + # Interpolate the scaling factor from computed value in ya=y₀ to 1.0 in ya ≥ 2050 - rep.add(s1[7], lambda q: q.expand_dims(ya=[y0]), s1[6]) - rep.add(s1[8], lambda q: q.expand_dims(ya=[2050]).clip(1.0, 1.0), s1[6]) - rep.add(s1[9], lambda q: q.expand_dims(ya=[2110]).clip(1.0, 1.0), s1[6]) - rep.add(s1[10], "concat", s1[7], s1[8], s1[9]) + rep.add(s1[8], lambda q: q.expand_dims(ya=[y0]), s1[7]) + rep.add(s1[9], lambda q: q.expand_dims(ya=[2050]).clip(1.0, 1.0), s1[7]) + rep.add(s1[10], lambda q: q.expand_dims(ya=[2110]).clip(1.0, 1.0), s1[7]) + rep.add(s1[11], "concat", s1[8], s1[9], s1[10]) rep.add("ya::coord", lambda v: {"ya": v}, "y::model") - rep.add( - s1[11], - "interpolate", - s1[10], - "ya::coord", - kwargs=dict(fill_value="extrapolate"), - ) + rep.add(s1[12], "interpolate", s1[11], "ya::coord", **EXTRAPOLATE) - rep.apply(to_csv, s1[11], name=f"{s1.name} blend", header_comment=SCALE_1_HEADER) + rep.apply(to_csv, s1[12], name=f"{s1.name} blend", header_comment=SCALE_1_HEADER) # Correct MESSAGEix-Transport outputs for the MESSAGEix-base model using the high- # resolution scaling factor - rep.add(k["s1"], "div", k, s1[11]) + rep.add(k["s1"], "div", k, s1[12]) # Scaling factor 2: ratio of total of scaled data to IEA total rep.add(k[2] / "ya", "select", k["s1"], indexers=dict(ya=y0), drop=True, sums=True) @@ -338,7 +367,7 @@ def prepare_reporter(rep: "message_ix.Reporter") -> str: rep.apply(to_csv, key + "1", name=name, header_key=k_header) - return RESULT_KEY + return TARGET def share_constraints(c: Computer, k_fe: "genno.Key", k_ue: "genno.Key") -> None: @@ -427,7 +456,7 @@ def to_csv( # kwargs supplied as keyword arguments to to_csv()/Computer.apply() c.add(csv, "write_report", base, path, kwargs=write_kw) - c.graph[RESULT_KEY].append(csv) + c.graph[TARGET].append(csv) def format_share_constraints( diff --git a/message_ix_models/model/transport/build.py b/message_ix_models/model/transport/build.py index 889ac7c98a..5d71d62bb4 100644 --- a/message_ix_models/model/transport/build.py +++ b/message_ix_models/model/transport/build.py @@ -30,6 +30,11 @@ if TYPE_CHECKING: import pathlib + from typing import TypedDict + + from message_ix_models.tools.exo_data import ExoDataSource + + AddTasksKw = TypedDict("AddTasksKw", {"context": Context, "strict": bool}) log = logging.getLogger(__name__) @@ -152,12 +157,10 @@ def add_exogenous_data(c: Computer, info: ScenarioInfo) -> None: -------- :doc:`/reference/model/transport/input` """ - # Ensure that the SSPOriginal and SSPUpdate data providers are available - import message_ix_models.project.advance.data # noqa: F401 - import message_ix_models.project.ssp.data # noqa: F401 + from message_ix_models.project.advance.data import ADVANCE from message_ix_models.project.ssp import SSP_2017, SSP_2024 - from message_ix_models.tools.exo_data import prepare_computer - from message_ix_models.tools.iea.web import TRANSFORM + from message_ix_models.project.ssp.data import SSPOriginal, SSPUpdate + from message_ix_models.tools.iea.web import IEA_EWEB, TRANSFORM from message_ix_models.util.sdmx import Dataflow # Ensure that the MERtoPPP data provider is available @@ -169,50 +172,58 @@ def add_exogenous_data(c: Computer, info: ScenarioInfo) -> None: context = c.graph["context"] config: "Config" = c.graph["config"]["transport"] + # Common arguments for ExoDataSource.add_tasks(…) + c_s: "AddTasksKw" = dict(context=context, strict=False) + # Identify appropriate source keyword arguments for loading GDP and population data - source = str(config.ssp) if config.ssp in SSP_2017: + cls: type["ExoDataSource"] = SSPOriginal source_kw: tuple[dict[str, Any], ...] = ( dict(measure="GDP", model="IIASA GDP"), dict(measure="POP", model="IIASA GDP"), ) elif config.ssp in SSP_2024: + cls, r = SSPUpdate, dict(release="3.2.beta") source_kw = ( - dict(measure="GDP", model="IIASA GDP 2023"), - dict(measure="POP"), + dict( + measure="GDP", + # model="IIASA GDP 2023", # with release="3.1" + model="OECD ENV-Growth 2025", # with release="3.2.beta" + unit="billion USD_2017/yr", + ) + | r, + dict(measure="POP") | r, ) for kw in source_kw: - keys[kw["measure"]] = prepare_computer( - context, c, source, source_kw=kw, strict=False - ) + keys[kw["measure"]] = cls.add_tasks(c, source=config.ssp.urn, **kw, **c_s) + # Add data for MERtoPPP kw = dict(measure="MERtoPPP", nodes=context.model.regions) - prepare_computer(context, c, "transport MERtoPPP", source_kw=kw, strict=False) + data.MERtoPPP.add_tasks(c, **kw, **c_s) # Add IEA Extended World Energy Balances data; select only the flows related to # transport kw = dict(provider="IEA", edition="2024", regions=context.model.regions) if context.model.regions == "R12": kw.update(flow=data.IEA_EWEB_FLOW, transform=TRANSFORM.B | TRANSFORM.C) - prepare_computer(context, c, "IEA_EWEB", source_kw=kw, strict=False) + IEA_EWEB.add_tasks(c, **kw, **c_s) # Add IEA Future of Trucks data for kw in dict(measure=1), dict(measure=2): - prepare_computer(context, c, "IEA Future of Trucks", source_kw=kw, strict=False) + data.IEA_Future_of_Trucks.add_tasks(c, **kw, **c_s) # Add ADVANCE data - common = dict(model="MESSAGE", scenario="ADV3TRAr2_Base", aggregate=False) + adv_common = dict(model="MESSAGE", scenario="ADV3TRAr2_Base", aggregate=False) for n, m, u in ( ("pdt ldv", "Transport|Service demand|Road|Passenger|LDV", "Gp km / a"), ("fv", "Transport|Service demand|Road|Freight", "Gt km"), ): # Add the base data - kw = dict(measure=m, name=f"advance {n}") - kw.update(common) - k, *_ = prepare_computer(context, c, "ADVANCE", source_kw=kw, strict=False) + kw = adv_common | dict(measure=m, name=f"advance {n}") + keys_advance = ADVANCE.add_tasks(c, **kw, **c_s) # Broadcast to R12 - c.add(f"{n}:n:advance", "broadcast_advance", k, "y0", "config") + c.add(f"{n}:n:advance", "broadcast_advance", keys_advance[0], "y0", "config") # Alias for other computations which expect the upper-case name c.add("MERtoPPP:n-y", "mertoppp:n-y") diff --git a/message_ix_models/model/transport/config.py b/message_ix_models/model/transport/config.py index 515cd31af2..84083c6f10 100644 --- a/message_ix_models/model/transport/config.py +++ b/message_ix_models/model/transport/config.py @@ -1,4 +1,6 @@ import logging +import re +from copy import deepcopy from dataclasses import InitVar, dataclass, field, replace from typing import TYPE_CHECKING, Any, Literal, Optional, Union @@ -13,11 +15,65 @@ from message_ix_models.util.config import ConfigHelper from message_ix_models.util.sdmx import AnnotationsMixIn +from .policy import ExogenousEmissionPrice, TaxEmission + if TYPE_CHECKING: from sdmx.model import common + from message_ix_models.tools.policy import Policy + + log = logging.getLogger(__name__) +#: All files in :file:`data/transport/R12/price-emission/`. +PRICE_EMISSION_URL = { + # "LED-SSP2": "SSP_LED_v5.3.1/baseline_1000f_v1", + # "LED-SSP2": "SSP_LED_v5.3.1/INDC2030i_SSP2 - Very Low Emissions_v1", + "LED-SSP2": "SSP_LED_v5.3.1/SSP2 - Very Low Emissions_v2", + # "SSP1": "SSP_SSP1_v5.3.1/baseline_1000f_v1", + # "SSP1": "SSP_SSP1_v5.3.1/INDC2030i_SSP1 - Low Emissions_a_v1", + # "SSP1": "SSP_SSP1_v5.3.1/INDC2030i_SSP1 - Low Emissions_v1", + # "SSP1": "SSP_SSP1_v5.3.1/INDC2030i_SSP1 - Very Low Emissions_v1", + # "SSP1": "SSP_SSP1_v5.3.1/SSP1 - Low Emissions_a_v2", + "SSP1": "SSP_SSP1_v5.3.1/SSP1 - Low Emissions_v2", + # "SSP1": "SSP_SSP1_v5.3.1/SSP1 - Very Low Emissions_v2", + # "SSP2": "SSP_SSP2_v5.3.1/baseline_1000f_v2", + # "SSP2": "SSP_SSP2_v5.3.1/baselineS_10_v1", + # "SSP2": "SSP_SSP2_v5.3.1/baselineS_110_v1", + # "SSP2": "SSP_SSP2_v5.3.1/baselineS_15_v1", + # "SSP2": "SSP_SSP2_v5.3.1/baselineS_20_v1", + # "SSP2": "SSP_SSP2_v5.3.1/baselineS_25_v1", + # "SSP2": "SSP_SSP2_v5.3.1/baselineS_50_v1", + # "SSP2": "SSP_SSP2_v5.3.1/baselineS_5_v3", + # "SSP2": "SSP_SSP2_v5.3.1/INDC2030i_SSP2 - Low Emissions_a_v1", + # "SSP2": "SSP_SSP2_v5.3.1/INDC2030i_SSP2 - Low Emissions_v1", + # "SSP2": "SSP_SSP2_v5.3.1/npiref2035_low_dem_scen2_v1", + # "SSP2": "SSP_SSP2_v5.3.1/NPIREF_price_cap_5$_bkp_v1", + # "SSP2": "SSP_SSP2_v5.3.1/NPiREF_SSP2 - Low Overshootf_price_cap_5$_bkp_v1", + # "SSP2": "SSP_SSP2_v5.3.1/NPiREF_SSP2 - Low Overshootf_v3", + # "SSP2": "SSP_SSP2_v5.3.1/NPiREF_SSP2 - Medium-Low Emissionsf_v1", + # "SSP2": "SSP_SSP2_v5.3.1/NPiREF_v10", + # "SSP2": "SSP_SSP2_v5.3.1/SSP2 - Low Emissions_a_v2", + "SSP2": "SSP_SSP2_v5.3.1/SSP2 - Low Emissions_v2", + # "SSP2": "SSP_SSP2_v5.3.1/SSP2 - Low Overshoot_v2", + # "SSP2": "SSP_SSP2_v5.3.1/SSP2 - Medium Emissions_a_v2", + # "SSP2": "SSP_SSP2_v5.3.1/SSP2 - Medium Emissions_v2", + # "SSP2": "SSP_SSP2_v5.3.1/SSP2 - Medium-Low Emissions_v2", + "SSP3": "SSP_SSP3_v5.3.1/baseline_1000f_v1", + # "SSP4": "SSP_SSP4_v5.3.1/baseline_1000f_v1", + # "SSP4": "SSP_SSP4_v5.3.1/NPi2030_v1", + # "SSP4": "SSP_SSP4_v5.3.1/NPiREF_SSP4 - Low Overshootf_v1", + # "SSP4": "SSP_SSP4_v5.3.1/NPiREF_v1", + "SSP4": "SSP_SSP4_v5.3.1/SSP4 - Low Overshoot_v2", + # "SSP5": "SSP_SSP5_v5.3.1/baseline_1000f_v2", + # "SSP5": "SSP_SSP5_v5.3.1/baseline2055_low_dem_scen_v1", + # "SSP5": "SSP_SSP5_v5.3.1/baseline2060_low_dem_scen_v2", + # "SSP5": "SSP_SSP5_v5.3.1/NPi2030_v1", + # "SSP5": "SSP_SSP5_v5.3.1/NPiREF_SSP5 - Low Overshootf_v1", + # "SSP5": "SSP_SSP5_v5.3.1/NPiREF_v1", + "SSP5": "SSP_SSP5_v5.3.1/SSP5 - Low Overshoot_v2", +} + @dataclass class DataSourceConfig(ConfigHelper): @@ -187,11 +243,9 @@ class Config(ConfigHelper): #: appearing in MA³T. node_to_census_division: dict = field(default_factory=dict) - #: **Temporary** setting for the SSP 2024 project: indicates whether the base - #: scenario used is a policy (carbon pricing) scenario, or not. This currently does - #: not affect *any* behaviour of :mod:`~message_ix_models.model.transport` except - #: the selection of a base scenario via :func:`.base_scenario_url`. - policy: bool = False + #: Instances of :class:`.Policy` subclasses applicable in a workflow or to a + #: scenario. + policy: set["Policy"] = field(default_factory=set) #: Flags for distinct scenario features according to projects. In addition to #: providing values directly, this can be set by passing :attr:`futures_scenario` or @@ -383,21 +437,18 @@ def use_scenario_code(self, code: "common.Code") -> tuple[str, str]: self.ssp = SSP_2024.by_urn(sca.SSP_URN) # Store settings on the Config instance + self.base_scenario_url = sca.base_scenario_URL + + if sca.policy: + self.policy.add(sca.policy) + self.project["LED"] = sca.is_LED_scenario self.project["EDITS"] = {"activity": sca.EDITS_activity_id} - self.base_scenario_url = sca.base_scenario_URL - # Construct labels including the SSP code and policy identifier - # ‘Short’ label used for workflow steps - label = f"{code.id}{' policy' if self.policy else ''}" - # ‘Full’ label used in the scenario name - if not sca.is_LED_scenario and sca.EDITS_activity_id is None: - label_full = f"SSP_2024.{self.ssp.name}" - else: - label_full = label - - return label, label_full + # 1. ‘Short’ label used for workflow steps + # 2. ‘Full’ label used in the scenario name + return code.id, re.sub("^SSP", "SSP_2024.", code.id) @dataclass @@ -408,6 +459,15 @@ class ScenarioCodeAnnotations(AnnotationsMixIn): is_LED_scenario: bool EDITS_activity_id: Optional[str] base_scenario_URL: str + policy: Optional["Policy"] + + @classmethod + def from_obj(cls, obj, globals=None): + globals = (globals or {}) | dict( + TaxEmission=TaxEmission, + ExogenousEmissionPrice=ExogenousEmissionPrice, + ) + return super().from_obj(obj, globals=globals) def get_cl_scenario() -> "common.Codelist": @@ -435,7 +495,9 @@ def get_cl_scenario() -> "common.Codelist": ) -def refresh_cl_scenario(cl: Optional["common.Codelist"] = None) -> "common.Codelist": +def refresh_cl_scenario( + existing: Optional["common.Codelist"] = None, +) -> "common.Codelist": """Refresh ``Codelist=IIASA_ECE:CL_TRANSPORT_SCENARIO``. The code list is entirely regenerated. If it is different from `cl`, the new @@ -449,10 +511,10 @@ def refresh_cl_scenario(cl: Optional["common.Codelist"] = None) -> "common.Codel IIASA_ECE = read("IIASA_ECE:AGENCIES")["IIASA_ECE"] cl_ssp_2024 = read("ICONICS:SSP(2024)") - candidate: "common.Codelist" = common.Codelist( + cl: "common.Codelist" = common.Codelist( id="CL_TRANSPORT_SCENARIO", maintainer=IIASA_ECE, - version="1.0.0", + version="1.1.0", is_external_reference=False, is_final=False, ) @@ -462,44 +524,56 @@ def refresh_cl_scenario(cl: Optional["common.Codelist"] = None) -> "common.Codel # - 2025-02-20: update to _v2.1 per discussion with OF. At this point _v2.3 is the # latest appearing in the database. # - 2025-05-05: update to _v5.0. + # - 2025-06-24: update to _v6.1. # - The scenario names appear to form a sequence from "baseline_DEFAULT" to # "baseline_DEFAULT_step_15" and finally "baseline". The one used below is the # latest in this sequence for which y₀=2020, rather than 2030. - base_url = "ixmp://ixmp-dev/SSP_SSP{}_v5.0/baseline_DEFAULT_step_13" + base_url = "ixmp://ixmp-dev/SSP_SSP{}_v6.1/baseline_DEFAULT_step_13" - def _a(c, led, edits): - """Shorthand to generate the annotations.""" - return ScenarioCodeAnnotations( - c.urn, led, edits, base_url.format(c.id) - ).get_annotations(dict) + def _code(id, name, c, led, edits): + """Shorthand for creating a code.""" + sca = ScenarioCodeAnnotations(c.urn, led, edits, base_url.format(c.id), None) + return common.Code(id=id, name=name, **sca.get_annotations(dict)) + # SSP baselines and policies for ssp_code in cl_ssp_2024: - candidate.append( - common.Code(id=f"SSP{ssp_code.id}", **_a(ssp_code, False, None)) + c_base = _code(f"SSP{ssp_code.id}", "", ssp_code, False, None) + cl.append(c_base) + + # Simple carbon tax + c = deepcopy(c_base) + c.get_annotation(id="policy").text = repr(TaxEmission(1000.0)) + c.id += " tax" + cl.append(c) + + # PRICE_EMISSION from exogenous data file + c = deepcopy(c_base) + c.get_annotation(id="policy").text = repr( + ExogenousEmissionPrice("ixmp://ixmp-dev/" + PRICE_EMISSION_URL[c.id]) ) + c.id += " exo price" + cl.append(c) + # LED + name_template = "Low Energy Demand/High-with-Low scenario with SSP{} demographics" for ssp in ("1", "2"): ssp_code = cl_ssp_2024[ssp] - candidate.append( - common.Code( - id=f"LED-SSP{ssp_code.id}", - name=f"Low Energy Demand/High-with-Low scenario with SSP{ssp_code.id} " - "demographics", - **_a(ssp_code, True, None), - ) - ) + name = name_template.format(ssp_code.id) + cl.append(_code(f"LED-SSP{ssp_code.id}", name_template, ssp_code, True, None)) + # EDITS + ssp_code = cl_ssp_2024["2"] + name_template = "EDITS scenario with ITF PASTA {!r} activity" for id_, name in (("CA", "Current Ambition"), ("HA", "High Ambition")): - candidate.append( - common.Code( - id=f"EDITS-{id_}", - name=f"EDITS scenario with ITF PASTA {id_!r} activity", - **_a(cl_ssp_2024["2"], False, id_), - ) + cl.append( + _code(f"EDITS-{id_}", name_template.format(id_), ssp_code, False, id_) ) - if cl is None or not candidate.compare(cl, strict=True): - write(candidate) - return candidate - else: + # FIXME This condition may appear to be always False, because the date/time differs. + # Adjust upstream (in sdmx1) to ignore this difference. + if existing is None or not cl.compare(existing, strict=True): + # No existing code list or new code list differs from existing + write(cl) return cl + else: + return existing diff --git a/message_ix_models/model/transport/data.py b/message_ix_models/model/transport/data.py index 73b90d6620..b363b0e3a1 100644 --- a/message_ix_models/model/transport/data.py +++ b/message_ix_models/model/transport/data.py @@ -6,20 +6,21 @@ import logging from collections import defaultdict from collections.abc import Callable, Iterator, Mapping -from copy import deepcopy +from dataclasses import dataclass from functools import cache, partial from itertools import chain from operator import le from typing import TYPE_CHECKING, Optional, cast +import genno import pandas as pd -from genno import Computer, Key, Quantity +from genno import Computer, Key from genno.core.key import single_key from ixmp.report.common import RENAME_DIMS from message_ix import make_df from message_ix_models import ScenarioInfo -from message_ix_models.tools.exo_data import ExoDataSource, register_source +from message_ix_models.tools.exo_data import BaseOptions, ExoDataSource from message_ix_models.util import ( adapt_R11_R12, adapt_R11_R14, @@ -36,6 +37,7 @@ if TYPE_CHECKING: import sdmx.message import sdmx.model.common + from genno.types import AnyQuantity from sdmx.model.v21 import Code log = logging.getLogger(__name__) @@ -60,32 +62,33 @@ class IEA_Future_of_Trucks(ExoDataSource): Parameters ---------- measure : int - One of: - - 1. energy intensity of vehicle distance travelled - 2. load - 3. energy intensity of freight service (mass × distance) + One of the keys of ;attr:`name_unit`. """ - id = "iea-future-of-trucks" + @dataclass + class Options(BaseOptions): + measure: str = "0" + convert_units: Optional[str] = None - convert_units: Optional[str] = None + options: Options - _name_unit = { + #: Mapping from :attr:`Options.measure` to name and unit. + name_unit = { 1: ("energy intensity of VDT", "GWa / (Gv km)"), 2: ("load factor", None), 3: ("energy intensity of FV", None), } - def __init__(self, source, source_kw): - if not source == "IEA Future of Trucks": - raise ValueError + def __init__(self, *args, **kwargs) -> None: + self.options = self.Options.from_args(self, *args, **kwargs) - self.measure = source_kw.pop("measure") - self.name, self._unit = self._name_unit[self.measure] - self.path = package_data_path("transport", f"iea-2017-t4-{self.measure}.csv") + self.options.name, self._unit = self.name_unit[int(self.options.measure)] + self.path = package_data_path( + "transport", f"iea-2017-t4-{self.options.measure}.csv" + ) + super().__init__() - def __call__(self): + def get(self) -> "AnyQuantity": from genno.operator import load_file return load_file(self.path, dims=RENAME_DIMS) @@ -114,20 +117,22 @@ def transform(self, c: "Computer", base_key: Key) -> Key: )[["n", "n2"]] # Share of freight activity; transcribed from figure 18, page 38 - share = Quantity( + share = genno.Quantity( xr.DataArray([0.1, 0.3, 0.6], coords=[("t", ["LCV", "MFT", "HFT"])]) ) # Add tasks k = base_key # Map from IEA source nodes to target nodes - c.add(k + "1", "map_as_qty", map_node, []) - c.add(k + "2", "broadcast_map", base_key, k + "1", rename={"n2": "n"}) + c.add(k[1], "map_as_qty", map_node, []) + c.add(k[2], "broadcast_map", base_key, k[1], rename={"n2": "n"}) # Weight by share of freight activity - result = c.add(k + "3", "sum", k + "2", weights=share, dimensions=["t"]) + result = c.add(k[3], "sum", k[2], weights=share, dimensions=["t"]) - if self.convert_units: - result = c.add(k + "4", "convert_units", k + "3", units=self.convert_units) + if self.options.convert_units: + result = c.add( + k[4], "convert_units", k[3], units=self.options.convert_units + ) return single_key(result) @@ -141,6 +146,16 @@ class MaybeAdaptR11Source(ExoDataSource): Must include exactly the keys "measure", "nodes", and "scenario". """ + @dataclass + class Options(BaseOptions): + #: ID of the node code list. + nodes: str = "" + + #: Scenario identifier. + scenario: str = "" + + options: Options + #: Set of measures recognized by a subclass. measures: set[str] = set() @@ -149,74 +164,56 @@ class MaybeAdaptR11Source(ExoDataSource): _adapter: Optional[Callable] = None - def __init__(self, source, source_kw): + def __init__(self, *args, **kwargs) -> None: from .util import region_path_fallback - # Check that the given measure is supported by the current class - if not source == self.id: - raise ValueError(source) - measure = source_kw.pop("measure", None) - if measure not in self.measures: - raise ValueError(measure) - else: - self.measure = measure - - # ID of the node code list - nodes = source_kw.pop("nodes") + opt = self.options = self.Options.from_args(self, *args, **kwargs) + super().__init__() # Create .key - # Scenario identifier - self.scenario = source_kw.pop("scenario", None) + # Check that the given measure is supported by the current class + if opt.measure not in self.measures: + raise ValueError(opt.measure) # Dimensions for loaded data - self.dims = deepcopy(RENAME_DIMS) - self.dims["scenario"] = "scenario" - - self.raise_on_extra_kw(source_kw) + self.dims = RENAME_DIMS | dict(scenario="scenario") - filename = self.filename[measure] + filename = self.filename[opt.measure] try: - self.path = region_path_fallback(nodes, filename) + self.path = region_path_fallback(opt.nodes, filename) self._repr = f"Load {self.path}" except FileNotFoundError: - log.info(f"Fall back to R11 data for {self.measure}") + log.info(f"Fall back to R11 data for {self.options.measure}") self.path = region_path_fallback("R11", filename) + self._repr = f"Load {self.path} and adapt R11 → {opt.nodes}" # Identify an adapter that can convert data from R11 to `nodes` - self._adapter = {"R12": adapt_R11_R12, "R14": adapt_R11_R14}.get(nodes) - self._repr = f"Load {self.path} and adapt R11 → {nodes}" - + self._adapter = {"R12": adapt_R11_R12, "R14": adapt_R11_R14}.get(opt.nodes) if self._adapter is None: - log.warning( - f"Not implemented: transform {self.id} data from 'R11' to {nodes!r}" + msg = ( + f"transform {type(self).__name__} data from 'R11' to {opt.nodes!r}" ) - raise NotImplementedError + log.warning(f"Not implemented: {msg}") + raise NotImplementedError(msg) - def __call__(self): + def get(self) -> "AnyQuantity": from genno.operator import load_file - return load_file(self.path, dims=self.dims, name=self.measure) + return load_file(self.path, dims=self.dims, name=self.options.measure) def __repr__(self) -> str: return self._repr - def get_keys(self) -> tuple[Key, Key]: - """Return the target keys for the (1) raw and (2) transformed data.""" - k = self.key or Key( - self.name or self.measure.lower(), ("n", "y") + self.extra_dims - ) - return (k * "scenario" + self.id, k) - def transform(self, c: "Computer", base_key: Key) -> Key: # Apply self.adapt, if any if self._adapter: - k0 = base_key + "0" - c.add(base_key + "0", self._adapter, base_key) + k0 = base_key[0] + c.add(base_key[0], self._adapter, base_key) else: k0 = base_key # Select on the 'scenario' dimension, if any - k1 = k0 / "scenario" + "1" - c.add(k1, "maybe_select", k0, indexers={"scenario": self.scenario}) + k1 = (k0 / "scenario")[1] + c.add(k1, "maybe_select", k0, indexers={"scenario": self.options.scenario}) return k1 @@ -236,15 +233,6 @@ class MERtoPPP(MaybeAdaptR11Source): filename = {"MERtoPPP": "mer-to-ppp.csv"} -# Attempt to register each source; tolerate exceptions if the model is re-imported -# FIXME Should not be necessary; improve register_source upstream -for cls in IEA_Future_of_Trucks, MERtoPPP: - try: - register_source(cls) # type: ignore [type-abstract] - except ValueError as e: - log.info(str(e)) - - def collect_structures() -> "sdmx.message.StructureMessage": """Collect all SDMX data structures from :data:`FILES` and store. diff --git a/message_ix_models/model/transport/ldv.py b/message_ix_models/model/transport/ldv.py index 1b04e79ef9..e38ede78bd 100644 --- a/message_ix_models/model/transport/ldv.py +++ b/message_ix_models/model/transport/ldv.py @@ -12,7 +12,6 @@ from sdmx.model.common import Code from message_ix_models.model import disutility -from message_ix_models.tools import exo_data from message_ix_models.util import ( ScenarioInfo, broadcast, @@ -49,7 +48,6 @@ TARGET = f"transport{Li}" -@exo_data.register_source class LDV(MaybeAdaptR11Source): """Provider of exogenous data on LDVs. @@ -60,7 +58,6 @@ class LDV(MaybeAdaptR11Source): "fix_cost", or "inv_cost"), "nodes", and "scenario". """ - id = __name__ measures = {"inv_cost", "fuel economy", "fix_cost"} #: Names of expected files given :attr:`measure`. @@ -70,10 +67,10 @@ class LDV(MaybeAdaptR11Source): "fix_cost": "ldv-fix_cost.csv", } - def __init__(self, source, source_kw) -> None: - super().__init__(source, source_kw) + def __init__(self, *args, **kwargs) -> None: + super().__init__(*args, **kwargs) # Use "exo" tag on the target key, to align with existing code in this module - self.key = Key(f"{self.measure}:n-t-y:LDV+exo") + self.key = Key(f"{self.options.measure}:n-t-y:LDV+exo") collect = Collector(TARGET, "{}::LDV+ixmp".format) @@ -111,11 +108,9 @@ def prepare_computer(c: Computer): # Use .tools.exo_data.prepare_computer() to add tasks that load, adapt, and select # the appropriate data - kw0 = dict(nodes=context.model.regions, scenario=str(config.ssp)) + kw0 = dict(nodes=context.model.regions, scenario=config.ssp.urn.partition("=")[2]) for kw0["measure"] in LDV.measures: - exo_data.prepare_computer( - context, c, source=__name__, source_kw=kw0, strict=False - ) + LDV.add_tasks(c, context=context, **kw0, strict=False) # Insert a scaling factor that varies according to SSP c.apply( diff --git a/message_ix_models/model/transport/operator.py b/message_ix_models/model/transport/operator.py index 9f8ffdda22..4837dda8eb 100644 --- a/message_ix_models/model/transport/operator.py +++ b/message_ix_models/model/transport/operator.py @@ -35,7 +35,7 @@ from pathlib import Path import sdmx.message - from genno.types import AnyQuantity + from genno.types import AnyQuantity, TQuantity from message_ix import Scenario from xarray.core.types import Dims @@ -718,7 +718,7 @@ def max( return qty.groupby(level=dim).max() # type: ignore -def maybe_select(qty: "AnyQuantity", *, indexers: dict) -> "AnyQuantity": +def maybe_select(qty: "TQuantity", *, indexers: dict) -> "TQuantity": """Select from `qty` if possible, using :py:`"*"` wildcard. Same as :func:`genno.operator.select`, except: @@ -778,9 +778,9 @@ def indexer_scenario(config: dict, *, with_LED: bool) -> dict[Literal["scenario" """Indexer for the ``scenario`` dimension. If `with_LED` **and** :py:`config.project["LDV"] = True`, then the single label is - "LED". Otherwise it is the short form of the :attr:`.transport.config.Config.ssp` - code, e.g. "SSP1". In other words, this treats "LDV" as mutually exclusive with an - SSP scenario identifier (instead of orthogonal). + "LED". Otherwise it is the final part of the :attr:`.transport.config.Config.ssp` + URN, e.g. "SSP(2024).1". In other words, this treats "LDV" as mutually exclusive + with an SSP scenario identifier (instead of orthogonal). Parameters ---------- @@ -794,7 +794,7 @@ def indexer_scenario(config: dict, *, with_LED: bool) -> dict[Literal["scenario" return dict( scenario="LED" if (with_LED and c.project.get("LED", False)) - else repr(c.ssp).split(":")[1] + else c.ssp.urn.rpartition(":")[2] ) @@ -828,7 +828,7 @@ def indexers_usage(technologies: list[Code]) -> dict: } -def price_units(qty: "AnyQuantity") -> "AnyQuantity": +def price_units(qty: "TQuantity") -> "TQuantity": """Forcibly adjust price units, if necessary.""" target = "USD_2010 / km" if not qty.units.is_compatible_with(target): @@ -847,7 +847,7 @@ def quantity_from_config( return result -def relabel2(qty: "AnyQuantity", new_dims: dict): +def relabel2(qty: "TQuantity", new_dims: dict) -> "TQuantity": """Replace dimensions with new ones using label templates. .. todo:: Choose a more descriptive name. @@ -935,7 +935,7 @@ def _uniform(x: float) -> float: ) -def sales_fraction_annual(age: "AnyQuantity") -> "AnyQuantity": +def sales_fraction_annual(age: "TQuantity") -> "TQuantity": """Return fractions of current vehicle stock that should be added in prior years. Parameters @@ -971,7 +971,7 @@ def scenario_codes() -> list[str]: """ from message_ix_models.project.ssp import SSP_2024 - return [repr(c).split(":")[1] for c in SSP_2024] + ["LED"] + return [c.urn.rpartition(":")[2] for c in SSP_2024] + ["LED"] def share_weight( diff --git a/message_ix_models/model/transport/policy.py b/message_ix_models/model/transport/policy.py new file mode 100644 index 0000000000..d6b0d404db --- /dev/null +++ b/message_ix_models/model/transport/policy.py @@ -0,0 +1,23 @@ +from dataclasses import dataclass + +from message_ix_models.tools.policy import Policy + + +@dataclass +class TaxEmission(Policy): + """Emission tax at a fixed value.""" + + #: Passed to :mod:`.add_tax_emission`. + value: float + + __hash__ = Policy.__hash__ + + +@dataclass +class ExogenousEmissionPrice(Policy): + """Emission tax using data from file using :class:`.PRICE_EMISSION`.""" + + #: Passed to :meth:`.PRICE_EMISSION.add_tasks`. + source_url: str + + __hash__ = Policy.__hash__ diff --git a/message_ix_models/model/transport/testing.py b/message_ix_models/model/transport/testing.py index 832553eacb..65f72da844 100644 --- a/message_ix_models/model/transport/testing.py +++ b/message_ix_models/model/transport/testing.py @@ -14,8 +14,8 @@ import message_ix_models.report from message_ix_models import ScenarioInfo, testing from message_ix_models.report.sim import add_simulated_solution -from message_ix_models.testing import GHA, bare_res -from message_ix_models.util import identify_nodes, silence_log +from message_ix_models.testing import GHA, SOLVE_OPTIONS, bare_res +from message_ix_models.util import silence_log from message_ix_models.util.graphviz import HAS_GRAPHVIZ from . import Config, build @@ -39,14 +39,19 @@ 1: pytest.mark.skip( reason="Currently only possible with regions=R12 input data/config", ), - 3: pytest.mark.xfail(raises=ValueError, reason="Missing ISR/mer-to-ppp.csv"), + 3: pytest.mark.xfail( + raises=NotImplementedError, + reason="Missing ISR/mer-to-ppp.csv + not supported by MaybeAdaptR11Source", + ), 4: pytest.mark.xfail(reason="Currently unsupported"), 7: pytest.mark.xfail( condition=GHA and platform.system() == "Darwin" and not HAS_GRAPHVIZ, reason="Graphviz missing on macos-13 GitHub Actions runners", ), 9: pytest.mark.xfail(reason="Missing R14 input data/config"), - 10: pytest.mark.usefixtures("iea_eweb_test_data", "ssp_user_data"), + 10: pytest.mark.usefixtures( + "advance_test_data", "iea_eweb_test_data", "ssp_user_data" + ), }, testing.MARK, ) @@ -109,24 +114,34 @@ def configure_build( def built_transport( - request, + request: "pytest.FixtureRequest", context: "Context", options: Optional[dict] = None, solved: bool = False, quiet: bool = True, ) -> Scenario: """Analogous to :func:`.testing.bare_res`, with transport detail added.""" - options = options or dict() - - # Retrieve (maybe generate) the bare RES with the same settings + # Retrieve (generate if necessary) a bare scenario with the same settings res = bare_res(request, context, solved) # Derive the name for the transport scenario model_name = res.model.replace("-GLOBIOM", "-Transport") try: + # Load an existing transport scenario scenario = Scenario(res.platform, model_name, "baseline") - except ValueError: + + # NB Unclear why, but on GitHub Actions scenarios like + # 'MESSAGEix-Transport R12 YB 3594a/baseline#1' are sometimes returned with + # contents resembling make_dantzig(). Don't allow these to be used. + assert set(res.set("node")) == set(scenario.set("node")) + except (AssertionError, ValueError, RuntimeError) as e: + if isinstance(e, AssertionError): + log.warning( + f"Loaded {scenario.url!r} has nodes {sorted(scenario.set('node'))} != " + f"{sorted(res.set('node'))} → discard" + ) + log.info(f"Create '{model_name}/baseline' for testing") # Optionally silence logs for code used via build.main() @@ -138,18 +153,19 @@ def built_transport( with log_cm: scenario = res.clone(model=model_name) - build.main(context, scenario, options) + build.main(context, scenario, options or {}) else: - # Loaded existing Scenario; ensure config files are loaded on `context` - Config.from_context(context, options=options) - - if solved and not scenario.has_solution(): - log.info(f"Solve '{scenario.model}/{scenario.scenario}'") - scenario.solve(solve_options=dict(iis=1, lpmethod=4)) + # Loaded existing Scenario; ensure context.transport has a full/matching Config + Config.from_context(context, options=options or {}) + # Fresh clone with a name matching `request` log.info(f"Clone to '{model_name}/{request.node.name}'") result = scenario.clone(scenario=request.node.name, keep_solution=solved) + if solved and not result.has_solution(): + log.info(f"Solve {result.url}") + result.solve(**SOLVE_OPTIONS) + # DEBUG Dump the scenario to a temporary path # si = ScenarioInfo(scenario) # tmp_path = request.getfixturevalue("tmp_path") @@ -157,17 +173,6 @@ def built_transport( # log.info(f"Dump to {dump_path}") # result.to_excel(dump_path) - if ( - GHA - and platform.system() == "Darwin" - and identify_nodes(result) != context.model.regions - ): - pytest.xfail( - reason="Known issue on GitHub Actions macOS runners: result has nodes " - f"{identify_nodes(result) = !r} != {identify_nodes(res) = !r} == " - f"{context.model.regions = !r}" - ) - return result @@ -208,7 +213,6 @@ def simulated_solution( # Create a reporter rep = Reporter.from_scenario(scenario) - else: # Create a Reporter with the contents of a file model_name = bare.name(context, unique=True).replace("-GLOBIOM", "-Transport") @@ -252,6 +256,4 @@ def simulated_solution( with silence_log("genno", logging.CRITICAL): message_ix_models.report.prepare_reporter(context, reporter=rep) - log.debug(f"simulated_solution: {context.regions = }") - return rep diff --git a/message_ix_models/model/transport/workflow.py b/message_ix_models/model/transport/workflow.py index 4135ab772b..955ce43e99 100644 --- a/message_ix_models/model/transport/workflow.py +++ b/message_ix_models/model/transport/workflow.py @@ -1,12 +1,12 @@ import logging from copy import deepcopy from hashlib import blake2s -from itertools import product from typing import TYPE_CHECKING, Literal, Optional from genno import KeyExistsError from message_ix_models.model.workflow import Config as WorkflowConfig +from message_ix_models.tools.policy import single_policy_of_type from message_ix_models.util import minimum_version if TYPE_CHECKING: @@ -33,7 +33,7 @@ model="MESSAGE", solve_options=dict( iis=1, - lpmethod=4, + lpmethod=6, scaind=1, tilim=45 * 60, ), @@ -143,22 +143,19 @@ def short_hash(value: str) -> str: def tax_emission(context: "Context", scenario: "Scenario", price: float) -> "Scenario": """Add emission tax. - This function calls code from :mod:`message_data.projects.navigate.workflow`, - :mod:`message_data.tools.utilities`, and other non-public locations. It cannot be - used without access to those codes. + See also + -------- + message_ix_models.project.engage.workflow.step_0 + message_ix_models.project.navigate.workflow.tax_emission """ from message_ix import make_df + from message_ix_models.model.workflow import step_0 + from message_ix_models.project.navigate import workflow as navigate_workflow from message_ix_models.util import broadcast - try: - from message_data.projects.engage import workflow as engage_workflow - from message_data.projects.navigate import workflow as navigate_workflow - except ImportError: - raise RuntimeError("Requires non-public code from message_data") - - # Add ENGAGE-style emissions accounting - scenario = engage_workflow.step_0(context, scenario) + # Prepare emissions accounting for carbon pricing + scenario = step_0(context, scenario) # Add values for the MACRO 'drate' parameter. # message_data.tools.utilities.add_tax_emission() refers to this parameter, rather @@ -188,6 +185,7 @@ def generate( from . import build from .config import Config, get_cl_scenario + from .policy import ExogenousEmissionPrice, TaxEmission from .report import multi # Handle CLI options @@ -211,28 +209,18 @@ def generate( # Collections of step names debug, reported, targets = [], [], [] - # Iterate over all (ssp, policy) combinations - cl_scenario = get_cl_scenario() - - for scenario_code, policy in product(cl_scenario, (False, True)): + # Iterate over all scenarios in IIASA_ECE:CL_TRANSPORT_SCENARIO + for scenario_code in get_cl_scenario(): # Make a copy of the base .transport.Config for this particular workflow branch config = deepcopy(context.transport) # Update the .transport.Config from the `scenario_code` and `policy` - config.policy = policy label, label_full = config.use_scenario_code(scenario_code) - # Retrieve updated values - is_LED = config.project["LED"] - EDITS_activity = config.project["EDITS"]["activity"] - - if config.policy and (is_LED or EDITS_activity is not None): # TEMPORARY - log.info(f"({label_full}, {config.policy=}) → skip") - continue - # Identify the base scenario base_url = base_scenario_url(context, config, base_scenario_method) - log.info(f"({label_full}, {config.policy=}) → {base_url=}") + # log.debug(f"Base scenario for scenario={label_full!r}: {base_url}") + # log.debug(f"{config.policy = }") # Name of the base step base = f"base {short_hash(base_url)}" @@ -266,10 +254,11 @@ def generate( lambda _, s: initial_new_capacity_up_v311(s, safety_factor=1.05), ) - # This block copied from message_data.projects.navigate.workflow - if config.policy: - # Add a carbon tax - name = wf.add_step(f"{label} with tax", name, tax_emission, price=1000.0) + # Add step(s) to implement policies + if p0 := single_policy_of_type(config.policy, TaxEmission): + name = wf.add_step(f"{label} added", name, tax_emission, price=p0.value) + elif p1 := single_policy_of_type(config.policy, ExogenousEmissionPrice): + log.info(f"Not implemented: {p1}") # 'Simulate' build and produce debug outputs debug.append(f"{label} debug build") diff --git a/message_ix_models/project/advance/data.py b/message_ix_models/project/advance/data.py index 6518c4c7b1..ff106f4a96 100644 --- a/message_ix_models/project/advance/data.py +++ b/message_ix_models/project/advance/data.py @@ -1,11 +1,13 @@ import logging -from copy import copy +from dataclasses import dataclass +from typing import TYPE_CHECKING -from genno import Computer, Key - -from message_ix_models.tools.exo_data import ExoDataSource, register_source +from message_ix_models.tools.exo_data import BaseOptions, ExoDataSource, register_source from message_ix_models.tools.iamc import iamc_like_data_for_query -from message_ix_models.util import iter_keys, path_fallback +from message_ix_models.util import path_fallback + +if TYPE_CHECKING: + from genno.types import AnyQuantity __all__ = [ "ADVANCE", @@ -15,7 +17,7 @@ #: Expected location of the ADVANCE WP2 data snapshot. -LOCATION = "advance", "advance_compare_20171018-134445.csv.zip" +LOCATION = "advance", "advance_compare_20171018-134445.csv.xz" #: Name of the data file within the archive. NAME = "advance_compare_20171018-134445.csv" @@ -25,34 +27,8 @@ class ADVANCE(ExoDataSource): """Provider of exogenous data from the ADVANCE project database. - To use data from this source, call :func:`.exo_data.prepare_computer` with the - arguments: - - - `source`: "ADVANCE" - - `source_kw` including: - - - "model": one of 12 codes including "MESSAGE". - - "measure": one of 3080 codes for the "VARIABLE" dimension. - - "scenario": one of 51 codes including "ADV3TRAr2_Base". - - "name", optional: override :attr:`.ExoDataSource.name`. - - "aggregate", optional: if :any:`True`, aggregate data from the ADVANCE native - regions using ``n::groups`` (same behaviour as the base class). Otherwise, do - not aggregate. - Example ------- - >>> keys = prepare_computer( - ... context, - ... computer, - ... source="ADVANCE", - ... source_kw=dict( - ... measure="Transport|Service demand|Road|Freight", - ... model="MESSAGE", - ... scenario="ADV3TRAr2_Base", - ... ), - ... ) - >>> result = computer.get(keys[0]) - Load the metadata packaged with :mod:`message_ix_models` to identify usable `source_kw`: @@ -82,69 +58,48 @@ class ADVANCE(ExoDataSource): 'iPETS V.1.5': } """ - id = "ADVANCE" + @dataclass + class Options(BaseOptions): + #: If :any:`True`, aggregate data from the ADVANCE native regions using + #: ``n::groups`` (same behaviour as the base class). Otherwise, do not + #: aggregate. + aggregate: bool = True - where = ["private"] + #: One of 3080 codes for the "VARIABLE" dimension. + measure: str = "" - def __init__(self, source, source_kw): - if not source == self.id: - raise ValueError(source) - - # Map the `measure` keyword to a string appearing in the data - _kw = copy(source_kw) - self.measure = _kw.pop("measure") - self.variable = { - "GDP": "GDP|PPP", - "POP": "Population", - }.get(self.measure, self.measure) + #: One of 12 codes including "MESSAGE". + model: str = "" - # Store the model and scenario ID - self.model = _kw.pop("model", None) - self.scenario = _kw.pop("scenario", None) + #: One of 51 codes including "ADV3TRAr2_Base". + scenario: str = "" - # Set the name of the returned quantity - self.name = _kw.pop("name", "") + #: :py:`where` argument to :func:`path_fallback`, used to identify the directory + #: containing :data:`LOCATION`. Currently data is stored in message-static-data, + #: cloned and linked from within the user's 'local' data directory. + where = ["local"] - self.aggregate = _kw.pop("aggregate", True) + def __init__(self, *args, **kwargs) -> None: + opt = self.options = self.Options.from_args(self, *args, **kwargs) - if len(_kw): - raise ValueError(_kw) + # Map the `measure` keyword to a string appearing in the data + opt.name = variable = {"GDP": "GDP|PPP", "POP": "Population"}.get( + opt.measure, opt.measure + ) - def __call__(self): # Assemble a query string - query = " and ".join( - [ - f"SCENARIO == {self.scenario!r}", - f"VARIABLE == {self.variable!r}", - f"MODEL == {self.model!r}" if self.model else "True", - ] + self.query = ( + f"SCENARIO == {opt.scenario!r} and VARIABLE == {variable!r} and " + + (f"MODEL == {opt.model!r}" if opt.model else "True") ) - log.debug(query) + log.debug(self.query) # Expected location of the ADVANCE WP2 data snapshot. - path = path_fallback(*LOCATION, where=self._where()) + self.path = path_fallback(*LOCATION, where=self._where()) + super().__init__() # Create .key + + def get(self) -> "AnyQuantity": return iamc_like_data_for_query( - path, query, archive_member=NAME, non_iso_3166="keep" + self.path, self.query, archive_member=NAME, non_iso_3166="keep" ) - - def transform(self, c: "Computer", base_key: Key) -> Key: - """Prepare `c` to transform raw data from `base_key`. - - Unlike the base class version, this implementation only adds the aggregation - step if :attr:`.aggregate` is :any:`True`. - """ - k = iter_keys(base_key) - - k1 = base_key - if self.aggregate: - # Aggregate - k1 = k() - c.add(k1, "aggregate", base_key, "n::groups", keep=False) - - # Interpolate to the desired set of periods - kw = dict(fill_value="extrapolate") - k2 = k() - c.add(k2, "interpolate", k1, "y::coords", kwargs=kw) - - return k2 diff --git a/message_ix_models/project/gea/data.py b/message_ix_models/project/gea/data.py index a50f44e4a0..a9c8905d10 100644 --- a/message_ix_models/project/gea/data.py +++ b/message_ix_models/project/gea/data.py @@ -1,15 +1,17 @@ """Handle data from the Global Energy Assessment (GEA).""" import logging +from dataclasses import dataclass from functools import lru_cache from typing import TYPE_CHECKING -from message_ix_models.tools.exo_data import ExoDataSource, register_source +from message_ix_models.tools.exo_data import BaseOptions, ExoDataSource, register_source from message_ix_models.tools.iamc import iamc_like_data_for_query from message_ix_models.util import package_data_path, path_fallback if TYPE_CHECKING: - import genno + from genno import Computer, Key + from genno.types import AnyQuantity from sdmx.model.common import Code log = logging.getLogger(__name__) @@ -19,60 +21,50 @@ class GEA(ExoDataSource): """Provider of exogenous data from the GEA data source. - To use data from this source, call :func:`.exo_data.prepare_computer` with the - arguments: + Per :attr:`Options.measure`, see the source data for details. + """ - - `source`: "GEA". - - `source_kw` including: + @dataclass + class Options(BaseOptions): + #: By default, do not aggregate. + aggregate: bool = False - - `model`, `scenario`: model name and scenario name. See - :func:`.get_model_scenario`. - - `measure`: See the source data for details. - - `aggregate`, `interpolate`: see :meth:`.ExoDataSource.transform`. - """ + #: By default, do not interpolate. + interpolate: bool = False - id = "GEA" + #: Model name. + model: str = "" - #: By default, do not aggregate. - aggregate = False + #: Scenario name. + scenario: str = "" - #: By default, do not interpolate. - interpolate = False + options: Options where = ["private"] - def __init__(self, source, source_kw): - if source != self.id: - raise ValueError(source) + def __init__(self, *args, **kwargs) -> None: + opt = self.options = self.Options.from_args(self, *args, **kwargs) - # Pieces for query - model = source_kw.pop("model", None) - scenario = source_kw.pop("scenario", None) - self.measure = variable = source_kw.pop("measure") + # Set .key + super().__init__() # Check for a valid (model, scenario) combination - check = (model, scenario) + check = (opt.model, opt.scenario) if check not in get_model_scenario(): log.error(f"No data for (model, scenario) = {check!r}") raise ValueError(check) - self.raise_on_extra_kw(source_kw) - # Identify input data path self.path = path_fallback( "gea", "GEADB_ARCHIVE_20171108.zip", where=self._where() ) # Assemble query - self.query = " and ".join( - [ - f"MODEL == {model!r}" if model else "True", - f"SCENARIO == {scenario!r}", - f"VARIABLE == {variable!r}", - ] - ) + self.query = ( + f"MODEL == {opt.model!r}" if opt.model else "True" + ) + f" and SCENARIO == {opt.scenario!r} and VARIABLE == {opt.measure!r}" - def __call__(self): + def get(self) -> "AnyQuantity": return iamc_like_data_for_query( self.path, self.query, @@ -80,7 +72,7 @@ def __call__(self): non_iso_3166="keep", ) - def transform(self, c: "genno.Computer", base_key: "genno.Key") -> "genno.Key": + def transform(self, c: "Computer", base_key: "Key") -> "Key": """Prepare `c` to transform raw data from `base_key`. Compared to :meth:`.ExoDataSource.transform`, this version: @@ -105,6 +97,8 @@ def get_model_scenario() -> set[tuple[str, str]]: """Return a set of valid GEA (model name, scenario name) combinations. These are read from :file:`data/gea/model-scenario.json`. + + .. todo:: Convert to :class:`~sdmx.model.common.Codelist`. """ import json diff --git a/message_ix_models/project/navigate/workflow.py b/message_ix_models/project/navigate/workflow.py index 56a4bb805b..276e329fd6 100755 --- a/message_ix_models/project/navigate/workflow.py +++ b/message_ix_models/project/navigate/workflow.py @@ -516,20 +516,22 @@ def add_minimum_emissions(context, scenario, info: dict) -> None: scenario.set_as_default() -def tax_emission(context: Context, scenario: Scenario, price: float): - """Workflow callable for :mod:`.tools.utilities.add_tax_emission`.""" - # NB this requires the emissions accounting established by .engage.workflow.step_0. - # In generate() in this file, that function is called earlier in the workflow. +def tax_emission(context: Context, scenario: Scenario, price: float) -> "Scenario": + """Workflow callable for :mod:`.tools.utilities.add_tax_emission`. - # from message_data.projects.engage.workflow import step_0 - from message_data.tools.utilities import add_tax_emission + .. note:: This requires the emissions accounting established by either + :func:`.engage.workflow.step_0` or :func:`.model.workflow.step_0`. + + In :func:`.generate` in this file, the former is called earlier in the workflow. + """ + from message_ix_models.tools import add_tax_emission try: scenario.remove_solution() except ValueError: pass - add_tax_emission(scenario, price) + add_tax_emission.main(scenario, price) return scenario diff --git a/message_ix_models/project/shape/data.py b/message_ix_models/project/shape/data.py index 4a45b1d03a..964e1f2177 100644 --- a/message_ix_models/project/shape/data.py +++ b/message_ix_models/project/shape/data.py @@ -1,16 +1,28 @@ """Handle data from the SHAPE project.""" import logging +from dataclasses import dataclass +from typing import TYPE_CHECKING -from message_ix_models.tools.exo_data import ExoDataSource, register_source +from message_ix_models.tools.exo_data import BaseOptions, ExoDataSource, register_source from message_ix_models.tools.iamc import iamc_like_data_for_query from message_ix_models.util import path_fallback +if TYPE_CHECKING: + from typing import NotRequired, TypedDict + + from genno.types import AnyQuantity + + Info = TypedDict( + "Info", + {"latest": str, "suffix": str, "variable": str, "drop": NotRequired[list[str]]}, + ) + log = logging.getLogger(__name__) #: Information about data file version, suffixes, "variable" codes, and extra columns to #: drop. -INFO = { +INFO: dict[str, "Info"] = { "gdp": dict( latest="1.2", suffix=".mif", @@ -49,70 +61,66 @@ @register_source class SHAPE(ExoDataSource): - """Provider of exogenous data from the SHAPE project data source. + """Provider of exogenous data from the SHAPE project data source.""" - To use data from this source, call :func:`.exo_data.prepare_computer` with the - arguments: + @dataclass + class Options(BaseOptions): + #: Must be one of the keys of :data:`.INFO`. + measure: str = "" - - `source`: "SHAPE". - - `source_kw` including: + #: Version of the data, either "latest" or a string like "1.2". + version: str = "latest" - - `measure`: one of the keys of :data:`.INFO`. - - `version` (optional): "latest" (default) or a version string like "1.2". - - `scenario`: one of the SHAPE "SDP" scenario names. - - `aggregate`, `interpolate`: see :meth:`.ExoDataSource.transform`. - """ + #: One of the SHAPE "SDP" scenario names. + scenario: str = "" - id = "SHAPE" + options: Options where = ["private"] - def __init__(self, source, source_kw): - if source != self.id: - raise ValueError(source) - - self.measure = source_kw.pop("measure", None) - version = source_kw.pop("version", "latest") - scenario = source_kw.pop("scenario", None) - + def __init__(self, *args, **kwargs) -> None: + opt = self.options = self.Options.from_args(self, *args, **kwargs) try: # Retrieve information about the `quantity` - info = INFO[self.measure] + info = INFO[opt.measure] except KeyError: raise ValueError(f"measure must be one of {sorted(INFO.keys())}") - self.raise_on_extra_kw(source_kw) - # Choose the version: replace "latest" with the actual version - version = version.replace("latest", info["latest"]) + version = opt.version.replace("latest", info["latest"]) # Construct path to data file - filename = f"{self.measure}_v{version.replace('.', 'p')}{info['suffix']}" + filename = f"{opt.measure}_v{version.replace('.', 'p')}{info['suffix']}" self.path = path_fallback("shape", filename, where=self._where()) - variable = info.get("variable", self.measure) - self.query = " and ".join( - [ - f"Scenario == {scenario!r}" if scenario else "True", - f"Variable == {variable!r}", - ] - ) + # Query for iamc_like_data_for_query() + variable = info.get("variable", opt.measure) + self.query = ( + f"Scenario == {opt.scenario!r}" if opt.scenario else "True" + ) + f" and Variable == {variable!r}" self.to_drop = info.get("drop", []) - if scenario: - self.unique = "MODEL SCENARIO VARIABLE UNIT" + self.unique = "MODEL VARIABLE UNIT" + if opt.scenario: + # Require a unique scenario + self.unique += " SCENARIO" else: - self.unique = "MODEL VARIABLE UNIT" - self.extra_dims = ("SCENARIO",) - - def __call__(self): - # - Read the file. Use ";" for .mif files; set columns as index on load. - # - Drop columns "Model" (meaningless); others from `info`. - # - Drop empty columns (final column in .mif files). - # - Convert column labels to integer. - # - Stack to long format. - # - Apply final column names. - # data = shape_data_from_file(self.path, self.drop) + # Result will have a "SCENARIO" dimension + self.options.dims += ("SCENARIO",) + + # Create .key + super().__init__() + + def get(self) -> "AnyQuantity": + """Load the data. + + 1. Read the file. Use ";" for .mif files; set columns as index on load. + 2. Drop columns "Model" (meaningless); others from `info`. + 3. Drop empty columns (final column in .mif files). + 4. Convert column labels to integer. + 5. Stack to long format. + 6. Apply final column names. + """ return iamc_like_data_for_query( self.path, self.query, diff --git a/message_ix_models/project/ssp/__init__.py b/message_ix_models/project/ssp/__init__.py index 477a01117b..ed13d53275 100644 --- a/message_ix_models/project/ssp/__init__.py +++ b/message_ix_models/project/ssp/__init__.py @@ -1,9 +1,12 @@ import logging import re -from typing import Union +from typing import TYPE_CHECKING, Union from .structure import SSP, SSP_2017, SSP_2024, generate +if TYPE_CHECKING: + from message_ix_models.util.sdmx import URNLookupEnum + __all__ = [ "SSP", "SSP_2017", @@ -38,7 +41,7 @@ def __init__(self, default: Union[SSP_2017, SSP_2024]): def __set_name__(self, owner, name): self._name = "_" + name - def __get__(self, obj, type) -> Union[SSP_2017, SSP_2024]: + def __get__(self, obj, type) -> "URNLookupEnum": if obj is None: return None # type: ignore [return-value] diff --git a/message_ix_models/project/ssp/data.py b/message_ix_models/project/ssp/data.py index 55112ea922..92ad5c9c6b 100644 --- a/message_ix_models/project/ssp/data.py +++ b/message_ix_models/project/ssp/data.py @@ -1,9 +1,19 @@ import logging +from collections.abc import Callable, Iterable +from dataclasses import dataclass +from itertools import filterfalse +from typing import TYPE_CHECKING, Union -from message_ix_models.tools.exo_data import ExoDataSource, register_source +from genno import Keys + +from message_ix_models.tools.exo_data import BaseOptions, ExoDataSource, register_source from message_ix_models.tools.iamc import iamc_like_data_for_query from message_ix_models.util import path_fallback +if TYPE_CHECKING: + from genno import Computer, Key + from genno.types import AnyQuantity + __all__ = [ "SSPOriginal", "SSPUpdate", @@ -12,8 +22,110 @@ log = logging.getLogger(__name__) +class SSPDataSource(ExoDataSource): + """Common base class for :class:`.SSPOriginal` and :class:`.SSPUpdate`.""" + + @dataclass + class Options(BaseOptions): + #: Model name. + model: str = "" + + #: Partial URN for a code in the SSP code list, e.g. "ICONICS:SSP(2017).1". + #: :attr:`ssp_id` **should** be preferred. + source: str = "" + + #: Short ID of the SSP code, e.g. "1". + ssp_id: str = "" + + def handle_source(self, prefix: str) -> None: + """Check that :attr:`source` starts with `prefix`; update :attr:`ssp_id`.""" + if not self.source: + return + + prefix += "." + _, sep, ssp_id = self.source.rpartition(prefix) + + if sep != prefix: + raise ValueError(f"{self.source!r} does not start with {prefix!r}") + elif self.ssp_id and self.ssp_id != ssp_id: # Mismatch + raise ValueError( + f"Mismatch: {self.source=!r} != {prefix!r} + {self.ssp_id=!r}" + ) + + self.ssp_id = ssp_id + + options: Options + + #: Alias from short measure IDs to IAMC 'variable'. See :meth:`make_query`. + variable = {"GDP": "GDP|PPP", "POP": "Population"} + + #: `replace` argument to :func:`iamc.to_quantity`. + replace: dict[str, Union[str, dict[str, str]]] = {} + + #: `unique` argument to :func:`iamc.to_quantity`. + unique: str = "MODEL SCENARIO VARIABLE UNIT" + + #: :py:`where` argument to :func:`path_fallback`. In order: + #: + #: 1. Currently data is stored in message-static-data, cloned and linked from within + #: the user's 'local' data directory. + #: 2. Previously some files were stored directly within message_ix_models (available + #: in an editable install from a clone of the git repository, 'package') or in + #: :mod:`message_data` ('private'). These settings are only provided for backward + #: compatibility. + #: + #: Fuzzed/random test data ('test') is also available, but not enabled by default. + where = ["local", "package", "private"] + + def get(self): + # Use prepared path, query, and replacements + return iamc_like_data_for_query( + self.path, self.query, replace=self.replace, unique=self.unique + ) + + def make_query( + self, + dim_case: Callable[[str], str], + model_scenario: Iterable[tuple[str, str]], + unit: str, + ) -> None: + """Assemble and store a :meth:`pandas.DataFrame.query` string. + + Parameters + ---------- + dim_case : + Function to apply to IAMC dimension IDs, for instance :meth:`str.upper` to + use "MODEL". + model_scenario : + Iterable of (`model_name`, `scenario_name`) pairs. `model_name` **may** be + an empty string. + unit : + Units. **May** be an empty string. + """ + # Map the `measure` option to an IAMC 'variable' label appearing in the data + variable = self.variable[self.options.measure] + + parts = [ + f"{dim_case('variable')} == {variable!r} and", + f"{dim_case('unit')} == {unit!r} and" if unit else "", + "(False", + ] + + # Add query pieces for desired combinations of (model name, scenario name) + for m, s in model_scenario: + parts.extend( + [ + f"or ({dim_case('scenario')} == {s!r}", + f"and {dim_case('model')} == {m!r})" if m else ")", + ] + ) + + self.query = " ".join(parts + [")"]) + log.debug(f"query: {self.query!s}") + + @register_source -class SSPOriginal(ExoDataSource): +class SSPOriginal(SSPDataSource): """Provider of exogenous data from the original SSP database. This database is accessible from https://tntcat.iiasa.ac.at/SspDb/dsd. @@ -22,37 +134,29 @@ class SSPOriginal(ExoDataSource): 1. Read the general documentation for :mod:`.project.ssp.data`. 2. If necessary, obtain copy of the original data file(s). - 3. Call :func:`.exo_data.prepare_computer` with the arguments: - - - `source`: Any value from :data:`.SSP_2017` or equivalent string, for instance - "ICONICS:SSP(2017).2". The specific SSP for which data is returned is - determined from the value. - - `source_kw` including: + 3. Call :meth:`.SSPOriginal.add_tasks` with keyword arguments corresponding to + :class:`SSPDataSource.Options`. In particular: - - "model": one of: + - :attr:`~SSPDataSource.Options.model` **should** be one of: - - IIASA GDP - - IIASA-WiC POP - - NCAR - - OECD Env-Growth - - PIK GDP-32 + - IIASA GDP + - IIASA-WiC POP + - NCAR + - OECD Env-Growth + - PIK GDP-32 - - "measure": The measures available differ according to the model; see the - source data for details. + - :attr:`~SSPDataSource.Options.measure`: The measures available differ according + to the model; see the source data for details. + - :attr:`~SSPDataSource.Options.unit` is not recognized/has no effect. Example ------- - >>> keys = prepare_computer( - ... context, - ... computer, - ... source="ICONICS:SSP(2015).3", - ... source_kw=dict(measure="POP", model="IIASA-WiC POP"), + >>> keys = SSPOriginal.add_tasks( + ... computer, context, ssp_id="3", measure="POP", model="IIASA-WiC POP", ... ) >>> result = computer.get(keys[0]) """ - id = "SSP" - #: Name of file containing the data. filename = "SspDb_country_data_2013-06-12.csv.zip" @@ -69,57 +173,29 @@ class SSPOriginal(ExoDataSource): #: Replacements to apply when loading the data. replace = {"billion US$2005/yr": "billion USD_2005/yr"} - #: :py:`where` argument to :func:`path_fallback`. In order: - #: - #: 1. Currently data is stored in message-static-data, cloned and linked from within - #: the user's 'local' data directory. - #: 2. Previously some files were stored directly within message_ix_models (available - #: in an editable install from a clone of the git repository, 'package') or in - #: :mod:`message_data` ('private'). These settings are only provided for backward - #: compatibility. - #: - #: Fuzzed/random test data ('test') is also available, but not enabled by default. - where = ["local", "package", "private"] - - def __init__(self, source, source_kw): - s = "ICONICS:SSP(2017)." - if not source.startswith(s): - raise ValueError(source) - - *parts, ssp_id = source.partition(s) - - # Map the `measure` keyword to a string appearing in the data - self.measure = source_kw.pop("measure") - measure = { - "GDP": "GDP|PPP", - "POP": "Population", - }[self.measure] - - # Store the model ID, if any - model = source_kw.pop("model", None) - - # Determine the date based on the model ID. There is a 1:1 correspondence. - date = self.model_date[model] - - self.raise_on_extra_kw(source_kw) + def __init__(self, *args, **kwargs) -> None: + opt = self.options = self.Options.from_args(self, *args, **kwargs) + opt.handle_source("ICONICS:SSP(2017)") # Identify input data path self.path = path_fallback("ssp", self.filename, where=self._where()) - # Assemble a query string - extra = "d" if ssp_id == "4" and model == "IIASA-WiC POP" else "" - self.query = ( - f"SCENARIO == 'SSP{ssp_id}{extra}_v9_{date}' and VARIABLE == '{measure}'" - + (f" and MODEL == '{model}'" if model else "") - ) + # Create .key + super().__init__() - def __call__(self): - # Use prepared path, query, and replacements - return iamc_like_data_for_query(self.path, self.query, replace=self.replace) + # Extra pieces for scenario identifier + # - Determine a date based on the model ID. There is a 1:1 correspondence. + # - Append "d" in a certain case + s_extra = "d" if (opt.ssp_id == "4" and opt.model == "IIASA-WiC POP") else "" + date = self.model_date[opt.model] + scenario = f"SSP{opt.ssp_id}{s_extra}_v9_{date}" + + # Assemble and store a query string + self.make_query(str.upper, [(opt.model, scenario)], "") @register_source -class SSPUpdate(ExoDataSource): +class SSPUpdate(SSPDataSource): """Provider of exogenous data from the SSP Update database. This database is accessible from https://data.ece.iiasa.ac.at/ssp. @@ -128,95 +204,167 @@ class SSPUpdate(ExoDataSource): 1. Read the general documentation for :mod:`.project.ssp.data`. 2. If necessary, obtain copy of the original data file(s). - 3. Call :func:`.exo_data.prepare_computer` with the arguments: + 3. Call :meth:`.SSPUpdate.add_tasks` with keyword arguments corresponding to + :class:`SSPUpdate.Options`. In particular: + + - For :attr:`~Options.release` up to "3.1" and :attr:`~Options.measure` "GDP", + :attr:`~Options.model` **must** be one of "IIASA GDP 2023" or + "OECD ENV-Growth 2023". + - For :attr:`~Options.release` "3.2.beta" and :attr:`~Options.measure` "GDP": - - `source`: Any value from :data:`.SSP_2024` or equivalent string, for instance - "ICONICS:SSP(2024).2". - - `release`: One of "3.1", "3.0.1", "3.0", or "preview". + - :attr:`~Options.model` **must** be "OECD ENV-Growth 2025". + - :attr:`~Options.unit` **must** be given, with a value such as + "billion USD_2010/yr", "billion USD_2015/yr", or "billion USD_2017/yr". + Without these, keys are not unique. Example ------- - >>> keys = prepare_computer( - ... context, + >>> keys = SSPUpdate.add_tasks( ... computer, - ... source="ICONICS:SSP(2024).3", - ... source_kw=dict(measure="GDP", model="IIASA GDP 2023"), + ... context, + ... release="3.1", + ... ssp_id="3", + ... measure="GDP" + ... model="IIASA GDP 2023", ... ) >>> result = computer.get(keys[0]) """ - id = "SSP update" + @dataclass + class Options(SSPDataSource.Options): + #: Release: one of the keys of :attr:`filename`. **Required**. + release: str = "" + + #: Selector for the IAMC 'UNIT' dimension. + unit: str = "" + + options: Options #: File names containing the data, according to the release. filename = { "3.0": "1706548837040-ssp_basic_drivers_release_3.0_full.csv.gz", "3.0.1": "1710759470883-ssp_basic_drivers_release_3.0.1_full.csv.gz", "3.1": "1721734326790-ssp_basic_drivers_release_3.1_full.csv.gz", + "3.2.beta": "0000000000000-ssp_basic_drivers_release_3.2.beta_full.csv.xz", "preview": "SSP-Review-Phase-1.csv.gz", } - #: See :attr:`SSPOriginal.where`. - where = ["local", "package", "private"] - - def __init__(self, source, source_kw): - s = "ICONICS:SSP(2024)." - if not source.startswith(s): - raise ValueError(source) + def __init__(self, *args, **kwargs) -> None: + opt = self.options = self.Options.from_args(self, *args, **kwargs) + opt.handle_source("ICONICS:SSP(2024)") - *parts, ssp_id = source.partition(s) - - # Map the `measure` keyword to a 'Variable' dimension code - self.measure = source_kw.pop("measure") - measure = { - "GDP": "GDP|PPP", - "POP": "Population", - }[self.measure] - - # Store the model code, if any - model = source_kw.pop("model", None) - - # Identify the data release date/version/label - release = source_kw.pop("release", "3.0") + # Identify input data path + self.path = path_fallback( + "ssp", self.filename[opt.release], where=self._where() + ) - self.raise_on_extra_kw(source_kw) + super().__init__() # Create .key # Replacements to apply, if any self.replace = {} # Prepare query pieces - models = [] - scenarios = [] - - if release in ("3.1", "3.0.1", "3.0"): - scenarios.append(f"SSP{ssp_id}") - - if measure == "GDP|PPP": - # Configure to prepend (m="OECD…", s="Historical Reference") - # observations to series - models.extend({model, "OECD ENV-Growth 2023"}) - scenarios.append("Historical Reference") - self.replace.update( - Model={"OECD ENV-Growth 2023": model}, - Scenario={"Historical Reference": scenarios[0]}, - ) - elif release == "preview": - models.extend([model] if model is not None else []) - scenarios.append(f"SSP{ssp_id} - Review Phase 1") - else: - log.error( - f"{release = } invalid for {type(self)}; expected one of: " + m_s = [] + scenario = f"SSP{opt.ssp_id}" + if (opt.release, opt.measure) == ("3.0", "GDP") or opt.release in ( + "3.0.1", + "3.1", + "3.2.beta", + ): + # Configure to also load data for (m=…, s="Historical Reference") + # These data will be deduplicated later in .transform() + + # Model name for historical data + m_hist = "OECD ENV-Growth" if opt.measure == "GDP" else "IIASA-WiC POP" + if opt.release in ("3.2.beta",): + m_hist += " 2025" + # Period in which historical and project data overlap + self.y_overlap = 2025 + else: + m_hist += " 2023" + self.y_overlap = 2020 + + # Also retrieve data for this (model name, scenario name) pair + m_s.append((m_hist, "Historical Reference")) + + # Map the model name for historical data to the same value + self.replace.update(Model={m_hist: opt.model}) + + # Result of iamc_like_data_for_query() will *not* have unique 'SCENARIO' + # This also signals to .transform() to deduplicate + self.unique = "MODEL VARIABLE UNIT" + elif opt.release == "preview": + # Add scenario name suffix + scenario += " - Review Phase 1" + elif opt.release not in self.filename: + msg = ( + f"{opt.release = } invalid for {type(self)}; expected one of: " f"{set(self.filename)}" ) - raise ValueError(release) + log.error(msg) + raise ValueError(msg) - # Identify input data path - self.path = path_fallback("ssp", self.filename[release], where=self._where()) + # Select the indicated (model, scenario) + m_s.append((opt.model, scenario)) # Assemble and store a query string - self.query = f"Scenario in {scenarios!r} and Variable == '{measure}'" + ( - f"and Model in {models!r}" if models else "" + self.make_query(str.title, m_s, opt.unit) + + def transform(self, c: "Computer", base_key: "Key") -> "Key": + """Add tasks to `c` to transform raw data from `base_key`. + + If necessary, data for period 2020 or 2025 are deduplicated.""" + k = Keys( + base=base_key, + # Use id of the class instance to avoid duplication in multiple use + idx=f"indexers:SCENARIO-y:SSPUpdate+{id(self)}", + result=base_key, ) - def __call__(self): - # Use prepared path, query, and replacements - return iamc_like_data_for_query(self.path, self.query, replace=self.replace) + if "SCENARIO" not in self.unique: + # Construct indexers; select only historical or projected data + # This discards data for (s="Historical Reference", y=2020 or 2025) + for tag, sense in ("hist", False), ("proj", True): + c.add(k.idx[tag], make_indexers, k.base, sense=sense, y0=self.y_overlap) + c.add(k.base[tag], "select", k.base, k.idx[tag]) + + # Concatenate again + k.result = k.base + "deduplicated" + c.add(k.result, "concat", k.base["hist"], k.base["proj"]) + + return super().transform(c, k.result) + + +def make_indexers(qty: "AnyQuantity", *, sense: bool, y0: int) -> dict: + """Construct indexers for :func:`genno.operator.select`. + + The indexers include subsets of the coords of `qty`: + + - "SCENARIO" dimension: a single value, either "Historical Reference" or something + else. + - "y" dimension: a sorted :class:`list` of :class:`int`; either those less than + `y0`, or `y0` and greater. + + Used in :meth:`SSPUpdate.transform`. + + Parameters + ---------- + sense : + if :any:`True`, return indexers for projected values; otherwise for + "Historical Reference" values. + """ + func = filter if sense else filterfalse + result = { + dim: sorted(func(predicate, qty.coords[dim].data)) + for dim, predicate in ( + ("SCENARIO", lambda s: s != "Historical Reference"), + ("y", lambda y: y >= y0), + ) + } + if 1 != len(result["SCENARIO"]): + raise ValueError( + f"Must yield exactly 1 scenario label; got {result['SCENARIO']} from " + f"{qty.coords['SCENARIO'].data}" + ) + result.update(SCENARIO=result["SCENARIO"][0]) + return result diff --git a/message_ix_models/project/ssp/structure.py b/message_ix_models/project/ssp/structure.py index ddac63d0b3..88b11d914e 100644 --- a/message_ix_models/project/ssp/structure.py +++ b/message_ix_models/project/ssp/structure.py @@ -8,7 +8,13 @@ import sdmx.urn from sdmx.model import common, v21 -from message_ix_models.util.sdmx import make_enum, register_agency, write +from message_ix_models.util.sdmx import ( + ItemSchemeEnumType, + URNLookupEnum, + read, + register_agency, + write, +) if TYPE_CHECKING: from os import PathLike @@ -183,8 +189,18 @@ def generate(context: "Context", base_dir: Optional["PathLike"] = None): write(cl, base_dir) -#: Enumeration of codes for SSP 2017 edition. -SSP = SSP_2017 = make_enum("ICONICS:SSP(2017)") +class SSP_2017(URNLookupEnum, metaclass=ItemSchemeEnumType): + """Enumeration of codes for SSP 2017 edition.""" + + def _get_item_scheme(self): + return read("ICONICS:SSP(2017)") + + +SSP = SSP_2017 + + +class SSP_2024(URNLookupEnum, metaclass=ItemSchemeEnumType): + """Enumeration of codes for SSP 2024 edition.""" -#: Enumeration of codes for SSP 2024 edition. -SSP_2024 = make_enum("ICONICS:SSP(2024)") + def _get_item_scheme(self): + return read("ICONICS:SSP(2024)") diff --git a/message_ix_models/report/compat.py b/message_ix_models/report/compat.py index 2a3da5c8de..0aef1381e3 100644 --- a/message_ix_models/report/compat.py +++ b/message_ix_models/report/compat.py @@ -223,8 +223,11 @@ def prepare_techs(c: "Computer", technologies: list["Code"]) -> None: for t in technologies: # Assemble information about `t` from its annotations info: dict[str, Any] = dict(id=t.id) - # Sector - info["sector"] = str(t.get_annotation(id="sector").text) + try: + # Sector + info["sector"] = str(t.get_annotation(id="sector").text) + except KeyError: # No such annotation + info["sector"] = None try: # Input commodity and level info["c_in"], info["l_in"] = t.eval_annotation("input") diff --git a/message_ix_models/report/operator.py b/message_ix_models/report/operator.py index d240d886e4..d339badc09 100644 --- a/message_ix_models/report/operator.py +++ b/message_ix_models/report/operator.py @@ -17,19 +17,16 @@ import genno import ixmp import pandas as pd -from genno.core.operator import Operator from genno.operator import pow from iam_units import convert_gwp from iam_units.emissions import SPECIES -from message_ix_models import Context from message_ix_models.util import MappingAdapter, add_par_data, nodes_ex_world if TYPE_CHECKING: from pathlib import Path from typing import Protocol - from genno import Computer, Key from genno.types import AnyQuantity, TQuantity from sdmx.model.v21 import Code @@ -47,7 +44,6 @@ def __lt__(self, __other: Any) -> bool: ... "call", "codelist_to_groups", "compound_growth", - "exogenous_data", "filter_ts", "from_url", "get_ts", @@ -147,28 +143,6 @@ def compound_growth(qty: "TQuantity", dim: str) -> "TQuantity": return pow(qty, type(qty)(dur)).cumprod(dim).shift({dim: 1}).fillna(1.0) -@Operator.define() -def exogenous_data(): - """No action. - - This exists to connect :func:`.exo_data.prepare_computer` to - :meth:`genno.Computer.add`. - """ - pass # pragma: no cover - - -@exogenous_data.helper -def add_exogenous_data( - func, c: "Computer", *, context=None, source=None, source_kw=None -) -> tuple["Key", ...]: - """Prepare `c` to compute exogenous data from `source`.""" - from message_ix_models.tools.exo_data import prepare_computer - - return prepare_computer( - context or Context.get_instance(-1), c, source=source, source_kw=source_kw - ) - - def filter_ts(df: pd.DataFrame, expr: re.Pattern, *, column="variable") -> pd.DataFrame: """Filter time series data in `df`. diff --git a/message_ix_models/testing/__init__.py b/message_ix_models/testing/__init__.py index 1c9c91b0ee..bbb010eaa9 100644 --- a/message_ix_models/testing/__init__.py +++ b/message_ix_models/testing/__init__.py @@ -83,7 +83,14 @@ #: not implemented. NIE = pytest.mark.xfail(raises=NotImplementedError) -CACHE_PATH_STASH = pytest.StashKey[Path]() +#: Keys for :py:`pytestconfig.stash`. +KEY = { + "cache-path": pytest.StashKey[Path](), + "user-local-data": pytest.StashKey[Path](), +} + + +SOLVE_OPTIONS = dict(solve_options=dict(iis=1, lpmethod=4), quiet=True) # pytest hooks @@ -120,17 +127,21 @@ def pytest_sessionstart(session: pytest.Session) -> None: user's environment. Otherwise, use a pytest-managed cache directory that persists across test sessions. """ - if session.config.option.local_cache: - session.config.stash[CACHE_PATH_STASH] = Context.only().core.cache_path - else: - session.config.stash[CACHE_PATH_STASH] = Path( - session.config.cache.mkdir("cache") - ) + config = Context.only().core + + session.config.stash[KEY["cache-path"]] = ( + config.cache_path + if session.config.option.local_cache + else Path(session.config.cache.mkdir("cache")) + ) + + # Store current .Config.local_data value from the user's configuration + session.config.stash[KEY["user-local-data"]] = config.local_data def pytest_report_header(config, start_path) -> str: """Add the ixmp configuration to the pytest report header.""" - return f"message-ix-models cache path: {config.stash[CACHE_PATH_STASH]}" + return f"message-ix-models cache path: {config.stash[KEY['cache-path']]}" # Fixtures @@ -162,10 +173,7 @@ def session_context(pytestconfig, tmp_env): session_tmp_dir = Path(pytestconfig._tmp_path_factory.mktemp("data")) # Apply the cache path determined in pytest_sessionstart(), above - ctx.core.cache_path = pytestconfig.stash[CACHE_PATH_STASH] - - # Store current .util.config.Config.local_data setting from the user's configuration - pytestconfig.user_local_data = ctx.core.local_data + ctx.core.cache_path = pytestconfig.stash[KEY["cache-path"]] # Other local data in the temporary directory for this session only ctx.core.local_data = session_tmp_dir @@ -243,13 +251,21 @@ def mix_models_cli(session_context, tmp_env): yield CliRunner(cli.main, cli.__name__, env=tmp_env) +@pytest.fixture +def advance_test_data(monkeypatch) -> None: + """Temporarily allow :func:`path_fallback` to find test data.""" + from message_ix_models.project.advance.data import ADVANCE + + monkeypatch.setattr(ADVANCE, "use_test_data", True) + + @pytest.fixture def iea_eei_user_data(pytestconfig, monkeypatch) -> None: """Temporarily allow :class:`.IEA_EEI` to find user data.""" from message_ix_models.tools.iea.eei import IEA_EEI monkeypatch.setattr( - IEA_EEI, "where", IEA_EEI.where + [pytestconfig.user_local_data] + IEA_EEI, "where", IEA_EEI.where + [pytestconfig.stash[KEY["user-local-data"]]] ) @@ -271,7 +287,9 @@ def iea_eweb_user_data(pytestconfig, monkeypatch) -> None: # pragma: no cover from message_ix_models.tools.iea.web import IEA_EWEB monkeypatch.setattr( - IEA_EWEB, "where", IEA_EWEB.where + [pytestconfig.user_local_data] + IEA_EWEB, + "where", + IEA_EWEB.where + [pytestconfig.stash[KEY["user-local-data"]]], ) @@ -290,13 +308,17 @@ def ssp_user_data(pytestconfig, monkeypatch) -> None: from message_ix_models.project.ssp.data import SSPOriginal, SSPUpdate for cls in SSPOriginal, SSPUpdate: - monkeypatch.setattr(cls, "where", cls.where + [pytestconfig.user_local_data]) + monkeypatch.setattr( + cls, "where", cls.where + [pytestconfig.stash[KEY["user-local-data"]]] + ) # Testing utility functions -def bare_res(request, context: Context, solved: bool = False) -> message_ix.Scenario: +def bare_res( + request: "pytest.FixtureRequest", context: "Context", solved: bool = False +) -> message_ix.Scenario: """Return or create a :class:`.Scenario` containing the bare RES for use in testing. The Scenario has a model name like "MESSAGEix-GLOBIOM [regions] Y[years]", for @@ -329,32 +351,23 @@ def bare_res(request, context: Context, solved: bool = False) -> message_ix.Scen from message_ix_models.model import bare # Model name: standard "MESSAGEix-GLOBIOM R12 YB" plus a suffix - log.info(f"bare_res: {context.model.regions = }") model_name = bare.name(context, unique=True) - mp = context.get_platform() - try: - base = message_ix.Scenario(mp, model_name, "baseline") + base = message_ix.Scenario(context.get_platform(), model_name, "baseline") except ValueError: log.info(f"Create '{model_name}/baseline' for testing") context.scenario_info.update(model=model_name, scenario="baseline") base = bare.create_res(context) - log.info(f"base.set('node') = {' '.join(sorted(base.set('node')))}") - - if solved and not base.has_solution(): - log.info("Solve") - base.solve(solve_options=dict(lpmethod=4), quiet=True) + log.info(f"Clone to '{model_name}/{request.node.name}'") + scenario = base.clone(scenario=request.node.name, keep_solution=solved) - try: - new_name = request.node.name - except AttributeError: - # Generate a new scenario name with a random part, length 5 characters - new_name = f"baseline {b32encode(randbytes(3)).decode().rstrip('=').lower()}" + if solved and not scenario.has_solution(): + log.info(f"Solve {scenario.url}") + scenario.solve(**SOLVE_OPTIONS) - log.info(f"Clone to '{model_name}/{new_name}'") - return base.clone(scenario=new_name, keep_solution=solved) + return scenario def export_test_data(context: Context): diff --git a/message_ix_models/testing/cli.py b/message_ix_models/testing/cli.py index 3da63daa0c..ae2bfd0595 100644 --- a/message_ix_models/testing/cli.py +++ b/message_ix_models/testing/cli.py @@ -10,7 +10,7 @@ def cli(): FILENAMES = [ - "advance/advance_compare_20171018-134445.csv.zip", + "advance/advance_compare_20171018-134445.csv.xz", "edits/pasta.csv", "gea/GEADB_ARCHIVE_20171108.zip", "iea/372f7e29-en.zip", diff --git a/message_ix_models/tests/model/test_bare.py b/message_ix_models/tests/model/test_bare.py index 5e2c1ad430..3d6bc48881 100644 --- a/message_ix_models/tests/model/test_bare.py +++ b/message_ix_models/tests/model/test_bare.py @@ -10,7 +10,7 @@ level=7, node=14 + 1, # R14 is default, and 'World' exists automatically relation=20, - technology=390, + technology=399, year=28, # YB is default: 1950, ..., 2020, 2025, ..., 2055, 2060, ..., 2110 ) diff --git a/message_ix_models/tests/model/test_emissions.py b/message_ix_models/tests/model/test_emissions.py index d4bead0e6d..e01f17a037 100644 --- a/message_ix_models/tests/model/test_emissions.py +++ b/message_ix_models/tests/model/test_emissions.py @@ -1,10 +1,89 @@ +import genno import numpy as np import pytest +from genno import Key from message_ix import make_df from message_ix.models import MACRO -from message_ix_models import testing -from message_ix_models.model.emissions import add_tax_emission, get_emission_factors +from message_ix_models import ScenarioInfo, testing +from message_ix_models.model.emissions import ( + PRICE_EMISSION, + add_tax_emission, + get_emission_factors, +) +from message_ix_models.testing import bare_res +from message_ix_models.tools.exo_data import prepare_computer +from message_ix_models.util import package_data_path + + +class TestPRICE_EMISSION: + @pytest.mark.parametrize( + "source_kw, shape", + ( + pytest.param( + dict(scenario_info=ScenarioInfo()), + (), + marks=pytest.mark.xfail(raises=ValueError), + ), + ( + dict( + scenario_info=ScenarioInfo.from_url( + "SSP_LED_v5.3.1/baseline_1000f#1" + ) + ), + (2, 2, 2, 12), + ), + ), + ) + @pytest.mark.parametrize("method", ("apply", "prepare_computer")) + def test_add_tasks( + self, request, test_context, source_kw, shape, method, regions="R12" + ) -> None: + test_context.model.regions = regions + + source_kw.update( + base_path=package_data_path("transport", regions, "price-emission") + ) + + c = genno.Computer() + + if method == "apply": + # Current method for adding tasks + keys = c.apply(PRICE_EMISSION.add_tasks, context=test_context, **source_kw) + elif method == "prepare_computer": + # Old method for adding tasks + source = "message_ix_models.model.emissions.PRICE_EMISSION" + keys = prepare_computer(test_context, c, source, source_kw) + + # Tasks are added to the graph + assert isinstance(keys, tuple) and len(keys) + + # Key has expected dimensions + exp = Key("PRICE_EMISSION:n-type_emission-type_tec-y:exo") + assert exp == keys[0] + + # Preparation of data runs successfully + result = c.get(keys[0]) + + assert exp.dims == result.dims # Result has expected dimensions + assert shape == result.shape # Result has expected shape + + # Result can be converted to MESSAGE data frame and added to a scenario + c.require_compat("message_ix.report.operator") + dims = {d: d for d in exp.dims} | {"node": "n", "type_year": "y"} + kw = dict(name="tax_emission", dims=dims, common={}) + c.add("tmp", "as_message_df", keys[0], **kw) + scenario = bare_res(request, test_context) + c.add("store", "add_par_data", scenario, "tmp") + + with scenario.transact(""): + # Add necessary set elements for data + # TODO Transfer these entries to technology.yaml/emission.yaml + scenario.add_set("node", "R12_GLB") + scenario.add_set("type_emission", ["CO2_shipping_IMO", "TCE"]) + scenario.add_set("type_tec", ["bunkers"]) + + result = c.get("store") def add_test_data(scenario): diff --git a/message_ix_models/tests/model/test_structure.py b/message_ix_models/tests/model/test_structure.py index eb4508a709..3e9ff90599 100644 --- a/message_ix_models/tests/model/test_structure.py +++ b/message_ix_models/tests/model/test_structure.py @@ -195,7 +195,7 @@ def test_technologies(self): data = get_codes("technology") # Check the length of the returned dataframe - assert len(data) == 390 + assert len(data) == 399 # Get info on a certain technology h2_fc_trp = data[data.index("h2_fc_trp")] diff --git a/message_ix_models/tests/model/transport/test_config.py b/message_ix_models/tests/model/transport/test_config.py index f9ed531800..7ab60ce72c 100644 --- a/message_ix_models/tests/model/transport/test_config.py +++ b/message_ix_models/tests/model/transport/test_config.py @@ -91,13 +91,23 @@ def test_get_cl_scenario() -> None: # Code lists contains codes with the expected IDs assert { + "EDITS-CA", + "EDITS-HA", + "LED-SSP1", + "LED-SSP2", + "SSP1 exo price", + "SSP1 tax", "SSP1", + "SSP2 exo price", + "SSP2 tax", "SSP2", + "SSP3 exo price", + "SSP3 tax", "SSP3", + "SSP4 exo price", + "SSP4 tax", "SSP4", + "SSP5 exo price", + "SSP5 tax", "SSP5", - "LED-SSP1", - "LED-SSP2", - "EDITS-CA", - "EDITS-HA", } == set(result.items.keys()) diff --git a/message_ix_models/tests/model/transport/test_report.py b/message_ix_models/tests/model/transport/test_report.py index 29c3ad8676..a283036796 100644 --- a/message_ix_models/tests/model/transport/test_report.py +++ b/message_ix_models/tests/model/transport/test_report.py @@ -169,7 +169,7 @@ def test_bare(request, test_context, tmp_path, regions, years): @mark.parametrize( "build", ( - pytest.param(True, marks=make_mark["gh"](328)), # Run .transport.build.main() + True, # Run .transport.build.main() False, # Use data from an Excel export ), ) @@ -206,7 +206,6 @@ def test_simulated( @build.get_computer.minimum_version @MARK[10] -@make_mark["gh"](328) def test_simulated_iamc( request, tmp_path_factory, test_context, regions="R12", years="B" ) -> None: @@ -256,7 +255,6 @@ def test_simulated_iamc( @build.get_computer.minimum_version @MARK[10] -@make_mark["gh"](328) @mark.usefixtures("quiet_genno") @pytest.mark.parametrize( "plot_name", diff --git a/message_ix_models/tests/model/transport/test_workflow.py b/message_ix_models/tests/model/transport/test_workflow.py index c09390ed31..3246e7ce31 100644 --- a/message_ix_models/tests/model/transport/test_workflow.py +++ b/message_ix_models/tests/model/transport/test_workflow.py @@ -24,4 +24,8 @@ def test_generate(test_context, base_scenario) -> None: assert "EDITS-HA reported" in wf assert "LED-SSP1 reported" in wf + # Separate steps for tax and GHG pricing policies are included + assert "SSP5 tax reported" in wf + assert "SSP5 exo price reported" in wf + # wf.run("LED-SSP1 reported") # NB Only works with base_scenario="bare" diff --git a/message_ix_models/tests/project/ssp/test_transport.py b/message_ix_models/tests/project/ssp/test_transport.py index dc8906634e..41b813884b 100644 --- a/message_ix_models/tests/project/ssp/test_transport.py +++ b/message_ix_models/tests/project/ssp/test_transport.py @@ -7,6 +7,7 @@ import pandas as pd import pytest +from message_ix_models.model.transport.testing import MARK as MARK_TRANSPORT from message_ix_models.project.ssp.transport import ( METHOD, get_computer, @@ -257,7 +258,7 @@ def test_get_scenario_code(expected_id, model_name, scenario_name) -> None: @get_computer.minimum_version -@pytest.mark.usefixtures("iea_eweb_test_data", "ssp_user_data") +@MARK_TRANSPORT[10] @pytest.mark.parametrize("method", METHOD_PARAM) def test_process_df(test_context, input_csv_path, method) -> None: # - Read input data @@ -276,7 +277,7 @@ def test_process_df(test_context, input_csv_path, method) -> None: @get_computer.minimum_version -@pytest.mark.usefixtures("iea_eweb_test_data", "ssp_user_data") +@MARK_TRANSPORT[10] @pytest.mark.parametrize("method", METHOD_PARAM) def test_process_file(tmp_path, test_context, input_csv_path, method) -> None: """Code can be called from Python.""" diff --git a/message_ix_models/tests/project/test_advance.py b/message_ix_models/tests/project/test_advance.py index 46f4cd2e17..f6df950e8c 100644 --- a/message_ix_models/tests/project/test_advance.py +++ b/message_ix_models/tests/project/test_advance.py @@ -1,8 +1,12 @@ +from typing import TYPE_CHECKING + import pytest from genno import Computer from message_ix_models.project.advance.data import ADVANCE -from message_ix_models.tools.exo_data import prepare_computer + +if TYPE_CHECKING: + from message_ix_models import Context @pytest.fixture @@ -36,20 +40,24 @@ class TestADVANCE: pytest.param( dict(measure="GDP", model="not a model", foo="bar"), None, - marks=pytest.mark.xfail(raises=ValueError), + marks=pytest.mark.xfail(raises=TypeError), ), ), ) @pytest.mark.parametrize("regions, N_n", (("ADVANCE", 7), ("R12", 4))) - def test_prepare_computer( - self, test_context, source_kw, dimensionality, regions, N_n - ): - source = "ADVANCE" + def test_add_tasks( + self, + test_context: "Context", + source_kw: dict, + dimensionality: dict[str, int], + regions: str, + N_n: int, + ) -> None: test_context.model.regions = regions c = Computer() - keys = prepare_computer(test_context, c, source, source_kw) + keys = c.apply(ADVANCE.add_tasks, context=test_context, **source_kw) # Preparation of data runs successfully result = c.get(keys[0]) diff --git a/message_ix_models/tests/project/test_gea.py b/message_ix_models/tests/project/test_gea.py index b3a8941f5f..d7c93c2be8 100644 --- a/message_ix_models/tests/project/test_gea.py +++ b/message_ix_models/tests/project/test_gea.py @@ -1,10 +1,14 @@ +from typing import TYPE_CHECKING + import pytest -from genno import Computer +from genno import Computer, Key from message_ix_models.project.gea.data import GEA -from message_ix_models.tools.exo_data import prepare_computer from message_ix_models.util import HAS_MESSAGE_DATA as FULL +if TYPE_CHECKING: + from message_ix_models import Context + M = "Final Energy|Transportation|Total" S = "geama_450_btr_nsink" @@ -40,17 +44,23 @@ class TestGEA: ("R12", True, 2 if FULL else 0, 22 if FULL else 0), ), ) - def test_prepare_computer( - self, test_context, source_kw, regions, aggregate, N_n, size - ): + def test_add_tasks( + self, + test_context: "Context", + source_kw: dict, + regions: str, + aggregate: bool, + N_n: int, + size: int, + ) -> None: test_context.model.regions = regions c = Computer() - source = "GEA" source_kw.update(aggregate=aggregate) - keys = prepare_computer(test_context, c, source, source_kw) + keys = GEA.add_tasks(c, context=test_context, **source_kw) + assert all(isinstance(k, Key) for k in keys) # Keys have expected names assert source_kw["measure"].lower() == keys[0].name diff --git a/message_ix_models/tests/project/test_shape.py b/message_ix_models/tests/project/test_shape.py index f8a6666009..a660c4db2a 100644 --- a/message_ix_models/tests/project/test_shape.py +++ b/message_ix_models/tests/project/test_shape.py @@ -1,8 +1,12 @@ +from typing import TYPE_CHECKING + import genno import pytest from message_ix_models.project.shape.data import SHAPE -from message_ix_models.tools.exo_data import prepare_computer + +if TYPE_CHECKING: + from message_ix_models import Context pytestmark = pytest.mark.usefixtures("shape_test_data") @@ -35,17 +39,22 @@ class TestSHAPE: ("R12", False, 183), ), ) - def test_prepare_computer( - self, test_context, source_kw, dimensionality, regions, aggregate, N_n - ): + def test_add_tasks( + self, + test_context: "Context", + source_kw: dict, + dimensionality: dict, + regions: str, + aggregate: bool, + N_n: int, + ) -> None: test_context.model.regions = regions - source = "SHAPE" source_kw.update(aggregate=aggregate) c = genno.Computer() - keys = prepare_computer(test_context, c, source, source_kw) + keys = SHAPE.add_tasks(c, context=test_context, **source_kw) # Key has an informative name assert source_kw["measure"] == keys[0].name @@ -83,17 +92,16 @@ def test_prepare_computer( (("urbanisation", None), 11001), ], ) -def test_get_shape_data(test_context, args, size): +def test_get_shape_data(test_context: "Context", args: tuple, size: int) -> None: test_context.model.regions = "R12" - source = "SHAPE" source_kw = dict(measure=args[0], aggregate=False, interpolate=False) if args[1]: source_kw.update(version=args[1]) c = genno.Computer() - keys = prepare_computer(test_context, c, source, source_kw) + keys = SHAPE.add_tasks(c, context=test_context, **source_kw) # Preparation of data runs successfully result = c.get(keys[0]) diff --git a/message_ix_models/tests/project/test_ssp.py b/message_ix_models/tests/project/test_ssp.py index 3651fb144e..4c67c2963f 100644 --- a/message_ix_models/tests/project/test_ssp.py +++ b/message_ix_models/tests/project/test_ssp.py @@ -1,16 +1,20 @@ +from typing import TYPE_CHECKING + import pytest -from genno import Computer +from genno import ComputationError, Computer from message_ix_models.project.ssp import ( SSP, SSP_2017, SSP_2024, - data, # noqa: F401 —only to ensure SSPOriginal and SSPUpdate are registered generate, parse, ssp_field, ) -from message_ix_models.tools.exo_data import prepare_computer +from message_ix_models.project.ssp.data import SSPOriginal, SSPUpdate + +if TYPE_CHECKING: + from message_ix_models import Context def test_generate(tmp_path, test_context): @@ -42,7 +46,8 @@ def test_enum(): # Same SSP ID from different enums are not equivalent assert SSP_2017["1"] != SSP_2024["1"] assert SSP_2017["1"] is not SSP_2024["1"] - assert SSP["1"] != SSP_2024["1"] + # NB Ignored because of https://github.com/python/mypy/issues/7568 + assert SSP["1"] != SSP_2024["1"] # type: ignore [misc] @pytest.mark.parametrize( @@ -108,18 +113,20 @@ class TestSSPOriginal: # Excess keyword arguments pytest.param( dict(measure="GDP", model="OECD Env-Growth", foo="bar"), - marks=pytest.mark.xfail(raises=ValueError), + marks=pytest.mark.xfail(raises=TypeError), ), ), ) - def test_prepare_computer(self, test_context, source, source_kw): + def test_add_tasks(self, test_context: "Context", source, source_kw: dict) -> None: # FIXME The following should be redundant, but appears mutable on GHA linux and # Windows runners. test_context.model.regions = "R14" c = Computer() - keys = prepare_computer(test_context, c, source, source_kw) + keys = SSPOriginal.add_tasks( + c, context=test_context, source=source, **source_kw + ) # Preparation of data runs successfully result = c.get(keys[0]) @@ -148,30 +155,55 @@ class TestSSPUpdate: ), ) @pytest.mark.parametrize( - "source_kw", + "release, measure, model", ( - dict(measure="POP"), - dict(measure="GDP", model="IIASA GDP 2023"), - dict(measure="GDP", model="OECD ENV-Growth 2023"), - # Excess keyword arguments + ("preview", "GDP", "OECD ENV-Growth 2023"), + ("preview", "GDP", "IIASA GDP 2023"), + ("preview", "POP", ""), + ("3.0", "GDP", "OECD ENV-Growth 2023"), + ("3.0", "GDP", "IIASA GDP 2023"), + ("3.0", "POP", ""), + ("3.0.1", "GDP", "OECD ENV-Growth 2023"), + ("3.0.1", "GDP", "IIASA GDP 2023"), + ("3.0.1", "POP", ""), + ("3.1", "GDP", "OECD ENV-Growth 2023"), + ("3.1", "GDP", "IIASA GDP 2023"), + ("3.1", "POP", ""), + ("3.2.beta", "GDP", "OECD ENV-Growth 2025"), pytest.param( - dict(measure="POP", foo="bar"), - marks=pytest.mark.xfail(raises=ValueError), + "3.2.beta", + "GDP", + "IIASA GDP 2025", + marks=pytest.mark.xfail(raises=ComputationError, reason="No data"), ), + ("3.2.beta", "POP", ""), ), ) - @pytest.mark.parametrize("release", ("preview", "3.0", "3.0.1", "3.1")) - def test_prepare_computer(self, test_context, source, source_kw, release): + def test_add_tasks( + self, + test_context: "Context", + source: str, + release: str, + measure: str, + model: str, + ) -> None: # FIXME The following should be redundant, but appears mutable on GHA linux and # Windows runners. test_context.model.regions = "R14" - # Set the release - source_kw = source_kw | dict(release=release) + # Prepare source_kw + source_kw = dict(release=release, measure=measure) + if model: + source_kw.update(model=model) + if release in ("3.2.beta",) and measure == "GDP": + # Disambiguate units for this release + source_kw["unit"] = "billion USD_2017/yr" c = Computer() - keys = prepare_computer(test_context, c, source, source_kw) + keys = SSPUpdate.add_tasks( + c, context=test_context, strict=True, source=source, **source_kw + ) # Preparation of data runs successfully result = c.get(keys[0]) @@ -182,3 +214,14 @@ def test_prepare_computer(self, test_context, source, source_kw, release): # Data is complete assert 14 == len(result.coords["n"]) assert 14 == len(result.coords["y"]) + + if release == "preview": + return # Fuzzed/random data, not meaningful + + # Check for apparent double-counting: if in 2025, values will be at least twice + # the 2020 values; if in 2020, roughly the opposite + + ratio = (result.sel(y=2025) / result.sel(y=2020)).to_series() + check = (ratio < 0.55) | (1.9 < ratio) + + assert not check.any(), f"Possible double-counting:\n{ratio[check].to_string()}" diff --git a/message_ix_models/tests/test_testing.py b/message_ix_models/tests/test_testing.py index 26b19d08cc..d0cacd7a6f 100644 --- a/message_ix_models/tests/test_testing.py +++ b/message_ix_models/tests/test_testing.py @@ -1,14 +1,18 @@ import os +from typing import TYPE_CHECKING from message_ix_models.testing import bare_res, not_ci +if TYPE_CHECKING: + import pytest -def test_bare_res_no_request(test_context): - """:func:`.bare_res` works with `request` = :obj:`None`.""" - bare_res(None, test_context, solved=False) + from message_ix_models import Context + from message_ix_models.util.click import CliRunner -def test_bare_res_solved(request, test_context): +def test_bare_res_solved( + request: "pytest.FixtureRequest", test_context: "Context" +) -> None: """:func:`.bare_res` works with `solve` = :obj:`True`. This test can be removed once this feature of the test function is used by another @@ -17,17 +21,17 @@ def test_bare_res_solved(request, test_context): bare_res(request, test_context, solved=True) -def test_cli_runner(mix_models_cli): +def test_cli_runner(mix_models_cli: "CliRunner") -> None: result = mix_models_cli.invoke(["foo", "bar"]) assert "No such command 'foo'" in result.output @not_ci(reason="foo", action="skip") -def test_not_ci_skip(): +def test_not_ci_skip() -> None: """Test not_ci(action="skip").""" @not_ci(reason="foo", action="xfail") -def test_not_ci_xfail(): +def test_not_ci_xfail() -> None: """Test not_ci(action="skip").""" assert "GITHUB_ACTIONS" not in os.environ diff --git a/message_ix_models/tests/test_workflow.py b/message_ix_models/tests/test_workflow.py index dbc99787b9..3497440f8b 100644 --- a/message_ix_models/tests/test_workflow.py +++ b/message_ix_models/tests/test_workflow.py @@ -1,5 +1,5 @@ import re -from typing import Optional +from typing import TYPE_CHECKING, Optional import pytest from message_ix import make_df @@ -8,16 +8,24 @@ from message_ix_models.testing import MARK from message_ix_models.workflow import WorkflowStep, make_click_command, solve +if TYPE_CHECKING: + from message_ix import Scenario + + from message_ix_models import Context + from message_ix_models.util.click import CliRunner + +_REQUEST: Optional["pytest.FixtureRequest"] = None + # Functions for WorkflowSteps -def changes_a(c, s) -> None: +def changes_a(c: "Context", s: "Scenario") -> None: """Change a scenario by modifying structure data, but not data.""" with s.transact(): s.add_set("technology", "test_tech") -def changes_b(c, s, value=None) -> None: +def changes_b(c: "Context", s: "Scenario", value: Optional[float] = None) -> None: """Change a scenario by modifying parameter data, but not structure.""" with s.transact(): s.add_par( @@ -34,7 +42,7 @@ def changes_b(c, s, value=None) -> None: class TestWorkflowStep: - def test_call(self, test_context) -> None: + def test_call(self, test_context: "Context") -> None: def action(c, s): pass # pragma: no cover @@ -48,17 +56,20 @@ def test_repr(self) -> None: @pytest.fixture(scope="function") -def wf(request, test_context) -> Workflow: +def wf(request: "pytest.FixtureRequest", test_context: "Context") -> Workflow: return _wf(test_context, request=request) def _wf( - context, + context: "Context", *, base_url: Optional[str] = None, base_platform: Optional[str] = None, - request=None, -): + request: Optional["pytest.FixtureRequest"] = None, +) -> "Workflow": + request = request or _REQUEST + assert request is not None + if base_url is base_platform is None: base_scenario = testing.bare_res(request, context, solved=False) base_platform = base_scenario.platform.name @@ -82,12 +93,18 @@ def _wf( @MARK[1] -def test_make_click_command(mix_models_cli) -> None: +def test_make_click_command( + request: "pytest.FixtureRequest", mix_models_cli: "CliRunner" +) -> None: import click from message_ix_models.cli import cli_test_group from message_ix_models.util.click import temporary_command + # Allow _wf() to access request.node.name + global _REQUEST + _REQUEST = request + # make_click_command() runs and generates a command name = "make-click-command" cmd = make_click_command(f"{__name__}._wf", name=name, slug="test") @@ -117,7 +134,9 @@ def test_make_click_command(mix_models_cli) -> None: assert output in result.output -def test_workflow(caplog, request, test_context, wf) -> None: +def test_workflow( + caplog, request: "pytest.FixtureRequest", test_context: "Context", wf: "Workflow" +) -> None: # Retrieve some information from the fixture mp = wf.graph.pop("_base_platform") diff --git a/message_ix_models/tests/tools/iea/test_eei.py b/message_ix_models/tests/tools/iea/test_eei.py index 968cf6f328..01bd50aa72 100644 --- a/message_ix_models/tests/tools/iea/test_eei.py +++ b/message_ix_models/tests/tools/iea/test_eei.py @@ -1,8 +1,13 @@ +from typing import TYPE_CHECKING + import genno import pandas as pd import pytest -from message_ix_models.tools.exo_data import prepare_computer +from message_ix_models.tools.iea.eei import IEA_EEI + +if TYPE_CHECKING: + from message_ix_models import Context # Infill data for R12 nodes not present in the IEA data # NB these are hand-picked as of 2022-07-20 so that the ratio of freight activity / GDP @@ -45,19 +50,24 @@ class TestIEA_EEI: ("R12", True, 5), ), ) - def test_prepare_computer( - self, test_context, source_kw, dimensionality, regions, aggregate, N_n - ): + def test_add_tasks( + self, + test_context: "Context", + source_kw: dict, + dimensionality: set[str], + regions: str, + aggregate: bool, + N_n: int, + ) -> None: test_context.model.regions = regions - source = "IEA EEI" source_kw.update(aggregate=aggregate) c = genno.Computer() s = pd.Series(1.0, index=pd.MultiIndex.from_tuples(R12_MAP, names=["n", "n2"])) c.add("bc:n-n2", genno.Quantity(s)) - keys = prepare_computer(test_context, c, source, source_kw) + keys = IEA_EEI.add_tasks(c, context=test_context, **source_kw) # Keys have informative names assert "passenger load factor" == keys[0].name diff --git a/message_ix_models/tests/tools/iea/test_web.py b/message_ix_models/tests/tools/iea/test_web.py index 96e973065a..4bd494bfaa 100644 --- a/message_ix_models/tests/tools/iea/test_web.py +++ b/message_ix_models/tests/tools/iea/test_web.py @@ -1,13 +1,13 @@ """Tests of :mod:`.tools`.""" import logging +from typing import TYPE_CHECKING import pandas as pd import pytest from genno import Computer from message_ix_models.testing import GHA -from message_ix_models.tools.exo_data import prepare_computer from message_ix_models.tools.iea.web import ( DIMS, IEA_EWEB, @@ -18,6 +18,9 @@ ) from message_ix_models.util import HAS_MESSAGE_DATA +if TYPE_CHECKING: + from message_ix_models import Context + log = logging.getLogger(__name__) @@ -37,7 +40,6 @@ @IEA_EWEB.transform.minimum_version class TestIEA_EWEB: @pytest.mark.usefixtures("iea_eweb_test_data") - @pytest.mark.parametrize("source", ("IEA_EWEB",)) @pytest.mark.parametrize( "source_kw", ( @@ -48,7 +50,7 @@ class TestIEA_EWEB: dict(provider="OECD", edition="2022", flow=_FLOW), pytest.param( dict(provider="IEA", edition="2023", extra_kw="FOO"), - marks=pytest.mark.xfail(raises=ValueError), + marks=pytest.mark.xfail(raises=TypeError), ), dict(provider="IEA", edition="2024", flow=["AVBUNK"]), pytest.param( @@ -67,14 +69,14 @@ class TestIEA_EWEB: ), ), ) - def test_prepare_computer(self, test_context, source, source_kw): + def test_add_tasks(self, test_context: "Context", source_kw: dict) -> None: # FIXME The following should be redundant, but appears mutable on GHA linux and # Windows runners. test_context.model.regions = "R14" c = Computer() - keys = prepare_computer(test_context, c, source, source_kw) + keys = IEA_EWEB.add_tasks(c, context=test_context, **source_kw) # Preparation of data runs successfully result = c.get(keys[0]) diff --git a/message_ix_models/tests/tools/test_advance.py b/message_ix_models/tests/tools/test_advance.py deleted file mode 100644 index 0be3f3aee9..0000000000 --- a/message_ix_models/tests/tools/test_advance.py +++ /dev/null @@ -1,35 +0,0 @@ -from shutil import copyfile - -import pytest - -from message_ix_models.tools.advance import ( - DIMS, - LOCATION, - advance_data, - get_advance_data, -) -from message_ix_models.util import package_data_path - - -@pytest.fixture(scope="module") -def advance_test_data(session_context): - # Copy test data from the package directory into the local data directory for - # `test_context`. get_advance_data() only uses this file if :mod:`message_data` is - # NOT installed. - target = session_context.get_local_path(*LOCATION) - target.parent.mkdir(parents=True) - copyfile(package_data_path("test", *LOCATION), target) - - -pytestmark = pytest.mark.usefixtures("advance_test_data") - - -def test_get_advance_data(session_context): - """Test :func:`.get_advance_data`.""" - # Returns a pd.Series with the expected index levels - result = get_advance_data() - assert DIMS == result.index.names - - # Returns a genno.Quantity with the expected units - result = advance_data("Transport|Service demand|Road|Freight") - assert {"[length]": 1, "[mass]": 1, "[time]": -1} == result.units.dimensionality diff --git a/message_ix_models/tests/tools/test_exo_data.py b/message_ix_models/tests/tools/test_exo_data.py index e4d2ac9e4d..3228644da4 100644 --- a/message_ix_models/tests/tools/test_exo_data.py +++ b/message_ix_models/tests/tools/test_exo_data.py @@ -1,3 +1,5 @@ +from typing import TYPE_CHECKING + import pytest from genno import Computer @@ -8,19 +10,50 @@ register_source, ) +if TYPE_CHECKING: + from message_ix_models import Context + + +class TestDemoSource: + @pytest.mark.parametrize("method", ("apply", "call")) + @pytest.mark.parametrize("regions, N_n", [("R12", 12), ("R14", 14)]) + def test_add_tasks( + self, test_context: "Context", method: str, regions: str, N_n: int + ) -> None: + test_context.model.regions = regions + + c = Computer() + + if method == "apply": + keys = c.apply(DemoSource.add_tasks, measure="POP", scenario="s1") + elif method == "call": + keys = DemoSource.add_tasks( + c, context=test_context, measure="POP", scenario="s1" + ) + + # Computation of data runs successfully + result = c.get(keys[-1]) + + # Data has the expected dimensions + assert ("n", "y") == result.dims + + # Data is complete + assert N_n == len(result.coords["n"]) + assert 14 == len(result.coords["y"]) + class TestExoDataSource: - def test_abstract(self): + def test_abstract(self) -> None: with pytest.raises(TypeError, match="Can't instantiate"): - ExoDataSource() + ExoDataSource() # type: ignore [abstract] - def test_register_source(self): + def test_register_source(self) -> None: with pytest.raises(ValueError, match="already registered for"): register_source(DemoSource) @pytest.mark.parametrize("regions, N_n", [("R12", 12), ("R14", 14)]) -def test_prepare_computer(test_context, regions, N_n): +def test_deprecated_prepare_computer(test_context, regions, N_n) -> None: """:func:`.exo_data.prepare_computer` works as intended.""" test_context.model.regions = regions @@ -42,7 +75,8 @@ def test_prepare_computer(test_context, regions, N_n): assert 14 == len(result.coords["y"]) -def test_prepare_computer_exc(test_context): +def test_deprecated_prepare_computer_exc(test_context: "Context") -> None: + """Exceptions raised from :func:`prepare_computer`.""" c = Computer() with pytest.raises(ValueError, match="No source found that can handle"): @@ -50,32 +84,3 @@ def test_prepare_computer_exc(test_context): with pytest.raises(ValueError, match="No source found that can handle"): prepare_computer(test_context, c, "not a source") - - -@pytest.mark.parametrize("regions, N_n", [("R12", 12), ("R14", 14)]) -def test_operator(test_context, regions, N_n): - """Exogenous data calculations can be set up through :meth:`.Computer.add`.""" - test_context.model.regions = regions - - c = Computer() - c.require_compat("message_ix_models.report.operator") - - # Function runs successfully `c` - keys = c.add( - "exogenous_data", - context=test_context, - source="test s1", - source_kw=dict(measure="POP"), - ) - - # print(c.describe(keys[-1])) - - # Computation of data runs successfully - result = c.get(keys[-1]) - - # Data has the expected dimensions - assert ("n", "y") == result.dims - - # Data is complete - assert N_n == len(result.coords["n"]) - assert 14 == len(result.coords["y"]) diff --git a/message_ix_models/tests/tools/test_gfei.py b/message_ix_models/tests/tools/test_gfei.py index c9654ba854..cb9725b24e 100644 --- a/message_ix_models/tests/tools/test_gfei.py +++ b/message_ix_models/tests/tools/test_gfei.py @@ -1,9 +1,13 @@ +from typing import TYPE_CHECKING + import pytest from genno import Computer -from message_ix_models.tools.exo_data import prepare_computer from message_ix_models.tools.gfei import GFEI +if TYPE_CHECKING: + from message_ix_models import Context + @pytest.fixture def gfei_test_data(monkeypatch) -> None: @@ -20,15 +24,21 @@ class TestGFEI: ("R12", True, 11, 77), ), ) - def test_prepare_computer(self, test_context, regions, aggregate, N_n, size): + def test_add_tasks( + self, + test_context: "Context", + regions: str, + aggregate: bool, + N_n: int, + size: int, + ) -> None: test_context.model.regions = regions - source = "GFEI" source_kw = dict(aggregate=aggregate, plot=True) c = Computer() - keys = prepare_computer(test_context, c, source, source_kw) + keys = GFEI.add_tasks(c, context=test_context, **source_kw) # Preparation of data and plotting runs successfully c.add("tmp", [keys[0], "plot GFEI debug"]) diff --git a/message_ix_models/tests/tools/test_iamc.py b/message_ix_models/tests/tools/test_iamc.py index 78bcac4529..6bdb3d5247 100644 --- a/message_ix_models/tests/tools/test_iamc.py +++ b/message_ix_models/tests/tools/test_iamc.py @@ -4,13 +4,13 @@ def test_describe(test_context): - import zipfile + import tarfile import pandas as pd path = package_data_path("test", *LOCATION) - with zipfile.ZipFile(path) as zf: - data = pd.read_csv(zf.open(NAME), engine="pyarrow").rename( + with tarfile.open(path, "r:*") as tf: + data = pd.read_csv(tf.extractfile(NAME), engine="pyarrow").rename( columns=lambda c: c.upper() ) diff --git a/message_ix_models/tests/util/test_sdmx.py b/message_ix_models/tests/util/test_sdmx.py index 9a90c3a537..ddbd2c9f26 100644 --- a/message_ix_models/tests/util/test_sdmx.py +++ b/message_ix_models/tests/util/test_sdmx.py @@ -1,5 +1,6 @@ import logging import re +import sys import genno import pytest @@ -14,7 +15,14 @@ data, # noqa: F401 testing, ) -from message_ix_models.util.sdmx import DATAFLOW, Dataflow, eval_anno, make_enum, read +from message_ix_models.util.sdmx import ( + DATAFLOW, + Dataflow, + ItemSchemeEnumType, + URNLookupEnum, + eval_anno, + read, +) log = logging.getLogger(__name__) @@ -28,7 +36,6 @@ def any_df(self): # TODO Use a broader-scoped context to allow (scope="class") @pytest.fixture - @pytest.mark.usefixtures("ssp_test_data") def build_computer(self, test_context): """A :class:`.Computer` from :func:`.configure_build`. @@ -69,7 +76,7 @@ def test_add_tasks(self, caplog, test_context) -> None: assert () == result @build.get_computer.minimum_version - @pytest.mark.usefixtures("iea_eweb_test_data", "ssp_user_data") + @testing.MARK[10] @pytest.mark.parametrize( "file", [f for f in DATAFLOW.values() if f.intent & Dataflow.FLAG.IN], @@ -116,6 +123,71 @@ def test_units(self, any_df: "Dataflow") -> None: assert isinstance(any_df.units, pint.Unit) +_urn_prefix = "urn:sdmx:org.sdmx.infomodel" + + +class TestItemSchemeEnum: + @pytest.mark.parametrize( + "urn, expected", + ( + ("ICONICS:SSP(2017)", f"{_urn_prefix}.codelist.Code=ICONICS:SSP(2017).1"), + ("ICONICS:SSP(2024)", f"{_urn_prefix}.codelist.Code=ICONICS:SSP(2024).1"), + ("SSP(2017)", f"{_urn_prefix}.codelist.Code=ICONICS:SSP(2017).1"), + ("SSP(2024)", f"{_urn_prefix}.codelist.Code=ICONICS:SSP(2024).1"), + ("SSP", f"{_urn_prefix}.codelist.Code=ICONICS:SSP(2017).1"), + ("AGENCIES", f"{_urn_prefix}.base.Agency=IIASA_ECE:AGENCIES(0.1).IEA"), + ), + ) + def test_new_class(self, urn: str, expected: str) -> None: + class Foo(URNLookupEnum, metaclass=ItemSchemeEnumType): + def _get_item_scheme(self): + return read(urn) + + # A known URN retrieves an enumeration member + f = Foo.by_urn(expected) + assert isinstance(f, Foo) + + def test_bases(self) -> None: + """:func:`.make_enum` works with :class:`~enum.Flag` and subclasses.""" + from enum import Flag, IntFlag + + class E1(Flag, metaclass=ItemSchemeEnumType): + def _get_item_scheme(self): + return read("ICONICS:SSP(2017)") + + # Values are bitwise flags + assert not isinstance(E1["1"], int) + + def _exp_max_value(cls) -> int: + """Expected maximum value. + + Currently the NONE value counts towards len(cls) with Python 3.9, but not + with Python 3.13. It's unclear why. + """ + L = len(cls) - 1 - (0 if sys.version_info >= (3, 10) else 1) + return 2**L + + # Expected maximum value + assert _exp_max_value(E1) == max(member.value for member in E1) + + # Flags can be combined + flags = E1["1"] | E1["2"] + assert E1["1"] & flags + assert E1["2"] & flags + assert not (E1["3"] & flags) + + # Similar, with IntFlag + class E2(IntFlag, metaclass=ItemSchemeEnumType): + def _get_item_scheme(self): + return read("IIASA_ECE:AGENCIES(0.1)") + + # Values are ints + assert isinstance(E2["IIASA_ECE"], int) + + # Expected maximum value + assert _exp_max_value(E2) == max(member.value for member in E2) + + def test_eval_anno(caplog, recwarn): c = Code() @@ -140,60 +212,6 @@ def test_eval_anno(caplog, recwarn): assert 7 == eval_anno(c, id="qux") -def test_make_enum0(): - """:func:`.make_enum` works with :class:`~enum.Flag` and subclasses.""" - from enum import Flag, IntFlag - - E = make_enum("ICONICS:SSP(2017)", base=Flag) - - # Values are bitwise flags - assert not isinstance(E["1"], int) - - # Expected length - assert 2 ** (len(E) - 1) == list(E)[-1].value - - # Flags can be combined - flags = E["1"] | E["2"] - assert E["1"] & flags - assert E["2"] & flags - assert not (E["3"] & flags) - - # Similar, with IntFlag - E = make_enum("IIASA_ECE:AGENCIES(0.1)", base=IntFlag) - - # Values are ints - assert isinstance(E["IIASA_ECE"], int) - - # Expected length - assert 2 ** (len(E) - 1) == list(E)[-1].value - - -_urn_prefix = "urn:sdmx:org.sdmx.infomodel.codelist" - - -@pytest.mark.parametrize( - "urn, expected", - ( - ("ICONICS:SSP(2017)", f"{_urn_prefix}.Code=ICONICS:SSP(2017).1"), - ("ICONICS:SSP(2024)", f"{_urn_prefix}.Code=ICONICS:SSP(2024).1"), - ("SSP(2017)", f"{_urn_prefix}.Code=ICONICS:SSP(2017).1"), - ("SSP(2024)", f"{_urn_prefix}.Code=ICONICS:SSP(2024).1"), - ("SSP", f"{_urn_prefix}.Code=ICONICS:SSP(2017).1"), - pytest.param( - "AGENCIES", - f"{_urn_prefix}.Agency=IIASA_ECE:AGENCIES(0.1).IEA", - marks=pytest.mark.xfail(raises=KeyError, reason="XML needs update"), - ), - ), -) -def test_make_enum1(urn, expected): - # make_enum() runs - E = make_enum(urn) - - # A known URN retrieves an enumeration member - E.by_urn(expected) - - @pytest.mark.parametrize( "urn, expected", ( @@ -203,14 +221,16 @@ def test_make_enum1(urn, expected): ("SSP(2024)", "Codelist=ICONICS:SSP(2024)"), ("SSP", "Codelist=ICONICS:SSP(2017)"), ("AGENCIES", "AgencyScheme=IIASA_ECE:AGENCIES(0.1)"), + ("IIASA_ECE:AGENCIES", "AgencyScheme=IIASA_ECE:AGENCIES(0.1)"), + ("IIASA_ECE:AGENCIES(0.1)", "AgencyScheme=IIASA_ECE:AGENCIES(0.1)"), ), ) -def test_read0(urn, expected): +def test_read0(urn: str, expected: str) -> None: obj = read(urn) assert expected in obj.urn -def test_read1(): +def test_read1() -> None: SSPS = read("ssp") # Identify an SSP by matching strings in its name diff --git a/message_ix_models/tools/advance.py b/message_ix_models/tools/advance.py deleted file mode 100644 index fff6a5e511..0000000000 --- a/message_ix_models/tools/advance.py +++ /dev/null @@ -1,118 +0,0 @@ -"""Handle data from the ADVANCE project.""" - -import logging -from pathlib import Path -from typing import Optional -from zipfile import ZipFile - -import pandas as pd -import pint -from genno import Quantity - -from message_ix_models.project.advance.data import LOCATION, NAME -from message_ix_models.util import ( - cached, - local_data_path, - maybe_query, - private_data_path, -) - -log = logging.getLogger(__name__) - -#: Standard dimensions for data produced as snapshots from the IIASA ENE Program -#: “WorkDB”. -DIMS = ["model", "scenario", "region", "variable", "unit", "year"] - - -@cached -def get_advance_data(query: Optional[str] = None) -> pd.Series: - """Return data from the ADVANCE Work Package 2 data snapshot at :data:`LOCATION`. - - .. deprecated:: 2023.11 - Use :class:`.ADVANCE` through :func:`.exo_data.prepare_computer` instead. - - Parameters - ---------- - query : str, optional - Passed to :meth:`pandas.DataFrame.query` to limit the returned values. - - Returns - ------- - pandas.Series - with a :class:`pandas.MultiIndex` having the levels :data:`.DIMS`. - """ - try: - path = private_data_path(*LOCATION) - except TypeError: - path = local_data_path(*LOCATION) - - return _read_workdb_snapshot(path, NAME).pipe(maybe_query, query) - - -def advance_data(variable: str, query: Optional[str] = None) -> Quantity: - """Return a single ADVANCE data `variable` as a :class:`genno.Quantity`. - - .. deprecated:: 2023.11 - Use :class:`.ADVANCE` through :func:`.exo_data.prepare_computer` instead. - - Parameters - ---------- - query : str, optional - Passed to :func:`get_advance_data`. - - Returns - ------- - genno.Quantity - with the dimensions :data:`.DIMS` and name `variable`. If the units of the data - for `variable` are consistent and parseable by :mod:`pint`, the returned - Quantity has these units; otherwise units are discarded and the returned - Quantity is dimensionless. - """ - data = ( - get_advance_data(query) - .rename("value") - .xs(variable, level="variable") - .reset_index("unit") - ) - if len(data.unit.unique()) > 1: # pragma: no cover - log.info(f"Non-unique units for {variable!r}; discarded") - units = "" - else: - units = data.unit.iloc[0] - - result = Quantity(data["value"], name=variable) - - try: - result.units = units - except pint.errors.PintError as e: # pragma: no cover - log.info(f'"{e}" when parsing {units!r}; discarded') - - return result - - -@cached -def _read_workdb_snapshot(path: Path, name: str) -> pd.Series: - """Read the data file. - - The expected format is a ZIP archive at `path` containing a member at `name` in CSV - format, with columns corresponding to :data:`DIMS`, except for “year”, which is - stored as column headers (‘wide’ format). (This corresponds to an older version of - the “IAMC format,” without more recent additions intended to represent sub-annual - time resolution using a separate column.) - - .. deprecated:: 2023.11 - Use :func:`.iamc_like_data_for_query` instead. - """ - with ZipFile(path) as zf: # Open the ZIP archive - with zf.open(name) as f: # Open a particular member - # - Read data using upper case column names, then convert to lower-case. - # - Drop null rows. - # - Stack the “year” dimension (‘long’ format), creating a pd.Series. - # - Apply the index names. - return ( - pd.read_csv(f, index_col=list(map(str.upper, DIMS[:-1]))) - .rename(columns=lambda c: int(c)) - .dropna(how="all") - .stack() - .rename_axis(DIMS) - ) diff --git a/message_ix_models/tools/costs/gdp.py b/message_ix_models/tools/costs/gdp.py index 21c8c5dc2f..b2b6433020 100644 --- a/message_ix_models/tools/costs/gdp.py +++ b/message_ix_models/tools/costs/gdp.py @@ -1,4 +1,5 @@ import logging +from itertools import product import numpy as np import pandas as pd @@ -37,8 +38,7 @@ def process_raw_ssp_data(context: Context, config: Config) -> pd.DataFrame: import xarray as xr from genno import Computer, Key, Quantity, quote - from message_ix_models.project.ssp.data import SSPUpdate # noqa: F401 - from message_ix_models.tools.exo_data import prepare_computer + from message_ix_models.project.ssp.data import SSPUpdate # Computer to hold computations c = Computer() @@ -56,26 +56,28 @@ def broadcast_qty(s) -> Quantity: # Keys prepared in the loop keys = defaultdict(list) - for n in "12345": - # Source/scenario identifier - ssp = f"ICONICS:SSP(2024).{n}" - + for ssp_id, (measure, model) in product( + "12345", (("POP", "IIASA-WiC POP 2023"), ("GDP", "OECD ENV-Growth 2023")) + ): # Add a quantity for broadcasting - c.add(f"SSP{n}:scenario", broadcast_qty(f"SSP{n}")) - - # Both population and GDP data - for source_kw in ( - dict(measure="POP", model="IIASA-WiC POP 2023", name=f"_pop {n}"), - dict(measure="GDP", model="OECD ENV-Growth 2023", name=f"_gdp {n}"), - ): - m = source_kw["measure"].lower() + c.add(f"SSP{ssp_id}:scenario", broadcast_qty(f"SSP{ssp_id}")) + + # Prepare SSPUpdate.Options + m = measure.lower() + kw = dict( + measure=measure, + model=model, + ssp_id=ssp_id, + name=f"_{m} {ssp_id}", + release="3.1", # Use the 3.1 release of the data + ) - # Add tasks to `c` that retrieve and (partly) process data from the database - key, *_ = prepare_computer(context, c, ssp, source_kw, strict=False) + # Add tasks to `c` that retrieve and (partly) process data from the database + key, *_ = SSPUpdate.add_tasks(c, context=context, strict=False, **kw) - # Add a "scenario" dimension - for label in [f"SSP{n}"] + (["LED"] if n == "2" else []): - keys[m].append(c.add(f"{m} {label}", "mul", key, f"{label}:scenario")) + # Add a "scenario" dimension + for label in [f"SSP{ssp_id}"] + (["LED"] if ssp_id == "2" else []): + keys[m].append(c.add(f"{m} {label}", "mul", key, f"{label}:scenario")) # Concatenate single-scenario data k_pop = Key("pop", dims) diff --git a/message_ix_models/tools/exo_data.py b/message_ix_models/tools/exo_data.py index ee84add1e3..d969bc1087 100644 --- a/message_ix_models/tools/exo_data.py +++ b/message_ix_models/tools/exo_data.py @@ -4,252 +4,353 @@ from abc import ABC, abstractmethod from collections.abc import Mapping from copy import deepcopy +from dataclasses import dataclass from operator import itemgetter from typing import TYPE_CHECKING, Optional, Union +from warnings import warn -from genno import Computer, Key, Quantity, quote -from genno.core.key import single_key +from genno import Key, quote +from genno.core.key import iter_keys, single_key -from message_ix_models import ScenarioInfo +from message_ix_models import Context, ScenarioInfo from message_ix_models.model.structure import get_codes if TYPE_CHECKING: from pathlib import Path + from genno import Computer + from genno.types import AnyQuantity + + __all__ = [ "MEASURES", "SOURCES", + "BaseOptions", "DemoSource", "ExoDataSource", + "add_structure", "prepare_computer", "register_source", ] log = logging.getLogger(__name__) -#: Supported measures. Subclasses of :class:`.ExoDataSource` may provide support for -#: other measures. +#: Measures recognized by some data sources. Concrete :class:`.ExoDataSource` subclasses +#: may provide support for other measures. #: #: .. todo:: Store this in a separate code list or concept scheme. MEASURES = ("GDP", "POP") -#: Known sources for data. Use :func:`register_source` to add to this collection. +#: Registered sources for data. Use :func:`register_source` to add to this collection. SOURCES: dict[str, type["ExoDataSource"]] = {} -class ExoDataSource(ABC): - """Base class for sources of exogenous data.""" +@dataclass +class BaseOptions: + """Options for a concrete ExoDataSource subclass. + + See :attr:`ExoDataSource.Options`. + """ - #: Identifier for this particular source. - id: str = "" + #: :any:`True` if :meth:`ExoDataSource.transform` should aggregate data on the |n| + #: dimension. + aggregate: bool = True + + #: :any:`True` if :meth:`ExoDataSource.transform` should interpolate data on the |y| + #: dimension. + interpolate: bool = True - #: Key for the returned :class:`.Quantity`. Optional. See :meth:`get_keys`. - key: Optional[Key] = None + #: Identifier for the primary measure of retrieved/returned data. + measure: str = "" - #: Name for the returned :class:`.Key`/:class:`.Quantity`. Optional. See - #: :meth:`get_keys`. + #: Name for the returned :class:`.Key`/:class:`.Quantity`. name: str = "" - #: Primary measure. - measure = "" + #: Dimensions for the returned :class:`.Key`/:class:`.Quantity`. + dims: tuple[str, ...] = ("n", "y") - #: Optional additional dimensions for the returned :class:`.Key`/:class:`.Quantity`. - #: If not set by :meth:`.__init__`, the dimensions are :math:`(n, y)`. - extra_dims: tuple[str, ...] = () + @classmethod + def from_args(cls, source_id: Union[str, "ExoDataSource"], *args, **kwargs): + """Construct an instance from keyword arguments. - #: :any:`True` if :meth:`.transform` should aggregate data on the |n| dimension. - aggregate: bool = True + Parameters + ---------- + source_id + For backwards-compatibility with :func:`prepare_computer`. + """ + if not isinstance(source_id, str): + source_id = type(source_id).__name__ - #: :any:`True` if :meth:`.transform` should interpolate data on the |y| dimension. - interpolate: bool = True + if 2 == len(args) and not kwargs: + # Old-style source, source_kw as positional args + kwargs, args = dict(source_id=args[0], source_kw=args[1]), () + + if set(kwargs) == {"source", "source_kw"} and not args: + # Old-style source, source_kw as keyword args + if source_id != kwargs["source"]: + raise ValueError(f"source_id == {source_id!r} != {kwargs['source']!r}") + return cls(**kwargs["source_kw"]) + + assert 0 == len(args) + return cls(**kwargs) + + +class ExoDataSource(ABC): + """Abstract class for sources of exogenous data.""" + + #: Class defining per-instance options understood by this data source. + #: + #: An concrete class **may** override this with a subclass of :class:`.BaseOptions`. + #: That subclass **may** change the default values of any attributes of BaseOptions, + #: or add others. + Options: type[BaseOptions] = BaseOptions + + #: Instance of the :attr:`Options` class. + #: + #: A concrete class that overrides :attr:`.Options` **should** redefine this + #: attribute, to facilitate type checking. + options: BaseOptions + + #: Key for the returned :class:`.Quantity`. This **may** either be set statically + #: on a concrete subclass, or created via :meth:`__init__`. + key: Key #: :any:`True` to allow the class to look up and use test data. If no test data - #: exists, this setting has no effect. + #: exists, this setting has no effect. See :meth:`_where`. use_test_data: bool = False - #: :py:`where` keyword argument to :func:`.path_fallback`. + #: :py:`where` keyword argument to :func:`.path_fallback`. See :meth:`_where`. where: list[Union[str, "Path"]] = [] - @abstractmethod - def __init__(self, source: str, source_kw: Mapping) -> None: - """Handle `source` and `source_kw`. + # Class methods - An implementation **must**: + @classmethod + def _where(self) -> list[Union[str, "Path"]]: + """Helper for :meth:`__init__` methods in concrete classes. - - Raise :class:`ValueError` if it does not recognize or cannot handle the - arguments in `source` or `source_kw`. - - Recognize and handle (if possible) a "measure" keyword in `source_kw` from - :data:`MEASURES`. + Return :attr:`where` - It **may**: + If :attr:`use_test_data` is :any:`True`, also append :py:`"test"`. + """ + return self.where + (["test"] if self.use_test_data else []) - - Transform these into other values, for instance by mapping certain values to - others, applying regular expressions, or other operations. - - Store those values as instance attributes for use in :meth:`__call__`. - - Set :attr:`name` and/or :attr:`extra_dims` to control the behaviour of - :func:`.prepare_computer`. - - Log messages that give information that may help to debug a - :class:`ValueError` for `source` or `source_kw` that cannot be handled. + @classmethod + def add_tasks( + cls, + c: "Computer", + *args, + context: Optional["Context"] = None, + strict: bool = True, + **kwargs, + ) -> tuple: + """Add tasks to `c` to provide and transform the data. - It **should not** actually load data or perform any time- or memory-intensive - operations; these should only be triggered by :meth:`.__call__`. - """ + The first returned key is :attr:`.key`, and will trigger the following tasks: - raise ValueError + 1. Load or retrieve data by invoking :meth:`.ExoDataSource.get`. + 2. If :attr:`.BaseOptions.aggregate` is :any:`True`, aggregate on the |n| (node) + dimension according to :attr:`.Config.regions`. + 3. If :attr:`.BaseOptions.interpolate` is :any:`True`, interpolate on the |y| + (year) dimension according to :attr:`.Config.years`. - @abstractmethod - def __call__(self) -> Quantity: - r"""Return the data. + Steps (2) and (3) are added by :meth:`.transform` and **may** differ in + concrete classes. - The Quantity returned by this method **must** have dimensions - :math:`(n, y) \cup \text{extra_dims}`. If the original/upstream/raw data has - different dimensionality (fewer or more dimensions; different dimension IDs), - the code **must** transform these, make appropriate selections, etc. - """ - raise NotImplementedError + Other returned keys include further transformations: - @classmethod - def _where(self) -> list[Union[str, "Path"]]: - """Helper for :py:`__init__()` methods in subclasses. + - :py:`key + "y0_indexed"`: same as :attr:`.key`, but indexed to the values as + of the first model period. + + Other keys that are created but not returned can be accessed on `c`: + + - :py:`key + "message_ix_models.foo.bar.CLASS"`: the raw data, with a tag from + the fully-qualified name of the ExoDataSource class. + + To support the loading and transformation of data, :func:`add_structure` is + first called with `c`. + + .. todo:: Add option/tasks to index to a particular label on the |n| dimension. - Return :attr:`where`, but if :attr:`use_test_data` is :any:`True`, also append - :py:`["test"]`. + Parameters + ---------- + context + Passed to :func:`add_structure`. + strict + Passed to :func:`add_structure`. + + Returns + ------- + tuple of .Key """ - return self.where + (["test"] if self.use_test_data else []) + # Create an instance of `cls` + source = cls(*args, **kwargs) + + # Identify a context + context = context or c.graph.get("context") + if not context: + log.warning( + f'No ExoDataSource.add_tasks(…, context=…) and no "context" key in {c};' + " using newest instance" + ) + context = Context.get_instance(-1) + + # Add structure + add_structure(c, context=context, strict=strict) + + # Prepare keys that will refer to the final/transformed and raw data + k = source.key + k_raw = k + f"{cls.__module__}.{cls.__name__}" + result = [k] + + # Retrieve the raw data and convert to Quantity + c.add(k_raw, source.get) + + # Transform the raw data according to .transform() (aggregate then interpolate) + # or a subclass override + k_transformed = source.transform(c, k_raw) + + # Alias `key` → `k`, the target key + if k != k_transformed: + c.add(k, k_transformed) + + # Index to y0 + result.append(k["y0_indexed"]) + c.add(result[-1], "index_to", k, "y0::coord") + + return tuple(result) - def get_keys(self) -> tuple[Key, Key]: - """Return the target keys for the (1) raw and (2) transformed data. + # Instance methods - Subclasses **may** override this method to provide different targets keys. In - the default implementation, the key for the transformed data is: + def __init__(self, *args, **kwargs) -> None: + """Create an instance and prepare info for :meth:`transform`/:meth:`get`. - 1. :attr:`.key`, if any, or - 2. Constructed from: + The base implementation: - - :attr:`.name` or :attr:`.measure` in lower-case. - - The dimensions :math:`(n, y)`, plus any :attr:`.extra_dims`. + - Sets :attr:`options`—if not already set—by passing `kwargs` to + :attr:`Options`. + - Raises an exception if there are other/unhandled `args` or `kwargs`. + - If :attr:`key` is not set, constructs it with: - The key for the raw data is the same, with :attr`.id` as an extra tag. + - Name :attr:`~BaseOptions.name` or :attr:`~BaseOptions.measure` in lower + case. + - Dimensions :attr:`~BaseOptions.dims`. + + Subclasses **may** pre-empt this behaviour by setting :attr:`key` statically + or dynamically. + + A concrete class implementation **must**: + + - Set :attr:`options`, either directly or by calling :py:`super().__init__()` + with or without keyword arguments. + - Set :attr:`key`, either directly or by calling :py:`super().__init__()`. In + the latter case, it **may** set :attr:`~.BaseOptions.name`, + :attr:`~.BaseOptions.measure`, and/or :attr:`~.BaseOptions.dims` to control + the behaviour. + - Raise an exception if unrecognized or invalid `kwargs` are passed. + + and **may**: + + - Transform `kwargs` or :attr:`options` arguments into other values, for + instance by mapping certain values to others, applying regular expressions, or + other operations. + - Store those values as instance attributes for use in :meth:`get`. + - Log messages that give information that helps to debug exceptions. + + It **must not** perform any time- or memory-intensive operations, such as + actually loading or fetching data. Those operations should be in :meth:`get`. """ - k = self.key or Key( - self.name or self.measure.lower(), ("n", "y") + self.extra_dims - ) - return k + self.id, k + if len(args): + raise ValueError(f"Unexpected args to ExoDataSource(): {args}") + elif not hasattr(self, "options"): + self.options = self.Options(**kwargs) + elif len(kwargs): + msg = ( + f"Unhandled extra keyword arguments to {type(self).__name__}: " + + repr(kwargs) + ) + log.error(msg) + raise ValueError(msg) + if not hasattr(self, "key"): + # Key name + name = self.options.name or self.options.measure.lower() + self.key = Key(name, self.options.dims) + + @abstractmethod + def get(self) -> "AnyQuantity": + r"""Return the data. + + Implementations in concrete classes **may** load data from file, retrieve from + remote sources or local caches, generate data, or anything else. + + The Quantity returned by this method **must** have dimensions corresponding to + :attr:`key`. If the original/upstream/raw data has different dimensionality + (fewer or more dimensions; different dimension IDs), a concrete class **must** + transform these, make appropriate selections, etc. + """ + raise NotImplementedError def transform(self, c: "Computer", base_key: Key) -> Key: - """Prepare `c` to transform raw data from `base_key`. + """Add tasks to `c` to transform raw data from `base_key`. - `base_key` identifies the :class:`.Quantity` that is returned by - :meth:`.__call__`. Before the data is returned, :meth:`.transform` allows the - data source to add additional tasks or computations to `c` that further - transform the data. (These operations **may** be done in :meth:`.__call__` - directly, but :meth:`.transform` allows use of other :mod:`genno` operators and - conveniences.) + `base_key` refers to the :class:`.Quantity` returned by :meth:`get`. Via + :meth:`add_tasks`, :meth:`transform` adds additional tasks to `c` that further + transform the data. (Such operations **may** be done in :meth:`get` directly, + but :meth:`transform` allows use of :mod:`genno` operators and conveniences.) - The default implementation: + In the default implementation: - 1. If :attr:`.aggregate` is :any:`True`, aggregates the data ( + 1. If :attr:`~BaseOptions.aggregate` is :any:`True`, aggregate the data ( :func:`.genno.operator.aggregate`) on the |n| dimension using the key "n::groups". - 2. If :attr:`.interpolate` is :any:`True`, interpolates the data ( + 2. If :attr:`~BaseOptions.interpolate` is :any:`True`, interpolate the data ( :func:`.genno.operator.interpolate`) on the |y| dimension using "y::coords". + + Concrete classes **may** override this method to, for instance, change how + `aggregate` and `interpolate` are handled, or add further steps. Such overrides + **may** call the base implementation, or not. + + Returns + ------- + .Key + referring to the data from `base_key` after any transformation. This **may** + be the same as `base_key`. """ k = base_key + # Aggregate - if self.aggregate: - k = single_key(c.add(k + "1", "aggregate", k, "n::groups", keep=False)) + if self.options.aggregate: + k = single_key(c.add(k[1], "aggregate", k, "n::groups", keep=False)) # Interpolate to the desired set of periods - if self.interpolate: + if self.options.interpolate: kw = dict(fill_value="extrapolate") - k = single_key(c.add(k + "2", "interpolate", k, "y::coords", kwargs=kw)) + k = single_key(c.add(k[2], "interpolate", k, "y::coords", kwargs=kw)) return k - def raise_on_extra_kw(self, kwargs) -> None: - """Helper for subclasses to handle the `source_kw` argument. - - 1. Store :attr:`.aggregate` and :attr:`.interpolate`, if they remain in - `kwargs`. - 2. Raise :class:`ValueError` if there are any other, unhandled keyword arguments - in `kwargs`. - """ - self.aggregate = kwargs.pop("aggregate", self.aggregate) - self.interpolate = kwargs.pop("interpolate", self.interpolate) - self.name = kwargs.pop("name", self.name) - if len(kwargs): - log.error( - f"Unhandled extra keyword arguments for {type(self).__name__}: " - + repr(kwargs) - ) - raise ValueError(kwargs) +def add_structure(c: "Computer", *, context: "Context", strict: bool = True) -> None: + """Add structural information to `c`. + Helper for :meth:`ExoDataSource.add_tasks` and :func:`prepare_computer`. -def prepare_computer( - context, - c: "Computer", - source="test", - source_kw: Optional[Mapping] = None, - *, - strict: bool = True, -) -> tuple[Key, ...]: - """Prepare `c` to compute GDP, population, or other exogenous data. + The added tasks include: - Check each :class:`ExoDataSource` in :data:`SOURCES` to determine whether it - recognizes and can handle `source` and `source_kw`. If a source is identified, add - tasks to `c` that retrieve and process data into a :class:`.Quantity` with, at - least, dimensions :math:`(n, y)`. + 1. "context": `context`, if not already set. + 2. "n::codes": :func:`get_codes` for the node code list according to + :attr:`.Config.regions`. + 3. "n::groups": :func:`codelist_to_groups` called on "n::codes". + 4. "y": list of periods according to :attr:`.Config.years`, if not already set. + 5. "y0": first element of "y". + 6. "y::coords": :class:`dict` mapping :py:`str("y")` to the elements of "y". + 7. "yv::coords": :class:`dict` mapping :py:`str("yv")` to the elements of "y". + 8. "y0::coord": :class:`dict` mapping :py:`str("y")` to "y0". Parameters ---------- - source : str - Identifier of the source, possibly with other information to be handled by a - :class:`ExoDataSource`. - source_kw : dict, optional - Keyword arguments for a Source class. These can include indexers, selectors, or - other information needed by the source class to identify the data to be - returned. - - If the key "measure" is present, it **should** be one of :data:`MEASURES`. - strict : bool, optional - Raise an exception if any of the keys to be added already exist. - - Returns - ------- - tuple of .Key - - Raises - ------ - ValueError - if no source is registered which can handle `source` and `source_kw`. + strict + if :any:`True`, raise exceptions if the keys to be added are already in `c`. """ - # Handle arguments - source_kw = source_kw or dict() - if measure := source_kw.get("measure"): - # commented: quiet logging; MEASURES is not automatically updated to include the - # IDs of measures recognized by additional SOURCES - # TODO Remove use of this variable, below, by ensuring that source_obj.name is - # always present - # if measure not in MEASURES: - # log.debug(f"source keyword {measure = } not in recognized {MEASURES}") - del measure - - # Look up input data flow - source_obj = None - for cls in SOURCES.values(): - try: - # Instantiate a Source object to provide this data - source_obj = cls(source, deepcopy(source_kw or dict())) - # except Exception as e: # For debugging - # log.debug(f"{cls} → {e!r}") - except Exception: - pass # Class does not recognize the arguments - - if source_obj is None: - raise ValueError(f"No source found that can handle {source!r}") - - # Add structural information to the Computer c.require_compat("message_ix_models.report.operator") c.graph.setdefault("context", context) @@ -275,77 +376,123 @@ def prepare_computer( c.add("yv::coords", lambda years: dict(yv=years), "y") c.add("y0::coord", lambda year: dict(y=year), "y0") - # Retrieve the keys that will refer to the raw and transformed data - k_raw, k = source_obj.get_keys() - # Keys to return - keys = [k] +def prepare_computer( + context, + c: "Computer", + source="test", + source_kw: Optional[Mapping] = None, + *, + strict: bool = True, +) -> tuple[Key, ...]: + """Prepare `c` to compute GDP, population, or other exogenous data. - # Retrieve the raw data by invoking ExoDataSource.__call__ - c.add(k_raw, source_obj) + Check each :class:`ExoDataSource` in :data:`SOURCES` to determine whether it + recognizes and can handle `source` and `source_kw`. If a source is identified, add + tasks to `c` that retrieve and process data into a :class:`.Quantity` with, at + least, dimensions :math:`(n, y)`. - # Allow the class to add further tasks that transform the data. See - # ExoDataSource.transform() for the default: aggregate, then interpolate. - key = source_obj.transform(c, k_raw) + .. deprecated:: 2025-06-06 + Use :meth:`ExoDataSource.add_tasks` instead. See :mod:`.exo_data`. - # Alias `key` -> `k` - c.add(k, key) + Returns + ------- + tuple of .Key - # Index to y0 - k_y0 = k + "y0_indexed" - c.add(k_y0, "index_to", k, "y0::coord") - keys.append(k_y0) + Raises + ------ + ValueError + if no source is registered which can handle `source` and `source_kw`. + """ + # Handle arguments + source_kw = source_kw or dict() - # TODO Index to a particular label on the "n" dimension - # TODO Index on both "n" and "y" + # Look up input data flow + for cls in SOURCES.values(): + try: + keys = c.apply( + cls.add_tasks, + source=source, + source_kw=deepcopy(source_kw), + context=context, + ) + except Exception: + pass # Class does not recognize the arguments + # except Exception as e: # For debugging + # log.debug(f"{cls} → {e!r}") + else: + warn( + f"prepare_computer(…, c, {source!r}, source_kw); instead use " + f"c.apply({cls.__name__}.add_tasks, context=…, **source_kw)", + DeprecationWarning, + stacklevel=2, + ) + return tuple(iter_keys(keys)) - return tuple(keys) + raise ValueError( + f"No source found that can handle {source=!r}, {source_kw=!r} among:\n " + + "\n ".join(sorted(SOURCES)) + ) -def register_source(cls: type[ExoDataSource]) -> type[ExoDataSource]: +def register_source( + cls: type[ExoDataSource], *, id: Optional[str] = None +) -> type[ExoDataSource]: """Register :class:`.ExoDataSource` `cls` as a source of exogenous data.""" - if cls.id in SOURCES: - raise ValueError(f"{SOURCES[cls.id]} already registered for id {cls.id!r}") - SOURCES[cls.id] = cls + id_ = id or cls.__name__ + if id_ in SOURCES: + raise ValueError(f"{SOURCES[id_]} already registered for ID {id_!r}") + + SOURCES[id_] = cls + return cls @register_source class DemoSource(ExoDataSource): - """Example source of exogenous population and GDP data. - - Parameters - ---------- - source : str - **Must** be like ``test s1``, where "s1" is a scenario ID from ("s0"…"s4"). - source_kw : dict - **Must** contain an element "measure", one of :data:`MEASURES`. - """ - - id = "DEMO" - - def __init__(self, source, source_kw): - if not source.startswith("test "): - # Don't recognize this `source` string → can't provide data - raise ValueError - - # Select the data according to the `source`; in this case, scenario - *parts, scenario = source.partition("test ") - self.indexers = dict(s=scenario) - + """Example source of exogenous population and GDP data.""" + + @dataclass + class Options(BaseOptions): + scenario: str = "" + + def __init__(self, *args, **kwargs) -> None: + # Handle old-style positional or keyword arg like source="test s1", where "s1" + # is the value for Options.scenario + if args: + source = args[0] + elif source := kwargs.get("source"): + pass + + if source: + prefix = "test " + _, source_id, scenario = source.rpartition(prefix) + if not source_id == prefix: + # Don't recognize this `source` string → can't provide data + raise ValueError(source) + else: + scenario = None + + opt = self.options = self.Options.from_args(source, *args, **kwargs) + + # Use an explicit scenario ID or part of "source_id" # Map from the measure ID to a variable name - self.measure = source_kw["measure"] - self.indexers.update(v={"POP": "Population", "GDP": "GDP"}[self.measure]) + self.indexers = dict( + s=opt.scenario or scenario, + v={"POP": "Population", "GDP": "GDP"}[opt.measure], + ) + + super().__init__() - def __call__(self) -> Quantity: + def get(self) -> "AnyQuantity": from genno.operator import select # - Retrieve the data. # - Apply the prepared indexers. - return self.random_data().pipe(select, self.indexers, drop=True) + return self.random_data().pipe(select, self.indexers, drop=True) # type: ignore [arg-type] @staticmethod - def random_data(): + def random_data() -> "AnyQuantity": """Generate some random data with n, y, s, and v dimensions.""" from genno.operator import relabel from genno.testing import random_qty diff --git a/message_ix_models/tools/gfei.py b/message_ix_models/tools/gfei.py index d15c76e474..2aaa4cf8df 100644 --- a/message_ix_models/tools/gfei.py +++ b/message_ix_models/tools/gfei.py @@ -1,17 +1,18 @@ """Handle data from the Global Fuel Economy Initiative (GFEI).""" import logging +from dataclasses import dataclass from typing import TYPE_CHECKING import genno import plotnine as p9 -from message_ix_models.tools.exo_data import ExoDataSource, register_source +from message_ix_models.tools.exo_data import BaseOptions, ExoDataSource, register_source from message_ix_models.util import path_fallback if TYPE_CHECKING: - from genno import Computer - from genno.types import AnyQuantity + from genno import Computer, Key + from genno.types import AnyQuantity, TQuantity from message_ix_models import Context @@ -50,37 +51,37 @@ class GFEI(ExoDataSource): automatically. """ - id = "GFEI" + @dataclass + class Options(BaseOptions): + #: By default, do not aggregate. + aggregate: bool = False + #: By default, do not interpolate. + interpolate: bool = False - #: By default, do not aggregate. - aggregate = False + #: Name for the returned quantity. + name: str = "fuel economy" - #: By default, do not interpolate. - interpolate = False + #: Also generate diagnostic plots. + plot: bool = False - where = ["private"] - - def __init__(self, source, source_kw): - if source != self.id: - raise ValueError(source) - - self.plot = source_kw.pop("plot", False) + options: Options - self.raise_on_extra_kw(source_kw) - - # Set the name of the returned quantity - self.name = "fuel economy" + where = ["private"] + def __init__(self, *args, **kwargs) -> None: + self.options = self.Options.from_args("GFEI", *args, **kwargs) self.path = path_fallback( "transport", "GFEI_FE_by_Powertrain_2017.csv", where=self._where() ) + assert self.path.exists() + super().__init__() - def __call__(self): + def get(self) -> "AnyQuantity": import genno.operator from message_ix_models.util.pycountry import iso_3166_alpha_3 - def relabel_n(qty: "AnyQuantity") -> "AnyQuantity": + def relabel_n(qty: "TQuantity") -> "TQuantity": labels = {n: iso_3166_alpha_3(n) for n in qty.coords["n"].data} return genno.operator.relabel(qty, {"n": labels}) @@ -96,20 +97,20 @@ def relabel_n(qty: "AnyQuantity") -> "AnyQuantity": .pipe(genno.operator.convert_units, "MJ / (vehicle km)") ) - def transform(self, c: "Computer", base_key: genno.Key) -> genno.Key: + def transform(self, c: "Computer", base_key: "Key") -> "Key": """Prepare `c` to transform raw data from `base_key`.""" - ks = genno.KeySeq(super().transform(c, base_key)) + k = super().transform(c, base_key) - if self.plot: + if self.options.plot: # Path for debug output context: "Context" = c.graph["context"] debug_path = context.get_local_path("debug") debug_path.mkdir(parents=True, exist_ok=True) c.configure(output_dir=debug_path) - c.add(f"plot {self.id} debug", Plot, ks.base) + c.add("plot GFEI debug", Plot, k) - return ks.base + return k class Plot(genno.compat.plotnine.Plot): diff --git a/message_ix_models/tools/iamc.py b/message_ix_models/tools/iamc.py index 7d435b6647..179080ca69 100644 --- a/message_ix_models/tools/iamc.py +++ b/message_ix_models/tools/iamc.py @@ -140,8 +140,9 @@ def iamc_like_data_for_query( Parameters ---------- archive_member : bool, optional - If given, `path` may be an archive with 2 or more members. The member named by - `archive_member` is extracted and read. + If given, `path` may be a tar or ZIP archive with 1 or more members. The member + named by `archive_member` is extracted and read using :class:`tarfile.TarFile` + or :class:`zipfile.ZipFile`. Returns ------- @@ -152,11 +153,18 @@ def iamc_like_data_for_query( # Identify the source object/buffer to read from if archive_member: - # A single member in a ZIP archive that has >1 members - import zipfile - - zf = zipfile.ZipFile(path) - source: Any = zf.open(archive_member) + if path.suffix.rpartition(".")[2] in ("gz", "xz"): + # A single member in an LZMA-compressed tar archive that has ≥1 members + import tarfile + + tf = tarfile.open(path, mode="r:*") + source: Any = tf.extractfile(archive_member) + else: + # A single member in a ZIP archive that has ≥1 members + import zipfile + + zf = zipfile.ZipFile(path) + source = zf.open(archive_member) else: # A direct path, possibly compressed source = path diff --git a/message_ix_models/tools/iea/eei.py b/message_ix_models/tools/iea/eei.py index 8efe1ea152..97ce631b85 100644 --- a/message_ix_models/tools/iea/eei.py +++ b/message_ix_models/tools/iea/eei.py @@ -4,19 +4,22 @@ import logging import re -from typing import TYPE_CHECKING, Literal +from dataclasses import dataclass +from typing import TYPE_CHECKING, Literal, Optional import genno import numpy as np import pandas as pd import plotnine as p9 +from genno import Key from message_ix_models import Context -from message_ix_models.tools.exo_data import ExoDataSource, register_source +from message_ix_models.tools.exo_data import BaseOptions, ExoDataSource, register_source from message_ix_models.util import cached, path_fallback if TYPE_CHECKING: from genno import Computer + from genno.types import AnyQuantity log = logging.getLogger(__name__) @@ -113,42 +116,30 @@ @register_source class IEA_EEI(ExoDataSource): - """Provider of exogenous data from the IEA Energy Efficiency Indicators data source. + """Provider of exogenous data from the IEA Energy Efficiency Indicators source.""" - To use data from this source, call :func:`.exo_data.prepare_computer` with the - arguments: + @dataclass + class Options(BaseOptions): + #: By default, do not aggregate. + aggregate: bool = False - - `source`: "IEA_EEI". - - `source_kw` including: + #: By default, do not interpolate. + interpolate: bool = False - - `measure`: name of a measure or indicator in the data. - - `broadcast_map` (optional): name of a :class:`.Key` containing a mapping for - :func:`genno.operator.broadcast_map`. - - `plot` (optional, default :any:`False`): add a task with the key - "plot IEA_EEI debug" to generate diagnostic plot using :class:`.Plot`. - - `aggregate`, `interpolate`: see :meth:`.ExoDataSource.transform`. - """ - - id = "IEA EEI" + #: Name of a :class:`.Key` containing a mapping for + #: :func:`genno.operator.broadcast_map`. + broadcast_map: Optional["Key"] = None - #: By default, do not aggregate. - aggregate = False + #: Add a task with the key "plot IEA_EEI debug" to generate diagnostic plot + #: using :class:`.Plot`. + plot: bool = False - #: By default, do not interpolate. - interpolate = False + options: Options where = ["local", "private"] - def __init__(self, source, source_kw): - if source != self.id: - raise ValueError(source) - - measure = source_kw.pop("measure", None) - self.broadcast_map = source_kw.pop("broadcast_map", None) - self.plot = source_kw.pop("plot", False) - - self.raise_on_extra_kw(source_kw) - + def __init__(self, *args, **kwargs) -> None: + opt = self.options = self.Options.from_args(self, *args, **kwargs) self.path = path_fallback( "iea", "eei", @@ -157,17 +148,15 @@ def __init__(self, source, source_kw): ) # Prepare query - self.query = f"INDICATOR == {measure!r}" - self.measure = "INDICATOR" - self.name = measure.lower() + self.query = f"INDICATOR == {opt.measure!r}" # Determine whether to perform a weighted average operation self.weights = None - if False: # pragma: no cover - # TODO This code never executes; update and reactivate - pass - def __call__(self): + # Construct .key + super().__init__() + + def get(self) -> "AnyQuantity": from genno.operator import unique_units_from_dim tmp = ( @@ -182,34 +171,34 @@ def __call__(self): dims = [ c for c, s in tmp.items() - if (c not in {"value", self.measure} and set(s.unique()) != {"__NA"}) + if (c not in {"value", "INDICATOR"} and set(s.unique()) != {"__NA"}) ] return genno.Quantity(tmp.set_index(dims)["value"]).pipe( unique_units_from_dim, dim="UNIT_MEASURE" ) - def transform(self, c: "Computer", base_key: genno.Key) -> genno.Key: + def transform(self, c: "Computer", base_key: "Key") -> "Key": k = super().transform(c, base_key) - if self.broadcast_map: - k_map = genno.Key(self.broadcast_map) + if self.options.broadcast_map: + k_map = Key(self.options.broadcast_map) rename = {k_map.dims[1]: k_map.dims[0]} - c.add(k + "0", "broadcast_map", k, self.broadcast_map, rename=rename) - k = k + "0" + c.add(k[0], "broadcast_map", k, k_map, rename=rename) + k = k[0] if self.weights: # TODO Add operations for computing a weighted mean - pass + raise NotImplementedError - if self.plot: + if self.options.plot: # Path for debug output context: "Context" = c.graph["context"] debug_path = context.get_local_path("debug") debug_path.mkdir(parents=True, exist_ok=True) c.configure(output_dir=debug_path) - c.add(f"plot {self.id} debug", Plot, k) + c.add(f"plot {type(self).__name__} debug", Plot, k) return k diff --git a/message_ix_models/tools/iea/web.py b/message_ix_models/tools/iea/web.py index 4d35a89d2f..1278bcc4ff 100644 --- a/message_ix_models/tools/iea/web.py +++ b/message_ix_models/tools/iea/web.py @@ -2,8 +2,8 @@ import logging import zipfile -from collections.abc import Iterable -from copy import copy +from collections.abc import Hashable, Iterable, Mapping +from dataclasses import dataclass from enum import Flag from pathlib import Path from typing import TYPE_CHECKING, Any, Literal, Optional, Union @@ -15,7 +15,7 @@ from platformdirs import user_cache_path from message_ix_models.model.structure import get_codelist -from message_ix_models.tools.exo_data import ExoDataSource, register_source +from message_ix_models.tools.exo_data import BaseOptions, ExoDataSource, register_source from message_ix_models.util import ( cached, minimum_version, @@ -28,7 +28,7 @@ import os import genno - from genno.types import TQuantity + from genno.types import AnyQuantity, TQuantity from message_ix_models.util.common import MappingAdapter @@ -151,98 +151,90 @@ def is_valid(self, *, fail: Literal["log", "raise"] = "raise") -> bool: @register_source class IEA_EWEB(ExoDataSource): - """Provider of exogenous data from the IEA Extended World Energy Balances. - - To use data from this source, call :func:`.exo_data.prepare_computer` with the - following `source_kw`: - - - :py:`provider`: Either 'IEA' or 'OECD'. See :data:`.FILES`. - - :py:`edition`: one of '2021', '2022', or '2023'. See :data:`.FILES`. - - :py:`product` (optional): :class:`str` or :class:`list` of :class:`str`. Select - only these labels from the 'PRODUCT' dimension. - - :py:`flow` (optional): :class:`str` or :class:`list` of :class:`str`. Select only - these labels from the 'FLOW' dimension. - - :py:`transform` (optional): either "A" (default) or "B". See :meth:`.transform`. - - :py:`regions`: **must** also be given with the value :py:`"R12"` if giving - :py:`transform="B"`. - - Example - ------- - >>> keys = prepare_computer( - ... context, - ... computer, - ... source="IEA_EWEB", - ... source_kw=dict( - ... provider="OECD", edition="2022", product="CHARCOAL", flow="RESIDENT" - ... ), - ... ) - >>> result = computer.get(keys[0]) - """ + """Provider of exogenous data from the IEA Extended World Energy Balances.""" + + @dataclass + class Options(BaseOptions): + #: Either 'IEA' or 'OECD'. See :data:`.FILES`. + provider: str = "" + + #: one of '2021', '2022', or '2023'. See :data:`.FILES`. + edition: str = "" + + #: Select only these labels from the 'PRODUCT' dimension. + product: Union[str, list[str]] = "" - id = "IEA_EWEB" + #: Select only these labels from the 'FLOW' dimension. + flow: Union[str, list[str]] = "" + + #: Either "A" (default) or "B". See :meth:`.transform`. + transform: TRANSFORM = TRANSFORM.DEFAULT + + #: **Must** also be given with the value :py:`"R12"` if giving + #: :py:`transform="B"`. + regions: str = "" + + options: Options key = Key("energy:n-y-product-flow:iea") where = ["local"] - def __init__(self, source, source_kw): - """Initialize the data source.""" - if source != self.id: - raise ValueError(source) - - _kw = copy(source_kw) + def __init__(self, *args, **kwargs): + self.options = self.Options.from_args("IEA_EWEB", *args, **kwargs) - p = self.provider = _kw.pop("provider", None) - e = self.edition = _kw.pop("edition", None) + # Identify the files to be loaded + p, e = self.options.provider, self.options.edition try: files = FILES[(p, e)] except KeyError: raise ValueError(f"No IEA data files for (provider={p!r}, edition={e!r})") + # Identify a path that contains the files for the given (provider, edition) + # Parent directory relative to which `files` are found + self.path = dir_fallback("iea", files[0], where=self._where()) + self.indexers = dict(MEASURE="TJ") - if product := _kw.pop("product", None): - self.indexers.update(product=product) - if flow := _kw.pop("flow", None): - self.indexers.update(flow=flow) + if self.options.product: + self.indexers.update(product=self.options.product) + if self.options.flow: + self.indexers.update(flow=self.options.flow) - # Handle the 'transform' keyword - self.transform_method = TRANSFORM.from_value(_kw.pop("transform", None)) + # Handle the 'transform' option + self.transform_method = TRANSFORM.from_value(self.options.transform) - regions = _kw.pop("regions", None) if self.transform_method & TRANSFORM.B: msg = "TRANSFORM.B only supported for " if (p, e) != ("IEA", "2024"): raise ValueError( f"{msg}(provider='IEA', edition='2024'); got {(p, e)!r}" ) - elif regions != "R12": - raise ValueError(f"{msg}regions='R12'; got {regions!r}") + elif self.options.regions != "R12": + raise ValueError(f"{msg}regions='R12'; got {self.options.regions!r}") - self.raise_on_extra_kw(_kw) - - # Identify a location that contains the files for the given (provider, edition) - # Parent directory relative to which `files` are found - self.path = dir_fallback("iea", files[0], where=self._where()) - - def __call__(self): + def get(self) -> "AnyQuantity": """Load and process the data.""" # - Load the data. # - Convert to pd.Series, then genno.Quantity. # - Map dimensions. # - Apply `indexers` to select. + opt = self.options + load_kw = dict(provider=opt.provider, edition=opt.edition, path=self.path) + rename: Mapping[Hashable, Hashable] = { + "COUNTRY": "n", + "TIME": "y", + "FLOW": "flow", + "PRODUCT": "product", + } + return ( - genno.Quantity( - load_data( - provider=self.provider, edition=self.edition, path=self.path - ).set_index(DIMS)["Value"], - units="TJ", - ) - .rename({"COUNTRY": "n", "TIME": "y", "FLOW": "flow", "PRODUCT": "product"}) + genno.Quantity(load_data(**load_kw).set_index(DIMS)["Value"], units="TJ") + .rename(rename) .sel(self.indexers, drop=True) ) @minimum_version("genno 1.28") - def transform(self, c: "genno.Computer", base_key: "genno.Key") -> "genno.Key": + def transform(self, c: "genno.Computer", base_key: "Key") -> "Key": """Prepare `c` to transform raw data from `base_key`. 1. Map IEA ``COUNTRY`` codes to ISO 3166-1 alpha-3 codes, where such mapping @@ -263,21 +255,21 @@ def transform(self, c: "genno.Computer", base_key: "genno.Key") -> "genno.Key": This method does *not* prepare interpolation or aggregation on |y|. """ # Map values like RUSSIA appearing in the (IEA, 2024) edition to e.g. RUS - adapter = get_mapping(self.provider, self.edition) + adapter = get_mapping(self.options.provider, self.options.edition) k, result = base_key, base_key["agg"] c.add(k[0], adapter, k) if self.transform_method & TRANSFORM.A: # Key for aggregation groups: hierarchy from the standard code lists, # already added by .exo_data.prepare_computer() - k_n_agg = Key("n", (), "groups") + k_n_agg = Key("n::groups") c.add(k[1], k[0]) elif self.transform_method & TRANSFORM.B: # Derive intermediate values "_IIASA_{AFR,PAS,SAS}" c.add(k[1], transform_B, k[0]) # Add groups for aggregation, including these intermediate values - k_n_agg = Key("n", (), f"groups+{self.id}") + k_n_agg = Key("n::groups+IEA_EWEB") c.add(k_n_agg, get_node_groups_B) if self.transform_method & TRANSFORM.C: @@ -285,6 +277,7 @@ def transform(self, c: "genno.Computer", base_key: "genno.Key") -> "genno.Key": # Aggregate on 'n' dimension using the `k_n_agg` c.add(result, "aggregate", k.last, k_n_agg, keep=False) + return result diff --git a/message_ix_models/tools/policy.py b/message_ix_models/tools/policy.py new file mode 100644 index 0000000000..ad0d4e9df4 --- /dev/null +++ b/message_ix_models/tools/policy.py @@ -0,0 +1,43 @@ +"""Policies.""" + +from abc import ABC +from collections.abc import Collection +from typing import TYPE_CHECKING, Optional, cast + +if TYPE_CHECKING: + from typing import TypeVar + + T = TypeVar("T", bound="Policy") + + +class Policy(ABC): + """Base class for policies. + + This class has no attributes or public methods. Other modules in + :mod:`message_ix_models`: + + - **should** subclass Policy to represent different kinds of policy. + - **may** add attributes, methods, etc. to aid with the *implementation* of those + policies in concrete scenarios. + - in contrast, **may** use minimal subclasses as mere flags to be interpreted by + other code. + + The default implementation of :func:`hash` returns a value the same for every + instance of a subclass. This means that two instances of the same subclass hash + equal. See :attr:`.Config.policy`. + """ + + def __hash__(self) -> int: + return hash(type(self)) + + +def single_policy_of_type( + collection: Collection[Policy], cls: type["T"] +) -> Optional["T"]: + """Return a single member of `collection` of type `cls`.""" + if matches := list(filter(lambda p: isinstance(p, cls), collection)): + if len(matches) > 1: + raise ValueError(f"Ambiguous: {len(matches)} instance of {cls}") + return cast("T", matches[0]) + + return None diff --git a/message_ix_models/util/sdmx.py b/message_ix_models/util/sdmx.py index 5cf8291314..bdefd27b17 100644 --- a/message_ix_models/util/sdmx.py +++ b/message_ix_models/util/sdmx.py @@ -5,11 +5,14 @@ from collections.abc import Iterable, Mapping from dataclasses import dataclass, fields from datetime import datetime -from enum import Enum, Flag +from enum import Enum, Flag, auto + +# TODO Remove when Python 3.10 is no longer supported +from enum import EnumMeta as EnumType from functools import cache from importlib.metadata import version from pathlib import Path -from typing import TYPE_CHECKING, Optional, Union, cast +from typing import TYPE_CHECKING, Generic, Optional, TypeVar, Union, cast from warnings import warn import sdmx @@ -25,7 +28,6 @@ if TYPE_CHECKING: from os import PathLike - from typing import TypeVar import pint from genno import Computer, Key @@ -36,11 +38,11 @@ # TODO Use "from typing import Self" once Python 3.11 is the minimum supported Self = TypeVar("Self", bound="AnnotationsMixIn") + log = logging.getLogger(__name__) CodeLike = Union[str, common.Code] - #: Collection of :class:`.Dataflow` instances. DATAFLOW: dict[str, "Dataflow"] = {} @@ -76,12 +78,14 @@ def get_annotations(self, _rtype: Union[type[list], type[dict]]): return dict(annotations=result) @classmethod - def from_obj(cls: type["Self"], obj: common.AnnotableArtefact) -> "Self": + def from_obj( + cls: type["Self"], obj: common.AnnotableArtefact, globals: Optional[dict] = None + ) -> "Self": """Return a new instance of `cls` given an AnnotableArtefact `obj`.""" args = [] for f in fields(cls): anno_id = f.name.replace("_", "-") - args.append(obj.eval_annotation(id=anno_id)) + args.append(obj.eval_annotation(id=anno_id, globals=globals)) return cls(*args) @@ -399,19 +403,76 @@ def generate_csv_template(self) -> Path: # template = -class URNLookupEnum(Enum): - """:class:`.Enum` subclass that allows looking up members using a URN.""" +T = TypeVar("T", bound=Enum) - _ignore_ = "_urn_name" - _urn_name: dict - def __init_subclass__(cls): - cls._urn_name = dict() +# TODO Replace with URNLookupMixin[T] once Python 3.10 is no longer supported +class URNLookupMixin(Generic[T]): + name: str + _member_map_: dict[str, T] + _urn_name: dict[str, str] @classmethod - def by_urn(cls, urn: str): + def by_urn(cls, urn: str) -> T: """Return the :class:`.Enum` member given its `urn`.""" - return cls[cls.__dict__["_urn_name"][urn]] + return cls._member_map_[cls._urn_name[urn]] + + @property + def urn(self) -> str: + """Return the URN for an Enum member.""" + for result, name in self._urn_name.items(): + if name == self.name: + break + return result + + +class URNLookupEnum(URNLookupMixin, Enum): + """Class constructed by ItemSchemeEnumType.""" + + +class ItemSchemeEnumType(EnumType): + @classmethod + def __prepare__(metacls, cls, bases, **kwgs): + return {} + + def __init__(cls, *args, **kwds): + super(ItemSchemeEnumType, cls).__init__(*args) + + def __new__(metacls, cls, bases, dct, **kwargs) -> type["URNLookupEnum"]: + # Retrieve the item scheme + scheme = dct.pop("_get_item_scheme")(None) + if not isinstance(scheme, common.ItemScheme): + raise RuntimeError( + f"Callback for {cls} returned {scheme}; expected ItemScheme" + ) + + # Prepare the EnumDict for creating the class + enum_dct = super(ItemSchemeEnumType, metacls).__prepare__(cls, bases, **kwargs) + # Transfer class dct private members + enum_dct.update(dct) + + # Populate the class member dictionary and URN → member name mapping + _urn_name = dict() + + if any(issubclass(c, Flag) for c in bases): + # Ensure the 0 member is NONE, not any of the codes + enum_dct["NONE"] = 0 + for i, item in enumerate(scheme, start=1): + _urn_name[item.urn] = item.id + enum_dct[item.id] = auto() + + # Create the class + enum_class = cast( + type["URNLookupEnum"], + super(ItemSchemeEnumType, metacls).__new__( + metacls, cls, bases, enum_dct, **kwargs + ), + ) + + # Store the _urn_name mapping + setattr(enum_class, "_urn_name", _urn_name) + + return enum_class # FIXME Reduce complexity from 13 → ≤11 @@ -712,26 +773,6 @@ def get_version(with_dev: Optional[bool] = True) -> str: return str(common.Version(tmp)) -def make_enum(urn, base=URNLookupEnum): - """Create an :class:`.enum.Enum` (or `base`) with members from codelist `urn`.""" - # Read the code list - cl = read(urn) - - # Ensure the 0 member is NONE, not any of the codes - names = ["NONE"] if issubclass(base, Flag) else [] - names.extend(code.id for code in cl) - - # Create the class - result = base(urn, names) - - if issubclass(base, URNLookupEnum): - # Populate the URN → member name mapping - for code in cl: - result._urn_name[code.urn] = code.id - - return result - - def read(urn: str, base_dir: Optional["PathLike"] = None): """Read SDMX object from package data given its `urn`.""" # Identify a path that matches `urn` @@ -803,6 +844,9 @@ def register_agency(agency: "common.Agency") -> "common.AgencyScheme": else: as_.append(agency) + # Ensure URN is populated + agency.urn = agency.urn or sdmx.urn.make(agency, as_) + log.info(f"Updated {as_!r}") # Write to file again diff --git a/pyproject.toml b/pyproject.toml index 5d356d2ee8..aa2a008db7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -72,13 +72,15 @@ migrate = [ ] report = ["plotnine", "xlsxwriter"] tests = [ - "ixmp[tests]", # TODO Remove once message_ix[tests] depends on ixmp[tests] "message-ix[tests]", "message_ix_models[buildings,material,report,transport]", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", + # On RTD, pip tries to build this version from .tar.gz, but + # it contains packaging errors that cause the job to error. + "gamsapi > 47.6.0", ] transport = [ "message-ix-models[iea-web,report]",