⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 psat2octave

📁 用于电力系统的一个很好的分析软件
💻
字号:
#!/usr/bin/perl -w
# PSAT2OCTAVE adapts PSAT for the GNU/OCtave environment 
#
# SIMPOW2MAT [OPTIONS] [FILEOUTPUT]
#
# Author:  Federico Milano
# Date:    30 April 2008
# Version: 1.0.0
#
#e-mail:   Federico.Milano@uclm.es

use strict;
use Cwd;
use File::Find;
use File::Copy;

# -----------------------------------------------------------------------
# variable declaration
# -----------------------------------------------------------------------

my ($h,$i,$j,$k,$u,$v);
my $nargin = 0;
my $verbose = 0;
my $reallyv = 0;
my $helpmsg = 0;
my $testmode = 0;
my $skipmode = 0;
my $restore = 0;
my $dir = getcwd;
my $path;
my $filename;
my @filename;
my @class;
my @data;
my @classdir;
my @psatfile;
my %cname;
my %classname;
my $ndir = -1;
my $nfile = -1;

# -----------------------------------------------------------------------
# check inputs
# -----------------------------------------------------------------------
$nargin = @ARGV;
if ($nargin) {
    while ($ARGV[0] =~ /^-/) {
	$restore = 1 if $ARGV[0] =~ /r/;
	$verbose = 1 if $ARGV[0] =~ /v/;
	$reallyv = 1 if $ARGV[0] =~ /w/;
	$helpmsg = 1 if $ARGV[0] =~ /h/;
	$testmode = 1 if $ARGV[0] =~ /t/;
	$skipmode = 1 if $ARGV[0] =~ /s/;
	shift(@ARGV);
	$nargin--;
	if ($nargin == 0) { last; }
    }
}

# the "really verbose" option implies the "verbose" one
$verbose = 1 if $reallyv;

print "Working directory <" . $dir . ">\n" if $verbose;
if ($nargin) {
    $path = $ARGV[0];
} else {
    $path = $dir;
}

# -----------------------------------------------------------------------
# help (if requested)
# -----------------------------------------------------------------------
if ($helpmsg) {
    print "\nPSAT2OCTAVE adapts PSAT for the GNU/Octave environment.\n\n";
    print "psat2octave <options> <path>\n";
    print "  -v   verbose\n";
    print "  -w   really verbose\n";
    print "  -t   test (no change is applied)\n";
    print "  -s   skip file scan\n";
    print "  -r   restore the original files\n";
    print "  -h   print this help and exit\n\n";
    print "Author:   Federico Milano\n";
    print "Date:     30-Apr-2008\n";
    print "Version:  1.0.0\n\n";
    print "E-mail:   Federico.Milano\@uclm.es\n";
    die "\n";
}

print "Getting PSAT class folders... " if $verbose;
print "\n" if $reallyv;
find (\&psatclass,$path);
print "\n" if (($ndir+1) % 5) && $reallyv;
print "done.\n" if $verbose && !$reallyv;

print "Getting PSAT Matlab files... "  if $verbose;
find (\&psatfile,$path);
print "done.\n" if $verbose;

if ($restore) {
    @class = qw(bus   line   shunt   breaker  
	  fault   sw     pv      pq      mn
	  pl      fl     lines   twt     syn
	  mot     ltc    thload  tg      exc
	  pss     oxl    hvdc    svc     tcsc
	  statcom sssc   upfc    mass    ssr
	  tap     demand supply  rsrv    rmpg
	  rmpl    vltn   ypdp    sofc    cac
	  cluster exload phs     cswt    dfig
	  ddsg    wind   busfreq pmu     jimma
	  mixload pod    areas   coi);
} else {
    @class = qw(Bus   Line   Shunt   Breaker Mn  
	  Fault   SW     PV      PQ      PQgen
	  Pl      Fl     Lines   Twt     Syn
	  Mot     Ltc    Thload  Tg      Exc
	  Pss     Oxl    Hvdc    Svc     Tcsc
	  Statcom Sssc   Upfc    Mass    SSR
	  Tap     Demand Supply  Rsrv    Rmpg
	  Rmpl    Vltn   Ypdp    Sofc    Cac
	  Cluster Exload Phs     Cswt    Dfig
	  Ddsg    Wind   Busfreq Pmu     Jimma
	  Mixload Pod    Areas   Regions COI);
}

