-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMPReduction.m
More file actions
executable file
·116 lines (113 loc) · 5.14 KB
/
Copy pathMPReduction.m
File metadata and controls
executable file
·116 lines (113 loc) · 5.14 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
function [mpcreduced,Link,BCIRCr]=MPReduction(mpc,ExBusOrig,Pf_flag)
% Function MPReduction does modified Ward reduction to the full system
% model given in the MATPOWER case file (mpc) based the external buses
% (ExBusOrig)defined by the user.
%
% [mpcreduced,Link,BCIRCr]=MPReduction(mpc,ExBusOrig,Pf_flag)
%
% INPUT DATA:
% mpc: struct, includes the full model in MATPOWER case format
% ExBusOrig: n*1 vector, include the bus numbers of buses to be
% eliminated
% Pf_flag: scalar, indicate if dc power flow needed to solve (=1) or not
% (=0) in the load redistribution subroutine
%
% OUTPUT DATA:
% mpcreduced: struct, includes the reduced model in MATPOWER case format
% Link: n*2 matrix, includes the generator mapping info, showing how
% external generators are moved: The first column includes generator bus
% numbers in full model and the second column includes generator bus
% nubmers where the external generators are moved to.
% BCIRCr: n*1 vector, includes branch circuit numbers. This vector can be
% used to identify parallel branches and equivalent lines generated by
% the network reduction process. If a branch number is higher than 1 and
% less then it indicate this branch is parallel to one of the branch in
% the full model. If a branch circuit number is 99 then it indicate this
% branch is an equivalent branch.
%
% Note: The reduction is based on dc assumption which means all resistance,
% reactive power components will be ignored. And the reduced model is only
% good for solving dc power flow or dc opf. If the input full model case
% file includes dclines, it is assumed that no dc terminal is to be
% eliminated, otherwise the function will return error. If Pf_flag = 1
% which means dc power flow need to be solved during the load
% redistribution process, user must make sure that MATPOWER toolbox is
% installed.
% MATPOWER
% Copyright (c) 2014-2016, Power Systems Engineering Research Center (PSERC)
% by Yujia Zhu, PSERC ASU
%
% This file is part of MATPOWER/mx-reduction.
% Covered by the 3-clause BSD License (see LICENSE file for details).
% See https://github.com/MATPOWER/mx-reduction/ for more info.
fprintf('%n Reduction process start');
fprintf('%n Preprocess data')';
[mpc,ExBusOrig]=PreProcessData(mpc,ExBusOrig);
dim = size(mpc.bus,1);
%% Modeling
% check if dc terminals are external
if isfield(mpc,'dcline')
tf1 = ismember(mpc.dcline(:,1),ExBusOrig);
tf2 = ismember(mpc.dcline(:,2),ExBusOrig);
if (sum(tf1)+sum(tf2))>0
error('not able to eliminate HVDC line terminals');
end
end
ExBusOrig = ExBusOrig';
if ~isempty(ExBusOrig)
fprintf('\nConvert input data model');
[NFROM,NTO,BraNum,LineB,ShuntB,BCIRC,BusNum,NUMB,SelfB,mpc,ExBus,newbusnum,oldbusnum] = Initiation(mpc,ExBusOrig); % ExBus with internal numbering
%% Create data structure
fprintf('\nCreating Y matrix of input full model');
[CIndx,ERP,DataB]=BuildYMat(NFROM,NTO,BraNum,LineB,BCIRC,BusNum,NUMB,SelfB);
%% Do Reduction
fprintf('\nDo first round reduction eliminating all external buses');
[mpcreduced,BCIRCr,ExBusr] = DoReduction(DataB,ERP,CIndx,ExBus,NUMB,dim,BCIRC,newbusnum,oldbusnum,mpc); % ExBusr with original numbering
%% Generate the second reduction with all retained buses and all generator
%% buses mpcreduced_gen
% Create the ExBus_Gen to create the reduced model with all gens
tf = ismember(ExBus,mpc.gen(:,1));
ExBusGen = ExBus;
ExBusGen(tf==1)=[]; % delete all external buses with generators
tf=ismember(mpc.gen(:,1),ExBus);
fprintf('\n%d external generators are to be placed',length(tf(tf==1)));
if ~isempty(ExBusGen)
fprintf('\nDo second round reduction eliminating all external non-generator buses');
[mpcreduced_gen,BCIRC_gen,ExBusGen] = DoReduction(DataB,ERP,CIndx,ExBusGen,NUMB,dim,BCIRC,newbusnum,oldbusnum,mpc);
else
mpcreduced_gen = mpc;
mpcreduced_gen=MapBus(mpcreduced_gen,newbusnum,oldbusnum);
BCIRC_gen = BCIRC;
end
%% Move Generators
fprintf('\nPlacing External generators');
[NewGenBus,Link]=MoveExGen(mpcreduced_gen,ExBusOrig,ExBusGen,BCIRC_gen,0);
mpcreduced.gen(:,1)=NewGenBus; % move all external generators
%% Do Inverse PowerFlow
fprintf('\nRedistribute loads');
mpc=MapBus(mpc,newbusnum,oldbusnum);
[mpcreduced,BCIRCr]=LoadRedistribution(mpc,mpcreduced,BCIRCr,Pf_flag);
else
mpcreduced = mpc;
warning('No external buses, reduced model is same as full model');
end
%% Delete large reactance equivalent branches
ind=find(abs(mpcreduced.branch(:,4))>=max(mpc.branch(:,4))*10);
mpcreduced.branch(ind,:)=[];
BCIRCr(ind)=[];
%% Print Results
fprintf('\n**********Reduction Summary****************');
fprintf('\n%d buses in reduced model',size(mpcreduced.bus,1));
fprintf('\n%d branches in reduced model, including %d equivalent lines',size(mpcreduced.branch,1),length(BCIRCr(BCIRCr==max(BCIRCr))));
fprintf('\n%d generators in reduced model',size(mpcreduced.gen,1));
if isfield(mpcreduced,'dcline')
fprintf('\n%d HVDC lines in reduced mode,',size(mpcreduced.dcline,1));
end
fprintf('\n**********Generator Placement Results**************');
for i=1:size(Link,1)
if Link(i,2)-Link(i,1)~=0
fprintf('\nExternal generator on bus %d is moved to %d',Link(i,1),Link(i,2));
end
end
fprintf('\n');
end