function [xTemp,diff,exitflag]=singleStepTRAP(SimData,SysData,SysPara,xt,t,dt,iden,AEmethod) % Single step of trapezoidal formulation % Author: Rui Yao % % Copyright (C) 2021, UChicago Argonne, LLC. All rights reserved. % % OPEN SOURCE LICENSE % % Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: % % 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. % 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. % 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. % % % ****************************************************************************************************** % DISCLAIMER % % THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED % WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A % PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY % DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, % PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER % CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR % OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. % *************************************************************************************************** % % INPUT % SimData - Simulation parameters % SysData - System data for simulation % SysPara - Parameters representing the events happening in the system % xt - Initial system state % t - Relative time compared with SysPara starting time % dt - time step length % iden - Aux identifier % AEmethod - Method for solving algebraic equations % 0 - HE % 1 - NR % % OUTPUT % xTemp - State at the new step % diff - Error vector % exitflag - % 0 - Normally exit % -1 - Fail % [bus,sw,pv,pq,shunt,line,ind,zip,syn,exc,tg,agc,cac,cluster]=unfoldSysData(SysData); [nState,idxs]... =getIndexDyn(SysData); [pqIncr,pvIncr,Rind0,Rind1,Reind0,Reind1,Rzip0,Rzip1,Ytr0,Ytr1,Ysh0,Ysh1,VspSq2,~,~,~,~,Tmech1,Varref1,Ef1,Pm1,Eq11]=unfoldSysPara(SysPara); [maxTime,segTime,~,nlvl,taylorN,alphaTol,diffTol,diffTolMax,method]=unfoldSimData(SimData); if isfield(SysPara,'nIslands')&&isfield(SysPara,'islands')&&isfield(SysPara,'refs') nIslands=SysPara.nIslands;islands=SysPara.islands;refs=SysPara.refs; else [nIslands,islands,refs]=searchIslands(bus(:,1),line(:,1:2)); end nbus=size(bus,1); busType=zeros(nbus,1); if isempty(pv) pv=zeros(0,6); end if isempty(pq) pq=zeros(0,6); end if isempty(shunt) shunt=zeros(0,7); end if isempty(sw) sw=zeros(0,13); end busType(pv(:,1))=1; busType(sw(:,1))=2; isw=find(busType==2); ipv=find(busType~=0); ipq=find(busType==0); npq=size(ipq,1); npv=size(ipv,1); % Determine the frequency model of each island freqTypeTag=zeros(nIslands,1);%0:sw,1:syn,2:steady-state f freqKeptTag=zeros(nbus,1);% corresponds to freqType=2 frefs=refs; fswTag=zeros(nbus,1); fsynTag=zeros(nbus,1); fswTag(isw)=1; fswTagxD=fswTag; fsynTag(syn(:,1))=1; D0=imag(xt(idxs.vIdx)); for isl=1:nIslands if isempty(find(fswTag(islands==isl)==1, 1)) if isempty(find(fsynTag(islands==isl)==1, 1)) freqTypeTag(isl)=2; busesInIsland=find(islands==isl); [~,imin]=min(abs(D0(busesInIsland))); frefs(isl)=busesInIsland(imin(1)); fswTagxD(frefs(isl))=1; freqKeptTag(busesInIsland)=1; else freqTypeTag(isl)=1; end end end freqKeptTagxRef=freqKeptTag; freqKeptTagxRef(frefs)=0; nFreqKept=sum(freqKeptTag); if ~isempty(agc) agcExt=zeros(nbus,size(agc,2)); agcExt(agc(:,1),:)=agc; fdk=agcExt(:,2)+agcExt(:,3); %1/R+D else fdk=zeros(nbus,1); end fIngIdx=((2*nbus+1):(3*nbus))'; stateFilterTag=ones(nState,1); stateFilterTag(idxs.vIdx)=0; stateFilterTag(idxs.qIdx)=0; stateFilterTag(idxs.pgIdx)=0; stateFilterTag(idxs.efIdx)=0; stateFilterTag(idxs.tgovmIdx)=0; stateFilterTag(idxs.fIdx)=0; % stateFilterTag(dpgIdx)=0; % busFilterTag=ones(nbus,1); % busFilterTag(sw(:,1))=0; % jacBusFilterTag=[busFilterTag;busFilterTag]; busTag=ones(nbus,1); busTag(sw(:,1))=0; jggRowTag=[busTag;busTag;freqKeptTagxRef]; jggColTag=[busTag;fswTagxD==0;freqKeptTag]; idxNonSw=find(busType~=2); idxNonSwD=find(busType~=2&fswTagxD==1); nInd=size(ind,1); if ~isempty(ind) indIdx=ind(:,1); Rm1=ind(:,7); Xm1=ind(:,8); Zm1=ind(:,7)+1j*ind(:,8); Rm2=ind(:,9); Xm2=ind(:,10); Zmm=1j*ind(:,13); Tm0=ind(:,15)+ind(:,16)+ind(:,17); Tm1=-ind(:,16)-2*ind(:,17); Tm2=ind(:,17); Hm=ind(:,14); end nSyn=size(syn,1); if ~isempty(syn) synIdx=syn(:,1); wgb=syn(:,4); model=syn(:,5); Xgl=syn(:,6); Rga=syn(:,7); Xgd=syn(:,8); Xgd1=syn(:,9); Xgd2=syn(:,10); Tgd1=syn(:,11); Tgd2=syn(:,12); Xgq=syn(:,13); Xgq1=syn(:,14); Xgq2=syn(:,15); Tgq1=syn(:,16); Tgq2=syn(:,17); Mg=syn(:,18); Dg=syn(:,19); TgAA=syn(:,24); gammad=Tgd2./Tgd1.*Xgd2./Xgd1.*(Xgd-Xgd1); gammaq=Tgq2./Tgq1.*Xgq2./Xgq1.*(Xgq-Xgq1); end nExc=size(exc,1); if ~isempty(exc) excIdx=exc(:,1); VavrMax=exc(:,3); VavrMin=exc(:,4); muavr0=exc(:,5); Tavr1=exc(:,7); Tavr2=exc(:,6); vavrf0=exc(:,8); Vavr0=exc(:,9); Tavre=exc(:,10); Tavrr=exc(:,11); end nTg=size(tg,1); if ~isempty(tg) tgIdx=tg(:,1); wtgref=tg(:,3); Rtg=tg(:,4); Ttgmax=tg(:,5); Ttgmin=tg(:,6); Ttg2=tg(:,7); Ttg1=tg(:,8); end [V0,Q0,s0,d0,w0,eq10,eq20,ed10,ed20,psid0,psiq0,Pm0,Ef0,Vavrm0,Vavrr0,Vavrf0,Vavrref0,tgovg0,tgovm0,tgovmech0,f0,dpg0,qplt0,vg0]=unfoldX(xt,SysData); if ~isempty(ind) [YshInd0,Yshind1]=getLinearInterpolatorInd(nbus,ind,s0,s0); Ysh0x=Ysh0+YshInd0; Ysh1x=Ysh1+Yshind1; else Ysh0x=zeros(nbus,1); Ysh1x=zeros(nbus,1); end Ytr=Ytr0+Ytr1*t; Ysh=Ysh0x+Ysh1x*t; YtrNew=Ytr0+Ytr1*(t+dt); YshNew=Ysh0x+Ysh1x*(t+dt); SNew=-accumarray(pq(:,1),pq(:,4)+1j*pq(:,5),[nbus,1])+accumarray(pv(:,1),pv(:,4),[nbus,1]); SNew=SNew-accumarray(pq(:,1),pqIncr(:,1)+1j*pqIncr(:,2),[nbus,1])*(t+dt)+accumarray(pv(:,1),pvIncr,[nbus,1])*(t+dt); if size(pqIncr,2)>=4;SNew=SNew-accumarray(pq(:,1),pqIncr(:,3)+1j*pqIncr(:,4),[nbus,1])*(t+dt)*(t+dt);end SNew=SNew-accumarray(zip(:,1),(Rzip0+Rzip1*(t+dt)).*(zip(:,7)+1j*zip(:,10)),[nbus,1]); INew=-accumarray(zip(:,1),(Rzip0+Rzip1*(t+dt)).*(zip(:,6)-1j*zip(:,9)),[nbus,1]); JNew=real(INew); KNew=imag(INew); YNew=YtrNew+sparse(1:nbus,1:nbus,YshNew,nbus,nbus); GNew=real(YNew);BNew=imag(YNew); % Calculate diff and jac, do N-R Vtemp=V0; pqx=pq;pqx(:,[4,5])=pq(:,[4,5])+pqIncr(:,1:2)*t;if size(pqIncr,2)>=4;pqx(:,[4,5])=pqx(:,[4,5])+pqIncr(:,3:4)*t*t;end pvx=pv;pvx(:,4)=pv(:,4)+pvIncr*t; indx=ind;if ~isempty(ind);indx(:,15:17)=ind(:,15:17).*repmat(Rind0+Rind1*t,1,3);indx(:,13)=ind(:,13)./(Reind0+Reind1*t);end zipx=zip;if ~isempty(zip);zipx(:,5:10)=zip(:,5:10).*repmat(Rzip0+Rzip1*t,1,6);end SysDatax=foldSysData(bus,sw,pvx,pqx,shunt,line,indx,zipx,syn,exc,tg,agc,cac,cluster); pqxx=pq;pqxx(:,[4,5])=pq(:,[4,5])+pqIncr(:,1:2)*(t+dt);if size(pqIncr,2)>=4;pqxx(:,[4,5])=pqxx(:,[4,5])+pqIncr(:,3:4)*(t+dt)*(t+dt);end pvxx=pv;pvxx(:,4)=pv(:,4)+pvIncr*(t+dt); indxx=ind;if ~isempty(ind);indxx(:,15:17)=ind(:,15:17).*repmat(Rind0+Rind1*(t+dt),1,3);indxx(:,13)=ind(:,13)./(Reind0+Reind1*(t+dt));end zipxx=zip;if ~isempty(zip);zipxx(:,5:10)=zip(:,5:10).*repmat(Rzip0+Rzip1*(t+dt),1,6);end SysDataxx=foldSysData(bus,sw,pvxx,pqxx,shunt,line,indxx,zipxx,syn,exc,tg,agc,cac,cluster); SysData=foldSysData(bus,sw,pvx,pqx,shunt,line,ind,zip,syn,exc,tg,agc,cac,cluster); dx1=integ(SysDatax,SysPara,xt,dt); xTemp=xt; xTemp=xTemp+dx1; iterMax=10; exitflag=-1; for iter=1:iterMax % calculate df and dg dx2=integ(SysDataxx,SysPara,xTemp,dt); diffF=xt-xTemp+(dx1+dx2)/2; diffF(stateFilterTag==0)=0; Ctemp=real(Vtemp); Dtemp=imag(Vtemp); Atemp=abs(Vtemp); Vgtemp=Vtemp(syn(:,1)); ftemp=xTemp(idxs.fIdx); eq0=Ef0;ed0=zeros(size(Ef0)); [~,~,sNew,dNew,wNew,eq1New,eq2New,ed1New,ed2New,psidNew,psiqNew,EdNew,EfNew,VavrmNew,VavrrNew,VavrfNew,VavrrefNew,tgovgNew,tgovmNew,tgovmechNew,fNew,dpgNew,qpltNew,vgNew]=unfoldX(xTemp,SysData); eqNew=EfNew;edNew=zeros(size(EfNew)); [MatGV0,MatGV1,MatGRhs0,MatGRhs1]=getLinearInterpolatorSyn(syn,[],d0,dNew,ed0,ed10,ed20,edNew,ed1New,ed2New,eq0,eq10,eq20,eqNew,eq1New,eq2New,psid0,psiq0,psidNew,psiqNew); MatGVNew=MatGV0+MatGV1; MatGRhsNew=MatGRhs0+MatGRhs1; J1=GNew+sparse(syn(:,1),syn(:,1),MatGVNew(:,1),nbus,nbus); J2=-BNew+sparse(syn(:,1),syn(:,1),MatGVNew(:,2),nbus,nbus); J3=BNew+sparse(syn(:,1),syn(:,1),MatGVNew(:,3),nbus,nbus); J4=GNew+sparse(syn(:,1),syn(:,1),MatGVNew(:,4),nbus,nbus); P2freq=sparse(1:nbus,1:nbus,-freqKeptTag.*fdk,nbus,nbus); Freq2freq=sparse([1:nbus,1:nbus],[1:nbus,frefs(islands)'],[ones(1,nbus),-ones(1,nbus)],nbus,nbus); Ig=accumarray(syn(:,1),MatGRhsNew(:,1)+1j*MatGRhsNew(:,2),[nbus,1])-... accumarray(syn(:,1),(MatGVNew(:,1).*real(Vgtemp)+MatGVNew(:,2).*imag(Vgtemp))+1j*(MatGVNew(:,3).*real(Vgtemp)+MatGVNew(:,4).*imag(Vgtemp)),[nbus,1]); % diffG=conj(SNew)+INew.*abs(Vtemp)+Ig.*conj(Vtemp)-(YNew*Vtemp).*conj(Vtemp)+freqKeptTag.*(dpgNew-fdk.*fNew); % diffG(busFilterTag==0)=0; % diffGf=zeros(nbus,1); diff=conj(SNew)+INew.*abs(Vtemp)+Ig.*conj(Vtemp)-(YNew*Vtemp).*conj(Vtemp); diffP=real(diff)+freqKeptTag.*(-fdk.*ftemp+dpg0); diffVQ=imag(diff); diffGf=ftemp-ftemp(frefs(islands)); if ~isempty(pv) diffVQ(pv(:,1))=abs(Vtemp(pv(:,1))).*abs(Vtemp(pv(:,1)))-(VspSq2(pv(:,1),1)+VspSq2(pv(:,1),2)*(t+dt)); end diffGx=[diffP;diffVQ;diffGf]; diffGx(jggRowTag==0)=0; if iter>1&&max(abs([diffF;diffGx]))0)=0; tgovmActive((tgovm0-Ttgmin)<0)=0; pActiveInSyn(tgIdx)=tgovmActive; % else % tgIdx=[]; % tgovmActive=zeros(nTg,1); % pActiveInSyn=zeros(nTg,1); end if ~isempty(exc) texcActive=ones(nExc,1); texcActive((Vavrf0-VavrMax)>0)=0; texcActive((Vavrf0-VavrMin)<0)=0; texcActiveInSyn=zeros(nSyn,1); texcActiveInSyn(tgIdx)=texcActive; end numSynOnBus=accumarray(syn(:,1),1,[nbus,1]); %delta jffi=[jffi;idxs.deltaIdx]; jffj=[jffj;idxs.omegaIdx]; jffv=[jffv;wgb]; %omega jffi=[jffi;idxs.omegaIdx;idxs.omegaIdx(tgIdx);idxs.omegaIdx(tgIdx);idxs.omegaIdx(tgIdx);idxs.omegaIdx]; jffj=[jffj;idxs.omegaIdx;idxs.tgovgIdx;idxs.omegaIdx(tgIdx);idxs.tmechIdx;idxs.dpgIdx(synIdx)]; jffv=[jffv;-Dg/2./Mg;tgovmActive;-tgovmActive.*Ttg1./Ttg2./Rtg;tgovmActive;pActiveInSyn./numSynOnBus(synIdx)]; %psiq jffi=[jffi;idxs.psidIdx(model>=8)]; jffj=[jffj;idxs.psiqIdx(model>=8)]; jffv=[jffv;wgb(model>=8)]; %psid jffi=[jffi;idxs.psiqIdx(model>=8)]; jffj=[jffj;idxs.psidIdx(model>=8)]; jffv=[jffv;-wgb(model>=8)]; %ed'' jffi=[jffi;idxs.ed2Idx(model>=5);idxs.ed2Idx(model>=5)]; jffj=[jffj;idxs.ed2Idx(model>=5);idxs.ed1Idx(model>=5)]; jffv=[jffv;-1./Tgq2(model>=5);1./Tgq2(model>=5)]; %eq'' jffi=[jffi;idxs.eq2Idx(model>=5);idxs.eq2Idx(model>=5);idxs.eq2Idx(model>=5&texcActiveInSyn==1)]; jffj=[jffj;idxs.eq2Idx(model>=5);idxs.eq1Idx(model>=5);idxs.vavrfIdx(texcActive==1&model(excIdx)>=5)]; jffv=[jffv;-1./Tgd2(model>=5);1./Tgd2(model>=5);TgAA(model>=5&texcActiveInSyn==1)./Tgd1(model>=5&texcActiveInSyn==1)./Tgd2(model>=5&texcActiveInSyn==1)]; %ed' jffi=[jffi;idxs.ed1Idx(model>=4)]; jffj=[jffj;idxs.ed1Idx(model>=4)]; jffv=[jffv;-1./Tgq1(model>=4)]; %eq' jffi=[jffi;idxs.eq1Idx(model>=3)]; jffj=[jffj;idxs.eq1Idx(model>=3)]; jffv=[jffv;-1./Tgd1(model>=3)]; jffi=[jffi;idxs.eq1Idx(model>=5&texcActiveInSyn==1)]; jffj=[jffj;idxs.vavrfIdx(texcActive==1&model(excIdx)>=5)]; jffv=[jffv;(1-TgAA(model>=5&texcActiveInSyn==1)./Tgd1(model>=5&texcActiveInSyn==1))./Tgd2(model>=5&texcActiveInSyn==1)]; jffi=[jffi;idxs.eq1Idx((model==3|model==4)&texcActiveInSyn==1)]; jffj=[jffj;idxs.vavrfIdx(texcActive==1&(model(excIdx)==3|model(excIdx)==4))]; jffv=[jffv;(1-TgAA((model==3|model==4)&texcActiveInSyn==1)./Tgd1((model==3|model==4)&texcActiveInSyn==1))./Tgd2((model==3|model==4)&texcActiveInSyn==1)]; end if ~isempty(tg) jffi=[jffi;idxs.tgovgIdx;idxs.tgovgIdx]; jffj=[jffj;idxs.omegaIdx;idxs.tgovgIdx]; jffv=[jffv;-(1-Ttg1./Ttg2)./Rtg./Ttg2;-1./Ttg2]; end if ~isempty(exc) VmagAvr=abs(Vtemp(synIdx(excIdx))); jffi=[jffi;idxs.vavrmIdx]; jffj=[jffj;idxs.vavrmIdx]; jffv=[jffv;-1./Tavrr]; jffi=[jffi;idxs.vavrrIdx;idxs.vavrrIdx;idxs.vavrrIdx]; jffj=[jffj;idxs.vavrmIdx;idxs.vavrrefIdx;idxs.vavrrIdx]; jffv=[jffv;-muavr0.*(1-Tavr1./Tavr2)./Tavr2;muavr0.*(1-Tavr1./Tavr2)./Tavr2;-1./Tavr2]; jffi=[jffi;idxs.vavrfIdx;idxs.vavrfIdx;idxs.vavrfIdx;idxs.vavrfIdx]; jffj=[jffj;idxs.vavrmIdx;idxs.vavrrefIdx;idxs.vavrrIdx;idxs.vavrfIdx]; jffv=[jffv;-muavr0.*Tavr1./Tavr2./Tavre.*VmagAvr./Vavr0;muavr0.*Tavr1./Tavr2./Tavre.*VmagAvr./Vavr0;VmagAvr./Vavr0./Tavre;-1./Tavre]; end if ~isempty(agc) agcExt=zeros(nbus,size(agc,2)); agcExt(agc(:,1),:)=agc; jfgi=[jfgi;idxs.dpgIdx(freqKeptTag==1)]; jfgj=[jfgj;idxs.fIngIdx(freqKeptTag==1)];%f jfgv=[jfgv;-agcExt(freqKeptTag==1,4)]; numSynOnBus=accumarray(syn(:,1),1,[nbus,1]); jffi=[jffi;idxs.dpgIdx(syn(:,1))]; jffj=[jffj;idxs.omegaIdx];%f jffv=[jffv;-agcExt(syn(:,1),4)./numSynOnBus(syn(:,1))]; end Jff=dt*sparse(jffi,jffj,jffv,nState,nState)/2-speye(nState,nState); % construct Jfg Jfg=dt*sparse(jfgi,jfgj,jfgv,nState,3*nbus)/2; %P,Q,f jac=[Jff(stateFilterTag==1,stateFilterTag==1),Jfg(stateFilterTag==1,jggColTag==1);Jgf(jggRowTag==1,stateFilterTag==1),Jgg(jggRowTag==1,jggColTag==1)]; correction=-jac\[diffF(stateFilterTag==1);diffGx(jggRowTag==1)]; nStateCorr=sum(stateFilterTag); xTemp(stateFilterTag==1)=xTemp(stateFilterTag==1)+correction(1:nStateCorr); corrFull=zeros(3*nbus,1); corrFull(jggRowTag==1)=correction((nStateCorr+1):end); Vtemp=Vtemp+corrFull(1:nbus)+1j*corrFull((nbus+1):(2*nbus)); xTemp(idxs.vIdx)=Vtemp; xTemp(idxs.fIdx)=corrFull(fIngIdx); xTemp=adjustAlgebraic(SysDataxx,xTemp); end dxc=(xTemp-xt)/dt; SysParaxx=foldSysPara([],[],[],[],[],[],[],[],Ytr0+Ytr1*(t+dt),[],Ysh0+Ysh1*(t+dt),[],[VspSq2(:,1)+VspSq2(:,2)*(t+dt),zeros(size(VspSq2,1),1)],[],[],[],[]); diff=checkEquationBalanceSynDyn(SysDataxx,SysParaxx,xTemp,dxc); end % % function [xTemp,diff,exitflag]=singleStepTRAP(SimData,SysData,SysPara,xt,t,dt,iden,AEmethod) % % % Single step of trapezoidal formulation % % % Copyright (C) Rui Yao % % % % % % INPUT % % % SimData - Simulation parameters % % % SysData - System data for simulation % % % SysPara - Parameters representing the events happening in the system % % % xt - Initial system state % % % t - Relative time compared with SysPara starting time % % % dt - time step length % % % iden - Aux identifier % % % AEmethod - Method for solving algebraic equations % % % 0 - HE % % % 1 - NR % % % % % % OUTPUT % % % xTemp - State at the new step % % % diff - Error vector % % % exitflag - % % % 0 - Normally exit % % % -1 - Fail % % % % % % % [bus,sw,pv,pq,shunt,line,ind,zip,syn,exc,tg,agc,cac,cluster]=unfoldSysData(SysData); % % % [nState,vIdx,qIdx,sIdx,deltaIdx,omegaIdx,eq1Idx,eq2Idx,ed1Idx,ed2Idx,psidIdx,psiqIdx,pgIdx,efIdx,... % % % vavrmIdx,vavrrIdx,vavrfIdx,vavrrefIdx,tgovgIdx,tgovmIdx,tmechIdx,fIdx,dpgIdx,qpltIdx,vgIdx]... % % % =getIndexDyn(SysData); % % [nState,idxs]... % % =getIndexDyn(SysData); % % [pqIncr,pvIncr,Rind0,Rind1,Reind0,Reind1,Rzip0,Rzip1,Ytr0,Ytr1,Ysh0,Ysh1,VspSq2,~,~,~,~,Tmech1,Varref1,Ef1,Pm1,Eq11]=unfoldSysPara(SysPara); % % [maxTime,segTime,~,nlvl,taylorN,alphaTol,diffTol,diffTolMax,method]=unfoldSimData(SimData); % % % % if isfield(SysPara,'nIslands')&&isfield(SysPara,'islands')&&isfield(SysPara,'refs') % % nIslands=SysPara.nIslands;islands=SysPara.islands;refs=SysPara.refs; % % else % % [nIslands,islands,refs]=searchIslands(bus(:,1),line(:,1:2)); % % end % % % % nbus=size(bus,1); % % % % busType=zeros(nbus,1); % % if isempty(pv) % % pv=zeros(0,6); % % end % % if isempty(pq) % % pq=zeros(0,6); % % end % % if isempty(shunt) % % shunt=zeros(0,7); % % end % % if isempty(sw) % % sw=zeros(0,13); % % end % % busType(pv(:,1))=1; % % busType(sw(:,1))=2; % % % % isw=find(busType==2); % % ipv=find(busType~=0); % % ipq=find(busType==0); % % npq=size(ipq,1); % % npv=size(ipv,1); % % % % % Determine the frequency model of each island % % freqTypeTag=zeros(nIslands,1);%0:sw,1:syn,2:steady-state f % % freqKeptTag=zeros(nbus,1);% corresponds to freqType=2 % % frefs=refs; % % fswTag=zeros(nbus,1); % % fsynTag=zeros(nbus,1); % % fswTag(isw)=1; % % fswTagxD=fswTag; % % fsynTag(syn(:,1))=1; % % D0=imag(xt(vIdx)); % % for isl=1:nIslands % % if isempty(find(fswTag(islands==isl)==1, 1)) % % if isempty(find(fsynTag(islands==isl)==1, 1)) % % freqTypeTag(isl)=2; % % busesInIsland=find(islands==isl); % % [~,imin]=min(abs(D0(busesInIsland))); % % frefs(isl)=busesInIsland(imin(1)); % % fswTagxD(frefs(isl))=1; % % freqKeptTag(busesInIsland)=1; % % else % % freqTypeTag(isl)=1; % % end % % end % % end % % freqKeptTagxRef=freqKeptTag; % % freqKeptTagxRef(frefs)=0; % % nFreqKept=sum(freqKeptTag); % % % % if ~isempty(agc) % % agcExt=zeros(nbus,size(agc,2)); % % agcExt(agc(:,1),:)=agc; % % fdk=agcExt(:,2)+agcExt(:,3); %1/R+D % % else % % fdk=zeros(nbus,1); % % end % % fIngIdx=((2*nbus+1):(3*nbus))'; % % % % stateFilterTag=ones(nState,1); % % stateFilterTag(vIdx)=0; % % stateFilterTag(qIdx)=0; % % stateFilterTag(pgIdx)=0; % % stateFilterTag(efIdx)=0; % % stateFilterTag(tgovmIdx)=0; % % stateFilterTag(fIdx)=0; % % % stateFilterTag(dpgIdx)=0; % % % busFilterTag=ones(nbus,1); % % % busFilterTag(sw(:,1))=0; % % % jacBusFilterTag=[busFilterTag;busFilterTag]; % % % % busTag=ones(nbus,1); % % busTag(sw(:,1))=0; % % jggRowTag=[busTag;busTag;freqKeptTagxRef]; % % jggColTag=[busTag;fswTagxD==0;freqKeptTag]; % % % % idxNonSw=find(busType~=2); % % idxNonSwD=find(busType~=2&fswTagxD==1); % % % % nInd=size(ind,1); % % if ~isempty(ind) % % indIdx=ind(:,1); % % Rm1=ind(:,7); % % Xm1=ind(:,8); % % Zm1=ind(:,7)+1j*ind(:,8); % % Rm2=ind(:,9); % % Xm2=ind(:,10); % % Zmm=1j*ind(:,13); % % Tm0=ind(:,15)+ind(:,16)+ind(:,17); % % Tm1=-ind(:,16)-2*ind(:,17); % % Tm2=ind(:,17); % % Hm=ind(:,14); % % end % % % % nSyn=size(syn,1); % % if ~isempty(syn) % % synIdx=syn(:,1); % % wgb=syn(:,4); % % model=syn(:,5); % % Xgl=syn(:,6); % % Rga=syn(:,7); % % Xgd=syn(:,8); % % Xgd1=syn(:,9); % % Xgd2=syn(:,10); % % Tgd1=syn(:,11); % % Tgd2=syn(:,12); % % Xgq=syn(:,13); % % Xgq1=syn(:,14); % % Xgq2=syn(:,15); % % Tgq1=syn(:,16); % % Tgq2=syn(:,17); % % Mg=syn(:,18); % % Dg=syn(:,19); % % TgAA=syn(:,24); % % gammad=Tgd2./Tgd1.*Xgd2./Xgd1.*(Xgd-Xgd1); % % gammaq=Tgq2./Tgq1.*Xgq2./Xgq1.*(Xgq-Xgq1); % % end % % % % nExc=size(exc,1); % % if ~isempty(exc) % % excIdx=exc(:,1); % % VavrMax=exc(:,3); % % VavrMin=exc(:,4); % % muavr0=exc(:,5); % % Tavr1=exc(:,7); % % Tavr2=exc(:,6); % % vavrf0=exc(:,8); % % Vavr0=exc(:,9); % % Tavre=exc(:,10); % % Tavrr=exc(:,11); % % end % % % % nTg=size(tg,1); % % if ~isempty(tg) % % tgIdx=tg(:,1); % % wtgref=tg(:,3); % % Rtg=tg(:,4); % % Ttgmax=tg(:,5); % % Ttgmin=tg(:,6); % % Ttg2=tg(:,7); % % Ttg1=tg(:,8); % % end % % % % [V0,Q0,s0,d0,w0,eq10,eq20,ed10,ed20,psid0,psiq0,Pm0,Ef0,Vavrm0,Vavrr0,Vavrf0,Vavrref0,tgovg0,tgovm0,tgovmech0,f0,dpg0,qplt0,vg0]=unfoldX(xt,SysData); % % if ~isempty(ind) % % [YshInd0,Yshind1]=getLinearInterpolatorInd(nbus,ind,s0,s0); % % Ysh0x=Ysh0+YshInd0; % % Ysh1x=Ysh1+Yshind1; % % else % % Ysh0x=zeros(nbus,1); % % Ysh1x=zeros(nbus,1); % % end % % Ytr=Ytr0+Ytr1*t; % % Ysh=Ysh0x+Ysh1x*t; % % YtrNew=Ytr0+Ytr1*(t+dt); % % YshNew=Ysh0x+Ysh1x*(t+dt); % % % % SNew=-accumarray(pq(:,1),pq(:,4)+1j*pq(:,5),[nbus,1])+accumarray(pv(:,1),pv(:,4),[nbus,1]); % % SNew=SNew-accumarray(pq(:,1),pqIncr(:,1)+1j*pqIncr(:,2),[nbus,1])*(t+dt)+accumarray(pv(:,1),pvIncr,[nbus,1])*(t+dt); % % if size(pqIncr,2)>=4;SNew=SNew-accumarray(pq(:,1),pqIncr(:,3)+1j*pqIncr(:,4),[nbus,1])*(t+dt)*(t+dt);end % % SNew=SNew-accumarray(zip(:,1),(Rzip0+Rzip1*(t+dt)).*(zip(:,7)+1j*zip(:,10)),[nbus,1]); % % % % INew=-accumarray(zip(:,1),(Rzip0+Rzip1*(t+dt)).*(zip(:,6)-1j*zip(:,9)),[nbus,1]); % % JNew=real(INew); % % KNew=imag(INew); % % % % YNew=YtrNew+sparse(1:nbus,1:nbus,YshNew,nbus,nbus); % % GNew=real(YNew);BNew=imag(YNew); % % % % % Calculate diff and jac, do N-R % % Vtemp=V0; % % pqx=pq;pqx(:,[4,5])=pq(:,[4,5])+pqIncr(:,1:2)*t;if size(pqIncr,2)>=4;pqx(:,[4,5])=pqx(:,[4,5])+pqIncr(:,3:4)*t*t;end % % pvx=pv;pvx(:,4)=pv(:,4)+pvIncr*t; % % indx=ind;if ~isempty(ind);indx(:,15:17)=ind(:,15:17).*repmat(Rind0+Rind1*t,1,3);indx(:,13)=ind(:,13)./(Reind0+Reind1*t);end % % zipx=zip;if ~isempty(zip);zipx(:,5:10)=zip(:,5:10).*repmat(Rzip0+Rzip1*t,1,6);end % % SysDatax=foldSysData(bus,sw,pvx,pqx,shunt,line,indx,zipx,syn,exc,tg,agc,cac,cluster); % % % % pqxx=pq;pqxx(:,[4,5])=pq(:,[4,5])+pqIncr(:,1:2)*(t+dt);if size(pqIncr,2)>=4;pqxx(:,[4,5])=pqxx(:,[4,5])+pqIncr(:,3:4)*(t+dt)*(t+dt);end % % pvxx=pv;pvxx(:,4)=pv(:,4)+pvIncr*(t+dt); % % indxx=ind;if ~isempty(ind);indxx(:,15:17)=ind(:,15:17).*repmat(Rind0+Rind1*(t+dt),1,3);indxx(:,13)=ind(:,13)./(Reind0+Reind1*(t+dt));end % % zipxx=zip;if ~isempty(zip);zipxx(:,5:10)=zip(:,5:10).*repmat(Rzip0+Rzip1*(t+dt),1,6);end % % SysDataxx=foldSysData(bus,sw,pvxx,pqxx,shunt,line,indxx,zipxx,syn,exc,tg,agc,cac,cluster); % % % % SysData=foldSysData(bus,sw,pvx,pqx,shunt,line,ind,zip,syn,exc,tg,agc,cac,cluster); % % dx1=integ(SysDatax,SysPara,xt,dt); % % xTemp=xt; % % xTemp=xTemp+dx1; % % % % iterMax=10; % % exitflag=-1; % % for iter=1:iterMax % % % calculate df and dg % % dx2=integ(SysDataxx,SysPara,xTemp,dt); % % diffF=xt-xTemp+(dx1+dx2)/2; % % diffF(stateFilterTag==0)=0; % % % % Ctemp=real(Vtemp); % % Dtemp=imag(Vtemp); % % Atemp=abs(Vtemp); % % Vgtemp=Vtemp(syn(:,1)); % % ftemp=xTemp(fIdx); % % % % eq0=Ef0;ed0=zeros(size(Ef0)); % % [~,~,sNew,dNew,wNew,eq1New,eq2New,ed1New,ed2New,psidNew,psiqNew,EdNew,EfNew,VavrmNew,VavrrNew,VavrfNew,VavrrefNew,tgovgNew,tgovmNew,tgovmechNew,fNew,dpgNew,qpltNew,vgNew]=unfoldX(xTemp,SysData); % % eqNew=EfNew;edNew=zeros(size(EfNew)); % % % % [MatGV0,MatGV1,MatGRhs0,MatGRhs1]=getLinearInterpolatorSyn(syn,[],d0,dNew,ed0,ed10,ed20,edNew,ed1New,ed2New,eq0,eq10,eq20,eqNew,eq1New,eq2New,psid0,psiq0,psidNew,psiqNew); % % % % MatGVNew=MatGV0+MatGV1; % % MatGRhsNew=MatGRhs0+MatGRhs1; % % J1=GNew+sparse(syn(:,1),syn(:,1),MatGVNew(:,1),nbus,nbus); % % J2=-BNew+sparse(syn(:,1),syn(:,1),MatGVNew(:,2),nbus,nbus); % % J3=BNew+sparse(syn(:,1),syn(:,1),MatGVNew(:,3),nbus,nbus); % % J4=GNew+sparse(syn(:,1),syn(:,1),MatGVNew(:,4),nbus,nbus); % % P2freq=sparse(1:nbus,1:nbus,-freqKeptTag.*fdk,nbus,nbus); % % Freq2freq=sparse([1:nbus,1:nbus],[1:nbus,frefs(islands)'],[ones(1,nbus),-ones(1,nbus)],nbus,nbus); % % % % Ig=accumarray(syn(:,1),MatGRhsNew(:,1)+1j*MatGRhsNew(:,2),[nbus,1])-... % % accumarray(syn(:,1),(MatGVNew(:,1).*real(Vgtemp)+MatGVNew(:,2).*imag(Vgtemp))+1j*(MatGVNew(:,3).*real(Vgtemp)+MatGVNew(:,4).*imag(Vgtemp)),[nbus,1]); % % % diffG=conj(SNew)+INew.*abs(Vtemp)+Ig.*conj(Vtemp)-(YNew*Vtemp).*conj(Vtemp)+freqKeptTag.*(dpgNew-fdk.*fNew); % % % diffG(busFilterTag==0)=0; % % % diffGf=zeros(nbus,1); % % % % diff=conj(SNew)+INew.*abs(Vtemp)+Ig.*conj(Vtemp)-(YNew*Vtemp).*conj(Vtemp); % % diffP=real(diff)+freqKeptTag.*(-fdk.*ftemp+dpg0); % % diffVQ=imag(diff); % % diffGf=ftemp-ftemp(frefs(islands)); % % if ~isempty(pv) % % diffVQ(pv(:,1))=abs(Vtemp(pv(:,1))).*abs(Vtemp(pv(:,1)))-(VspSq2(pv(:,1),1)+VspSq2(pv(:,1),2)*(t+dt)); % % end % % % % diffGx=[diffP;diffVQ;diffGf]; % % diffGx(jggRowTag==0)=0; % % % % if iter>1&&max(abs([diffF;diffGx]))0)=0; % % tgovmActive((tgovm0-Ttgmin)<0)=0; % % pActiveInSyn(tgIdx)=tgovmActive; % % texcActive=ones(nExc,1); % % texcActive((Vavrf0-VavrMax)>0)=0; % % texcActive((Vavrf0-VavrMin)<0)=0; % % texcActiveInSyn=zeros(nSyn,1); % % texcActiveInSyn(tgIdx)=texcActive; % % numSynOnBus=accumarray(syn(:,1),1,[nbus,1]); % % %delta % % jffi=[jffi;deltaIdx]; % % jffj=[jffj;omegaIdx]; % % jffv=[jffv;wgb]; % % %omega % % jffi=[jffi;omegaIdx;omegaIdx(tgIdx);omegaIdx(tgIdx);omegaIdx(tgIdx);omegaIdx]; % % jffj=[jffj;omegaIdx;tgovgIdx;omegaIdx(tgIdx);tmechIdx;dpgIdx(synIdx)]; % % jffv=[jffv;-Dg/2./Mg;tgovmActive;-tgovmActive.*Ttg1./Ttg2./Rtg;tgovmActive;pActiveInSyn./numSynOnBus(synIdx)]; % % %psiq % % jffi=[jffi;psidIdx(model>=8)]; % % jffj=[jffj;psiqIdx(model>=8)]; % % jffv=[jffv;wgb(model>=8)]; % % %psid % % jffi=[jffi;psiqIdx(model>=8)]; % % jffj=[jffj;psidIdx(model>=8)]; % % jffv=[jffv;-wgb(model>=8)]; % % %ed'' % % jffi=[jffi;ed2Idx(model>=5);ed2Idx(model>=5)]; % % jffj=[jffj;ed2Idx(model>=5);ed1Idx(model>=5)]; % % jffv=[jffv;-1./Tgq2(model>=5);1./Tgq2(model>=5)]; % % %eq'' % % jffi=[jffi;eq2Idx(model>=5);eq2Idx(model>=5);eq2Idx(model>=5&texcActiveInSyn==1)]; % % jffj=[jffj;eq2Idx(model>=5);eq1Idx(model>=5);vavrfIdx(texcActive==1&model(excIdx)>=5)]; % % jffv=[jffv;-1./Tgd2(model>=5);1./Tgd2(model>=5);TgAA(model>=5&texcActiveInSyn==1)./Tgd1(model>=5&texcActiveInSyn==1)./Tgd2(model>=5&texcActiveInSyn==1)]; % % %ed' % % jffi=[jffi;ed1Idx(model>=4)]; % % jffj=[jffj;ed1Idx(model>=4)]; % % jffv=[jffv;-1./Tgq1(model>=4)]; % % %eq' % % jffi=[jffi;eq1Idx(model>=3)]; % % jffj=[jffj;eq1Idx(model>=3)]; % % jffv=[jffv;-1./Tgd1(model>=3)]; % % jffi=[jffi;eq1Idx(model>=5&texcActiveInSyn==1)]; % % jffj=[jffj;vavrfIdx(texcActive==1&model(excIdx)>=5)]; % % jffv=[jffv;(1-TgAA(model>=5&texcActiveInSyn==1)./Tgd1(model>=5&texcActiveInSyn==1))./Tgd2(model>=5&texcActiveInSyn==1)]; % % jffi=[jffi;eq1Idx((model==3|model==4)&texcActiveInSyn==1)]; % % jffj=[jffj;vavrfIdx(texcActive==1&(model(excIdx)==3|model(excIdx)==4))]; % % jffv=[jffv;(1-TgAA((model==3|model==4)&texcActiveInSyn==1)./Tgd1((model==3|model==4)&texcActiveInSyn==1))./Tgd2((model==3|model==4)&texcActiveInSyn==1)]; % % end % % % % if ~isempty(tg) % % jffi=[jffi;tgovgIdx;tgovgIdx]; % % jffj=[jffj;omegaIdx;tgovgIdx]; % % jffv=[jffv;-(1-Ttg1./Ttg2)./Rtg./Ttg2;-1./Ttg2]; % % end % % % % if ~isempty(exc) % % VmagAvr=abs(Vtemp(synIdx(excIdx))); % % % % jffi=[jffi;vavrmIdx]; % % jffj=[jffj;vavrmIdx]; % % jffv=[jffv;-1./Tavrr]; % % % % jffi=[jffi;vavrrIdx;vavrrIdx;vavrrIdx]; % % jffj=[jffj;vavrmIdx;vavrrefIdx;vavrrIdx]; % % jffv=[jffv;-muavr0.*(1-Tavr1./Tavr2)./Tavr2;muavr0.*(1-Tavr1./Tavr2)./Tavr2;-1./Tavr2]; % % % % jffi=[jffi;vavrfIdx;vavrfIdx;vavrfIdx;vavrfIdx]; % % jffj=[jffj;vavrmIdx;vavrrefIdx;vavrrIdx;vavrfIdx]; % % jffv=[jffv;-muavr0.*Tavr1./Tavr2./Tavre.*VmagAvr./Vavr0;muavr0.*Tavr1./Tavr2./Tavre.*VmagAvr./Vavr0;VmagAvr./Vavr0./Tavre;-1./Tavre]; % % end % % % % if ~isempty(agc) % % agcExt=zeros(nbus,size(agc,2)); % % agcExt(agc(:,1),:)=agc; % % % % jfgi=[jfgi;dpgIdx(freqKeptTag==1)]; % % jfgj=[jfgj;fIngIdx(freqKeptTag==1)];%f % % jfgv=[jfgv;-agcExt(freqKeptTag==1,4)]; % % % % numSynOnBus=accumarray(syn(:,1),1,[nbus,1]); % % jffi=[jffi;dpgIdx(syn(:,1))]; % % jffj=[jffj;omegaIdx];%f % % jffv=[jffv;-agcExt(syn(:,1),4)./numSynOnBus(syn(:,1))]; % % end % % % % Jff=dt*sparse(jffi,jffj,jffv,nState,nState)/2-speye(nState,nState); % % % % % construct Jfg % % Jfg=dt*sparse(jfgi,jfgj,jfgv,nState,3*nbus)/2; %P,Q,f % % % % jac=[Jff(stateFilterTag==1,stateFilterTag==1),Jfg(stateFilterTag==1,jggColTag==1);Jgf(jggRowTag==1,stateFilterTag==1),Jgg(jggRowTag==1,jggColTag==1)]; % % % % correction=-jac\[diffF(stateFilterTag==1);diffGx(jggRowTag==1)]; % % nStateCorr=sum(stateFilterTag); % % xTemp(stateFilterTag==1)=xTemp(stateFilterTag==1)+correction(1:nStateCorr); % % corrFull=zeros(3*nbus,1); % % corrFull(jggRowTag==1)=correction((nStateCorr+1):end); % % Vtemp=Vtemp+corrFull(1:nbus)+1j*corrFull((nbus+1):(2*nbus)); % % xTemp(vIdx)=Vtemp; % % xTemp(fIdx)=corrFull(fIngIdx); % % xTemp=adjustAlgebraic(SysDataxx,xTemp); % % end % % % % dxc=(xTemp-xt)/dt; % % SysParaxx=foldSysPara([],[],[],[],[],[],[],[],Ytr0+Ytr1*(t+dt),[],Ysh0+Ysh1*(t+dt),[],[VspSq2(:,1)+VspSq2(:,2)*(t+dt),zeros(size(VspSq2,1),1)],[],[],[],[]); % % diff=checkEquationBalanceSynDyn(SysDataxx,SysParaxx,xTemp,dxc); % % % % end