6 path1 = os.path.abspath(os.path.join(os.path.abspath(__file__), '../','TreatOutputs'))
\r
7 sys.path.append(path1)
\r
11 def getNominalkV(NetworkFile):
\r
13 print "version en dur"
\r
15 BusList=[11.0, 30.0, 90.0]
\r
16 LinesList=[30.0, 90.0]
\r
17 TransfosList=['11.0 - 30.0', '11.0 - 90.0', '30.0 - 90.0', '90.0 - 30.0']
\r
18 return BusList, LinesList, TransfosList
\r
27 psspy.psseinit(80000)
\r
29 psspy.progress_output(6)
\r
31 psspy.case(NetworkFile)
\r
36 ierr, ret = psspy.abusreal(sid, flag, ['BASE'])
\r
37 Options.BusBase = ret[0]
\r
39 ierr, carray = psspy.abuschar(sid, flag, ['NAME'])
\r
40 Options.BusBaseList = {}
\r
41 for i in range(len(carray[0])):
\r
42 Options.BusBaseList[carray[0][i]] = ret[0][i]
\r
45 for item in Options.BusBase:
\r
46 if item not in BusList:
\r
47 BusList.append(item)
\r
48 BusList = sorted(BusList)
\r
56 string = ['FROMNAME', 'TONAME']
\r
57 ierr, carray = psspy.abrnchar(sid, owner, ties, flag, entry, string)
\r
59 for i in range(len(carray[0])):
\r
60 nom = Options.BusBaseList[carray[0][i]]
\r
61 name = carray[0][i] + '-' + carray[1][i]
\r
62 Options.LinesBaseList[name] = nom
\r
63 Options.LinesBase.append(nom)
\r
66 for item in Options.LinesBase:
\r
67 if item not in LinesList:
\r
68 LinesList.append(item)
\r
69 LinesList = sorted(LinesList)
\r
77 string = ['FROMNAME', 'TONAME']
\r
78 ierr, carray = psspy.abrnchar(sid, owner, ties, flag, entry, string)
\r
80 for i in range(len(carray[0])):
\r
81 nom1 = Options.BusBaseList[carray[0][i]]
\r
82 nom2 = Options.BusBaseList[carray[1][i]]
\r
83 name = carray[0][i] + '-' + carray[1][i]
\r
84 Options.TransfoBaseList[name] = [nom1, nom2]
\r
85 Options.TransfoBase.append([nom1, nom2])
\r
88 for item in Options.TransfoBase:
\r
89 string = str(item[0]) + ' - ' + str(item[1])
\r
90 if string not in TransfosList:
\r
91 TransfosList.append(string)
\r
92 TransfosList = sorted(TransfosList)
\r
97 flag = 1 #all in service loads/generators (4 all loads/generators)
\r
100 ierr,iarray = psspy.amachint(sid,flag,string)
\r
102 string = ['NAME','ID']
\r
103 ierr,carray = psspy.amachchar(sid,flag,string)
\r
105 for i in range(len(iarray[0])):
\r
106 idname = "GR" + carray[1][i]
\r
107 machinename = carray[0][i].strip()+ "__" + idname
\r
108 machinename = machinename.replace(" ","_")
\r
109 machinename = machinename.replace("-","_")
\r
110 machinename = machinename.replace(".","_")
\r
111 machinename = machinename.replace("&","and")
\r
113 int(machinename[0])
\r
114 machinename = "_" + machinename
\r
117 Options.GenBaseList[machinename] = iarray[0][i]
\r
119 return BusList, LinesList, TransfosList
\r
121 def getBusNominalkV(NetworkFile):
\r
125 psspy.psseinit(80000)
\r
127 psspy.progress_output(6)
\r
129 psspy.case(NetworkFile)
\r
133 ierr, ret = psspy.abusreal(sid, flag, ['BASE'])
\r
134 Options.BusBase = ret[0]
\r
136 ierr, carray = psspy.abuschar(sid, flag, ['NAME'])
\r
138 for i in range(len(carray[0])):
\r
139 buses[carray[0][i]] = ret[0][i]
\r
140 Options.BusNames = buses
\r
142 for item in Options.BusBase:
\r
143 if item not in ret:
\r
148 Options.ContFullList = []
\r
149 tmp = Options.BusBaseList
\r
152 Options.ContFullList.append(key)
\r
153 tmp = Options.GenBaseList
\r
156 Options.ContFullList.append(key)
\r
157 tmp = Options.LinesBaseList
\r
160 Options.ContFullList.append(key)
\r
161 tmp = Options.TransfoBaseList
\r
164 Options.ContFullList.append(key)
\r
165 print Options.ContFullList
\r
166 return Options.ContFullList
\r
168 def newContingency(MatList):
\r
169 Options.CustomContingencies.append(MatList)
\r
171 def checkIfBorder(graph, key, depth, tmplist):
\r
172 #print "in checkifBorder"
\r
173 #print "depth ",depth
\r
180 for item in graph[key]:
\r
181 if not checkIfBorder(graph, item, depth - 1, tmplist):
\r
183 if NonBorders < 2: # A generator is considered as isolated if it has less than two non-borders neighbours
\r
184 if key not in tmplist:
\r
185 tmplist.append(key)
\r
189 def getTrueLines(NetworkFile):
\r
193 psspy.psseinit(80000)
\r
195 psspy.progress_output(6)
\r
197 psspy.case(NetworkFile)
\r
202 flag = 4 # 6 for two-winding transfos
\r
203 entry = 1 #each branch once, not both directions
\r
204 string = ['FROMNAME', 'TONAME', 'ID']
\r
205 ierr, iarray = psspy.abrnchar(sid, owner, ties, flag, entry, string)
\r
206 string = ['FROMNUMBER', 'TONUMBER']
\r
207 ierr, carray = psspy.abrnint(sid, owner, ties, flag, entry, string)
\r
212 for i in range(len(carray[0])):
\r
213 if carray[0][i] not in lst and carray[0][i] not in tmplist:
\r
214 tmplist.append(carray[0][i])
\r
215 elif carray[0][i] not in lst and carray[0][i] in tmplist:
\r
216 tmplist.remove(carray[0][i])
\r
217 lst.append(carray[0][i])
\r
218 if carray[1][i] not in lst and carray[1][i] not in tmplist:
\r
219 tmplist.append(carray[1][i])
\r
220 elif carray[1][i] not in lst and carray[1][i] in tmplist:
\r
221 tmplist.remove(carray[1][i])
\r
222 lst.append(carray[1][i])
\r
228 for i in range(len(carray[0])):
\r
230 if graph[carray[0][i]]:
\r
233 graph[carray[0][i]] = []
\r
234 if carray[1][i] not in graph[carray[0][i]]:
\r
235 graph[carray[0][i]].append(carray[1][i])
\r
237 if graph[carray[1][i]]:
\r
240 graph[carray[1][i]] = []
\r
241 if carray[0][i] not in graph[carray[1][i]]:
\r
242 graph[carray[1][i]].append(carray[0][i])
\r
245 # Search it twice, to ensure everything is mapped
\r
246 for key in sorted(graph):
\r
248 checkIfBorder(graph, key, Options.RecursiveDepth, tmplist)
\r
249 #print "out of Checkif 0"
\r
251 for key in reversed(sorted(graph)):
\r
252 checkIfBorder(graph, key, Options.RecursiveDepth, tmplist)
\r
254 Options.IsolatedGenList = []
\r
256 for i in range(len(carray[0])):
\r
257 if carray[0][i] in tmplist:
\r
258 if iarray[0][i] not in Options.IsolatedGenList:
\r
259 Options.IsolatedGenList.append(iarray[0][i])
\r
260 if carray[1][i] in tmplist:
\r
261 if iarray[1][i] not in Options.IsolatedGenList:
\r
262 Options.IsolatedGenList.append(iarray[1][i])
\r
266 for i in range(len(iarray[0])):
\r
267 name = iarray[0][i] + '-' + iarray[1][i]
\r
268 if '@' in iarray[2][i] or '*' in iarray[2][i]:
\r
269 outLines.append(name)
\r
270 elif iarray[0][i] not in Options.IsolatedGenList and iarray[1][i] not in Options.IsolatedGenList:
\r
273 outLines.append(name)
\r
274 Options.TrueLines = lines
\r
278 NoBreakersandSwitches = True
\r
280 def ExtractGeneratorLoadLineandTransfoDico(NetworkFile,PSSE_PATH):
\r
282 print "version en dur"
\r
283 MachineDico={'M1':'M1','M2':'M2','M3':'M3','M4':'M4','B6_BUS13__1':'AZ','CSPRING__1':'DD','GT12B__1':'ER','BSTMB__1':'JJ'}
\r
284 LoadDico={'C1':'C1','C2':'C2','C3':'C3','C4':'C4'}
\r
285 LineDico={'L1':'L1','L2':'L2','L3':'L3','L4':'L4'}
\r
286 TfoDico={'T1':'T1','T2':'T2','T3':'T3','T4':'T4'}
\r
287 MDico={'MZ1':'MZ1','MZ2':'MZ2','MZ3':'MZ3','MZ4':'MZ4'}
\r
288 BranchesDico={'B11':'B1','B2':'B2','B3':'B3','B4':'B4'}
\r
289 BusNomial={'Bus1':'Bus1','Bus2':'Bus2','Bus3':'Bus3','Bus4':'Bus4'}
\r
291 return MachineDico, LoadDico, LineDico, TfoDico, MotorDico, BusDico, BranchesDico, BusNominal
\r
298 sys.path.append(PSSE_PATH)
\r
299 os.environ['PATH'] += ';' + PSSE_PATH + ';'
\r
304 ###initialization PSSE
\r
305 psspy.psseinit(10000)
\r
306 _i=psspy.getdefaultint()
\r
307 _f=psspy.getdefaultreal()
\r
308 _s=psspy.getdefaultchar()
\r
311 # Silent execution of PSSe
\r
312 islct=6 # 6=no output; 1=standard
\r
313 psspy.progress_output(islct)
\r
316 psspy.case(NetworkFile)
\r
319 sid = -1 # all buses
\r
321 string = ['NUMBER']
\r
322 ierr, iarray = psspy.abusint(sid, flag, string)
\r
324 string = ['NAME', 'EXNAME']
\r
325 ierr, carray = psspy.abuschar(sid, flag, string)
\r
328 ierr, ret = psspy.abusreal(sid, flag, string)
\r
332 for i in range(len(iarray[0])):
\r
333 BusNum = iarray[0][i]
\r
334 BusDico[str(BusNum)] = carray[0][i].strip()
\r
335 BusNominal[BusDico[str(BusNum)]] = ret[0][i]
\r
338 sid = -1 #all buses
\r
339 flag = 1 #all in service loads/generators (4 all loads/generators)
\r
342 string = ['NUMBER']
\r
343 ierr,iarray = psspy.aloadint(sid,flag,string)
\r
345 string = ['NAME','ID','EXNAME']
\r
346 ierr,carray = psspy.aloadchar(sid,flag,string)
\r
348 string = ['mvaact']
\r
349 ierr, xdata = psspy.aloadcplx(sid, flag, string)
\r
351 LoadDico = {} # [Bus name, load ID, extended bus name, bus number]
\r
352 for i in range(len(iarray[0])):
\r
353 idname = "Lo" + carray[1][i].strip()
\r
354 # try: #id is an integer
\r
355 # idname = "Lo" + str(int(carray[1][i]))
\r
356 # except: #id is not an integer
\r
357 # idname = "Lo" + carray[1][i]
\r
358 loadname = carray[0][i].strip()+ "__" + idname
\r
359 loadname = loadname.replace(" ","_")
\r
360 loadname = loadname.replace("-","_")
\r
361 loadname = loadname.replace(".","_")
\r
362 loadname = loadname.replace("&","and")
\r
365 loadname="_" + loadname
\r
368 LoadDico[loadname]= {}
\r
369 LoadDico[loadname]['NAME'] = carray[0][i].strip()
\r
370 LoadDico[loadname]['ID'] = carray[1][i]
\r
371 LoadDico[loadname]['EXNAME'] =carray[2][i]
\r
372 LoadDico[loadname]['NUMBER']=iarray[0][i]
\r
373 LoadDico[loadname]['P']=np.real(xdata)[0][i]
\r
374 LoadDico[loadname]['Q']=np.imag(xdata)[0][i]
\r
376 #Extract Generators
\r
377 sid = -1 #all buses
\r
378 flag = 1 #all in service loads/generators (4 all loads/generators)
\r
380 string = ['NUMBER']
\r
381 ierr,iarray = psspy.amachint(sid,flag,string)
\r
383 string = ['NAME','ID','EXNAME']
\r
384 ierr,carray = psspy.amachchar(sid,flag,string)
\r
386 rstrings = ['pgen','qgen','mbase','pmax','qmax','pmin','qmin']
\r
387 ierr, rarray = psspy.amachreal(sid, flag, rstrings)
\r
389 MachineDico = {} # [Bus name, machine ID, extended bus name, bus number]
\r
390 for i in range(len(iarray[0])):
\r
391 idname = "Gr" + carray[1][i].strip()
\r
393 ## idname = "Gr" + str(int(carray[1][i]))
\r
395 ## idname = "Gr" + carray[1][i]
\r
396 machinename = carray[0][i].strip()+ "__" + idname
\r
397 machinename = machinename.replace(" ","_")
\r
398 machinename = machinename.replace("-","_")
\r
399 machinename = machinename.replace(".","_")
\r
400 machinename = machinename.replace("&","and")
\r
402 int(machinename[0])
\r
403 machinename="_" + machinename
\r
406 MachineDico[machinename]={}
\r
407 MachineDico[machinename]['NAME'] = carray[0][i].strip()
\r
408 MachineDico[machinename]['ID'] = carray[1][i]
\r
409 MachineDico[machinename]['EXNAME'] =carray[2][i]
\r
410 MachineDico[machinename]['NUMBER']=iarray[0][i]
\r
411 MachineDico[machinename]['P']=rarray[0][i]
\r
412 MachineDico[machinename]['Q']=rarray[1][i]
\r
413 MachineDico[machinename]['PMAX']=rarray[3][i]
\r
414 MachineDico[machinename]['QMAX']=rarray[4][i]
\r
415 MachineDico[machinename]['PMIN']=rarray[5][i]
\r
416 MachineDico[machinename]['QMIN']=rarray[6][i]
\r
419 sid = -1 #all buses
\r
420 flag = 1 #all in service loads/generators (4 all loads/generators)
\r
422 string = ['NUMBER','PSETCODE','BASECODE']
\r
423 ierr,iarray = psspy.aindmacint(sid,flag,string)
\r
425 string = ['NAME','ID','EXNAME']
\r
426 ierr,carray = psspy.aindmacchar(sid,flag,string)
\r
428 rstrings = ['psetpoint','mbase','p','q']
\r
429 ierr, rarray = psspy.aindmacreal(sid, flag, rstrings)
\r
432 MotorDico = {} # [Bus name, machine ID, extended bus name, bus number]
\r
433 for i in range(len(iarray[0])):
\r
434 idname = "Mo" + carray[1][i].strip()
\r
436 ## idname = "Gr" + str(int(carray[1][i]))
\r
438 ## idname = "Gr" + carray[1][i]
\r
439 motorname = carray[0][i].strip()+ "__" + idname
\r
440 motorname = motorname.replace(" ","_")
\r
441 motorname = motorname.replace("-","_")
\r
442 motorname = motorname.replace(".","_")
\r
443 motorname = motorname.replace("&","and")
\r
446 motorname="_" + motorname
\r
449 MotorDico[motorname]={}
\r
450 MotorDico[motorname]['NAME'] = carray[0][i].strip()
\r
451 MotorDico[motorname]['ID'] = carray[1][i]
\r
452 MotorDico[motorname]['EXNAME'] =carray[2][i]
\r
453 MotorDico[motorname]['NUMBER']=iarray[0][i]
\r
454 MotorDico[motorname]['PSETCODE']=iarray[1][i]
\r
455 MotorDico[motorname]['BASECODE']=iarray[2][i]
\r
456 MotorDico[motorname]['PSETPOINT']=rarray[0][i]
\r
457 MotorDico[motorname]['MBASE']=rarray[1][i]
\r
458 MotorDico[motorname]['P']=rarray[2][i]
\r
459 MotorDico[motorname]['Q']=rarray[3][i]
\r
466 flag = 2 #6 for two-winding transfos
\r
467 entry = 1 #each branch once, not both directions
\r
468 string = ['FROMNUMBER','TONUMBER']
\r
469 ierr,iarray = psspy.abrnint(sid,owner,ties,flag,entry,string)
\r
470 string = ['FROMNAME','TONAME','FROMEXNAME','TOEXNAME','ID']
\r
471 ierr,carray = psspy.abrnchar(sid,owner,ties,flag,entry,string)
\r
473 LineDico = {} #[linename, Bus name 1, Bus name 2, ID, extended bus name 1, extended bus name 2, bus number 1, bus number 2]
\r
474 for i in range(len(iarray[0])):
\r
475 idname = carray[4][i].strip()
\r
476 #idname = carray[4][i]
\r
478 idname = idname.replace('@','Br')
\r
479 elif '*' in idname:
\r
480 idname = idname.replace('*','Sw')
\r
483 idname = 'Li' + str(int(idname))
\r
485 idname = 'Li' + idname
\r
486 linename =carray[0][i].strip() + "__" + carray[1][i].strip() + "__" + idname
\r
487 linename = linename.replace(" ","_")
\r
488 linename = linename.replace("-","_")
\r
489 linename = linename.replace(".","_")
\r
490 linename = linename.replace("&","and")
\r
493 linename="_" + linename
\r
496 if NoBreakersandSwitches:
\r
497 if 'Br' not in idname and 'Sw' not in idname:
\r
498 LineDico[linename]={}
\r
499 LineDico[linename]['FROMNAME']=carray[0][i].strip()
\r
500 LineDico[linename]['TONAME']=carray[1][i].strip()
\r
501 LineDico[linename]['ID']=carray[4][i]
\r
502 LineDico[linename]['FROMEXNAME']=carray[2][i]
\r
503 LineDico[linename]['TOEXNAME']=carray[3][i]
\r
504 LineDico[linename]['FROMNUMBER']=iarray[0][i]
\r
505 LineDico[linename]['TONUMBER']=iarray[1][i]
\r
511 flag = 4 # lines & transfos
\r
512 entry = 1 #each branch once, not both directions
\r
513 string = ['FROMNUMBER','TONUMBER']
\r
514 ierr, iarray = psspy.abrnint(sid, owner, ties, flag, entry, string)
\r
515 string = ['FROMNAME','TONAME','FROMEXNAME','TOEXNAME','ID']
\r
516 ierr, carray = psspy.abrnchar(sid, owner, ties, flag, entry, string)
\r
518 BranchesDico = {} #[linename, Bus name 1, Bus name 2, ID, extended bus name 1, extended bus name 2, bus number 1, bus number 2]
\r
519 for i in range(len(iarray[0])):
\r
520 idname = carray[4][i]
\r
522 idname = idname.replace('@','Br')
\r
523 elif '*' in idname:
\r
524 idname = idname.replace('*','Sw')
\r
526 idname = 'LI' + idname
\r
527 linename = carray[0][i].strip() + "__" + carray[1][i].strip() + "__" + idname
\r
528 linename = linename.replace(" ","_")
\r
529 linename = linename.replace("-","_")
\r
530 linename = linename.replace(".","_")
\r
531 linename = linename.replace("&","and")
\r
534 linename = "_" + linename
\r
537 if linename[-1] == '_':
\r
538 linename = linename[:-1]
\r
539 BranchesDico[linename] = {}
\r
540 BranchesDico[linename]['FROMNAME'] = carray[0][i].strip()
\r
541 BranchesDico[linename]['TONAME'] = carray[1][i].strip()
\r
542 BranchesDico[linename]['ID'] = carray[4][i]
\r
543 BranchesDico[linename]['FROMEXNAME'] = carray[2][i]
\r
544 BranchesDico[linename]['TOEXNAME'] = carray[3][i]
\r
545 BranchesDico[linename]['FROMNUMBER'] = iarray[0][i]
\r
546 BranchesDico[linename]['TONUMBER'] = iarray[1][i]
\r
553 flag = 6 #two-winding transfos
\r
554 entry = 1 #each branch once, not both directions
\r
555 string = ['FROMNUMBER','TONUMBER']
\r
556 ierr,iarray = psspy.abrnint(sid,owner,ties,flag,entry,string)
\r
557 string = ['FROMNAME','TONAME','FROMEXNAME','TOEXNAME','ID']
\r
558 ierr,carray = psspy.abrnchar(sid,owner,ties,flag,entry,string)
\r
560 TfoDico = {} #[linename, Bus name 1, Bus name 2, machine ID, extended bus name 1, extended bus name 2, bus number 1, bus number 2]
\r
561 for i in range(len(iarray[0])):
\r
562 idname = 'Tr' + carray[4][i].strip()
\r
564 ## idname = 'Tr' + str(int(carray[4][i]))
\r
566 ## idname = 'Tr' + carray[4][i]
\r
567 tfoname = carray[0][i].strip() + "__" + carray[1][i].strip() + "__" + idname
\r
568 tfoname = tfoname.replace(" ","_")
\r
569 tfoname = tfoname.replace("-","_")
\r
570 tfoname = tfoname.replace(".","_")
\r
571 tfoname = tfoname.replace("&","and")
\r
574 tfoname="_" + tfoname
\r
577 TfoDico[tfoname]={}
\r
578 TfoDico[tfoname]['FROMNAME']=carray[0][i].strip()
\r
579 TfoDico[tfoname]['TONAME']=carray[1][i].strip()
\r
580 TfoDico[tfoname]['ID']=carray[4][i]
\r
581 TfoDico[tfoname]['FROMEXNAME']=carray[2][i]
\r
582 TfoDico[tfoname]['TOEXNAME']=carray[3][i]
\r
583 TfoDico[tfoname]['FROMNUMBER']=iarray[0][i]
\r
584 TfoDico[tfoname]['TONUMBER']=iarray[1][i]
\r
585 TfoDico[tfoname]['#WIND']=2
\r
587 #Extract 3 winding Transfos
\r
588 sid = -1 #assume a subsystem containing all buses in working case
\r
589 owner_3flow = 1 #1 = use bus ownership 2 = use tfo ownership
\r
590 ties_3flow = 3 #ignored bc sid is negative. 3 = interior subsystem and subsystem tie 3 winding transformers
\r
591 flag=3 #all 3 winding transfo windings
\r
592 string = ['wind1number','wind2number','wind3number']
\r
593 ierr,iarray = psspy.awndint(sid,owner,ties,flag,entry,string)
\r
594 string = ['wind1name','wind2name','wind3name','wind1exname','wind2exname','wind3exname','id']
\r
595 ierr,carray = psspy.awndchar(sid,owner,ties,flag,entry,string)
\r
597 #[Bus name 1, Bus name 2, Bus name 3, machine ID, extended bus name 1, extended bus name 2, extended bus name 3, bus number 1, bus number 2, bus number 3]
\r
598 for i in range(len(iarray[0])):
\r
599 idname = 'Tr' + carray[6][i].strip()
\r
601 ## idname = 'Tr' + str(int(carray[4][i]))
\r
603 ## idname = 'Tr' + carray[4][i]
\r
604 tfoname = carray[0][i].strip() + "__" + carray[1][i].strip() + "__" + carray[2][i].strip() + "__" + idname
\r
605 tfoname = tfoname.replace(" ","_")
\r
606 tfoname = tfoname.replace("-","_")
\r
607 tfoname = tfoname.replace(".","_")
\r
608 tfoname = tfoname.replace("&","and")
\r
611 tfoname="_" + tfoname
\r
614 TfoDico[tfoname]={}
\r
615 TfoDico[tfoname]['FROMNAME']=carray[0][i].strip()
\r
616 TfoDico[tfoname]['TONAME']=carray[1][i].strip()
\r
617 TfoDico[tfoname]['3NAME']=carray[2][i].strip()
\r
618 TfoDico[tfoname]['ID']=carray[6][i]
\r
619 TfoDico[tfoname]['FROMEXNAME']=carray[3][i]
\r
620 TfoDico[tfoname]['TOEXNAME']=carray[4][i]
\r
621 TfoDico[tfoname]['3EXNAME']=carray[5][i]
\r
622 TfoDico[tfoname]['FROMNUMBER']=iarray[0][i]
\r
623 TfoDico[tfoname]['TONUMBER']=iarray[1][i]
\r
624 TfoDico[tfoname]['3NUMBER']=iarray[2][i]
\r
625 TfoDico[tfoname]['#WIND']=3
\r
627 #print MachineDico, LoadDico, LineDico, TfoDico, MotorDico, BusDico, BranchesDico, BusNominal
\r
628 return MachineDico, LoadDico, LineDico, TfoDico, MotorDico, BusDico, BranchesDico, BusNominal
\r