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.
powersas.m/util/writePsatFilefromPsat.m

200 lines
7.8 KiB

function writePsatFilefromPsat(psatfilename,bus,sw,pv,pq,shunt,line,sup,busnames,actions,zip,ind,syn,exc,tg)
% function for writing PSAT format data
%
% FUNCTION yr_writePsatFilefromPsat
%
% 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.
% ***************************************************************************************************
%
%
% ----- write data in MATPOWER format -----
fid = fopen(psatfilename, 'w');
% print out function title, baseMVA, etc.
temp = psatfilename(1:length(psatfilename)-2);
% print out bus matrix [OK]
fprintf(fid, '\n%%bus data: %d',size(bus, 1));
fprintf(fid, '\nBus.con = [...');
for i = 1:size(bus, 1)
% bus baseKv v theta area region
fprintf(fid, '\n%6i %10.4f %10.4f %10.4f %6i %6i', bus(i,:));
end
fprintf(fid, '\n];\n');
% print out SW matrix [OK]
fprintf(fid, '\n%%SW data: %d',size(sw,1));
fprintf(fid, '\nSW.con = [...');
for i = 1:size(sw,1)
% bus Sn Vn v theta qmax qmin vmax vmin pg_guess loss_part ref u
fprintf(fid, '\n%6i %10.4f %10.4f %10.4f %10.4f %10.4f %10.4f %10.4f %10.4f %10.4f %10.4f %6i %6i', sw(i,:));
end
fprintf(fid, '\n];\n');
% print out PV matrix [OK]
fprintf(fid, '\n%%PV data: %d',size(pv, 1));
fprintf(fid, '\nPV.con = [...');
for i = 1:size(pv, 1)
% bus Sn Vn Pg V qmax qmin vmax vmin loss_part u
fprintf(fid, '\n%6i %10.4f %10.4f %10.4f %10.4f %10.4f %10.4f %10.4f %10.4f %10.4f %6i', pv(i,:));
end
fprintf(fid, '\n];\n');
% print out PQ matrix [OK]
fprintf(fid, '\n%%PQ data: %d',size(pq, 1));
fprintf(fid, '\nPQ.con = [...');
for i = 1:size(pq, 1)
% bus Sn Vn P Q vmax vmin z u
fprintf(fid, '\n%6i %10.4f %10.4f %10.4f %10.4f %10.4f %10.4f %6i %6i', pq(i,:));
end
fprintf(fid, '\n];\n');
% print out Shunt matrix [OK]
fprintf(fid, '\n%%Shunt data: %d',size(shunt, 1));
fprintf(fid, '\nShunt.con = [...');
for i = 1:size(shunt, 1)
% bus Sn fn Gs Bs z u
fprintf(fid, '\n%6i %10.4f %10.4f %10.4f %10.4f %10.4f %6i', shunt(i,:));
end
fprintf(fid, '\n];\n');
% print out Branch matrix [OK]
fprintf(fid, '\n%%Line Data: %d',size(line, 1));
fprintf(fid, '\nLine.con = [...');
for i = 1:size(line, 1)
% f t Sn Vn fn ln r x b k phi Im Pm Sm u
fprintf(fid, '\n%6d %6d %9.5f %9.5f %9.5f %6d %9.5f %9.5f %9.5f %9.5f %9.5f %9.5f %9.5f %9.5f %9.5f %9.5f %6d', line(i,:));
end
fprintf(fid, '\n];\n');
% print out Supply matrix [OK]
if ~isempty(sup)
fprintf(fid, '\n%%Supply Data: %d',size(sup, 1));
fprintf(fid, '\nSupply.con = [...');
for i = 1:size(sup, 1)
% bus Sn * Pmax Pmin * * * * * * * * *
fprintf(fid, '\n%6d %10.4f %10.4f %10.4f %10.4f %6d %6d %6d %6d %6d %6d %6d %6d %6d %6d %10.4f %10.4f %6d %6d %6d', sup(i,:));
end
fprintf(fid, '\n];\n');
end
fprintf(fid, '\nHvdc.con = [];\n\n');
% print out hvdc matrix
% if ~isempty(dcline)
% fprintf(fid, '\n%%fbus tbus Sn Vrn Vin fn V I Xtr Xti mr mi Ki Kp Rdc Ldc aMax aMin gaMax gaMin yRmax yRmin yiMax yiMin ctype io po vo u');
% fprintf(fid, '\nHvdc.con = [...');
% for i = 1:size(dcline, 1)
% fprintf(fid, '\n%6d %6d %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %8.5f %6d',...
% [dcline(i, [1,2]),baseMVA,dcline(i,[8,9])*baseMVA,60.0,dcline(i,8)*baseMVA,dcline(i,4)/(dcline(i,8)*baseMVA),0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,dcline(i,[11,10])/(dcline(i,8)*baseMVA),dcline(i,[11,10])/(dcline(i,8)*baseMVA),1,1,1,1,1]);
% end;
% fprintf(fid, '\n]; \n');
% end
% bus name
fprintf(fid, 'Bus.names = {...\n ');
if ~isempty(busnames)
for i = 1:length(busnames(:,1))-1
tmpName = busnames{i};
newName = strrep(tmpName,'''',' ');%loadcase
fprintf(fid, '''%s '';',newName);
if rem(i,5) == 0; fprintf(fid,'\n '); end
end
fprintf(fid, '''%s ''',busnames{end});
end
fprintf(fid, '};\n');
if nargin>=14&&~isempty(actions)
fprintf(fid, '\n%%Manual actions for testing');
fprintf(fid, '\naction = [...');
for i = 1:size(actions, 1)
% bus Sn * Pmax Pmin * * * * * * * * *
fprintf(fid, '\n%6d %6d %10.4f %6d', actions(i,:));
end
fprintf(fid, '\n];\n');
end
if nargin>=15&&~isempty(zip)
fprintf(fid, '\n%%ZIP Data: %d',size(zip, 1));
fprintf(fid, '\nPl.con = [...');
for i = 1:size(zip, 1)
fprintf(fid, '\n%6d %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %2u %2u', zip(i,:));
end
fprintf(fid, '\n];\n');
else
fprintf(fid, '\nPl.con = [];\n');
end
if nargin>=16&&~isempty(ind)
fprintf(fid, '\n%%Induction motor Data: %d',size(ind, 1));
fprintf(fid, '\nInd.con = [...');
for i = 1:size(ind, 1)
fprintf(fid, '\n%6d %8.4g %8.4g %8.4g %6d %6d %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %2d %2d', ind(i,:));
end
fprintf(fid, '\n];\n');
else
fprintf(fid, '\nInd.con = [];\n');
end
if nargin>=17&&~isempty(syn)
fprintf(fid, '\n%%Synchronous machine Data: %d',size(syn, 1));
fprintf(fid, '\nSyn.con = [...');
for i = 1:size(syn, 1)
fprintf(fid, '\n%6d %8.4g %8.4g %8.4g %6d %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %6d %2u', syn(i,:));
end
fprintf(fid, '\n];\n');
else
fprintf(fid, '\nSyn.con = [];\n');
end
if nargin>=18&&~isempty(exc)
fprintf(fid, '\n%%Exciter Data: %d',size(exc, 1));
fprintf(fid, '\nExc.con = [...');
for i = 1:size(exc, 1)
fprintf(fid, '\n%6d %6d %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %2u', exc(i,:));
end
fprintf(fid, '\n];\n');
else
fprintf(fid, '\nExc.con = [];\n');
end
if nargin>=19&&~isempty(tg)
fprintf(fid, '\n%%Turbine governor Data: %d',size(tg, 1));
fprintf(fid, '\nTg.con = [...');
for i = 1:size(tg, 1)
fprintf(fid, '\n%6d %6d %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %8.4g %2u', tg(i,:));
end
fprintf(fid, '\n];\n');
else
fprintf(fid, '\nTg.con = [];\n');
end
fclose(fid);
end