unless ($skipmode) {
    print "Scanning PSAT Matlab files... " if $verbose;
    print "\n" if $reallyv;
    foreach $filename (@psatfile) {
	open(IN,$filename) || die "Cannot open $filename: $!\n";
	@data = <IN>;
	close(IN) || die "Cannot close $filename: $!\n";
	
	print " - scan file $filename\n" if $reallyv;
	open(OUT,">$filename") || die "cannot open $filename: $!\n";
	while (defined($i = shift(@data))) {
	    foreach $k (@class) {
		if ($restore) {
		    $i =~ s/_$k\(/\(/g;
		} else {
		    $h = $k;
		    $h =~ tr/A-Z/a-z/; 
		    if ($k eq "PQgen") { $h = "pq"; }
		    if ($k eq "Regions") { $h = "areas"; }
		    unless ($i =~ /_$h\(/) {
			$i =~ s/\($k,/_$h\($k,/g;
			$i =~ s/\($k\)/_$h\($k\)/g;
		    }
		    if ($filename =~ /fm_nequit.m/ || $filename =~ /write.m/) {
			$i =~ s/write\(SWeq,/write_sw\(SWeq,/g;
			$i =~ s/write\(PVeq,/write_pv\(PVeq,/g;
			$i =~ s/write\(PQeq,/write_pq\(PQeq,/g;
			$i =~ s/write\(Buseq,/write_bus\(Buseq,/g;
			$i =~ s/write\(Syneq,/write_syn\(Syneq,/g;
			$i =~ s/write\(AVReq,/write_exc\(AVReq,/g;
		    }
		}
	    }
	    print OUT $i unless $testmode;
	}
	close(OUT) || die "Cannot close $filename: $!\n";
    }
    print "done.\n" if $verbose;
} else {
    print "PSAT file scan skipped." if $verbose;
}

$cname{"\@ARclass"} = "areas";
$cname{"\@AVclass"} = "exc";
$cname{"\@BFclass"} = "busfreq";
$cname{"\@BKclass"} = "breaker";
$cname{"\@BUclass"} = "bus";

$cname{"\@CCclass"} = "cac";
$cname{"\@CIclass"} = "coi";
$cname{"\@CLclass"} = "cluster";
$cname{"\@CSclass"} = "cswt";
$cname{"\@DDclass"} = "ddsg";

$cname{"\@DFclass"} = "dfig";
$cname{"\@DMclass"} = "demand";
$cname{"\@DSclass"} = "mass";
$cname{"\@ELclass"} = "exload";
$cname{"\@FCclass"} = "sofc";

$cname{"\@FLclass"} = "fl";
$cname{"\@FTclass"} = "fault";
$cname{"\@HVclass"} = "hvdc";
$cname{"\@IMclass"} = "mot";
$cname{"\@JIclass"} = "jimma";

$cname{"\@LNclass"} = "line";
$cname{"\@LSclass"} = "lines";
$cname{"\@LTclass"} = "ltc";
$cname{"\@MNclass"} = "mn";
$cname{"\@MXclass"} = "mixload";

$cname{"\@OXclass"} = "oxl";
$cname{"\@PHclass"} = "phs";
$cname{"\@PLclass"} = "pl";
$cname{"\@PMclass"} = "pmu";
$cname{"\@POclass"} = "pod";

$cname{"\@PQclass"} = "pq";
$cname{"\@PSclass"} = "pss";
$cname{"\@PVclass"} = "pv";
$cname{"\@RGclass"} = "rmpg";
$cname{"\@RLclass"} = "rmpl";

$cname{"\@RSclass"} = "rsrv";
$cname{"\@SHclass"} = "shunt";
$cname{"\@SRclass"} = "ssr";
$cname{"\@SSclass"} = "sssc";
$cname{"\@STclass"} = "statcom";

$cname{"\@SUclass"} = "supply";
$cname{"\@SVclass"} = "svc";
$cname{"\@SWclass"} = "sw";
$cname{"\@SYclass"} = "syn";
$cname{"\@TCclass"} = "tcsc";

$cname{"\@TGclass"} = "tg";
$cname{"\@THclass"} = "thload";
$cname{"\@TPclass"} = "tap";
$cname{"\@TWclass"} = "twt";
$cname{"\@UPclass"} = "upfc";

$cname{"\@VLclass"} = "vltn";
$cname{"\@WNclass"} = "wind";
$cname{"\@YPclass"} = "ypdp";

print "Adapting PSAT class folders..." if $verbose;

$i = -1;
foreach $h (@classdir) {
    
    print "\n * scan folder " . $classname{$h} . "\n" if $reallyv && !$restore;
    @psatfile = ();
    @filename = ();
    $nfile = -1;
    find(\&psatfile,$h);
    
    foreach $k (@psatfile) {

	# adapt functions
	unless ($skipmode || $restore) {
	    open(IN,$k) || die "Cannot open $k: $!\n";
	    @data = <IN>;
	    close(IN) || die "Cannot close $k: $!\n";
	    print "    - scan & rename file $k\n" if $reallyv;
	    open(OUT,">$k") || die "cannot open $k: $!\n";
	    while (defined($i = shift(@data))) {
		foreach $j (@filename) {
		    $v = $cname{$classname{$h}};
		    $j =~ s/_$v$//;
		    $u = $j . "_" . $v;
		    $i =~ s/$j\(a,/$u\(a,/g;
		    $i =~ s/$j\(p,/$u\(p,/g;
		    $i =~ s/$j\(a\)/$u\(a\)/g;
		    $i =~ s/$j\(p\)/$u\(p\)/g;
		}
		print OUT $i unless $testmode;
	    }
	    close(OUT) || die "Cannot close $k: $!\n";
	}

	# change file name
	if ($restore) {
	    $v = $cname{$classname{$h}};
	    $u = $k;
	    $u =~ s/_$v\.m$/\.m/;
	    move ($k,$u) unless $u eq $k;
	} else {
	    $i = $k;
	    $i =~ s/\.m$//;
	    $i = $i . "_" . $cname{$classname{$h}} . ".m";
	    move ($k,$i) unless $k =~ /[A-Z][A-Z]class\.m/ 
		|| $k =~ /_$cname{$classname{$h}}/ || $testmode;
	}
    }
}

print " done.\n" if $verbose;
print "Conversion completed.\n";

# -----------------------------------------------------------------------
# PSAT class folders
# -----------------------------------------------------------------------
sub psatclass {
    my $element = $_;
    if (-d $element && $element =~ /^@/) {
	$classdir[++$ndir] = $File::Find::name;
	$classname{$classdir[$ndir]} = $element;
	if ($reallyv) {
	    print " - " . $element;
	    print "\n" if (($ndir+1) % 5) == 0;
	}
    }
}

# -----------------------------------------------------------------------
# PSAT Matlab files
# -----------------------------------------------------------------------
sub psatfile {
    my $element = $_;
    if (-f $element && $element =~ /\.m$/) {
	$psatfile[++$nfile] = $File::Find::name;
	$element =~ s/\.m$//;
	$filename[$nfile] = $element;
	#print $psatfile[$nfile] . "\n" if $reallyv;
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -