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)
"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}