0001 function t_dcline(quiet)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 if nargin < 1
0013 quiet = 0;
0014 end
0015
0016 num_tests = 63;
0017
0018 t_begin(num_tests, quiet);
0019
0020
0021 [PQ, PV, REF, NONE, BUS_I, BUS_TYPE, PD, QD, GS, BS, BUS_AREA, VM, ...
0022 VA, BASE_KV, ZONE, VMAX, VMIN, LAM_P, LAM_Q, MU_VMAX, MU_VMIN] = idx_bus;
0023 [GEN_BUS, PG, QG, QMAX, QMIN, VG, MBASE, GEN_STATUS, PMAX, PMIN, ...
0024 MU_PMAX, MU_PMIN, MU_QMAX, MU_QMIN, PC1, PC2, QC1MIN, QC1MAX, ...
0025 QC2MIN, QC2MAX, RAMP_AGC, RAMP_10, RAMP_30, RAMP_Q, APF] = idx_gen;
0026 [F_BUS, T_BUS, BR_R, BR_X, BR_B, RATE_A, RATE_B, RATE_C, ...
0027 TAP, SHIFT, BR_STATUS, PF, QF, PT, QT, MU_SF, MU_ST, ...
0028 ANGMIN, ANGMAX, MU_ANGMIN, MU_ANGMAX] = idx_brch;
0029 [PW_LINEAR, POLYNOMIAL, MODEL, STARTUP, SHUTDOWN, NCOST, COST] = idx_cost;
0030 c = idx_dcline;
0031
0032 casefile = 't_case9_dcline';
0033 casefile2 = 'case9';
0034 if quiet
0035 verbose = 0;
0036 else
0037 verbose = 0;
0038 end
0039 if have_fcn('octave')
0040 if have_fcn('octave', 'vnum') >= 4
0041 file_in_path_warn_id = 'Octave:data-file-in-path';
0042 else
0043 file_in_path_warn_id = 'Octave:load-file-in-path';
0044 end
0045 s1 = warning('query', file_in_path_warn_id);
0046 warning('off', file_in_path_warn_id);
0047 end
0048
0049 mpopt = mpoption('opf.violation', 1e-6, 'mips.gradtol', 1e-8, ...
0050 'mips.comptol', 1e-8, 'mips.costtol', 1e-9);
0051 mpopt = mpoption(mpopt, 'opf.ac.solver', 'MIPS', 'opf.dc.solver', 'MIPS');
0052 mpopt = mpoption(mpopt, 'out.all', 0, 'verbose', verbose);
0053
0054
0055 ib_data = [1:BUS_AREA BASE_KV:VMIN];
0056 ib_voltage = [VM VA];
0057 ib_lam = [LAM_P LAM_Q];
0058 ib_mu = [MU_VMAX MU_VMIN];
0059 ig_data = [GEN_BUS QMAX QMIN MBASE:APF];
0060 ig_disp = [PG QG VG];
0061 ig_mu = (MU_PMAX:MU_QMIN);
0062 ibr_data = (1:ANGMAX);
0063 ibr_flow = (PF:QT);
0064 ibr_mu = [MU_SF MU_ST];
0065 ibr_angmu = [MU_ANGMIN MU_ANGMAX];
0066
0067
0068 mpc0 = loadcase(casefile);
0069 mpc0 = rmfield(mpc0, 'dclinecost');
0070 mpc = mpc0;
0071 mpc = toggle_dcline(mpc, 'on');
0072 mpc = toggle_dcline(mpc, 'off');
0073 ndc = size(mpc.dcline, 1);
0074
0075
0076 t = 'AC OPF (no DC lines) : ';
0077 [r0, success] = runopf(mpc0, mpopt);
0078 t_ok(success, [t 'success']);
0079 [r, success] = runopf(mpc, mpopt);
0080 t_ok(success, [t 'success']);
0081 t_is(r.f, r0.f, 8, [t 'f']);
0082 t_is( r.bus(:,ib_data ), r0.bus(:,ib_data ), 10, [t 'bus data']);
0083 t_is( r.bus(:,ib_voltage), r0.bus(:,ib_voltage), 3, [t 'bus voltage']);
0084 t_is( r.bus(:,ib_lam ), r0.bus(:,ib_lam ), 3, [t 'bus lambda']);
0085 t_is( r.bus(:,ib_mu ), r0.bus(:,ib_mu ), 2, [t 'bus mu']);
0086 t_is( r.gen(:,ig_data ), r0.gen(:,ig_data ), 10, [t 'gen data']);
0087 t_is( r.gen(:,ig_disp ), r0.gen(:,ig_disp ), 3, [t 'gen dispatch']);
0088 t_is( r.gen(:,ig_mu ), r0.gen(:,ig_mu ), 3, [t 'gen mu']);
0089 t_is(r.branch(:,ibr_data ), r0.branch(:,ibr_data ), 10, [t 'branch data']);
0090 t_is(r.branch(:,ibr_flow ), r0.branch(:,ibr_flow ), 3, [t 'branch flow']);
0091 t_is(r.branch(:,ibr_mu ), r0.branch(:,ibr_mu ), 2, [t 'branch mu']);
0092
0093 t = 'AC PF (no DC lines) : ';
0094 mpc1 = struct('baseMVA', [], 'bus', [], 'branch', [], 'gencost', [], 'dcline', []);
0095 [mpc1.baseMVA, mpc1.bus, mpc1.gen, mpc1.branch, mpc1.gencost, mpc1.dcline] = ...
0096 deal(r.baseMVA, r.bus(:, 1:VMIN), r.gen(:, 1:APF), ...
0097 r.branch(:, 1:ANGMAX), r.gencost, r.dcline(:, 1:c.LOSS1));
0098 mpc1.bus(:, VM) = 1;
0099 mpc1.bus(:, VA) = 0;
0100 [rp, success] = runpf(mpc1, mpopt);
0101 t_ok(success, [t 'success']);
0102 t_is( rp.bus(:,ib_voltage), r.bus(:,ib_voltage), 3, [t 'bus voltage']);
0103 t_is( rp.gen(:,ig_disp ), r.gen(:,ig_disp ), 3, [t 'gen dispatch']);
0104 t_is(rp.branch(:,ibr_flow ), r.branch(:,ibr_flow ), 3, [t 'branch flow']);
0105
0106
0107 t = 'AC OPF (with DC lines) : ';
0108 mpc = toggle_dcline(mpc, 'on');
0109 [r, success] = runopf(mpc, mpopt);
0110 t_ok(success, [t 'success']);
0111 expected = [
0112 10 8.9 -10 10 1.0674 1.0935;
0113 2.2776 2.2776 0 0 1.0818 1.0665;
0114 0 0 0 0 1.0000 1.0000;
0115 10 9.5 0.0563 -10 1.0778 1.0665;
0116 ];
0117 t_is(r.dcline(:, c.PF:c.VT), expected, 4, [t 'P Q V']);
0118 expected = [
0119 0 0.8490 0.6165 0 0 0.2938;
0120 0 0 0 0.4290 0.0739 0;
0121 0 0 0 0 0 0;
0122 0 7.2209 0 0 0.0739 0;
0123 ];
0124 t_is(r.dcline(:, c.MU_PMIN:c.MU_QMAXT), expected, 3, [t 'mu']);
0125
0126 t = 'AC PF (with DC lines) : ';
0127 mpc1 = struct('baseMVA', [], 'bus', [], 'branch', [], 'gencost', [], 'dcline', []);
0128 [mpc1.baseMVA, mpc1.bus, mpc1.gen, mpc1.branch, mpc1.gencost, mpc1.dcline] = ...
0129 deal(r.baseMVA, r.bus(:, 1:VMIN), r.gen(:, 1:APF), ...
0130 r.branch(:, 1:ANGMAX), r.gencost, r.dcline(:, 1:c.LOSS1));
0131 mpc1 = toggle_dcline(mpc1, 'on');
0132 mpc1.bus(:, VM) = 1;
0133 mpc1.bus(:, VA) = 0;
0134 [rp, success] = runpf(mpc1, mpopt);
0135 t_ok(success, [t 'success']);
0136 t_is( rp.bus(:,ib_voltage), r.bus(:,ib_voltage), 3, [t 'bus voltage']);
0137
0138 t_is( rp.gen([1;3],ig_disp ), r.gen([1;3],ig_disp ), 3, [t 'gen dispatch']);
0139 t_is( rp.gen(2,PG ), r.gen(2,PG ), 3, [t 'gen dispatch']);
0140 t_is( rp.gen(2,QG)+rp.dcline(1,c.QF), r.gen(2,QG)+r.dcline(1,c.QF), 3, [t 'gen dispatch']);
0141 t_is(rp.branch(:,ibr_flow ), r.branch(:,ibr_flow ), 3, [t 'branch flow']);
0142
0143
0144 t = 'AC PF (with equivalent injections) : ';
0145 mpc1 = struct('baseMVA', [], 'bus', [], 'branch', [], 'gencost', [], 'dcline', []);
0146 [mpc1.baseMVA, mpc1.bus, mpc1.gen, mpc1.branch, mpc1.gencost, mpc1.dcline] = ...
0147 deal(r.baseMVA, r.bus(:, 1:VMIN), r.gen(:, 1:APF), ...
0148 r.branch(:, 1:ANGMAX), r.gencost, r.dcline(:, 1:c.LOSS1));
0149 mpc1.bus(:, VM) = 1;
0150 mpc1.bus(:, VA) = 0;
0151 for k = 1:ndc
0152 if mpc1.dcline(k, c.BR_STATUS)
0153 ff = find(mpc1.bus(:, BUS_I) == mpc1.dcline(k, c.F_BUS));
0154 tt = find(mpc1.bus(:, BUS_I) == mpc1.dcline(k, c.T_BUS));
0155 mpc1.bus(ff, PD) = mpc1.bus(ff, PD) + r.dcline(k, c.PF);
0156 mpc1.bus(ff, QD) = mpc1.bus(ff, QD) - r.dcline(k, c.QF);
0157 mpc1.bus(tt, PD) = mpc1.bus(tt, PD) - r.dcline(k, c.PT);
0158 mpc1.bus(tt, QD) = mpc1.bus(tt, QD) - r.dcline(k, c.QT);
0159 mpc1.bus(ff, VM) = r.dcline(k, c.VF);
0160 mpc1.bus(tt, VM) = r.dcline(k, c.VT);
0161 mpc1.bus(ff, BUS_TYPE) = PV;
0162 mpc1.bus(tt, BUS_TYPE) = PV;
0163 end
0164 end
0165 [rp, success] = runpf(mpc1, mpopt);
0166 t_ok(success, [t 'success']);
0167 t_is( rp.bus(:,ib_voltage), r.bus(:,ib_voltage), 3, [t 'bus voltage']);
0168 t_is( rp.gen(:,ig_disp ), r.gen(:,ig_disp ), 3, [t 'gen dispatch']);
0169 t_is(rp.branch(:,ibr_flow ), r.branch(:,ibr_flow ), 3, [t 'branch flow']);
0170
0171
0172 t = 'DC OPF (with DC lines) : ';
0173 mpc = mpc0;
0174 mpc.gen(1, PMIN) = 10;
0175 mpc.branch(5, RATE_A) = 100;
0176 mpc = toggle_dcline(mpc, 'on');
0177 [r, success] = rundcopf(mpc, mpopt);
0178 t_ok(success, [t 'success']);
0179 expected = [
0180 10 8.9 0 0 1.01 1;
0181 2 2 0 0 1 1;
0182 0 0 0 0 1 1;
0183 10 9.5 0 0 1 0.98;
0184 ];
0185 t_is(r.dcline(:, c.PF:c.VT), expected, 4, [t 'P Q V']);
0186 expected = [
0187 0 1.8602 0 0 0 0;
0188 1.8507 0 0 0 0 0;
0189 0 0 0 0 0 0;
0190 0 0.2681 0 0 0 0;
0191 ];
0192 t_is(r.dcline(:, c.MU_PMIN:c.MU_QMAXT), expected, 3, [t 'mu']);
0193
0194 t = 'DC PF (with DC lines) : ';
0195 mpc1 = struct('baseMVA', [], 'bus', [], 'branch', [], 'gencost', [], 'dcline', []);
0196 [mpc1.baseMVA, mpc1.bus, mpc1.gen, mpc1.branch, mpc1.gencost, mpc1.dcline] = ...
0197 deal(r.baseMVA, r.bus(:, 1:VMIN), r.gen(:, 1:APF), ...
0198 r.branch(:, 1:ANGMAX), r.gencost, r.dcline(:, 1:c.LOSS1));
0199 mpc1 = toggle_dcline(mpc1, 'on');
0200 mpc1.bus(:, VA) = 0;
0201 [rp, success] = rundcpf(mpc1, mpopt);
0202 t_ok(success, [t 'success']);
0203 t_is( rp.bus(:,ib_voltage), r.bus(:,ib_voltage), 3, [t 'bus voltage']);
0204 t_is( rp.gen(:,ig_disp ), r.gen(:,ig_disp ), 3, [t 'gen dispatch']);
0205 t_is(rp.branch(:,ibr_flow ), r.branch(:,ibr_flow ), 3, [t 'branch flow']);
0206
0207
0208 t = 'DC PF (with equivalent injections) : ';
0209 mpc1 = struct('baseMVA', [], 'bus', [], 'branch', [], 'gencost', [], 'dcline', []);
0210 [mpc1.baseMVA, mpc1.bus, mpc1.gen, mpc1.branch, mpc1.gencost, mpc1.dcline] = ...
0211 deal(r.baseMVA, r.bus(:, 1:VMIN), r.gen(:, 1:APF), ...
0212 r.branch(:, 1:ANGMAX), r.gencost, r.dcline(:, 1:c.LOSS1));
0213 mpc1.bus(:, VA) = 0;
0214 for k = 1:ndc
0215 if mpc1.dcline(k, c.BR_STATUS)
0216 ff = find(mpc1.bus(:, BUS_I) == mpc1.dcline(k, c.F_BUS));
0217 tt = find(mpc1.bus(:, BUS_I) == mpc1.dcline(k, c.T_BUS));
0218 mpc1.bus(ff, PD) = mpc1.bus(ff, PD) + r.dcline(k, c.PF);
0219 mpc1.bus(tt, PD) = mpc1.bus(tt, PD) - r.dcline(k, c.PT);
0220 mpc1.bus(ff, BUS_TYPE) = PV;
0221 mpc1.bus(tt, BUS_TYPE) = PV;
0222 end
0223 end
0224 [rp, success] = rundcpf(mpc1, mpopt);
0225 t_ok(success, [t 'success']);
0226 t_is( rp.bus(:,ib_voltage), r.bus(:,ib_voltage), 3, [t 'bus voltage']);
0227 t_is( rp.gen(:,ig_disp ), r.gen(:,ig_disp ), 3, [t 'gen dispatch']);
0228 t_is(rp.branch(:,ibr_flow ), r.branch(:,ibr_flow ), 3, [t 'branch flow']);
0229
0230
0231 t = 'AC OPF (with DC lines + poly cost) : ';
0232 mpc = loadcase(casefile);
0233 mpc = toggle_dcline(mpc, 'on');
0234 [r, success] = runopf(mpc, mpopt);
0235 t_ok(success, [t 'success']);
0236 expected1 = [
0237 10 8.9 -10 10 1.0663 1.0936;
0238 7.8429 7.8429 0 0 1.0809 1.0667;
0239 0 0 0 0 1.0000 1.0000;
0240 6.0549 5.7522 -0.5897 -10 1.0778 1.0667;
0241 ];
0242 t_is(r.dcline(:, c.PF:c.VT), expected1, 4, [t 'P Q V']);
0243 expected2 = [
0244 0 0.7605 0.6226 0 0 0.2980;
0245 0 0 0 0.4275 0.0792 0;
0246 0 0 0 0 0 0;
0247 0 0 0 0 0.0792 0;
0248 ];
0249 t_is(r.dcline(:, c.MU_PMIN:c.MU_QMAXT), expected2, 3, [t 'mu']);
0250
0251 mpc.dclinecost(4, 1:8) = [2 0 0 4 0 0 7.3 0];
0252 [r, success] = runopf(mpc, mpopt);
0253 t_ok(success, [t 'success']);
0254 t_is(r.dcline(:, c.PF:c.VT), expected1, 4, [t 'P Q V']);
0255 t_is(r.dcline(:, c.MU_PMIN:c.MU_QMAXT), expected2, 3, [t 'mu']);
0256
0257 t = 'AC OPF (with DC lines + pwl cost) : ';
0258 mpc.dclinecost(4, 1:8) = [1 0 0 2 0 0 10 73];
0259 [r, success] = runopf(mpc, mpopt);
0260 t_ok(success, [t 'success']);
0261 t_is(r.dcline(:, c.PF:c.VT), expected1, 4, [t 'P Q V']);
0262 t_is(r.dcline(:, c.MU_PMIN:c.MU_QMAXT), expected2, 3, [t 'mu']);
0263
0264 t = 'AC OPF w/Qg cost (with DC lines + pwl cost) : ';
0265 mpc.gencost = [mpc.gencost; mpc.gencost];
0266 mpc.gencost(4:end, COST:end) = 0;
0267 mpc.gencost(4:end, MODEL) = 2;
0268 mpc.gencost(4:end, NCOST) = 2;
0269 mpc.gencost(5, COST+1) = 1;
0270 [r, success] = runopf(mpc, mpopt);
0271 t_ok(success, [t 'success']);
0272 t_is(r.dcline(:, c.PF:c.VT), expected1, 4, [t 'P Q V']);
0273 t_is(r.dcline(:, c.MU_PMIN:c.MU_QMAXT), expected2, 3, [t 'mu']);
0274
0275 t = 'AC OPF (isolated gen bus w/DC connection) : ';
0276 mpc = loadcase(casefile2);
0277
0278
0279
0280
0281 mpc.dcline = [
0282 8 2 1 -163 163 0 0 1.025 1.025 -200 200 0 0 0 0 0 0;
0283 ];
0284 mpc.branch(7, BR_STATUS) = 0;
0285 mpc.bus(2, BUS_TYPE) = REF;
0286 mpc = toggle_dcline(mpc, 'on');
0287
0288 [r, success] = runopf(mpc, mpopt);
0289 t_ok(success, [t 'success']);
0290 t_is(r.dcline(:, c.PF:c.VT), [-134.3323 -134.3323 0 0 1.1 1], 4, [t 'P Q V']);
0291 t_is(r.dcline(:, c.MU_PMIN:c.MU_QMAXT), [0 0 0.1311 0 0 0], 4, [t 'mu']);
0292
0293 t = 'AC PF (isolated gen bus w/DC connection) : ';
0294 [r, success] = runpf(mpc, mpopt);
0295 t_ok(success, [t 'success']);
0296 t_is(r.dcline(:, c.PF:c.VT), [-163 -163 -9.6926 0 1.025 1.025], 4, [t 'P Q V']);
0297
0298 t = 'DC OPF (isolated gen bus w/DC connection) : ';
0299 [r, success] = rundcopf(mpc, mpopt);
0300 t_ok(success, [t 'success']);
0301 t_is(r.dcline(:, c.PF:c.VT), [-134.3776 -134.3776 0 0 1.025 1.025], 4, [t 'P Q V']);
0302 t_is(r.dcline(:, c.MU_PMIN:c.MU_QMAXT), [0 0 0 0 0 0], 3, [t 'mu']);
0303
0304 t = 'DC PF (isolated gen bus w/DC connection) : ';
0305 [r, success] = rundcpf(mpc, mpopt);
0306 t_ok(success, [t 'success']);
0307 t_is(r.dcline(:, c.PF:c.VT), [-163 -163 0 0 1.025 1.025], 4, [t 'P Q V']);
0308
0309
0310 if have_fcn('octave')
0311 warning(s1.state, file_in_path_warn_id);
0312 end
0313
0314 t_end;