Pumps in the LtmApi

The modelling of pumps in the LtmApi is defined by the Pump object.

Pumps example

This example shows how to use pumps in a simulation. A sketch of the system is shown below. The simulation period is from week 20 in 2023 to week 1 2026 and the historical period is 8 years from 2000 - 2007.

The system contains two areas, TEV and pumpekraft. The interconnection between them has a capacity of 200 MW in both directions. The hydropower is located in the pumpekraft area. It contains two pumps, one pump and one pumped power plant, four reservoirs and one hydropower plants.

Pump pump1_upper pumps from rsv_pump_1 to upper_main. The pumps average power is 150 MW.

The pumped hydropower plant extra_plant is a hybrid hydropower plant and a pump. It can reverse the turbines to pump water from lower_main to extra_rsv. The average power is 150 MW at mean pumping head. The pump head is in the range [100, 110] m with corresponding pumping discharge [50, 47] m3/s.

Pumping from the lower reservoir is allowed when the reservoir volume is greater than 5 Mm3 and pumping to the upper reservoir is allowed when the reservoir volume is below 450 Mm3. The upper_reservoir_reference_curve is at 450 Mm3 from week 17-40-50 2023 and the lower_reservoir_reference_curve 5 Mm3 from week 17-40-50 2023.

The attribute average_spill_energy_equivalent on the object Reservoir needs to be set with a resonable value to get resonable pumping results. Be sure to compare it to the discharge_energy_equivalent on the object Plant.

pump_capacity:
  • x -> [maximum pump head, minimum pump head] (m)

  • y -> [pump discharge at highest pumped head, pump discharge at lowest pumped head] (m3/s)

Detailed topology with pumps
"pumps": [
   {
         "name": "pump1_upper",
         "ownership": 100,
         "average_power": 150,
         "pump_capacity": {
            "x": [
               100,
               110
            ],
            "y": [
               47,
               50
            ]
         },
         "upper_reservoir_reference_curve": {
            "timestamps": [
               "2023-W17",
               "2023-W40",
               "2023-W50"
            ],
            "scenarios": [
               [
                     450,
                     450,
                     450
               ]
            ]
         },
         "lower_reservoir_reference_curve": {
            "timestamps": [
               "2023-W17",
               "2023-W40",
               "2023-W50"
            ],
            "scenarios": [
               [
                     5,
                     5,
                     5
               ]
            ]
         },
         "unavailable_capacity": {
            "timestamps": [
               "2023-01-02T00:00:00Z",
               "2023-04-02T00:00:00Z",
               "2024-12-01T00:00:00Z"
            ],
            "scenarios": [
               [
                     0,
                     130,
                     130
               ]
            ]
         }
   },
   {
         "name": "extra_pump",
         "ownership": 100,
         "average_power": 150,
         "pump_capacity": {
            "x": [
               100,
               110
            ],
            "y": [
               47,
               50
            ]
         },
         "upper_reservoir_reference_curve": {
            "timestamps": [
               "2023-W17",
               "2023-W40",
               "2023-W50"
            ],
            "scenarios": [
               [
                     1450,
                     1400,
                     1000
               ]
            ]
         },
         "lower_reservoir_reference_curve": {
            "timestamps": [
               "2023-W17",
               "2023-W40",
               "2023-W50"
            ],
            "scenarios": [
               [
                     5,
                     5,
                     5
               ]
            ]
         },
         "unavailable_capacity_": {
            "timestamps": [
               "2023-01-02T00:00:00Z",
               "2023-04-02T00:00:00Z",
               "2023-06-02T00:00:00Z",
               "2024-06-01T00:00:00Z",
               "2024-12-01T00:00:00Z"
            ],
            "scenarios": [
               [
                     0,
                     25,
                     0,
                     50,
                     75
               ]
            ]
         }
   }
],

The link below takes you to a (static) notebook where LTM-API have been run with a simple topology with pumps.

