From 674bb92f0ba607cfb696b2d065dba2bef632da73 Mon Sep 17 00:00:00 2001 From: Yang Liu Date: Tue, 7 Feb 2023 20:42:05 -0500 Subject: [PATCH 1/5] Add test --- test.txt | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 test.txt diff --git a/test.txt b/test.txt new file mode 100644 index 0000000..e138722 --- /dev/null +++ b/test.txt @@ -0,0 +1,3 @@ +# TEST USE + +This file is for test only. \ No newline at end of file From a524c01da9543f63cba7da158b12028f9aebd02b Mon Sep 17 00:00:00 2001 From: Yang Liu Date: Tue, 7 Feb 2023 20:43:36 -0500 Subject: [PATCH 2/5] Add date --- test.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test.txt b/test.txt index e138722..7cd40e5 100644 --- a/test.txt +++ b/test.txt @@ -1,3 +1,5 @@ # TEST USE -This file is for test only. \ No newline at end of file +This file is for test only. + +02/07/2023 \ No newline at end of file From e27614047888507b0a1b311af37359dc46ba6182 Mon Sep 17 00:00:00 2001 From: Yang Liu Date: Tue, 7 Feb 2023 21:11:37 -0500 Subject: [PATCH 3/5] test again --- test.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test.txt b/test.txt index 7cd40e5..6e2d667 100644 --- a/test.txt +++ b/test.txt @@ -2,4 +2,6 @@ This file is for test only. -02/07/2023 \ No newline at end of file +02/07/2023 + +Test again. \ No newline at end of file From aac199550cee3f893a0bf971b61267692855b54d Mon Sep 17 00:00:00 2001 From: Yang Liu Date: Tue, 7 Feb 2023 21:12:25 -0500 Subject: [PATCH 4/5] delete test.txt --- test.txt | 7 ------- 1 file changed, 7 deletions(-) delete mode 100644 test.txt diff --git a/test.txt b/test.txt deleted file mode 100644 index 6e2d667..0000000 --- a/test.txt +++ /dev/null @@ -1,7 +0,0 @@ -# TEST USE - -This file is for test only. - -02/07/2023 - -Test again. \ No newline at end of file From a2c73763da1294159f870dfab2f758aaf6b4cee8 Mon Sep 17 00:00:00 2001 From: Yang Liu Date: Sun, 26 Nov 2023 17:37:21 -0500 Subject: [PATCH 5/5] implement DT solvers --- internal/Cal_locl_er.m | 69 + .../Copy_of_hemMachinePFSalientcontinueDyn.m | 1221 ++++++++ internal/VSOO.m | 143 + internal/dtmMachinePFSalientcontinueDyn.m | 1228 ++++++++ internal/dtmMachinePFmultiStageDyn.m | 1084 +++++++ ...opy_of_hemMachinePFSalientcontinueDyn.html | 2498 +++++++++++++++++ ...Copy_of_hemMachinePFSalientcontinueDyn.pdf | Bin 0 -> 49274 bytes internal/simulationTimeDomainDT.m | 138 + 8 files changed, 6381 insertions(+) create mode 100644 internal/Cal_locl_er.m create mode 100644 internal/Copy_of_hemMachinePFSalientcontinueDyn.m create mode 100644 internal/VSOO.m create mode 100644 internal/dtmMachinePFSalientcontinueDyn.m create mode 100644 internal/dtmMachinePFmultiStageDyn.m create mode 100644 internal/html/Copy_of_hemMachinePFSalientcontinueDyn.html create mode 100644 internal/html/Copy_of_hemMachinePFSalientcontinueDyn.pdf create mode 100644 internal/simulationTimeDomainDT.m diff --git a/internal/Cal_locl_er.m b/internal/Cal_locl_er.m new file mode 100644 index 0000000..a2e7ee4 --- /dev/null +++ b/internal/Cal_locl_er.m @@ -0,0 +1,69 @@ +function [LTE,LTE2,LTE3] = Cal_locl_er(x_ori,k,h) +% Calculation of local error +% +% FUNCTION Cal_locl_er +% +% Author: Kaiyang Huang +% +% Copyright (C) 2023, 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 + +% x_ori - Initial system state +% xNew - Updated system state (algebraic variables to be solved) +% SysDataNew - (optional) updated system data +% +% OUTPUT +% Vx, Wx, Qx, fx - Last HE coefficients of algebraic variables +% xx - Solved updated system state +% finalAlpha - The ending length of this segment of simulation +% alphas - Record of alphas +% diffRec - A list of errors +% + + x = x_ori(:,k-3:k); + Xh = x.*h.^(k-4:k-1); + x_new = polyvalVec(x_ori,h); + eta = 0.001; + infcof = max(abs(Xh(:,end))./(abs(x_new)+eta)); + trc = infcof^(1/k); + LTE = infcof/(1-trc); + + LTE3 = max(abs(Xh(:,end-1)./(x_new+eta))); + + % relative error used to change order + e1 = abs(Xh(:,end-1)./Xh(:,end)); + e2 = abs(Xh(:,end-2)./Xh(:,end)); + e3 = abs(Xh(:,end-3)./Xh(:,end-1)); + % delete nan induced by zero/zero + f1 = find(Xh(:,end)==0); + f2 = find(Xh(:,end-1)==0); + f2 = f2(:); + e1(f1) = 0; + e2(f1) = 0; + e3(f2) = 0; + LTE2 = infcof/min([norm(e1,Inf), sqrt(norm(e2,Inf)), sqrt(norm(e3,Inf))]); + +end + diff --git a/internal/Copy_of_hemMachinePFSalientcontinueDyn.m b/internal/Copy_of_hemMachinePFSalientcontinueDyn.m new file mode 100644 index 0000000..305db70 --- /dev/null +++ b/internal/Copy_of_hemMachinePFSalientcontinueDyn.m @@ -0,0 +1,1221 @@ +function [V,Q,s,d,w,eq1,eq2,ed1,ed2,psid,psiq,Pm,Ef,Vavrm,Vavrr,Vavrf,Vavrref,tgovg,tgovm,Tmech,f,dpg,qplt,vg]=... + hemMachinePFSalientcontinueDyn(SimData,SysData,SysPara,x0) +% Core HE algorithm for solving DAEs (dynamic simulation) +% +% FUNCTION hemMachinePFSalientcontinueDyn +% +% 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 +% x0 - Initial system state +% +% OUTPUT - (will be consolidated in a future version) +% +% TODO % Modify the output arguments +% + +global IS_OCTAVE; + + + +% import system data +[bus,sw,pv,pq,shunt,line,ind,zip,syn,exc,tg,agc,cac,cluster]=unfoldSysData(SysData); +% nbus:total number of buses +nbus=size(bus,1); +nline=size(line,1); + +%determine islanding +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 + +% improt initial condition +[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(x0,SysData); +% import simualtion data +[~,~,~,nlvl,taylorN,~,~,~,~]=unfoldSimData(SimData); +% import system parameters +[pqIncr,pvIncr,Rind0,Rind1,Reind0,Reind1,Rzip0,Rzip1,Ytr0,Ytr1,Ysh0,Ysh1,VspSq2,~,~,~,~,Tmech1,Varref1,Ef1,Pm1,Eq11]=unfoldSysPara(SysPara); +% + +% It seems that PQ incremental is given for every pq bus. +% need to figure how to utilize them +Pls=zeros(nbus,2);Pls(pq(:,1),1)=pqIncr(:,1);if ~isempty(pv);Pls(pv(:,1),1)=Pls(pv(:,1),1)-pvIncr;end +Qls=zeros(nbus,2);Qls(pq(:,1),1)=pqIncr(:,2); +% why additional PQ is given +if size(pqIncr,2)>=4 + Pls(pq(:,1),2)=pqIncr(:,3); + Qls(pq(:,1),2)=pqIncr(:,4); +end + +% formatting Ymatrix, here the default value of fault is empty +if isempty(Ytr0) + [Y,Ytr0,Ysh,ytrfr,ytrto,yshfr,yshto]=getYMatrix(nbus,line); +end + + +% reshape the pv, pq shunt and swing buses if they are empty +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 + +% label pv and swing buses +% 1: PV bus, 0: PQ bus +busType(pv(:,1))=1; +busType(sw(:,1))=2; +% zip(busType(zip(:,1))~=0,10)=0; + +% index of swing bus (isw), pv bus(ipv), and pq bus(ipq) +% is given: isw, ipv, and ipq +% Additionally, number of pv and pq buses are given: +%npv, npq respectively +isw=find(busType==2); +ipv=find(busType==1); +ipq=find(busType==0); +npq=size(ipq,1); +npv=size(ipv,1); + +% shunt capacitator is initialized as yShunt which is a complex number. +% for every bus +yShunt=zeros(nbus,1); +yShunt(shunt(:,1))=shunt(:,5)+1j*shunt(:,6); + +% check if zip load exists in the system +% and initialized zip load +if ~isempty(zip)%zipMode=0 + Ysh0=Ysh0+accumarray(zip(:,1),Rzip0.*(zip(:,5)+1j*zip(:,8)).*zip(:,12),[nbus,1]); + Ysh1=Ysh1+accumarray(zip(:,1),Rzip1.*(zip(:,5)+1j*zip(:,8)).*zip(:,12),[nbus,1]); +end + +% now zip load + shunt +Ysh0=Ysh0+yShunt; +% Y=Y+sparse(1:nbus,1:nbus,yShunt,nbus,nbus); + +% now zip load + shunt+ network Y matrix +Y=Ytr0+sparse(1:nbus,1:nbus,Ysh0,nbus,nbus); + +%initialize P and Q for every bus +pVec=zeros(nbus,1); +qVec=zeros(nbus,1); +% vSp=zeros(nbus,1); + +% need to figure out the meaning of index 1, 4,5 +% based Kaiyang's understanding, 1 is load side and 4&5 are generators' +% output +pVec(pv(:,1))=pVec(pv(:,1))+pv(:,4); +pVec(pq(:,1))=pVec(pq(:,1))-pq(:,4); +qVec(pq(:,1))=qVec(pq(:,1))-pq(:,5); +% account the zip load, i.e dynamic load +if ~isempty(zip)%zipMode=0, account for the PQ components in ZIP loads + pVec=pVec-accumarray(zip(:,1),Rzip0.*zip(:,7).*zip(:,12),[nbus,1]); + qVec=qVec-accumarray(zip(:,1),Rzip0.*zip(:,10).*zip(:,12),[nbus,1]); +end +% qVec(ipv)=qVec(ipv)+Q0(ipv); +% vSp(ipv)=pv(:,5); + +% so far, initialization of PQ for every bus and Y matrix is ready + + +% initiliza voltage V and W = 1/V for every bus +V=zeros(nbus,nlvl+1); +V(:,1)=V0; +W=zeros(nbus,nlvl+1); +W(:,1)=1./V0; + + +% initiliza magnitude of voltage V for every bus +Vmag=zeros(nbus,nlvl+1); +Vmag(:,1)=abs(V0); + +% Power is initilized as we already cooked pVec and qVec +P=zeros(nbus,nlvl+1); +P(:,1)=pVec; +% P(isw,2:end)=0; +% here we need to figure out what Q extra mean, and difference from Q +% notice that Q0 is initialized with sysmdata but not P0 +Q=zeros(nbus,nlvl+1); +Qxtra=zeros(size(Q)); +Q(:,1)=Q0; +Qxtra(:,1)=qVec; + +% Also, the meaning of Pls and Qls need to be verified +P(:,2:(size(Pls,2)+1))=-Pls; +Qxtra(:,2:(size(Qls,2)+1))=-Qls; + + +% In the previous, pVec and qvec are considered zip load, here Pls and Qls +% are not, so we need to do it. +if ~isempty(zip) + P(:,2)=P(:,2)-accumarray(zip(:,1),Rzip1.*zip(:,7).*zip(:,12),[nbus,1]); + Qxtra(:,2)=Qxtra(:,2)-accumarray(zip(:,1),Rzip1.*zip(:,10).*zip(:,12),[nbus,1]); +end +% Qxtra(busType~=0,2:end)=Q(busType~=0,2:end); +% Q(busType~=0,2:end)=0; + + +% seperate real and image part of voltages and their inverse +% here V = C+1i*D +% and W = 1./V = E + 1i*F +C0=real(V(:,1)); +D0=imag(V(:,1)); +E0=real(W(:,1)); +F0=imag(W(:,1)); + +% Construct sparse matrix individually for C,D,E,F,P,Q +% Notice that Q = Q(:,1)+Qxtra(:,1) which is different from P +C0M=sparse(1:nbus,1:nbus,C0,nbus,nbus); +D0M=sparse(1:nbus,1:nbus,D0,nbus,nbus); +E0M=sparse(1:nbus,1:nbus,E0,nbus,nbus); +F0M=sparse(1:nbus,1:nbus,F0,nbus,nbus); +P0M=sparse(1:nbus,1:nbus,P(:,1),nbus,nbus); +Q0M=sparse(1:nbus,1:nbus,Q(:,1)+Qxtra(:,1),nbus,nbus); + +% get real part and image part of Y matrix, not sure why do this +G=real(Y); +B=imag(Y); +% so Y = G + 1i*B + + +%-------------------------------------------------------------- +% Determine the frequency model of each island +% 0:sw,1:syn,2:steady-state f +freqTypeTag=zeros(nIslands,1);%0:sw,1:syn,2:steady-state f +freqKeptTag=zeros(nbus,1); +frefs=refs; +fswTag=zeros(nbus,1); +fsynTag=zeros(nbus,1); +fswTag(isw)=1; +fswTagxD=fswTag; +fsynTag(syn(:,1))=1; +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); +%----------------------------------------------------------- + + + + +%------------------------------------------------------------------ +% this part is for initialling inductor +if ~isempty(ind) % check if there is any inductor + nInd=size(ind,1); % determine the number of inductors + indIdx=ind(:,1); % store the index of inductors among all buses + + s=zeros(nInd,nlvl+1); % slip + s(:,1)=s0; % initialize slip + IL=zeros(nInd,nlvl+1); % | + IR=zeros(nInd,nlvl+1); % | + Vm=zeros(nInd,nlvl+1); % initialization finished 0 value + + + %-----------------parameters of inductors--------- + %-----------------START---------------- + R1=ind(:,7); + X1=ind(:,8); + Z1=ind(:,7)+1j*ind(:,8); + Ze=1j*ind(:,13); + R2=ind(:,9); + X2=ind(:,10); + T0=ind(:,15)+ind(:,16)+ind(:,17); + T1=-ind(:,16)-2*ind(:,17); + T2=ind(:,17); + Hm=ind(:,14); + %-----------------parameters of inductors--------- + %-----------------END---------------- + + + Rm=zeros(nInd,1); + + Am=sparse(indIdx,(1:nInd)',ones(1,nInd),nbus,nInd); + + % first order value of induction motor IL,VM,IR + IL(:,1)=V0(indIdx)./(Z1+Ze.*(R2+1j*X2.*s0)./(R2.*Reind0+(1j*X2.*Reind0+Ze).*s0)); + Vm(:,1)=V0(indIdx)-IL(:,1).*Z1; + IR(:,1)=Vm(:,1).*s0./(R2+1j*X2.*s0); + + J0=real(IR(:,1)); + K0=imag(IR(:,1)); + JL0=real(IL(:,1)); + KL0=imag(IL(:,1)); + + % prepare the algebric matrix + Yeind0=Reind0./Ze; + Yeind1=Reind1./Ze; + Ye1ind0=Reind0.*Z1./Ze; + Ye1ind1=Reind1.*Z1./Ze; + Ge=real(Yeind0); + Be=imag(Yeind0); + kg1e=real(Ye1ind0); + kb1e=imag(Ye1ind0); + Ge1=real(Yeind1); + Be1=imag(Yeind1); + kg1e1=real(Ye1ind1); + kb1e1=imag(Ye1ind1); + + % LHS_MatInd_Shr_sqz=zeros(nInd,4); + % RHS_C_Shr_sqz=zeros(nInd,8); + % LHS_MatInd_Shr2_sqz=zeros(nInd,8); + % + % LHS_MatInd_Shr=zeros(nInd,2,2); + % RHS_C_Shr=cell(nInd,1); + % LHS_MatInd_Shr2=cell(nInd,1); % A^-1B + % LHS_MatInd_Shr3=cell(nInd,1); % A^-1 + % + % for i=1:nInd + % LHS_MatInd=[R2(i),-X2(i)*s0(i),R1(i)*s0(i),-X1(i)*s0(i),-s0(i),0;... + % X2(i)*s0(i), R2(i),X1(i)*s0(i), R1(i)*s0(i),0,-s0(i);... + % -1,0,1+kg1e(i),-kb1e(i),-Ge(i), Be(i);... + % 0,-1,kb1e(i), 1+kg1e(i),-Be(i),-Ge(i);]; + % temp0=LHS_MatInd([3,4],[1,2])\eye(2); % A^-1 + % LHS_MatInd_Shr2{i}=temp0*LHS_MatInd([3,4],[3,4,5,6]); % A^-1B + % LHS_MatInd_Shr3{i}=temp0; % A^-1 + % temp1=LHS_MatInd([1,2],[1,2])/LHS_MatInd([3,4],[1,2]); % CA^-1 + % temp2=LHS_MatInd([1,2],[3,4,5,6])-temp1*LHS_MatInd([3,4],[3,4,5,6]); % L=D-CA^-1B + % LHS_MatInd_Shr(i,:,:)=-temp2(:,[1,2])\temp2(:,[3,4]); % -R\S + % RHS_C_Shr{i}=temp2(:,[1,2])\[eye(2),-temp1]; % R\[I,-CA^-1] + % + % LHS_MatInd_Shr_sqz(i,:)=reshape(LHS_MatInd_Shr(i,:,:),[1,4]); + % RHS_C_Shr_sqz(i,:)=reshape(RHS_C_Shr{i},[1,8]); + % LHS_MatInd_Shr2_sqz(i,:)=reshape(LHS_MatInd_Shr2{i},[1,8]); + % end + % LHS_MatInd_Bus=zeros(nbus,2,2); % \sum{-R\S} by buses + % LHS_MatInd_Bus(:,1,1)=accumarray(indIdx,LHS_MatInd_Shr(:,1,1),[nbus,1]); + % LHS_MatInd_Bus(:,1,2)=accumarray(indIdx,LHS_MatInd_Shr(:,1,2),[nbus,1]); + % LHS_MatInd_Bus(:,2,1)=accumarray(indIdx,LHS_MatInd_Shr(:,2,1),[nbus,1]); + % LHS_MatInd_Bus(:,2,2)=accumarray(indIdx,LHS_MatInd_Shr(:,2,2),[nbus,1]); + + MInd0=zeros(nInd,1); + MInd1=ones(nInd,1); + LHS_MatInd_sqz=[R2,X2.*s0,-MInd1,MInd0,... + -X2.*s0,R2,MInd0,-MInd1,... + R1.*s0,X1.*s0,MInd1+kg1e,kb1e,... + -X1.*s0,R1.*s0,-kb1e,MInd1+kg1e,... + -s0,MInd0,-Ge,-Be,... + MInd0,-s0,Be,-Ge]; % 4*6 matrix [C,D;A,B] + LHS_MatInd_idx=reshape((1:24)',[4,6]); + temp0inv_sqz=LHS_MatInd_sqz(:,reshape(LHS_MatInd_idx([3,4],[1,2]),1,[])); + temp0inv_sqz_det=temp0inv_sqz(:,1).*temp0inv_sqz(:,4)-temp0inv_sqz(:,2).*temp0inv_sqz(:,3); + temp0_sqz=[temp0inv_sqz(:,4),-temp0inv_sqz(:,2),-temp0inv_sqz(:,3),temp0inv_sqz(:,1)]./repmat(temp0inv_sqz_det,[1,4]);% A^-1 + indB_sqz=LHS_MatInd_sqz(:,reshape(LHS_MatInd_idx([3,4],[3,4,5,6]),1,[])); + LHS_MatInd_Shr2_sqz=[temp0_sqz(:,1).*indB_sqz(:,1)+temp0_sqz(:,3).*indB_sqz(:,2),temp0_sqz(:,2).*indB_sqz(:,1)+temp0_sqz(:,4).*indB_sqz(:,2),... + temp0_sqz(:,1).*indB_sqz(:,3)+temp0_sqz(:,3).*indB_sqz(:,4),temp0_sqz(:,2).*indB_sqz(:,3)+temp0_sqz(:,4).*indB_sqz(:,4),... + temp0_sqz(:,1).*indB_sqz(:,5)+temp0_sqz(:,3).*indB_sqz(:,6),temp0_sqz(:,2).*indB_sqz(:,5)+temp0_sqz(:,4).*indB_sqz(:,6),... + temp0_sqz(:,1).*indB_sqz(:,7)+temp0_sqz(:,3).*indB_sqz(:,8),temp0_sqz(:,2).*indB_sqz(:,7)+temp0_sqz(:,4).*indB_sqz(:,8)];% A^-1B + indC_sqz=LHS_MatInd_sqz(:,reshape(LHS_MatInd_idx([1,2],[1,2]),1,[])); + temp1_sqz=[indC_sqz(:,1).*temp0_sqz(:,1)+indC_sqz(:,3).*temp0_sqz(:,2),indC_sqz(:,2).*temp0_sqz(:,1)+indC_sqz(:,4).*temp0_sqz(:,2),... + indC_sqz(:,1).*temp0_sqz(:,3)+indC_sqz(:,3).*temp0_sqz(:,4),indC_sqz(:,2).*temp0_sqz(:,3)+indC_sqz(:,4).*temp0_sqz(:,4)];% CA^-1 + temp2_sqz=LHS_MatInd_sqz(:,reshape(LHS_MatInd_idx([1,2],[3,4,5,6]),1,[]))-... + [temp1_sqz(:,1).*indB_sqz(:,1)+temp1_sqz(:,3).*indB_sqz(:,2),temp1_sqz(:,2).*indB_sqz(:,1)+temp1_sqz(:,4).*indB_sqz(:,2),... + temp1_sqz(:,1).*indB_sqz(:,3)+temp1_sqz(:,3).*indB_sqz(:,4),temp1_sqz(:,2).*indB_sqz(:,3)+temp1_sqz(:,4).*indB_sqz(:,4),... + temp1_sqz(:,1).*indB_sqz(:,5)+temp1_sqz(:,3).*indB_sqz(:,6),temp1_sqz(:,2).*indB_sqz(:,5)+temp1_sqz(:,4).*indB_sqz(:,6),... + temp1_sqz(:,1).*indB_sqz(:,7)+temp1_sqz(:,3).*indB_sqz(:,8),temp1_sqz(:,2).*indB_sqz(:,7)+temp1_sqz(:,4).*indB_sqz(:,8)];% L=D-CA^-1B=[R,S] + temp2_c12_sqz=temp2_sqz(:,1:4); + temp2_c34_sqz=temp2_sqz(:,5:8); + temp2_c12_sqz_det=temp2_c12_sqz(:,1).*temp2_c12_sqz(:,4)-temp2_c12_sqz(:,2).*temp2_c12_sqz(:,3); + temp2_c12_inv_sqz=[temp2_c12_sqz(:,4),-temp2_c12_sqz(:,2),-temp2_c12_sqz(:,3),temp2_c12_sqz(:,1)]./repmat(temp2_c12_sqz_det,[1,4]); + LHS_MatInd_Shr_sqz=-[temp2_c12_inv_sqz(:,1).*temp2_c34_sqz(:,1)+temp2_c12_inv_sqz(:,3).*temp2_c34_sqz(:,2),temp2_c12_inv_sqz(:,2).*temp2_c34_sqz(:,1)+temp2_c12_inv_sqz(:,4).*temp2_c34_sqz(:,2),... + temp2_c12_inv_sqz(:,1).*temp2_c34_sqz(:,3)+temp2_c12_inv_sqz(:,3).*temp2_c34_sqz(:,4),temp2_c12_inv_sqz(:,2).*temp2_c34_sqz(:,3)+temp2_c12_inv_sqz(:,4).*temp2_c34_sqz(:,4)];% -R\S + RHS_C_Shr_sqz=[temp2_c12_inv_sqz,... + -[temp2_c12_inv_sqz(:,1).*temp1_sqz(:,1)+temp2_c12_inv_sqz(:,3).*temp1_sqz(:,2),temp2_c12_inv_sqz(:,2).*temp1_sqz(:,1)+temp2_c12_inv_sqz(:,4).*temp1_sqz(:,2),... + temp2_c12_inv_sqz(:,1).*temp1_sqz(:,3)+temp2_c12_inv_sqz(:,3).*temp1_sqz(:,4),temp2_c12_inv_sqz(:,2).*temp1_sqz(:,3)+temp2_c12_inv_sqz(:,4).*temp1_sqz(:,4)]];% R\[I,-CA^-1] + % will be used to calculate algebric variabls for motors + LHS_MatInd_Bus_sqz=zeros(nbus,4); % \sum{-R\S} by buses + LHS_MatInd_Bus_sqz(:,1)=accumarray(indIdx,LHS_MatInd_Shr_sqz(:,1),[nbus,1]); + LHS_MatInd_Bus_sqz(:,2)=accumarray(indIdx,LHS_MatInd_Shr_sqz(:,2),[nbus,1]); + LHS_MatInd_Bus_sqz(:,3)=accumarray(indIdx,LHS_MatInd_Shr_sqz(:,3),[nbus,1]); + LHS_MatInd_Bus_sqz(:,4)=accumarray(indIdx,LHS_MatInd_Shr_sqz(:,4),[nbus,1]); +else + s=zeros(0,nlvl+1); +end +% Initialization of inductors is finished +%------------------------------------------------------------------ + + +%------------------------------Initialization of ZIP load--------- +if ~isempty(zip) + nZip=size(zip,1); + zipIdx=zip(:,1); + IiL=zeros(nZip,nlvl+1); + BiL=zeros(nZip,nlvl+1); + + % prepare the necessary matrix by blocks + Bi0=abs(V0(zipIdx)); + JI=zip(:,6); + KI=-zip(:,9); + % current + Ii0L=Rzip0.*(JI+1j*KI).*V0(zipIdx)./Bi0; + Ji0L=real(Ii0L); + Ki0L=imag(Ii0L); + + IiL(:,1)=Ii0L; + BiL(:,1)=Bi0; + % voltage + Ci0=real(V0(zipIdx)); + Di0=imag(V0(zipIdx)); + + LHS_MatZip=[Rzip0.*JI./Bi0-Ci0.*Ji0L./Bi0./Bi0,-Rzip0.*KI./Bi0-Di0.*Ji0L./Bi0./Bi0,... + Rzip0.*KI./Bi0-Ci0.*Ki0L./Bi0./Bi0,Rzip0.*JI./Bi0-Di0.*Ki0L./Bi0./Bi0]; + Mat_BZip=[Ci0./Bi0,Di0./Bi0]; +else + IiL=zeros(0,nlvl+1); +end +%------------------------------Initialization of ZIP load------------------ +%------------------------------Initialization of ZIP load is finished---------------- + + +%------------------------------Initialization of GEN------------------ +%------------------------------Start------------------------ +nSyn=size(syn,1); +if ~isempty(syn) + synIdx =syn(:,1);% index number of Generators + wgb =syn(:,4);% maybe the base value + modSyn =syn(:,5);% the order of generator models + 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); + + d=zeros(nSyn,nlvl+1); % delta + w=zeros(nSyn,nlvl+1); % omega + eq1=zeros(nSyn,nlvl+1); %eq' + eq2=zeros(nSyn,nlvl+1); %eq'' + ed1=zeros(nSyn,nlvl+1); %ed' + ed2=zeros(nSyn,nlvl+1); %ed'' + psiq=zeros(nSyn,nlvl+1); % not sure, only in 8th order model + psid=zeros(nSyn,nlvl+1); % not sure, only in 8th order model + JG=zeros(nSyn,nlvl+1); + KG=zeros(nSyn,nlvl+1); + IGq=zeros(nSyn,nlvl+1); + IGd=zeros(nSyn,nlvl+1); + VGq=zeros(nSyn,nlvl+1); + VGd=zeros(nSyn,nlvl+1); + Cd=zeros(nSyn,nlvl+1); + Sd=zeros(nSyn,nlvl+1); + Ef=zeros(nSyn,nlvl+1); + Pm=zeros(nSyn,nlvl+1); + + cosd=cos(d0); + sind=sin(d0); + CG0=C0(synIdx); + DG0=D0(synIdx); + % the first value is given here, notice all are 8th order model + d(:,1)=d0; + w(:,1)=w0; + eq1(:,1)=eq10; + eq2(:,1)=eq20; + ed1(:,1)=ed10; + ed2(:,1)=ed20; + psiq(:,1)=psiq0; + psid(:,1)=psid0; + + % transform between grid side and dq side + + VGd(:,1)=sind.*CG0-cosd.*DG0; + VGq(:,1)=cosd.*CG0+sind.*DG0; + % now they are under dq side + + Cd(:,1)=cosd; % first order of cos(delta) + Sd(:,1)=sind; % first order of sin(delta) + Ef(:,1)=Ef0; + Pm(:,1)=Pm0; + + %check if controller exists + if ~isempty(Ef1) + Ef(:,2)=Ef1; + end + if ~isempty(Eq11) + eq1(:,2)=Eq11; + end + if ~isempty(Pm1) + Pm(:,2)=Pm1; + end + + % notice that here truncated taylor is applied + % and this is the key differnet from Dt rule + % Here only at most 5 th order taylor series are considered for sin + % and cos function + [cosp,sinp,taylorN]=getTaylorPolynomials(d0,taylorN); % taylorN may be truncated + + Mats=zeros(nSyn,4); + MatsR=zeros(nSyn,4); + MatsRs=zeros(nSyn,4); + + % count the number for different kinds models + % ex: modelTag = [ 0 0 0 0 0 10 0 0].' + % ex: there are 10 gens using 6th order model + modelTag=accumarray(modSyn,ones(nSyn,1),[8,1]); + + % determine the order of the model + % Do we really need for loop? + % the answer is yes since different gen may use different + % order model + for i=1:nSyn + % 8th order, no need to change + if modSyn(i)==8 + IGd(i,1)=(eq20(i)-psid0(i))/Xgd2(i); + IGq(i,1)=(-ed20(i)-psiq0(i))/Xgq2(i); + Mats(i,:)=[sind(i),cosd(i),-cosd(i),sind(i)]; + % 6th order + elseif modSyn(i)==6 + % algebric equation to solve Id, Iq + IGd(i,1)=((ed20(i)-VGd(i,1))*Rga(i)+(eq20(i)-VGq(i,1))*Xgq2(i))/(Rga(i)*Rga(i)+Xgd2(i)*Xgq2(i)); + IGq(i,1)=(-(ed20(i)-VGd(i,1))*Xgd2(i)+(eq20(i)-VGq(i,1))*Rga(i))/(Rga(i)*Rga(i)+Xgd2(i)*Xgq2(i)); + % transform matrix (inverse version) + Mats(i,:)=[sind(i),cosd(i),-cosd(i),sind(i)]; + % Here matrix is the inverse matrix, to understand this + % We have A*Ixy+B*Vxy = f => MatsR = A^-1, MatsRs = A^-1*B = MatsRs*B + % so Ixy = MatsR*f-MatsRs*Vxy, which is used later to + % eliminate Ixy when disturbance happens + MatsR(i,:)=[sind(i)*Rga(i)-cosd(i)*Xgd2(i),sind(i)*Xgq2(i)+cosd(i)*Rga(i),-cosd(i)*Rga(i)-sind(i)*Xgd2(i),-cosd(i)*Xgq2(i)+sind(i)*Rga(i)]/... + (Rga(i)*Rga(i)+Xgd2(i)*Xgq2(i)); + MatsRs(i,:)=[MatsR(i,1)*sind(i)+MatsR(i,2)*cosd(i),-MatsR(i,1)*cosd(i)+MatsR(i,2)*sind(i),... + MatsR(i,3)*sind(i)+MatsR(i,4)*cosd(i),-MatsR(i,3)*cosd(i)+MatsR(i,4)*sind(i)]; + % 5th order + elseif modSyn(i)==5 + IGd(i,1)=((ed20(i)-VGd(i,1))*Rga(i)+(eq20(i)-VGq(i,1))*Xgq2(i))/(Rga(i)*Rga(i)+Xgd2(i)*Xgq2(i)); + IGq(i,1)=(-(ed20(i)-VGd(i,1))*Xgd2(i)+(eq20(i)-VGq(i,1))*Rga(i))/(Rga(i)*Rga(i)+Xgd2(i)*Xgq2(i)); + Mats(i,:)=[sind(i),cosd(i),-cosd(i),sind(i)]; + MatsR(i,:)=[sind(i)*Rga(i)-cosd(i)*Xgd2(i),sind(i)*Xgq2(i)+cosd(i)*Rga(i),-cosd(i)*Rga(i)-sind(i)*Xgd2(i),-cosd(i)*Xgq2(i)+sind(i)*Rga(i)]/... + (Rga(i)*Rga(i)+Xgd2(i)*Xgq2(i)); + MatsRs(i,:)=[MatsR(i,1)*sind(i)+MatsR(i,2)*cosd(i),-MatsR(i,1)*cosd(i)+MatsR(i,2)*sind(i),... + MatsR(i,3)*sind(i)+MatsR(i,4)*cosd(i),-MatsR(i,3)*cosd(i)+MatsR(i,4)*sind(i)]; + % 4th order + elseif modSyn(i)==4 + IGd(i,1)=((ed10(i)-VGd(i,1))*Rga(i)+(eq10(i)-VGq(i,1))*Xgq1(i))/(Rga(i)*Rga(i)+Xgd1(i)*Xgq1(i)); + IGq(i,1)=(-(ed10(i)-VGd(i,1))*Xgd1(i)+(eq10(i)-VGq(i,1))*Rga(i))/(Rga(i)*Rga(i)+Xgd1(i)*Xgq1(i)); + Mats(i,:)=[sind(i),cosd(i),-cosd(i),sind(i)]; + MatsR(i,:)=[sind(i)*Rga(i)-cosd(i)*Xgd1(i),sind(i)*Xgq1(i)+cosd(i)*Rga(i),-cosd(i)*Rga(i)-sind(i)*Xgd1(i),-cosd(i)*Xgq1(i)+sind(i)*Rga(i)]/... + (Rga(i)*Rga(i)+Xgd1(i)*Xgq1(i)); + MatsRs(i,:)=[MatsR(i,1)*sind(i)+MatsR(i,2)*cosd(i),-MatsR(i,1)*cosd(i)+MatsR(i,2)*sind(i),... + MatsR(i,3)*sind(i)+MatsR(i,4)*cosd(i),-MatsR(i,3)*cosd(i)+MatsR(i,4)*sind(i)]; + % 3rd order + elseif modSyn(i)==3 + IGd(i,1)=((-VGd(i,1))*Rga(i)+(eq10(i)-VGq(i,1))*Xgq(i))/(Rga(i)*Rga(i)+Xgd1(i)*Xgq(i)); + IGq(i,1)=(-(-VGd(i,1))*Xgd1(i)+(eq10(i)-VGq(i,1))*Rga(i))/(Rga(i)*Rga(i)+Xgd1(i)*Xgq(i)); + Mats(i,:)=[sind(i),cosd(i),-cosd(i),sind(i)]; + MatsR(i,:)=[sind(i)*Rga(i)-cosd(i)*Xgd1(i),sind(i)*Xgq(i)+cosd(i)*Rga(i),-cosd(i)*Rga(i)-sind(i)*Xgd1(i),-cosd(i)*Xgq(i)+sind(i)*Rga(i)]/... + (Rga(i)*Rga(i)+Xgd1(i)*Xgq(i)); + MatsRs(i,:)=[MatsR(i,1)*sind(i)+MatsR(i,2)*cosd(i),-MatsR(i,1)*cosd(i)+MatsR(i,2)*sind(i),... + MatsR(i,3)*sind(i)+MatsR(i,4)*cosd(i),-MatsR(i,3)*cosd(i)+MatsR(i,4)*sind(i)]; + % classical model + elseif modSyn(i)==2 + IGd(i,1)=((-VGd(i,1))*Rga(i)+(Ef0(i)-VGq(i,1))*Xgq(i))/(Rga(i)*Rga(i)+Xgd(i)*Xgq(i)); + IGq(i,1)=(-(-VGd(i,1))*Xgd(i)+(Ef0(i)-VGq(i,1))*Rga(i))/(Rga(i)*Rga(i)+Xgd(i)*Xgq(i)); + Mats(i,:)=[sind(i),cosd(i),-cosd(i),sind(i)]; + MatsR(i,:)=[sind(i)*Rga(i)-cosd(i)*Xgd(i),sind(i)*Xgq(i)+cosd(i)*Rga(i),-cosd(i)*Rga(i)-sind(i)*Xgd(i),-cosd(i)*Xgq(i)+sind(i)*Rga(i)]/... + (Rga(i)*Rga(i)+Xgd(i)*Xgq(i)); + MatsRs(i,:)=[MatsR(i,1)*sind(i)+MatsR(i,2)*cosd(i),-MatsR(i,1)*cosd(i)+MatsR(i,2)*sind(i),... + MatsR(i,3)*sind(i)+MatsR(i,4)*cosd(i),-MatsR(i,3)*cosd(i)+MatsR(i,4)*sind(i)]; + end + end + % not sure how to use them now, but they are zeroth order of Ix and Iy + JG(:,1)= sind.*IGd(:,1)+cosd.*IGq(:,1); + KG(:,1)=-cosd.*IGd(:,1)+sind.*IGq(:,1); + + % put previous matrix in a right place in all buses instead of only + % generator buses + MatGCD=-[sparse(synIdx,synIdx,MatsRs(:,1),nbus,nbus),sparse(synIdx,synIdx,MatsRs(:,2),nbus,nbus);... + sparse(synIdx,synIdx,MatsRs(:,3),nbus,nbus),sparse(synIdx,synIdx,MatsRs(:,4),nbus,nbus)]; +else + d=zeros(0,nlvl+1); + w=zeros(0,nlvl+1); + eq1=zeros(0,nlvl+1); + eq2=zeros(0,nlvl+1); + ed1=zeros(0,nlvl+1); + ed2=zeros(0,nlvl+1); + psiq=zeros(0,nlvl+1); + psid=zeros(0,nlvl+1); + JG=zeros(0,nlvl+1); + KG=zeros(0,nlvl+1); + IGq=zeros(0,nlvl+1); + IGd=zeros(0,nlvl+1); + VGq=zeros(0,nlvl+1); + VGd=zeros(0,nlvl+1); + Cd=zeros(0,nlvl+1); + Sd=zeros(0,nlvl+1); + Ef=zeros(0,nlvl+1); + Pm=zeros(0,nlvl+1); +end +%------------------------------Initialization of GEN------------------ +%------------------------------EnD------------------------------------ + + + +%------------------------------Initialization of Exciter------------------ +%------------------------------START------------------------------------ +if ~isempty(exc) + nExc =size(exc,1); + % All Type 3 AVR, a 3rd order controller + % for Type 3 AVR, avr0(:,1:3) are Vavrm, Vavrr, Vavrf, + % and avr0(:,4) is reference Vref (input for secondary voltage control). + 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); + + %here I need to check why Vavrref is time varing instead of constant + % memory is given to state variables of EXC + Vavrm = zeros(nExc,nlvl+1); + Vavrr = zeros(nExc,nlvl+1); + Vavrf = zeros(nExc,nlvl+1); + Vavrref= zeros(nExc,nlvl+1); + + % zeroth order value is given + Vavrm(:,1)=real(Vavrm0); + Vavrr(:,1)=real(Vavrr0); + Vavrf(:,1)=real(Vavrf0); + Vavrref(:,1)=real(Vavrref0); + + % here Varref1 is given with syspara + if ~isempty(Varref1) + Vavrref(:,2)=Varref1; + end + + % non-windup limiter, check the limit + tavrMaxDiff=Vavrf(:,1)-VavrMax; + tavrMinDiff=Vavrf(:,1)-VavrMin; + + % label values in different interval + avrSt=zeros(nExc,1); + avrSt(tavrMaxDiff>0)=1; + avrSt(tavrMinDiff<0)=-1; + + % output after the limiter + Ef(excIdx(avrSt==-1),1)=VavrMin(avrSt==-1); + Ef(excIdx(avrSt== 1),1)=VavrMax(avrSt== 1); + Ef(excIdx(avrSt== 0),1)=Vavrf(avrSt==0,1); + +else + Vavrm=zeros(0,nlvl+1); + Vavrr=zeros(0,nlvl+1); + Vavrf=zeros(0,nlvl+1); + Vavrref=zeros(0,nlvl+1); +end +%------------------------------Initialization of Exciter------------------ +%------------------------------END------------------------------------ + + + + +%------------------------------Initialization of Turbing Governor------------------ +%------------------------------START------------------------------------ +if ~isempty(tg) + nTg = size(tg,1); + % Type 2 Turbing governor. + % one DE, one AE and one limiter + tgIdx = tg(:,1); + + wtgref = tg(:,3); + Rtg = tg(:,4); + Ttgmax = tg(:,5); + Ttgmin = tg(:,6); + Ttg2 = tg(:,7); + Ttg1 = tg(:,8); + + tgovg = zeros(nTg,nlvl+1); % tg + tgovm = zeros(nTg,nlvl+1); % Tmi* + Tmech = zeros(nTg,nlvl+1); % Tmi0 + + % zeroth value is given + tgovg(:,1)=real(tgovg0); + tgovm(:,1)=real(tgovm0); + Tmech(:,1)=real(tgovmech0); + + if ~isempty(Tmech1) + Tmech(:,2)=Tmech1; + end + + % check if limit is approached + tgovMaxDiff=tgovm(:,1)-Ttgmax; + tgovMinDiff=tgovm(:,1)-Ttgmin; + + govSt=zeros(nTg,1); + govSt(tgovMaxDiff>0)=1; + govSt(tgovMinDiff<0)=-1; + % if limit is approached, set Pm to constant value + Pm(tgIdx(govSt==0),1)=tgovm(govSt==0,1); + Pm(tgIdx(govSt==1),1)=Ttgmax(govSt==1,1); + Pm(tgIdx(govSt==-1),1)=Ttgmin(govSt==-1,1); +else + tgovg=zeros(0,nlvl+1); + tgovm=zeros(0,nlvl+1); + Tmech=zeros(0,nlvl+1); +end +%------------------------------Initialization of Turbing Governor------------------ +%------------------------------END------------------------------------ + +% this part i don't quite understand. It looks like f denotes frequency +% on every bus, is it relevant with frequency dependant load? +% now i find that this is for dynamics of agc +f=zeros(nbus,nlvl+1); +f(:,1)=f0; +synTag=zeros(nbus,1); +synTag(syn(:,1))=1:nSyn; +numSynOnBus=accumarray(syn(:,1),1,[nbus,1]); +dpgTag=ones(nbus,1); +for islIdx=1:nIslands + busIsland=find(islands==islIdx); + synTagIsland=synTag(busIsland); + wIsland=w(synTagIsland(synTagIsland~=0),1); + if ~isempty(wIsland) + f(busIsland,1)=mean(wIsland); % note that here the freq can be different + dpgTag(busIsland)=0; + end +end + +%AGC part +if ~isempty(agc) + agcExt=zeros(nbus,size(agc,2)); + agcExt(agc(:,1),:)=agc; + dpg=zeros(nbus,nlvl+1); + dpg(:,1)=dpg0; + fdk=agcExt(:,2)+agcExt(:,3); %1/R+D +else + dpg=zeros(nbus,nlvl+1); + fdk=zeros(nbus,1); +end + +% this is long term dynamic, it seems that not considered here +if ~isempty(cac)&&~isempty(cluster) + +else + qplt=zeros(0,nlvl+1); + vg=zeros(0,nlvl+1); +end + +% freq relevant part induced by AGC +FreqReal=sparse(1:nbus,1:nbus,-freqKeptTag.*fdk.*E0,nbus,nbus); +FreqImag=sparse(1:nbus,1:nbus,-freqKeptTag.*fdk.*F0,nbus,nbus); +Freq2freq=sparse([1:nbus,1:nbus],[1:nbus,frefs(islands)'],[ones(1,nbus),-ones(1,nbus)],nbus,nbus); + +Y11=-G;Y12=B;Y21=-B;Y22=-G; +% Influence to Origianl Power flow +YEF11=P0M+sparse(1:nbus,1:nbus,freqKeptTag.*(-fdk.*f0+dpg0),nbus,nbus);YEF12=-Q0M;YEF21=-Q0M;YEF22=-P0M-sparse(1:nbus,1:nbus,freqKeptTag.*(-fdk.*f0+dpg0),nbus,nbus); + +% Counting influence of ZIP load into Y matrix +if ~isempty(zip) + Y11=Y11-sparse(1:nbus,1:nbus,accumarray(zipIdx,LHS_MatZip(:,1),[nbus,1]),nbus,nbus); + Y12=Y12-sparse(1:nbus,1:nbus,accumarray(zipIdx,LHS_MatZip(:,2),[nbus,1]),nbus,nbus); + Y21=Y21-sparse(1:nbus,1:nbus,accumarray(zipIdx,LHS_MatZip(:,3),[nbus,1]),nbus,nbus); + Y22=Y22-sparse(1:nbus,1:nbus,accumarray(zipIdx,LHS_MatZip(:,4),[nbus,1]),nbus,nbus); +end +YLHS=[Y11,Y12;Y21,Y22]; + +% Counting influence of Motors into small Y matrix +if ~isempty(ind) + YLHS=YLHS-... + [sparse(1:nbus,1:nbus,LHS_MatInd_Bus_sqz(:,1),nbus,nbus),sparse(1:nbus,1:nbus,LHS_MatInd_Bus_sqz(:,3),nbus,nbus);... + sparse(1:nbus,1:nbus,LHS_MatInd_Bus_sqz(:,2),nbus,nbus),sparse(1:nbus,1:nbus,LHS_MatInd_Bus_sqz(:,4),nbus,nbus)]; +end + +% Counting influence of generators into small Y matrix +if ~isempty(syn) + YLHS=YLHS+MatGCD; +end + +idxNonSw=find(busType~=2); +idxNonSwxD=find(fswTagxD==0); +idxNonSwD=find(busType~=2&fswTagxD==1); + +% This is the left hand side matrix totally +LHS_mat=[YLHS([idxNonSw;idxNonSw+nbus],[idxNonSw;idxNonSw+nbus]),... + [YEF11(idxNonSw,idxNonSw),YEF12(idxNonSw,idxNonSw),-F0M(idxNonSw,ipv),FreqReal(idxNonSw,freqKeptTag==1);... + YEF21(idxNonSw,idxNonSw),YEF22(idxNonSw,idxNonSw),-E0M(idxNonSw,ipv),-FreqImag(idxNonSw,freqKeptTag==1)];... + C0M(ipv,idxNonSw),D0M(ipv,idxNonSw),sparse(npv,2*npq+3*npv+nFreqKept);... + E0M(idxNonSw,idxNonSw),-F0M(idxNonSw,idxNonSw),C0M(idxNonSw,idxNonSw),-D0M(idxNonSw,idxNonSw),sparse(npq+npv,npv+nFreqKept);... + F0M(idxNonSw,idxNonSw),E0M(idxNonSw,idxNonSw),D0M(idxNonSw,idxNonSw),C0M(idxNonSw,idxNonSw),sparse(npq+npv,npv+nFreqKept);... + sparse(sum(freqKeptTagxRef),size(idxNonSw,1)+size(idxNonSw,1)+2*npq+3*npv),Freq2freq(freqKeptTagxRef==1,freqKeptTag==1);... + sparse(size(idxNonSwD,1),size(idxNonSw,1)),sparse(1:size(idxNonSwD,1),idxNonSwD,ones(size(idxNonSwD,1),1),size(idxNonSwD,1),size(idxNonSw,1)),sparse(size(idxNonSwD,1),2*npq+3*npv+nFreqKept)]; + +% if nbus<=500 +% [L_LHS_mat,U_LHS_mat,p_LHS_mat]=lu(LHS_mat,'vector'); +% end + + +% deterine if we use LU factoration +% for this part, i assume the system algebrac equation is under a good +% dcondition number and the dimension is not very high, otherwise LU will +% be time consuming +useLU=isfield(SysPara,'iden')&&isfield(SysPara,'p_amd'); + +if useLU + if isempty(SysPara.p_amd) + p_amd = colamd (LHS_mat) ; + save([SysPara.iden,'.mat'],'p_amd'); + else + p_amd=SysPara.p_amd; + end + MxI = speye (size(LHS_mat)) ; + MxQ = MxI (:, p_amd) ; + if IS_OCTAVE + [MxL,MxU,MxP,MxQx] = lu (LHS_mat*MxQ) ; + else + [MxL,MxU,MxP] = lu (LHS_mat*MxQ) ; + end +end + + +%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%this is the recursive part for computing high order of time series%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +% strat interations nlvl: order of Taylor series +for i=1:nlvl + % seq2 provides two columns from 0 to i, and i to 0 + % seq2p provides two columns from 0 to i+1, and i+1 to 0 + % seq3 provides 3 columns, the summary of each row is equal to i(binominal coefficients) + seq2=getseq(i,2); + seq2p=getseq(i+1,2); + seq3=getseq(i,3); + idxSeq2=sum(seq2==i,2); + idxSeq2x=sum(seq2(:,2)==i,2); + idxSeq2p=sum(seq2p>=i,2); + idxSeq3=sum(seq3==i,2); + idxSeq3x=sum(seq3(:,[2,3])==i,2); + + % seq2R is usually used in constructing algebric equations + % seq2R provides two columns from 1 to i-1, and i-1 to 1 + % seq2x provides two columns from 1 to i, and i-1 to 0 + % seq2m provides two columns from 0 to i-1, and i-1 to 0 + % seq2mm provides two columns from 0 to i-2, and i-2 to 0 + seq2R=seq2(idxSeq2==0,:); + seq2x=seq2(idxSeq2x==0,:); + seq2m=getseq(i-1,2); + seq2mm=getseq(i-2,2); + + RHSILr=zeros(nbus,1); + RHSILi=zeros(nbus,1); + + % This part is for induction motor + if ~isempty(ind) + % package right hand side vector at every iteration + rhsM=sum(Vm(:,seq2R(:,1)+1).*s(:,seq2R(:,2)+1),2)-1j*X2.*sum(IR(:,seq2R(:,1)+1).*s(:,seq2R(:,2)+1),2); + % rhsI=-real(sum(IR(:,seq2R(:,1)+1).*conj(IR(:,seq2R(:,2)+1)),2))+... + % (T1.*sum(s(:,seq2R(:,1)+1).*s(:,seq2R(:,2)+1),2)+T2.*sum(s(:,seq3R(:,1)+1).*s(:,seq3R(:,2)+1).*s(:,seq3R(:,3)+1),2))./R2+... + % (T0.*s(:,i)+T1.*sum(s(:,seq2m(:,1)+1).*s(:,seq2m(:,2)+1),2)+T2.*sum(s(:,seq3m(:,1)+1).*s(:,seq3m(:,2)+1).*s(:,seq3m(:,3)+1),2)).*Rm./R2; + + % s(:,i+1)=(Rind0.*(T0.*s(:,i)+T1.*sum(s(:,seq2m(:,1)+1).*s(:,seq2m(:,2)+1),2)+T2.*sum(s(:,seq3m(:,1)+1).*s(:,seq3m(:,2)+1).*s(:,seq3m(:,3)+1),2))... + % -real(sum(IR(:,seq2m(:,1)+1).*conj(IR(:,seq2m(:,2)+1)),2)).*R2-2*Hm.*sum(repmat(seq2R(:,1)',nInd,1).*s(:,seq2R(:,1)+1).*s(:,seq2R(:,2)+1),2))... + % ./(2*Hm.*s(:,1)*i); + % if i>=2 + % s(:,i+1)=s(:,i+1)+... + % Rind1.*(T0.*s(:,i-1)+T1.*sum(s(:,seq2mm(:,1)+1).*s(:,seq2mm(:,2)+1),2)+T2.*sum(s(:,seq3mm(:,1)+1).*s(:,seq3mm(:,2)+1).*s(:,seq3mm(:,3)+1),2))... + % ./(2*Hm.*s(:,1)*i); + % end + + % update the high order of slip, a special setting is required for + % low order when i<2 + s(:,i+1)=(Rind0.*(T1.*s(:,i)+T2.*sum(s(:,seq2m(:,1)+1).*s(:,seq2m(:,2)+1),2))-real(sum(Vm(:,seq2m(:,1)+1).*conj(IR(:,seq2m(:,2)+1)),2)))./(2*Hm*i); + if i>=2 + s(:,i+1)=s(:,i+1)+... + Rind1.*(T1.*s(:,i-1)+T2.*sum(s(:,seq2mm(:,1)+1).*s(:,seq2mm(:,2)+1),2))... + ./(2*Hm*i); + end + if i==1 + s(:,i+1)=s(:,i+1)+Rind0.*T0./(2*Hm*i); + end + if i==2 + s(:,i+1)=s(:,i+1)+Rind1.*T0./(2*Hm*i); + end + % for dynamic model, Right hand side vector is required a update + addenRhs=Vm(:,1).*s(:,i+1)-1j*X2.*IR(:,1).*s(:,i+1); + + % rhsBus=zeros(2,nInd); + % for j=1:nInd + % rhsBus(:,j)=RHS_C_Shr{j}*[real(rhsM(j)+addenRhs(j));imag(rhsM(j)+addenRhs(j));0;0]; + % end + + % count the influence of dynamic of slip into rigt hand side vector + tempRhsInd=rhsM+addenRhs; + rhsBus=[RHS_C_Shr_sqz(:,1).*real(tempRhsInd)+RHS_C_Shr_sqz(:,3).*imag(tempRhsInd),RHS_C_Shr_sqz(:,2).*real(tempRhsInd)+RHS_C_Shr_sqz(:,4).*imag(tempRhsInd)]'; + + %accumulate currents IL + RHSILr=accumarray(indIdx,rhsBus(1,:)',[nbus,1]); + RHSILi=accumarray(indIdx,rhsBus(2,:)',[nbus,1]); + + % rhsBus=zeros(5,nInd); + % rhsM=sum(Vm(:,seq2R(:,1)+1).*s(:,seq2R(:,2)+1),2)-1j*X2.*sum(IR(:,seq2R(:,1)+1).*s(:,seq2R(:,2)+1),2); + % rhsImod=Rind1.*(T1.*s(:,i)+T2.*sum(s(:,seq2m(:,1)+1).*s(:,seq2m(:,2)+1),2))+Rind0.*T2.*sum(s(:,seq2R(:,1)+1).*s(:,seq2R(:,2)+1),2)-... + % real(sum(V(indIdx,seq2R(:,1)+1).*conj(IR(:,seq2R(:,2)+1)),2))+... + % real(sum(IL(:,seq2R(:,1)+1).*conj(IR(:,seq2R(:,2)+1)),2).*Z1); + % if i==1 + % rhsImod=rhsImod+Rind1.*T0; + % end + % rhsIL=V(indIdx,i).*Yeind1-IL(:,i).*Ye1ind1; + % for j=1:nInd + % rhsBus(:,j)=squeeze(RHS_C_Shr(j,:,:))*[real(rhsM(j));imag(rhsM(j));rhsImod(j);real(rhsIL(j));imag(rhsIL(j))]; + % end + % RHSILr=accumarray(indIdx,rhsBus(3,:)',[nbus,1]); + % RHSILi=accumarray(indIdx,rhsBus(4,:)',[nbus,1]); + end + + % strat update ZIP load into currents + RHSIiLr=zeros(nbus,1); + RHSIiLi=zeros(nbus,1); + if ~isempty(zip) + RHS_BZip=(real(sum(V(zipIdx,seq2R(:,1)+1).*conj(V(zipIdx,seq2R(:,2)+1)),2))-sum(BiL(:,seq2R(:,1)+1).*BiL(:,seq2R(:,2)+1),2))./Bi0/2; + RHZ_BIConv=sum(IiL(:,seq2R(:,1)+1).*BiL(:,seq2R(:,2)+1),2); + RHSILr_full=Rzip1.*(JI.*real(V(zipIdx,i))-KI.*imag(V(zipIdx,i)))./Bi0-real(RHZ_BIConv)./Bi0-Ji0L.*RHS_BZip./Bi0; + RHSILi_full=Rzip1.*(KI.*real(V(zipIdx,i))+JI.*imag(V(zipIdx,i)))./Bi0-imag(RHZ_BIConv)./Bi0-Ki0L.*RHS_BZip./Bi0; + RHSIiLr=accumarray(zipIdx,RHSILr_full,[nbus,1]); + RHSIiLi=accumarray(zipIdx,RHSILi_full,[nbus,1]); + end + + % Start uodate generators + RHSIGr=zeros(nbus,1); + RHSIGi=zeros(nbus,1); + if ~isempty(syn) + RhsEd=zeros(nSyn,1); + RhsEq=zeros(nSyn,1); + IGdAdd=zeros(nSyn,1); + IGqAdd=zeros(nSyn,1); + % select different models for generators + if modelTag(8)>0 + d(modSyn==8,i+1)=(wgb(modSyn==8).*w(modSyn==8,i))/i; + w(modSyn==8,i+1)=(Pm(modSyn==8,i)-... + (sum(psid(modSyn==8,seq2m(:,1)+1).*IGq(modSyn==8,seq2m(:,2)+1),2)-sum(psiq(modSyn==8,seq2m(:,1)+1).*IGd(modSyn==8,seq2m(:,2)+1),2))-... + Dg(modSyn==8).*w(modSyn==8,i))./Mg(modSyn==8)/i; + psid(modSyn==8,i+1)=wgb(modSyn==8).*(Rga(modSyn==8).*IGd(modSyn==8,i)+psiq(modSyn==8,i)+VGd(modSyn==8,i))/i; + psiq(modSyn==8,i+1)=wgb(modSyn==8).*(Rga(modSyn==8).*IGq(modSyn==8,i)-psid(modSyn==8,i)+VGq(modSyn==8,i))/i; + eq1(modSyn==8,i+1)=(-eq1(modSyn==8,i)-(Xgd(modSyn==8)-Xgd1(modSyn==8)-gammad(modSyn==8)).*IGd(modSyn==8,i)+(1-TgAA(modSyn==8)./Tgd1(modSyn==8)).*Ef(modSyn==8,i))./Tgd1(modSyn==8)/i; + ed1(modSyn==8,i+1)=(-ed1(modSyn==8,i)+(Xgq(modSyn==8)-Xgq1(modSyn==8)-gammaq(modSyn==8)).*IGq(modSyn==8,i))./Tgq1(modSyn==8)/i; + eq2(modSyn==8,i+1)=(-eq2(modSyn==8,i)+eq1(modSyn==8,i)-(Xgd1(modSyn==8)-Xgd2(modSyn==8)+gammad(modSyn==8)).*IGd(modSyn==8,i)+TgAA(modSyn==8)./Tgd1(modSyn==8).*Ef(modSyn==8,i))./Tgd2(modSyn==8)/i; + ed2(modSyn==8,i+1)=(-ed2(modSyn==8,i)+ed1(modSyn==8,i)+(Xgq1(modSyn==8)-Xgq2(modSyn==8)+gammaq(modSyn==8)).*IGq(modSyn==8,i))./Tgq2(modSyn==8)/i; + IGdAdd(modSyn==8)=(eq2(modSyn==8,i+1)-psid(modSyn==8,i+1))./Xgd2(modSyn==8); + IGqAdd(modSyn==8)=(-ed2(modSyn==8,i+1)-psiq(modSyn==8,i+1))./Xgq2(modSyn==8); + end + if modelTag(6)>0 + d(modSyn==6,i+1)=(wgb(modSyn==6).*w(modSyn==6,i))/i; + w(modSyn==6,i+1)=(Pm(modSyn==6,i)-... + (sum(VGq(modSyn==6,seq2m(:,1)+1).*IGq(modSyn==6,seq2m(:,2)+1),2)+sum(VGd(modSyn==6,seq2m(:,1)+1).*IGd(modSyn==6,seq2m(:,2)+1),2)+... + Rga(modSyn==6).*(sum(IGq(modSyn==6,seq2m(:,1)+1).*IGq(modSyn==6,seq2m(:,2)+1),2)+sum(IGd(modSyn==6,seq2m(:,1)+1).*IGd(modSyn==6,seq2m(:,2)+1),2)))-... + Dg(modSyn==6).*w(modSyn==6,i))./Mg(modSyn==6)/i; + eq1(modSyn==6,i+1)=(-eq1(modSyn==6,i)-(Xgd(modSyn==6)-Xgd1(modSyn==6)-gammad(modSyn==6)).*IGd(modSyn==6,i)+(1-TgAA(modSyn==6)./Tgd1(modSyn==6)).*Ef(modSyn==6,i))./Tgd1(modSyn==6)/i; + ed1(modSyn==6,i+1)=(-ed1(modSyn==6,i)+(Xgq(modSyn==6)-Xgq1(modSyn==6)-gammaq(modSyn==6)).*IGq(modSyn==6,i))./Tgq1(modSyn==6)/i; + eq2(modSyn==6,i+1)=(-eq2(modSyn==6,i)+eq1(modSyn==6,i)-(Xgd1(modSyn==6)-Xgd2(modSyn==6)+gammad(modSyn==6)).*IGd(modSyn==6,i)+TgAA(modSyn==6)./Tgd1(modSyn==6).*Ef(modSyn==6,i))./Tgd2(modSyn==6)/i; + ed2(modSyn==6,i+1)=(-ed2(modSyn==6,i)+ed1(modSyn==6,i)+(Xgq1(modSyn==6)-Xgq2(modSyn==6)+gammaq(modSyn==6)).*IGq(modSyn==6,i))./Tgq2(modSyn==6)/i; + RhsEd(modSyn==6)=ed2(modSyn==6,i+1); + RhsEq(modSyn==6)=eq2(modSyn==6,i+1); + end + if modelTag(5)>0 + d(modSyn==5,i+1)=(wgb(modSyn==5).*w(modSyn==5,i))/i; + w(modSyn==5,i+1)=(Pm(modSyn==5,i)-... + (sum(VGq(modSyn==5,seq2m(:,1)+1).*IGq(modSyn==5,seq2m(:,2)+1),2)+sum(VGd(modSyn==5,seq2m(:,1)+1).*IGd(modSyn==5,seq2m(:,2)+1),2)+... + Rga(modSyn==5).*(sum(IGq(modSyn==5,seq2m(:,1)+1).*IGq(modSyn==5,seq2m(:,2)+1),2)+sum(IGd(modSyn==5,seq2m(:,1)+1).*IGd(modSyn==5,seq2m(:,2)+1),2)))-... + Dg(modSyn==5).*w(modSyn==5,i))./Mg(modSyn==5)/i; + eq1(modSyn==5,i+1)=(-eq1(modSyn==5,i)-(Xgd(modSyn==5)-Xgd1(modSyn==5)-gammad(modSyn==5)).*IGd(modSyn==5,i)+(1-TgAA(modSyn==5)./Tgd1(modSyn==5)).*Ef(modSyn==5,i))./Tgd1(modSyn==5)/i; + eq2(modSyn==5,i+1)=(-eq2(modSyn==5,i)+eq1(modSyn==5,i)-(Xgd1(modSyn==5)-Xgd2(modSyn==5)+gammad(modSyn==5)).*IGd(modSyn==5,i)+TgAA(modSyn==5)./Tgd1(modSyn==5).*Ef(modSyn==5,i))./Tgd2(modSyn==5)/i; + ed2(modSyn==5,i+1)=(-ed2(modSyn==5,i)+(Xgq(modSyn==5)-Xgq2(modSyn==5)).*IGq(modSyn==5,i))./Tgq2(modSyn==5)/i; + RhsEd(modSyn==5)=ed2(modSyn==5,i+1); + RhsEq(modSyn==5)=eq2(modSyn==5,i+1); + end + if modelTag(4)>0 + d(modSyn==4,i+1)=(wgb(modSyn==4).*w(modSyn==4,i))/i; + w(modSyn==4,i+1)=(Pm(modSyn==4,i)-... + (sum(VGq(modSyn==4,seq2m(:,1)+1).*IGq(modSyn==4,seq2m(:,2)+1),2)+sum(VGd(modSyn==4,seq2m(:,1)+1).*IGd(modSyn==4,seq2m(:,2)+1),2)+... + Rga(modSyn==4).*(sum(IGq(modSyn==4,seq2m(:,1)+1).*IGq(modSyn==4,seq2m(:,2)+1),2)+sum(IGd(modSyn==4,seq2m(:,1)+1).*IGd(modSyn==4,seq2m(:,2)+1),2)))-... + Dg(modSyn==4).*w(modSyn==4,i))./Mg(modSyn==4)/i; + eq1(modSyn==4,i+1)=(-eq1(modSyn==4,i)-(Xgd(modSyn==4)-Xgd1(modSyn==4)).*IGd(modSyn==4,i)+Ef(modSyn==4,i))./Tgd1(modSyn==4)/i; + ed1(modSyn==4,i+1)=(-ed1(modSyn==4,i)+(Xgq(modSyn==4)-Xgq1(modSyn==4)).*IGq(modSyn==4,i))./Tgq1(modSyn==4)/i; + RhsEd(modSyn==4)=ed1(modSyn==4,i+1); + RhsEq(modSyn==4)=eq1(modSyn==4,i+1); + end + if modelTag(3)>0 + d(modSyn==3,i+1)=(wgb(modSyn==3).*w(modSyn==3,i))/i; + w(modSyn==3,i+1)=(Pm(modSyn==3,i)-... + (sum(VGq(modSyn==3,seq2m(:,1)+1).*IGq(modSyn==3,seq2m(:,2)+1),2)+sum(VGd(modSyn==3,seq2m(:,1)+1).*IGd(modSyn==3,seq2m(:,2)+1),2)+... + Rga(modSyn==3).*(sum(IGq(modSyn==3,seq2m(:,1)+1).*IGq(modSyn==3,seq2m(:,2)+1),2)+sum(IGd(modSyn==3,seq2m(:,1)+1).*IGd(modSyn==3,seq2m(:,2)+1),2)))-... + Dg(modSyn==3).*w(modSyn==3,i))./Mg(modSyn==3)/i; + eq1(modSyn==3,i+1)=(-eq1(modSyn==3,i)-(Xgd(modSyn==3)-Xgd1(modSyn==3)).*IGd(modSyn==3,i)+Ef(modSyn==3,i))./Tgd1(modSyn==3)/i; + RhsEd(modSyn==3)=0; + RhsEq(modSyn==3)=eq1(modSyn==3,i+1); + end + if modelTag(2)>0 + d(modSyn==2,i+1)=(wgb(modSyn==2).*w(modSyn==2,i))/i; + w(modSyn==2,i+1)=(Pm(modSyn==2,i)-... + (sum(VGq(modSyn==2,seq2m(:,1)+1).*IGq(modSyn==2,seq2m(:,2)+1),2)+sum(VGd(modSyn==2,seq2m(:,1)+1).*IGd(modSyn==2,seq2m(:,2)+1),2)+... + Rga(modSyn==2).*(sum(IGq(modSyn==2,seq2m(:,1)+1).*IGq(modSyn==2,seq2m(:,2)+1),2)+sum(IGd(modSyn==2,seq2m(:,1)+1).*IGd(modSyn==2,seq2m(:,2)+1),2)))-... + Dg(modSyn==2).*w(modSyn==2,i))./Mg(modSyn==2)/i; + RhsEd(modSyn==2)=0; + RhsEq(modSyn==2)=eq1(modSyn==2,i+1); + end + + % + %DTsin(:,i+1) = 1/(i)*sum(repmat([i:-1:1],GLO_NDOF,1).*DTcos(:,1:i).*DTdta(:,k+2:-1:2),2); + %DTcos(:,i+1) =-1/(i)*sum(repmat([i:-1:1],GLO_NDOF,1).*DTsin(:,1:i).*DTdta(:,k+2:-1:2),2); + + %Sd(:,i+1) = 1/(i)*sum(repmat([i:-1:1],nSyn,1).*Cd(:,1:i).*d(:,i+1:-1:2),2); + %Cd(:,i+1) =-1/(i)*sum(repmat([i:-1:1],nSyn,1).*Sd(:,1:i).*d(:,i+1:-1:2),2); + + % this part may be different from DT + AG0=cosp(:,2).*d(:,i+1); + BG0=sinp(:,2).*d(:,i+1); + % here multi-convolution is utilized as sine function is + % approxiamted as a taylor series of delta + if taylorN>=2 + AG0=AG0+cosp(:,3).*sum(d(:,seq2(:,1)+1).*d(:,seq2(:,2)+1),2); + BG0=BG0+sinp(:,3).*sum(d(:,seq2(:,1)+1).*d(:,seq2(:,2)+1),2); + end + if taylorN>=3 + AG0=AG0+cosp(:,4).*sum(d(:,seq3(:,1)+1).*d(:,seq3(:,2)+1).*d(:,seq3(:,3)+1),2); + BG0=BG0+sinp(:,4).*sum(d(:,seq3(:,1)+1).*d(:,seq3(:,2)+1).*d(:,seq3(:,3)+1),2); + end + if taylorN>=4 + seq4=getseq(i,4); + AG0=AG0+cosp(:,5).*sum(d(:,seq4(:,1)+1).*d(:,seq4(:,2)+1).*d(:,seq4(:,3)+1).*d(:,seq4(:,4)+1),2); + BG0=BG0+sinp(:,5).*sum(d(:,seq4(:,1)+1).*d(:,seq4(:,2)+1).*d(:,seq4(:,3)+1).*d(:,seq4(:,4)+1),2); + end + + % high order coefficients of cos(delta) and sin(delta) + Cd(:,i+1)=AG0; + Sd(:,i+1)=BG0; + + VGdCr=sum(Cd(:,seq2x(:,1)+1).*VGd(:,seq2x(:,2)+1),2);% Vd*cosdta + VGqCr=sum(Cd(:,seq2x(:,1)+1).*VGq(:,seq2x(:,2)+1),2);% Vq*cosdta + VGdSr=sum(Sd(:,seq2x(:,1)+1).*VGd(:,seq2x(:,2)+1),2);% Vd*sindta + VGqSr=sum(Sd(:,seq2x(:,1)+1).*VGq(:,seq2x(:,2)+1),2);% Vq*sindta + JCr=sum(Cd(:,seq2x(:,1)+1).*JG(:,seq2x(:,2)+1),2);% similar, for currents + KCr=sum(Cd(:,seq2x(:,1)+1).*KG(:,seq2x(:,2)+1),2); + JSr=sum(Sd(:,seq2x(:,1)+1).*JG(:,seq2x(:,2)+1),2); + KSr=sum(Sd(:,seq2x(:,1)+1).*KG(:,seq2x(:,2)+1),2); + + RHSIGxr=-(MatsRs(:,1).*(-VGdSr-VGqCr)+MatsRs(:,2).*(VGdCr-VGqSr))+... + (MatsR(:,1).*RhsEd+MatsR(:,2).*RhsEq)-(Mats(:,1).*(JSr-KCr)+Mats(:,2).*(JCr+KSr))+(Mats(:,1).*IGdAdd+Mats(:,2).*IGqAdd); + RHSIGxi=-(MatsRs(:,3).*(-VGdSr-VGqCr)+MatsRs(:,4).*(VGdCr-VGqSr))+... + (MatsR(:,3).*RhsEd+MatsR(:,4).*RhsEq)-(Mats(:,3).*(JSr-KCr)+Mats(:,4).*(JCr+KSr))+(Mats(:,3).*IGdAdd+Mats(:,4).*IGqAdd); + % current injections from generators IG + RHSIGr=accumarray(synIdx,RHSIGxr,[nbus,1]); + RHSIGi=accumarray(synIdx,RHSIGxi,[nbus,1]); + end + % update exciter, 3 state variables + if ~isempty(exc) + Vavrm(:,i+1)=(Vmag(synIdx(excIdx),i)-Vavrm(:,i))./Tavrr/i; + Vavrr(:,i+1)=(muavr0.*(1-Tavr1./Tavr2).*(Vavrref(:,i)-Vavrm(:,i))-Vavrr(:,i))./Tavr2/i; + Vavrf(:,i+1)=((vavrf0.*Vmag(synIdx(excIdx),i)+... + sum(Vavrr(:,seq2m(:,1)+1).*Vmag(synIdx(excIdx),seq2m(:,2)+1),2)+... + muavr0.*Tavr1./Tavr2.*sum((Vavrref(:,seq2m(:,1)+1)-Vavrm(:,seq2m(:,1)+1)).*Vmag(synIdx(excIdx),seq2m(:,2)+1),2))./Vavr0-Vavrf(:,i))./Tavre/i; + Ef(excIdx(avrSt==-1),i+1)=0; + Ef(excIdx(avrSt== 1),i+1)=0; + Ef(excIdx(avrSt== 0),i+1)=Vavrf(avrSt==0,i+1); + end + + % update agc, one state variables + if ~isempty(agc) + dpg(:,i+1)=-f(:,i).*agcExt(:,4)/i; + for islIdx=1:nIslands + busIsland=find(islands==islIdx); + synTagIsland=synTag(busIsland); + wIsland=w(synTagIsland(synTagIsland~=0),i+1); + if ~isempty(wIsland) + f(busIsland,i+1)=mean(wIsland); % note that here the freq can be different + end + end % TODO: steady-state model + + % update generator participation part from agc + if ~isempty(syn) %dynamic model (synchronous generators) + if ~isempty(tg) + Tmech(:,i+1)=Tmech(:,i+1)+dpg(syn(tg(:,1),1),i+1)./numSynOnBus(syn(tg(:,1),1)); + end + Pm(:,i+1)=Pm(:,i+1)+dpg(syn(:,1),i+1)./numSynOnBus(syn(:,1)); + end + end + % update Turbine, 2 state variables + if ~isempty(tg) + tgovg(:,i+1)=(-(1-Ttg1./Ttg2).*w(tgIdx,i)./Rtg-tgovg(:,i))./Ttg2/i; + tgovm(:,i+1)=tgovg(:,i+1)-Ttg1./Ttg2.*w(tgIdx,i+1)./Rtg+Tmech(:,i+1); + + Pm(tgIdx(govSt==0),i+1)=tgovm(govSt==0,i+1); + Pm(tgIdx(govSt==1),i+1)=0; + Pm(tgIdx(govSt==-1),i+1)=0; + end + + % HEM Body + RHS1=sum((-P(:,seq2(:,1)+1)+1j*(Q(:,seq2(:,1)+1)+Qxtra(:,seq2(:,1)+1))).*conj(W(:,seq2(:,2)+1)),2)+... + freqKeptTag.*sum(-dpg(:,seq2(:,1)+1).*conj(W(:,seq2(:,2)+1)),2)+... + freqKeptTag.*fdk.*sum(f(:,seq2R(:,1)+1).*conj(W(:,seq2R(:,2)+1)),2)+Ysh1.*V(:,i)+Ytr1*V(:,i); + RHS2=-0.5*real(sum(V(:,seq2R(:,1)+1).*conj(V(:,seq2R(:,2)+1)),2)); + RHS3=sum(-W(:,seq2R(:,1)+1).*V(:,seq2R(:,2)+1),2); + + + if i==1 + RHS2=RHS2+0.5*VspSq2(:,2); + end + + compactRHS1=RHS1(busType~=2); + compactRHS1=compactRHS1+Y(busType~=2,isw)*real(V(isw,i+1)); + % combine all current injection involing Motor, zip load, and Generators + RHS=[real(compactRHS1)+RHSILr(busType~=2)+RHSIiLr(busType~=2)-RHSIGr(busType~=2);... + imag(compactRHS1)+RHSILi(busType~=2)+RHSIiLi(busType~=2)-RHSIGi(busType~=2);... + RHS2(ipv);... + real(RHS3(busType~=2));... + imag(RHS3(busType~=2));... + zeros(sum(freqKeptTagxRef),1);... + zeros(size(idxNonSwD,1),1)]; + % solve AE, notice that every time we need to solve Ax(k) =b(k), which + % means that A in invariant for every order. so we only need to rebulid + % b every iteration + if useLU + if IS_OCTAVE + x = real(MxQ * MxQx* (MxU \ (MxL \ (MxP * RHS)))) ; + else + x =real( MxQ * (MxU \ (MxL \ (MxP * RHS)))) ; + end + else + x=real(LHS_mat\RHS); + end + + % x= [V;W;Q_pv;f] + xC=real(V(:,i+1)); + xD=imag(V(:,i+1)); + xC(idxNonSw)=x(1:(npq+npv)); + xD(idxNonSw)=x(((npq+npv)+1):(2*(npq+npv))); + V(:,i+1)=xC+1j*xD; + W(busType~=2,i+1)=x((2*(npq+npv)+1):(3*(npq+npv)))+... + 1j*x((3*(npq+npv)+1):(4*(npq+npv))); + Q(ipv,i+1)=x((4*(npq+npv)+1):(4*(npq+npv)+npv)); + f(freqKeptTag==1,i+1)=x((4*(npq+npv)+npv+1):end); + + Vmag(:,i+1)=(sum(V(:,seq2(:,1)+1).*conj(V(:,seq2(:,2)+1)),2)-sum(Vmag(:,seq2R(:,1)+1).*Vmag(:,seq2R(:,2)+1),2))./Vmag(:,1)/2; % Calculate voltage magnitude + + % now update the Algebric variables for motors:IL,IR,VM + if ~isempty(ind) + % for j=1:nInd + % tempIL=squeeze(LHS_MatInd_Shr(j,:,:))*[real(V(indIdx(j),i+1));imag(V(indIdx(j),i+1))]+rhsBus(:,j); + % tempIRs=-LHS_MatInd_Shr2{j}*[tempIL;real(V(indIdx(j),i+1));imag(V(indIdx(j),i+1))]; + % IL(j,i+1)=tempIL(1)+1j*tempIL(2); + % IR(j,i+1)=tempIRs(1)+1j*tempIRs(2); + % Vm(j,i+1)=V(indIdx(j),i+1)-IL(j,i+1)*Z1(j); + % end + tempILvr=LHS_MatInd_Shr_sqz(:,1).*real(V(indIdx,i+1))+LHS_MatInd_Shr_sqz(:,3).*imag(V(indIdx,i+1))+rhsBus(1,:)'; + tempILvi=LHS_MatInd_Shr_sqz(:,2).*real(V(indIdx,i+1))+LHS_MatInd_Shr_sqz(:,4).*imag(V(indIdx,i+1))+rhsBus(2,:)'; + tempIRsvr=-sum(LHS_MatInd_Shr2_sqz(:,[1,3,5,7]).*[tempILvr,tempILvi,real(V(indIdx,i+1)),imag(V(indIdx,i+1))],2); + tempIRsvi=-sum(LHS_MatInd_Shr2_sqz(:,[2,4,6,8]).*[tempILvr,tempILvi,real(V(indIdx,i+1)),imag(V(indIdx,i+1))],2); + IL(:,i+1)=tempILvr+1j*tempILvi; + IR(:,i+1)=tempIRsvr+1j*tempIRsvi; + Vm(:,i+1)=V(indIdx,i+1)-IL(:,i+1).*Z1; + end + + % now update the Algebric variables for ZIP loads + if ~isempty(zip) + IiL(:,i+1)=(LHS_MatZip(:,1)+1j*LHS_MatZip(:,3)).*real(V(zipIdx,i+1))+(LHS_MatZip(:,2)+1j*LHS_MatZip(:,4)).*imag(V(zipIdx,i+1))+(RHSILr_full+1j*RHSILi_full); + BiL(:,i+1)=Mat_BZip(:,1).*real(V(zipIdx,i+1))+Mat_BZip(:,2).*imag(V(zipIdx,i+1))+RHS_BZip; + end + + % now update the Algebric variables for Generators: Vd,Vq, Id, Iq + if ~isempty(syn) + JG(:,i+1)=-MatsRs(:,1).*real(V(synIdx,i+1))-MatsRs(:,2).*imag(V(synIdx,i+1))+RHSIGxr; + KG(:,i+1)=-MatsRs(:,3).*real(V(synIdx,i+1))-MatsRs(:,4).*imag(V(synIdx,i+1))+RHSIGxi; + IGd(:,i+1)=JSr-KCr+sind.*JG(:,i+1)-cosd.*KG(:,i+1); + IGq(:,i+1)=JCr+KSr+cosd.*JG(:,i+1)+sind.*KG(:,i+1); + tempVGC=real(V(synIdx,i+1))-VGdSr-VGqCr; + tempVGD=imag(V(synIdx,i+1))+VGdCr-VGqSr; + VGd(:,i+1)=sind.*tempVGC-cosd.*tempVGD; + VGq(:,i+1)=cosd.*tempVGC+sind.*tempVGD; + end +end + +% Output value: coefficients for every order. +Q=real(Q); +s=real(s); +d=real(d); +w=real(w); +eq1=real(eq1); +eq2=real(eq2); +ed1=real(ed1); +ed2=real(ed2); +psid=real(psid); +psiq=real(psiq); +Pm=real(Pm); +Ef=real(Ef); +Vavrm=real(Vavrm); +Vavrr=real(Vavrr); +Vavrf=real(Vavrf); +Vavrref=real(Vavrref); +tgovg=real(tgovg); +tgovm=real(tgovm); +Tmech=real(Tmech); +f=real(f); +dpg=real(dpg); +qplt=real(qplt); +vg=real(vg); + +if ~isempty(exc) + avr={Vavrm,Vavrr,Vavrf}; +end + +if ~isempty(tg) + gov={tgovg,tgovm}; +end +end \ No newline at end of file diff --git a/internal/VSOO.m b/internal/VSOO.m new file mode 100644 index 0000000..61da7e7 --- /dev/null +++ b/internal/VSOO.m @@ -0,0 +1,143 @@ +function [outputArg1,outputArg2,outputArg3] = VSOO(LTE,LTE2,LTE3,SimData,h,ratio_b4) +%UNTITLED5 Summary of this function goes here +% Detailed explanation goes here + tol = 10^-4; + theta_max = 2; + Kmax = 30; + Kmin = 10; + p = 1; + fac1 = 1; + fac2 = 1; + hmax = SimData.maxAlpha; + hmin = 1*SimData.dAlpha; + + + + + K = SimData.nlvl; + ratio = LTE/h; + K_I = 0.03/K; + K_p = 0.04/K; + pf1 = 1; + pf2 = 0; + pf3 = 0; + if isnan(ratio_b4) + else + theta = ((tol/ratio)^(K_I))*((ratio_b4/ratio)^(K_p)); + Lin = (pf1*(K+p)^2+pf2*(K+p)+pf3)/(pf1*(K)^2+pf2*(K)+pf3); + Lde = (pf1*(K-p)^2+pf2*(K-p)+pf3)/(pf1*(K)^2+pf2*(K)+pf3); + + + trc_in =(LTE2)/(1-LTE2^((K+p))); + trc_de= (LTE3)/(1-LTE3^((K-p))); + + tol_in = tol; + tol_de = tol; + + theta_in =0.9*(h*tol_in/trc_in)^(1/(K+p)); + theta_de =0.9*(h*tol_de/trc_de)^(1/(K-p)); + + + if theta> theta_max + h_can = theta_max*h; + else + h_can = theta*h; + end + + + if h_can > hmax + h_can = hmax; + + elseif h < hmin + h_can = hmin; + + end + + if theta_in> theta_max + theta_in = theta_max; + end + if theta_de> theta_max + theta_de = theta_max; + end + + + + if h*theta_in > hmax + h_inp = hmax; + + elseif h*theta_in < hmin + h_inp = hmin; + else + + h_inp = h*theta_in; + end + + + if h*theta_de > hmax + h_dep = hmax; + + elseif h*theta_de < hmin + h_dep = hmin; + else + h_dep = h*theta_de; + end + + + if (Lde=K)))&&((h>= h_can||(h==hmax&&KK(1,ite+1)<=K))&&Lin = h_can||(h_can==hmax))&&Lin theta_max + h = theta_max*h; + else + h = theta*h; + end + + + end + + if h > hmax; h = hmax; end + if h < hmin; h = hmin; end + if K > Kmax; K = Kmax; end + if K < Kmin; K = Kmin; end +% ratio_b4 = ratio; + +outputArg1 = K; +outputArg2 = h; +outputArg3 = ratio; +end + diff --git a/internal/dtmMachinePFSalientcontinueDyn.m b/internal/dtmMachinePFSalientcontinueDyn.m new file mode 100644 index 0000000..99fcd2d --- /dev/null +++ b/internal/dtmMachinePFSalientcontinueDyn.m @@ -0,0 +1,1228 @@ +function [V,Q,s,d,w,eq1,eq2,ed1,ed2,psid,psiq,Pm,Ef,Vavrm,Vavrr,Vavrf,Vavrref,tgovg,tgovm,Tmech,f,dpg,qplt,vg]=... + dtmMachinePFSalientcontinueDyn(SimData,SysData,SysPara,x0) +% Core HE algorithm for solving DAEs (dynamic simulation) +% +% FUNCTION hemMachinePFSalientcontinueDyn +% +% 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 +% x0 - Initial system state +% +% OUTPUT - (will be consolidated in a future version) +% +% TODO % Modify the output arguments +% + +global IS_OCTAVE; + + + +% import system data khuang, 8 Jul +[bus,sw,pv,pq,shunt,line,ind,zip,syn,exc,tg,agc,cac,cluster]=unfoldSysData(SysData); +% nbus:Total number of buses khuang, 8 Jul +nbus=size(bus,1); +nline=size(line,1); + +%determine islanding, this is for AGC part khuang 8 JUl +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 + +% improt initial condition of state variables khuang 8 JUl +[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(x0,SysData); +% import simualtion data khuang 8 JUl +[~,~,~,nlvl,taylorN,~,~,~,~]=unfoldSimData(SimData); +% import system parameters khuang 8 JUl +[pqIncr,pvIncr,Rind0,Rind1,Reind0,Reind1,Rzip0,Rzip1,Ytr0,Ytr1,Ysh0,Ysh1,VspSq2,~,~,~,~,Tmech1,Varref1,Ef1,Pm1,Eq11]=unfoldSysPara(SysPara); +% + +% PQ incremental is given for every pq bus. +% need to figure how to utilize them, now i suppose this part is for CPF +% problem khuang 8 JUL +Pls=zeros(nbus,2);Pls(pq(:,1),1)=pqIncr(:,1);if ~isempty(pv);Pls(pv(:,1),1)=Pls(pv(:,1),1)-pvIncr;end +Qls=zeros(nbus,2);Qls(pq(:,1),1)=pqIncr(:,2); +if size(pqIncr,2)>=4 + Pls(pq(:,1),2)=pqIncr(:,3); + Qls(pq(:,1),2)=pqIncr(:,4); +end + +% formatting Ymatrix, here the default value of fault is empty, khuang 8 JUL +if isempty(Ytr0) + [Y,Ytr0,Ysh,ytrfr,ytrto,yshfr,yshto]=getYMatrix(nbus,line); +end + + +% reshape the pv, pq shunt and swing buses as zeros if they are empty +% khuang 8JUL +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 + +% label pv and swing buses khuang 8 JUL +% 1: PV bus, 0: PQ bus +busType(pv(:,1))=1; +busType(sw(:,1))=2; +% zip(busType(zip(:,1))~=0,10)=0; + +% index of slack bus (isw), pv bus(ipv), and pq bus(ipq) +% is given: isw, ipv, and ipq khuang 8 JUL +% Additionally, number of pv and pq buses are given: +%npv, npq respectively khuang 8 JUL +isw=find(busType==2); +ipv=find(busType==1); +ipq=find(busType==0); +npq=size(ipq,1); +npv=size(ipv,1); + +% shunt capacitator is initialized as yShunt which is a complex number. +% for every bus khuang 8 JUL +yShunt=zeros(nbus,1); +yShunt(shunt(:,1))=shunt(:,5)+1j*shunt(:,6); + +% check if zip load exists in the system +% and initialized zip load khuang 8 JUL +if ~isempty(zip)%zipMode=0 + Ysh0=Ysh0+accumarray(zip(:,1),Rzip0.*(zip(:,5)+1j*zip(:,8)).*zip(:,12),[nbus,1]); + Ysh1=Ysh1+accumarray(zip(:,1),Rzip1.*(zip(:,5)+1j*zip(:,8)).*zip(:,12),[nbus,1]); +end + +% now zip load + shunt khuang 8 JUL +Ysh0=Ysh0+yShunt; +% Y=Y+sparse(1:nbus,1:nbus,yShunt,nbus,nbus); + +% now zip load + shunt+ network Y matrix khuang 8 JUL +Y=Ytr0+sparse(1:nbus,1:nbus,Ysh0,nbus,nbus); + +%initialize P and Q for every bus khuang 8 JUL +pVec=zeros(nbus,1); +qVec=zeros(nbus,1); +% vSp=zeros(nbus,1); + +% need to figure out the meaning of index 1, 4,5 +% based on Kaiyang's understanding, 1 is load side and 4&5 are generators' +% output khuang 8 JUL +pVec(pv(:,1))=pVec(pv(:,1))+pv(:,4); +pVec(pq(:,1))=pVec(pq(:,1))-pq(:,4); +qVec(pq(:,1))=qVec(pq(:,1))-pq(:,5); +% account the zip load, i.e dynamic load khuang 8 JUL +if ~isempty(zip)%zipMode=0, account for the PQ components in ZIP loads + pVec=pVec-accumarray(zip(:,1),Rzip0.*zip(:,7).*zip(:,12),[nbus,1]); + qVec=qVec-accumarray(zip(:,1),Rzip0.*zip(:,10).*zip(:,12),[nbus,1]); +end +% qVec(ipv)=qVec(ipv)+Q0(ipv); +% vSp(ipv)=pv(:,5); + +% so far, initialization of PQ for every bus and Y matrix is ready khuang 8 JUL + + +% initiliza voltage V and W = 1/V for every bus khuang 8 JUL +V=zeros(nbus,nlvl+1); +V(:,1)=V0; +W=zeros(nbus,nlvl+1); +W(:,1)=1./V0; + + +% initiliza magnitude of voltage V for every bus khuang 8 JUL +Vmag=zeros(nbus,nlvl+1); +Vmag(:,1)=abs(V0); + +% Power is initilized as we already cooked pVec and qVec khuang 8 JUL +P=zeros(nbus,nlvl+1); +P(:,1)=pVec; +% P(isw,2:end)=0; +% here we need to figure out what Q extra mean, and difference from Q +% notice that Q0 is initialized with sysmdata but not P0 khuang 8 JUL +Q=zeros(nbus,nlvl+1); +Qxtra=zeros(size(Q)); +Q(:,1)=Q0; +Qxtra(:,1)=qVec; + +% Also, the meaning of Pls and Qls need to be verified, i assume they are +% for CPF khuang 8 JUL +P(:,2:(size(Pls,2)+1))=-Pls; +Qxtra(:,2:(size(Qls,2)+1))=-Qls; + + +% In the previous, pVec and qvec are considered zip load, here Pls and Qls +% are not, so we need to do it.khuang 8 JUL +if ~isempty(zip) + P(:,2)=P(:,2)-accumarray(zip(:,1),Rzip1.*zip(:,7).*zip(:,12),[nbus,1]); + Qxtra(:,2)=Qxtra(:,2)-accumarray(zip(:,1),Rzip1.*zip(:,10).*zip(:,12),[nbus,1]); +end +% Qxtra(busType~=0,2:end)=Q(busType~=0,2:end); +% Q(busType~=0,2:end)=0; + + +% seperate real and image part of voltages and their inverse khuang 8 JUL +% here V = C+1i*D khuang 8 JUL +% and W = 1./V = E + 1i*F khuang 8 JUL +C0=real(V(:,1)); +D0=imag(V(:,1)); +E0=real(W(:,1)); +F0=imag(W(:,1)); + +% Construct sparse matrix individually for C,D,E,F,P,Q. khuang 8 JUL +% Notice that Q = Q(:,1)+Qxtra(:,1) which is different from P. khuang 8 JUL +C0M=sparse(1:nbus,1:nbus,C0,nbus,nbus); +D0M=sparse(1:nbus,1:nbus,D0,nbus,nbus); +E0M=sparse(1:nbus,1:nbus,E0,nbus,nbus); +F0M=sparse(1:nbus,1:nbus,F0,nbus,nbus); +P0M=sparse(1:nbus,1:nbus,P(:,1),nbus,nbus); +Q0M=sparse(1:nbus,1:nbus,Q(:,1)+Qxtra(:,1),nbus,nbus); + +% get real part and image part of Y matrix, not sure why do this. khuang 8 JUL +G=real(Y); +B=imag(Y); +% so Y = G + 1i*B. khuang 8 JUL + +% this part is for AGC khuang 8 JUL +%-------------------------------------------------------------- +% Determine the frequency model of each island +% 0:sw,1:syn,2:steady-state f +freqTypeTag=zeros(nIslands,1);%0:sw,1:syn,2:steady-state f +freqKeptTag=zeros(nbus,1); +frefs=refs; +fswTag=zeros(nbus,1); +fsynTag=zeros(nbus,1); +fswTag(isw)=1; +fswTagxD=fswTag; +fsynTag(syn(:,1))=1; +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); +%----------------------------------------------------------- + + + + +%------------------------------------------------------------------ +% this part is for initialling inductor. khuang 8 JUL +if ~isempty(ind) % check if there is any inductor% khuang 8 JUL + nInd=size(ind,1); % determine the number of inductors % khuang 8 JUL + indIdx=ind(:,1); % store the index of inductors among all buses% khuang 8 JUL + + s=zeros(nInd,nlvl+1); % slip% khuang 8 JUL + s(:,1)=s0; % initialize slip% khuang 8 JUL + IL=zeros(nInd,nlvl+1); % | + IR=zeros(nInd,nlvl+1); % | + Vm=zeros(nInd,nlvl+1); % initialization finished 0 value% khuang 8 JUL + + + %-----------------parameters of inductors---------% khuang 8 JUL + %-----------------START----------------% khuang 8 JUL + R1=ind(:,7); + X1=ind(:,8); + Z1=ind(:,7)+1j*ind(:,8); + Ze=1j*ind(:,13); + R2=ind(:,9); + X2=ind(:,10); + T0=ind(:,15)+ind(:,16)+ind(:,17); + T1=-ind(:,16)-2*ind(:,17); + T2=ind(:,17); + Hm=ind(:,14); + %-----------------parameters of inductors---------% khuang 8 JUL + %-----------------END----------------% khuang 8 JUL + + + Rm=zeros(nInd,1); + + Am=sparse(indIdx,(1:nInd)',ones(1,nInd),nbus,nInd); + + % first order value of induction motor IL,VM,IR % khuang 8 JUL + IL(:,1)=V0(indIdx)./(Z1+Ze.*(R2+1j*X2.*s0)./(R2.*Reind0+(1j*X2.*Reind0+Ze).*s0)); + Vm(:,1)=V0(indIdx)-IL(:,1).*Z1; + IR(:,1)=Vm(:,1).*s0./(R2+1j*X2.*s0); + + J0=real(IR(:,1)); + K0=imag(IR(:,1)); + JL0=real(IL(:,1)); + KL0=imag(IL(:,1)); + + % prepare the algebric matrix % khuang 8 JUL + Yeind0=Reind0./Ze; + Yeind1=Reind1./Ze; + Ye1ind0=Reind0.*Z1./Ze; + Ye1ind1=Reind1.*Z1./Ze; + Ge=real(Yeind0); + Be=imag(Yeind0); + kg1e=real(Ye1ind0); + kb1e=imag(Ye1ind0); + Ge1=real(Yeind1); + Be1=imag(Yeind1); + kg1e1=real(Ye1ind1); + kb1e1=imag(Ye1ind1); + + % LHS_MatInd_Shr_sqz=zeros(nInd,4); + % RHS_C_Shr_sqz=zeros(nInd,8); + % LHS_MatInd_Shr2_sqz=zeros(nInd,8); + % + % LHS_MatInd_Shr=zeros(nInd,2,2); + % RHS_C_Shr=cell(nInd,1); + % LHS_MatInd_Shr2=cell(nInd,1); % A^-1B + % LHS_MatInd_Shr3=cell(nInd,1); % A^-1 + % + % for i=1:nInd + % LHS_MatInd=[R2(i),-X2(i)*s0(i),R1(i)*s0(i),-X1(i)*s0(i),-s0(i),0;... + % X2(i)*s0(i), R2(i),X1(i)*s0(i), R1(i)*s0(i),0,-s0(i);... + % -1,0,1+kg1e(i),-kb1e(i),-Ge(i), Be(i);... + % 0,-1,kb1e(i), 1+kg1e(i),-Be(i),-Ge(i);]; + % temp0=LHS_MatInd([3,4],[1,2])\eye(2); % A^-1 + % LHS_MatInd_Shr2{i}=temp0*LHS_MatInd([3,4],[3,4,5,6]); % A^-1B + % LHS_MatInd_Shr3{i}=temp0; % A^-1 + % temp1=LHS_MatInd([1,2],[1,2])/LHS_MatInd([3,4],[1,2]); % CA^-1 + % temp2=LHS_MatInd([1,2],[3,4,5,6])-temp1*LHS_MatInd([3,4],[3,4,5,6]); % L=D-CA^-1B + % LHS_MatInd_Shr(i,:,:)=-temp2(:,[1,2])\temp2(:,[3,4]); % -R\S + % RHS_C_Shr{i}=temp2(:,[1,2])\[eye(2),-temp1]; % R\[I,-CA^-1] + % + % LHS_MatInd_Shr_sqz(i,:)=reshape(LHS_MatInd_Shr(i,:,:),[1,4]); + % RHS_C_Shr_sqz(i,:)=reshape(RHS_C_Shr{i},[1,8]); + % LHS_MatInd_Shr2_sqz(i,:)=reshape(LHS_MatInd_Shr2{i},[1,8]); + % end + % LHS_MatInd_Bus=zeros(nbus,2,2); % \sum{-R\S} by buses + % LHS_MatInd_Bus(:,1,1)=accumarray(indIdx,LHS_MatInd_Shr(:,1,1),[nbus,1]); + % LHS_MatInd_Bus(:,1,2)=accumarray(indIdx,LHS_MatInd_Shr(:,1,2),[nbus,1]); + % LHS_MatInd_Bus(:,2,1)=accumarray(indIdx,LHS_MatInd_Shr(:,2,1),[nbus,1]); + % LHS_MatInd_Bus(:,2,2)=accumarray(indIdx,LHS_MatInd_Shr(:,2,2),[nbus,1]); + + MInd0=zeros(nInd,1); + MInd1=ones(nInd,1); + LHS_MatInd_sqz=[R2,X2.*s0,-MInd1,MInd0,... + -X2.*s0,R2,MInd0,-MInd1,... + R1.*s0,X1.*s0,MInd1+kg1e,kb1e,... + -X1.*s0,R1.*s0,-kb1e,MInd1+kg1e,... + -s0,MInd0,-Ge,-Be,... + MInd0,-s0,Be,-Ge]; % 4*6 matrix [C,D;A,B] + LHS_MatInd_idx=reshape((1:24)',[4,6]); + temp0inv_sqz=LHS_MatInd_sqz(:,reshape(LHS_MatInd_idx([3,4],[1,2]),1,[])); + temp0inv_sqz_det=temp0inv_sqz(:,1).*temp0inv_sqz(:,4)-temp0inv_sqz(:,2).*temp0inv_sqz(:,3); + temp0_sqz=[temp0inv_sqz(:,4),-temp0inv_sqz(:,2),-temp0inv_sqz(:,3),temp0inv_sqz(:,1)]./repmat(temp0inv_sqz_det,[1,4]);% A^-1 + indB_sqz=LHS_MatInd_sqz(:,reshape(LHS_MatInd_idx([3,4],[3,4,5,6]),1,[])); + LHS_MatInd_Shr2_sqz=[temp0_sqz(:,1).*indB_sqz(:,1)+temp0_sqz(:,3).*indB_sqz(:,2),temp0_sqz(:,2).*indB_sqz(:,1)+temp0_sqz(:,4).*indB_sqz(:,2),... + temp0_sqz(:,1).*indB_sqz(:,3)+temp0_sqz(:,3).*indB_sqz(:,4),temp0_sqz(:,2).*indB_sqz(:,3)+temp0_sqz(:,4).*indB_sqz(:,4),... + temp0_sqz(:,1).*indB_sqz(:,5)+temp0_sqz(:,3).*indB_sqz(:,6),temp0_sqz(:,2).*indB_sqz(:,5)+temp0_sqz(:,4).*indB_sqz(:,6),... + temp0_sqz(:,1).*indB_sqz(:,7)+temp0_sqz(:,3).*indB_sqz(:,8),temp0_sqz(:,2).*indB_sqz(:,7)+temp0_sqz(:,4).*indB_sqz(:,8)];% A^-1B + indC_sqz=LHS_MatInd_sqz(:,reshape(LHS_MatInd_idx([1,2],[1,2]),1,[])); + temp1_sqz=[indC_sqz(:,1).*temp0_sqz(:,1)+indC_sqz(:,3).*temp0_sqz(:,2),indC_sqz(:,2).*temp0_sqz(:,1)+indC_sqz(:,4).*temp0_sqz(:,2),... + indC_sqz(:,1).*temp0_sqz(:,3)+indC_sqz(:,3).*temp0_sqz(:,4),indC_sqz(:,2).*temp0_sqz(:,3)+indC_sqz(:,4).*temp0_sqz(:,4)];% CA^-1 + temp2_sqz=LHS_MatInd_sqz(:,reshape(LHS_MatInd_idx([1,2],[3,4,5,6]),1,[]))-... + [temp1_sqz(:,1).*indB_sqz(:,1)+temp1_sqz(:,3).*indB_sqz(:,2),temp1_sqz(:,2).*indB_sqz(:,1)+temp1_sqz(:,4).*indB_sqz(:,2),... + temp1_sqz(:,1).*indB_sqz(:,3)+temp1_sqz(:,3).*indB_sqz(:,4),temp1_sqz(:,2).*indB_sqz(:,3)+temp1_sqz(:,4).*indB_sqz(:,4),... + temp1_sqz(:,1).*indB_sqz(:,5)+temp1_sqz(:,3).*indB_sqz(:,6),temp1_sqz(:,2).*indB_sqz(:,5)+temp1_sqz(:,4).*indB_sqz(:,6),... + temp1_sqz(:,1).*indB_sqz(:,7)+temp1_sqz(:,3).*indB_sqz(:,8),temp1_sqz(:,2).*indB_sqz(:,7)+temp1_sqz(:,4).*indB_sqz(:,8)];% L=D-CA^-1B=[R,S] + temp2_c12_sqz=temp2_sqz(:,1:4); + temp2_c34_sqz=temp2_sqz(:,5:8); + temp2_c12_sqz_det=temp2_c12_sqz(:,1).*temp2_c12_sqz(:,4)-temp2_c12_sqz(:,2).*temp2_c12_sqz(:,3); + temp2_c12_inv_sqz=[temp2_c12_sqz(:,4),-temp2_c12_sqz(:,2),-temp2_c12_sqz(:,3),temp2_c12_sqz(:,1)]./repmat(temp2_c12_sqz_det,[1,4]); + LHS_MatInd_Shr_sqz=-[temp2_c12_inv_sqz(:,1).*temp2_c34_sqz(:,1)+temp2_c12_inv_sqz(:,3).*temp2_c34_sqz(:,2),temp2_c12_inv_sqz(:,2).*temp2_c34_sqz(:,1)+temp2_c12_inv_sqz(:,4).*temp2_c34_sqz(:,2),... + temp2_c12_inv_sqz(:,1).*temp2_c34_sqz(:,3)+temp2_c12_inv_sqz(:,3).*temp2_c34_sqz(:,4),temp2_c12_inv_sqz(:,2).*temp2_c34_sqz(:,3)+temp2_c12_inv_sqz(:,4).*temp2_c34_sqz(:,4)];% -R\S + RHS_C_Shr_sqz=[temp2_c12_inv_sqz,... + -[temp2_c12_inv_sqz(:,1).*temp1_sqz(:,1)+temp2_c12_inv_sqz(:,3).*temp1_sqz(:,2),temp2_c12_inv_sqz(:,2).*temp1_sqz(:,1)+temp2_c12_inv_sqz(:,4).*temp1_sqz(:,2),... + temp2_c12_inv_sqz(:,1).*temp1_sqz(:,3)+temp2_c12_inv_sqz(:,3).*temp1_sqz(:,4),temp2_c12_inv_sqz(:,2).*temp1_sqz(:,3)+temp2_c12_inv_sqz(:,4).*temp1_sqz(:,4)]];% R\[I,-CA^-1] + % will be used to calculate algebric variabls for motors% khuang 8 JUL + LHS_MatInd_Bus_sqz=zeros(nbus,4); % \sum{-R\S} by buses + LHS_MatInd_Bus_sqz(:,1)=accumarray(indIdx,LHS_MatInd_Shr_sqz(:,1),[nbus,1]); + LHS_MatInd_Bus_sqz(:,2)=accumarray(indIdx,LHS_MatInd_Shr_sqz(:,2),[nbus,1]); + LHS_MatInd_Bus_sqz(:,3)=accumarray(indIdx,LHS_MatInd_Shr_sqz(:,3),[nbus,1]); + LHS_MatInd_Bus_sqz(:,4)=accumarray(indIdx,LHS_MatInd_Shr_sqz(:,4),[nbus,1]); +else + s=zeros(0,nlvl+1); +end +% Initialization of inductors is finished % khuang 8 JUL +%------------------------------------------------------------------ + + +%------------------------------Initialization of ZIP load---------% khuang 8 JUL +if ~isempty(zip) + nZip=size(zip,1); + zipIdx=zip(:,1); + IiL=zeros(nZip,nlvl+1); + BiL=zeros(nZip,nlvl+1); + + % prepare the necessary matrix by blocks% khuang 8 JUL + Bi0=abs(V0(zipIdx)); + JI=zip(:,6); + KI=-zip(:,9); + % current % khuang 8 JUL + Ii0L=Rzip0.*(JI+1j*KI).*V0(zipIdx)./Bi0; + Ji0L=real(Ii0L); + Ki0L=imag(Ii0L); + + IiL(:,1)=Ii0L; + BiL(:,1)=Bi0; + % voltage% khuang 8 JUL + Ci0=real(V0(zipIdx)); + Di0=imag(V0(zipIdx)); + + LHS_MatZip=[Rzip0.*JI./Bi0-Ci0.*Ji0L./Bi0./Bi0,-Rzip0.*KI./Bi0-Di0.*Ji0L./Bi0./Bi0,... + Rzip0.*KI./Bi0-Ci0.*Ki0L./Bi0./Bi0,Rzip0.*JI./Bi0-Di0.*Ki0L./Bi0./Bi0]; + Mat_BZip=[Ci0./Bi0,Di0./Bi0]; +else + IiL=zeros(0,nlvl+1); +end +%------------------------------Initialization of ZIP load------------------% khuang 8 JUL +%------------------------------Initialization of ZIP load is finished---------------- % khuang 8 JUL + + +%------------------------------Initialization of GEN------------------% khuang 8 JUL +%------------------------------Start------------------------% khuang 8 JUL +nSyn=size(syn,1); +if ~isempty(syn) + synIdx =syn(:,1);% index number of Generators% khuang 8 JUL + wgb =syn(:,4);% maybe the base value% khuang 8 JUL + modSyn =syn(:,5);% the order of generator models% khuang 8 JUL + 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); + + d=zeros(nSyn,nlvl+1); % delta% khuang 8 JUL + w=zeros(nSyn,nlvl+1); % omega% khuang 8 JUL + eq1=zeros(nSyn,nlvl+1); %eq'% khuang 8 JUL + eq2=zeros(nSyn,nlvl+1); %eq''% khuang 8 JUL + ed1=zeros(nSyn,nlvl+1); %ed'% khuang 8 JUL + ed2=zeros(nSyn,nlvl+1); %ed''% khuang 8 JUL + psiq=zeros(nSyn,nlvl+1); % not sure, only in 8th order model% khuang 8 JUL + psid=zeros(nSyn,nlvl+1); % not sure, only in 8th order model% khuang 8 JUL + JG=zeros(nSyn,nlvl+1); + KG=zeros(nSyn,nlvl+1); + IGq=zeros(nSyn,nlvl+1); + IGd=zeros(nSyn,nlvl+1); + VGq=zeros(nSyn,nlvl+1); + VGd=zeros(nSyn,nlvl+1); + Cd=zeros(nSyn,nlvl+1); + Sd=zeros(nSyn,nlvl+1); + Ef=zeros(nSyn,nlvl+1); + Pm=zeros(nSyn,nlvl+1); + + cosd=cos(d0); + sind=sin(d0); + CG0=C0(synIdx); + DG0=D0(synIdx); + % the first value is given here, notice all are 8th order model% khuang 8 JUL + d(:,1)=d0; + w(:,1)=w0; + eq1(:,1)=eq10; + eq2(:,1)=eq20; + ed1(:,1)=ed10; + ed2(:,1)=ed20; + psiq(:,1)=psiq0; + psid(:,1)=psid0; + + % transform between grid side and dq side% khuang 8 JUL + + VGd(:,1)=sind.*CG0-cosd.*DG0; + VGq(:,1)=cosd.*CG0+sind.*DG0; + % now they are under dq side% khuang 8 JUL + + Cd(:,1)=cosd; % first order of cos(delta)% khuang 8 JUL + Sd(:,1)=sind; % first order of sin(delta)% khuang 8 JUL + Ef(:,1)=Ef0; + Pm(:,1)=Pm0; + + %check if controller exists% khuang 8 JUL + if ~isempty(Ef1) + Ef(:,2)=Ef1; + end + if ~isempty(Eq11) + eq1(:,2)=Eq11; + end + if ~isempty(Pm1) + Pm(:,2)=Pm1; + end + + % notice that here truncated taylor is applied % khuang 8 JUL + % and this is the key differnet from Dt rule% khuang 8 JUL + % Here only at most 5 th order taylor series are considered for sin% khuang 8 JUL + % and cos function % khuang 8 JUL + [cosp,sinp,taylorN]=getTaylorPolynomials(d0,taylorN); % taylorN may be truncated + + Mats=zeros(nSyn,4); + MatsR=zeros(nSyn,4); + MatsRs=zeros(nSyn,4); + + % count the number for different kinds models % khuang 8 JUL + % ex: modelTag = [ 0 0 0 0 0 10 0 0].' % khuang 8 JUL + % ex: there are 10 gens using 6th order model % khuang 8 JUL + modelTag=accumarray(modSyn,ones(nSyn,1),[8,1]); + + % determine the order of the model % khuang 8 JUL + % Do we really need for loop? % khuang 8 JUL + % the answer is yes since different gen may use different% khuang 8 JUL + % order model% khuang 8 JUL + for i=1:nSyn + % 8th order, no need to change% khuang 8 JUL + if modSyn(i)==8 + IGd(i,1)=(eq20(i)-psid0(i))/Xgd2(i); + IGq(i,1)=(-ed20(i)-psiq0(i))/Xgq2(i); + Mats(i,:)=[sind(i),cosd(i),-cosd(i),sind(i)]; + % 6th order% khuang 8 JUL + elseif modSyn(i)==6 + % algebric equation to solve Id, Iq% khuang 8 JUL + IGd(i,1)=((ed20(i)-VGd(i,1))*Rga(i)+(eq20(i)-VGq(i,1))*Xgq2(i))/(Rga(i)*Rga(i)+Xgd2(i)*Xgq2(i)); + IGq(i,1)=(-(ed20(i)-VGd(i,1))*Xgd2(i)+(eq20(i)-VGq(i,1))*Rga(i))/(Rga(i)*Rga(i)+Xgd2(i)*Xgq2(i)); + % transform matrix (inverse version)% khuang 8 JUL + Mats(i,:)=[sind(i),cosd(i),-cosd(i),sind(i)]; + % Here matrix is the inverse matrix, to understand this% khuang 8 JUL + % We have A*Ixy+B*Vxy = f => MatsR = A^-1, MatsRs = A^-1*B = MatsRs*B% khuang 8 JUL + % so Ixy = MatsR*f-MatsRs*Vxy, which is used later to% khuang 8 JUL + % eliminate Ixy when disturbance happens% khuang 8 JUL + MatsR(i,:)=[sind(i)*Rga(i)-cosd(i)*Xgd2(i),sind(i)*Xgq2(i)+cosd(i)*Rga(i),-cosd(i)*Rga(i)-sind(i)*Xgd2(i),-cosd(i)*Xgq2(i)+sind(i)*Rga(i)]/... + (Rga(i)*Rga(i)+Xgd2(i)*Xgq2(i)); + MatsRs(i,:)=[MatsR(i,1)*sind(i)+MatsR(i,2)*cosd(i),-MatsR(i,1)*cosd(i)+MatsR(i,2)*sind(i),... + MatsR(i,3)*sind(i)+MatsR(i,4)*cosd(i),-MatsR(i,3)*cosd(i)+MatsR(i,4)*sind(i)]; + % 5th order% khuang 8 JUL + elseif modSyn(i)==5 + IGd(i,1)=((ed20(i)-VGd(i,1))*Rga(i)+(eq20(i)-VGq(i,1))*Xgq2(i))/(Rga(i)*Rga(i)+Xgd2(i)*Xgq2(i)); + IGq(i,1)=(-(ed20(i)-VGd(i,1))*Xgd2(i)+(eq20(i)-VGq(i,1))*Rga(i))/(Rga(i)*Rga(i)+Xgd2(i)*Xgq2(i)); + Mats(i,:)=[sind(i),cosd(i),-cosd(i),sind(i)]; + MatsR(i,:)=[sind(i)*Rga(i)-cosd(i)*Xgd2(i),sind(i)*Xgq2(i)+cosd(i)*Rga(i),-cosd(i)*Rga(i)-sind(i)*Xgd2(i),-cosd(i)*Xgq2(i)+sind(i)*Rga(i)]/... + (Rga(i)*Rga(i)+Xgd2(i)*Xgq2(i)); + MatsRs(i,:)=[MatsR(i,1)*sind(i)+MatsR(i,2)*cosd(i),-MatsR(i,1)*cosd(i)+MatsR(i,2)*sind(i),... + MatsR(i,3)*sind(i)+MatsR(i,4)*cosd(i),-MatsR(i,3)*cosd(i)+MatsR(i,4)*sind(i)]; + % 4th order% khuang 8 JUL + elseif modSyn(i)==4 + IGd(i,1)=((ed10(i)-VGd(i,1))*Rga(i)+(eq10(i)-VGq(i,1))*Xgq1(i))/(Rga(i)*Rga(i)+Xgd1(i)*Xgq1(i)); + IGq(i,1)=(-(ed10(i)-VGd(i,1))*Xgd1(i)+(eq10(i)-VGq(i,1))*Rga(i))/(Rga(i)*Rga(i)+Xgd1(i)*Xgq1(i)); + Mats(i,:)=[sind(i),cosd(i),-cosd(i),sind(i)]; + MatsR(i,:)=[sind(i)*Rga(i)-cosd(i)*Xgd1(i),sind(i)*Xgq1(i)+cosd(i)*Rga(i),-cosd(i)*Rga(i)-sind(i)*Xgd1(i),-cosd(i)*Xgq1(i)+sind(i)*Rga(i)]/... + (Rga(i)*Rga(i)+Xgd1(i)*Xgq1(i)); + MatsRs(i,:)=[MatsR(i,1)*sind(i)+MatsR(i,2)*cosd(i),-MatsR(i,1)*cosd(i)+MatsR(i,2)*sind(i),... + MatsR(i,3)*sind(i)+MatsR(i,4)*cosd(i),-MatsR(i,3)*cosd(i)+MatsR(i,4)*sind(i)]; + % 3rd order% khuang 8 JUL + elseif modSyn(i)==3 + IGd(i,1)=((-VGd(i,1))*Rga(i)+(eq10(i)-VGq(i,1))*Xgq(i))/(Rga(i)*Rga(i)+Xgd1(i)*Xgq(i)); + IGq(i,1)=(-(-VGd(i,1))*Xgd1(i)+(eq10(i)-VGq(i,1))*Rga(i))/(Rga(i)*Rga(i)+Xgd1(i)*Xgq(i)); + Mats(i,:)=[sind(i),cosd(i),-cosd(i),sind(i)]; + MatsR(i,:)=[sind(i)*Rga(i)-cosd(i)*Xgd1(i),sind(i)*Xgq(i)+cosd(i)*Rga(i),-cosd(i)*Rga(i)-sind(i)*Xgd1(i),-cosd(i)*Xgq(i)+sind(i)*Rga(i)]/... + (Rga(i)*Rga(i)+Xgd1(i)*Xgq(i)); + MatsRs(i,:)=[MatsR(i,1)*sind(i)+MatsR(i,2)*cosd(i),-MatsR(i,1)*cosd(i)+MatsR(i,2)*sind(i),... + MatsR(i,3)*sind(i)+MatsR(i,4)*cosd(i),-MatsR(i,3)*cosd(i)+MatsR(i,4)*sind(i)]; + % classical model% khuang 8 JUL + elseif modSyn(i)==2 + IGd(i,1)=((-VGd(i,1))*Rga(i)+(Ef0(i)-VGq(i,1))*Xgq(i))/(Rga(i)*Rga(i)+Xgd(i)*Xgq(i)); + IGq(i,1)=(-(-VGd(i,1))*Xgd(i)+(Ef0(i)-VGq(i,1))*Rga(i))/(Rga(i)*Rga(i)+Xgd(i)*Xgq(i)); + Mats(i,:)=[sind(i),cosd(i),-cosd(i),sind(i)]; + MatsR(i,:)=[sind(i)*Rga(i)-cosd(i)*Xgd(i),sind(i)*Xgq(i)+cosd(i)*Rga(i),-cosd(i)*Rga(i)-sind(i)*Xgd(i),-cosd(i)*Xgq(i)+sind(i)*Rga(i)]/... + (Rga(i)*Rga(i)+Xgd(i)*Xgq(i)); + MatsRs(i,:)=[MatsR(i,1)*sind(i)+MatsR(i,2)*cosd(i),-MatsR(i,1)*cosd(i)+MatsR(i,2)*sind(i),... + MatsR(i,3)*sind(i)+MatsR(i,4)*cosd(i),-MatsR(i,3)*cosd(i)+MatsR(i,4)*sind(i)]; + end + end + % not sure how to use them now, but they are zeroth order of Ix and Iy% khuang 8 JUL + JG(:,1)= sind.*IGd(:,1)+cosd.*IGq(:,1); + KG(:,1)=-cosd.*IGd(:,1)+sind.*IGq(:,1); + + % put previous matrix in a right place in all buses instead of only% khuang 8 JUL + % generator buses% khuang 8 JUL + MatGCD=-[sparse(synIdx,synIdx,MatsRs(:,1),nbus,nbus),sparse(synIdx,synIdx,MatsRs(:,2),nbus,nbus);... + sparse(synIdx,synIdx,MatsRs(:,3),nbus,nbus),sparse(synIdx,synIdx,MatsRs(:,4),nbus,nbus)]; +else + d=zeros(0,nlvl+1); + w=zeros(0,nlvl+1); + eq1=zeros(0,nlvl+1); + eq2=zeros(0,nlvl+1); + ed1=zeros(0,nlvl+1); + ed2=zeros(0,nlvl+1); + psiq=zeros(0,nlvl+1); + psid=zeros(0,nlvl+1); + JG=zeros(0,nlvl+1); + KG=zeros(0,nlvl+1); + IGq=zeros(0,nlvl+1); + IGd=zeros(0,nlvl+1); + VGq=zeros(0,nlvl+1); + VGd=zeros(0,nlvl+1); + Cd=zeros(0,nlvl+1); + Sd=zeros(0,nlvl+1); + Ef=zeros(0,nlvl+1); + Pm=zeros(0,nlvl+1); +end +%------------------------------Initialization of GEN------------------% khuang 8 JUL +%------------------------------EnD------------------------------------% khuang 8 JUL + + + +%------------------------------Initialization of Exciter------------------% khuang 8 JUL +%------------------------------START------------------------------------% khuang 8 JUL +if ~isempty(exc) + nExc =size(exc,1); + % All Type 3 AVR, a 3rd order controller + % for Type 3 AVR, avr0(:,1:3) are Vavrm, Vavrr, Vavrf, + % and avr0(:,4) is reference Vref (input for secondary voltage control). + 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); + + %here I need to check why Vavrref is time varing instead of constant% khuang 8 JUL + % memory is given to state variables of EXC% khuang 8 JUL + Vavrm = zeros(nExc,nlvl+1); + Vavrr = zeros(nExc,nlvl+1); + Vavrf = zeros(nExc,nlvl+1); + Vavrref= zeros(nExc,nlvl+1); + + % zeroth order value is given% khuang 8 JUL + Vavrm(:,1)=real(Vavrm0); + Vavrr(:,1)=real(Vavrr0); + Vavrf(:,1)=real(Vavrf0); + Vavrref(:,1)=real(Vavrref0); + + % here Varref1 is given with syspara.% khuang 8 JUL + if ~isempty(Varref1) + Vavrref(:,2)=Varref1; + end + + % non-windup limiter, check the limit.% khuang 8 JUL + tavrMaxDiff=Vavrf(:,1)-VavrMax; + tavrMinDiff=Vavrf(:,1)-VavrMin; + + % label values in different interval.% khuang 8 JUL + avrSt=zeros(nExc,1); + avrSt(tavrMaxDiff>0)=1; + avrSt(tavrMinDiff<0)=-1; + + % output after the limiter.% khuang 8 JUL + Ef(excIdx(avrSt==-1),1)=VavrMin(avrSt==-1); + Ef(excIdx(avrSt== 1),1)=VavrMax(avrSt== 1); + Ef(excIdx(avrSt== 0),1)=Vavrf(avrSt==0,1); + +else + Vavrm=zeros(0,nlvl+1); + Vavrr=zeros(0,nlvl+1); + Vavrf=zeros(0,nlvl+1); + Vavrref=zeros(0,nlvl+1); +end +%------------------------------Initialization of Exciter------------------% khuang 8 JUL +%------------------------------END------------------------------------% khuang 8 JUL + + + + +%------------------------------Initialization of Turbing Governor------------------% khuang 8 JUL +%------------------------------START------------------------------------% khuang 8 JUL +if ~isempty(tg) + nTg = size(tg,1); + % Type 2 Turbing governor. + % one DE, one AE and one limiter + tgIdx = tg(:,1); + + wtgref = tg(:,3); + Rtg = tg(:,4); + Ttgmax = tg(:,5); + Ttgmin = tg(:,6); + Ttg2 = tg(:,7); + Ttg1 = tg(:,8); + + tgovg = zeros(nTg,nlvl+1); % tg % khuang 8 JUL + tgovm = zeros(nTg,nlvl+1); % Tmi* % khuang 8 JUL + Tmech = zeros(nTg,nlvl+1); % Tmi0 % khuang 8 JUL + + % zeroth value is given % khuang 8 JUL + tgovg(:,1)=real(tgovg0); + tgovm(:,1)=real(tgovm0); + Tmech(:,1)=real(tgovmech0); + + if ~isempty(Tmech1) + Tmech(:,2)=Tmech1; + end + + % check if limit is approached % khuang 8 JUL + tgovMaxDiff=tgovm(:,1)-Ttgmax; + tgovMinDiff=tgovm(:,1)-Ttgmin; + + govSt=zeros(nTg,1); + govSt(tgovMaxDiff>0)=1; + govSt(tgovMinDiff<0)=-1; + % if limit is approached, set Pm to constant value. % khuang 8 JUL + Pm(tgIdx(govSt==0),1)=tgovm(govSt==0,1); + Pm(tgIdx(govSt==1),1)=Ttgmax(govSt==1,1); + Pm(tgIdx(govSt==-1),1)=Ttgmin(govSt==-1,1); +else + tgovg=zeros(0,nlvl+1); + tgovm=zeros(0,nlvl+1); + Tmech=zeros(0,nlvl+1); +end +%------------------------------Initialization of Turbing Governor------------------% khuang 8 JUL +%------------------------------END------------------------------------% khuang 8 JUL + +% this part i don't quite understand. It looks like f denotes frequency % khuang 1 JUL +% on every bus, is it relevant with frequency dependant load? % khuang 1 JUL +% now i find that this is for dynamics of agc. % khuang 8 JUL +f=zeros(nbus,nlvl+1); +f(:,1)=f0; +synTag=zeros(nbus,1); +synTag(syn(:,1))=1:nSyn; +numSynOnBus=accumarray(syn(:,1),1,[nbus,1]); +dpgTag=ones(nbus,1); +for islIdx=1:nIslands + busIsland=find(islands==islIdx); + synTagIsland=synTag(busIsland); + wIsland=w(synTagIsland(synTagIsland~=0),1); + if ~isempty(wIsland) + f(busIsland,1)=mean(wIsland); % note that here the freq can be different + dpgTag(busIsland)=0; + end +end + +%AGC part % khuang 8 JUL +if ~isempty(agc) + agcExt=zeros(nbus,size(agc,2)); + agcExt(agc(:,1),:)=agc; + dpg=zeros(nbus,nlvl+1); + dpg(:,1)=dpg0; + fdk=agcExt(:,2)+agcExt(:,3); %1/R+D +else + dpg=zeros(nbus,nlvl+1); + fdk=zeros(nbus,1); +end + +% this is for long term dynamic, it seems that not considered here % khuang 8 JUL +if ~isempty(cac)&&~isempty(cluster) + +else + qplt=zeros(0,nlvl+1); + vg=zeros(0,nlvl+1); +end + +% freq relevant part induced by AGC % khuang 8 JUL +FreqReal=sparse(1:nbus,1:nbus,-freqKeptTag.*fdk.*E0,nbus,nbus); +FreqImag=sparse(1:nbus,1:nbus,-freqKeptTag.*fdk.*F0,nbus,nbus); +Freq2freq=sparse([1:nbus,1:nbus],[1:nbus,frefs(islands)'],[ones(1,nbus),-ones(1,nbus)],nbus,nbus); + +Y11=-G;Y12=B;Y21=-B;Y22=-G; +% Influence to Origianl Power flow % khuang 8 JUL +YEF11=P0M+sparse(1:nbus,1:nbus,freqKeptTag.*(-fdk.*f0+dpg0),nbus,nbus);YEF12=-Q0M;YEF21=-Q0M;YEF22=-P0M-sparse(1:nbus,1:nbus,freqKeptTag.*(-fdk.*f0+dpg0),nbus,nbus); + +% Counting influence of ZIP load into Y matrix. % khuang 8 JUL +if ~isempty(zip) + Y11=Y11-sparse(1:nbus,1:nbus,accumarray(zipIdx,LHS_MatZip(:,1),[nbus,1]),nbus,nbus); + Y12=Y12-sparse(1:nbus,1:nbus,accumarray(zipIdx,LHS_MatZip(:,2),[nbus,1]),nbus,nbus); + Y21=Y21-sparse(1:nbus,1:nbus,accumarray(zipIdx,LHS_MatZip(:,3),[nbus,1]),nbus,nbus); + Y22=Y22-sparse(1:nbus,1:nbus,accumarray(zipIdx,LHS_MatZip(:,4),[nbus,1]),nbus,nbus); +end +YLHS=[Y11,Y12;Y21,Y22]; + +% Counting influence of Motors into small Y matrix % khuang 8 JUL +if ~isempty(ind) + YLHS=YLHS-... + [sparse(1:nbus,1:nbus,LHS_MatInd_Bus_sqz(:,1),nbus,nbus),sparse(1:nbus,1:nbus,LHS_MatInd_Bus_sqz(:,3),nbus,nbus);... + sparse(1:nbus,1:nbus,LHS_MatInd_Bus_sqz(:,2),nbus,nbus),sparse(1:nbus,1:nbus,LHS_MatInd_Bus_sqz(:,4),nbus,nbus)]; +end + +% Counting influence of generators into small Y matrix % khuang 8 JUL +if ~isempty(syn) + YLHS=YLHS+MatGCD; +end + +idxNonSw=find(busType~=2); +idxNonSwxD=find(fswTagxD==0); +idxNonSwD=find(busType~=2&fswTagxD==1); + +% This is the left hand side matrix totally % khuang 8 JUL +LHS_mat=[YLHS([idxNonSw;idxNonSw+nbus],[idxNonSw;idxNonSw+nbus]),... + [YEF11(idxNonSw,idxNonSw),YEF12(idxNonSw,idxNonSw),-F0M(idxNonSw,ipv),FreqReal(idxNonSw,freqKeptTag==1);... + YEF21(idxNonSw,idxNonSw),YEF22(idxNonSw,idxNonSw),-E0M(idxNonSw,ipv),-FreqImag(idxNonSw,freqKeptTag==1)];... + C0M(ipv,idxNonSw),D0M(ipv,idxNonSw),sparse(npv,2*npq+3*npv+nFreqKept);... + E0M(idxNonSw,idxNonSw),-F0M(idxNonSw,idxNonSw),C0M(idxNonSw,idxNonSw),-D0M(idxNonSw,idxNonSw),sparse(npq+npv,npv+nFreqKept);... + F0M(idxNonSw,idxNonSw),E0M(idxNonSw,idxNonSw),D0M(idxNonSw,idxNonSw),C0M(idxNonSw,idxNonSw),sparse(npq+npv,npv+nFreqKept);... + sparse(sum(freqKeptTagxRef),size(idxNonSw,1)+size(idxNonSw,1)+2*npq+3*npv),Freq2freq(freqKeptTagxRef==1,freqKeptTag==1);... + sparse(size(idxNonSwD,1),size(idxNonSw,1)),sparse(1:size(idxNonSwD,1),idxNonSwD,ones(size(idxNonSwD,1),1),size(idxNonSwD,1),size(idxNonSw,1)),sparse(size(idxNonSwD,1),2*npq+3*npv+nFreqKept)]; + +% if nbus<=500 +% [L_LHS_mat,U_LHS_mat,p_LHS_mat]=lu(LHS_mat,'vector'); +% end + + +% deterine if we use LU factoration +% for this part, i assume the system algebrac equation is under a good +% condition number and the dimension is not very high, otherwise LU will +% be time consuming % khuang 8 JUL +useLU=isfield(SysPara,'iden')&&isfield(SysPara,'p_amd'); + +if useLU + if isempty(SysPara.p_amd) + p_amd = colamd (LHS_mat) ; + save([SysPara.iden,'.mat'],'p_amd'); + else + p_amd=SysPara.p_amd; + end + MxI = speye (size(LHS_mat)) ; + MxQ = MxI (:, p_amd) ; + if IS_OCTAVE + [MxL,MxU,MxP,MxQx] = lu (LHS_mat*MxQ) ; + else + [MxL,MxU,MxP] = lu (LHS_mat*MxQ) ; + end +end + + +%% + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%%%this is the recursive part for computing high order of time series%%%%%%%%%%% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% khuang 8 JUL + +% strat interations nlvl: order of Taylor series. % khuang 8 JUL +for i=1:nlvl + + % khuang 8 JUL%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % seq2 provides two columns from 0 to i, and i to 0 + % seq2p provides two columns from 0 to i+1, and i+1 to 0 + % seq3 provides 3 columns, the summary of each row is equal to i(binominal coefficients) + % khuang 8 JUL%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + seq2=getseq(i,2); + seq2p=getseq(i+1,2); + seq3=getseq(i,3); + idxSeq2=sum(seq2==i,2); + idxSeq2x=sum(seq2(:,2)==i,2); + idxSeq2p=sum(seq2p>=i,2); + idxSeq3=sum(seq3==i,2); + idxSeq3x=sum(seq3(:,[2,3])==i,2); + + % khuang 8 JUL%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + % seq2R is usually used in constructing algebric equations + % seq2R provides two columns from 1 to i-1, and i-1 to 1 + % seq2x provides two columns from 1 to i, and i-1 to 0 + % seq2m provides two columns from 0 to i-1, and i-1 to 0 + % seq2mm provides two columns from 0 to i-2, and i-2 to 0 + % khuang 8 JUL%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + seq2R=seq2(idxSeq2==0,:); + seq2x=seq2(idxSeq2x==0,:); + seq2m=getseq(i-1,2); + seq2mm=getseq(i-2,2); + + RHSILr=zeros(nbus,1); + RHSILi=zeros(nbus,1); + + % This part is for induction motor % khuang 8 JUL + if ~isempty(ind) + % package right hand side vector at every iteration. % khuang 8 JUL + rhsM=sum(Vm(:,seq2R(:,1)+1).*s(:,seq2R(:,2)+1),2)-1j*X2.*sum(IR(:,seq2R(:,1)+1).*s(:,seq2R(:,2)+1),2); + % rhsI=-real(sum(IR(:,seq2R(:,1)+1).*conj(IR(:,seq2R(:,2)+1)),2))+... + % (T1.*sum(s(:,seq2R(:,1)+1).*s(:,seq2R(:,2)+1),2)+T2.*sum(s(:,seq3R(:,1)+1).*s(:,seq3R(:,2)+1).*s(:,seq3R(:,3)+1),2))./R2+... + % (T0.*s(:,i)+T1.*sum(s(:,seq2m(:,1)+1).*s(:,seq2m(:,2)+1),2)+T2.*sum(s(:,seq3m(:,1)+1).*s(:,seq3m(:,2)+1).*s(:,seq3m(:,3)+1),2)).*Rm./R2; + + % s(:,i+1)=(Rind0.*(T0.*s(:,i)+T1.*sum(s(:,seq2m(:,1)+1).*s(:,seq2m(:,2)+1),2)+T2.*sum(s(:,seq3m(:,1)+1).*s(:,seq3m(:,2)+1).*s(:,seq3m(:,3)+1),2))... + % -real(sum(IR(:,seq2m(:,1)+1).*conj(IR(:,seq2m(:,2)+1)),2)).*R2-2*Hm.*sum(repmat(seq2R(:,1)',nInd,1).*s(:,seq2R(:,1)+1).*s(:,seq2R(:,2)+1),2))... + % ./(2*Hm.*s(:,1)*i); + % if i>=2 + % s(:,i+1)=s(:,i+1)+... + % Rind1.*(T0.*s(:,i-1)+T1.*sum(s(:,seq2mm(:,1)+1).*s(:,seq2mm(:,2)+1),2)+T2.*sum(s(:,seq3mm(:,1)+1).*s(:,seq3mm(:,2)+1).*s(:,seq3mm(:,3)+1),2))... + % ./(2*Hm.*s(:,1)*i); + % end + + % update the high order of slip, a special setting is required for + % low order when i<2. % khuang 8 JUL + s(:,i+1)=(Rind0.*(T1.*s(:,i)+T2.*sum(s(:,seq2m(:,1)+1).*s(:,seq2m(:,2)+1),2))-real(sum(Vm(:,seq2m(:,1)+1).*conj(IR(:,seq2m(:,2)+1)),2)))./(2*Hm*i); + if i>=2 + s(:,i+1)=s(:,i+1)+... + Rind1.*(T1.*s(:,i-1)+T2.*sum(s(:,seq2mm(:,1)+1).*s(:,seq2mm(:,2)+1),2))... + ./(2*Hm*i); + end + if i==1 + s(:,i+1)=s(:,i+1)+Rind0.*T0./(2*Hm*i); + end + if i==2 + s(:,i+1)=s(:,i+1)+Rind1.*T0./(2*Hm*i); + end + % for dynamic model, Right hand side vector is required a update. % khuang 8 JUL + addenRhs=Vm(:,1).*s(:,i+1)-1j*X2.*IR(:,1).*s(:,i+1); + + % rhsBus=zeros(2,nInd); + % for j=1:nInd + % rhsBus(:,j)=RHS_C_Shr{j}*[real(rhsM(j)+addenRhs(j));imag(rhsM(j)+addenRhs(j));0;0]; + % end + + % count the influence of dynamic of slip into rigt hand side + % vector.% khuang 8 JUL + tempRhsInd=rhsM+addenRhs; + rhsBus=[RHS_C_Shr_sqz(:,1).*real(tempRhsInd)+RHS_C_Shr_sqz(:,3).*imag(tempRhsInd),RHS_C_Shr_sqz(:,2).*real(tempRhsInd)+RHS_C_Shr_sqz(:,4).*imag(tempRhsInd)]'; + + %accumulate currents IL.% khuang 8 JUL + RHSILr=accumarray(indIdx,rhsBus(1,:)',[nbus,1]); + RHSILi=accumarray(indIdx,rhsBus(2,:)',[nbus,1]); + + % rhsBus=zeros(5,nInd); + % rhsM=sum(Vm(:,seq2R(:,1)+1).*s(:,seq2R(:,2)+1),2)-1j*X2.*sum(IR(:,seq2R(:,1)+1).*s(:,seq2R(:,2)+1),2); + % rhsImod=Rind1.*(T1.*s(:,i)+T2.*sum(s(:,seq2m(:,1)+1).*s(:,seq2m(:,2)+1),2))+Rind0.*T2.*sum(s(:,seq2R(:,1)+1).*s(:,seq2R(:,2)+1),2)-... + % real(sum(V(indIdx,seq2R(:,1)+1).*conj(IR(:,seq2R(:,2)+1)),2))+... + % real(sum(IL(:,seq2R(:,1)+1).*conj(IR(:,seq2R(:,2)+1)),2).*Z1); + % if i==1 + % rhsImod=rhsImod+Rind1.*T0; + % end + % rhsIL=V(indIdx,i).*Yeind1-IL(:,i).*Ye1ind1; + % for j=1:nInd + % rhsBus(:,j)=squeeze(RHS_C_Shr(j,:,:))*[real(rhsM(j));imag(rhsM(j));rhsImod(j);real(rhsIL(j));imag(rhsIL(j))]; + % end + % RHSILr=accumarray(indIdx,rhsBus(3,:)',[nbus,1]); + % RHSILi=accumarray(indIdx,rhsBus(4,:)',[nbus,1]); + end + + % strat update ZIP load into currents.% khuang 8 JUL + RHSIiLr=zeros(nbus,1); + RHSIiLi=zeros(nbus,1); + if ~isempty(zip) + RHS_BZip=(real(sum(V(zipIdx,seq2R(:,1)+1).*conj(V(zipIdx,seq2R(:,2)+1)),2))-sum(BiL(:,seq2R(:,1)+1).*BiL(:,seq2R(:,2)+1),2))./Bi0/2; + RHZ_BIConv=sum(IiL(:,seq2R(:,1)+1).*BiL(:,seq2R(:,2)+1),2); + RHSILr_full=Rzip1.*(JI.*real(V(zipIdx,i))-KI.*imag(V(zipIdx,i)))./Bi0-real(RHZ_BIConv)./Bi0-Ji0L.*RHS_BZip./Bi0; + RHSILi_full=Rzip1.*(KI.*real(V(zipIdx,i))+JI.*imag(V(zipIdx,i)))./Bi0-imag(RHZ_BIConv)./Bi0-Ki0L.*RHS_BZip./Bi0; + RHSIiLr=accumarray(zipIdx,RHSILr_full,[nbus,1]); + RHSIiLi=accumarray(zipIdx,RHSILi_full,[nbus,1]); + end + + % Start update generators.% khuang 8 JUL + RHSIGr=zeros(nbus,1); + RHSIGi=zeros(nbus,1); + if ~isempty(syn) + RhsEd=zeros(nSyn,1); + RhsEq=zeros(nSyn,1); + IGdAdd=zeros(nSyn,1); + IGqAdd=zeros(nSyn,1); + % select different models for generators.% khuang 8 JUL + if modelTag(8)>0 + d(modSyn==8,i+1)=(wgb(modSyn==8).*w(modSyn==8,i))/i; + w(modSyn==8,i+1)=(Pm(modSyn==8,i)-... + (sum(psid(modSyn==8,seq2m(:,1)+1).*IGq(modSyn==8,seq2m(:,2)+1),2)-sum(psiq(modSyn==8,seq2m(:,1)+1).*IGd(modSyn==8,seq2m(:,2)+1),2))-... + Dg(modSyn==8).*w(modSyn==8,i))./Mg(modSyn==8)/i; + psid(modSyn==8,i+1)=wgb(modSyn==8).*(Rga(modSyn==8).*IGd(modSyn==8,i)+psiq(modSyn==8,i)+VGd(modSyn==8,i))/i; + psiq(modSyn==8,i+1)=wgb(modSyn==8).*(Rga(modSyn==8).*IGq(modSyn==8,i)-psid(modSyn==8,i)+VGq(modSyn==8,i))/i; + eq1(modSyn==8,i+1)=(-eq1(modSyn==8,i)-(Xgd(modSyn==8)-Xgd1(modSyn==8)-gammad(modSyn==8)).*IGd(modSyn==8,i)+(1-TgAA(modSyn==8)./Tgd1(modSyn==8)).*Ef(modSyn==8,i))./Tgd1(modSyn==8)/i; + ed1(modSyn==8,i+1)=(-ed1(modSyn==8,i)+(Xgq(modSyn==8)-Xgq1(modSyn==8)-gammaq(modSyn==8)).*IGq(modSyn==8,i))./Tgq1(modSyn==8)/i; + eq2(modSyn==8,i+1)=(-eq2(modSyn==8,i)+eq1(modSyn==8,i)-(Xgd1(modSyn==8)-Xgd2(modSyn==8)+gammad(modSyn==8)).*IGd(modSyn==8,i)+TgAA(modSyn==8)./Tgd1(modSyn==8).*Ef(modSyn==8,i))./Tgd2(modSyn==8)/i; + ed2(modSyn==8,i+1)=(-ed2(modSyn==8,i)+ed1(modSyn==8,i)+(Xgq1(modSyn==8)-Xgq2(modSyn==8)+gammaq(modSyn==8)).*IGq(modSyn==8,i))./Tgq2(modSyn==8)/i; + IGdAdd(modSyn==8)=(eq2(modSyn==8,i+1)-psid(modSyn==8,i+1))./Xgd2(modSyn==8); + IGqAdd(modSyn==8)=(-ed2(modSyn==8,i+1)-psiq(modSyn==8,i+1))./Xgq2(modSyn==8); + end + if modelTag(6)>0 + d(modSyn==6,i+1)=(wgb(modSyn==6).*w(modSyn==6,i))/i; + w(modSyn==6,i+1)=(Pm(modSyn==6,i)-... + (sum(VGq(modSyn==6,seq2m(:,1)+1).*IGq(modSyn==6,seq2m(:,2)+1),2)+sum(VGd(modSyn==6,seq2m(:,1)+1).*IGd(modSyn==6,seq2m(:,2)+1),2)+... + Rga(modSyn==6).*(sum(IGq(modSyn==6,seq2m(:,1)+1).*IGq(modSyn==6,seq2m(:,2)+1),2)+sum(IGd(modSyn==6,seq2m(:,1)+1).*IGd(modSyn==6,seq2m(:,2)+1),2)))-... + Dg(modSyn==6).*w(modSyn==6,i))./Mg(modSyn==6)/i; + eq1(modSyn==6,i+1)=(-eq1(modSyn==6,i)-(Xgd(modSyn==6)-Xgd1(modSyn==6)-gammad(modSyn==6)).*IGd(modSyn==6,i)+(1-TgAA(modSyn==6)./Tgd1(modSyn==6)).*Ef(modSyn==6,i))./Tgd1(modSyn==6)/i; + ed1(modSyn==6,i+1)=(-ed1(modSyn==6,i)+(Xgq(modSyn==6)-Xgq1(modSyn==6)-gammaq(modSyn==6)).*IGq(modSyn==6,i))./Tgq1(modSyn==6)/i; + eq2(modSyn==6,i+1)=(-eq2(modSyn==6,i)+eq1(modSyn==6,i)-(Xgd1(modSyn==6)-Xgd2(modSyn==6)+gammad(modSyn==6)).*IGd(modSyn==6,i)+TgAA(modSyn==6)./Tgd1(modSyn==6).*Ef(modSyn==6,i))./Tgd2(modSyn==6)/i; + ed2(modSyn==6,i+1)=(-ed2(modSyn==6,i)+ed1(modSyn==6,i)+(Xgq1(modSyn==6)-Xgq2(modSyn==6)+gammaq(modSyn==6)).*IGq(modSyn==6,i))./Tgq2(modSyn==6)/i; + RhsEd(modSyn==6)=ed2(modSyn==6,i+1); + RhsEq(modSyn==6)=eq2(modSyn==6,i+1); + end + if modelTag(5)>0 + d(modSyn==5,i+1)=(wgb(modSyn==5).*w(modSyn==5,i))/i; + w(modSyn==5,i+1)=(Pm(modSyn==5,i)-... + (sum(VGq(modSyn==5,seq2m(:,1)+1).*IGq(modSyn==5,seq2m(:,2)+1),2)+sum(VGd(modSyn==5,seq2m(:,1)+1).*IGd(modSyn==5,seq2m(:,2)+1),2)+... + Rga(modSyn==5).*(sum(IGq(modSyn==5,seq2m(:,1)+1).*IGq(modSyn==5,seq2m(:,2)+1),2)+sum(IGd(modSyn==5,seq2m(:,1)+1).*IGd(modSyn==5,seq2m(:,2)+1),2)))-... + Dg(modSyn==5).*w(modSyn==5,i))./Mg(modSyn==5)/i; + eq1(modSyn==5,i+1)=(-eq1(modSyn==5,i)-(Xgd(modSyn==5)-Xgd1(modSyn==5)-gammad(modSyn==5)).*IGd(modSyn==5,i)+(1-TgAA(modSyn==5)./Tgd1(modSyn==5)).*Ef(modSyn==5,i))./Tgd1(modSyn==5)/i; + eq2(modSyn==5,i+1)=(-eq2(modSyn==5,i)+eq1(modSyn==5,i)-(Xgd1(modSyn==5)-Xgd2(modSyn==5)+gammad(modSyn==5)).*IGd(modSyn==5,i)+TgAA(modSyn==5)./Tgd1(modSyn==5).*Ef(modSyn==5,i))./Tgd2(modSyn==5)/i; + ed2(modSyn==5,i+1)=(-ed2(modSyn==5,i)+(Xgq(modSyn==5)-Xgq2(modSyn==5)).*IGq(modSyn==5,i))./Tgq2(modSyn==5)/i; + RhsEd(modSyn==5)=ed2(modSyn==5,i+1); + RhsEq(modSyn==5)=eq2(modSyn==5,i+1); + end + if modelTag(4)>0 + d(modSyn==4,i+1)=(wgb(modSyn==4).*w(modSyn==4,i))/i; + w(modSyn==4,i+1)=(Pm(modSyn==4,i)-... + (sum(VGq(modSyn==4,seq2m(:,1)+1).*IGq(modSyn==4,seq2m(:,2)+1),2)+sum(VGd(modSyn==4,seq2m(:,1)+1).*IGd(modSyn==4,seq2m(:,2)+1),2)+... + Rga(modSyn==4).*(sum(IGq(modSyn==4,seq2m(:,1)+1).*IGq(modSyn==4,seq2m(:,2)+1),2)+sum(IGd(modSyn==4,seq2m(:,1)+1).*IGd(modSyn==4,seq2m(:,2)+1),2)))-... + Dg(modSyn==4).*w(modSyn==4,i))./Mg(modSyn==4)/i; + eq1(modSyn==4,i+1)=(-eq1(modSyn==4,i)-(Xgd(modSyn==4)-Xgd1(modSyn==4)).*IGd(modSyn==4,i)+Ef(modSyn==4,i))./Tgd1(modSyn==4)/i; + ed1(modSyn==4,i+1)=(-ed1(modSyn==4,i)+(Xgq(modSyn==4)-Xgq1(modSyn==4)).*IGq(modSyn==4,i))./Tgq1(modSyn==4)/i; + RhsEd(modSyn==4)=ed1(modSyn==4,i+1); + RhsEq(modSyn==4)=eq1(modSyn==4,i+1); + end + if modelTag(3)>0 + d(modSyn==3,i+1)=(wgb(modSyn==3).*w(modSyn==3,i))/i; + w(modSyn==3,i+1)=(Pm(modSyn==3,i)-... + (sum(VGq(modSyn==3,seq2m(:,1)+1).*IGq(modSyn==3,seq2m(:,2)+1),2)+sum(VGd(modSyn==3,seq2m(:,1)+1).*IGd(modSyn==3,seq2m(:,2)+1),2)+... + Rga(modSyn==3).*(sum(IGq(modSyn==3,seq2m(:,1)+1).*IGq(modSyn==3,seq2m(:,2)+1),2)+sum(IGd(modSyn==3,seq2m(:,1)+1).*IGd(modSyn==3,seq2m(:,2)+1),2)))-... + Dg(modSyn==3).*w(modSyn==3,i))./Mg(modSyn==3)/i; + eq1(modSyn==3,i+1)=(-eq1(modSyn==3,i)-(Xgd(modSyn==3)-Xgd1(modSyn==3)).*IGd(modSyn==3,i)+Ef(modSyn==3,i))./Tgd1(modSyn==3)/i; + RhsEd(modSyn==3)=0; + RhsEq(modSyn==3)=eq1(modSyn==3,i+1); + end + if modelTag(2)>0 + d(modSyn==2,i+1)=(wgb(modSyn==2).*w(modSyn==2,i))/i; + w(modSyn==2,i+1)=(Pm(modSyn==2,i)-... + (sum(VGq(modSyn==2,seq2m(:,1)+1).*IGq(modSyn==2,seq2m(:,2)+1),2)+sum(VGd(modSyn==2,seq2m(:,1)+1).*IGd(modSyn==2,seq2m(:,2)+1),2)+... + Rga(modSyn==2).*(sum(IGq(modSyn==2,seq2m(:,1)+1).*IGq(modSyn==2,seq2m(:,2)+1),2)+sum(IGd(modSyn==2,seq2m(:,1)+1).*IGd(modSyn==2,seq2m(:,2)+1),2)))-... + Dg(modSyn==2).*w(modSyn==2,i))./Mg(modSyn==2)/i; + RhsEd(modSyn==2)=0; + RhsEq(modSyn==2)=eq1(modSyn==2,i+1); + end + % this part may be different from DT.% khuang 8 JUL +% AG0=cosp(:,2).*d(:,i+1); +% BG0=sinp(:,2).*d(:,i+1); +% % here multi-convolution is utilized as sine function is +% % approxiamted as a taylor series of delta.% khuang 8 JUL +% if taylorN>=2 +% AG0=AG0+cosp(:,3).*sum(d(:,seq2(:,1)+1).*d(:,seq2(:,2)+1),2); +% BG0=BG0+sinp(:,3).*sum(d(:,seq2(:,1)+1).*d(:,seq2(:,2)+1),2); +% end +% if taylorN>=3 +% AG0=AG0+cosp(:,4).*sum(d(:,seq3(:,1)+1).*d(:,seq3(:,2)+1).*d(:,seq3(:,3)+1),2); +% BG0=BG0+sinp(:,4).*sum(d(:,seq3(:,1)+1).*d(:,seq3(:,2)+1).*d(:,seq3(:,3)+1),2); +% end +% if taylorN>=4 +% seq4=getseq(i,4); +% AG0=AG0+cosp(:,5).*sum(d(:,seq4(:,1)+1).*d(:,seq4(:,2)+1).*d(:,seq4(:,3)+1).*d(:,seq4(:,4)+1),2); +% BG0=BG0+sinp(:,5).*sum(d(:,seq4(:,1)+1).*d(:,seq4(:,2)+1).*d(:,seq4(:,3)+1).*d(:,seq4(:,4)+1),2); +% end + + % now Sd store high order terms of sin(dta) and Cd for cos(dta), + % the following sentence is for DT, i commentde it for HE. % khuang 8 JUL + Sd(:,i+1) = 1/(i)*sum(repmat([i:-1:1],nSyn,1).*Cd(:,1:i).*d(:,i+1:-1:2),2); + Cd(:,i+1) =-1/(i)*sum(repmat([i:-1:1],nSyn,1).*Sd(:,1:i).*d(:,i+1:-1:2),2); +% high order coefficients of cos(delta) and sin(delta).% khuang 8 JUL +% Cd(:,i+1)=AG0; +% Sd(:,i+1)=BG0; + + VGdCr=sum(Cd(:,seq2x(:,1)+1).*VGd(:,seq2x(:,2)+1),2);% Vd*cosdta% khuang 8 JUL + VGqCr=sum(Cd(:,seq2x(:,1)+1).*VGq(:,seq2x(:,2)+1),2);% Vq*cosdta% khuang 8 JUL + VGdSr=sum(Sd(:,seq2x(:,1)+1).*VGd(:,seq2x(:,2)+1),2);% Vd*sindta% khuang 8 JUL + VGqSr=sum(Sd(:,seq2x(:,1)+1).*VGq(:,seq2x(:,2)+1),2);% Vq*sindta% khuang 8 JUL + JCr=sum(Cd(:,seq2x(:,1)+1).*JG(:,seq2x(:,2)+1),2);% similar, for currents% khuang 8 JUL + KCr=sum(Cd(:,seq2x(:,1)+1).*KG(:,seq2x(:,2)+1),2); + JSr=sum(Sd(:,seq2x(:,1)+1).*JG(:,seq2x(:,2)+1),2); + KSr=sum(Sd(:,seq2x(:,1)+1).*KG(:,seq2x(:,2)+1),2); + + RHSIGxr=-(MatsRs(:,1).*(-VGdSr-VGqCr)+MatsRs(:,2).*(VGdCr-VGqSr))+... + (MatsR(:,1).*RhsEd+MatsR(:,2).*RhsEq)-(Mats(:,1).*(JSr-KCr)+Mats(:,2).*(JCr+KSr))+(Mats(:,1).*IGdAdd+Mats(:,2).*IGqAdd); + RHSIGxi=-(MatsRs(:,3).*(-VGdSr-VGqCr)+MatsRs(:,4).*(VGdCr-VGqSr))+... + (MatsR(:,3).*RhsEd+MatsR(:,4).*RhsEq)-(Mats(:,3).*(JSr-KCr)+Mats(:,4).*(JCr+KSr))+(Mats(:,3).*IGdAdd+Mats(:,4).*IGqAdd); + % current injections from generators IG.% khuang 8 JUL + RHSIGr=accumarray(synIdx,RHSIGxr,[nbus,1]); + RHSIGi=accumarray(synIdx,RHSIGxi,[nbus,1]); + end + % update exciter, 3 state variables.% khuang 8 JUL + if ~isempty(exc) + Vavrm(:,i+1)=(Vmag(synIdx(excIdx),i)-Vavrm(:,i))./Tavrr/i; + Vavrr(:,i+1)=(muavr0.*(1-Tavr1./Tavr2).*(Vavrref(:,i)-Vavrm(:,i))-Vavrr(:,i))./Tavr2/i; + Vavrf(:,i+1)=((vavrf0.*Vmag(synIdx(excIdx),i)+... + sum(Vavrr(:,seq2m(:,1)+1).*Vmag(synIdx(excIdx),seq2m(:,2)+1),2)+... + muavr0.*Tavr1./Tavr2.*sum((Vavrref(:,seq2m(:,1)+1)-Vavrm(:,seq2m(:,1)+1)).*Vmag(synIdx(excIdx),seq2m(:,2)+1),2))./Vavr0-Vavrf(:,i))./Tavre/i; + Ef(excIdx(avrSt==-1),i+1)=0; + Ef(excIdx(avrSt== 1),i+1)=0; + Ef(excIdx(avrSt== 0),i+1)=Vavrf(avrSt==0,i+1); + end + + % update agc, one state variables.% khuang 8 JUL + if ~isempty(agc) + dpg(:,i+1)=-f(:,i).*agcExt(:,4)/i; + for islIdx=1:nIslands + busIsland=find(islands==islIdx); + synTagIsland=synTag(busIsland); + wIsland=w(synTagIsland(synTagIsland~=0),i+1); + if ~isempty(wIsland) + f(busIsland,i+1)=mean(wIsland); % note that here the freq can be different + end + end % TODO: steady-state model + + % update generator participation part from agc.% khuang 8 JUL + if ~isempty(syn) %dynamic model (synchronous generators) + if ~isempty(tg) + Tmech(:,i+1)=Tmech(:,i+1)+dpg(syn(tg(:,1),1),i+1)./numSynOnBus(syn(tg(:,1),1)); + end + Pm(:,i+1)=Pm(:,i+1)+dpg(syn(:,1),i+1)./numSynOnBus(syn(:,1)); + end + end + % update Turbine, 2 state variables.% khuang 8 JUL + if ~isempty(tg) + tgovg(:,i+1)=(-(1-Ttg1./Ttg2).*w(tgIdx,i)./Rtg-tgovg(:,i))./Ttg2/i; + tgovm(:,i+1)=tgovg(:,i+1)-Ttg1./Ttg2.*w(tgIdx,i+1)./Rtg+Tmech(:,i+1); + + Pm(tgIdx(govSt==0),i+1)=tgovm(govSt==0,i+1); + Pm(tgIdx(govSt==1),i+1)=0; + Pm(tgIdx(govSt==-1),i+1)=0; + end + + % HEM Body + RHS1=sum((-P(:,seq2(:,1)+1)+1j*(Q(:,seq2(:,1)+1)+Qxtra(:,seq2(:,1)+1))).*conj(W(:,seq2(:,2)+1)),2)+... + freqKeptTag.*sum(-dpg(:,seq2(:,1)+1).*conj(W(:,seq2(:,2)+1)),2)+... + freqKeptTag.*fdk.*sum(f(:,seq2R(:,1)+1).*conj(W(:,seq2R(:,2)+1)),2)+Ysh1.*V(:,i)+Ytr1*V(:,i); + RHS2=-0.5*real(sum(V(:,seq2R(:,1)+1).*conj(V(:,seq2R(:,2)+1)),2)); + RHS3=sum(-W(:,seq2R(:,1)+1).*V(:,seq2R(:,2)+1),2); + + + if i==1 + RHS2=RHS2+0.5*VspSq2(:,2); + end + + compactRHS1=RHS1(busType~=2); + compactRHS1=compactRHS1+Y(busType~=2,isw)*real(V(isw,i+1)); + % combine all current injection involing Motor, zip load, and + % Generators.% khuang 8 JUL + RHS=[real(compactRHS1)+RHSILr(busType~=2)+RHSIiLr(busType~=2)-RHSIGr(busType~=2);... + imag(compactRHS1)+RHSILi(busType~=2)+RHSIiLi(busType~=2)-RHSIGi(busType~=2);... + RHS2(ipv);... + real(RHS3(busType~=2));... + imag(RHS3(busType~=2));... + zeros(sum(freqKeptTagxRef),1);... + zeros(size(idxNonSwD,1),1)]; + % solve AE, notice that every time we need to solve Ax(k) =b(k), which + % means that A in invariant for every order. so we only need to rebulid + % b every iteration.% khuang 8 JUL + if useLU + if IS_OCTAVE + x = real(MxQ * MxQx* (MxU \ (MxL \ (MxP * RHS)))) ; + else + x =real( MxQ * (MxU \ (MxL \ (MxP * RHS)))) ; + end + else + x=real(LHS_mat\RHS); + end + + % x= [V;W;Q_pv;f] + xC=real(V(:,i+1)); + xD=imag(V(:,i+1)); + xC(idxNonSw)=x(1:(npq+npv)); + xD(idxNonSw)=x(((npq+npv)+1):(2*(npq+npv))); + V(:,i+1)=xC+1j*xD; + W(busType~=2,i+1)=x((2*(npq+npv)+1):(3*(npq+npv)))+... + 1j*x((3*(npq+npv)+1):(4*(npq+npv))); + Q(ipv,i+1)=x((4*(npq+npv)+1):(4*(npq+npv)+npv)); + f(freqKeptTag==1,i+1)=x((4*(npq+npv)+npv+1):end); + + Vmag(:,i+1)=(sum(V(:,seq2(:,1)+1).*conj(V(:,seq2(:,2)+1)),2)-sum(Vmag(:,seq2R(:,1)+1).*Vmag(:,seq2R(:,2)+1),2))./Vmag(:,1)/2; % Calculate voltage magnitude + + % now update the Algebric variables for motors:IL,IR,VM.% khuang 8 JUL + if ~isempty(ind) + % for j=1:nInd + % tempIL=squeeze(LHS_MatInd_Shr(j,:,:))*[real(V(indIdx(j),i+1));imag(V(indIdx(j),i+1))]+rhsBus(:,j); + % tempIRs=-LHS_MatInd_Shr2{j}*[tempIL;real(V(indIdx(j),i+1));imag(V(indIdx(j),i+1))]; + % IL(j,i+1)=tempIL(1)+1j*tempIL(2); + % IR(j,i+1)=tempIRs(1)+1j*tempIRs(2); + % Vm(j,i+1)=V(indIdx(j),i+1)-IL(j,i+1)*Z1(j); + % end + tempILvr=LHS_MatInd_Shr_sqz(:,1).*real(V(indIdx,i+1))+LHS_MatInd_Shr_sqz(:,3).*imag(V(indIdx,i+1))+rhsBus(1,:)'; + tempILvi=LHS_MatInd_Shr_sqz(:,2).*real(V(indIdx,i+1))+LHS_MatInd_Shr_sqz(:,4).*imag(V(indIdx,i+1))+rhsBus(2,:)'; + tempIRsvr=-sum(LHS_MatInd_Shr2_sqz(:,[1,3,5,7]).*[tempILvr,tempILvi,real(V(indIdx,i+1)),imag(V(indIdx,i+1))],2); + tempIRsvi=-sum(LHS_MatInd_Shr2_sqz(:,[2,4,6,8]).*[tempILvr,tempILvi,real(V(indIdx,i+1)),imag(V(indIdx,i+1))],2); + IL(:,i+1)=tempILvr+1j*tempILvi; + IR(:,i+1)=tempIRsvr+1j*tempIRsvi; + Vm(:,i+1)=V(indIdx,i+1)-IL(:,i+1).*Z1; + end + + % now update the Algebric variables for ZIP loads.% khuang 8 JUL + if ~isempty(zip) + IiL(:,i+1)=(LHS_MatZip(:,1)+1j*LHS_MatZip(:,3)).*real(V(zipIdx,i+1))+(LHS_MatZip(:,2)+1j*LHS_MatZip(:,4)).*imag(V(zipIdx,i+1))+(RHSILr_full+1j*RHSILi_full); + BiL(:,i+1)=Mat_BZip(:,1).*real(V(zipIdx,i+1))+Mat_BZip(:,2).*imag(V(zipIdx,i+1))+RHS_BZip; + end + + % now update the Algebric variables for Generators: Vd,Vq,Id,Iq.% khuang 8 JUL + if ~isempty(syn) + JG(:,i+1)=-MatsRs(:,1).*real(V(synIdx,i+1))-MatsRs(:,2).*imag(V(synIdx,i+1))+RHSIGxr; + KG(:,i+1)=-MatsRs(:,3).*real(V(synIdx,i+1))-MatsRs(:,4).*imag(V(synIdx,i+1))+RHSIGxi; + IGd(:,i+1)=JSr-KCr+sind.*JG(:,i+1)-cosd.*KG(:,i+1); + IGq(:,i+1)=JCr+KSr+cosd.*JG(:,i+1)+sind.*KG(:,i+1); + tempVGC=real(V(synIdx,i+1))-VGdSr-VGqCr; + tempVGD=imag(V(synIdx,i+1))+VGdCr-VGqSr; + VGd(:,i+1)=sind.*tempVGC-cosd.*tempVGD; + VGq(:,i+1)=cosd.*tempVGC+sind.*tempVGD; + end +end + +% Output value: coefficients for every order.% khuang 8 JUL +Q=real(Q); +s=real(s); +d=real(d); +w=real(w); +eq1=real(eq1); +eq2=real(eq2); +ed1=real(ed1); +ed2=real(ed2); +psid=real(psid); +psiq=real(psiq); +Pm=real(Pm); +Ef=real(Ef); +Vavrm=real(Vavrm); +Vavrr=real(Vavrr); +Vavrf=real(Vavrf); +Vavrref=real(Vavrref); +tgovg=real(tgovg); +tgovm=real(tgovm); +Tmech=real(Tmech); +f=real(f); +dpg=real(dpg); +qplt=real(qplt); +vg=real(vg); + +if ~isempty(exc) + avr={Vavrm,Vavrr,Vavrf}; +end + +if ~isempty(tg) + gov={tgovg,tgovm}; +end +end \ No newline at end of file diff --git a/internal/dtmMachinePFmultiStageDyn.m b/internal/dtmMachinePFmultiStageDyn.m new file mode 100644 index 0000000..a0c934f --- /dev/null +++ b/internal/dtmMachinePFmultiStageDyn.m @@ -0,0 +1,1084 @@ +function [t,stateCurve,finalAlpha,alphaList,diffList,exitFlag]=hemMachinePFmultiStageDyn(SimData,SysData,SysPara,x0) +% General interface for invoking dynamic simulation for a segment of time +% +% FUNCTION generalDynSimulation +% +% 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 +% x0 - Initial system state +% +% OUTPUT +% t - A list of time points (starting with 0) +% stateCurve - A list of states in the order of time +% finalAlpha - The ending length of this segment of simulation +% alphaList - Equivalent to t +% diffList - A list of errors +% exitFlag - +% 0 - Success and normally exit +% -1 - Fail to finish (due to computation errors or failures) +% 1 - System in absolute steady state +% 2 - Generator transients faded away +% 3 - Suggest using error reduction mode +% +global TaskID TaskNum + +DynSimFlag=getDynSimFlags(); +exitFlag=DynSimFlag.NORMAL; +% +[bus,sw,pv,pq,shunt,line,ind,zip,syn,exc,tg,agc,cac,cluster]=unfoldSysData(SysData); +[nState,idxs]... + =getIndexDyn(SysData); +[nIslands,islands,refs]=searchIslands(bus(:,1),line(:,1:2)); +nbus=size(bus,1); +nline=size(line,1); +[V0,Q0,s0,d0,w0,eq10,eq20,ed10,ed20,psid0,psiq0,Pm0,Ef0,Vavrm0,Vavrr0,Vavrf0,Vavrref0,tgovg0,tgovm0,Tmech0,f0,dpg0,qplt0,vg0]=unfoldX(x0,SysData); +[maxAlpha,segAlpha,dAlpha,nlvl,taylorN,alphaTol,diffTol,diffTolMax,~,varOpt]=unfoldSimData(SimData); +alphaTolOrig=alphaTol; +[pqIncr,pvIncr,Rind0,Rind1,Reind0,Reind1,Rzip0,Rzip1,Ytr0,Ytr1,Ysh0,Ysh1,VspSq2,~,~,~,~,Tmech1,Varref1,Ef1,Pm1,Eq11]=unfoldSysPara(SysPara); + +busType=zeros(nbus,1); +busType(pv(:,1))=1; +busType(sw(:,1))=2; +% zip(busType(zip(:,1))~=0,10)=0; + +agcExt=zeros(nbus,4); +if ~isempty(agc) + agcExt(agc(:,1),:)=agc; +end +agcRByIsland=accumarray(islands,agcExt(:,4),[nIslands,1]); +isAgcActiveByIsland=agcRByIsland~=0; +isFreqApchZero=isAgcActiveByIsland(islands); +% +pqx=pq; +pvx=pv; +shuntx=shunt; +indx=ind; +zipx=zip; +% +V0x=V0; +s0x=s0; +Q0x=Q0; +Rzip0x=Rzip0; +Rind0x=Rind0; +Reind0x=Reind0; +Ysh0x=Ysh0; +Ytr0x=Ytr0; +Vsp0x=real(V0.*conj(V0)); +d0x=d0;w0x=w0;eq10x=eq10;eq20x=eq20;ed10x=ed10;ed20x=ed20;psid0x=psid0;psiq0x=psiq0; +Pm0x=Pm0;Ef0x=Ef0;Vavrm0x=Vavrm0;Vavrr0x=Vavrr0;Vavrf0x=Vavrf0;Vavrref0x=Vavrref0; +tgovg0x=tgovg0;tgovm0x=tgovm0;Tmech0x=Tmech0; +f0x=f0;dpg0x=dpg0;qplt0x=qplt0;vg0x=vg0; + +VSol=V0; +QSol=Q0; +sSol=s0; +dSol=d0; +wSol=w0; +eq1Sol=eq10; +eq2Sol=eq20; +ed1Sol=ed10; +ed2Sol=ed20; +psiqSol=psiq0; +psidSol=psid0; +PmSol=Pm0; +EfSol=Ef0; +VavrmSol=Vavrm0; +VavrrSol=Vavrr0; +VavrfSol=Vavrf0; +VavrrefSol=Vavrref0; +tgovgSol=tgovg0; +tgovmSol=tgovm0; +TmechSol=Tmech0; +fSol=f0; +dpgSol=dpg0; +qpltSol=qplt0; +vgSol=vg0; + +t=0; + +alphaConfirm=0; + +busType=zeros(nbus,1); +if ~isempty(pv);busType(pv(:,1))=1;end +if ~isempty(sw);busType(sw(:,1))=2;end + +nSyn=size(syn,1); +nInd=size(ind,1); +nZip=size(zip,1); + +% vc=zeros(nbus,1); +% qc=zeros(size(Q0,1),1); +% sc=zeros(nInd,1);dsc=zeros(nInd,1); +% dc=zeros(nSyn,1);ddc=zeros(nSyn,1); +% wc=zeros(nSyn,1);dwc=zeros(nSyn,1); +% eq1c=zeros(nSyn,1);deq1c=zeros(nSyn,1); +% eq2c=zeros(nSyn,1);deq2c=zeros(nSyn,1); +% ed1c=zeros(nSyn,1);ded1c=zeros(nSyn,1); +% ed2c=zeros(nSyn,1);ded2c=zeros(nSyn,1); +% psidc=zeros(nSyn,1);dpsidc=zeros(nSyn,1); +% psiqc=zeros(nSyn,1);dpsiqc=zeros(nSyn,1); + +alphaList=0; +ratiob4 = NaN; +diffList=0; +diffMul=1.02; +alphaPreMult=0.91; +noMoveCnt=0; +absNoMoveCnt=0; +maxNoMoveCnt=3; +maxAbsNoMoveCnt=5; + +% generate unique identifier (colamd) +if exist('TaskID','var')&&exist('TaskNum','var')&&~isempty(TaskID)&&~isempty(TaskNum) +taskTag=num2str(TaskID(1)); +else +taskTag=''; +end + +iden=[datestr(clock,30),'_',taskTag,'K',num2str(randi([100000,899999])),'_init']; + +jac=getJacobianMod(nbus,nline,bus,sw,pvx,pqx,shuntx,line,zipx,indx,s0,V0,ones(size(ind,1),1)); +initJacCond=condest(jac); + +if ~isempty(varOpt) && isfield(varOpt,'allowModelSwitch') + allowModelSwitch=varOpt.allowModelSwitch; +else + allowModelSwitch=0; +end + +if ~isempty(varOpt) && isfield(varOpt,'absT') + useAbsT=1; + absT=varOpt.absT; +else + useAbsT=0; +end + +if ~isempty(varOpt) && isfield(varOpt,'allowExit1') + allowExit1=varOpt.allowExit1; +else + allowExit1=1; +end + +if ~isempty(varOpt) && isfield(varOpt,'useDiffCtrl') && isfield(varOpt,'diffTolCtrl') + useDiffCtrl=varOpt.useDiffCtrl; + diffTolCtrl=varOpt.diffTolCtrl; +else + useDiffCtrl=0; + diffTolCtrl=0; +end + +if ~isempty(varOpt) && isfield(varOpt,'useNomoveCtrl') + useNomoveCtrl=varOpt.useNomoveCtrl; +else + useNomoveCtrl=1; +end +alphab4 = NaN; +while alphaConfirmmax([diffTol/2,diffTolCtrl]) % refine initial point + SysParaNR=foldSysPara(zeros(size(pqx,1),2),zeros(size(pvx,1),1),ones(nInd,1),zeros(nInd,1),ones(nInd,1),zeros(nInd,1),ones(nZip,1),zeros(nZip,1),Ytr0x,0*Ytr0x,Ysh0x,0*Ysh0x,[Vsp0x,zeros(size(Vsp0x))],MatGV0,[],MatGRhs0,[]); + SimDataNR=foldSimData(maxAlpha,segAlpha,dAlpha,nlvl,taylorN,alphaTol,diffTol/10,diffTolMax,[]); + [stateNew,flag,diffRec,loop]=solveAlgebraicNR(SimDataNR,SysDataInit,SysParaNR,xxx,xxx); + if flag==0 + V0x=stateNew(idxs.vIdx); + Q0x=stateNew(idxs.qIdx); + f0x=stateNew(idxs.fIdx); + end + end + end + + xx=foldX(SysDatax,V0x,Q0x,s0x,d0x,w0x,eq10x,eq20x,ed10x,ed20x,psid0x,psiq0x,Pm0x,Ef0x,Vavrm0x,Vavrr0x,Vavrf0x,Vavrref0x,tgovg0x,tgovm0x,Tmech0x,f0x,dpg0x,qplt0x,vg0x); + pqIncrx=pqIncr; + if size(pqIncrx,2)>=4 + pqIncrx(:,1:2)=pqIncr(:,1:2)+pqIncr(:,3:4)*2*alphaConfirm; + end + SysParax=foldSysPara(pqIncrx,pvIncr,Rind0x,Rind1,Reind0x,Reind1,Rzip0x,Rzip1,Ytr0x,Ytr1,Ysh0x,Ysh1,[Vsp0x,VspSq2(:,2)],[],[],[],[],Tmech1,Varref1,Ef1,Pm1,Eq11); + SysParax.iden=iden; + if exist([iden,'.mat'],'file') + if ~exist('p_amd','var') + load([iden,'.mat']); + end + SysParax.p_amd=p_amd; + else + SysParax.p_amd=[]; + end + SysParax.nIslands=nIslands; + SysParax.islands=islands; + SysParax.refs=refs; + + [V,Q,s,d,w,eq1,eq2,ed1,ed2,psid,psiq,Pm,Ef,Vavrm,Vavrr,Vavrf,Vavrref,tgovg,tgovm,Tmech,f,dpg,qplt,vg]=... + dtmMachinePFSalientcontinueDyn(SimData,SysDatax,SysParax,xx); + + + + + %check the dirivative of every state variables w.r.t. time + ds=s(:,2:end).*repmat(1:(size(s,2)-1),size(s,1),1); + dd=d(:,2:end).*repmat(1:(size(d,2)-1),size(d,1),1); + dw=w(:,2:end).*repmat(1:(size(w,2)-1),size(w,1),1); + deq1=eq1(:,2:end).*repmat(1:(size(eq1,2)-1),size(eq1,1),1); + deq2=eq2(:,2:end).*repmat(1:(size(eq2,2)-1),size(eq2,1),1); + ded1=ed1(:,2:end).*repmat(1:(size(ed1,2)-1),size(ed1,1),1); + ded2=ed2(:,2:end).*repmat(1:(size(ed2,2)-1),size(ed2,1),1); + dpsid=psid(:,2:end).*repmat(1:(size(psid,2)-1),size(psid,1),1); + dpsiq=psiq(:,2:end).*repmat(1:(size(psiq,2)-1),size(psiq,1),1); + dPm=Pm(:,2:end).*repmat(1:(size(Pm,2)-1),size(Pm,1),1); + + dVavrm=Vavrm(:,2:end).*repmat(1:(size(Vavrm,2)-1),size(Vavrm,1),1); + dVavrr=Vavrr(:,2:end).*repmat(1:(size(Vavrr,2)-1),size(Vavrr,1),1); + dVavrf=Vavrf(:,2:end).*repmat(1:(size(Vavrf,2)-1),size(Vavrf,1),1); + dtgovg=tgovg(:,2:end).*repmat(1:(size(tgovg,2)-1),size(tgovg,1),1); + dTmech=Tmech(:,2:end).*repmat(1:(size(Tmech,2)-1),size(Tmech,1),1); + + df=f(:,2:end).*repmat(1:(size(f,2)-1),size(f,1),1); %agc + ddpg=dpg(:,2:end).*repmat(1:(size(dpg,2)-1),size(dpg,1),1); %agc + % TODO: avc +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% main part of pade +% [Va,Vb]=getPadeApproxHelm(V,0); +% idxNanV=find(isnan(Va(:,1))|isnan(Vb(:,1)));Va(idxNanV,:)=0;Vb(idxNanV,:)=0;Va(idxNanV,1:3)=V(idxNanV,1:3); +% [Qa,Qb]=getPadeApproxHelm(Q,find(busType==0)); +% idxNanQ=find(isnan(Qa(:,1))|isnan(Qb(:,1)));Qa(idxNanQ,:)=0;Qb(idxNanQ,:)=0;Qa(idxNanQ,1:3)=Q(idxNanQ,1:3); +% +% [sa,sb]=getPadeApproxHelm(s,0); +% [dsa,dsb]=getPadeApproxHelm(ds,0); +% [da,db]=getPadeApproxHelm(d,0); +% [dda,ddb]=getPadeApproxHelm(dd,0); +% [wa,wb]=getPadeApproxHelm(w,0); +% [dwa,dwb]=getPadeApproxHelm(dw,0); +% [eq1a,eq1b]=getPadeApproxHelm(eq1,0); +% [deq1a,deq1b]=getPadeApproxHelm(deq1,0); +% [eq2a,eq2b]=getPadeApproxHelm(eq2,0); +% [deq2a,deq2b]=getPadeApproxHelm(deq2,0); +% [ed1a,ed1b]=getPadeApproxHelm(ed1,0); +% [ded1a,ded1b]=getPadeApproxHelm(ded1,0); +% [ed2a,ed2b]=getPadeApproxHelm(ed2,0); +% [ded2a,ded2b]=getPadeApproxHelm(ded2,0); +% [psida,psidb]=getPadeApproxHelm(psid,0); +% [dpsida,dpsidb]=getPadeApproxHelm(dpsid,0); +% [psiqa,psiqb]=getPadeApproxHelm(psiq,0); +% [dpsiqa,dpsiqb]=getPadeApproxHelm(dpsiq,0); +% +% [Efa,Efb]=getPadeApproxHelm(Ef,0); +% [Pma,Pmb]=getPadeApproxHelm(Pm,0); +% [dPma,dPmb]=getPadeApproxHelm(dPm,0); +% [Vavrma,Vavrmb]=getPadeApproxHelm(Vavrm,0); +% [dVavrma,dVavrmb]=getPadeApproxHelm(dVavrm,0); +% [Vavrra,Vavrrb]=getPadeApproxHelm(Vavrr,0); +% [dVavrra,dVavrrb]=getPadeApproxHelm(dVavrr,0); +% [Vavrfa,Vavrfb]=getPadeApproxHelm(Vavrf,0); +% [dVavrfa,dVavrfb]=getPadeApproxHelm(dVavrf,0); +% [Vavrrefa,Vavrrefb]=getPadeApproxHelm(Vavrref,0); +% [tgovga,tgovgb]=getPadeApproxHelm(tgovg,0); +% [dtgovga,dtgovgb]=getPadeApproxHelm(dtgovg,0); +% [tgovma,tgovmb]=getPadeApproxHelm(tgovm,0); +% [Tmecha,Tmechb]=getPadeApproxHelm(Tmech,0); +% [dTmecha,dTmechb]=getPadeApproxHelm(dTmech,0); +% +% [fa,fb]=getPadeApproxHelm(f,0); % agc +% [dfa,dfb]=getPadeApproxHelm(df,0); % agc +% [dpga,dpgb]=getPadeApproxHelm(dpg,0); % agc +% [ddpga,ddpgb]=getPadeApproxHelm(ddpg,0); % agc +% +% [qplta,qpltb]=getPadeApproxHelm(qplt,0); +% [vga,vgb]=getPadeApproxHelm(vg,0); +% main part of pade +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% if ~isempty(ind) +% idxNanS=find(isnan(sa(:,1))|isnan(sb(:,1)));sa(idxNanS,:)=0;sb(idxNanS,:)=0;sa(idxNanS,1:2)=s(idxNanS,1:2); +% idxNandS=find(isnan(dsa(:,1))|isnan(dsb(:,1)));dsa(idxNandS,:)=0;dsb(idxNandS,:)=0;dsa(idxNandS,1:2)=ds(idxNandS,1:2); +% end +% if ~isempty(syn) +% idxNand=find(isnan(da(:,1))|isnan(db(:,1)));da(idxNand,:)=0;db(idxNand,:)=0;da(idxNand,1:2)=d(idxNand,1:2); +% idxNandd=find(isnan(dda(:,1))|isnan(ddb(:,1)));dda(idxNandd,:)=0;ddb(idxNandd,:)=0;dda(idxNandd,1:2)=dd(idxNandd,1:2); +% idxNanw=find(isnan(wa(:,1))|isnan(wb(:,1)));wa(idxNanw,:)=0;wb(idxNanw,:)=0;wa(idxNanw,1:2)=w(idxNanw,1:2); +% idxNandw=find(isnan(dwa(:,1))|isnan(dwb(:,1)));dwa(idxNandw,:)=0;dwb(idxNandw,:)=0;dwa(idxNandw,1:2)=dw(idxNandw,1:2); +% idxNaneq1=find(isnan(eq1a(:,1))|isnan(eq1b(:,1)));eq1a(idxNaneq1,:)=0;eq1b(idxNaneq1,:)=0;eq1a(idxNaneq1,1:2)=eq1(idxNaneq1,1:2); +% idxNandeq1=find(isnan(deq1a(:,1))|isnan(deq1b(:,1)));deq1a(idxNandeq1,:)=0;deq1b(idxNandeq1,:)=0;deq1a(idxNandeq1,1:2)=deq1(idxNandeq1,1:2); +% idxNaneq2=find(isnan(eq2a(:,1))|isnan(eq2b(:,1)));eq2a(idxNaneq2,:)=0;eq2b(idxNaneq2,:)=0;eq2a(idxNaneq2,1:2)=eq2(idxNaneq2,1:2); +% idxNandeq2=find(isnan(deq2a(:,1))|isnan(deq2b(:,1)));deq2a(idxNandeq2,:)=0;deq2b(idxNandeq2,:)=0;deq2a(idxNandeq2,1:2)=deq2(idxNandeq2,1:2); +% idxNaned1=find(isnan(ed1a(:,1))|isnan(ed1b(:,1)));ed1a(idxNaned1,:)=0;ed1b(idxNaned1,:)=0;ed1a(idxNaned1,1:2)=ed1(idxNaned1,1:2); +% idxNanded1=find(isnan(ded1a(:,1))|isnan(ded1b(:,1)));ded1a(idxNanded1,:)=0;ded1b(idxNanded1,:)=0;ded1a(idxNanded1,1:2)=ded1(idxNanded1,1:2); +% idxNaned2=find(isnan(ed2a(:,1))|isnan(ed2b(:,1)));ed2a(idxNaned2,:)=0;ed2b(idxNaned2,:)=0;ed2a(idxNaned2,1:2)=ed2(idxNaned2,1:2); +% idxNanded2=find(isnan(ded2a(:,1))|isnan(ded2b(:,1)));ded2a(idxNanded2,:)=0;ded2b(idxNanded2,:)=0;ded2a(idxNanded2,1:2)=ded2(idxNanded2,1:2); +% idxNanpsid=find(isnan(psida(:,1))|isnan(psidb(:,1)));psida(idxNanpsid,:)=0;psidb(idxNanpsid,:)=0;psida(idxNanpsid,1:2)=psid(idxNanpsid,1:2); +% idxNandpsid=find(isnan(dpsida(:,1))|isnan(dpsidb(:,1)));dpsida(idxNandpsid,:)=0;dpsidb(idxNandpsid,:)=0;dpsida(idxNandpsid,1:2)=dpsid(idxNandpsid,1:2); +% idxNanpsiq=find(isnan(psiqa(:,1))|isnan(psiqb(:,1)));psiqa(idxNanpsiq,:)=0;psiqb(idxNanpsiq,:)=0;psiqa(idxNanpsiq,1:2)=psiq(idxNanpsiq,1:2); +% idxNandpsiq=find(isnan(dpsiqa(:,1))|isnan(dpsiqb(:,1)));dpsiqa(idxNandpsiq,:)=0;dpsiqb(idxNandpsiq,:)=0;dpsiqa(idxNandpsiq,1:2)=dpsiq(idxNandpsiq,1:2); +% idxNanEf=find(isnan(Efa(:,1))|isnan(Efb(:,1)));Efa(idxNanEf,:)=0;Efb(idxNanEf,:)=0;Efa(idxNanEf,1:2)=Ef(idxNanEf,1:2); +% idxNanPm=find(isnan(Pma(:,1))|isnan(Pmb(:,1)));Pma(idxNanPm,:)=0;Pmb(idxNanPm,:)=0;Pma(idxNanPm,1:2)=Pm(idxNanPm,1:2); +% idxNandPm=find(isnan(dPma(:,1))|isnan(dPmb(:,1)));dPma(idxNandPm,:)=0;dPmb(idxNandPm,:)=0;dPma(idxNandPm,1:2)=dPm(idxNandPm,1:2); +% end +% if ~isempty(exc) +% idxNanVavrm=find(isnan(Vavrma(:,1))|isnan(Vavrmb(:,1)));Vavrma(idxNanVavrm,:)=0;Vavrmb(idxNanVavrm,:)=0;Vavrma(idxNanVavrm,1:2)=Vavrm(idxNanVavrm,1:2); +% idxNandVavrm=find(isnan(dVavrma(:,1))|isnan(dVavrmb(:,1)));dVavrma(idxNandVavrm,:)=0;dVavrmb(idxNandVavrm,:)=0;dVavrma(idxNandVavrm,1:2)=dVavrm(idxNandVavrm,1:2); +% idxNanVavrr=find(isnan(Vavrra(:,1))|isnan(Vavrrb(:,1)));Vavrra(idxNanVavrr,:)=0;Vavrrb(idxNanVavrr,:)=0;Vavrra(idxNanVavrr,1:2)=Vavrr(idxNanVavrr,1:2); +% idxNandVavrr=find(isnan(dVavrra(:,1))|isnan(dVavrrb(:,1)));dVavrra(idxNandVavrr,:)=0;dVavrrb(idxNandVavrr,:)=0;dVavrra(idxNandVavrr,1:2)=dVavrr(idxNandVavrr,1:2); +% idxNanVavrf=find(isnan(Vavrfa(:,1))|isnan(Vavrfb(:,1)));Vavrfa(idxNanVavrf,:)=0;Vavrfb(idxNanVavrf,:)=0;Vavrfa(idxNanVavrf,1:2)=Vavrf(idxNanVavrf,1:2); +% idxNandVavrf=find(isnan(dVavrfa(:,1))|isnan(dVavrfb(:,1)));dVavrfa(idxNandVavrf,:)=0;dVavrfb(idxNandVavrf,:)=0;dVavrfa(idxNandVavrf,1:2)=dVavrf(idxNandVavrf,1:2); +% idxNanVavrref=find(isnan(Vavrrefa(:,1))|isnan(Vavrrefb(:,1)));Vavrrefa(idxNanVavrref,:)=0;Vavrrefb(idxNanVavrref,:)=0;Vavrrefa(idxNanVavrref,1:2)=Vavrref(idxNanVavrref,1:2); +% end +% if ~isempty(tg) +% idxNantgovg=find(isnan(tgovga(:,1))|isnan(tgovgb(:,1)));tgovga(idxNantgovg,:)=0;tgovgb(idxNantgovg,:)=0;tgovga(idxNantgovg,1:2)=tgovg(idxNantgovg,1:2); +% idxNandtgovg=find(isnan(dtgovga(:,1))|isnan(dtgovgb(:,1)));dtgovga(idxNandtgovg,:)=0;dtgovgb(idxNandtgovg,:)=0;dtgovga(idxNandtgovg,1:2)=dtgovg(idxNandtgovg,1:2); +% idxNantgovm=find(isnan(tgovma(:,1))|isnan(tgovmb(:,1)));tgovma(idxNantgovm,:)=0;tgovmb(idxNantgovm,:)=0;tgovma(idxNantgovm,1:2)=tgovm(idxNantgovm,1:2); +% idxNanTmech=find(isnan(Tmecha(:,1))|isnan(Tmechb(:,1)));Tmecha(idxNanTmech,:)=0;Tmechb(idxNanTmech,:)=0;Tmecha(idxNanTmech,1:2)=Tmech(idxNanTmech,1:2); +% idxNandTmech=find(isnan(dTmecha(:,1))|isnan(dTmechb(:,1)));dTmecha(idxNandTmech,:)=0;dTmechb(idxNandTmech,:)=0;dTmecha(idxNandTmech,1:2)=dTmech(idxNandTmech,1:2); +% end +% +% idxNanf=find(isnan(fa(:,1))|isnan(fb(:,1)));fa(idxNanf,:)=0;fb(idxNanf,:)=0;fa(idxNanf,1:2)=f(idxNanf,1:2); +% idxNandf=find(isnan(dfa(:,1))|isnan(dfb(:,1)));dfa(idxNandf,:)=0;dfb(idxNandf,:)=0;dfa(idxNandf,1:2)=df(idxNandf,1:2); +% idxNandpg=find(isnan(dpga(:,1))|isnan(dpgb(:,1)));dpga(idxNandpg,:)=0;dpgb(idxNandpg,:)=0;dpga(idxNandpg,1:2)=dpg(idxNandpg,1:2); +% idxNanddpg=find(isnan(ddpga(:,1))|isnan(ddpgb(:,1)));ddpga(idxNanddpg,:)=0;ddpgb(idxNanddpg,:)=0;ddpga(idxNanddpg,1:2)=ddpg(idxNanddpg,1:2); +% +% if ~isempty(cac)&&~isempty(cluster) +% +% end +% if ~isempty(ind) +% idxNanS=find(isnan(sa(:,1)));s(idxNanS,:)=0;sa(idxNanS,1:2)=s(idxNanS,1:2); +% idxNandS=find(isnan(dsa(:,1))|isnan(dsb(:,1)));dsa(idxNandS,:)=0;dsb(idxNandS,:)=0;dsa(idxNandS,1:2)=ds(idxNandS,1:2); +% end +% if ~isempty(syn) +% idxNand=find(isnan(da(:,1))|isnan(db(:,1)));da(idxNand,:)=0;db(idxNand,:)=0;da(idxNand,1:2)=d(idxNand,1:2); +% idxNandd=find(isnan(dda(:,1))|isnan(ddb(:,1)));dda(idxNandd,:)=0;ddb(idxNandd,:)=0;dda(idxNandd,1:2)=dd(idxNandd,1:2); +% idxNanw=find(isnan(wa(:,1))|isnan(wb(:,1)));wa(idxNanw,:)=0;wb(idxNanw,:)=0;wa(idxNanw,1:2)=w(idxNanw,1:2); +% idxNandw=find(isnan(dwa(:,1))|isnan(dwb(:,1)));dwa(idxNandw,:)=0;dwb(idxNandw,:)=0;dwa(idxNandw,1:2)=dw(idxNandw,1:2); +% idxNaneq1=find(isnan(eq1a(:,1))|isnan(eq1b(:,1)));eq1a(idxNaneq1,:)=0;eq1b(idxNaneq1,:)=0;eq1a(idxNaneq1,1:2)=eq1(idxNaneq1,1:2); +% idxNandeq1=find(isnan(deq1a(:,1))|isnan(deq1b(:,1)));deq1a(idxNandeq1,:)=0;deq1b(idxNandeq1,:)=0;deq1a(idxNandeq1,1:2)=deq1(idxNandeq1,1:2); +% idxNaneq2=find(isnan(eq2a(:,1))|isnan(eq2b(:,1)));eq2a(idxNaneq2,:)=0;eq2b(idxNaneq2,:)=0;eq2a(idxNaneq2,1:2)=eq2(idxNaneq2,1:2); +% idxNandeq2=find(isnan(deq2a(:,1))|isnan(deq2b(:,1)));deq2a(idxNandeq2,:)=0;deq2b(idxNandeq2,:)=0;deq2a(idxNandeq2,1:2)=deq2(idxNandeq2,1:2); +% idxNaned1=find(isnan(ed1a(:,1))|isnan(ed1b(:,1)));ed1a(idxNaned1,:)=0;ed1b(idxNaned1,:)=0;ed1a(idxNaned1,1:2)=ed1(idxNaned1,1:2); +% idxNanded1=find(isnan(ded1a(:,1))|isnan(ded1b(:,1)));ded1a(idxNanded1,:)=0;ded1b(idxNanded1,:)=0;ded1a(idxNanded1,1:2)=ded1(idxNanded1,1:2); +% idxNaned2=find(isnan(ed2a(:,1))|isnan(ed2b(:,1)));ed2a(idxNaned2,:)=0;ed2b(idxNaned2,:)=0;ed2a(idxNaned2,1:2)=ed2(idxNaned2,1:2); +% idxNanded2=find(isnan(ded2a(:,1))|isnan(ded2b(:,1)));ded2a(idxNanded2,:)=0;ded2b(idxNanded2,:)=0;ded2a(idxNanded2,1:2)=ded2(idxNanded2,1:2); +% idxNanpsid=find(isnan(psida(:,1))|isnan(psidb(:,1)));psida(idxNanpsid,:)=0;psidb(idxNanpsid,:)=0;psida(idxNanpsid,1:2)=psid(idxNanpsid,1:2); +% idxNandpsid=find(isnan(dpsida(:,1))|isnan(dpsidb(:,1)));dpsida(idxNandpsid,:)=0;dpsidb(idxNandpsid,:)=0;dpsida(idxNandpsid,1:2)=dpsid(idxNandpsid,1:2); +% idxNanpsiq=find(isnan(psiqa(:,1))|isnan(psiqb(:,1)));psiqa(idxNanpsiq,:)=0;psiqb(idxNanpsiq,:)=0;psiqa(idxNanpsiq,1:2)=psiq(idxNanpsiq,1:2); +% idxNandpsiq=find(isnan(dpsiqa(:,1))|isnan(dpsiqb(:,1)));dpsiqa(idxNandpsiq,:)=0;dpsiqb(idxNandpsiq,:)=0;dpsiqa(idxNandpsiq,1:2)=dpsiq(idxNandpsiq,1:2); +% idxNanEf=find(isnan(Efa(:,1))|isnan(Efb(:,1)));Efa(idxNanEf,:)=0;Efb(idxNanEf,:)=0;Efa(idxNanEf,1:2)=Ef(idxNanEf,1:2); +% idxNanPm=find(isnan(Pma(:,1))|isnan(Pmb(:,1)));Pma(idxNanPm,:)=0;Pmb(idxNanPm,:)=0;Pma(idxNanPm,1:2)=Pm(idxNanPm,1:2); +% idxNandPm=find(isnan(dPma(:,1))|isnan(dPmb(:,1)));dPma(idxNandPm,:)=0;dPmb(idxNandPm,:)=0;dPma(idxNandPm,1:2)=dPm(idxNandPm,1:2); +% end +% if ~isempty(exc) +% idxNanVavrm=find(isnan(Vavrma(:,1))|isnan(Vavrmb(:,1)));Vavrma(idxNanVavrm,:)=0;Vavrmb(idxNanVavrm,:)=0;Vavrma(idxNanVavrm,1:2)=Vavrm(idxNanVavrm,1:2); +% idxNandVavrm=find(isnan(dVavrma(:,1))|isnan(dVavrmb(:,1)));dVavrma(idxNandVavrm,:)=0;dVavrmb(idxNandVavrm,:)=0;dVavrma(idxNandVavrm,1:2)=dVavrm(idxNandVavrm,1:2); +% idxNanVavrr=find(isnan(Vavrra(:,1))|isnan(Vavrrb(:,1)));Vavrra(idxNanVavrr,:)=0;Vavrrb(idxNanVavrr,:)=0;Vavrra(idxNanVavrr,1:2)=Vavrr(idxNanVavrr,1:2); +% idxNandVavrr=find(isnan(dVavrra(:,1))|isnan(dVavrrb(:,1)));dVavrra(idxNandVavrr,:)=0;dVavrrb(idxNandVavrr,:)=0;dVavrra(idxNandVavrr,1:2)=dVavrr(idxNandVavrr,1:2); +% idxNanVavrf=find(isnan(Vavrfa(:,1))|isnan(Vavrfb(:,1)));Vavrfa(idxNanVavrf,:)=0;Vavrfb(idxNanVavrf,:)=0;Vavrfa(idxNanVavrf,1:2)=Vavrf(idxNanVavrf,1:2); +% idxNandVavrf=find(isnan(dVavrfa(:,1))|isnan(dVavrfb(:,1)));dVavrfa(idxNandVavrf,:)=0;dVavrfb(idxNandVavrf,:)=0;dVavrfa(idxNandVavrf,1:2)=dVavrf(idxNandVavrf,1:2); +% idxNanVavrref=find(isnan(Vavrrefa(:,1))|isnan(Vavrrefb(:,1)));Vavrrefa(idxNanVavrref,:)=0;Vavrrefb(idxNanVavrref,:)=0;Vavrrefa(idxNanVavrref,1:2)=Vavrref(idxNanVavrref,1:2); +% end +% if ~isempty(tg) +% idxNantgovg=find(isnan(tgovga(:,1))|isnan(tgovgb(:,1)));tgovga(idxNantgovg,:)=0;tgovgb(idxNantgovg,:)=0;tgovga(idxNantgovg,1:2)=tgovg(idxNantgovg,1:2); +% idxNandtgovg=find(isnan(dtgovga(:,1))|isnan(dtgovgb(:,1)));dtgovga(idxNandtgovg,:)=0;dtgovgb(idxNandtgovg,:)=0;dtgovga(idxNandtgovg,1:2)=dtgovg(idxNandtgovg,1:2); +% idxNantgovm=find(isnan(tgovma(:,1))|isnan(tgovmb(:,1)));tgovma(idxNantgovm,:)=0;tgovmb(idxNantgovm,:)=0;tgovma(idxNantgovm,1:2)=tgovm(idxNantgovm,1:2); +% idxNanTmech=find(isnan(Tmecha(:,1))|isnan(Tmechb(:,1)));Tmecha(idxNanTmech,:)=0;Tmechb(idxNanTmech,:)=0;Tmecha(idxNanTmech,1:2)=Tmech(idxNanTmech,1:2); +% idxNandTmech=find(isnan(dTmecha(:,1))|isnan(dTmechb(:,1)));dTmecha(idxNandTmech,:)=0;dTmechb(idxNandTmech,:)=0;dTmecha(idxNandTmech,1:2)=dTmech(idxNandTmech,1:2); +% end +% +% idxNanf=find(isnan(fa(:,1))|isnan(fb(:,1)));fa(idxNanf,:)=0;fb(idxNanf,:)=0;fa(idxNanf,1:2)=f(idxNanf,1:2); +% idxNandf=find(isnan(dfa(:,1))|isnan(dfb(:,1)));dfa(idxNandf,:)=0;dfb(idxNandf,:)=0;dfa(idxNandf,1:2)=df(idxNandf,1:2); +% idxNandpg=find(isnan(dpga(:,1))|isnan(dpgb(:,1)));dpga(idxNandpg,:)=0;dpgb(idxNandpg,:)=0;dpga(idxNandpg,1:2)=dpg(idxNandpg,1:2); +% idxNanddpg=find(isnan(ddpga(:,1))|isnan(ddpgb(:,1)));ddpga(idxNanddpg,:)=0;ddpgb(idxNanddpg,:)=0;ddpga(idxNanddpg,1:2)=ddpg(idxNanddpg,1:2); +% +% if ~isempty(cac)&&~isempty(cluster) +% +% end +% + alphaLeft=0; + alphaRight=alpha/alphaPreMult; + + + %khuangJune14 + % here we utilize PI control strategy instead of bisection search. + % local truncation error is required from all state variable + %------------------------------------------------------------------------------------------- + + +% local_x=foldX(SysDatax,V,Q,s,d,w,eq1,eq2,ed1,ed2,psid,psiq,Pm,Ef,Vavrm,Vavrr,Vavrr,Vavrref,tgovg,tgovm,Tmech,f,dpg,qplt,vg); +% if alphax>0 +% if size(alphaList,2)>1&&~isnan(alphab4) + +% [K,h,~] =VSOO(LTE,LTE2,LTE3,SimData,alphab4,ratiob4); +% if isnan(h) +% h +% end +% SimData.nlvl = K; +% alphax = h; +% alphaRight = h ; +% alphaLeft = 0.8*h; + +% % K +% % h +% end +% else +% alphaRight = 0; +% end +% % LTE=0; + %------------------------------------------------------------------------------------------ + + + + + + + + + + + + + % alphax=0.2; + while 1 + %pade +% vc=polyvalVec(Va(:,end:-1:1),alphax)./polyvalVec([Vb(:,end:-1:1),ones(size(Vb,1),1)],alphax); +% +% qc=polyvalVec(Qa(:,end:-1:1),alphax)./polyvalVec([Qb(:,end:-1:1),ones(size(Qb,1),1)],alphax); +% qc(busType==0,:)=0; +% +% sc=polyvalVec(sa(:,end:-1:1),alphax)./polyvalVec([sb(:,end:-1:1),ones(size(sb,1),1)],alphax); +% dsc=polyvalVec(dsa(:,end:-1:1),alphax)./polyvalVec([dsb(:,end:-1:1),ones(size(dsb,1),1)],alphax); +% +% dc=polyvalVec(da(:,end:-1:1),alphax)./polyvalVec([db(:,end:-1:1),ones(size(db,1),1)],alphax); +% ddc=polyvalVec(dda(:,end:-1:1),alphax)./polyvalVec([ddb(:,end:-1:1),ones(size(ddb,1),1)],alphax); +% wc=polyvalVec(wa(:,end:-1:1),alphax)./polyvalVec([wb(:,end:-1:1),ones(size(wb,1),1)],alphax); +% dwc=polyvalVec(dwa(:,end:-1:1),alphax)./polyvalVec([dwb(:,end:-1:1),ones(size(dwb,1),1)],alphax); +% eq1c=polyvalVec(eq1a(:,end:-1:1),alphax)./polyvalVec([eq1b(:,end:-1:1),ones(size(eq1b,1),1)],alphax); +% deq1c=polyvalVec(deq1a(:,end:-1:1),alphax)./polyvalVec([deq1b(:,end:-1:1),ones(size(deq1b,1),1)],alphax); +% eq2c=polyvalVec(eq2a(:,end:-1:1),alphax)./polyvalVec([eq2b(:,end:-1:1),ones(size(eq2b,1),1)],alphax); +% deq2c=polyvalVec(deq2a(:,end:-1:1),alphax)./polyvalVec([deq2b(:,end:-1:1),ones(size(deq2b,1),1)],alphax); +% ed1c=polyvalVec(ed1a(:,end:-1:1),alphax)./polyvalVec([ed1b(:,end:-1:1),ones(size(ed1b,1),1)],alphax); +% ded1c=polyvalVec(ded1a(:,end:-1:1),alphax)./polyvalVec([ded1b(:,end:-1:1),ones(size(ded1b,1),1)],alphax); +% ed2c=polyvalVec(ed2a(:,end:-1:1),alphax)./polyvalVec([ed2b(:,end:-1:1),ones(size(ed2b,1),1)],alphax); +% ded2c=polyvalVec(ded2a(:,end:-1:1),alphax)./polyvalVec([ded2b(:,end:-1:1),ones(size(ded2b,1),1)],alphax); +% psidc=polyvalVec(psida(:,end:-1:1),alphax)./polyvalVec([psidb(:,end:-1:1),ones(size(psidb,1),1)],alphax); +% dpsidc=polyvalVec(dpsida(:,end:-1:1),alphax)./polyvalVec([dpsidb(:,end:-1:1),ones(size(dpsidb,1),1)],alphax); +% psiqc=polyvalVec(psiqa(:,end:-1:1),alphax)./polyvalVec([psiqb(:,end:-1:1),ones(size(psiqb,1),1)],alphax); +% dpsiqc=polyvalVec(dpsiqa(:,end:-1:1),alphax)./polyvalVec([dpsiqb(:,end:-1:1),ones(size(dpsiqb,1),1)],alphax); +% +% Pmc=polyvalVec(Pma(:,end:-1:1),alphax)./polyvalVec([Pmb(:,end:-1:1),ones(size(Pmb,1),1)],alphax); +% dPmc=polyvalVec(dPma(:,end:-1:1),alphax)./polyvalVec([dPmb(:,end:-1:1),ones(size(dPmb,1),1)],alphax); +% Efc=polyvalVec(Efa(:,end:-1:1),alphax)./polyvalVec([Efb(:,end:-1:1),ones(size(Efb,1),1)],alphax); +% Vavrmc=polyvalVec(Vavrma(:,end:-1:1),alphax)./polyvalVec([Vavrmb(:,end:-1:1),ones(size(Vavrmb,1),1)],alphax); +% dVavrmc=polyvalVec(dVavrma(:,end:-1:1),alphax)./polyvalVec([dVavrmb(:,end:-1:1),ones(size(dVavrmb,1),1)],alphax); +% Vavrrc=polyvalVec(Vavrra(:,end:-1:1),alphax)./polyvalVec([Vavrrb(:,end:-1:1),ones(size(Vavrrb,1),1)],alphax); +% dVavrrc=polyvalVec(dVavrra(:,end:-1:1),alphax)./polyvalVec([dVavrrb(:,end:-1:1),ones(size(dVavrrb,1),1)],alphax); +% Vavrfc=polyvalVec(Vavrfa(:,end:-1:1),alphax)./polyvalVec([Vavrfb(:,end:-1:1),ones(size(Vavrfb,1),1)],alphax); +% dVavrfc=polyvalVec(dVavrfa(:,end:-1:1),alphax)./polyvalVec([dVavrfb(:,end:-1:1),ones(size(dVavrfb,1),1)],alphax); +% Vavrrefc=polyvalVec(Vavrrefa(:,end:-1:1),alphax)./polyvalVec([Vavrrefb(:,end:-1:1),ones(size(Vavrrefb,1),1)],alphax); +% tgovgc=polyvalVec(tgovga(:,end:-1:1),alphax)./polyvalVec([tgovgb(:,end:-1:1),ones(size(tgovgb,1),1)],alphax); +% dtgovgc=polyvalVec(dtgovga(:,end:-1:1),alphax)./polyvalVec([dtgovgb(:,end:-1:1),ones(size(dtgovgb,1),1)],alphax); +% tgovmc=polyvalVec(tgovma(:,end:-1:1),alphax)./polyvalVec([tgovmb(:,end:-1:1),ones(size(tgovmb,1),1)],alphax); +% Tmechc=polyvalVec(Tmecha(:,end:-1:1),alphax)./polyvalVec([Tmechb(:,end:-1:1),ones(size(Tmechb,1),1)],alphax); +% dTmechc=polyvalVec(dTmecha(:,end:-1:1),alphax)./polyvalVec([dTmechb(:,end:-1:1),ones(size(dTmechb,1),1)],alphax); +% +% fc=polyvalVec(fa(:,end:-1:1),alphax)./polyvalVec([fb(:,end:-1:1),ones(size(fb,1),1)],alphax); +% dfc=polyvalVec(dfa(:,end:-1:1),alphax)./polyvalVec([dfb(:,end:-1:1),ones(size(dfb,1),1)],alphax); +% dpgc=polyvalVec(dpga(:,end:-1:1),alphax)./polyvalVec([dpgb(:,end:-1:1),ones(size(dpgb,1),1)],alphax); +% ddpgc=polyvalVec(ddpga(:,end:-1:1),alphax)./polyvalVec([ddpgb(:,end:-1:1),ones(size(ddpgb,1),1)],alphax); +% +% qpltc=polyvalVec(qplta(:,end:-1:1),alphax)./polyvalVec([qpltb(:,end:-1:1),ones(size(qplt,1),1)],alphax); +% vgc=polyvalVec(vga(:,end:-1:1),alphax)./polyvalVec([vgb(:,end:-1:1),ones(size(vg,1),1)],alphax); +% Y=Ytr0x+alphax*Ytr1+sparse(1:nbus,1:nbus,Ysh0x+Ysh1*alphax,nbus,nbus); + %pade b4 + vc=polyvalVec(V(:,end:-1:1),alphax); + + qc=polyvalVec(Q(:,end:-1:1),alphax); + qc(busType==0,:)=0; + + sc=polyvalVec(s(:,end:-1:1),alphax); + dsc=polyvalVec(ds(:,end:-1:1),alphax); + + dc=polyvalVec(d(:,end:-1:1),alphax); + ddc=polyvalVec(dd(:,end:-1:1),alphax); + wc=polyvalVec(w(:,end:-1:1),alphax); + dwc=polyvalVec(dw(:,end:-1:1),alphax); + eq1c=polyvalVec(eq1(:,end:-1:1),alphax); + deq1c=polyvalVec(deq1(:,end:-1:1),alphax); + eq2c=polyvalVec(eq2(:,end:-1:1),alphax); + deq2c=polyvalVec(deq2(:,end:-1:1),alphax); + ed1c=polyvalVec(ed1(:,end:-1:1),alphax); + ded1c=polyvalVec(ded1(:,end:-1:1),alphax); + ed2c=polyvalVec(ed2(:,end:-1:1),alphax); + ded2c=polyvalVec(ded2(:,end:-1:1),alphax); + psidc=polyvalVec(psid(:,end:-1:1),alphax); + dpsidc=polyvalVec(dpsid(:,end:-1:1),alphax); + psiqc=polyvalVec(psiq(:,end:-1:1),alphax); + dpsiqc=polyvalVec(dpsiq(:,end:-1:1),alphax); + + Pmc=polyvalVec(Pm(:,end:-1:1),alphax); + dPmc=polyvalVec(dPm(:,end:-1:1),alphax); + Efc=polyvalVec(Ef(:,end:-1:1),alphax); + Vavrmc=polyvalVec(Vavrm(:,end:-1:1),alphax); + dVavrmc=polyvalVec(dVavrm(:,end:-1:1),alphax); + Vavrrc=polyvalVec(Vavrr(:,end:-1:1),alphax); + dVavrrc=polyvalVec(dVavrr(:,end:-1:1),alphax); + Vavrfc=polyvalVec(Vavrf(:,end:-1:1),alphax); + dVavrfc=polyvalVec(dVavrf(:,end:-1:1),alphax); + Vavrrefc=polyvalVec(Vavrref(:,end:-1:1),alphax); + tgovgc=polyvalVec(tgovg(:,end:-1:1),alphax); + dtgovgc=polyvalVec(dtgovg(:,end:-1:1),alphax); + tgovmc=polyvalVec(tgovm(:,end:-1:1),alphax); + Tmechc=polyvalVec(Tmech(:,end:-1:1),alphax); + dTmechc=polyvalVec(dTmech(:,end:-1:1),alphax); + + fc=polyvalVec(f(:,end:-1:1),alphax); + dfc=polyvalVec(df(:,end:-1:1),alphax); + dpgc=polyvalVec(dpg(:,end:-1:1),alphax); + ddpgc=polyvalVec(ddpg(:,end:-1:1),alphax); + + qpltc=polyvalVec(qplt(:,end:-1:1),alphax); + vgc=polyvalVec(vg(:,end:-1:1),alphax); + + Vsp2=Vsp0x+alphax*VspSq2(:,2); + + pqxx=pqx; + pqxx(:,[4,5])=pqx(:,[4,5])+alphax*pqIncrx(:,1:2); + if size(pqIncrx,2)>=4 + pqxx(:,[4,5])=pqxx(:,[4,5])+alphax*alphax*pqIncrx(:,3:4); + end + pvxx=pvx; + if ~isempty(pvx);pvxx(:,4)=pvx(:,4)+alphax*pvIncr;end + + zipxx=zipx; + if ~isempty(zipxx) + zipxx(:,5:10)=repmat(Rzip0x+alphax*Rzip1,1,6).*zipx(:,5:10); + end + + indxx=indx; + if ~isempty(indxx) + indxx(:,15)=(Rind0x+alphax*Rind1).*indx(:,15); + indxx(:,16)=(Rind0x+alphax*Rind1).*indx(:,16); + indxx(:,17)=(Rind0x+alphax*Rind1).*indx(:,17); + end + + SysDataxx=foldSysData(bus,sw,pvxx,pqxx,shunt,line,indxx,zipxx,syn,exc,tg,agc,cac,cluster); + xc=foldX(SysDataxx,vc,qc,sc,dc,wc,eq1c,eq2c,ed1c,ed2c,psidc,psiqc,Pmc,Efc,Vavrmc,Vavrrc,Vavrfc,Vavrrefc,tgovgc,tgovmc,Tmechc,fc,dpgc,qpltc,vgc); + dxc=foldX(SysDataxx,0*vc,0*qc,dsc,ddc,dwc,deq1c,deq2c,ded1c,ded2c,dpsidc,dpsiqc,dPmc,0*Efc,dVavrmc,dVavrrc,dVavrfc,0*Vavrrefc,dtgovgc,0*tgovmc,dTmechc,dfc,ddpgc,0*qpltc,0*vgc); + SysParaxx=foldSysPara([],[],[],[],[],[],[],[],Ytr0x+alphax*Ytr1,[],Ysh0x+Ysh1*alphax,[],[Vsp2,zeros(size(Vsp2))],[],[],[],[],Tmech1,Varref1,Ef1,Pm1,Eq11); + SysParaxx.nIslands=nIslands; + SysParaxx.islands=islands; + SysParaxx.refs=refs; + + diff=checkEquationBalanceSynDyn(SysDataxx,SysParaxx,xc,dxc); + absDiff=max(abs(diff)); + %bisection search +% if absDiff=4 + pqxx(:,[4,5])=pqxx(:,[4,5])+alphax*alphax*pqIncrx(:,3:4); + end + pvxx=pvx; + if ~isempty(pvx);pvxx(:,4)=pvx(:,4)+alphax*pvIncr;end + + zipxx=zipx; + if ~isempty(zipxx) + zipxx(:,5:10)=repmat(Rzip0x+alphax*Rzip1,1,6).*zipx(:,5:10); + end + + indxx=indx; + if ~isempty(indxx) + indxx(:,15)=(Rind0x+alphax*Rind1).*indx(:,15); + indxx(:,16)=(Rind0x+alphax*Rind1).*indx(:,16); + indxx(:,17)=(Rind0x+alphax*Rind1).*indx(:,17); + end + + SysDataxx=foldSysData(bus,sw,pvxx,pqxx,shunt,line,indxx,zipxx,syn,exc,tg,agc,cac,cluster); + xc=foldX(SysDataxx,vc,qc,sc,dc,wc,eq1c,eq2c,ed1c,ed2c,psidc,psiqc,Pmc,Efc,Vavrmc,Vavrrc,Vavrfc,Vavrrefc,tgovgc,tgovmc,Tmechc,fc,dpgc,qpltc,vgc); + dxc=foldX(SysDataxx,0*vc,0*qc,dsc,ddc,dwc,deq1c,deq2c,ded1c,ded2c,dpsidc,dpsiqc,dPmc,0*Efc,dVavrmc,dVavrrc,dVavrfc,0*Vavrrefc,dtgovgc,0*tgovmc,dTmechc,dfc,ddpgc,0*qpltc,0*vgc); + SysParaxx=foldSysPara([],[],[],[],[],[],[],[],Ytr0x+alphax*Ytr1,[],Ysh0x+Ysh1*alphax,[],[Vsp2,zeros(size(Vsp2))],[],[],[],[],Tmech1,Varref1,Ef1,Pm1,Eq11); + SysParaxx.nIslands=nIslands; + SysParaxx.islands=islands; + SysParaxx.refs=refs; + + diff=checkEquationBalanceSynDyn(SysDataxx,SysParaxx,xc,dxc); + if max(abs(diff))<1.05*diffParadigm + break; + end + alphax=alphax*alphaPreMult; + countCheckAlpha=countCheckAlpha+1; + end + + if countCheckAlpha>=maxCount;alphax=alphax/alphaPreMult;end + alpha=alphax; + + pqx(:,[4,5])=pqx(:,[4,5])+alpha*pqIncrx(:,1:2); + if size(pqIncrx,2)>=4 + pqx(:,[4,5])=pqx(:,[4,5])+alpha*alpha*pqIncrx(:,3:4); + end + if ~isempty(pvx);pvx(:,4)=pvx(:,4)+alpha*pvIncr;end + Rzip0x=Rzip0x+alpha*Rzip1; + Rind0x=Rind0x+alpha*Rind1; + Reind0x=Reind0x+alpha*Reind1; + Ysh0x=Ysh0x+alpha*Ysh1; + Vsp0x=Vsp0x+alpha*VspSq2(:,2); + Ytr0x=Ytr0x+alpha*Ytr1; + + alphaConfirm=alphaConfirm+alpha; + if useAbsT + strPre=['T=',num2str(absT+alphaConfirm,'%7.5f'),', ']; + else + strPre=['Step=',num2str(alphaConfirm,'%7.5f'),', ']; + end + addLog([strPre,'dt=',num2str(alpha,'%7.5f'),', K=',num2str(SimData.nlvl,'%7.1f'),', (maxdiff<',num2str(diffTol),').'],'INFO'); +% addLog(['Fluctuation=',num2str(max(fluctuation)),' rate=',num2str(max(fluctuation)/maxTcoeff),'.'],'INFO'); + + if alpha==0 + noMoveCnt=noMoveCnt+1; + absNoMoveCnt=absNoMoveCnt+1; + addLog(['Step did not move! (MaxDiff=',num2str(max(abs(diff))),')' ],'INFO'); + if diffTol>=diffTolMax + addLog('Max DiffTol reached and not move, exit!','INFO'); + exitFlag=DynSimFlag.FAIL; + break; + end + + if noMoveCnt>=maxNoMoveCnt + zipxx=zipx; + if ~isempty(zipxx) + zipxx(:,5:10)=repmat(Rzip0x,1,6).*zipx(:,5:10); + end + jac=getJacobianMod(nbus,nline,bus,sw,pvx,pqx,shuntx,line,zipxx,indx,sc,vc,ones(size(ind,1),1)); + jacCond=condest(jac); + addLog(['Cond of Jacobian=',num2str(jacCond), ', relative cond=',num2str(jacCond/initJacCond)],'INFO'); + if jacCond>50*initJacCond + addLog('Singular likely, exit!','INFO'); + exitFlag=DynSimFlag.FAIL; + break; + end + end + + if allowModelSwitch && useNomoveCtrl && absNoMoveCnt>maxAbsNoMoveCnt && alphaConfirm>0 + addLog('Too many times of no move!','INFO'); + exitFlag=DynSimFlag.NOMOVE_CTRL; + break; + end + + alphaTol=alphaTol/2; + if alphaToldiffTolMax + diffTol=diffTolMax; + end + addLog(['Enlarge tol! (Tol=',num2str(diffTol),')'],'INFO'); + else % step moves + if alphaTolalphaTolOrig + alphaTol=alphaTolOrig; + end + + if useDiffCtrl&&(length(diffList)>1)&&(diffList(2)diffTolMax/2) + exitFlag=3; + end + + if useAbsT && isfield(varOpt,'lastSwitchT') && isfield(varOpt,'switchDelay') + if absT+alphaConfirm>varOpt.lastSwitchT+varOpt.switchDelay + allowSwitchByDelay=1; + else + allowSwitchByDelay=0; + end + else + allowSwitchByDelay=0; + end + if allowModelSwitch && allowSwitchByDelay + CC=real(V); + DD=imag(V); + V2=zeros(size(CC)); + for lvl=1:size(V2,2) + V2(:,lvl)=sum(CC(:,1:lvl).*CC(:,lvl:-1:1),2)+sum(DD(:,1:lvl).*DD(:,lvl:-1:1),2); + end + + if ~isempty(d) + xd=d(2:end,:)-repmat(d(1,:),size(d,1)-1,1); + else + xd=d; + end + if ~isempty(w) + islandSyn=islands(syn(:,1)); + refSynTag=zeros(size(syn,1),1); + for isl=1:nIslands + synInIsland=find(islandSyn==isl); + if ~isempty(synInIsland) + refSynTag(islandSyn==isl)=synInIsland(1); + end + end + xw=w-w(refSynTag,:); + else + xw=w; + end +% [V2a,V2b]=getPadeApproxHelm(V2,0); +% idxNanV2=find(isnan(V2a(:,1))|isnan(V2b(:,1)));V2a(idxNanV2,:)=0;V2b(idxNanV2,:)=0;V2a(idxNanV2,1:2)=V2(idxNanV2,1:2); +% [xda,xdb]=getPadeApproxHelm(xd,0); +% idxNanxd=find(isnan(xda(:,1))|isnan(xdb(:,1)));xda(idxNanxd,:)=0;xdb(idxNanxd,:)=0;xda(idxNanxd,1:2)=xd(idxNanxd,1:2); +% [xwa,xwb]=getPadeApproxHelm(xw,0); +% idxNanxw=find(isnan(xwa(:,1))|isnan(xwb(:,1)));xwa(idxNanxw,:)=0;xwb(idxNanxw,:)=0;xwa(idxNanxw,1:2)=xw(idxNanxw,1:2); + + % heCoeffsToCheck=[xd;w;s;eq1;eq2;ed1;ed2;psid;psiq;Ef;Pm;Vavrm;Vavrr;Vavrf;Vavrref;tgovg;tgovm;Tmech;f;dpg;qplt;vg]; + % maxTcoeff=alpha; + % fluctuations=calcFluctuationHE(heCoeffsToCheck,maxTcoeff); + % flucTag=getFluctuationTag(fluctuations,maxTcoeff); + +% heCoeffsToCheckA=[V2a;xda;wa;sa;eq1a;eq2a;ed1a;ed2a;psida;psiqa;Efa;Pma;Vavrma;Vavrra;Vavrfa;Vavrrefa;tgovga;tgovma;Tmecha;fa;dpga;qplta;vga]; +% heCoeffsToCheckB=[V2b;xdb;wb;sb;eq1b;eq2b;ed1b;ed2b;psidb;psiqb;Efb;Pmb;Vavrmb;Vavrrb;Vavrfb;Vavrrefb;tgovgb;tgovmb;Tmechb;fb;dpgb;qpltb;vgb]; +% heCoeffsToCheckB=[ones(size(heCoeffsToCheckB,1),1),heCoeffsToCheckB]; +% flucTag=getFluctuationTagPade(real(heCoeffsToCheckA),real(heCoeffsToCheckB),0.99*alpha,0.001); + flucTag = 1; + if flucTag && max(abs(isAgcActiveByIsland.*fc))<1e-4&&allowExit1 + addLog('Dyn model likely reached steady state!(PS)','INFO'); + exitFlag=1; + else + exitFlag=0; + end + + if ~isempty(xw) && exitFlag==0 + % heCoeffsToCheckw=[xd;xw;s;eq1;eq2;ed1;ed2;psid;psiq;Ef;Pm;Vavrm;Vavrr;Vavrf;Vavrref;tgovg;tgovm;Tmech;f;dpg;qplt;vg]; + % maxTcoeffw=alpha; + % fluctuationsw=calcFluctuationHE(heCoeffsToCheckw,maxTcoeffw); + % flucTagw=getFluctuationTag(fluctuationsw,maxTcoeffw); +% heCoeffsToCheck=[V2;xw;s;eq1;eq2;ed1;ed2;psid;psiq;Ef;Vavrm;Vavrr;Vavrf;Vavrref;qplt;vg]; +% heCoeffsToCheckAw=[V2a;xwa;sa;eq1a;eq2a;ed1a;ed2a;psida;psiqa;Efa;Vavrma;Vavrra;Vavrfa;Vavrrefa;qplta;vga]; +% heCoeffsToCheckBw=[V2b;xwb;sb;eq1b;eq2b;ed1b;ed2b;psidb;psiqb;Efb;Vavrmb;Vavrrb;Vavrfb;Vavrrefb;qpltb;vgb]; +% heCoeffsToCheckBw=[ones(size(heCoeffsToCheckBw,1),1),heCoeffsToCheckBw]; +% fThreshold=0.0001; +% flucTagw=getFluctuationTagPade(real(heCoeffsToCheckAw),real(heCoeffsToCheckBw),0.99*alpha,fThreshold); +% [fluctRateMod,flucTagMod]=getFluctuationTagPadeMod(real(heCoeffsToCheckAw),real(heCoeffsToCheckBw),0.99*alpha,fThreshold); +% [ubc,lbc]=findPolynomialBounds(real(heCoeffsToCheck(:,2:end)),0.99*alpha); +% fluctRatePs=min(abs([ubc,lbc]),[],2); + flucTagw = 0 ; + if flucTagw + addLog('Inter-rotor transients approximately fades away!(PS)','INFO'); + exitFlag=2; + else + exitFlag=0; + end + end + end +% heCoeffsToChecka=[xda;wa;sa;eq1a;eq2a;ed1a;ed2a;psida;psiqa;Efa;Pma;Vavrma;Vavrra;Vavrfa;Vavrrefa;tgovga;tgovma;Tmecha;fa;qplta;vga]; +% heCoeffsToCheckb=[xdb;wb;sb;eq1b;eq2b;ed1b;ed2b;psidb;psiqb;Efb;Pmb;Vavrmb;Vavrrb;Vavrfb;Vavrrefb;tgovgb;tgovmb;Tmechb;fb;qpltb;vgb]; +% fluctuationsPade=calcFluctuationHEpade(heCoeffsToChecka,heCoeffsToCheckb,maxTcoeff); +% flucTagPade=getFluctuationTag(fluctuationsPade,maxTcoeff); +% if flucTagPade +% addLog('Dyn model likely reached steady state!(Pade)','INFO'); +% end + + noMoveCnt=0; + + tt=[dAlpha:dAlpha:(alpha-alphaTol/10),alpha]; + vcx=polyvalVec(V(:,end:-1:1),tt); + qcx=polyvalVec(Q(:,end:-1:1),tt); + qcx(busType==0,:)=0; + scx=polyvalVec(s(:,end:-1:1),tt); + dcx=polyvalVec(d(:,end:-1:1),tt); + wcx=polyvalVec(w(:,end:-1:1),tt); + eq1cx=polyvalVec(eq1(:,end:-1:1),tt); + eq2cx=polyvalVec(eq2(:,end:-1:1),tt); + ed1cx=polyvalVec(ed1(:,end:-1:1),tt); + ed2cx=polyvalVec(ed2(:,end:-1:1),tt); + psidcx=polyvalVec(psid(:,end:-1:1),tt); + psiqcx=polyvalVec(psiq(:,end:-1:1),tt); + + Pmcx=polyvalVec(Pm(:,end:-1:1),tt); + Efcx=polyvalVec(Ef(:,end:-1:1),tt); + Vavrmcx=polyvalVec(Vavrm(:,end:-1:1),tt); + Vavrrcx=polyvalVec(Vavrr(:,end:-1:1),tt); + Vavrfcx=polyvalVec(Vavrf(:,end:-1:1),tt); + Vavrrefcx=polyvalVec(Vavrref(:,end:-1:1),tt); + tgovgcx=polyvalVec(tgovg(:,end:-1:1),tt); + tgovmcx=polyvalVec(tgovm(:,end:-1:1),tt); + Tmechcx=polyvalVec(Tmech(:,end:-1:1),tt); + + fcx=polyvalVec(f(:,end:-1:1),tt); + dpgcx=polyvalVec(dpg(:,end:-1:1),tt); + qpltcx=polyvalVec(qplt(:,end:-1:1),tt); + vgcx=polyvalVec(vg(:,end:-1:1),tt); +% dtm = 199815 + % +% load('2bus_x.mat'); +% if isempty(tend);tlastend=0;else tlastend=tend(end);end +% E=sw(1,4); +% r=line(1,8); +% x=line(1,9); +% tstart=[tstart;tlastend]; +% tend=[tend;tt(end)+tlastend]; +% istart=[istart;((real(Va(2,1))-E)*(real(Va(2,1))-E)+imag(Va(2,1))*imag(Va(2,1)))/(r*r+x*x)]; +% iend=[iend;((real(vcx(2,end))-E)*(real(vcx(2,end))-E)+imag(vcx(2,end))*imag(vcx(2,end)))/(r*r+x*x)]; +% V2=[V2;V(2,:)]; +% save('2bus_x.mat','tstart','tend','istart','iend','V2'); +% + t=[t,(tt+t(end))]; + VSol=[VSol,vcx]; + QSol=[QSol,qcx]; + sSol=[sSol,scx]; + dSol=[dSol,dcx]; + wSol=[wSol,wcx]; + eq1Sol=[eq1Sol,eq1cx]; + eq2Sol=[eq2Sol,eq2cx]; + ed1Sol=[ed1Sol,ed1cx]; + ed2Sol=[ed2Sol,ed2cx]; + psiqSol=[psiqSol,psiqcx]; + psidSol=[psidSol,psidcx]; + PmSol=[PmSol,Pmcx]; + EfSol=[EfSol,Efcx]; + VavrmSol=[VavrmSol,Vavrmcx]; + VavrrSol=[VavrrSol,Vavrrcx]; + VavrfSol=[VavrfSol,Vavrfcx]; + VavrrefSol=[VavrrefSol,Vavrrefcx]; + tgovgSol=[tgovgSol,tgovgcx]; + tgovmSol=[tgovmSol,tgovmcx]; + TmechSol=[TmechSol,Tmechcx]; + + fSol=[fSol,fcx]; + dpgSol=[dpgSol,dpgcx]; + qpltSol=[qpltSol,qpltcx]; + vgSol=[vgSol,vgcx]; + + V0x=vcx(:,end); + Q0x=qcx(:,end); + s0x=scx(:,end); + d0x=dcx(:,end);w0x=wcx(:,end);eq10x=eq1cx(:,end);eq20x=eq2cx(:,end);ed10x=ed1cx(:,end);ed20x=ed2cx(:,end);psid0x=psidcx(:,end);psiq0x=psiqcx(:,end); + Pm0x=Pmcx(:,end);Ef0x=Efcx(:,end);Vavrm0x=Vavrmcx(:,end);Vavrr0x=Vavrrcx(:,end);Vavrf0x=Vavrfcx(:,end); + Vavrref0x=Vavrrefcx(:,end);tgovg0x=tgovgcx(:,end);tgovm0x=tgovmcx(:,end);Tmech0x=Tmechcx(:,end); + f0x=fcx(:,end);dpg0x=dpgcx(:,end);qplt0x=qpltcx(:,end);vg0x=vgcx(:,end); + + +% +% [LTE,LTE2,LTE3] = Cal_locl_er(local_x,SimData.nlvl,alpha); +% ratiob4 = LTE./alpha; +% alphab4 = alpha; +% alphaList=[alphaList,alpha]; +% diffList=[diffList,max(abs(diff))]; + + if allowModelSwitch + if exitFlag==DynSimFlag.STEADY||exitFlag==DynSimFlag.QSS + break; + end + end + if exitFlag==DynSimFlag.DIFF_CTRL + break; + end + end +end +if length(diffList)>1;diffList(1)=diffList(2);end +stateCurve=[... +VSol;QSol;sSol;dSol;wSol;eq1Sol;eq2Sol;ed1Sol;ed2Sol;psidSol;psiqSol; +PmSol;EfSol;VavrmSol;VavrrSol;VavrfSol;VavrrefSol;tgovgSol;tgovmSol;TmechSol;fSol;dpgSol;qpltSol;vgSol +]; +finalAlpha=alphaConfirm; + +if exist([iden,'.mat'],'file') + delete([iden,'.mat']); +end +end diff --git a/internal/html/Copy_of_hemMachinePFSalientcontinueDyn.html b/internal/html/Copy_of_hemMachinePFSalientcontinueDyn.html new file mode 100644 index 0000000..16de489 --- /dev/null +++ b/internal/html/Copy_of_hemMachinePFSalientcontinueDyn.html @@ -0,0 +1,2498 @@ + + + + + Copy_of_hemMachinePFSalientcontinueDyn
function [V,Q,s,d,w,eq1,eq2,ed1,ed2,psid,psiq,Pm,Ef,Vavrm,Vavrr,Vavrf,Vavrref,tgovg,tgovm,Tmech,f,dpg,qplt,vg]=...
+    hemMachinePFSalientcontinueDyn(SimData,SysData,SysPara,x0)
+
% Core HE algorithm for solving DAEs (dynamic simulation)
+%
+% FUNCTION hemMachinePFSalientcontinueDyn
+%
+% Author: Rui Yao <ruiyao@ieee.org>
+%
+% 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
+%   x0 - Initial system state
+%
+% OUTPUT - (will be consolidated in a future version)
+%
+% TODO % Modify the output arguments
+%
+
+global IS_OCTAVE;
+
+
+
+% import system data
+[bus,sw,pv,pq,shunt,line,ind,zip,syn,exc,tg,agc,cac,cluster]=unfoldSysData(SysData);
+% nbus:total number of buses
+nbus=size(bus,1);
+nline=size(line,1);
+
+%determine islanding
+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
+
+% improt initial condition
+[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(x0,SysData);
+% import simualtion data
+[~,~,~,nlvl,taylorN,~,~,~,~]=unfoldSimData(SimData);
+% import system parameters
+[pqIncr,pvIncr,Rind0,Rind1,Reind0,Reind1,Rzip0,Rzip1,Ytr0,Ytr1,Ysh0,Ysh1,VspSq2,~,~,~,~,Tmech1,Varref1,Ef1,Pm1,Eq11]=unfoldSysPara(SysPara);
+%
+
+% It seems that PQ incremental is given for every pq bus.
+% need to figure how to utilize them
+Pls=zeros(nbus,2);Pls(pq(:,1),1)=pqIncr(:,1);if ~isempty(pv);Pls(pv(:,1),1)=Pls(pv(:,1),1)-pvIncr;end
+Qls=zeros(nbus,2);Qls(pq(:,1),1)=pqIncr(:,2);
+% why additional PQ is given
+if size(pqIncr,2)>=4
+    Pls(pq(:,1),2)=pqIncr(:,3);
+    Qls(pq(:,1),2)=pqIncr(:,4);
+end
+
+% formatting Ymatrix, here the default value of fault is empty
+if isempty(Ytr0)
+    [Y,Ytr0,Ysh,ytrfr,ytrto,yshfr,yshto]=getYMatrix(nbus,line);
+end
+
+
+% reshape the pv, pq shunt and swing buses if they are empty
+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
+
+% label pv and swing buses
+% 1: PV bus, 0: PQ bus
+busType(pv(:,1))=1;
+busType(sw(:,1))=2;
+% zip(busType(zip(:,1))~=0,10)=0;
+
+% index of swing bus (isw), pv bus(ipv), and pq bus(ipq)
+% is given: isw, ipv, and ipq
+% Additionally, number of pv and pq buses are given:
+%npv, npq respectively
+isw=find(busType==2);
+ipv=find(busType==1);
+ipq=find(busType==0);
+npq=size(ipq,1);
+npv=size(ipv,1);
+
+% shunt capacitator is initialized as yShunt which is a complex number.
+% for every bus
+yShunt=zeros(nbus,1);
+yShunt(shunt(:,1))=shunt(:,5)+1j*shunt(:,6);
+
+% check if zip load exists in the system
+% and initialized zip load
+if ~isempty(zip)%zipMode=0
+    Ysh0=Ysh0+accumarray(zip(:,1),Rzip0.*(zip(:,5)+1j*zip(:,8)).*zip(:,12),[nbus,1]);
+    Ysh1=Ysh1+accumarray(zip(:,1),Rzip1.*(zip(:,5)+1j*zip(:,8)).*zip(:,12),[nbus,1]);
+end
+
+% now zip load + shunt
+Ysh0=Ysh0+yShunt;
+%     Y=Y+sparse(1:nbus,1:nbus,yShunt,nbus,nbus);
+
+% now zip load + shunt+ network Y matrix
+Y=Ytr0+sparse(1:nbus,1:nbus,Ysh0,nbus,nbus);
+
+%initialize P and Q for every bus
+pVec=zeros(nbus,1);
+qVec=zeros(nbus,1);
+%     vSp=zeros(nbus,1);
+
+% need to figure out the meaning of index 1, 4,5
+% based Kaiyang's understanding, 1 is load side and 4&5 are generators'
+% output
+pVec(pv(:,1))=pVec(pv(:,1))+pv(:,4);
+pVec(pq(:,1))=pVec(pq(:,1))-pq(:,4);
+qVec(pq(:,1))=qVec(pq(:,1))-pq(:,5);
+% account the zip load, i.e dynamic load
+if ~isempty(zip)%zipMode=0, account for the PQ components in ZIP loads
+    pVec=pVec-accumarray(zip(:,1),Rzip0.*zip(:,7).*zip(:,12),[nbus,1]);
+    qVec=qVec-accumarray(zip(:,1),Rzip0.*zip(:,10).*zip(:,12),[nbus,1]);
+end
+% qVec(ipv)=qVec(ipv)+Q0(ipv);
+%     vSp(ipv)=pv(:,5);
+
+% so far, initialization of PQ for every bus and Y matrix is ready
+
+
+% initiliza voltage V and W = 1/V for every bus
+V=zeros(nbus,nlvl+1);
+V(:,1)=V0;
+W=zeros(nbus,nlvl+1);
+W(:,1)=1./V0;
+
+
+% initiliza magnitude of voltage V for every bus
+Vmag=zeros(nbus,nlvl+1);
+Vmag(:,1)=abs(V0);
+
+% Power is initilized as we already cooked pVec and qVec
+P=zeros(nbus,nlvl+1);
+P(:,1)=pVec;
+%     P(isw,2:end)=0;
+% here we need to figure out what Q extra mean, and difference from Q
+% notice that Q0 is initialized with sysmdata but not P0
+Q=zeros(nbus,nlvl+1);
+Qxtra=zeros(size(Q));
+Q(:,1)=Q0;
+Qxtra(:,1)=qVec;
+
+% Also, the meaning of Pls and Qls need to be verified
+P(:,2:(size(Pls,2)+1))=-Pls;
+Qxtra(:,2:(size(Qls,2)+1))=-Qls;
+
+
+% In the previous, pVec and qvec are considered zip load, here Pls and Qls
+% are not, so we need to do it.
+if ~isempty(zip)
+    P(:,2)=P(:,2)-accumarray(zip(:,1),Rzip1.*zip(:,7).*zip(:,12),[nbus,1]);
+    Qxtra(:,2)=Qxtra(:,2)-accumarray(zip(:,1),Rzip1.*zip(:,10).*zip(:,12),[nbus,1]);
+end
+% Qxtra(busType~=0,2:end)=Q(busType~=0,2:end);
+% Q(busType~=0,2:end)=0;
+
+
+% seperate real and image part of voltages and their inverse
+% here V = C+1i*D
+% and  W = 1./V = E + 1i*F
+C0=real(V(:,1));
+D0=imag(V(:,1));
+E0=real(W(:,1));
+F0=imag(W(:,1));
+
+% Construct sparse matrix individually for C,D,E,F,P,Q
+% Notice that Q = Q(:,1)+Qxtra(:,1) which is different from P
+C0M=sparse(1:nbus,1:nbus,C0,nbus,nbus);
+D0M=sparse(1:nbus,1:nbus,D0,nbus,nbus);
+E0M=sparse(1:nbus,1:nbus,E0,nbus,nbus);
+F0M=sparse(1:nbus,1:nbus,F0,nbus,nbus);
+P0M=sparse(1:nbus,1:nbus,P(:,1),nbus,nbus);
+Q0M=sparse(1:nbus,1:nbus,Q(:,1)+Qxtra(:,1),nbus,nbus);
+
+% get real part and image part of Y matrix, not sure why do this
+G=real(Y);
+B=imag(Y);
+% so Y = G + 1i*B
+
+
+%--------------------------------------------------------------
+% Determine the frequency model of each island
+% 0:sw,1:syn,2:steady-state f
+freqTypeTag=zeros(nIslands,1);%0:sw,1:syn,2:steady-state f
+freqKeptTag=zeros(nbus,1);
+frefs=refs;
+fswTag=zeros(nbus,1);
+fsynTag=zeros(nbus,1);
+fswTag(isw)=1;
+fswTagxD=fswTag;
+fsynTag(syn(:,1))=1;
+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);
+%-----------------------------------------------------------
+
+
+
+
+%------------------------------------------------------------------
+% this part is for initialling inductor
+if ~isempty(ind)            % check if there is any inductor
+    nInd=size(ind,1);       % determine the number of inductors
+    indIdx=ind(:,1);        % store the index of inductors among all buses
+
+    s=zeros(nInd,nlvl+1);   % slip
+    s(:,1)=s0;              % initialize slip
+    IL=zeros(nInd,nlvl+1);  %  |
+    IR=zeros(nInd,nlvl+1);  %  |
+    Vm=zeros(nInd,nlvl+1);  % initialization finished 0 value
+
+
+   %-----------------parameters of inductors---------
+   %-----------------START----------------
+    R1=ind(:,7);
+    X1=ind(:,8);
+    Z1=ind(:,7)+1j*ind(:,8);
+    Ze=1j*ind(:,13);
+    R2=ind(:,9);
+    X2=ind(:,10);
+    T0=ind(:,15)+ind(:,16)+ind(:,17);
+    T1=-ind(:,16)-2*ind(:,17);
+    T2=ind(:,17);
+    Hm=ind(:,14);
+   %-----------------parameters of inductors---------
+   %-----------------END----------------
+
+
+    Rm=zeros(nInd,1);
+
+    Am=sparse(indIdx,(1:nInd)',ones(1,nInd),nbus,nInd);
+
+    % first order value of induction motor IL,VM,IR
+    IL(:,1)=V0(indIdx)./(Z1+Ze.*(R2+1j*X2.*s0)./(R2.*Reind0+(1j*X2.*Reind0+Ze).*s0));
+    Vm(:,1)=V0(indIdx)-IL(:,1).*Z1;
+    IR(:,1)=Vm(:,1).*s0./(R2+1j*X2.*s0);
+
+    J0=real(IR(:,1));
+    K0=imag(IR(:,1));
+    JL0=real(IL(:,1));
+    KL0=imag(IL(:,1));
+
+    % prepare the algebric matrix
+    Yeind0=Reind0./Ze;
+    Yeind1=Reind1./Ze;
+    Ye1ind0=Reind0.*Z1./Ze;
+    Ye1ind1=Reind1.*Z1./Ze;
+    Ge=real(Yeind0);
+    Be=imag(Yeind0);
+    kg1e=real(Ye1ind0);
+    kb1e=imag(Ye1ind0);
+    Ge1=real(Yeind1);
+    Be1=imag(Yeind1);
+    kg1e1=real(Ye1ind1);
+    kb1e1=imag(Ye1ind1);
+
+    %     LHS_MatInd_Shr_sqz=zeros(nInd,4);
+    %     RHS_C_Shr_sqz=zeros(nInd,8);
+    %     LHS_MatInd_Shr2_sqz=zeros(nInd,8);
+    %
+    %     LHS_MatInd_Shr=zeros(nInd,2,2);
+    %     RHS_C_Shr=cell(nInd,1);
+    %     LHS_MatInd_Shr2=cell(nInd,1); % A^-1B
+    %     LHS_MatInd_Shr3=cell(nInd,1); % A^-1
+    %
+    %     for i=1:nInd
+    %         LHS_MatInd=[R2(i),-X2(i)*s0(i),R1(i)*s0(i),-X1(i)*s0(i),-s0(i),0;...
+    %                     X2(i)*s0(i), R2(i),X1(i)*s0(i), R1(i)*s0(i),0,-s0(i);...
+    %                     -1,0,1+kg1e(i),-kb1e(i),-Ge(i), Be(i);...
+    %                     0,-1,kb1e(i), 1+kg1e(i),-Be(i),-Ge(i);];
+    %         temp0=LHS_MatInd([3,4],[1,2])\eye(2);                       % A^-1
+    %         LHS_MatInd_Shr2{i}=temp0*LHS_MatInd([3,4],[3,4,5,6]);       % A^-1B
+    %         LHS_MatInd_Shr3{i}=temp0;                                % A^-1
+    %         temp1=LHS_MatInd([1,2],[1,2])/LHS_MatInd([3,4],[1,2]);       % CA^-1
+    %         temp2=LHS_MatInd([1,2],[3,4,5,6])-temp1*LHS_MatInd([3,4],[3,4,5,6]); % L=D-CA^-1B
+    %         LHS_MatInd_Shr(i,:,:)=-temp2(:,[1,2])\temp2(:,[3,4]);        % -R\S
+    %         RHS_C_Shr{i}=temp2(:,[1,2])\[eye(2),-temp1];             % R\[I,-CA^-1]
+    %
+    %         LHS_MatInd_Shr_sqz(i,:)=reshape(LHS_MatInd_Shr(i,:,:),[1,4]);
+    %         RHS_C_Shr_sqz(i,:)=reshape(RHS_C_Shr{i},[1,8]);
+    %         LHS_MatInd_Shr2_sqz(i,:)=reshape(LHS_MatInd_Shr2{i},[1,8]);
+    %     end
+    %     LHS_MatInd_Bus=zeros(nbus,2,2);                                  % \sum{-R\S} by buses
+    %     LHS_MatInd_Bus(:,1,1)=accumarray(indIdx,LHS_MatInd_Shr(:,1,1),[nbus,1]);
+    %     LHS_MatInd_Bus(:,1,2)=accumarray(indIdx,LHS_MatInd_Shr(:,1,2),[nbus,1]);
+    %     LHS_MatInd_Bus(:,2,1)=accumarray(indIdx,LHS_MatInd_Shr(:,2,1),[nbus,1]);
+    %     LHS_MatInd_Bus(:,2,2)=accumarray(indIdx,LHS_MatInd_Shr(:,2,2),[nbus,1]);
+
+    MInd0=zeros(nInd,1);
+    MInd1=ones(nInd,1);
+    LHS_MatInd_sqz=[R2,X2.*s0,-MInd1,MInd0,...
+        -X2.*s0,R2,MInd0,-MInd1,...
+        R1.*s0,X1.*s0,MInd1+kg1e,kb1e,...
+        -X1.*s0,R1.*s0,-kb1e,MInd1+kg1e,...
+        -s0,MInd0,-Ge,-Be,...
+        MInd0,-s0,Be,-Ge];   % 4*6 matrix [C,D;A,B]
+    LHS_MatInd_idx=reshape((1:24)',[4,6]);
+    temp0inv_sqz=LHS_MatInd_sqz(:,reshape(LHS_MatInd_idx([3,4],[1,2]),1,[]));
+    temp0inv_sqz_det=temp0inv_sqz(:,1).*temp0inv_sqz(:,4)-temp0inv_sqz(:,2).*temp0inv_sqz(:,3);
+    temp0_sqz=[temp0inv_sqz(:,4),-temp0inv_sqz(:,2),-temp0inv_sqz(:,3),temp0inv_sqz(:,1)]./repmat(temp0inv_sqz_det,[1,4]);% A^-1
+    indB_sqz=LHS_MatInd_sqz(:,reshape(LHS_MatInd_idx([3,4],[3,4,5,6]),1,[]));
+    LHS_MatInd_Shr2_sqz=[temp0_sqz(:,1).*indB_sqz(:,1)+temp0_sqz(:,3).*indB_sqz(:,2),temp0_sqz(:,2).*indB_sqz(:,1)+temp0_sqz(:,4).*indB_sqz(:,2),...
+        temp0_sqz(:,1).*indB_sqz(:,3)+temp0_sqz(:,3).*indB_sqz(:,4),temp0_sqz(:,2).*indB_sqz(:,3)+temp0_sqz(:,4).*indB_sqz(:,4),...
+        temp0_sqz(:,1).*indB_sqz(:,5)+temp0_sqz(:,3).*indB_sqz(:,6),temp0_sqz(:,2).*indB_sqz(:,5)+temp0_sqz(:,4).*indB_sqz(:,6),...
+        temp0_sqz(:,1).*indB_sqz(:,7)+temp0_sqz(:,3).*indB_sqz(:,8),temp0_sqz(:,2).*indB_sqz(:,7)+temp0_sqz(:,4).*indB_sqz(:,8)];% A^-1B
+    indC_sqz=LHS_MatInd_sqz(:,reshape(LHS_MatInd_idx([1,2],[1,2]),1,[]));
+    temp1_sqz=[indC_sqz(:,1).*temp0_sqz(:,1)+indC_sqz(:,3).*temp0_sqz(:,2),indC_sqz(:,2).*temp0_sqz(:,1)+indC_sqz(:,4).*temp0_sqz(:,2),...
+        indC_sqz(:,1).*temp0_sqz(:,3)+indC_sqz(:,3).*temp0_sqz(:,4),indC_sqz(:,2).*temp0_sqz(:,3)+indC_sqz(:,4).*temp0_sqz(:,4)];% CA^-1
+    temp2_sqz=LHS_MatInd_sqz(:,reshape(LHS_MatInd_idx([1,2],[3,4,5,6]),1,[]))-...
+        [temp1_sqz(:,1).*indB_sqz(:,1)+temp1_sqz(:,3).*indB_sqz(:,2),temp1_sqz(:,2).*indB_sqz(:,1)+temp1_sqz(:,4).*indB_sqz(:,2),...
+        temp1_sqz(:,1).*indB_sqz(:,3)+temp1_sqz(:,3).*indB_sqz(:,4),temp1_sqz(:,2).*indB_sqz(:,3)+temp1_sqz(:,4).*indB_sqz(:,4),...
+        temp1_sqz(:,1).*indB_sqz(:,5)+temp1_sqz(:,3).*indB_sqz(:,6),temp1_sqz(:,2).*indB_sqz(:,5)+temp1_sqz(:,4).*indB_sqz(:,6),...
+        temp1_sqz(:,1).*indB_sqz(:,7)+temp1_sqz(:,3).*indB_sqz(:,8),temp1_sqz(:,2).*indB_sqz(:,7)+temp1_sqz(:,4).*indB_sqz(:,8)];% L=D-CA^-1B=[R,S]
+    temp2_c12_sqz=temp2_sqz(:,1:4);
+    temp2_c34_sqz=temp2_sqz(:,5:8);
+    temp2_c12_sqz_det=temp2_c12_sqz(:,1).*temp2_c12_sqz(:,4)-temp2_c12_sqz(:,2).*temp2_c12_sqz(:,3);
+    temp2_c12_inv_sqz=[temp2_c12_sqz(:,4),-temp2_c12_sqz(:,2),-temp2_c12_sqz(:,3),temp2_c12_sqz(:,1)]./repmat(temp2_c12_sqz_det,[1,4]);
+    LHS_MatInd_Shr_sqz=-[temp2_c12_inv_sqz(:,1).*temp2_c34_sqz(:,1)+temp2_c12_inv_sqz(:,3).*temp2_c34_sqz(:,2),temp2_c12_inv_sqz(:,2).*temp2_c34_sqz(:,1)+temp2_c12_inv_sqz(:,4).*temp2_c34_sqz(:,2),...
+        temp2_c12_inv_sqz(:,1).*temp2_c34_sqz(:,3)+temp2_c12_inv_sqz(:,3).*temp2_c34_sqz(:,4),temp2_c12_inv_sqz(:,2).*temp2_c34_sqz(:,3)+temp2_c12_inv_sqz(:,4).*temp2_c34_sqz(:,4)];% -R\S
+    RHS_C_Shr_sqz=[temp2_c12_inv_sqz,...
+        -[temp2_c12_inv_sqz(:,1).*temp1_sqz(:,1)+temp2_c12_inv_sqz(:,3).*temp1_sqz(:,2),temp2_c12_inv_sqz(:,2).*temp1_sqz(:,1)+temp2_c12_inv_sqz(:,4).*temp1_sqz(:,2),...
+        temp2_c12_inv_sqz(:,1).*temp1_sqz(:,3)+temp2_c12_inv_sqz(:,3).*temp1_sqz(:,4),temp2_c12_inv_sqz(:,2).*temp1_sqz(:,3)+temp2_c12_inv_sqz(:,4).*temp1_sqz(:,4)]];% R\[I,-CA^-1]
+    % will be used to calculate algebric variabls for motors
+    LHS_MatInd_Bus_sqz=zeros(nbus,4);                                  % \sum{-R\S} by buses
+    LHS_MatInd_Bus_sqz(:,1)=accumarray(indIdx,LHS_MatInd_Shr_sqz(:,1),[nbus,1]);
+    LHS_MatInd_Bus_sqz(:,2)=accumarray(indIdx,LHS_MatInd_Shr_sqz(:,2),[nbus,1]);
+    LHS_MatInd_Bus_sqz(:,3)=accumarray(indIdx,LHS_MatInd_Shr_sqz(:,3),[nbus,1]);
+    LHS_MatInd_Bus_sqz(:,4)=accumarray(indIdx,LHS_MatInd_Shr_sqz(:,4),[nbus,1]);
+else
+    s=zeros(0,nlvl+1);
+end
+% Initialization of inductors is finished
+%------------------------------------------------------------------
+
+
+%------------------------------Initialization of ZIP load---------
+if ~isempty(zip)
+    nZip=size(zip,1);
+    zipIdx=zip(:,1);
+    IiL=zeros(nZip,nlvl+1);
+    BiL=zeros(nZip,nlvl+1);
+
+    % prepare the necessary matrix by blocks
+    Bi0=abs(V0(zipIdx));
+    JI=zip(:,6);
+    KI=-zip(:,9);
+    % current
+    Ii0L=Rzip0.*(JI+1j*KI).*V0(zipIdx)./Bi0;
+    Ji0L=real(Ii0L);
+    Ki0L=imag(Ii0L);
+
+    IiL(:,1)=Ii0L;
+    BiL(:,1)=Bi0;
+    % voltage
+    Ci0=real(V0(zipIdx));
+    Di0=imag(V0(zipIdx));
+
+    LHS_MatZip=[Rzip0.*JI./Bi0-Ci0.*Ji0L./Bi0./Bi0,-Rzip0.*KI./Bi0-Di0.*Ji0L./Bi0./Bi0,...
+        Rzip0.*KI./Bi0-Ci0.*Ki0L./Bi0./Bi0,Rzip0.*JI./Bi0-Di0.*Ki0L./Bi0./Bi0];
+    Mat_BZip=[Ci0./Bi0,Di0./Bi0];
+else
+    IiL=zeros(0,nlvl+1);
+end
+%------------------------------Initialization of ZIP load------------------
+%------------------------------Initialization of ZIP load is finished----------------
+
+
+%------------------------------Initialization of GEN------------------
+%------------------------------Start------------------------
+nSyn=size(syn,1);
+if ~isempty(syn)
+    synIdx =syn(:,1);% index number of Generators
+    wgb    =syn(:,4);% maybe the base value
+    modSyn =syn(:,5);% the order of generator models
+    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);
+
+    d=zeros(nSyn,nlvl+1); % delta
+    w=zeros(nSyn,nlvl+1); % omega
+    eq1=zeros(nSyn,nlvl+1); %eq'
+    eq2=zeros(nSyn,nlvl+1); %eq''
+    ed1=zeros(nSyn,nlvl+1); %ed'
+    ed2=zeros(nSyn,nlvl+1); %ed''
+    psiq=zeros(nSyn,nlvl+1); % not sure, only in 8th order model
+    psid=zeros(nSyn,nlvl+1); % not sure, only in 8th order model
+    JG=zeros(nSyn,nlvl+1);
+    KG=zeros(nSyn,nlvl+1);
+    IGq=zeros(nSyn,nlvl+1);
+    IGd=zeros(nSyn,nlvl+1);
+    VGq=zeros(nSyn,nlvl+1);
+    VGd=zeros(nSyn,nlvl+1);
+    Cd=zeros(nSyn,nlvl+1);
+    Sd=zeros(nSyn,nlvl+1);
+    Ef=zeros(nSyn,nlvl+1);
+    Pm=zeros(nSyn,nlvl+1);
+
+    cosd=cos(d0);
+    sind=sin(d0);
+    CG0=C0(synIdx);
+    DG0=D0(synIdx);
+    % the first value is given here, notice all are 8th order model
+    d(:,1)=d0;
+    w(:,1)=w0;
+    eq1(:,1)=eq10;
+    eq2(:,1)=eq20;
+    ed1(:,1)=ed10;
+    ed2(:,1)=ed20;
+    psiq(:,1)=psiq0;
+    psid(:,1)=psid0;
+
+    % transform between grid side and dq side
+
+    VGd(:,1)=sind.*CG0-cosd.*DG0;
+    VGq(:,1)=cosd.*CG0+sind.*DG0;
+    % now they are under dq side
+
+    Cd(:,1)=cosd; %  first order of cos(delta)
+    Sd(:,1)=sind; %  first order of sin(delta)
+    Ef(:,1)=Ef0;
+    Pm(:,1)=Pm0;
+
+    %check if controller exists
+    if ~isempty(Ef1)
+        Ef(:,2)=Ef1;
+    end
+    if ~isempty(Eq11)
+        eq1(:,2)=Eq11;
+    end
+    if ~isempty(Pm1)
+        Pm(:,2)=Pm1;
+    end
+
+    % notice that here truncated taylor is applied
+    % and this is the key differnet from Dt rule
+    % Here only at most 5 th order taylor series are considered for sin
+    % and cos function
+    [cosp,sinp,taylorN]=getTaylorPolynomials(d0,taylorN); % taylorN may be truncated
+
+    Mats=zeros(nSyn,4);
+    MatsR=zeros(nSyn,4);
+    MatsRs=zeros(nSyn,4);
+
+    % count the number for different kinds models
+    % ex: modelTag = [ 0 0 0 0 0 10 0 0].'
+    % ex: there are 10 gens using 6th order model
+    modelTag=accumarray(modSyn,ones(nSyn,1),[8,1]);
+
+    % determine the order of the model
+    % Do we really need for loop?
+    % the answer is yes since different gen may use different
+    % order model
+    for i=1:nSyn
+        % 8th order, no need to change
+        if modSyn(i)==8
+            IGd(i,1)=(eq20(i)-psid0(i))/Xgd2(i);
+            IGq(i,1)=(-ed20(i)-psiq0(i))/Xgq2(i);
+            Mats(i,:)=[sind(i),cosd(i),-cosd(i),sind(i)];
+        % 6th order
+        elseif modSyn(i)==6
+            % algebric equation to solve Id, Iq
+            IGd(i,1)=((ed20(i)-VGd(i,1))*Rga(i)+(eq20(i)-VGq(i,1))*Xgq2(i))/(Rga(i)*Rga(i)+Xgd2(i)*Xgq2(i));
+            IGq(i,1)=(-(ed20(i)-VGd(i,1))*Xgd2(i)+(eq20(i)-VGq(i,1))*Rga(i))/(Rga(i)*Rga(i)+Xgd2(i)*Xgq2(i));
+            % transform matrix (inverse version)
+            Mats(i,:)=[sind(i),cosd(i),-cosd(i),sind(i)];
+            % Here matrix is the inverse matrix, to understand this
+            % We have A*Ixy+B*Vxy = f => MatsR = A^-1, MatsRs = A^-1*B = MatsRs*B
+            % so Ixy = MatsR*f-MatsRs*Vxy, which is used later to
+            % eliminate Ixy when disturbance happens
+            MatsR(i,:)=[sind(i)*Rga(i)-cosd(i)*Xgd2(i),sind(i)*Xgq2(i)+cosd(i)*Rga(i),-cosd(i)*Rga(i)-sind(i)*Xgd2(i),-cosd(i)*Xgq2(i)+sind(i)*Rga(i)]/...
+                (Rga(i)*Rga(i)+Xgd2(i)*Xgq2(i));
+            MatsRs(i,:)=[MatsR(i,1)*sind(i)+MatsR(i,2)*cosd(i),-MatsR(i,1)*cosd(i)+MatsR(i,2)*sind(i),...
+                MatsR(i,3)*sind(i)+MatsR(i,4)*cosd(i),-MatsR(i,3)*cosd(i)+MatsR(i,4)*sind(i)];
+        % 5th order
+        elseif modSyn(i)==5
+            IGd(i,1)=((ed20(i)-VGd(i,1))*Rga(i)+(eq20(i)-VGq(i,1))*Xgq2(i))/(Rga(i)*Rga(i)+Xgd2(i)*Xgq2(i));
+            IGq(i,1)=(-(ed20(i)-VGd(i,1))*Xgd2(i)+(eq20(i)-VGq(i,1))*Rga(i))/(Rga(i)*Rga(i)+Xgd2(i)*Xgq2(i));
+            Mats(i,:)=[sind(i),cosd(i),-cosd(i),sind(i)];
+            MatsR(i,:)=[sind(i)*Rga(i)-cosd(i)*Xgd2(i),sind(i)*Xgq2(i)+cosd(i)*Rga(i),-cosd(i)*Rga(i)-sind(i)*Xgd2(i),-cosd(i)*Xgq2(i)+sind(i)*Rga(i)]/...
+                (Rga(i)*Rga(i)+Xgd2(i)*Xgq2(i));
+            MatsRs(i,:)=[MatsR(i,1)*sind(i)+MatsR(i,2)*cosd(i),-MatsR(i,1)*cosd(i)+MatsR(i,2)*sind(i),...
+                MatsR(i,3)*sind(i)+MatsR(i,4)*cosd(i),-MatsR(i,3)*cosd(i)+MatsR(i,4)*sind(i)];
+        % 4th order
+        elseif modSyn(i)==4
+            IGd(i,1)=((ed10(i)-VGd(i,1))*Rga(i)+(eq10(i)-VGq(i,1))*Xgq1(i))/(Rga(i)*Rga(i)+Xgd1(i)*Xgq1(i));
+            IGq(i,1)=(-(ed10(i)-VGd(i,1))*Xgd1(i)+(eq10(i)-VGq(i,1))*Rga(i))/(Rga(i)*Rga(i)+Xgd1(i)*Xgq1(i));
+            Mats(i,:)=[sind(i),cosd(i),-cosd(i),sind(i)];
+            MatsR(i,:)=[sind(i)*Rga(i)-cosd(i)*Xgd1(i),sind(i)*Xgq1(i)+cosd(i)*Rga(i),-cosd(i)*Rga(i)-sind(i)*Xgd1(i),-cosd(i)*Xgq1(i)+sind(i)*Rga(i)]/...
+                (Rga(i)*Rga(i)+Xgd1(i)*Xgq1(i));
+            MatsRs(i,:)=[MatsR(i,1)*sind(i)+MatsR(i,2)*cosd(i),-MatsR(i,1)*cosd(i)+MatsR(i,2)*sind(i),...
+                MatsR(i,3)*sind(i)+MatsR(i,4)*cosd(i),-MatsR(i,3)*cosd(i)+MatsR(i,4)*sind(i)];
+        % 3rd order
+        elseif modSyn(i)==3
+            IGd(i,1)=((-VGd(i,1))*Rga(i)+(eq10(i)-VGq(i,1))*Xgq(i))/(Rga(i)*Rga(i)+Xgd1(i)*Xgq(i));
+            IGq(i,1)=(-(-VGd(i,1))*Xgd1(i)+(eq10(i)-VGq(i,1))*Rga(i))/(Rga(i)*Rga(i)+Xgd1(i)*Xgq(i));
+            Mats(i,:)=[sind(i),cosd(i),-cosd(i),sind(i)];
+            MatsR(i,:)=[sind(i)*Rga(i)-cosd(i)*Xgd1(i),sind(i)*Xgq(i)+cosd(i)*Rga(i),-cosd(i)*Rga(i)-sind(i)*Xgd1(i),-cosd(i)*Xgq(i)+sind(i)*Rga(i)]/...
+                (Rga(i)*Rga(i)+Xgd1(i)*Xgq(i));
+            MatsRs(i,:)=[MatsR(i,1)*sind(i)+MatsR(i,2)*cosd(i),-MatsR(i,1)*cosd(i)+MatsR(i,2)*sind(i),...
+                MatsR(i,3)*sind(i)+MatsR(i,4)*cosd(i),-MatsR(i,3)*cosd(i)+MatsR(i,4)*sind(i)];
+        % classical model
+        elseif modSyn(i)==2
+            IGd(i,1)=((-VGd(i,1))*Rga(i)+(Ef0(i)-VGq(i,1))*Xgq(i))/(Rga(i)*Rga(i)+Xgd(i)*Xgq(i));
+            IGq(i,1)=(-(-VGd(i,1))*Xgd(i)+(Ef0(i)-VGq(i,1))*Rga(i))/(Rga(i)*Rga(i)+Xgd(i)*Xgq(i));
+            Mats(i,:)=[sind(i),cosd(i),-cosd(i),sind(i)];
+            MatsR(i,:)=[sind(i)*Rga(i)-cosd(i)*Xgd(i),sind(i)*Xgq(i)+cosd(i)*Rga(i),-cosd(i)*Rga(i)-sind(i)*Xgd(i),-cosd(i)*Xgq(i)+sind(i)*Rga(i)]/...
+                (Rga(i)*Rga(i)+Xgd(i)*Xgq(i));
+            MatsRs(i,:)=[MatsR(i,1)*sind(i)+MatsR(i,2)*cosd(i),-MatsR(i,1)*cosd(i)+MatsR(i,2)*sind(i),...
+                MatsR(i,3)*sind(i)+MatsR(i,4)*cosd(i),-MatsR(i,3)*cosd(i)+MatsR(i,4)*sind(i)];
+        end
+    end
+    % not sure how to use them now, but they are zeroth order of Ix and Iy
+    JG(:,1)= sind.*IGd(:,1)+cosd.*IGq(:,1);
+    KG(:,1)=-cosd.*IGd(:,1)+sind.*IGq(:,1);
+
+    % put previous matrix in a right place in all buses instead of only
+    % generator buses
+    MatGCD=-[sparse(synIdx,synIdx,MatsRs(:,1),nbus,nbus),sparse(synIdx,synIdx,MatsRs(:,2),nbus,nbus);...
+        sparse(synIdx,synIdx,MatsRs(:,3),nbus,nbus),sparse(synIdx,synIdx,MatsRs(:,4),nbus,nbus)];
+else
+    d=zeros(0,nlvl+1);
+    w=zeros(0,nlvl+1);
+    eq1=zeros(0,nlvl+1);
+    eq2=zeros(0,nlvl+1);
+    ed1=zeros(0,nlvl+1);
+    ed2=zeros(0,nlvl+1);
+    psiq=zeros(0,nlvl+1);
+    psid=zeros(0,nlvl+1);
+    JG=zeros(0,nlvl+1);
+    KG=zeros(0,nlvl+1);
+    IGq=zeros(0,nlvl+1);
+    IGd=zeros(0,nlvl+1);
+    VGq=zeros(0,nlvl+1);
+    VGd=zeros(0,nlvl+1);
+    Cd=zeros(0,nlvl+1);
+    Sd=zeros(0,nlvl+1);
+    Ef=zeros(0,nlvl+1);
+    Pm=zeros(0,nlvl+1);
+end
+%------------------------------Initialization of GEN------------------
+%------------------------------EnD------------------------------------
+
+
+
+%------------------------------Initialization of Exciter------------------
+%------------------------------START------------------------------------
+if ~isempty(exc)
+    nExc    =size(exc,1);
+    % All Type 3 AVR, a 3rd order controller
+    % for Type 3 AVR, avr0(:,1:3) are Vavrm, Vavrr, Vavrf,
+    % and avr0(:,4) is reference Vref (input for secondary voltage control).
+    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);
+
+    %here I need to check why Vavrref is time varing instead of constant
+    % memory is given to state variables of EXC
+    Vavrm  = zeros(nExc,nlvl+1);
+    Vavrr  = zeros(nExc,nlvl+1);
+    Vavrf  = zeros(nExc,nlvl+1);
+    Vavrref= zeros(nExc,nlvl+1);
+
+    % zeroth order value is given
+    Vavrm(:,1)=real(Vavrm0);
+    Vavrr(:,1)=real(Vavrr0);
+    Vavrf(:,1)=real(Vavrf0);
+    Vavrref(:,1)=real(Vavrref0);
+
+    % here Varref1 is given with syspara
+    if ~isempty(Varref1)
+        Vavrref(:,2)=Varref1;
+    end
+
+    %  non-windup limiter, check the limit
+    tavrMaxDiff=Vavrf(:,1)-VavrMax;
+    tavrMinDiff=Vavrf(:,1)-VavrMin;
+
+    % label values in different interval
+    avrSt=zeros(nExc,1);
+    avrSt(tavrMaxDiff>0)=1;
+    avrSt(tavrMinDiff<0)=-1;
+
+    % output after the limiter
+    Ef(excIdx(avrSt==-1),1)=VavrMin(avrSt==-1);
+    Ef(excIdx(avrSt== 1),1)=VavrMax(avrSt== 1);
+    Ef(excIdx(avrSt== 0),1)=Vavrf(avrSt==0,1);
+
+else
+    Vavrm=zeros(0,nlvl+1);
+    Vavrr=zeros(0,nlvl+1);
+    Vavrf=zeros(0,nlvl+1);
+    Vavrref=zeros(0,nlvl+1);
+end
+%------------------------------Initialization of Exciter------------------
+%------------------------------END------------------------------------
+
+
+
+
+%------------------------------Initialization of Turbing Governor------------------
+%------------------------------START------------------------------------
+if ~isempty(tg)
+    nTg  = size(tg,1);
+    % Type 2 Turbing governor.
+    % one DE, one AE and one limiter
+    tgIdx  = tg(:,1);
+
+    wtgref = tg(:,3);
+    Rtg    = tg(:,4);
+    Ttgmax = tg(:,5);
+    Ttgmin = tg(:,6);
+    Ttg2   = tg(:,7);
+    Ttg1   = tg(:,8);
+
+    tgovg  = zeros(nTg,nlvl+1); % tg
+    tgovm  = zeros(nTg,nlvl+1); % Tmi*
+    Tmech  = zeros(nTg,nlvl+1); % Tmi0
+
+    % zeroth value is given
+    tgovg(:,1)=real(tgovg0);
+    tgovm(:,1)=real(tgovm0);
+    Tmech(:,1)=real(tgovmech0);
+
+    if ~isempty(Tmech1)
+        Tmech(:,2)=Tmech1;
+    end
+
+    % check if limit is approached
+    tgovMaxDiff=tgovm(:,1)-Ttgmax;
+    tgovMinDiff=tgovm(:,1)-Ttgmin;
+
+    govSt=zeros(nTg,1);
+    govSt(tgovMaxDiff>0)=1;
+    govSt(tgovMinDiff<0)=-1;
+    % if limit is approached, set Pm to constant value
+    Pm(tgIdx(govSt==0),1)=tgovm(govSt==0,1);
+    Pm(tgIdx(govSt==1),1)=Ttgmax(govSt==1,1);
+    Pm(tgIdx(govSt==-1),1)=Ttgmin(govSt==-1,1);
+else
+    tgovg=zeros(0,nlvl+1);
+    tgovm=zeros(0,nlvl+1);
+    Tmech=zeros(0,nlvl+1);
+end
+%------------------------------Initialization of Turbing Governor------------------
+%------------------------------END------------------------------------
+
+% this part i don't quite understand. It looks like f denotes frequency
+% on every bus, is it relevant with frequency dependant load?
+% now i find that this is for dynamics of agc
+f=zeros(nbus,nlvl+1);
+f(:,1)=f0;
+synTag=zeros(nbus,1);
+synTag(syn(:,1))=1:nSyn;
+numSynOnBus=accumarray(syn(:,1),1,[nbus,1]);
+dpgTag=ones(nbus,1);
+for islIdx=1:nIslands
+    busIsland=find(islands==islIdx);
+    synTagIsland=synTag(busIsland);
+    wIsland=w(synTagIsland(synTagIsland~=0),1);
+    if ~isempty(wIsland)
+        f(busIsland,1)=mean(wIsland); % note that here the freq can be different
+        dpgTag(busIsland)=0;
+    end
+end
+
+%AGC part
+if ~isempty(agc)
+    agcExt=zeros(nbus,size(agc,2));
+    agcExt(agc(:,1),:)=agc;
+    dpg=zeros(nbus,nlvl+1);
+    dpg(:,1)=dpg0;
+    fdk=agcExt(:,2)+agcExt(:,3); %1/R+D
+else
+    dpg=zeros(nbus,nlvl+1);
+    fdk=zeros(nbus,1);
+end
+
+% this is long term dynamic, it seems that not considered here
+if ~isempty(cac)&&~isempty(cluster)
+
+else
+    qplt=zeros(0,nlvl+1);
+    vg=zeros(0,nlvl+1);
+end
+
+% freq relevant part induced by AGC
+FreqReal=sparse(1:nbus,1:nbus,-freqKeptTag.*fdk.*E0,nbus,nbus);
+FreqImag=sparse(1:nbus,1:nbus,-freqKeptTag.*fdk.*F0,nbus,nbus);
+Freq2freq=sparse([1:nbus,1:nbus],[1:nbus,frefs(islands)'],[ones(1,nbus),-ones(1,nbus)],nbus,nbus);
+
+Y11=-G;Y12=B;Y21=-B;Y22=-G;
+% Influence to Origianl Power flow
+YEF11=P0M+sparse(1:nbus,1:nbus,freqKeptTag.*(-fdk.*f0+dpg0),nbus,nbus);YEF12=-Q0M;YEF21=-Q0M;YEF22=-P0M-sparse(1:nbus,1:nbus,freqKeptTag.*(-fdk.*f0+dpg0),nbus,nbus);
+
+% Counting influence of ZIP load into Y matrix
+if ~isempty(zip)
+    Y11=Y11-sparse(1:nbus,1:nbus,accumarray(zipIdx,LHS_MatZip(:,1),[nbus,1]),nbus,nbus);
+    Y12=Y12-sparse(1:nbus,1:nbus,accumarray(zipIdx,LHS_MatZip(:,2),[nbus,1]),nbus,nbus);
+    Y21=Y21-sparse(1:nbus,1:nbus,accumarray(zipIdx,LHS_MatZip(:,3),[nbus,1]),nbus,nbus);
+    Y22=Y22-sparse(1:nbus,1:nbus,accumarray(zipIdx,LHS_MatZip(:,4),[nbus,1]),nbus,nbus);
+end
+YLHS=[Y11,Y12;Y21,Y22];
+
+% Counting influence of Motors into small Y matrix
+if ~isempty(ind)
+    YLHS=YLHS-...
+        [sparse(1:nbus,1:nbus,LHS_MatInd_Bus_sqz(:,1),nbus,nbus),sparse(1:nbus,1:nbus,LHS_MatInd_Bus_sqz(:,3),nbus,nbus);...
+        sparse(1:nbus,1:nbus,LHS_MatInd_Bus_sqz(:,2),nbus,nbus),sparse(1:nbus,1:nbus,LHS_MatInd_Bus_sqz(:,4),nbus,nbus)];
+end
+
+% Counting influence of generators into small Y matrix
+if ~isempty(syn)
+    YLHS=YLHS+MatGCD;
+end
+
+idxNonSw=find(busType~=2);
+idxNonSwxD=find(fswTagxD==0);
+idxNonSwD=find(busType~=2&fswTagxD==1);
+
+% This is the left hand side matrix totally
+LHS_mat=[YLHS([idxNonSw;idxNonSw+nbus],[idxNonSw;idxNonSw+nbus]),...
+    [YEF11(idxNonSw,idxNonSw),YEF12(idxNonSw,idxNonSw),-F0M(idxNonSw,ipv),FreqReal(idxNonSw,freqKeptTag==1);...
+    YEF21(idxNonSw,idxNonSw),YEF22(idxNonSw,idxNonSw),-E0M(idxNonSw,ipv),-FreqImag(idxNonSw,freqKeptTag==1)];...
+    C0M(ipv,idxNonSw),D0M(ipv,idxNonSw),sparse(npv,2*npq+3*npv+nFreqKept);...
+    E0M(idxNonSw,idxNonSw),-F0M(idxNonSw,idxNonSw),C0M(idxNonSw,idxNonSw),-D0M(idxNonSw,idxNonSw),sparse(npq+npv,npv+nFreqKept);...
+    F0M(idxNonSw,idxNonSw),E0M(idxNonSw,idxNonSw),D0M(idxNonSw,idxNonSw),C0M(idxNonSw,idxNonSw),sparse(npq+npv,npv+nFreqKept);...
+    sparse(sum(freqKeptTagxRef),size(idxNonSw,1)+size(idxNonSw,1)+2*npq+3*npv),Freq2freq(freqKeptTagxRef==1,freqKeptTag==1);...
+    sparse(size(idxNonSwD,1),size(idxNonSw,1)),sparse(1:size(idxNonSwD,1),idxNonSwD,ones(size(idxNonSwD,1),1),size(idxNonSwD,1),size(idxNonSw,1)),sparse(size(idxNonSwD,1),2*npq+3*npv+nFreqKept)];
+
+% if nbus<=500
+%     [L_LHS_mat,U_LHS_mat,p_LHS_mat]=lu(LHS_mat,'vector');
+% end
+
+
+% deterine if we use LU factoration
+% for this part, i assume the system algebrac equation is under a good
+% dcondition number and the dimension is not very high, otherwise LU will
+% be time consuming
+useLU=isfield(SysPara,'iden')&&isfield(SysPara,'p_amd');
+
+if useLU
+    if isempty(SysPara.p_amd)
+        p_amd = colamd (LHS_mat) ;
+        save([SysPara.iden,'.mat'],'p_amd');
+    else
+        p_amd=SysPara.p_amd;
+    end
+    MxI = speye (size(LHS_mat)) ;
+    MxQ = MxI (:, p_amd) ;
+    if IS_OCTAVE
+        [MxL,MxU,MxP,MxQx] = lu (LHS_mat*MxQ) ;
+    else
+        [MxL,MxU,MxP] = lu (LHS_mat*MxQ) ;
+    end
+end
+
Not enough input arguments.
+
+Error in Copy_of_hemMachinePFSalientcontinueDyn (line 48)
+[bus,sw,pv,pq,shunt,line,ind,zip,syn,exc,tg,agc,cac,cluster]=unfoldSysData(SysData);
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%%%this is the recursive part for computing high order of time series%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% strat interations nlvl: order of Taylor series
+for i=1:nlvl
+    % seq2  provides two columns from 0 to i, and i to 0
+    % seq2p provides two columns from 0 to i+1, and i+1 to 0
+    % seq3  provides 3 columns, the summary of each row is equal to i(binominal coefficients)
+    seq2=getseq(i,2);
+    seq2p=getseq(i+1,2);
+    seq3=getseq(i,3);
+    idxSeq2=sum(seq2==i,2);
+    idxSeq2x=sum(seq2(:,2)==i,2);
+    idxSeq2p=sum(seq2p>=i,2);
+    idxSeq3=sum(seq3==i,2);
+    idxSeq3x=sum(seq3(:,[2,3])==i,2);
+
+    % seq2R is usually used in constructing algebric equations
+    % seq2R provides two columns from 1 to i-1, and i-1 to 1
+    % seq2x provides two columns from 1 to i, and i-1 to 0
+    % seq2m provides two columns from 0 to i-1, and i-1 to 0
+    % seq2mm provides two columns from 0 to i-2, and i-2 to 0
+    seq2R=seq2(idxSeq2==0,:);
+    seq2x=seq2(idxSeq2x==0,:);
+    seq2m=getseq(i-1,2);
+    seq2mm=getseq(i-2,2);
+
+    RHSILr=zeros(nbus,1);
+    RHSILi=zeros(nbus,1);
+
+    % This part is for induction motor
+    if ~isempty(ind)
+        % package right hand side vector at every iteration
+        rhsM=sum(Vm(:,seq2R(:,1)+1).*s(:,seq2R(:,2)+1),2)-1j*X2.*sum(IR(:,seq2R(:,1)+1).*s(:,seq2R(:,2)+1),2);
+        %         rhsI=-real(sum(IR(:,seq2R(:,1)+1).*conj(IR(:,seq2R(:,2)+1)),2))+...
+        %             (T1.*sum(s(:,seq2R(:,1)+1).*s(:,seq2R(:,2)+1),2)+T2.*sum(s(:,seq3R(:,1)+1).*s(:,seq3R(:,2)+1).*s(:,seq3R(:,3)+1),2))./R2+...
+        %             (T0.*s(:,i)+T1.*sum(s(:,seq2m(:,1)+1).*s(:,seq2m(:,2)+1),2)+T2.*sum(s(:,seq3m(:,1)+1).*s(:,seq3m(:,2)+1).*s(:,seq3m(:,3)+1),2)).*Rm./R2;
+
+        %         s(:,i+1)=(Rind0.*(T0.*s(:,i)+T1.*sum(s(:,seq2m(:,1)+1).*s(:,seq2m(:,2)+1),2)+T2.*sum(s(:,seq3m(:,1)+1).*s(:,seq3m(:,2)+1).*s(:,seq3m(:,3)+1),2))...
+        %             -real(sum(IR(:,seq2m(:,1)+1).*conj(IR(:,seq2m(:,2)+1)),2)).*R2-2*Hm.*sum(repmat(seq2R(:,1)',nInd,1).*s(:,seq2R(:,1)+1).*s(:,seq2R(:,2)+1),2))...
+        %             ./(2*Hm.*s(:,1)*i);
+        %         if i>=2
+        %             s(:,i+1)=s(:,i+1)+...
+        %                 Rind1.*(T0.*s(:,i-1)+T1.*sum(s(:,seq2mm(:,1)+1).*s(:,seq2mm(:,2)+1),2)+T2.*sum(s(:,seq3mm(:,1)+1).*s(:,seq3mm(:,2)+1).*s(:,seq3mm(:,3)+1),2))...
+        %                 ./(2*Hm.*s(:,1)*i);
+        %         end
+
+        % update the high order of slip, a special setting is required for
+        % low order when i<2
+        s(:,i+1)=(Rind0.*(T1.*s(:,i)+T2.*sum(s(:,seq2m(:,1)+1).*s(:,seq2m(:,2)+1),2))-real(sum(Vm(:,seq2m(:,1)+1).*conj(IR(:,seq2m(:,2)+1)),2)))./(2*Hm*i);
+        if i>=2
+            s(:,i+1)=s(:,i+1)+...
+                Rind1.*(T1.*s(:,i-1)+T2.*sum(s(:,seq2mm(:,1)+1).*s(:,seq2mm(:,2)+1),2))...
+                ./(2*Hm*i);
+        end
+        if i==1
+            s(:,i+1)=s(:,i+1)+Rind0.*T0./(2*Hm*i);
+        end
+        if i==2
+            s(:,i+1)=s(:,i+1)+Rind1.*T0./(2*Hm*i);
+        end
+        % for dynamic model, Right hand side vector is required a update
+        addenRhs=Vm(:,1).*s(:,i+1)-1j*X2.*IR(:,1).*s(:,i+1);
+
+        %         rhsBus=zeros(2,nInd);
+        %         for j=1:nInd
+        %             rhsBus(:,j)=RHS_C_Shr{j}*[real(rhsM(j)+addenRhs(j));imag(rhsM(j)+addenRhs(j));0;0];
+        %         end
+
+        % count the influence of dynamic of slip into rigt hand side vector
+        tempRhsInd=rhsM+addenRhs;
+        rhsBus=[RHS_C_Shr_sqz(:,1).*real(tempRhsInd)+RHS_C_Shr_sqz(:,3).*imag(tempRhsInd),RHS_C_Shr_sqz(:,2).*real(tempRhsInd)+RHS_C_Shr_sqz(:,4).*imag(tempRhsInd)]';
+
+        %accumulate currents IL
+        RHSILr=accumarray(indIdx,rhsBus(1,:)',[nbus,1]);
+        RHSILi=accumarray(indIdx,rhsBus(2,:)',[nbus,1]);
+
+        %             rhsBus=zeros(5,nInd);
+        %             rhsM=sum(Vm(:,seq2R(:,1)+1).*s(:,seq2R(:,2)+1),2)-1j*X2.*sum(IR(:,seq2R(:,1)+1).*s(:,seq2R(:,2)+1),2);
+        %             rhsImod=Rind1.*(T1.*s(:,i)+T2.*sum(s(:,seq2m(:,1)+1).*s(:,seq2m(:,2)+1),2))+Rind0.*T2.*sum(s(:,seq2R(:,1)+1).*s(:,seq2R(:,2)+1),2)-...
+        %                 real(sum(V(indIdx,seq2R(:,1)+1).*conj(IR(:,seq2R(:,2)+1)),2))+...
+        %                 real(sum(IL(:,seq2R(:,1)+1).*conj(IR(:,seq2R(:,2)+1)),2).*Z1);
+        %             if i==1
+        %                 rhsImod=rhsImod+Rind1.*T0;
+        %             end
+        %             rhsIL=V(indIdx,i).*Yeind1-IL(:,i).*Ye1ind1;
+        %             for j=1:nInd
+        %                 rhsBus(:,j)=squeeze(RHS_C_Shr(j,:,:))*[real(rhsM(j));imag(rhsM(j));rhsImod(j);real(rhsIL(j));imag(rhsIL(j))];
+        %             end
+        %             RHSILr=accumarray(indIdx,rhsBus(3,:)',[nbus,1]);
+        %             RHSILi=accumarray(indIdx,rhsBus(4,:)',[nbus,1]);
+    end
+
+    % strat update ZIP load into currents
+    RHSIiLr=zeros(nbus,1);
+    RHSIiLi=zeros(nbus,1);
+    if ~isempty(zip)
+        RHS_BZip=(real(sum(V(zipIdx,seq2R(:,1)+1).*conj(V(zipIdx,seq2R(:,2)+1)),2))-sum(BiL(:,seq2R(:,1)+1).*BiL(:,seq2R(:,2)+1),2))./Bi0/2;
+        RHZ_BIConv=sum(IiL(:,seq2R(:,1)+1).*BiL(:,seq2R(:,2)+1),2);
+        RHSILr_full=Rzip1.*(JI.*real(V(zipIdx,i))-KI.*imag(V(zipIdx,i)))./Bi0-real(RHZ_BIConv)./Bi0-Ji0L.*RHS_BZip./Bi0;
+        RHSILi_full=Rzip1.*(KI.*real(V(zipIdx,i))+JI.*imag(V(zipIdx,i)))./Bi0-imag(RHZ_BIConv)./Bi0-Ki0L.*RHS_BZip./Bi0;
+        RHSIiLr=accumarray(zipIdx,RHSILr_full,[nbus,1]);
+        RHSIiLi=accumarray(zipIdx,RHSILi_full,[nbus,1]);
+    end
+
+    % Start uodate generators
+    RHSIGr=zeros(nbus,1);
+    RHSIGi=zeros(nbus,1);
+    if ~isempty(syn)
+        RhsEd=zeros(nSyn,1);
+        RhsEq=zeros(nSyn,1);
+        IGdAdd=zeros(nSyn,1);
+        IGqAdd=zeros(nSyn,1);
+        % select different models for generators
+        if modelTag(8)>0
+            d(modSyn==8,i+1)=(wgb(modSyn==8).*w(modSyn==8,i))/i;
+            w(modSyn==8,i+1)=(Pm(modSyn==8,i)-...
+                (sum(psid(modSyn==8,seq2m(:,1)+1).*IGq(modSyn==8,seq2m(:,2)+1),2)-sum(psiq(modSyn==8,seq2m(:,1)+1).*IGd(modSyn==8,seq2m(:,2)+1),2))-...
+                Dg(modSyn==8).*w(modSyn==8,i))./Mg(modSyn==8)/i;
+            psid(modSyn==8,i+1)=wgb(modSyn==8).*(Rga(modSyn==8).*IGd(modSyn==8,i)+psiq(modSyn==8,i)+VGd(modSyn==8,i))/i;
+            psiq(modSyn==8,i+1)=wgb(modSyn==8).*(Rga(modSyn==8).*IGq(modSyn==8,i)-psid(modSyn==8,i)+VGq(modSyn==8,i))/i;
+            eq1(modSyn==8,i+1)=(-eq1(modSyn==8,i)-(Xgd(modSyn==8)-Xgd1(modSyn==8)-gammad(modSyn==8)).*IGd(modSyn==8,i)+(1-TgAA(modSyn==8)./Tgd1(modSyn==8)).*Ef(modSyn==8,i))./Tgd1(modSyn==8)/i;
+            ed1(modSyn==8,i+1)=(-ed1(modSyn==8,i)+(Xgq(modSyn==8)-Xgq1(modSyn==8)-gammaq(modSyn==8)).*IGq(modSyn==8,i))./Tgq1(modSyn==8)/i;
+            eq2(modSyn==8,i+1)=(-eq2(modSyn==8,i)+eq1(modSyn==8,i)-(Xgd1(modSyn==8)-Xgd2(modSyn==8)+gammad(modSyn==8)).*IGd(modSyn==8,i)+TgAA(modSyn==8)./Tgd1(modSyn==8).*Ef(modSyn==8,i))./Tgd2(modSyn==8)/i;
+            ed2(modSyn==8,i+1)=(-ed2(modSyn==8,i)+ed1(modSyn==8,i)+(Xgq1(modSyn==8)-Xgq2(modSyn==8)+gammaq(modSyn==8)).*IGq(modSyn==8,i))./Tgq2(modSyn==8)/i;
+            IGdAdd(modSyn==8)=(eq2(modSyn==8,i+1)-psid(modSyn==8,i+1))./Xgd2(modSyn==8);
+            IGqAdd(modSyn==8)=(-ed2(modSyn==8,i+1)-psiq(modSyn==8,i+1))./Xgq2(modSyn==8);
+        end
+        if modelTag(6)>0
+            d(modSyn==6,i+1)=(wgb(modSyn==6).*w(modSyn==6,i))/i;
+            w(modSyn==6,i+1)=(Pm(modSyn==6,i)-...
+                (sum(VGq(modSyn==6,seq2m(:,1)+1).*IGq(modSyn==6,seq2m(:,2)+1),2)+sum(VGd(modSyn==6,seq2m(:,1)+1).*IGd(modSyn==6,seq2m(:,2)+1),2)+...
+                Rga(modSyn==6).*(sum(IGq(modSyn==6,seq2m(:,1)+1).*IGq(modSyn==6,seq2m(:,2)+1),2)+sum(IGd(modSyn==6,seq2m(:,1)+1).*IGd(modSyn==6,seq2m(:,2)+1),2)))-...
+                Dg(modSyn==6).*w(modSyn==6,i))./Mg(modSyn==6)/i;
+            eq1(modSyn==6,i+1)=(-eq1(modSyn==6,i)-(Xgd(modSyn==6)-Xgd1(modSyn==6)-gammad(modSyn==6)).*IGd(modSyn==6,i)+(1-TgAA(modSyn==6)./Tgd1(modSyn==6)).*Ef(modSyn==6,i))./Tgd1(modSyn==6)/i;
+            ed1(modSyn==6,i+1)=(-ed1(modSyn==6,i)+(Xgq(modSyn==6)-Xgq1(modSyn==6)-gammaq(modSyn==6)).*IGq(modSyn==6,i))./Tgq1(modSyn==6)/i;
+            eq2(modSyn==6,i+1)=(-eq2(modSyn==6,i)+eq1(modSyn==6,i)-(Xgd1(modSyn==6)-Xgd2(modSyn==6)+gammad(modSyn==6)).*IGd(modSyn==6,i)+TgAA(modSyn==6)./Tgd1(modSyn==6).*Ef(modSyn==6,i))./Tgd2(modSyn==6)/i;
+            ed2(modSyn==6,i+1)=(-ed2(modSyn==6,i)+ed1(modSyn==6,i)+(Xgq1(modSyn==6)-Xgq2(modSyn==6)+gammaq(modSyn==6)).*IGq(modSyn==6,i))./Tgq2(modSyn==6)/i;
+            RhsEd(modSyn==6)=ed2(modSyn==6,i+1);
+            RhsEq(modSyn==6)=eq2(modSyn==6,i+1);
+        end
+        if modelTag(5)>0
+            d(modSyn==5,i+1)=(wgb(modSyn==5).*w(modSyn==5,i))/i;
+            w(modSyn==5,i+1)=(Pm(modSyn==5,i)-...
+                (sum(VGq(modSyn==5,seq2m(:,1)+1).*IGq(modSyn==5,seq2m(:,2)+1),2)+sum(VGd(modSyn==5,seq2m(:,1)+1).*IGd(modSyn==5,seq2m(:,2)+1),2)+...
+                Rga(modSyn==5).*(sum(IGq(modSyn==5,seq2m(:,1)+1).*IGq(modSyn==5,seq2m(:,2)+1),2)+sum(IGd(modSyn==5,seq2m(:,1)+1).*IGd(modSyn==5,seq2m(:,2)+1),2)))-...
+                Dg(modSyn==5).*w(modSyn==5,i))./Mg(modSyn==5)/i;
+            eq1(modSyn==5,i+1)=(-eq1(modSyn==5,i)-(Xgd(modSyn==5)-Xgd1(modSyn==5)-gammad(modSyn==5)).*IGd(modSyn==5,i)+(1-TgAA(modSyn==5)./Tgd1(modSyn==5)).*Ef(modSyn==5,i))./Tgd1(modSyn==5)/i;
+            eq2(modSyn==5,i+1)=(-eq2(modSyn==5,i)+eq1(modSyn==5,i)-(Xgd1(modSyn==5)-Xgd2(modSyn==5)+gammad(modSyn==5)).*IGd(modSyn==5,i)+TgAA(modSyn==5)./Tgd1(modSyn==5).*Ef(modSyn==5,i))./Tgd2(modSyn==5)/i;
+            ed2(modSyn==5,i+1)=(-ed2(modSyn==5,i)+(Xgq(modSyn==5)-Xgq2(modSyn==5)).*IGq(modSyn==5,i))./Tgq2(modSyn==5)/i;
+            RhsEd(modSyn==5)=ed2(modSyn==5,i+1);
+            RhsEq(modSyn==5)=eq2(modSyn==5,i+1);
+        end
+        if modelTag(4)>0
+            d(modSyn==4,i+1)=(wgb(modSyn==4).*w(modSyn==4,i))/i;
+            w(modSyn==4,i+1)=(Pm(modSyn==4,i)-...
+                (sum(VGq(modSyn==4,seq2m(:,1)+1).*IGq(modSyn==4,seq2m(:,2)+1),2)+sum(VGd(modSyn==4,seq2m(:,1)+1).*IGd(modSyn==4,seq2m(:,2)+1),2)+...
+                Rga(modSyn==4).*(sum(IGq(modSyn==4,seq2m(:,1)+1).*IGq(modSyn==4,seq2m(:,2)+1),2)+sum(IGd(modSyn==4,seq2m(:,1)+1).*IGd(modSyn==4,seq2m(:,2)+1),2)))-...
+                Dg(modSyn==4).*w(modSyn==4,i))./Mg(modSyn==4)/i;
+            eq1(modSyn==4,i+1)=(-eq1(modSyn==4,i)-(Xgd(modSyn==4)-Xgd1(modSyn==4)).*IGd(modSyn==4,i)+Ef(modSyn==4,i))./Tgd1(modSyn==4)/i;
+            ed1(modSyn==4,i+1)=(-ed1(modSyn==4,i)+(Xgq(modSyn==4)-Xgq1(modSyn==4)).*IGq(modSyn==4,i))./Tgq1(modSyn==4)/i;
+            RhsEd(modSyn==4)=ed1(modSyn==4,i+1);
+            RhsEq(modSyn==4)=eq1(modSyn==4,i+1);
+        end
+        if modelTag(3)>0
+            d(modSyn==3,i+1)=(wgb(modSyn==3).*w(modSyn==3,i))/i;
+            w(modSyn==3,i+1)=(Pm(modSyn==3,i)-...
+                (sum(VGq(modSyn==3,seq2m(:,1)+1).*IGq(modSyn==3,seq2m(:,2)+1),2)+sum(VGd(modSyn==3,seq2m(:,1)+1).*IGd(modSyn==3,seq2m(:,2)+1),2)+...
+                Rga(modSyn==3).*(sum(IGq(modSyn==3,seq2m(:,1)+1).*IGq(modSyn==3,seq2m(:,2)+1),2)+sum(IGd(modSyn==3,seq2m(:,1)+1).*IGd(modSyn==3,seq2m(:,2)+1),2)))-...
+                Dg(modSyn==3).*w(modSyn==3,i))./Mg(modSyn==3)/i;
+            eq1(modSyn==3,i+1)=(-eq1(modSyn==3,i)-(Xgd(modSyn==3)-Xgd1(modSyn==3)).*IGd(modSyn==3,i)+Ef(modSyn==3,i))./Tgd1(modSyn==3)/i;
+            RhsEd(modSyn==3)=0;
+            RhsEq(modSyn==3)=eq1(modSyn==3,i+1);
+        end
+        if modelTag(2)>0
+            d(modSyn==2,i+1)=(wgb(modSyn==2).*w(modSyn==2,i))/i;
+            w(modSyn==2,i+1)=(Pm(modSyn==2,i)-...
+                (sum(VGq(modSyn==2,seq2m(:,1)+1).*IGq(modSyn==2,seq2m(:,2)+1),2)+sum(VGd(modSyn==2,seq2m(:,1)+1).*IGd(modSyn==2,seq2m(:,2)+1),2)+...
+                Rga(modSyn==2).*(sum(IGq(modSyn==2,seq2m(:,1)+1).*IGq(modSyn==2,seq2m(:,2)+1),2)+sum(IGd(modSyn==2,seq2m(:,1)+1).*IGd(modSyn==2,seq2m(:,2)+1),2)))-...
+                Dg(modSyn==2).*w(modSyn==2,i))./Mg(modSyn==2)/i;
+            RhsEd(modSyn==2)=0;
+            RhsEq(modSyn==2)=eq1(modSyn==2,i+1);
+        end
+        % this part may be different from DT
+        AG0=cosp(:,2).*d(:,i+1);
+        BG0=sinp(:,2).*d(:,i+1);
+        % here multi-convolution is utilized as sine function is
+        % approxiamted as a taylor series of delta
+        if taylorN>=2
+            AG0=AG0+cosp(:,3).*sum(d(:,seq2(:,1)+1).*d(:,seq2(:,2)+1),2);
+            BG0=BG0+sinp(:,3).*sum(d(:,seq2(:,1)+1).*d(:,seq2(:,2)+1),2);
+        end
+        if taylorN>=3
+            AG0=AG0+cosp(:,4).*sum(d(:,seq3(:,1)+1).*d(:,seq3(:,2)+1).*d(:,seq3(:,3)+1),2);
+            BG0=BG0+sinp(:,4).*sum(d(:,seq3(:,1)+1).*d(:,seq3(:,2)+1).*d(:,seq3(:,3)+1),2);
+        end
+        if taylorN>=4
+            seq4=getseq(i,4);
+            AG0=AG0+cosp(:,5).*sum(d(:,seq4(:,1)+1).*d(:,seq4(:,2)+1).*d(:,seq4(:,3)+1).*d(:,seq4(:,4)+1),2);
+            BG0=BG0+sinp(:,5).*sum(d(:,seq4(:,1)+1).*d(:,seq4(:,2)+1).*d(:,seq4(:,3)+1).*d(:,seq4(:,4)+1),2);
+        end
+
+        % high order coefficients of cos(delta) and sin(delta)
+        Cd(:,i+1)=AG0;
+        Sd(:,i+1)=BG0;
+
+        VGdCr=sum(Cd(:,seq2x(:,1)+1).*VGd(:,seq2x(:,2)+1),2);% Vd*cosdta
+        VGqCr=sum(Cd(:,seq2x(:,1)+1).*VGq(:,seq2x(:,2)+1),2);% Vq*cosdta
+        VGdSr=sum(Sd(:,seq2x(:,1)+1).*VGd(:,seq2x(:,2)+1),2);% Vd*sindta
+        VGqSr=sum(Sd(:,seq2x(:,1)+1).*VGq(:,seq2x(:,2)+1),2);% Vq*sindta
+        JCr=sum(Cd(:,seq2x(:,1)+1).*JG(:,seq2x(:,2)+1),2);% similar, for currents
+        KCr=sum(Cd(:,seq2x(:,1)+1).*KG(:,seq2x(:,2)+1),2);
+        JSr=sum(Sd(:,seq2x(:,1)+1).*JG(:,seq2x(:,2)+1),2);
+        KSr=sum(Sd(:,seq2x(:,1)+1).*KG(:,seq2x(:,2)+1),2);
+
+        RHSIGxr=-(MatsRs(:,1).*(-VGdSr-VGqCr)+MatsRs(:,2).*(VGdCr-VGqSr))+...
+            (MatsR(:,1).*RhsEd+MatsR(:,2).*RhsEq)-(Mats(:,1).*(JSr-KCr)+Mats(:,2).*(JCr+KSr))+(Mats(:,1).*IGdAdd+Mats(:,2).*IGqAdd);
+        RHSIGxi=-(MatsRs(:,3).*(-VGdSr-VGqCr)+MatsRs(:,4).*(VGdCr-VGqSr))+...
+            (MatsR(:,3).*RhsEd+MatsR(:,4).*RhsEq)-(Mats(:,3).*(JSr-KCr)+Mats(:,4).*(JCr+KSr))+(Mats(:,3).*IGdAdd+Mats(:,4).*IGqAdd);
+        % current injections from generators IG
+        RHSIGr=accumarray(synIdx,RHSIGxr,[nbus,1]);
+        RHSIGi=accumarray(synIdx,RHSIGxi,[nbus,1]);
+    end
+    % update exciter, 3 state variables
+    if ~isempty(exc)
+        Vavrm(:,i+1)=(Vmag(synIdx(excIdx),i)-Vavrm(:,i))./Tavrr/i;
+        Vavrr(:,i+1)=(muavr0.*(1-Tavr1./Tavr2).*(Vavrref(:,i)-Vavrm(:,i))-Vavrr(:,i))./Tavr2/i;
+        Vavrf(:,i+1)=((vavrf0.*Vmag(synIdx(excIdx),i)+...
+            sum(Vavrr(:,seq2m(:,1)+1).*Vmag(synIdx(excIdx),seq2m(:,2)+1),2)+...
+            muavr0.*Tavr1./Tavr2.*sum((Vavrref(:,seq2m(:,1)+1)-Vavrm(:,seq2m(:,1)+1)).*Vmag(synIdx(excIdx),seq2m(:,2)+1),2))./Vavr0-Vavrf(:,i))./Tavre/i;
+        Ef(excIdx(avrSt==-1),i+1)=0;
+        Ef(excIdx(avrSt== 1),i+1)=0;
+        Ef(excIdx(avrSt== 0),i+1)=Vavrf(avrSt==0,i+1);
+    end
+
+    % update agc, one state variables
+    if ~isempty(agc)
+        dpg(:,i+1)=-f(:,i).*agcExt(:,4)/i;
+        for islIdx=1:nIslands
+            busIsland=find(islands==islIdx);
+            synTagIsland=synTag(busIsland);
+            wIsland=w(synTagIsland(synTagIsland~=0),i+1);
+            if ~isempty(wIsland)
+                f(busIsland,i+1)=mean(wIsland); % note that here the freq can be different
+            end
+        end % TODO: steady-state model
+
+        % update generator participation part from agc
+        if ~isempty(syn) %dynamic model (synchronous generators)
+            if ~isempty(tg)
+                Tmech(:,i+1)=Tmech(:,i+1)+dpg(syn(tg(:,1),1),i+1)./numSynOnBus(syn(tg(:,1),1));
+            end
+            Pm(:,i+1)=Pm(:,i+1)+dpg(syn(:,1),i+1)./numSynOnBus(syn(:,1));
+        end
+    end
+    % update Turbine, 2 state variables
+    if ~isempty(tg)
+        tgovg(:,i+1)=(-(1-Ttg1./Ttg2).*w(tgIdx,i)./Rtg-tgovg(:,i))./Ttg2/i;
+        tgovm(:,i+1)=tgovg(:,i+1)-Ttg1./Ttg2.*w(tgIdx,i+1)./Rtg+Tmech(:,i+1);
+
+        Pm(tgIdx(govSt==0),i+1)=tgovm(govSt==0,i+1);
+        Pm(tgIdx(govSt==1),i+1)=0;
+        Pm(tgIdx(govSt==-1),i+1)=0;
+    end
+
+    % HEM Body
+    RHS1=sum((-P(:,seq2(:,1)+1)+1j*(Q(:,seq2(:,1)+1)+Qxtra(:,seq2(:,1)+1))).*conj(W(:,seq2(:,2)+1)),2)+...
+        freqKeptTag.*sum(-dpg(:,seq2(:,1)+1).*conj(W(:,seq2(:,2)+1)),2)+...
+        freqKeptTag.*fdk.*sum(f(:,seq2R(:,1)+1).*conj(W(:,seq2R(:,2)+1)),2)+Ysh1.*V(:,i)+Ytr1*V(:,i);
+    RHS2=-0.5*real(sum(V(:,seq2R(:,1)+1).*conj(V(:,seq2R(:,2)+1)),2));
+    RHS3=sum(-W(:,seq2R(:,1)+1).*V(:,seq2R(:,2)+1),2);
+
+
+    if i==1
+        RHS2=RHS2+0.5*VspSq2(:,2);
+    end
+
+    compactRHS1=RHS1(busType~=2);
+    compactRHS1=compactRHS1+Y(busType~=2,isw)*real(V(isw,i+1));
+    % combine all current injection involing Motor, zip load, and Generators
+    RHS=[real(compactRHS1)+RHSILr(busType~=2)+RHSIiLr(busType~=2)-RHSIGr(busType~=2);...
+        imag(compactRHS1)+RHSILi(busType~=2)+RHSIiLi(busType~=2)-RHSIGi(busType~=2);...
+        RHS2(ipv);...
+        real(RHS3(busType~=2));...
+        imag(RHS3(busType~=2));...
+        zeros(sum(freqKeptTagxRef),1);...
+        zeros(size(idxNonSwD,1),1)];
+    % solve AE, notice that every time we need to solve Ax(k) =b(k), which
+    % means that A in invariant for every order. so we only need to rebulid
+    % b every iteration
+    if useLU
+        if IS_OCTAVE
+            x = real(MxQ * MxQx* (MxU \ (MxL \ (MxP * RHS)))) ;
+        else
+            x =real( MxQ * (MxU \ (MxL \ (MxP * RHS)))) ;
+        end
+    else
+        x=real(LHS_mat\RHS);
+    end
+
+    % x= [V;W;Q_pv;f]
+    xC=real(V(:,i+1));
+    xD=imag(V(:,i+1));
+    xC(idxNonSw)=x(1:(npq+npv));
+    xD(idxNonSw)=x(((npq+npv)+1):(2*(npq+npv)));
+    V(:,i+1)=xC+1j*xD;
+    W(busType~=2,i+1)=x((2*(npq+npv)+1):(3*(npq+npv)))+...
+        1j*x((3*(npq+npv)+1):(4*(npq+npv)));
+    Q(ipv,i+1)=x((4*(npq+npv)+1):(4*(npq+npv)+npv));
+    f(freqKeptTag==1,i+1)=x((4*(npq+npv)+npv+1):end);
+
+    Vmag(:,i+1)=(sum(V(:,seq2(:,1)+1).*conj(V(:,seq2(:,2)+1)),2)-sum(Vmag(:,seq2R(:,1)+1).*Vmag(:,seq2R(:,2)+1),2))./Vmag(:,1)/2; % Calculate voltage magnitude
+
+    % now update the Algebric variables for motors:IL,IR,VM
+    if ~isempty(ind)
+        %         for j=1:nInd
+        %             tempIL=squeeze(LHS_MatInd_Shr(j,:,:))*[real(V(indIdx(j),i+1));imag(V(indIdx(j),i+1))]+rhsBus(:,j);
+        %             tempIRs=-LHS_MatInd_Shr2{j}*[tempIL;real(V(indIdx(j),i+1));imag(V(indIdx(j),i+1))];
+        %             IL(j,i+1)=tempIL(1)+1j*tempIL(2);
+        %             IR(j,i+1)=tempIRs(1)+1j*tempIRs(2);
+        %             Vm(j,i+1)=V(indIdx(j),i+1)-IL(j,i+1)*Z1(j);
+        %         end
+        tempILvr=LHS_MatInd_Shr_sqz(:,1).*real(V(indIdx,i+1))+LHS_MatInd_Shr_sqz(:,3).*imag(V(indIdx,i+1))+rhsBus(1,:)';
+        tempILvi=LHS_MatInd_Shr_sqz(:,2).*real(V(indIdx,i+1))+LHS_MatInd_Shr_sqz(:,4).*imag(V(indIdx,i+1))+rhsBus(2,:)';
+        tempIRsvr=-sum(LHS_MatInd_Shr2_sqz(:,[1,3,5,7]).*[tempILvr,tempILvi,real(V(indIdx,i+1)),imag(V(indIdx,i+1))],2);
+        tempIRsvi=-sum(LHS_MatInd_Shr2_sqz(:,[2,4,6,8]).*[tempILvr,tempILvi,real(V(indIdx,i+1)),imag(V(indIdx,i+1))],2);
+        IL(:,i+1)=tempILvr+1j*tempILvi;
+        IR(:,i+1)=tempIRsvr+1j*tempIRsvi;
+        Vm(:,i+1)=V(indIdx,i+1)-IL(:,i+1).*Z1;
+    end
+
+    % now update the Algebric variables for ZIP loads
+    if ~isempty(zip)
+        IiL(:,i+1)=(LHS_MatZip(:,1)+1j*LHS_MatZip(:,3)).*real(V(zipIdx,i+1))+(LHS_MatZip(:,2)+1j*LHS_MatZip(:,4)).*imag(V(zipIdx,i+1))+(RHSILr_full+1j*RHSILi_full);
+        BiL(:,i+1)=Mat_BZip(:,1).*real(V(zipIdx,i+1))+Mat_BZip(:,2).*imag(V(zipIdx,i+1))+RHS_BZip;
+    end
+
+    % now update the Algebric variables for Generators: Vd,Vq, Id, Iq
+    if ~isempty(syn)
+        JG(:,i+1)=-MatsRs(:,1).*real(V(synIdx,i+1))-MatsRs(:,2).*imag(V(synIdx,i+1))+RHSIGxr;
+        KG(:,i+1)=-MatsRs(:,3).*real(V(synIdx,i+1))-MatsRs(:,4).*imag(V(synIdx,i+1))+RHSIGxi;
+        IGd(:,i+1)=JSr-KCr+sind.*JG(:,i+1)-cosd.*KG(:,i+1);
+        IGq(:,i+1)=JCr+KSr+cosd.*JG(:,i+1)+sind.*KG(:,i+1);
+        tempVGC=real(V(synIdx,i+1))-VGdSr-VGqCr;
+        tempVGD=imag(V(synIdx,i+1))+VGdCr-VGqSr;
+        VGd(:,i+1)=sind.*tempVGC-cosd.*tempVGD;
+        VGq(:,i+1)=cosd.*tempVGC+sind.*tempVGD;
+    end
+end
+
+% Output value: coefficients for every order.
+Q=real(Q);
+s=real(s);
+d=real(d);
+w=real(w);
+eq1=real(eq1);
+eq2=real(eq2);
+ed1=real(ed1);
+ed2=real(ed2);
+psid=real(psid);
+psiq=real(psiq);
+Pm=real(Pm);
+Ef=real(Ef);
+Vavrm=real(Vavrm);
+Vavrr=real(Vavrr);
+Vavrf=real(Vavrf);
+Vavrref=real(Vavrref);
+tgovg=real(tgovg);
+tgovm=real(tgovm);
+Tmech=real(Tmech);
+f=real(f);
+dpg=real(dpg);
+qplt=real(qplt);
+vg=real(vg);
+
+if ~isempty(exc)
+    avr={Vavrm,Vavrr,Vavrf};
+end
+
+if ~isempty(tg)
+    gov={tgovg,tgovm};
+end
+
end
+
\ No newline at end of file diff --git a/internal/html/Copy_of_hemMachinePFSalientcontinueDyn.pdf b/internal/html/Copy_of_hemMachinePFSalientcontinueDyn.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e97a284b7b438c002a4443082602700f56300434 GIT binary patch literal 49274 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 MVwRH9G}L1LKjbU7djJ3c literal 0 HcmV?d00001 diff --git a/internal/simulationTimeDomainDT.m b/internal/simulationTimeDomainDT.m new file mode 100644 index 0000000..bbf0f6f --- /dev/null +++ b/internal/simulationTimeDomainDT.m @@ -0,0 +1,138 @@ +function [stateCurve,t,finalAlpha,alphaList,diffList,exitFlag]=simulationTimeDomainHem(SimData,SysData,SysPara,x0) +% Numerical integration approach for dynamic simulation +% +%%FUNCTION simulationTimeDomainNI +% 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 +% x0 - Initial system state +% +% OUTPUT +% stateCurve - A list of states in the order of time +% t - A list of time points (starting with 0) +% finalAlpha - Final value of alpha +% alphaList - List of alpha (from multi-stage HE) +% exitFlag - +% 0 - Success and normally exit +% -1 - Fail to finish (due to computation errors or failures) +% 1 - System in absolute steady state +% 2 - Generator transients faded away +% 3 - Suggest using error reduction mode +% +% MODES (controlled by SimData.method) +% SimData.method has format X.YZ +% X - Method for solving differential equations (DE) +% 0 - HE +% 1 - Modified Euler +% 2 - RK4 +% 3 - Trapezoidal +% +% Y - Method for solving algebraic equations (AE) +% 0 - HE +% 1 - NR +% +% Z - Variable step (only applies to X>1) +% 0 - Fixed step +% 1 - Adaptive step +% +[bus,sw,pv,pq,shunt,line,ind,zip,syn,exc,tg,agc,cac,cluster]=unfoldSysData(SysData); +[nState,idxs]... + =getIndexDyn(SysData); +% [V0,Q0,s0,d0,w0,eq10,eq20,ed10,ed20,psid0,psiq0,Pm0,Ef0,Vavrm0,Vavrr0,Vavrf0,Vavrref0,tgovg0,tgovm0,tgovmech0]=unfoldX(x0,SysData); +% [~,~,sNew,dNew,~,eq1New,eq2New,ed1New,ed2New,psidNew,psiqNew,~,EfNew,~,~,~,~,~,~,~]=unfoldX(xNew,SysData); +[maxTime,segTime,dt,nlvl,taylorN,alphaTol,diffTol,diffTolMax,method,varOpt]=unfoldSimData(SimData); +[pqIncr,pvIncr,Rind0,Rind1,Reind0,Reind1,Rzip0,Rzip1,Ytr0,Ytr1,Ysh0,Ysh1,VspSq2,~,~,~,~,Tmech1,Varref1,Ef1,Pm1,Eq11]=unfoldSysPara(SysPara); + +nbus=size(bus,1); +nline=size(line,1); +nInd=size(ind,1); +nZip=size(zip,1); +nSyn=size(syn,1); +nTg=size(tg,1); +nExc=size(exc,1); + +if isempty(pqIncr);pqIncr=zeros(size(pq,1),2);end +if isempty(pvIncr);pvIncr=zeros(size(pv,1),1);end +if isempty(Rind0);Rind0=ones(nInd,1);end +if isempty(Rind1);Rind1=zeros(nInd,1);end +if isempty(Reind0);Reind0=ones(nInd,1);end +if isempty(Reind1);Reind1=zeros(nInd,1);end +if isempty(Rzip0);Rzip0=ones(nZip,1);end +if isempty(Rzip1);Rzip1=zeros(nZip,1);end +if isempty(Ytr0)||isempty(Ytr1)||isempty(Ysh0)||isempty(Ysh1) + [~,Ytr0x,Ysh0x,~,~,~,~]=getYMatrix(nbus,line); + if isempty(Ytr0);Ytr0=Ytr0x;end + if isempty(Ytr1);Ytr1=0*Ytr0;end + if isempty(Ysh0);Ysh0=Ysh0x;end + if isempty(Ysh1);Ysh1=0*Ysh0;end +end +if isempty(Tmech1);Tmech1=zeros(nTg,1);end +if isempty(Varref1);Varref1=zeros(nExc,1);end +if isempty(Ef1);Ef1=zeros(nSyn,1);end +if isempty(Pm1);Pm1=zeros(nSyn,1);end +if isempty(Eq11);Eq11=zeros(nSyn,1);end + +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); + +% yShunt=zeros(nbus,1); +% yShunt(shunt(:,1))=shunt(:,5)+1j*shunt(:,6); +% Ysh0=Ysh0+yShunt; +if isempty(VspSq2) + V0=x0(idxs.vIdx); + VspSq2=[abs(V0).*abs(V0),zeros(nbus,1)]; +end + +segAlpha=min([maxTime,segTime]); + +SysParax=foldSysPara(pqIncr,pvIncr,Rind0,Rind1,Reind0,Reind1,Rzip0,Rzip1,Ytr0,Ytr1,Ysh0,Ysh1,VspSq2,[],[],[],[],Tmech1,Varref1,Ef1,Pm1,Eq11); +SimDatax=foldSimData(maxTime,segAlpha,dt,nlvl,taylorN,alphaTol,diffTol,diffTolMax,method,varOpt); + +[t,stateCurve,finalAlpha,alphaList,diffList,exitFlag]=dtmMachinePFmultiStageDyn(SimDatax,SysData,SysParax,x0); + +end \ No newline at end of file