You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
157 lines
6.5 KiB
157 lines
6.5 KiB
function [xTemp,diff,exitflag]=singleStepME(SimData,SysData,SysPara,xt,t,dt,iden,AEmethod)
|
|
% Single step of Modified Euler
|
|
% 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
|
|
% xt - Initial system state
|
|
% t - Relative time compared with SysPara starting time
|
|
% dt - time step length
|
|
% iden - Aux identifier
|
|
% AEmethod - Method for solving algebraic equations
|
|
% 0 - HE
|
|
% 1 - NR
|
|
%
|
|
% OUTPUT
|
|
% xTemp - State at the new step
|
|
% diff - Error vector
|
|
% exitflag -
|
|
% 0 - Normally exit
|
|
% -1 - Fail
|
|
%
|
|
|
|
[bus,sw,pv,pq,shunt,line,ind,zip,syn,exc,tg,agc,cac,cluster]=unfoldSysData(SysData);
|
|
[nState,idxs]...
|
|
=getIndexDyn(SysData);
|
|
[pqIncr,pvIncr,Rind0,Rind1,Reind0,Reind1,Rzip0,Rzip1,Ytr0,Ytr1,Ysh0,Ysh1,VspSq2,~,~,~,~,Tmech1,Varref1,Ef1,Pm1,Eq11]=unfoldSysPara(SysPara);
|
|
|
|
exitflag=0;
|
|
|
|
V0=xt(idxs.vIdx);
|
|
pqx=pq;pqx(:,[4,5])=pq(:,[4,5])+pqIncr(:,1:2)*t;if size(pqIncr,2)>=4;pqx(:,[4,5])=pqx(:,[4,5])+pqIncr(:,3:4)*t*t;end
|
|
pvx=pv;pvx(:,4)=pv(:,4)+pvIncr*t;
|
|
indx=ind;if ~isempty(ind);indx(:,15:17)=ind(:,15:17).*repmat(Rind0+Rind1*t,1,3);indx(:,13)=ind(:,13)./(Reind0+Reind1*t);end
|
|
zipx=zip;if ~isempty(zip);zipx(:,5:10)=zip(:,5:10).*repmat(Rzip0+Rzip1*t,1,6);end
|
|
SysDatax=foldSysData(bus,sw,pvx,pqx,shunt,line,indx,zipx,syn,exc,tg,agc,cac,cluster);
|
|
SysData=foldSysData(bus,sw,pvx,pqx,shunt,line,ind,zip,syn,exc,tg,agc,cac,cluster);
|
|
dx1=integ(SysDatax,SysPara,xt,dt);
|
|
xTemp=xt;
|
|
|
|
xTemp=xTemp+dx1;
|
|
xTemp=adjustAlgebraic(SysDatax,xTemp);
|
|
|
|
dpq=pqIncr(:,1:2)*dt;if size(pqIncr,2)>=4;dpq=dpq+pqIncr(:,3:4)*((t+dt)*(t+dt)-t*t);end
|
|
SysParax=foldSysPara(dpq,pvIncr*dt,...
|
|
Rind0+Rind1*t,Rind1*dt,Reind0+Reind1*t,Reind1*dt,Rzip0+Rzip1*t,Rzip1*dt,Ytr0+Ytr1*t,Ytr1*dt,Ysh0+Ysh1*t,Ysh1*dt,[VspSq2(:,1)+VspSq2(:,2)*t,VspSq2(:,2)*dt],[],[],[],[],...
|
|
Tmech1*dt,Varref1*dt,Ef1*dt,Pm1*dt,Eq11*dt);
|
|
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
|
|
|
|
if AEmethod==0
|
|
try
|
|
[Vx,Wx,Qx,fx,tempState,finalAlpha,alphas,diffRec]=hemMachinePFmultiStageAlgebraic(SimData,SysData,SysParax,xt,xTemp);
|
|
VSol=tempState(idxs.vIdx);
|
|
QSol=tempState(idxs.qIdx);
|
|
fSol=tempState(idxs.fIdx);
|
|
catch ME
|
|
exitflag=-1;
|
|
end
|
|
else
|
|
%khuang Sep 6
|
|
[stateNew,flag,diffRec,loop]=solveAlgebraicNR(SimData,SysData,SysParax,xt,xTemp);
|
|
% [stateNew,flag,diffRec,loop]=restorationAlgebraicNR(SimData,SysData,SysParax,xt,xTemp);
|
|
if flag~=0
|
|
addLog(['NR does not converge!'],'WARN');
|
|
exitflag=-1;
|
|
end
|
|
VSol=stateNew(idxs.vIdx);
|
|
QSol=stateNew(idxs.qIdx);
|
|
fSol=stateNew(idxs.fIdx);
|
|
end
|
|
|
|
xTemp(idxs.vIdx)=VSol;
|
|
xTemp(idxs.qIdx)=QSol;
|
|
xTemp(idxs.fIdx)=fSol;
|
|
xTemp=adjustAlgebraic(SysDatax,xTemp);
|
|
|
|
pqx=pq;pqx(:,[4,5])=pq(:,[4,5])+pqIncr(:,1:2)*(t+dt);if size(pqIncr,2)>=4;pqx(:,[4,5])=pqx(:,[4,5])+pqIncr(:,3:4)*(t+dt)*(t+dt);end
|
|
pvx=pv;pvx(:,4)=pv(:,4)+pvIncr*(t+dt);
|
|
indx=ind;if ~isempty(ind);indx(:,15:17)=ind(:,15:17).*repmat(Rind0+Rind1*(t+dt),1,3);indx(:,13)=ind(:,13)./(Reind0+Reind1*(t+dt));end
|
|
zipx=zip;if ~isempty(zip);zipx(:,5:10)=zip(:,5:10).*repmat(Rzip0+Rzip1*(t+dt),1,6);end
|
|
SysDatax=foldSysData(bus,sw,pvx,pqx,shunt,line,indx,zipx,syn,exc,tg,agc,cac,cluster);
|
|
dx2=integ(SysDatax,SysPara,xTemp,dt);
|
|
|
|
xTemp=xt;
|
|
xTemp=xTemp+(dx1+dx2)/2;
|
|
xTemp=adjustAlgebraic(SysDatax,xTemp);
|
|
|
|
dpq=pqIncr(:,1:2)*dt;if size(pqIncr,2)>=4;dpq=dpq+pqIncr(:,3:4)*((t+dt)*(t+dt)-t*t);end
|
|
SysParax=foldSysPara(dpq,pvIncr*dt,...
|
|
Rind0+Rind1*t,Rind1*dt,Reind0+Reind1*t,Reind1*dt,Rzip0+Rzip1*t,Rzip1*dt,Ytr0+Ytr1*t,Ytr1*dt,Ysh0+Ysh1*t,Ysh1*dt,[VspSq2(:,1)+VspSq2(:,2)*t,VspSq2(:,2)*dt],[],[],[],[],...
|
|
Tmech1*dt,Varref1*dt,Ef1*dt,Pm1*dt,Eq11*dt);
|
|
|
|
if AEmethod==0
|
|
try
|
|
[Vx,Wx,Qx,fx,tempState,finalAlpha,alphas,diffRec]=hemMachinePFmultiStageAlgebraic(SimData,SysData,SysParax,xt,xTemp);
|
|
VSol=tempState(idxs.vIdx);
|
|
QSol=tempState(idxs.qIdx);
|
|
fSol=tempState(idxs.fIdx);
|
|
catch ME
|
|
exitflag=-1;
|
|
end
|
|
else
|
|
[stateNew,flag,diffRec,loop]=solveAlgebraicNR(SimData,SysData,SysParax,xt,xTemp);
|
|
if flag~=0
|
|
addLog(['NR does not converge!'],'WARN');
|
|
exitflag=-1;
|
|
end
|
|
VSol=stateNew(idxs.vIdx);
|
|
QSol=stateNew(idxs.qIdx);
|
|
fSol=stateNew(idxs.fIdx);
|
|
end
|
|
|
|
xTemp(idxs.vIdx)=VSol;
|
|
xTemp(idxs.qIdx)=QSol;
|
|
xTemp(idxs.fIdx)=fSol;
|
|
xTemp=adjustAlgebraic(SysDatax,xTemp);
|
|
|
|
% dxc=integ(SysDatax,SysPara,xTemp,dt)/dt;
|
|
dxc=dx2/dt;
|
|
SysParaxx=foldSysPara([],[],[],[],[],[],[],[],Ytr0+Ytr1*(t+dt),[],Ysh0+Ysh1*(t+dt),[],[VspSq2(:,1)+VspSq2(:,2)*(t+dt),zeros(size(VspSq2,1),1)],[],[],[],[],Tmech1,Varref1,Ef1,Pm1,Eq11);
|
|
diff=checkEquationBalanceSynDyn(SysDatax,SysParaxx,xTemp,dxc);
|
|
|
|
end
|
|
|