0001 function [groupss, isolated] = case_info(mpc, fd)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029 [PQ, PV, REF, NONE, BUS_I, BUS_TYPE, PD, QD, GS, BS, BUS_AREA, VM, ...
0030 VA, BASE_KV, ZONE, VMAX, VMIN, LAM_P, LAM_Q, MU_VMAX, MU_VMIN] = idx_bus;
0031 [GEN_BUS, PG, QG, QMAX, QMIN, VG, MBASE, GEN_STATUS, PMAX, PMIN, ...
0032 MU_PMAX, MU_PMIN, MU_QMAX, MU_QMIN, PC1, PC2, QC1MIN, QC1MAX, ...
0033 QC2MIN, QC2MAX, RAMP_AGC, RAMP_10, RAMP_30, RAMP_Q, APF] = idx_gen;
0034 [F_BUS, T_BUS, BR_R, BR_X, BR_B, RATE_A, RATE_B, RATE_C, ...
0035 TAP, SHIFT, BR_STATUS, PF, QF, PT, QT, MU_SF, MU_ST, ...
0036 ANGMIN, ANGMAX, MU_ANGMIN, MU_ANGMAX] = idx_brch;
0037 c = idx_dcline;
0038
0039 if nargin < 2
0040 fd = 1;
0041 end
0042
0043 tic;
0044
0045
0046 mpc = loadcase(mpc);
0047
0048
0049 nb = size(mpc.bus, 1);
0050 nl = size(mpc.branch, 1);
0051 if isfield(mpc, 'dcline')
0052 ndc = size(mpc.dcline, 1);
0053 else
0054 ndc = 0;
0055 end
0056 ng = size(mpc.gen, 1);
0057
0058
0059 mb = max(abs([mpc.bus(:, BUS_I); mpc.gen(:, GEN_BUS); ...
0060 mpc.branch(:, F_BUS); mpc.branch(:, T_BUS)]));
0061 nbase = 10^(fix(log10(mb))+1);
0062
0063
0064
0065
0066 bus_i = mpc.bus(:, BUS_I);
0067 nonpos_bus = find(bus_i <= 0);
0068 bus_i(nonpos_bus) = -bus_i(nonpos_bus) + nbase;
0069
0070
0071
0072 e2i = sparse(bus_i, ones(nb, 1), 1:nb, nbase+mb, 1);
0073
0074
0075 unknown_gbus = unknown_buses(e2i, nbase, mpc.gen(:, GEN_BUS));
0076 unknown_fbus = unknown_buses(e2i, nbase, mpc.branch(:, F_BUS));
0077 unknown_tbus = unknown_buses(e2i, nbase, mpc.branch(:, T_BUS));
0078 if ndc
0079 unknown_fbusdc = unknown_buses(e2i, nbase, mpc.dcline(:, c.F_BUS));
0080 unknown_tbusdc = unknown_buses(e2i, nbase, mpc.dcline(:, c.T_BUS));
0081 end
0082
0083 if length(nonpos_bus)
0084 fprintf(fd, 'Bad bus numbers: %d\n', length(nonpos_bus));
0085 for k = 1:length(nonpos_bus)
0086 s = sprintf('bus(%d, BUS_I)', nonpos_bus(k));
0087 fprintf(fd, '%24s = %d\n', s, mpc.bus(nonpos_bus(k), BUS_I));
0088 end
0089 end
0090 if ~isempty(unknown_gbus)
0091 fprintf(fd, 'Unknown generator buses: %d\n', length(unknown_gbus));
0092 for k = 1:length(unknown_gbus)
0093 s = sprintf('gen(%d, GEN_BUS)', unknown_gbus(k));
0094 fprintf(fd, '%24s = %d\n', s, mpc.gen(unknown_gbus(k), GEN_BUS));
0095 end
0096
0097
0098 mpc.gen(unknown_gbus, :) = [];
0099 ng = size(mpc.gen, 1);
0100 end
0101 if ~isempty(unknown_fbus)
0102 fprintf(fd, 'Unknown branch "from" buses: %d\n', length(unknown_fbus));
0103 for k = 1:length(unknown_fbus)
0104 s = sprintf('branch(%d, F_BUS)', unknown_fbus(k));
0105 fprintf(fd, '%24s = %d\n', s, mpc.branch(unknown_fbus(k), F_BUS));
0106 end
0107 end
0108 if ~isempty(unknown_tbus)
0109 fprintf(fd, 'Unknown branch "to" buses: %d\n', length(unknown_tbus));
0110 for k = 1:length(unknown_tbus)
0111 s = sprintf('branch(%d, T_BUS)', unknown_tbus(k));
0112 fprintf(fd, '%24s = %d\n', s, mpc.branch(unknown_tbus(k), T_BUS));
0113 end
0114 end
0115
0116 if ~isempty(unknown_fbus) || ~isempty(unknown_tbus)
0117 tmp = unique([unknown_fbus; unknown_tbus]);
0118 mpc.branch(tmp, :) = [];
0119 nl = size(mpc.branch, 1);
0120 end
0121 if ndc
0122 if ~isempty(unknown_fbusdc)
0123 fprintf(fd, 'Unknown DC line "from" buses: %d\n', length(unknown_fbusdc));
0124 for k = 1:length(unknown_fbusdc)
0125 s = sprintf('dcline(%d, c.F_BUS)', unknown_fbusdc(k));
0126 fprintf(fd, '%24s = %d\n', s, mpc.dcline(unknown_fbusdc(k), c.F_BUS));
0127 end
0128 end
0129 if ~isempty(unknown_tbusdc)
0130 fprintf(fd, 'Unknown DC line "to" buses: %d\n', length(unknown_tbusdc));
0131 for k = 1:length(unknown_tbusdc)
0132 s = sprintf('dcline(%d, c.T_BUS)', unknown_tbusdc(k));
0133 fprintf(fd, '%24s = %d\n', s, mpc.dcline(unknown_tbusdc(k), c.T_BUS));
0134 end
0135 end
0136
0137 if ~isempty(unknown_fbusdc) || ~isempty(unknown_tbusdc)
0138 tmp = unique([unknown_fbusdc; unknown_tbusdc]);
0139 mpc.dcline(tmp, :) = [];
0140 ndc = size(mpc.dcline, 1);
0141 end
0142 end
0143
0144 if length(nonpos_bus) == 0
0145
0146
0147 C_on = sparse(1:nl, e2i(mpc.branch(:, F_BUS)), -mpc.branch(:, BR_STATUS), nl, nb) + ...
0148 sparse(1:nl, e2i(mpc.branch(:, T_BUS)), mpc.branch(:, BR_STATUS), nl, nb);
0149 C = sparse(1:nl, e2i(mpc.branch(:, F_BUS)), -1, nl, nb) + ...
0150 sparse(1:nl, e2i(mpc.branch(:, T_BUS)), 1, nl, nb);
0151 if ndc
0152 Cdc_on = sparse(1:ndc, e2i(mpc.dcline(:, c.F_BUS)), -mpc.dcline(:, c.BR_STATUS), ndc, nb) + ...
0153 sparse(1:ndc, e2i(mpc.dcline(:, c.T_BUS)), mpc.dcline(:, c.BR_STATUS), ndc, nb);
0154 Cdc = sparse(1:ndc, e2i(mpc.dcline(:, c.F_BUS)), -1, ndc, nb) + ...
0155 sparse(1:ndc, e2i(mpc.dcline(:, c.T_BUS)), 1, ndc, nb);
0156 end
0157 Cg_on = sparse(1:ng, e2i(mpc.gen(:, GEN_BUS)), mpc.gen(:, GEN_STATUS), ng, nb);
0158 Cg = sparse(1:ng, e2i(mpc.gen(:, GEN_BUS)), 1, ng, nb);
0159
0160
0161 fprintf(fd, 'Checking connectivity ... ');
0162 [groups, isolated] = connected_components(C_on);
0163
0164 ngr = length(groups);
0165 nis = length(isolated);
0166 have_isolated = nis > 0;
0167 if ngr == 1
0168 if have_isolated
0169 if nis == 1, s = ''; else, s = 'es'; end
0170 fprintf(fd, 'single connected network, plus %d isolated bus%s\n', nis, s);
0171 else
0172 fprintf(fd, 'single fully connected network\n');
0173 end
0174 else
0175 if nis == 1, s = ''; else, s = 'es'; end
0176 fprintf(fd, '%d connected groups, %d isolated bus%s\n', ngr, nis, s);
0177 end
0178
0179
0180 bron = mpc.branch(:, BR_STATUS) > 0;
0181 broff = mpc.branch(:, BR_STATUS) <= 0;
0182 if ndc
0183 dcon = mpc.dcline(:, c.BR_STATUS) > 0;
0184 dcoff = mpc.dcline(:, c.BR_STATUS) <= 0;
0185 end
0186 gon = mpc.gen(:, GEN_STATUS) > 0;
0187 goff = mpc.gen(:, GEN_STATUS) <= 0;
0188
0189
0190 d0 = struct( ...
0191 'nb', 0, ...
0192 'nl', 0, ...
0193 'nl_on', 0, ...
0194 'nl_off', 0, ...
0195 'nlt', 0, ...
0196 ...
0197 'nlt_off', 0, ...
0198 'ndc', 0, ...
0199 'ndc_on', 0, ...
0200 'ndc_off', 0, ...
0201 'ndct', 0, ...
0202 'ndct_on', 0, ...
0203 'ndct_off', 0, ...
0204 'ndc_all', 0, ...
0205 'ng', 0, ...
0206 'ng_on', 0, ...
0207 'ng_off', 0, ...
0208 'nsh', 0, ...
0209 'nld', 0, ...
0210 'nld_on', 0, ...
0211 'nld_off', 0, ...
0212 'nfld', 0, ...
0213 'ndld', 0, ...
0214 'ndld_on', 0, ...
0215 'ndld_off', 0, ...
0216 'Pmax', 0, ...
0217 'Qmax', 0, ...
0218 'Pmax_on', 0, ...
0219 'Qmax_on', 0, ...
0220 'Pmax_off', 0, ...
0221 'Qmax_off', 0, ...
0222 'Pmin', 0, ...
0223 'Qmin', 0, ...
0224 'Pmin_on', 0, ...
0225 'Qmin_on', 0, ...
0226 'Pmin_off', 0, ...
0227 'Qmin_off', 0, ...
0228 'Pg', 0, ...
0229 'Qg', 0, ...
0230 'Ps', 0, ...
0231 'Qs', 0, ...
0232 'Ploss', 0, ...
0233 'Qloss', 0, ...
0234 'Pd', 0, ...
0235 'Qd', 0, ...
0236 'Pd_fixed', 0, ...
0237 'Qd_fixed', 0, ...
0238 'Pd_disp_cap', 0, ...
0239 'Qd_disp_cap', 0, ...
0240 'Pd_disp_cap_on', 0, ...
0241 'Qd_disp_cap_on', 0, ...
0242 'Pd_disp_cap_off', 0, ...
0243 'Qd_disp_cap_off', 0, ...
0244 'Pd_disp', 0, ...
0245 'Qd_disp', 0, ...
0246 'Pd_curtailed', 0, ...
0247 'Qd_curtailed', 0, ...
0248 'Pd_cap', 0, ...
0249 'Qd_cap', 0, ...
0250 'Pd_cap_on', 0, ...
0251 'Qd_cap_on', 0, ...
0252 'Pd_cap_off', 0, ...
0253 'Qd_cap_off', 0, ...
0254 'Pdc', 0, ...
0255 'Pmaxdc', 0, ...
0256 'Pmaxdc_on', 0, ...
0257 'Pmaxdc_off', 0, ...
0258 'Pmindc', 0, ...
0259 'Pmindc_on', 0, ...
0260 'Pmindc_off', 0 ...
0261 );
0262 d = d0;
0263 total = d0;
0264 allrefs = find(mpc.bus(:, BUS_TYPE) == REF);
0265 refs = {};
0266 nrefs = 0;
0267 ibr_tie_all = [];
0268 idc_tie_all = [];
0269 idc_tie_all_on = [];
0270 idc_tie_all_off = [];
0271
0272
0273 fields = fieldnames(d);
0274 for k = 1:ngr+have_isolated
0275
0276 for f = 1:length(fields)
0277 ff = fields{f};
0278 d(k).(ff) = d0.(ff);
0279 end
0280 if k > ngr
0281 b = isolated';
0282 ibr = [];
0283 idc = [];
0284 else
0285 b = groups{k};
0286
0287 ibr = find(sum(abs(C(:, b)), 2) & ~sum(C(:, b), 2));
0288 if ndc
0289 idc = find(sum(abs(Cdc(:, b)), 2) & ~sum(Cdc(:, b), 2));
0290 else
0291 idc = [];
0292 end
0293 end
0294
0295 ibr_tie = find(sum(C(:, b), 2));
0296 if ndc
0297 idc_tie = find(sum(Cdc(:, b), 2));
0298 else
0299 idc_tie = [];
0300 end
0301 refs{k} = b(find(mpc.bus(b, BUS_TYPE) == REF));
0302 nrefs = nrefs + length(refs{k});
0303
0304 ibr_on = ibr(find(bron(ibr)));
0305 ibr_off = ibr(find(broff(ibr)));
0306
0307 ibr_tie_off = ibr_tie(find(broff(ibr_tie)));
0308 ibr_tie_all = unique([ ibr_tie_all; ibr_tie_off ]);
0309 if ndc
0310 idc_on = idc(find(dcon(idc)));
0311 idc_off = idc(find(dcoff(idc)));
0312 idc_tie_on = idc_tie(find(dcon(idc_tie)));
0313 idc_tie_off = idc_tie(find(dcoff(idc_tie)));
0314 idc_tie_all = unique([ idc_tie_all; idc_tie ]);
0315 idc_tie_all_on = unique([ idc_tie_all_on; idc_tie_on ]);
0316 idc_tie_all_off = unique([ idc_tie_all_off; idc_tie_off ]);
0317 end
0318 ig = find(sum(abs(Cg(:, b)), 2));
0319 if isempty(ig)
0320 ig_on = [];
0321 ig_off = [];
0322 idld_on = [];
0323 idld_off= [];
0324 else
0325 ig_on = ig(find(gon(ig) & ~isload(mpc.gen(ig, :))));
0326 ig_off = ig(find(goff(ig) & ~isload(mpc.gen(ig, :))));
0327 idld_on = ig(find(gon(ig) & isload(mpc.gen(ig, :))));
0328 idld_off= ig(find(goff(ig) & isload(mpc.gen(ig, :))));
0329 end
0330
0331 d(k).nb = length(b);
0332 d(k).nl = length(ibr);
0333 d(k).nl_on = length(ibr_on);
0334 d(k).nl_off = length(ibr_off);
0335 d(k).nlt = length(ibr_tie);
0336
0337 d(k).nlt_off = length(ibr_tie_off);
0338 if ndc
0339 d(k).ndc = length(idc);
0340 d(k).ndc_on = length(idc_on);
0341 d(k).ndc_off = length(idc_off);
0342 d(k).ndct = length(idc_tie);
0343 d(k).ndct_on = length(idc_tie_on);
0344 d(k).ndct_off = length(idc_tie_off);
0345 d(k).ndc_all = d(k).ndc + d(k).ndct;
0346 end
0347 d(k).ng = length(ig_on) + length(ig_off);
0348 d(k).ng_on = length(ig_on);
0349 d(k).ng_off = length(ig_off);
0350 d(k).nsh = length(find(mpc.bus(b, GS) ~= 0 | mpc.bus(b, BS) ~= 0));
0351 d(k).nfld = length(find(mpc.bus(b, PD) ~= 0 | mpc.bus(b, QD) ~= 0));
0352 d(k).ndld = length(idld_on) + length(idld_off);
0353 d(k).ndld_on = length(idld_on);
0354 d(k).ndld_off = length(idld_off);
0355 d(k).nld = d(k).nfld + d(k).ndld;
0356 d(k).nld_on = d(k).nfld + d(k).ndld_on;
0357 d(k).nld_off = d(k).ndld_off;
0358
0359 d(k).Pmax_on = sum(mpc.gen(ig_on, PMAX));
0360 d(k).Pmax_off = sum(mpc.gen(ig_off, PMAX));
0361 d(k).Pmax = d(k).Pmax_on + d(k).Pmax_off;
0362 d(k).Pmin_on = sum(mpc.gen(ig_on, PMIN));
0363 d(k).Pmin_off = sum(mpc.gen(ig_off, PMIN));
0364 d(k).Pmin = d(k).Pmin_on + d(k).Pmin_off;
0365 d(k).Pg = sum(mpc.gen(ig_on, PG));
0366
0367 d(k).Qmax_on = sum(mpc.gen(ig_on, QMAX));
0368 d(k).Qmax_off = sum(mpc.gen(ig_off, QMAX));
0369 d(k).Qmax = d(k).Qmax_on + d(k).Qmax_off;
0370 d(k).Qmin_on = sum(mpc.gen(ig_on, QMIN));
0371 d(k).Qmin_off = sum(mpc.gen(ig_off, QMIN));
0372 d(k).Qmin = d(k).Qmin_on + d(k).Qmin_off;
0373 d(k).Qg = sum(mpc.gen(ig_on, QG));
0374
0375 d(k).Ps = sum(-mpc.bus(b, VM) .^ 2 .* mpc.bus(b, GS));
0376 d(k).Qs = sum( mpc.bus(b, VM) .^ 2 .* mpc.bus(b, BS));
0377 if size(mpc.branch, 2) > PF
0378 d(k).Ploss = sum(mpc.branch(ibr_on, PF) + mpc.branch(ibr_on, PT));
0379 d(k).Qloss = sum(mpc.branch(ibr_on, QF) + mpc.branch(ibr_on, QT));
0380 end
0381
0382 d(k).Pd_fixed = sum(mpc.bus(b, PD));
0383 d(k).Qd_fixed = sum(mpc.bus(b, QD));
0384 d(k).Pd_disp_cap_on = sum(-mpc.gen(idld_on, PMIN));
0385 d(k).Qd_disp_cap_on = sum(-mpc.gen(idld_on, QMIN));
0386 d(k).Pd_disp_cap_off = sum(-mpc.gen(idld_off, PMIN));
0387 d(k).Qd_disp_cap_off = sum(-mpc.gen(idld_off, QMIN));
0388 d(k).Pd_disp_cap = d(k).Pd_disp_cap_on + d(k).Pd_disp_cap_off;
0389 d(k).Qd_disp_cap = d(k).Qd_disp_cap_on + d(k).Qd_disp_cap_off;
0390 d(k).Pd_disp = sum(-mpc.gen(idld_on, PG));
0391 d(k).Qd_disp = sum(-mpc.gen(idld_on, QG));
0392 d(k).Pd_curtailed = d(k).Pd_disp_cap_on - d(k).Pd_disp;
0393 d(k).Qd_curtailed = d(k).Qd_disp_cap_on - d(k).Qd_disp;
0394 d(k).Pd = d(k).Pd_fixed + d(k).Pd_disp;
0395 d(k).Qd = d(k).Qd_fixed + d(k).Qd_disp;
0396 d(k).Pd_cap = d(k).Pd_fixed + d(k).Pd_disp_cap;
0397 d(k).Qd_cap = d(k).Qd_fixed + d(k).Qd_disp_cap;
0398 d(k).Pd_cap_on = d(k).Pd_fixed + d(k).Pd_disp_cap_on;
0399 d(k).Qd_cap_on = d(k).Qd_fixed + d(k).Qd_disp_cap_on;
0400 d(k).Pd_cap_off = d(k).Pd_disp_cap_off;
0401 d(k).Qd_cap_off = d(k).Qd_disp_cap_off;
0402
0403 if ndc
0404 f = find(sum(Cdc(:, b), 2) < 0);
0405 t = find(sum(Cdc(:, b), 2) > 0);
0406 d(k).Pdc = sum(mpc.dcline(f, c.PF)) - sum(mpc.dcline(t, c.PT));
0407 d(k).Pmaxdc = sum(mpc.dcline(f, c.PMAX)) - sum(mpc.dcline(t, c.PMAX));
0408 d(k).Pmindc = sum(mpc.dcline(f, c.PMIN)) - sum(mpc.dcline(t, c.PMIN));
0409 f = find(sum(Cdc(:, b), 2) < 0 & dcon);
0410 t = find(sum(Cdc(:, b), 2) > 0 & dcon);
0411 d(k).Pmaxdc_on = sum(mpc.dcline(f, c.PMAX)) - sum(mpc.dcline(t, c.PMAX));
0412 d(k).Pmindc_on = sum(mpc.dcline(f, c.PMIN)) - sum(mpc.dcline(t, c.PMIN));
0413 f = find(sum(Cdc(:, b), 2) < 0 & dcoff);
0414 t = find(sum(Cdc(:, b), 2) > 0 & dcoff);
0415 d(k).Pmaxdc_off = sum(mpc.dcline(f, c.PMAX)) - sum(mpc.dcline(t, c.PMAX));
0416 d(k).Pmindc_off = sum(mpc.dcline(f, c.PMIN)) - sum(mpc.dcline(t, c.PMIN));
0417 end
0418
0419
0420 for f = 1:length(fields)
0421 ff = fields{f};
0422 total.(ff) = total.(ff) + d(k).(ff);
0423 end
0424
0425 total.nl = nl;
0426 total.nl_on = length(find(bron));
0427 total.nl_off = length(find(broff));
0428 total.ndc = ndc;
0429 if ndc
0430 total.ndc_on = length(find(dcon));
0431 total.ndc_off = length(find(dcoff));
0432 else
0433 total.ndc_on = 0;
0434 total.ndc_off = 0;
0435 end
0436 end
0437 total.nlt = length(ibr_tie_all);
0438
0439 total.nlt_off = length(ibr_tie_all);
0440 if ndc
0441 total.ndct = length(idc_tie_all);
0442 total.ndct_on = length(idc_tie_all_on);
0443 total.ndct_off = length(idc_tie_all_off);
0444 end
0445
0446
0447 et = toc;
0448 fprintf(fd, 'Elapsed time is %f seconds.\n', et);
0449 fprintf(fd, '================================================================================\n');
0450 pages = ceil((ngr + have_isolated + 1) / 5);
0451 for page = 1:pages
0452 if page == 1
0453 if ngr == 1 && ~have_isolated
0454 islands = [];
0455 else
0456 islands = 1:min(4, ngr+have_isolated);
0457 end
0458 else
0459 fprintf(fd, '--------------------------------------------------------------------------------\n');
0460 islands = (5*(page-1)):min(5*page-1, ngr+have_isolated);
0461 end
0462
0463
0464 fprintf(fd, '%-20s', '');
0465 if page == 1
0466 fprintf(fd, ' Full ');
0467 end
0468 for k = islands
0469 if k > ngr
0470 fprintf(fd, ' Isolated ');
0471 else
0472 fprintf(fd, ' Island ');
0473 end
0474 end
0475 fprintf(fd, '\n');
0476
0477
0478 fprintf(fd, '%-20s', '');
0479 if page == 1
0480 fprintf(fd, ' System ');
0481 end
0482 for k = islands
0483 if k > ngr
0484 fprintf(fd, ' Buses ');
0485 else
0486 fprintf(fd, ' %5d ', k);
0487 end
0488 end
0489 fprintf(fd, '\n');
0490
0491
0492 fprintf(fd, '%-20s', 'Number of:');
0493 if page == 1
0494 fprintf(fd, ' ---------- ');
0495 end
0496 for k = islands
0497 fprintf(fd, ' ---------- ');
0498 end
0499 fprintf(fd, '\n');
0500
0501 p = struct('page', page, 'islands', islands, 'total', total, 'd', d);
0502
0503 print_row(fd, p, ' %8d ', ' buses', 'nb');
0504 print_row(fd, p, ' %8d ', ' loads', 'nld');
0505 print_row(fd, p, ' %8d ', ' on', 'nld_on');
0506 print_row(fd, p, ' %8d ', ' off', 'nld_off');
0507 print_row(fd, p, ' %8d ', ' fixed', 'nfld');
0508 print_row(fd, p, ' %8d ', ' dispatchable', 'ndld');
0509 print_row(fd, p, ' %8d ', ' on', 'ndld_on');
0510 print_row(fd, p, ' %8d ', ' off', 'ndld_off');
0511 print_row(fd, p, ' %8d ', ' generators', 'ng');
0512 print_row(fd, p, ' %8d ', ' on', 'ng_on');
0513 print_row(fd, p, ' %8d ', ' off', 'ng_off');
0514 print_row(fd, p, ' %8d ', ' shunt elements', 'nsh');
0515 print_row(fd, p, ' %8d ', ' branches', 'nl');
0516 print_row(fd, p, ' %8d ', ' on', 'nl_on');
0517 print_row(fd, p, ' %8d ', ' off', 'nl_off');
0518
0519 print_row(fd, p, ' %8d ', ' ties (off)', 'nlt_off');
0520 if ndc
0521 print_row(fd, p, ' %8d ', ' DC lines', 'ndc_all');
0522 print_row(fd, p, ' %8d ', ' within', 'ndc');
0523 print_row(fd, p, ' %8d ', ' on', 'ndc_on');
0524 print_row(fd, p, ' %8d ', ' off', 'ndc_off');
0525 print_row(fd, p, ' %8d ', ' ties', 'ndct');
0526 print_row(fd, p, ' %8d ', ' on', 'ndct_on');
0527 print_row(fd, p, ' %8d ', ' off', 'ndct_off');
0528 end
0529
0530 fprintf(fd, '\n%-20s\n', 'Load');
0531 fprintf(fd, '%-20s\n', ' active (MW)');
0532 print_row(fd, p, '%11.1f ', ' dispatched', 'Pd');
0533 print_row(fd, p, '%11.1f ', ' fixed', 'Pd_fixed');
0534 print_row(fd, p, '%11.1f ', ' dispatchable', 'Pd_disp');
0535 print_row(fd, p, '%11.1f ', ' curtailed', 'Pd_curtailed');
0536 print_row(fd, p, '%11.1f ', ' nominal', 'Pd_cap');
0537 print_row(fd, p, '%11.1f ', ' on', 'Pd_cap_on');
0538 print_row(fd, p, '%11.1f ', ' off', 'Pd_cap_off');
0539 print_row(fd, p, '%11.1f ', ' fixed', 'Pd_fixed');
0540 print_row(fd, p, '%11.1f ', ' dispatchable', 'Pd_disp_cap');
0541 print_row(fd, p, '%11.1f ', ' on', 'Pd_disp_cap_on');
0542 print_row(fd, p, '%11.1f ', ' off', 'Pd_disp_cap_off');
0543 fprintf(fd, '%-20s\n', ' reactive (MVAr)');
0544 print_row(fd, p, '%11.1f ', ' dispatched', 'Qd');
0545 print_row(fd, p, '%11.1f ', ' fixed', 'Qd_fixed');
0546 print_row(fd, p, '%11.1f ', ' dispatchable', 'Qd_disp');
0547 print_row(fd, p, '%11.1f ', ' curtailed', 'Qd_curtailed');
0548 print_row(fd, p, '%11.1f ', ' nominal', 'Qd_cap');
0549 print_row(fd, p, '%11.1f ', ' on', 'Qd_cap_on');
0550 print_row(fd, p, '%11.1f ', ' off', 'Qd_cap_off');
0551 print_row(fd, p, '%11.1f ', ' fixed', 'Qd_fixed');
0552 print_row(fd, p, '%11.1f ', ' dispatchable', 'Qd_disp_cap');
0553 print_row(fd, p, '%11.1f ', ' on', 'Qd_disp_cap_on');
0554 print_row(fd, p, '%11.1f ', ' off', 'Qd_disp_cap_off');
0555
0556 fprintf(fd, '\n%-20s\n', 'Generation');
0557 fprintf(fd, '%-20s\n', ' active (MW)');
0558 print_row(fd, p, '%11.1f ', ' dispatched', 'Pg');
0559 print_row(fd, p, '%11.1f ', ' max capacity', 'Pmax');
0560 print_row(fd, p, '%11.1f ', ' on', 'Pmax_on');
0561 print_row(fd, p, '%11.1f ', ' off', 'Pmax_off');
0562 print_row(fd, p, '%11.1f ', ' min capacity', 'Pmin');
0563 print_row(fd, p, '%11.1f ', ' on', 'Pmin_on');
0564 print_row(fd, p, '%11.1f ', ' off', 'Pmin_off');
0565 fprintf(fd, '%-20s\n', ' reactive (MVAr)');
0566 print_row(fd, p, '%11.1f ', ' dispatched', 'Qg');
0567 print_row(fd, p, '%11.1f ', ' max capacity', 'Qmax');
0568 print_row(fd, p, '%11.1f ', ' on', 'Qmax_on');
0569 print_row(fd, p, '%11.1f ', ' off', 'Qmax_off');
0570 print_row(fd, p, '%11.1f ', ' min capacity', 'Qmin');
0571 print_row(fd, p, '%11.1f ', ' on', 'Qmin_on');
0572 print_row(fd, p, '%11.1f ', ' off', 'Qmin_off');
0573
0574 fprintf(fd, '\n%-20s\n', 'Shunt Injections');
0575 print_row(fd, p, '%11.1f ', ' active (MW)', 'Ps');
0576 print_row(fd, p, '%11.1f ', ' reactive (MVAr)', 'Qs');
0577
0578 fprintf(fd, '\n%-20s\n', 'Branch Losses');
0579 print_row(fd, p, '%11.1f ', ' active (MW)', 'Ploss');
0580 print_row(fd, p, '%11.1f ', ' reactive (MVAr)', 'Qloss');
0581
0582 fprintf(fd, '\n%-20s\n', 'DC line');
0583 fprintf(fd, '%-20s\n', ' export (MW)');
0584 print_row(fd, p, '%11.1f ', ' dispatch', 'Pdc');
0585 print_row(fd, p, '%11.1f ', ' max capacity', 'Pmaxdc');
0586 print_row(fd, p, '%11.1f ', ' on', 'Pmaxdc_on');
0587 print_row(fd, p, '%11.1f ', ' off', 'Pmaxdc_off');
0588 print_row(fd, p, '%11.1f ', ' min capacity', 'Pmindc');
0589 print_row(fd, p, '%11.1f ', ' on', 'Pmindc_on');
0590 print_row(fd, p, '%11.1f ', ' off', 'Pmindc_off');
0591
0592 fprintf(fd, '\n%-20s\n', 'Reference Buses');
0593
0594 fprintf(fd, '%-20s', ' num of ref buses');
0595 if page == 1
0596 fprintf(fd, ' %8d ', nrefs);
0597 end
0598 for k = islands
0599 fprintf(fd, ' %8d ', length(refs{k}));
0600 end
0601 fprintf(fd, '\n');
0602
0603 for j = 1:nrefs
0604 if j == 1
0605 fprintf(fd, '%-20s', ' ref bus numbers');
0606 else
0607 fprintf(fd, '%-20s', '');
0608 end
0609 if page == 1
0610 fprintf(fd, ' %8d ', mpc.bus(allrefs(j), BUS_I));
0611 end
0612 for k = islands
0613 if j <= length(refs{k})
0614 fprintf(fd, ' %8d ', mpc.bus(refs{k}(j), BUS_I));
0615 else
0616 fprintf(fd, ' %8s ', '');
0617 end
0618 end
0619 fprintf(fd, '\n');
0620 end
0621
0622 if page ~= pages
0623 fprintf(fd, '\n\n');
0624 end
0625 end
0626
0627 end
0628
0629
0630 if nargout > 0
0631 groupss = groups;
0632 end
0633
0634
0635 function print_row(fd, p, template, name, field)
0636 templatez = sprintf('%%%ds', length(sprintf(template, 0)));
0637 fprintf(fd, '%-20s', name);
0638 if p.page == 1
0639 if p.total.(field) == 0
0640 fprintf(fd, templatez, '- ');
0641 else
0642 fprintf(fd, template, p.total.(field));
0643 end
0644 end
0645 for k = p.islands
0646 if p.d(k).(field) == 0
0647 fprintf(fd, templatez, '- ');
0648 else
0649 fprintf(fd, template, p.d(k).(field));
0650 end
0651 end
0652 fprintf(fd, '\n');
0653
0654
0655 function unknown = unknown_buses(e2i, nbase, bus_list)
0656 nonpos = find(bus_list <= 0);
0657 bus_list(nonpos) = -bus_list(nonpos) + nbase;
0658 unknown = find(e2i(bus_list) == 0);