📄 fm_build.m
字号:
for i=1:length(idx_T), fprintf(fid,['\n idx = find(%s == 0);\n if idx\n ', ... Comp.name,'warn(idx, ''Time constant %s ', ... 'cannot be zero. %s = 0.001 s will be used.''),\n ' ... 'end'],State.time{idx_T(i)}, ... State.time{idx_T(i)},State.time{idx_T(i)}); fprintf(fid,'\n %s.con(idx,%d) = 0.001;', ... c_name,pidx(strmatch(State.time{idx_T(i)}, ... Param.name,'exact'))); end fprintf(fid,'\n\n %%variable initialization'); for i=1:State.n, fprintf(fid,'\n DAE.x(%s.%s) = %s;',c_name,State.name{i},state_init{i}); fprintf(fid,'\n %s = DAE.x(%s.%s);',State.name{i},c_name,State.name{i}); end for i=1:nidx, fprintf(fid,'\n %s.dat(:,%d) = %s;',Initl.n+i,c_name,vectorize(Servc.eq{i})); fprintf(fid,'\n %s = %s.dat(:,%d);',Servc.eqidx{iidx(i)},c_name,Initl.n+i); end for i=1:Initl.n fprintf(fid,'\n %s.dat(:,%d) = %s;',c_name,i, ... strrep(Initl.name{i},'_0','')); end fprintf(fid,'\n\n %%check limits'); for i=1:n_xmax fprintf(fid,['\n idx = find(%s > %s_max); if idx, ', ... Comp.name,'warn(idx, '' State variable %s ', ... 'is over its maximum limit.''), end'], ... State.name{x_max(i)},State.name{x_max(i)}, ... State.name{x_max(i)}); end for i=1:n_xmin fprintf(fid,['\n idx = find(%s < %s_min); if idx, ', ... Comp.name,'warn(idx, '' State variable %s ', ... 'is under its minimum limit.''), end'], ... State.name{x_min(i)},State.name{x_min(i)}, ... State.name{x_min(i)}); end for i=1:n_smax fprintf(fid,['\n idx = find(%s > %s_max); if idx, ', ... Comp.name,'warn(idx, '' State variable %s ', ... 'is over its maximum limit.''), end'], ... Servc.name{s_max(i)},Servc.name{s_max(i)}, ... Servc.name{s_max(i)}); end for i=1:n_smin fprintf(fid,['\n idx = find(%s < %s_min); if idx, ', ... Comp.name,'warn(idx, '' State variable %s ', ... 'is under its minimum limit.''), end'], ... Servc.name{s_min(i)},Servc.name{s_min(i)}, ... Servc.name{s_min(i)}); end fprintf(fid,['\n fm_disp(''Initialization of ',c_name, ... 'components completed.'')\n']);end% ********************************************************************************% algebraic equationsif ~isempty(algeb_eq) if Comp.init, fprintf(fid, '\n case 1 %% algebraic equations\n'); else, fprintf(fid, '\n\nswitch flag\n case 1 %% algebraic equations\n'); endendaidx = [1:Algeb.neq];idx = strmatch('null',Algeb.eq);aidx(idx) = [];idx = strmatch('0',Algeb.eq);aidx(idx) = [];for i = 1:length(aidx) if Buses.n == 1 a1 = ''; else a1 = num2str(ceil(aidx(i)/2)); end if rem(aidx(i),2) fprintf(fid,'\n DAE.gp = DAE.gp + sparse(%s.bus%s,1,%s,Bus.n,1);', ... c_name,a1,vectorize(Algeb.eq{aidx(i)})); else fprintf(fid,'\n DAE.gq = DAE.gq + sparse(%s.bus%s,1,%s,Bus.n,1);', ... c_name,a1,vectorize(Algeb.eq{aidx(i)})); endend% ********************************************************************************% algebraic Jacobians% substitution of inner service variablesfor j = 1:5 for i = 1:Servc.neq if strcmp(Servc.type{i},'Inner') & ~strcmp(Servc.eq{i},'null') state_eq = strrep(state_eq,Servc.eqidx{i},['(',Servc.eq{i},')']); algeb_eq = strrep(algeb_eq,Servc.eqidx{i},['(',Servc.eq{i},')']); servc_eq = strrep(servc_eq,Servc.eqidx{i},['(',Servc.eq{i},')']); end endendif ~isempty(algeb_eq) fprintf(fid, '\n\n case 2 %% algebraic Jacobians\n');endeqformat = '\n DAE.J%d%d = DAE.J%d%d + sparse(%s.bus%s,%s.bus%s,%s,Bus.n,Bus.n);';for j = 1:length(aidx) i = aidx(j); a1 = 2-rem(i,2); if Buses.n == 1 a2 = ''; else a2 = num2str(ceil(i/2)); end for h = 1:Algeb.n type = Algeb.name{h,1}; if strcmp(type(1), 'V'); a3 = 2; if Buses.n == 1 a4 = ''; else a4 = type(2:length(type)); end elseif strcmp(type(1:5), 'theta'); a3 = 1; if Buses.n == 1 a4 = ''; else a4 = type(6:length(type)); end end if ~strcmp(char(Gy(i,h)),'0') fprintf(fid,eqformat,a1,a3,a1,a3,c_name,a2,c_name,a4, ... vectorize(char(Gy(i,h)))); end endend% check limits in case of state variable dependanciesTemp = 0;for i = 1:Servc.neq; Temp = ~strcmp(Servc.limit{i},'None'); break; endS = 0;if Temp for i = 1:Servc.neq; S = ~strcmp(Servc.type{i},'Input'); break; endendif S fprintf(fid,'\n'); for i = 1:length(Servc.eqidx) s_var = Servc.eqidx{i}; for k = 1:Servc.neq; if strcmp(s_var,Servc.name{k}); break; end; end if ~strcmp(Servc.type{k},'Input') & ~isempty(findstr(algeb_eq,s_var)) a = strcmp(Servc.limit{k,1},'None'); b = strcmp(Servc.limit{k,2},'None'); if ~a | ~b fprintf(fid, ['\n if (']); if ~a fprintf(fid,[Servc.name{k},'(i) <= ',Servc.name{k},'_max(i)']); else fprintf(fid,'('); end if ~a & ~b fprintf(fid,' | '); end if ~b fprintf(fid,[Servc.name{k},'(i) >= ',Servc.name{k},'_min(i))']); else fprintf(fid,')'); end fprintf(fid,'\n end'); end end endend% ********************************************************************************% differential & service equationsif ~isempty(state_eq) if Comp.init | ~isempty(algeb_eq) fprintf(fid, '\n\n case 3 %% differential equations\n'); else fprintf(fid, '\n\nswitch flag\n case 3 %% differential equations\n'); endendfor i = 1:Servc.neq Temp = Servc.type{i}; if strcmp(Temp,'Inner') s_eq = vectorize(Servc.eq{i}); fprintf(fid,['\n ',Servc.name{i},' = ',s_eq,';']); if ~strcmp(Servc.limit{i,1},'None') fprintf(fid, ['\n ',Servc.name{i}, ... ' = min(',Servc.name{i},',',Servc.name{i},'_max);']); end if ~strcmp(Servc.limit{i,2},'None') fprintf(fid, ['\n ',Servc.name{i}, ... ' = max(',Servc.name{i},',',Servc.name{i},'_min);']); end endendfor i = 1:State.n if strcmp(State.nodyn{i},'Yes') fprintf(fid, ['\n no_dyn_',State.name{i},' = find(',State.time{i},' == 0);']); fprintf(fid, ['\n ', State.time{i}, '(no_dyn_',State.name{i},') = 1;']); end if strcmp(State.time{i},'None') s_eq = vectorize(State.eq{i}); else s_eq = vectorize(['(',State.eq{i},')/',State.time{i}]); end fprintf(fid, ['\n DAE.f(',c_name,'.',State.name{i},') = ',s_eq,';']); if strcmp(State.nodyn{i},'Yes') fprintf(fid, ['\n DAE.f(',c_name,'.',State.name{i},'(no_dyn_',State.name{i},')) = 0;']); endendif State.n > 0; if strcmp(State.nodyn{State.n},'Yes'); fprintf(fid, '\n'); end; end% set hard limitsfprintf(fid,'\n %% non-windoup limits');limfor1 = '\n idx = find(%s >= %s_max & DAE.f(%s) > 0);';limfor2 = '\n if idx, DAE.f(%s(idx)) = 0; end';limfor3 = '\n DAE.x(%s) = min(%s,%s_max);';limfor4 = '\n idx = find(%s <= %s_min & DAE.f(%s) < 0);';limfor5 = '\n DAE.x(%s) = max(%s,%s_min);';for i = 1:State.n varidx = [c_name,'.',State.name{i}]; a = strcmp(State.limit{i,1},'None'); if ~a fprintf(fid,limfor1,State.name{i},State.name{i},varidx); fprintf(fid,limfor2,State.name{i}); fprintf(fid,limfor3,varidx,State.name{i},State.name{i}); end b = strcmp(State.limit{i,2},'None'); if ~b fprintf(fid,limfor4,State.name{i},State.name{i},varidx); fprintf(fid,limfor2,State.name{i}); fprintf(fid,limfor5,varidx,State.name{i},State.name{i}); endendfprintf(fid, '\n');numdata = Initl.n;for i = 1:Servc.neq Temp = Servc.type{i}; if okdata & strcmp(Temp,'Inner') numdata = numdata + 1; fprintf(fid,['\n ',c_name,'.dat(:,',int2str(numdata),') = ', Servc.name{i},';']); elseif strcmp(Temp,'Output') numdata = numdata + 1; s_eq = vectorize(Servc.eq{i}); TempT = [c_name,'.dat(:,',int2str(numdata),')']; fprintf(fid,['\n ',TempT,' = ',s_eq,';']); zz = ['z(',Servc.name{i},'_',Comp.name,'_idx)']; if ~strcmp(Servc.limit{i,1},'None') fprintf(fid, ['\n ',TempT,' = min(',TempT,',',Servc.name{i},'_max);']); end if ~strcmp(Servc.limit{i,2},'None') fprintf(fid, ['\n ',TempT,' = max(',TempT,',',Servc.name{i},'_min);']); end fprintf(fid,['\n ',zz,' = ',zz,' + ',TempT,';']); endendfprintf(fid, '\n');% ********************************************************************************% state variable Jacobiansif ~isempty(state_eq) fprintf(fid, '\n\n case 4 %% state variable Jacobians\n');end% DAE.Fxfor j = 1:State.n if strcmp(State.nodyn{j},'Yes') fprintf(fid, ['\n no_dyn_',State.name{j},' = find(',State.time{j},' == 0);']); fprintf(fid, ['\n ', State.time{j}, '(no_dyn_',State.name{j},') = 1;']); endendfprintf(fid, '\n');if State.n, fprintf(fid,'\n %% DAE.Fx'); endfxformat = '\n DAE.Fx = DAE.Fx + sparse(%s,%s,%s,DAE.n,DAE.n);';for j = 1:State.n x_idx1 = [c_name,'.',State.name{j}]; for i = 1:State.n x_idx2 = [c_name,'.',State.name{i}]; if strcmp(State.time{j},'None') & ~strcmp(char(Fx(j,i)),'0') fxexp = vectorize(char(Fx(j,i))); else fxexp = ['(',vectorize(char(Fx(j,i))),')./',State.time{j}]; end if ~strcmp(fxexp,['(0)./',State.time{j}]) fprintf(fid,fxformat,x_idx1,x_idx2,fxexp); end endendfprintf(fid,'\n');% DAE.Fyif State.n & Algeb.n, fprintf(fid,'\n %% DAE.Fy'); endfyformat = '\n DAE.Fy = DAE.Fy + sparse(%s,%s,%s,DAE.n,2*Bus.n);';for j = 1:State.n x_idx1 = [c_name,'.',State.name{j}]; for i = 1:Algeb.n type = Algeb.name{i}; if strcmp(type(1),'V') if Buses.n == 1 x_idx2 = [c_name,'.bus','','+Bus.n']; else x_idx2 = [c_name,'.bus',type(2:length(type)),'+Bus.n']; end elseif strcmp(type(1:5),'theta') if Buses.n == 1 x_idx2 = [c_name,'.bus','']; else x_idx2 = [c_name,'.bus',type(6:length(type))]; end end if strcmp(State.time{j},'None') & ~strcmp(char(Fy(j,i)),'0') fyexp = vectorize(char(Fy(j,i))); else fyexp = ['(',vectorize(char(Fy(j,i))),')./',State.time{j}]; end if ~strcmp(fyexp,['(0)./',State.time{j}]) fprintf(fid,fyformat,x_idx1,x_idx2,fyexp); end endendfprintf(fid,'\n');% DAE.Gxif State.n & Algeb.n, fprintf(fid,'\n %% DAE.Gx'); endgxformat = '\n DAE.Gx = DAE.Gx + sparse(%s,%s,%s,2*Bus.n,DAE.n);';for j = 1:Algeb.neq if ~strcmp(Algeb.eq{1},'null') type = Algeb.eqidx{j,1}; if strcmp(type(1),'P') if Buses.n == 1 a_idx = [c_name,'.bus','']; else a_idx = [c_name,'.bus',type(2:length(type))]; end elseif strcmp(type(1),'Q') if Buses.n == 1 a_idx = [c_name,'.bus','','+Bus.n']; else a_idx = [c_name,'.bus',type(2:length(type)),'+Bus.n']; end end for h = 1:State.n x_idx = [c_name,'.',State.name{h}]; algexp = vectorize(char(Gx(j,h))); if ~strcmp(algexp,'0') fprintf(fid,gxformat,a_idx,x_idx,algexp); end end endend%if State.n > 0, fprintf(fid, ['\n\n end']); end% ********************************************************************************% non-windup limitersif n_xmax | n_xmin fprintf(fid, '\n\n case 5 %% non-windup limiters\n'); for i = 1:State.n M = ~strcmp(State.limit{i,1},'None'); m = ~strcmp(State.limit{i,2},'None'); if M | m fprintf(fid, ['\n idx = find((']); if M, fprintf(fid,'%s >= %s_max',State.name{i},State.name{i}); end if M & m; fprintf(fid,' | '); end if m, fprintf(fid,'%s <= %s_min',State.name{i},State.name{i}); end fprintf(fid,[') & DAE.f(',c_name,'.%s) == 0);'],State.name{i}); fprintf(fid, '\n if ~isempty(idx)'); fprintf(fid,['\n k = ',c_name,'.%s(idx);'],State.name{i}); fprintf(fid,['\n DAE.tn(k) = 0;']); fprintf(fid,['\n DAE.Ac(:,k) = 0;']); fprintf(fid,['\n DAE.Ac(k,:) = 0;']); fprintf(fid,['\n DAE.Ac(k,k) = speye(length(idx));']); fprintf(fid,['\n end']); end endendfprintf(fid, '\n\nend\n');% ********************************************************************************% warning message functionfprintf(fid,'\n\n%% -------------------------------------------------------------------');fprintf(fid,'\n%% function for creating warning messages');fprintf(fid,['\nfunction ',Comp.name,'warn(idx, msg)']);%fprintf(fid,['\nglobal ',c_name]);fprintf(fid,['\nfm_disp(strcat(''Warning: ',upper(Comp.name),' #'',int2str(idx),msg))']);% close component file and returnfclose(fid);fm_disp(['Function "fm_',Comp.name,'" built.'])fm_choice(['Function "fm_',Comp.name,'" built.'],2)% ********************************************************************************function vect = varvect(vect,sep)n = length(sep)-1;if iscell(vect) vect = strcat(vect,'#'); vect = strrep([vect{:}],'#',sep); vect(end-n:end) = [];end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -