-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathtest_parse_matpower.cpp
More file actions
158 lines (135 loc) · 4.84 KB
/
Copy pathtest_parse_matpower.cpp
File metadata and controls
158 lines (135 loc) · 4.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include <iostream>
#include "MatPowerTesting.hpp"
#include <Model/PowerFlow/MatpowerParser.hpp>
#include <Model/PowerFlow/PowerFlowData.hpp>
using namespace GridKit;
using namespace GridKit::Testing;
using namespace GridKit::PowerFlowData;
namespace
{
using IdxT = int;
using RealT = double;
static const std::string matpower_data{
R"(
function mpc = case5
%CASE5 Power flow data for modified 5 bus, 5 gen case based on PJM 5-bus system
% Please see CASEFORMAT for details on the case file format.
%
% Based on data from ...
% F.Li and R.Bo, "Small Test Systems for Power System Economic Studies",
% Proceedings of the 2010 IEEE Power & Energy Society General Meeting
% Created by Rui Bo in 2006, modified in 2010, 2014.
% Distributed with permission.
% MATPOWER
%% MATPOWER Case Format : Version 2
mpc.version = '2';
%%----- Power Flow Data -----%%
%% system MVA base
mpc.baseMVA = 100;
%% bus data
% bus_i type Pd Qd Gs Bs area Vm Va baseKV zone Vmax Vmin
mpc.bus = [
1 2 0 0 0 0 1 1 0 230 1 1.1 0.0;
2 1 300 98.61 0 0 1 1 0 230 1 1.1 0.0;
3 2 300 98.61 0 0 1 1 0 230 1 1.1 0.0;
4 3 400 131.47 0 0 1 1 0 230 1 1.1 0.0;
5 2 0 0 0 0 1 1 0 230 1 1.1 0.9;
];
%% generator data
% bus Pg Qg Qmax Qmin Vg mBase status Pmax Pmin Pc1 Pc2 Qc1min Qc1max Qc2min Qc2max ramp_agc ramp_10 ramp_30 ramp_q apf
mpc.gen = [
1 40 0 30 -30 1 100 1 40 0 0 0 0 0 0 0 0 0 0 0 0;
1 170 0 127.5 -127.5 1 100 1 170 0 0 0 0 0 0 0 0 0 0 0 0;
3 323.49 0 390 -390 1 100 1 520 0 0 0 0 0 0 0 0 0 0 0 0;
4 0 0 150 -150 1 100 1 200 0 0 0 0 0 0 0 0 0 0 0 0;
5 466.51 0 450 -450 1 100 1 600 0 0 0 0 0 0 0 0 0 0 0 0;
];
%% branch data
% fbus tbus r x b rateA rateB rateC ratio angle status angmin angmax
mpc.branch = [
1 2 0.00281 0.0281 0.00712 400 400 400 0 0 1 -360 360;
1 4 0.00304 0.0304 0.00658 0 0 0 0 0 1 -360 360;
1 5 0.00064 0.0064 0.03126 0 0 0 0 0 1 -360 360;
2 3 0.00108 0.0108 0.01852 0 0 0 0 0 1 -360 360;
3 4 0.00297 0.0297 0.00674 0 0 0 0 0 1 -360 360;
4 5 0.00297 0.0297 0.00674 240 240 240 0 0 1 -360 360;
];
%%----- OPF Data -----%%
%% generator cost data
% 1 startup shutdown n x1 y1 ... xn yn
% 2 startup shutdown n c(n-1) ... c0
mpc.gencost = [
2 0 0 3 0 14 0;
2 0 0 3 0 15 0;
2 0 0 3 0 30 0;
2 0 0 3 0 40 0;
2 0 0 3 0 10 0;
];
)"};
} // namespace
int main(int /* argc */, char** /* argv */)
{
int fail = 0;
// All types will use the scalar types at the top of the file
using BusDataT = BusData<RealT, IdxT>;
using GenDataT = GenData<RealT, IdxT>;
using BranchDataT = BranchData<RealT, IdxT>;
using GenCostDataT = GenCostData<RealT, IdxT>;
using SystemModelDataT = SystemModelData<RealT, IdxT>;
using LoadDataT = LoadData<RealT, IdxT>;
// Create the struct of expected values
std::vector<BranchDataT> branch_answer{
{1, 2, 0.00281, 0.0281, 0.00712, 400, 400, 400, 0, 0, 1, -360, 360},
{1, 4, 0.00304, 0.0304, 0.00658, 0, 0, 0, 0, 0, 1, -360, 360},
{1, 5, 0.00064, 0.0064, 0.03126, 0, 0, 0, 0, 0, 1, -360, 360},
{2, 3, 0.00108, 0.0108, 0.01852, 0, 0, 0, 0, 0, 1, -360, 360},
{3, 4, 0.00297, 0.0297, 0.00674, 0, 0, 0, 0, 0, 1, -360, 360},
{4, 5, 0.00297, 0.0297, 0.00674, 240, 240, 240, 0, 0, 1, -360, 360},
};
std::vector<BusDataT> bus_answer{
{1, 2, 0, 0, 1, 1, 0, 230, 1, 1.1, 0.0},
{2, 1, 0, 0, 1, 1, 0, 230, 1, 1.1, 0.0},
{3, 2, 0, 0, 1, 1, 0, 230, 1, 1.1, 0.0},
{4, 3, 0, 0, 1, 1, 0, 230, 1, 1.1, 0.0},
{5, 2, 0, 0, 1, 1, 0, 230, 1, 1.1, 0.9},
};
std::vector<GenDataT> gen_answer{
{1, 40, 0, 30, -30, 1, 100, 1, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{1, 170, 0, 127.5, -127.5, 1, 100, 1, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{3, 323.49, 0, 390, -390, 1, 100, 1, 520, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{4, 0, 0, 150, -150, 1, 100, 1, 200, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{5, 466.51, 0, 450, -450, 1, 100, 1, 600, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}};
std::vector<GenCostDataT> gencost_answer{
{2, 0, 0, 3, {0, 14, 0}},
{2, 0, 0, 3, {0, 15, 0}},
{2, 0, 0, 3, {0, 30, 0}},
{2, 0, 0, 3, {0, 40, 0}},
{2, 0, 0, 3, {0, 10, 0}},
};
std::vector<LoadDataT> load_answer{
{1, 0, 0},
{2, 300, 98.61},
{3, 300, 98.61},
{4, 400, 131.47},
{5, 0, 0},
};
SystemModelDataT mp_answer;
mp_answer.gencost = gencost_answer;
mp_answer.gen = gen_answer;
mp_answer.bus = bus_answer;
mp_answer.branch = branch_answer;
mp_answer.load = load_answer;
mp_answer.version = "2";
mp_answer.baseMVA = 100;
SystemModelDataT mp;
{
std::istringstream iss(matpower_data);
GridKit::readMatPower(mp, iss);
if (!isEqual(mp, mp_answer))
fail++;
std::cout << "\n\nAfter reading the gencost component, fail == " << fail
<< "\n";
}
std::cout << "Tests " << (fail ? "FAILED" : "PASSED") << "\n";
return fail;
}