📄 fm_ncomp.m
字号:
function fm_ncomp% FM_NCOMP search components used in the current data% file and initializes fields used for power% flow computations.%% CHECK = FM_NCOMP%%see also FM_SLF%%Author: Federico Milano%Date: 11-Nov-2002%Update: 22-Feb-2003%Version: 1.0.1%%E-mail: fmilano@thunderbox.uwaterloo.ca%Web-site: http://thunderbox.uwaterloo.ca/~fmilano%% Copyright (C) 2002-2006 Federico Milanofm_varSettings.ok = 1;% check busesif isempty(Bus.con) fm_disp(['The data file does not seem to be in a valid ', ... 'format: no bus found.']) returnendBus.n = length(Bus.con(:,1));% set up internal bus numbers for second indexing of busesBus.int(round(Bus.con(:,1)),1) = [1:Bus.n];busmax = length(Bus.int);% check bus voltage ratesif length(Bus.con(1,:)) < 2 fm_disp('No voltage rates found in Bus data.',2) returnendidx = find(Bus.con(:,2) == 0);if ~isempty(idx) fm_disp('Some Bus voltage rate is zero! 1 kV will be used.') Bus.con(idx,2) = 1;end% check or create bus namesif length(Varname.bus) ~= Bus.n fm_disp('Bus names in Varname.bus does not match bus number.',2) Varname.bus = '';endif isempty(Varname.bus) Varname.bus = cell(Bus.n,1); ibusmax = fix(log10(max(Bus.con(:,1)))); for j = 1:Bus.n b = int2str(Bus.con(j,1)); zerib = []; for i = 1:ibusmax-length(b) zerib = [zerib, ' ']; end Varname.bus{j} = ['Bus ', zerib, b]; endend% check three-winding transformersif ~isempty(Twt.con) % check data [n_twt_rows, n_twt_cols] = size(Twt.con); if n_twt_cols < 14 fm_disp(['Three-winding transformer data does not ', ... 'seems in a valid format',2]) return elseif n_twt_cols < 15 Twt.con = [Twt.con, ones(n_twt_rows,1), zeros(n_twt_rows,9)]; elseif n_twt_cols < 24 Twt.con = [Twt.con, zeros(n_twt_rows,24-n_twt_cols)]; end % modify Bus.con twt_bus = busmax+[1:n_twt_rows]'; twt_Vn = Twt.con(:,6); twt_ar = Bus.con(Bus.int(Twt.con(:,2)),[5 6]); Bus.con = [Bus.con; [twt_bus, twt_Vn, ... ones(n_twt_rows,1), ... zeros(n_twt_rows,1), twt_ar]]; Bus.int = [Bus.int; Bus.n+[1:n_twt_rows]']; Bus.n = Bus.n + n_twt_rows; busmax = busmax + n_twt_rows; % check Varname if ~isempty(Varname.bus) for i = 1:n_twt_rows Varname.bus{end+1,1} = ... [Varname.bus{Bus.int(Twt.con(i,1))},'(twt)']; end end % compute branch impedances r12 = Twt.con(:,9); r13 = Twt.con(:,10); r23 = Twt.con(:,11); r1 = 0.5*(r12+r13-r23); r2 = 0.5*(r12+r23-r13); r3 = 0.5*(r23+r13-r12); x12 = Twt.con(:,12); x13 = Twt.con(:,13); x23 = Twt.con(:,14); x1 = 0.5*(x12+x13-x23); x2 = 0.5*(x12+x23-x13); x3 = 0.5*(x23+x13-x12); % check for zero impedances in the equivalent star idx = find(abs(x1) < 1e-5); if ~isempty(idx), x1(idx) = 0.0001; end idx = find(abs(x2) < 1e-5); if ~isempty(idx), x2(idx) = 0.0001; end idx = find(abs(x3) < 1e-5); if ~isempty(idx), x3(idx) = 0.0001; end % check Line.con column number if ~isempty(Line.con) ncol = length(Line.con(1,:)); if ncol < 15, Line.con = [Line.con, zeros(Line.n,15-ncol)]; end if ncol > 15, Line.con = Line.con(:,[1:15]); end end % modify Line.con line1 = [Twt.con(:,1),twt_bus, Twt.con(:,[4,6,5]),zeros(n_twt_rows,1), ... ones(n_twt_rows,1),r1,x1,zeros(n_twt_rows,1), ... Twt.con(:,15), zeros(n_twt_rows,1),Twt.con(:,[16,19,22])]; line2 = [twt_bus,Twt.con(:,[2,4,6,5]),zeros(n_twt_rows,1), ... Twt.con(:,6)./Twt.con(:,7),r2,x2,zeros(n_twt_rows,1), ... ones(n_twt_rows,1),zeros(n_twt_rows,1),Twt.con(:,[17,20,23])]; line3 = [twt_bus,Twt.con(:,[3,4,6,5]),zeros(n_twt_rows,1), ... Twt.con(:,6)./Twt.con(:,8),r3,x3, zeros(n_twt_rows,1), ... ones(n_twt_rows,1), zeros(n_twt_rows,1),Twt.con(:,[18,21,24])]; Line.con = [Line.con; line1; line2; line3]; % clear Twt.con Twt.con = [];end% check linesif ~isempty(Line.con) Line.n = length(Line.con(:,1));end% process line dataif Line.n > 0 from_bus = Line.con(:,1); Line.from = Bus.int(round(from_bus)); to_bus = Line.con(:,2); Line.to = Bus.int(round(to_bus)); ncol = length(Line.con(1,:)); if ncol < 15, Line.con = [Line.con, zeros(Line.n,15-ncol)]; end Line.con(find(abs(Line.con(:,11))==0),11) = 1; % check for parameter units (if the length is > 0, unit is km) idx = find(Line.con(:,6)); if ~isempty(idx) XB = Line.con(idx,4).*Line.con(idx,4)./Line.con(idx,3); Line.con(idx,8) = Line.con(idx,6).*Line.con(idx,8)./XB; Line.con(idx,9) = Line.con(idx,6).*Line.con(idx,9)./XB*Settings.rad; Line.con(idx,10) = Line.con(idx,6).*Line.con(idx,10).*XB/Settings.rad; bidx = find(Line.con(idx,10) > 10); if ~isempty(bidx) fm_disp('Warning: Some line susceptances are too high...') fm_disp([' microFarad are assumed for those susceptance' ... ' values']) Line.con(idx(bidx),10) = Line.con(idx(bidx),10)/1e6; end endend% set up shunt admittancesShunt.g = zeros(Bus.n,1); % bus conductanceShunt.b = zeros(Bus.n,1); % bus susceptanceif ~isempty(Shunt.con) Shunt.bus = Bus.int(Shunt.con(:,1)); Shunt.g = sparse(Shunt.bus,1,Shunt.con(:,5),Bus.n,1); Shunt.b = sparse(Shunt.bus,1,Shunt.con(:,6),Bus.n,1);endif ~isempty(Breaker.con) Breaker.line = Breaker.con(:,1); Breaker.bus = Bus.int(Breaker.con(:,2)); Breaker.n = length(Breaker.con(:,1)); % store line data Breaker.con(:,[9 10 11 12 13]) = ... Line.con(Breaker.line,[8 9 10 11 12]); idx = find(~Breaker.con(:,6)); % change status of the line in case breakers are open if ~isempty(idx) & ~isempty(Line.con) Line.con(Breaker.line(idx),[8 9 10 11 12]) = ... [zeros(length(idx),1), 1e6*ones(length(idx),1), ... zeros(length(idx),1), ones(length(idx),1), ... zeros(length(idx),1)]; % + Breaker.con(idx,[9 10 11 12 13]); % swap intervention time so that first % intervention will close the breaker Breaker.con(idx,[7 8]) = Breaker.con(idx,[8 7]); end % intervention times t = 0 are not allowed idx = find(Breaker.con(:,7) == 0); if ~isempty(idx) Breaker.con(idx,7) = 1e-6; Breaker.con(idx,8) = Breaker.con(idx,8)+1e-6; endendDAE.J11 = sparse(Bus.n,Bus.n);DAE.J21 = sparse(Bus.n,Bus.n);DAE.J12 = sparse(Bus.n,Bus.n);DAE.J22 = sparse(Bus.n,Bus.n);DAE.Jlf = sparse(2*Bus.n,2*Bus.n);DAE.Jlfv = sparse(2*Bus.n,2*Bus.n);DAE.Jlfd = sparse(2*Bus.n,2*Bus.n);DAE.gp = zeros(Bus.n,1);DAE.glfp = zeros(Bus.n,1);DAE.gq = zeros(Bus.n,1);DAE.glfq = zeros(Bus.n,1);if length(Bus.con(1,:)) >= 4, Vlow = find(Bus.con(:,3) < 0.5); Vhigh = find(Bus.con(:,3) > 1.5); if ~isempty(Vlow), fm_disp(['Warning: some initial guess voltage magnitudes are too low.']) end if ~isempty(Vhigh), fm_disp(['Warning: some initial guess voltage magnitudes are too high.']) end DAE.V = Bus.con(:,3); % check voltage phases aref = min(abs(Bus.con(:,4))); alow = find(Bus.con(:,4)-aref < -1.5708); ahigh = find(Bus.con(:,4)-aref > 1.5708); if ~isempty(alow), fm_disp(['Warning: some initial guess voltage phases are too low.']) end if ~isempty(ahigh), fm_disp(['Warning: some initial guess voltage phases are too high.']) end DAE.a = Bus.con(:,4);else DAE.V = ones(Bus.n,1); DAE.a = zeros(Bus.n,1);endBus.Pl = zeros(Bus.n,1);Bus.Ql = zeros(Bus.n,1);Bus.Pg = zeros(Bus.n,1);Bus.Qg = zeros(Bus.n,1);% setup componentsSW = setup(SW);% check areasif ~isempty(Area.con) Area.n = length(Area.con(:,1)); Area.slack = Bus.int(round(Area.con(:,2)));else Area.con = [1, SW.con(1,1), 100, 0, 0]; Area.n = 1; Area.slack = SW.bus(1);endPV = setup(PV);% check of distributed slack bus model consistencyidxpv = pvgamma(PV,'sum');idxsw = swgamma(SW,'sum');if ~idxpv & ~idxsw, SW = setgamma(SW); endglobal PQgenif ~isempty(PQgen.con) PQgen.con(:,4) = -PQgen.con(:,4); PQgen.con(:,5) = -PQgen.con(:,5); [genr,genc] = size(PQgen.con); if ~isempty(PQ.con) [rows,cols] = size(PQ.con); if cols > genc PQ.con = [PQ.con; [PQgen.con, zeros(genr,cols-genc)]]; elseif cols < genc PQ.con = [[PQ.con, zeros(rows,genc-cols)]; PQgen.con]; else PQ.con = [PQ.con; PQgen.con]; end PQ.gen = zeros(genr+rows,1); PQ.gen(rows+1:end) = 1; else PQ.con = PQgen.con; PQ.gen = ones(genr,1); endendPQ = setup(PQ);if ~isempty(Mn.con) Mn.n = length(Mn.con(:,1)); Mn.bus = Bus.int(round(Mn.con(:,1))); Mn.init = find(~Mn.con(:,8));endif ~isempty(Pl.con) Pl.n = length(Pl.con(:,1)); Pl.bus = Bus.int(round(Pl.con(:,1))); Pl.init = find(~Pl.con(:,11));endif ~isempty(Fl.con) Fl.n = length(Fl.con(:,1)); Fl.bus = Bus.int(round(Fl.con(:,1)));endif ~isempty(Mot.con) Mot.n = length(Mot.con(:,1)); Mot.bus = Bus.int(round(Mot.con(:,1))); Mot.dat = ones(Mot.n,12); Mot.slip = ones(Mot.n,1); Mot.e1r = ones(Mot.n,1); Mot.e1m = ones(Mot.n,1); Mot.e2r = ones(Mot.n,1); Mot.e2m = ones(Mot.n,1); DAE.x = zeros(Mot.n,1); fm_mot(0)endif ~isempty(Thload.con) Thload.n = length(Thload.con(:,1)); Thload.bus = Bus.int(round(Thload.con(:,1)));endif (~isempty(Tap.con)) Tap.n = length(Tap.con(:,1)); Tap.bus = Bus.int(round(Tap.con(:,1)));endif (~isempty(Fault.con)) Fault.n = length(Fault.con(:,1)); Fault.bus = Bus.int(round(Fault.con(:,1))); idx = find(Fault.con(:,5) == 0); if ~isempty(idx) Fault.con(idx,5) = 1e-6; Fault.con(idx,6) = Fault.con(idx,6)+1e-6; endendif (~isempty(Syn.con))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -