Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

There doesn't seem to be one to read the mutual data into pure Python.

There are APIs to change the mutual data:

psspy.seq_mutual_data

but nothing in the single element data retrieval or subsystem data retrieval chapters.

The closest we can get is using the sqli command which has the following signature:

psspy.sqli(sid, all, opt)

where:

sid, a subsystem id number (can be -1 to indicate all buses)

all, =1 process all buses, otherwise 
     =0 only buses in subsystem sid

opt, =1, full listing 
     =2, bus load data
     =3, generator data
     =4, branch data
     =5, two winding transformer data
     =6, mutual data
     =7, switched shunt data
     =8, three winding transformer data
     =9, line shunt data
     =10, fixed shunt data

We'll take the 6 option for mutual data.

>>> psspy.sqli(
     sid=-1,
     opt=6) # mutual data
PSS(R)E PROGRAM APPLICATION GUIDE EXAMPLE                MUTUAL DATA
BASE CASE INCLUDING SEQUENCE DATA
X----- FROM BUS -----X X-------- TO BUS ------X
BUS# X-- NAME --X BASKV  BUS# X-- NAME --X BASKV CKT  MUTUAL IMPEDANCE  B1   B2
151  NUCPANT      500.0  152  MID500       500.0 1    0.0020 0.0200    0.000 1.000
151  NUCPANT      500.0  152  MID500       500.0 2                     0.000 1.000

... and so on...

You'll need to redirect this output to a string, so we can parse it and turn it into Python data.

import StringIO

import psspy
psspy.throwPsseExceptions = True

import redirect
redirect.psse2py()

#... then after initialising psse and loading the case ...

report = StringIO.StringIO()
sys.stdout = report
psspy.sqli(sid=-1, opt=6)
sys.stdout = sys.__stdout__

mutual_report = report.getvalue().split('\n')

# strip all rows except those starting with a number.
def starts_with_number(row):
    try:
        firstcolumn = row.strip().split()[0]
    except IndexError:
        return False
    return firstcolumn.isdigit()

rows = filter(starts_with_number, mutual_report)

print rows

Now all the rows in the sqli table are in the rows variable, you'll have to write code to get the information you want from each string. It wouldn't be a pretty or easy to do task, so I've not done that here. You'll need to write that bit yourself.

some explanation about the program

I've used StringIO to capture the report that PSSE would normally print to the screen. It's part of the Python standard library. http://docs.python.org/2/library/stringio.html

Afterwards, I reassign back to sys.stdout so that future program output once again shows up on the screen.

Secondly, I've used the filter function, which operates line by line to see if the first word in the sentence is a digit. The try..except block is there to handle if the line is blank and there are no words.