quintel / merit

A system for calculating hourly electricity and heat loads with a merit order
MIT License
3 stars 2 forks source link

Do a test-run of the price convergence work-flow #115

Closed ChaelKruip closed 10 years ago

ChaelKruip commented 10 years ago

The following steps need to be taken:

ChaelKruip commented 10 years ago

Part of #104

antw commented 10 years ago

@ChaelKruip I have added an example to merit-convergence which shows how to load data for NL and DE and calculate the Merit Order accounting for import and export to Germany: examples/all_in_one.rb.

One limitation is that it can only have one price-driven (import) interconnect. The description in #105 says that this is acceptable; additional price-driven interconnects will require running the merit order once per interconnect. There is a better solution if you decide you want multiple interconnects in the future, but otherwise I'll leave it as is.

You can have as many load-driven (export) users as you want (for DEN, NOR, BE, etc), but of course you need to know the load curves ahead of time. This could have negative loads to simulate import.

Before including export to Germany @ Feb 12, 08:00

+---+------------------------------------------------+---------+----------+--------+
|   | Key                                            | % Used  | MWh Load | M.Cost |
+---+------------------------------------------------+---------+----------+--------+
| U | local_demand                                   |       - | 12003.00 |      - |
+---+------------------------------------------------+---------+----------+--------+
| A | energy_chp_supercritical_waste_mix             | 100.0 % |   386.42 |   0.00 |
| A | energy_power_wind_turbine_inland               | 100.0 % |   207.91 |   0.00 |
| A | energy_power_wind_turbine_offshore             | 100.0 % |    52.53 |   0.00 |
| A | energy_power_wind_turbine_coastal              | 100.0 % |    40.95 |   0.00 |
| A | energy_power_hydro_river                       | 100.0 % |    20.99 |   0.00 |
| A | households_solar_pv_solar_radiation            | 100.0 % |     3.67 |   0.00 |
| A | buildings_solar_pv_solar_radiation             | 100.0 % |     2.02 |   0.00 |
| A | energy_power_solar_pv_solar_radiation          | 100.0 % |     0.49 |   0.00 |
| A | energy_power_supercritical_waste_mix           | 100.0 % |    43.72 |   1.17 |
| A | agriculture_chp_engine_biogas                  | 100.0 % |    54.78 |  14.92 |
| A | buildings_chp_engine_biogas                    | 100.0 % |    45.38 |  14.92 |
| A | buildings_collective_chp_network_gas           | 100.0 % |    74.25 |  63.72 |
| A | industry_chp_combined_cycle_gas_power_fuelmix  | 100.0 % |   666.62 |  71.51 |
| A | industry_chp_engine_gas_power_fuelmix          | 100.0 % |     9.13 |  76.96 |
| A | industry_chp_turbine_gas_power_fuelmix         | 100.0 % |   237.43 |  79.47 |
+---+------------------------------------------------+---------+----------+--------+
| T | energy_power_nuclear_gen3_uranium_oxide        | 100.0 % |   475.19 |   4.84 |
| T | energy_power_combined_cycle_coal               | 100.0 % |   227.51 |  17.30 |
| T | energy_power_ultra_supercritical_coal          | 100.0 % |  1104.60 |  17.78 |
| T | energy_chp_ultra_supercritical_coal            | 100.0 % |   848.71 |  20.66 |
| T | energy_power_supercritical_coal                | 100.0 % |   559.37 |  22.49 |
| T | energy_power_combined_cycle_network_gas        | 100.0 % |  5427.63 |  41.83 |
| T | energy_power_ultra_supercritical_cofiring_coal | 100.0 % |   534.86 |  44.36 |
| T | energy_chp_ultra_supercritical_cofiring_coal   | 100.0 % |   644.94 |  50.61 |
| T | energy_chp_combined_cycle_network_gas          |   6.8 % |   333.90 |  59.09 |
| T | energy_power_ultra_supercritical_network_gas   |   0.0 % |     0.00 |  62.32 |
| T | energy_power_turbine_network_gas               |   0.0 % |     0.00 |  73.76 |
| T | import_from_de                                 |   0.0 % |     0.00 | 114.98 |
+---+------------------------------------------------+---------+----------+--------+

U = User, A = Always On, T = Transient

After including export to Germany @ Feb 12, 08:00