Expand to see full JSON listings.
  1{
  2    "$schema": "https://gitlab.sintef.no/energy/ltm/pyltmapi/-/raw/main/model.schema.json",
  3    "model": {
  4        "global_settings": {
  5            "name": "global_settings",
  6            "output_path": "testout_pumps/",
  7            "default_spill_cost": 0.01,
  8            "delete_output_dir": false,
  9            "default_load_penalty": 900.0,
 10            "generate_output_dir": true,
 11            "allow_validation_failures": false,
 12            "interest_rate": 4.42,
 13            "simulation_period": {
 14                "timestamps": [
 15                    "2023-W20",
 16                    "2026-W01"
 17                ]
 18            },
 19            "historical_type": "civillian",
 20            "historical_period": {
 21                "timestamps": [
 22                    "2000-01-01T00:00:00Z",
 23                    "2008-01-01T00:00:00Z"
 24                ]
 25            },
 26            "timesteps_per_week": 168
 27        },
 28        "dclines": [
 29            {
 30                "#comment": "",
 31                "name": "PUMPE_TEV_DC",
 32                "forward_capacity": {
 33                    "scenarios": [
 34                        [
 35                            200
 36                        ]
 37                    ]
 38                },
 39                "backward_capacity": {
 40                    "timestamps": [
 41                        "2023-01-02T00:00:00Z",
 42                        "2023-02-02T00:00:00Z",
 43                        "2023-03-02T00:00:00Z",
 44                        "2023-04-02T00:00:00Z",
 45                        "2023-05-02T00:00:00Z",
 46                        "2023-06-02T00:00:00Z",
 47                        "2023-07-02T00:00:00Z",
 48                        "2023-08-02T00:00:00Z",
 49                        "2023-09-02T00:00:00Z",
 50                        "2023-10-02T00:00:00Z",
 51                        "2023-11-02T00:00:00Z"
 52                    ],
 53                    "scenarios": [
 54                        [
 55                            100.0,
 56                            110.0,
 57                            120.0,
 58                            130.0,
 59                            140.0,
 60                            150.0,
 61                            160.0,
 62                            170.0,
 63                            180.0,
 64                            190.0,
 65                            200.0
 66                        ]
 67                    ]
 68                },
 69                "loss_percentage": 2.0,
 70                "forward_cost": 2.0,
 71                "backward_cost": 1.0
 72            }
 73        ],
 74        "market_steps": [
 75            {
 76                "name": "market_step",
 77                "price": {
 78                    "timestamps": [
 79                        "2023-01-01T00:00:00Z",
 80                        "2024-01-01T00:00:00Z"
 81                    ],
 82                    "scenarios": [
 83                        [
 84                            260,
 85                            200
 86                        ]
 87                    ]
 88                },
 89                "capacity": {
 90                    "timestamps": [
 91                        "2023-01-01T00:00:00Z"
 92                    ],
 93                    "scenarios": [
 94                        [
 95                            150
 96                        ]
 97                    ]
 98                }
 99            }
100        ],
101        "loads": [
102            {
103                "#comment": "Gruppe 16",
104                "name": "FLAT",
105                "capacity": {
106                    "timestamps": [
107                        "2023-01-01T00:00:00Z"
108                    ],
109                    "scenarios": [
110                        [
111                            100
112                        ]
113                    ]
114                }
115            },
116            {
117                "#comment": "Gruppe 16",
118                "name": "FLAT2",
119                "capacity": {
120                    "timestamps": [
121                        "2023-01-01T00:00:00Z"
122                    ],
123                    "scenarios": [
124                        [
125                            150
126                        ]
127                    ]
128                }
129            }
130        ],
131        "busbars": [
132            {
133                "name": "pumpekraft"
134            },
135            {
136                "name": "tev"
137            }
138        ],
139        "market_calibration_areas": [
140            {
141                "name": "calibration_area"
142            }
143        ],
144        "price_series": [],
145        "inflow_series": [
146            {
147                "name": "small",
148                "series": {
149                    "timestamps": [
150                        "1900-01-01T00:00:00Z"
151                    ],
152                    "scenarios": [
153                        [
154                            0.001
155                        ]
156                    ]
157                }
158            },
159            {
160                "name": "ten",
161                "series": {
162                    "timestamps": [
163                        "1900-01-01T00:00:00Z"
164                    ],
165                    "scenarios": [
166                        [
167                            10.0
168                        ]
169                    ]
170                }
171            },
172            {
173                "name": "after_one_year",
174                "series": {
175                    "external_reference": {
176                        "type": "hdf5",
177                        "path": "/inflow/tannsvatn",
178                        "filename": "inflow.h5"
179                    }
180                },
181                "forecast": {
182                    "external_reference": {
183                        "type": "hdf5",
184                        "path": "/inflow/tannsvatn",
185                        "filename": "inflow.h5"
186                    }
187                },
188                "forecast_period": {
189                    "timestamps": [
190                        "2023-W25",
191                        "2024-W45"
192                    ],
193                    "scenarios": [
194                        [
195                            1,
196                            0
197                        ]
198                    ]
199                }
200            },
201            {
202                "name": "aamot",
203                "series": {
204                    "external_reference": {
205                        "type": "hdf5",
206                        "path": "/inflow/aamot",
207                        "filename": "inflow.h5"
208                    }
209                },
210                "forecast": {
211                    "timestamps": [
212                        "1931-W01"
213                    ],
214                    "scenarios": [
215                        [
216                            500
217                        ]
218                    ]
219                }
220            },
221            {
222                "name": "aamot2",
223                "series": {
224                    "external_reference": {
225                        "type": "hdf5",
226                        "path": "/inflow/aamot",
227                        "filename": "inflow.h5"
228                    }
229                }
230            },
231            {
232                "name": "dyrdalsvatn",
233                "series": {
234                    "external_reference": {
235                        "type": "hdf5",
236                        "path": "/inflow/dyrdalsvatn",
237                        "filename": "inflow.h5"
238                    }
239                }
240            },
241            {
242                "name": "krinsvatn",
243                "series": {
244                    "external_reference": {
245                        "type": "hdf5",
246                        "path": "/inflow/krinsvatn",
247                        "filename": "inflow.h5"
248                    }
249                }
250            },
251            {
252                "name": "tannsvatn",
253                "series": {
254                    "external_reference": {
255                        "type": "hdf5",
256                        "path": "/inflow/tannsvatn",
257                        "filename": "inflow.h5"
258                    }
259                },
260                "forecast": {
261                    "timestamps": [
262                        "1931-W01"
263                    ],
264                    "scenarios": [
265                        [
266                            10000
267                        ]
268                    ]
269                },
270                "forecast_period": {
271                    "timestamps": [
272                        "2023-W20",
273                        "2023-W30"
274                    ],
275                    "scenarios": [
276                        [
277                            1,
278                            0
279                        ]
280                    ]
281                }
282            }
283        ],
284        "reservoirs": [
285            {
286                "name": "upper_main",
287                "average_spill_energy_equivalent": 2.79,
288                "degree_of_regulation": 3,
289                "regulated_inflow_name": "ten",
290                "average_regulated_inflow": 0,
291                "max_discharge": 70.30,
292                "reference_curve": {
293                    "timestamps": [
294                        "2023-W17",
295                        "2023-W40",
296                        "2023-W50"
297                    ],
298                    "scenarios": [
299                        [
300                            200,
301                            450,
302                            350
303                        ]
304                    ]
305                },
306                "initial_volume": 400,
307                "volume_curve": {
308                    "x": [
309                        1125.20,
310                        1129.20
311                    ],
312                    "y": [
313                        0,
314                        500
315                    ]
316                }
317            },
318            {
319                "name": "extra_rsv",
320                "average_spill_energy_equivalent": 0.8,
321                "degree_of_regulation": 1,
322                "regulated_inflow_name": "ten",
323                "average_regulated_inflow": 1.0,
324                "max_discharge": 170.30,
325                "reference_curve": {
326                    "timestamps": [
327                        "2023-W01"
328                    ],
329                    "scenarios": [
330                        [
331                            500
332                        ]
333                    ]
334                },
335                "initial_volume": 750,
336                "volume_curve": {
337                    "x": [
338                        600,
339                        630
340                    ],
341                    "y": [
342                        0,
343                        1500
344                    ]
345                }
346            },
347            {
348                "name": "lower_main",
349                "average_spill_energy_equivalent": 1.0,
350                "degree_of_regulation": 1,
351                "regulated_inflow_name": "ten",
352                "average_regulated_inflow": 0.0,
353                "max_discharge": 100.0,
354                "reference_curve": {
355                    "timestamps": [
356                        "2023-W01"
357                    ],
358                    "scenarios": [
359                        [
360                            30.0
361                        ]
362                    ]
363                },
364                "initial_volume": 1,
365                "volume_curve": {
366                    "x": [
367                        45,
368                        50
369                    ],
370                    "y": [
371                        0,
372                        45
373                    ]
374                },
375                "tailrace_elevation": 40.0,
376                "gross_head": 3
377            },
378            {
379                "name": "rsv_pump_1",
380                "average_spill_energy_equivalent": 1.0,
381                "degree_of_regulation": 3,
382                "regulated_inflow_name": "after_one_year",
383                "average_regulated_inflow": 20,
384                "max_discharge": 45,
385                "reference_curve": {
386                    "timestamps": [
387                        "2023-W01"
388                    ],
389                    "scenarios": [
390                        [
391                            30.0
392                        ]
393                    ]
394                },
395                "initial_volume": 200,
396                "volume_curve": {
397                    "x": [
398                        1000,
399                        1050
400                    ],
401                    "y": [
402                        0,
403                        250
404                    ]
405                },
406                "tailrace_elevation": 1000.0,
407                "gross_head": 50
408            }
409        ],
410        "plants": [
411            {
412                "name": "plant",
413                "ownership": 100,
414                "discharge_energy_equivalent": {
415                    "timestamps": [
416                        "2023-W01"
417                    ],
418                    "scenarios": [
419                        [
420                            2.7900
421                        ]
422                    ]
423                },
424                "pq_curves": {
425                    "2023-01-02T00:00:00Z": {
426                        "x": [
427                            0.0,
428                            70.30
429                        ],
430                        "y": [
431                            0.0,
432                            200.0
433                        ]
434                    }
435                },
436                "unregulated_inflow_name": "small",
437                "average_unregulated_inflow": 0.0,
438                "tailrace_elevation": 50.0,
439                "gross_head": 900.0,
440                "unavailable_capacity": {
441                    "timestamps": [
442                        "2023-01-02T00:00:00Z",
443                        "2024-06-01T00:00:00Z",
444                        "2024-12-01T00:00:00Z"
445                    ],
446                    "scenarios": [
447                        [
448                            170,
449                            150,
450                            0
451                        ]
452                    ]
453                }
454            },
455            {
456                "name": "extra_plant",
457                "ownership": 100,
458                "discharge_energy_equivalent": {
459                    "timestamps": [
460                        "W01"
461                    ],
462                    "scenarios": [
463                        [
464                            0.7900
465                        ]
466                    ]
467                },
468                "pq_curves": {
469                    "W01": {
470                        "x": [
471                            0.0,
472                            100.0
473                        ],
474                        "y": [
475                            0.0,
476                            100.0
477                        ]
478                    },
479                    "W20": {
480                        "x": [
481                            0.0,
482                            170.0
483                        ],
484                        "y": [
485                            0.0,
486                            150.0
487                        ]
488                    },
489                    "W40": {
490                        "x": [
491                            0.0,
492                            90.30
493                        ],
494                        "y": [
495                            0.0,
496                            90.0
497                        ]
498                    }
499                },
500                "unregulated_inflow_name": "small",
501                "average_unregulated_inflow": 0.0,
502                "tailrace_elevation": 150.0,
503                "gross_head": 450.0,
504                "unavailable_capacity": {
505                    "timestamps": [
506                        "2023-01-02T00:00:00Z",
507                        "2023-02-02T00:00:00Z",
508                        "2024-06-01T00:00:00Z",
509                        "2024-12-01T00:00:00Z"
510                    ],
511                    "scenarios": [
512                        [
513                            130,
514                            100,
515                            50,
516                            0
517                        ]
518                    ]
519                }
520            }
521        ],
522        "pumps": [
523            {
524                "name": "pump1_upper",
525                "ownership": 100,
526                "average_power": 150,
527                "pump_capacity": {
528                    "x": [
529                        110,
530                        100
531                    ],
532                    "y": [
533                        47,
534                        150
535                    ]
536                },
537                "upper_reservoir_reference_curve": {
538                    "name": "pump1_upper_high_refcurve",
539                    "timestamps": [
540                        "2023-W20",
541                        "2023-W40",
542                        "2023-W50"
543                    ],
544                    "scenarios": [
545                        [
546                            200,
547                            200,
548                            200
549                        ]
550                    ]
551                },
552                "lower_reservoir_reference_curve": {
553                    "name": "pump1_upper_low_refcurve",
554                    "timestamps": [
555                        "2023-W20",
556                        "2023-W40",
557                        "2023-W50"
558                    ],
559                    "scenarios": [
560                        [
561                            5,
562                            5,
563                            5
564                        ]
565                    ]
566                },
567                "unavailable_capacity": {
568                    "timestamps": [
569                        "2023-01-02T00:00:00Z",
570                        "2023-04-02T00:00:00Z",
571                        "2024-12-01T00:00:00Z"
572                    ],
573                    "scenarios": [
574                        [
575                            0,
576                            130,
577                            130
578                        ]
579                    ]
580                }
581            },
582            {
583                "name": "extra_pump_æøå",
584                "ownership": 100,
585                "average_power": 150,
586                "pump_capacity": {
587                    "x": [
588                        110,
589                        100
590                    ],
591                    "y": [
592                        47,
593                        150
594                    ]
595                },
596                "upper_reservoir_reference_curve": {
597                    "timestamps": [
598                        "2023-W17",
599                        "2023-W40",
600                        "2023-W50"
601                    ],
602                    "scenarios": [
603                        [
604                            1450,
605                            1400,
606                            1000
607                        ]
608                    ]
609                },
610                "lower_reservoir_reference_curve": {
611                    "timestamps": [
612                        "2023-W17",
613                        "2023-W40",
614                        "2023-W50"
615                    ],
616                    "scenarios": [
617                        [
618                            5,
619                            5,
620                            5
621                        ]
622                    ]
623                },
624                "unavailable_capacity_": {
625                    "timestamps": [
626                        "2023-01-02T00:00:00Z",
627                        "2023-04-02T00:00:00Z",
628                        "2023-06-02T00:00:00Z",
629                        "2024-06-01T00:00:00Z",
630                        "2024-12-01T00:00:00Z"
631                    ],
632                    "scenarios": [
633                        [
634                            0,
635                            25,
636                            0,
637                            50,
638                            75
639                        ]
640                    ]
641                }
642            }
643        ],
644        "wind": [
645            {
646                "name": "WIND_TEST_01",
647                "capacity": {
648                    "timestamps": [
649                        "1981-01-01T00:00:00Z",
650                        "1981-01-03T00:00:00Z"
651                    ],
652                    "scenarios": [
653                        [
654                            0.1,
655                            0.1
656                        ],
657                        [
658                            0.2,
659                            0.2
660                        ],
661                        [
662                            0.3,
663                            0.3
664                        ],
665                        [
666                            0.4,
667                            0.4
668                        ],
669                        [
670                            0.5,
671                            0.5
672                        ],
673                        [
674                            0.6,
675                            0.6
676                        ],
677                        [
678                            0.7,
679                            0.7
680                        ],
681                        [
682                            0.8,
683                            0.8
684                        ]
685                    ]
686                }
687            }
688        ],
689        "connections": [
690            {
691                "from": "WIND_TEST_01",
692                "to": "tev"
693            },
694            {
695                "from": "pumpekraft",
696                "to": "PUMPE_TEV_DC"
697            },
698            {
699                "from": "market_step",
700                "to": "pumpekraft"
701            },
702            {
703                "from": "PUMPE_TEV_DC",
704                "to": "tev"
705            },
706            {
707                "from": "FLAT",
708                "to": "pumpekraft"
709            },
710            {
711                "from": "FLAT2",
712                "to": "tev"
713            },
714            {
715                "from": "upper_main",
716                "to": "pumpekraft"
717            },
718            {
719                "from": "upper_main",
720                "to": "plant"
721            },
722            {
723                "from": "plant",
724                "to": "lower_main"
725            },
726            {
727                "from": "rsv_pump_1",
728                "to": "pumpekraft"
729            },
730            {
731                "from": "rsv_pump_1",
732                "to": "pump1_upper"
733            },
734            {
735                "from": "pump1_upper",
736                "to": "upper_main"
737            },
738            {
739                "from": "extra_rsv",
740                "to": "extra_plant"
741            },
742            {
743                "from": "extra_plant",
744                "to": "lower_main"
745            },
746            {
747                "from": "extra_pump_æøå",
748                "to": "extra_plant"
749            },
750            {
751                "from": "pumpekraft",
752                "to": "calibration_area"
753            },
754            {
755                "from": "tev",
756                "to": "calibration_area"
757            }
758        ]
759    }
760}