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_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                            70,
 85                            100
 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                "name": "export",
102                "price": {
103                    "timestamps": [
104                        "2023-01-01T00:00:00Z",
105                        "2024-01-01T00:00:00Z"
106                    ],
107                    "scenarios": [
108                        [
109                            70,
110                            60
111                        ]
112                    ]
113                },
114                "capacity": {
115                    "timestamps": [
116                        "2023-01-01T00:00:00Z"
117                    ],
118                    "scenarios": [
119                        [
120                            -40
121                        ]
122                    ]
123                }
124            },
125            {
126                "name": "import",
127                "price": {
128                    "timestamps": [
129                        "2023-01-01T00:00:00Z",
130                        "2024-01-01T00:00:00Z"
131                    ],
132                    "scenarios": [
133                        [
134                            20,
135                            10
136                        ]
137                    ]
138                },
139                "capacity": {
140                    "timestamps": [
141                        "2023-01-01T00:00:00Z"
142                    ],
143                    "scenarios": [
144                        [
145                            20
146                        ]
147                    ]
148                }
149            }
150        ],
151        "loads": [
152            {
153                "#comment": "Gruppe 16",
154                "name": "FLAT",
155                "capacity": {
156                    "timestamps": [
157                        "2023-01-01T00:00:00Z"
158                    ],
159                    "scenarios": [
160                        [
161                            70
162                        ]
163                    ]
164                }
165            },
166            {
167                "#comment": "Gruppe 16",
168                "name": "FLAT3",
169                "capacity": {
170                    "timestamps": [
171                        "2023-01-01T00:00:00Z"
172                    ],
173                    "scenarios": [
174                        [
175                            100
176                        ]
177                    ]
178                }
179            },
180            {
181                "#comment": "Gruppe 16",
182                "name": "sesong_var",
183                "capacity": {
184                    "timestamps": [
185                        "2023-01-01T00:00:00Z",
186                        "2023-03-01T00:00:00Z",
187                        "2023-06-01T00:00:00Z",
188                        "2023-09-01T00:00:00Z",
189                        "2023-12-01T00:00:00Z",
190                        "2024-03-01T00:00:00Z",
191                        "2024-06-01T00:00:00Z",
192                        "2024-09-01T00:00:00Z",
193                        "2024-12-01T00:00:00Z",
194                        "2025-03-01T00:00:00Z",
195                        "2025-06-01T00:00:00Z",
196                        "2025-09-01T00:00:00Z",
197                        "2025-12-01T00:00:00Z"
198                    ],
199                    "scenarios": [
200                        [
201                            7,
202                            5,
203                            3,
204                            5,
205                            7,
206                            5,
207                            3,
208                            5,
209                            7,
210                            5,
211                            3,
212                            5,
213                            7
214                        ]
215                    ]
216                }
217            }
218        ],
219        "areas": [
220            {
221                "name": "pumpekraft"
222            },
223            {
224                "name": "tev"
225            }
226        ],
227        "market_calibration_areas": [
228            {
229                "name": "calibration_area"
230            }
231        ],
232        "inflow_series": [
233            {
234                "name": "small",
235                "series": {
236                    "timestamps": [
237                        "1900-01-01T00:00:00Z"
238                    ],
239                    "scenarios": [
240                        [
241                            0.001
242                        ]
243                    ]
244                }
245            },
246            {
247                "name": "ten",
248                "series": {
249                    "timestamps": [
250                        "1900-01-01T00:00:00Z"
251                    ],
252                    "scenarios": [
253                        [
254                            10.0
255                        ]
256                    ]
257                }
258            },
259            {
260                "name": "after_one_year",
261                "series": {
262                    "external_reference": {
263                        "type": "hdf5",
264                        "path": "/inflow/tannsvatn",
265                        "filename": "inflow.h5"
266                    }
267                },
268                "forecast": {
269                    "external_reference": {
270                        "type": "hdf5",
271                        "path": "/inflow/tannsvatn",
272                        "filename": "inflow.h5"
273                    }
274                },
275                "forecast_period": {
276                    "timestamps": [
277                        "2023-W25",
278                        "2024-W45"
279                    ],
280                    "scenarios": [
281                        [
282                            1,
283                            0
284                        ]
285                    ]
286                }
287            },
288            {
289                "name": "aamot",
290                "series": {
291                    "external_reference": {
292                        "type": "hdf5",
293                        "path": "/inflow/aamot",
294                        "filename": "inflow.h5"
295                    }
296                },
297                "forecast": {
298                    "timestamps": [
299                        "1931-W01"
300                    ],
301                    "scenarios": [
302                        [
303                            500
304                        ]
305                    ]
306                }
307            },
308            {
309                "name": "aamot2",
310                "series": {
311                    "external_reference": {
312                        "type": "hdf5",
313                        "path": "/inflow/aamot",
314                        "filename": "inflow.h5"
315                    }
316                }
317            },
318            {
319                "name": "dyrdalsvatn",
320                "series": {
321                    "external_reference": {
322                        "type": "hdf5",
323                        "path": "/inflow/dyrdalsvatn",
324                        "filename": "inflow.h5"
325                    }
326                }
327            },
328            {
329                "name": "krinsvatn",
330                "series": {
331                    "external_reference": {
332                        "type": "hdf5",
333                        "path": "/inflow/krinsvatn",
334                        "filename": "inflow.h5"
335                    }
336                }
337            },
338            {
339                "name": "tannsvatn",
340                "series": {
341                    "external_reference": {
342                        "type": "hdf5",
343                        "path": "/inflow/tannsvatn",
344                        "filename": "inflow.h5"
345                    }
346                },
347                "forecast": {
348                    "timestamps": [
349                        "1931-W01"
350                    ],
351                    "scenarios": [
352                        [
353                            10000
354                        ]
355                    ]
356                },
357                "forecast_period": {
358                    "timestamps": [
359                        "2023-W20",
360                        "2023-W30"
361                    ],
362                    "scenarios": [
363                        [
364                            1,
365                            0
366                        ]
367                    ]
368                }
369            }
370        ],
371        "reservoirs": [
372            {
373                "name": "upper_main",
374                "degree_of_regulation": 3,
375                "regulated_inflow_name": "after_one_year",
376                "average_regulated_inflow": 30,
377                "max_discharge": 100.0,
378                "reference_curve": {
379                    "timestamps": [
380                        "2023-W17",
381                        "2023-W40",
382                        "2023-W50"
383                    ],
384                    "scenarios": [
385                        [
386                            150,
387                            150,
388                            150
389                        ]
390                    ]
391                },
392                "initial_volume": 150,
393                "tailrace_elevation": 30.0,
394                "gross_head": 900.0,
395                "volume_curve": {
396                    "x": [
397                        1125.20,
398                        1129.20
399                    ],
400                    "y": [
401                        0,
402                        250
403                    ]
404                }
405            },
406            {
407                "name": "extra_rsv",
408                "degree_of_regulation": 1,
409                "regulated_inflow_name": "after_one_year",
410                "average_regulated_inflow": 25.0,
411                "max_discharge": 100.0,
412                "reference_curve": {
413                    "timestamps": [
414                        "2023-W01"
415                    ],
416                    "scenarios": [
417                        [
418                            500
419                        ]
420                    ]
421                },
422                "initial_volume": 150,
423                "tailrace_elevation": 20.0,
424                "gross_head": 450.0,
425                "volume_curve": {
426                    "x": [
427                        600,
428                        630
429                    ],
430                    "y": [
431                        0,
432                        150
433                    ]
434                }
435            },
436            {
437                "name": "lower_main",
438                "degree_of_regulation": 1,
439                "regulated_inflow_name": "ten",
440                "average_regulated_inflow": 10.0,
441                "max_discharge": 100.0,
442                "reference_curve": {
443                    "timestamps": [
444                        "2023-W01"
445                    ],
446                    "scenarios": [
447                        [
448                            250.0
449                        ]
450                    ]
451                },
452                "initial_volume": 1,
453                "volume_curve": {
454                    "x": [
455                        45,
456                        50
457                    ],
458                    "y": [
459                        0,
460                        450
461                    ]
462                },
463                "tailrace_elevation": 40.0,
464                "gross_head": 1
465            },
466            {
467                "name": "rsv_pump_1",
468                "degree_of_regulation": 3,
469                "regulated_inflow_name": "after_one_year",
470                "average_regulated_inflow": 20,
471                "max_discharge": 45,
472                "reference_curve": {
473                    "timestamps": [
474                        "2023-W01"
475                    ],
476                    "scenarios": [
477                        [
478                            150.0
479                        ]
480                    ]
481                },
482                "initial_volume": 200,
483                "volume_curve": {
484                    "x": [
485                        1000,
486                        1050
487                    ],
488                    "y": [
489                        0,
490                        250
491                    ]
492                },
493                "tailrace_elevation": 1000.0,
494                "gross_head": 50
495            },
496            {
497                "name": "tev_rsv",
498                "degree_of_regulation": 1.0,
499                "regulated_inflow_name": "after_one_year",
500                "average_regulated_inflow": 4.0,
501                "max_discharge": 10.0,
502                "reference_curve": {
503                    "timestamps": [
504                        "2023-W17",
505                        "2023-W40",
506                        "2023-W50"
507                    ],
508                    "scenarios": [
509                        [
510                            30,
511                            100,
512                            70
513                        ]
514                    ]
515                },
516                "initial_volume": 75,
517                "volume_curve": {
518                    "x": [
519                        100,
520                        104
521                    ],
522                    "y": [
523                        0,
524                        150
525                    ]
526                },
527                "tailrace_elevation": 1.0,
528                "gross_head": 102.0
529            }
530        ],
531        "plants": [
532            {
533                "name": "plant",
534                "ownership": 100,
535                "average_energy_equivalent": 2.5,
536                "discharge_energy_equivalent": {
537                    "timestamps": [
538                        "2023-W01"
539                    ],
540                    "scenarios": [
541                        [
542                            2.500
543                        ]
544                    ]
545                },
546                "pq_curves": {
547                    "2023-01-02T00:00:00Z": {
548                        "x": [
549                            0.0,
550                            100.0
551                        ],
552                        "y": [
553                            0.0,
554                            200.0
555                        ]
556                    }
557                },
558                "unregulated_inflow_name": "small",
559                "average_unregulated_inflow": 0.0,
560                "unavailable_capacity": {
561                    "timestamps": [
562                        "2023-01-02T00:00:00Z",
563                        "2024-06-01T00:00:00Z",
564                        "2024-12-01T00:00:00Z"
565                    ],
566                    "scenarios": [
567                        [
568                            70,
569                            50,
570                            0
571                        ]
572                    ]
573                }
574            },
575            {
576                "name": "extra_plant",
577                "ownership": 100,
578                "average_energy_equivalent": 1.225,
579                "discharge_energy_equivalent": {
580                    "timestamps": [
581                        "W01"
582                    ],
583                    "scenarios": [
584                        [
585                            1.225
586                        ]
587                    ]
588                },
589                "pq_curves": {
590                    "W01": {
591                        "x": [
592                            0.0,
593                            100.0
594                        ],
595                        "y": [
596                            0.0,
597                            100.0
598                        ]
599                    },
600                    "W40": {
601                        "x": [
602                            0.0,
603                            90.0
604                        ],
605                        "y": [
606                            0.0,
607                            90.0
608                        ]
609                    }
610                },
611                "unregulated_inflow_name": "small",
612                "average_unregulated_inflow": 0.0,
613                "unavailable_capacity": {
614                    "timestamps": [
615                        "2023-01-02T00:00:00Z",
616                        "2023-02-02T00:00:00Z",
617                        "2024-06-01T00:00:00Z",
618                        "2024-12-01T00:00:00Z"
619                    ],
620                    "scenarios": [
621                        [
622                            30,
623                            40,
624                            50,
625                            0
626                        ]
627                    ]
628                }
629            },
630            {
631                "name": "tev_plant",
632                "ownership": 100,
633                "average_energy_equivalent": 0.3,
634                "discharge_energy_equivalent": {
635                    "timestamps": [
636                        "W01"
637                    ],
638                    "scenarios": [
639                        [
640                            0.3
641                        ]
642                    ]
643                },
644                "pq_curves": {
645                    "W01": {
646                        "x": [
647                            0.0,
648                            10.0
649                        ],
650                        "y": [
651                            0.0,
652                            10.8
653                        ]
654                    },
655                    "W20": {
656                        "x": [
657                            0.0,
658                            5.0
659                        ],
660                        "y": [
661                            0.0,
662                            5.4
663                        ]
664                    },
665                    "W40": {
666                        "x": [
667                            0.0,
668                            10.0
669                        ],
670                        "y": [
671                            0.0,
672                            10.8
673                        ]
674                    }
675                },
676                "unregulated_inflow_name": "small",
677                "average_unregulated_inflow": 0.0
678            }
679        ],
680        "pumps": [
681            {
682                "name": "pump1_upper",
683                "ownership": 100,
684                "average_power": 150,
685                "pump_capacity": {
686                    "x": [
687                        110,
688                        100
689                    ],
690                    "y": [
691                        47,
692                        150
693                    ]
694                },
695                "unavailable_capacity": {
696                    "timestamps": [
697                        "2023-01-02T00:00:00Z",
698                        "2023-04-02T00:00:00Z",
699                        "2024-12-01T00:00:00Z"
700                    ],
701                    "scenarios": [
702                        [
703                            0,
704                            130,
705                            130
706                        ]
707                    ]
708                }
709            },
710            {
711                "name": "extra_pump_æøå",
712                "ownership": 100,
713                "average_power": 150,
714                "pump_capacity": {
715                    "x": [
716                        110,
717                        100
718                    ],
719                    "y": [
720                        47,
721                        150
722                    ]
723                },
724                "upper_reservoir_reference_curve": {
725                    "timestamps": [
726                        "2023-W17",
727                        "2023-W40",
728                        "2023-W50"
729                    ],
730                    "scenarios": [
731                        [
732                            1450,
733                            1400,
734                            1000
735                        ]
736                    ]
737                },
738                "lower_reservoir_reference_curve": {
739                    "timestamps": [
740                        "2023-W17",
741                        "2023-W40",
742                        "2023-W50"
743                    ],
744                    "scenarios": [
745                        [
746                            5,
747                            5,
748                            5
749                        ]
750                    ]
751                }
752            }
753        ],
754        "wind": [
755            {
756                "name": "WIND_TEST_01",
757                "capacity": {
758                    "timestamps": [
759                        "1981-01-01T00:00:00Z",
760                        "1981-01-03T00:00:00Z"
761                    ],
762                    "scenarios": [
763                        [
764                            0.1,
765                            0.1
766                        ],
767                        [
768                            0.2,
769                            0.2
770                        ],
771                        [
772                            0.3,
773                            0.3
774                        ],
775                        [
776                            0.4,
777                            0.4
778                        ],
779                        [
780                            0.5,
781                            0.5
782                        ],
783                        [
784                            0.6,
785                            0.6
786                        ],
787                        [
788                            0.7,
789                            0.7
790                        ],
791                        [
792                            0.8,
793                            0.8
794                        ]
795                    ]
796                }
797            }
798        ],
799        "solar": [
800            {
801                "name": "solar_01",
802                "capacity": {
803                    "timestamps": [
804                        "2023-W01",
805                        "2025-W01"
806                    ],
807                    "scenarios": [
808                        [
809                            0.2,
810                            0.1
811                        ],
812                        [
813                            0.2,
814                            0.3
815                        ],
816                        [
817                            0.3,
818                            0.4
819                        ],
820                        [
821                            0.4,
822                            0.1
823                        ],
824                        [
825                            0.6,
826                            0.4
827                        ],
828                        [
829                            0.7,
830                            0.3
831                        ],
832                        [
833                            0.8,
834                            0.2
835                        ],
836                        [
837                            0.9,
838                            0.4
839                        ]
840                    ]
841                }
842            }
843        ],
844        "connections": [
845            {
846                "from": "WIND_TEST_01",
847                "to": "tev"
848            },
849            {
850                "from": "solar_01",
851                "to": "tev"
852            },
853            {
854                "from": "pumpekraft",
855                "to": "PUMPE_TEV_DC"
856            },
857            {
858                "from": "market_step",
859                "to": "pumpekraft"
860            },
861            {
862                "from": "import",
863                "to": "tev"
864            },
865            {
866                "from": "export",
867                "to": "tev"
868            },
869            {
870                "from": "PUMPE_TEV_DC",
871                "to": "tev"
872            },
873            {
874                "from": "FLAT",
875                "to": "pumpekraft"
876            },
877            {
878                "from": "FLAT3",
879                "to": "pumpekraft"
880            },
881            {
882                "from": "sesong_var",
883                "to": "tev"
884            },
885            {
886                "from": "upper_main",
887                "to": "pumpekraft"
888            },
889            {
890                "from": "upper_main",
891                "to": "plant"
892            },
893            {
894                "from": "plant",
895                "to": "lower_main"
896            },
897            {
898                "from": "rsv_pump_1",
899                "to": "pumpekraft"
900            },
901            {
902                "from": "rsv_pump_1",
903                "to": "pump1_upper"
904            },
905            {
906                "from": "pump1_upper",
907                "to": "upper_main"
908            },
909            {
910                "from": "extra_rsv",
911                "to": "extra_plant"
912            },
913            {
914                "from": "extra_plant",
915                "to": "lower_main"
916            },
917            {
918                "from": "extra_pump_æøå",
919                "to": "extra_plant"
920            },
921            {
922                "from": "tev_rsv",
923                "to": "tev"
924            },
925            {
926                "from": "tev_rsv",
927                "to": "tev_plant"
928            },
929            {
930                "from": "pumpekraft",
931                "to": "calibration_area"
932            },
933            {
934                "from": "tev",
935                "to": "calibration_area"
936            }
937        ]
938    }
939}