+---+------------------------------------------------+---------+----------+--------+
|   | Key                                            | % Used  | MWh Load | M.Cost |
+---+------------------------------------------------+---------+----------+--------+
| U | local_demand                                   |       - | 12003.00 |      - |
| U | export_to_de                                   |       - |  2449.00 |      - |
+---+------------------------------------------------+---------+----------+--------+
| A | energy_chp_supercritical_waste_mix             | 100.0 % |   386.42 |   0.00 |
| A | energy_power_wind_turbine_inland               | 100.0 % |   207.91 |   0.00 |
| A | energy_power_wind_turbine_offshore             | 100.0 % |    52.53 |   0.00 |
| A | energy_power_wind_turbine_coastal              | 100.0 % |    40.95 |   0.00 |
| A | energy_power_hydro_river                       | 100.0 % |    20.99 |   0.00 |
| A | households_solar_pv_solar_radiation            | 100.0 % |     3.67 |   0.00 |
| A | buildings_solar_pv_solar_radiation             | 100.0 % |     2.02 |   0.00 |
| A | energy_power_solar_pv_solar_radiation          | 100.0 % |     0.49 |   0.00 |
| A | energy_power_supercritical_waste_mix           | 100.0 % |    43.72 |   1.17 |
| A | agriculture_chp_engine_biogas                  | 100.0 % |    54.78 |  14.92 |
| A | buildings_chp_engine_biogas                    | 100.0 % |    45.38 |  14.92 |
| A | buildings_collective_chp_network_gas           | 100.0 % |    74.25 |  63.72 |
| A | industry_chp_combined_cycle_gas_power_fuelmix  | 100.0 % |   666.62 |  71.51 |
| A | industry_chp_engine_gas_power_fuelmix          | 100.0 % |     9.13 |  76.96 |
| A | industry_chp_turbine_gas_power_fuelmix         | 100.0 % |   237.43 |  79.47 |
+---+------------------------------------------------+---------+----------+--------+
| T | energy_power_nuclear_gen3_uranium_oxide        | 100.0 % |   475.19 |   4.84 |
| T | energy_power_combined_cycle_coal               | 100.0 % |   227.51 |  17.30 |
| T | energy_power_ultra_supercritical_coal          | 100.0 % |  1104.60 |  17.78 |
| T | energy_chp_ultra_supercritical_coal            | 100.0 % |   848.71 |  20.66 |
| T | energy_power_supercritical_coal                | 100.0 % |   559.37 |  22.49 |
| T | energy_power_combined_cycle_network_gas        | 100.0 % |  5427.63 |  41.83 |
| T | energy_power_ultra_supercritical_cofiring_coal | 100.0 % |   534.86 |  44.36 |
| T | energy_chp_ultra_supercritical_cofiring_coal   | 100.0 % |   644.94 |  50.61 |
| T | energy_chp_combined_cycle_network_gas          |  56.8 % |  2782.90 |  59.09 |
| T | energy_power_ultra_supercritical_network_gas   |   0.0 % |     0.00 |  62.32 |
| T | energy_power_turbine_network_gas               |   0.0 % |     0.00 |  73.76 |
| T | import_from_de                                 |   0.0 % |     0.00 | 114.98 |
+---+------------------------------------------------+---------+----------+--------+

U = User, A = Always On, T = Transient
ChaelKruip commented 10 years ago

One limitation is that it can only have one price-driven (import) interconnect.

For this project that is sufficient indeed.

ChaelKruip commented 10 years ago

@antw thanks for the example. I assume you have 'made up' an export curve for DE? And how did you choose the marginal cost of import_from_de? Did you choose it to be higher than the other dispatchables (transients) on purpose?

antw commented 10 years ago

I assume you have 'made up' an export curve for DE?

The "Runner" does the two-step merit order run described in #112 to determine when import and export occur with Germany. Here's what the Runner does to produce that example:

  1. Create and calculate the Merit Order for the foreign country (DE) to determine it's price curve. Using this price curve, we can determine when NL will import from DE.
  2. Create the Merit Order for NL, add an import interconnect producer with Germany using the DE price curve, and calculate. The NL merit order will import from DE whenever it is competitive to do so. In the example above, it is not competitive to import from Germany. Here is another example for hour 1000 when Germany is significantly cheaper than NL.

    We now have a calculated Merit Order for NL which includes only demand from NL, with that demand supplied by both local production and import from Germany.

  3. Compare the price curves of both NL and DE. In any hour where Germany is more expensive than the Netherlands, it will import.
  4. Do a second run of the NL merit order, adding the demand from Germany which we calculated in step (3).

Does this sound right to you?

ChaelKruip commented 10 years ago

Do a second run of the NL merit order, adding the demand from Germany which we calculated in step (3).

I will take a good look at the code later but is it true that you calculate the demand of the German interconnector by checking which one of the following happens first:

Does this sound right to you?

If the answer to the previous question is 'yes' than: yes! :wink:

antw commented 10 years ago

German demand is satisfied (not expected)

Presently, no. It will use the full capacity of the interconnect regardless of whether Germany wants that much energy. I can fix this fairly easily...

Interconnector is fully used (expected to happen sometimes) Dutch capacity is completely used (expected to happen hardly ever)

Yes and yes.

Dutch price setting plant becomes more expensive then German price (expected to happen often)

Generally yes. The only exception might be if the price-setting plant uses a cost function; such a plant will be used for export if its mean marginal cost is less than the German price. It is possible that such a plant – when fully loaded – could end up costing more than the German price. Is that acceptable, or do we have to stop assigning load to that plant as soon as the load makes the cost uncompetitive (which is already the case for import)?

antw commented 10 years ago

Presently, no. It will use the full capacity of the interconnect regardless of whether Germany wants that much energy. I can fix this fairly easily...

Fixed as of quintel/merit-convergence@75a52125.

Here is a revised hour-1040 table where prices in Germany are higher than in the Netherlands. Now, however, Germany only receives 430.5 GW through the interconnect, as opposed to the full 2449.0. There's also a second table showing the DE loads and prices for that hour, which reveals why the interconnect is limited to 430.5 GW.

ChaelKruip commented 10 years ago

Is that acceptable, or do we have to stop assigning load to that plant as soon as the load makes the cost uncompetitive (which is already the case for import)?

I think it would be best to make that symmetrical and add the feature. Hope that is not too hard!

antw commented 10 years ago

I think it would be best to make that symmetrical

Implemented in quintel/merit-convergence@ec2df138.

ChaelKruip commented 10 years ago

Closing.