@@ -34,13 +34,20 @@ public class MetrixOutputData {
34
34
public static final String ERROR_CODE_NAME = "ERROR_CODE" ;
35
35
public static final String OVERLOAD_BASECASE = "OVERLOAD_BASECASE" ;
36
36
public static final String OVERLOAD_OUTAGES = "OVERLOAD_OUTAGES" ;
37
- public static final String GEN_COST = "GEN_COST" ;
38
- public static final String LOAD_COST = "LOAD_COST" ;
37
+
38
+ public static final String GEN_PREFIX = "GEN_" ;
39
+ public static final String GEN_CUR_PREFIX = "GEN_CUR_" ;
40
+ public static final String GEN_COST = GEN_PREFIX + "COST" ;
41
+ public static final String GEN_VOL_UP = GEN_PREFIX + "VOL_UP_" ;
42
+ public static final String GEN_VOL_DOWN = GEN_PREFIX + "VOL_DOWN_" ;
43
+
44
+ public static final String LOAD_PREFIX = "LOAD_" ;
45
+ public static final String LOAD_CUR_PREFIX = "LOAD_CUR_" ;
46
+ public static final String LOAD_COST = LOAD_PREFIX + "COST" ;
47
+
39
48
public static final String FLOW_NAME = "FLOW_" ;
40
49
public static final String MAX_THREAT_NAME = "MAX_THREAT_" ;
41
50
public static final String MAX_TMP_THREAT_FLOW = "MAX_TMP_THREAT_FLOW_" ;
42
- public static final String GEN_VOL_UP = "GEN_VOL_UP_" ;
43
- public static final String GEN_VOL_DOWN = "GEN_VOL_DOWN_" ;
44
51
public static final String LOSSES = "LOSSES" ;
45
52
public static final String LOSSES_BY_COUNTRY = "LOSSES_" ;
46
53
public static final String HVDC_NAME = "HVDC_" ;
@@ -52,6 +59,7 @@ public class MetrixOutputData {
52
59
public static final String PST_TYPE = "pst" ;
53
60
public static final String GEN_TYPE = "generator-type" ;
54
61
public static final String GENERATOR = "generator" ;
62
+ public static final String LOAD = "load" ;
55
63
public static final String BRANCH = "branch" ;
56
64
public static final String CONTINGENCY_TYPE = "contingency" ;
57
65
public static final String BASECASE_TYPE = "basecase" ;
@@ -96,6 +104,14 @@ public DoubleResultChunk(int length, Map<String, String> metadata) {
96
104
public void insertResult (int pos , double value ) {
97
105
timeSeries [pos ] = value ;
98
106
}
107
+
108
+ public void addResult (int pos , double value ) {
109
+ if (Double .isNaN (timeSeries [pos ])) {
110
+ insertResult (pos , value );
111
+ } else {
112
+ timeSeries [pos ] += value ;
113
+ }
114
+ }
99
115
}
100
116
101
117
private static final class StringResultChunk {
@@ -522,13 +538,18 @@ private void readR2C(int varNum, String[] chunks) {
522
538
private void readR2B (int varNum , String [] chunks , Map <Integer , String > outageNames ) {
523
539
String outageName ;
524
540
DoubleResultChunk ts ;
541
+ DoubleResultChunk tsSum ;
525
542
// Check that it's not the header
526
543
if (INCIDENT .equals (chunks [1 ])) {
527
544
return ;
528
545
}
529
546
outageName = Optional .ofNullable (outageNames .get (Integer .parseInt (chunks [1 ]))).orElseThrow (() -> new PowsyblException (UNKNOWN_OUTAGE ));
530
- ts = getDoubleTimeSeries ("GEN_CUR_" , GENERATOR , chunks [2 ], outageName );
531
- ts .insertResult (varNum - offset , Double .parseDouble (chunks [3 ]));
547
+ ts = getDoubleTimeSeries (GEN_CUR_PREFIX , GENERATOR , chunks [2 ], outageName );
548
+ double redispatchingValue = Double .parseDouble (chunks [3 ]);
549
+ ts .insertResult (varNum - offset , redispatchingValue );
550
+ // Compute curative redispatching by generator = sum of generator curative redispatching for all outages
551
+ tsSum = getDoubleTimeSeries (GEN_CUR_PREFIX + chunks [2 ]);
552
+ tsSum .addResult (varNum - offset , redispatchingValue );
532
553
}
533
554
534
555
/**
@@ -545,7 +566,7 @@ private void readR2(int varNum, String[] chunks) {
545
566
ts .insertResult (varNum - offset , Double .parseDouble (chunks [5 ]));
546
567
}
547
568
if (!EMPTY_STRING .equals (chunks [6 ])) {
548
- ts = getDoubleTimeSeries ("GEN_" , GENERATOR , chunks [2 ]);
569
+ ts = getDoubleTimeSeries (GEN_PREFIX , GENERATOR , chunks [2 ]);
549
570
ts .insertResult (varNum - offset , Double .parseDouble (chunks [6 ]));
550
571
}
551
572
}
@@ -559,21 +580,26 @@ private void readR1C(int varNum, String[] chunks) {
559
580
if ("NOM REGROUPEMENT" .equals (chunks [1 ])) {
560
581
return ;
561
582
}
562
- ts = getDoubleTimeSeries ("LOAD_" , "load binding" , chunks [1 ]);
583
+ ts = getDoubleTimeSeries (LOAD_PREFIX , "load binding" , chunks [1 ]);
563
584
ts .insertResult (varNum - offset , Double .parseDouble (chunks [2 ]));
564
585
}
565
586
566
587
/**
567
588
* Curative Loads
568
589
*/
569
590
private void readR1B (int varNum , Map <Integer , String > outageNames , String [] chunks ) {
591
+ DoubleResultChunk tsSum ;
570
592
// Check that it's not the header
571
593
if (INCIDENT .equals (chunks [1 ])) {
572
594
return ;
573
595
}
574
596
String outageName = Optional .ofNullable (outageNames .get (Integer .parseInt (chunks [1 ]))).orElseThrow (() -> new PowsyblException (UNKNOWN_OUTAGE ));
575
- DoubleResultChunk ts = getDoubleTimeSeries ("LOAD_CUR_" , "load" , chunks [2 ], outageName );
576
- ts .insertResult (varNum - offset , Double .parseDouble (chunks [3 ]));
597
+ DoubleResultChunk ts = getDoubleTimeSeries (LOAD_CUR_PREFIX , LOAD , chunks [2 ], outageName );
598
+ double sheddingValue = Double .parseDouble (chunks [3 ]);
599
+ ts .insertResult (varNum - offset , sheddingValue );
600
+ // Compute curative load shedding by load = sum of curative load shedding for all outages
601
+ tsSum = getDoubleTimeSeries (LOAD_CUR_PREFIX + chunks [2 ]);
602
+ tsSum .addResult (varNum - offset , sheddingValue );
577
603
}
578
604
579
605
/**
@@ -586,11 +612,11 @@ private void readR1(int varNum, String[] chunks) {
586
612
}
587
613
DoubleResultChunk ts ;
588
614
if (!EMPTY_STRING .equals (chunks [4 ])) {
589
- ts = getDoubleTimeSeries ("INIT_BAL_LOAD_" , "load" , chunks [2 ]);
615
+ ts = getDoubleTimeSeries ("INIT_BAL_LOAD_" , LOAD , chunks [2 ]);
590
616
ts .insertResult (varNum - offset , Double .parseDouble (chunks [4 ]));
591
617
}
592
618
if (!EMPTY_STRING .equals (chunks [5 ])) {
593
- ts = getDoubleTimeSeries ("LOAD_" , "load" , chunks [2 ]);
619
+ ts = getDoubleTimeSeries (LOAD_PREFIX , LOAD , chunks [2 ]);
594
620
ts .insertResult (varNum - offset , Double .parseDouble (chunks [5 ]));
595
621
}
596
622
}
@@ -627,7 +653,7 @@ private void readC2B(int varNum, String[] chunks) {
627
653
return ;
628
654
}
629
655
if (!EMPTY_STRING .equals (chunks [4 ])) {
630
- DoubleResultChunk ts = getDoubleTimeSeries ("LOST_LOAD_" , "load" , chunks [3 ], chunks [2 ]);
656
+ DoubleResultChunk ts = getDoubleTimeSeries ("LOST_LOAD_" , LOAD , chunks [3 ], chunks [2 ]);
631
657
ts .insertResult (varNum - offset , Double .parseDouble (chunks [4 ]));
632
658
}
633
659
}
@@ -646,7 +672,7 @@ private void readC2(int varNum, String[] chunks) {
646
672
ts .insertResult (varNum - offset , Double .parseDouble (chunks [4 ]));
647
673
}
648
674
if (!EMPTY_STRING .equals (chunks [5 ])) {
649
- ts = getDoubleTimeSeries ("LOST_LOAD_" , "load" , chunks [2 ]);
675
+ ts = getDoubleTimeSeries ("LOST_LOAD_" , LOAD , chunks [2 ]);
650
676
ts .insertResult (varNum - offset , Double .parseDouble (chunks [5 ]));
651
677
}
652
678
}
0 commit comments