def scaleCase9(networkJson, iterations): newBuses = {} newGens = {} newBranches = {} busCounter = 0 for x in range(iterations): for key, bus in networkJson["bus"].iteritems(): newKey = str(int(key) + busCounter) newBuses[newKey] = copy.deepcopy(bus) newBuses[newKey]["bus_i"] = newKey busCounter = busCounter + 9 genCounter = 0 for x in range(iterations): for key, gen in networkJson["gen"].iteritems(): newKey = str(int(key) + genCounter) newGens[newKey] = copy.deepcopy(gen) newGens[newKey]["bus"] = newKey genCounter = genCounter + 9 branchCounter = 0 for x in range(iterations): for key, branch in networkJson["branch"].iteritems(): newKey = str(int(key) + branchCounter) newBranches[newKey] = copy.deepcopy(branch) newBranches[newKey]["fbus"] = str( int(branch["fbus"]) + branchCounter) newBranches[newKey]["tbus"] = str( int(branch["tbus"]) + branchCounter) branchCounter = branchCounter + 9 networkJson["bus"] = newBuses networkJson["gen"] = newGens networkJson["branch"] = newBranches matStr = network.netToMat(networkJson, networkName) with open("manyCase9Scaled.m", "w") as outMat: for row in matStr: outMat.write(row) return networkJson
def work(modelDir, inputDict): ''' Run the model in its directory.''' outData = { 'tableData' : {'volts': [[],[]], 'powerReal' : [[],[]], 'powerReact' : [[],[]]}, # 'charts' : {'volts' : '', 'powerReact' : '', 'powerReal' : ''}, 'voltsChart' : '', 'powerReactChart' : '', 'powerRealChart' : '', 'stdout' : '', 'stderr' : '' } # Read feeder and convert to .mat. try: networkName = [x for x in os.listdir(modelDir) if x.endswith('.omt')][0][0:-4] except: networkName = 'case9' with open(pJoin(modelDir,networkName+".omt")) as f: networkJson = json.load(f) matName = 'matIn' matFileName = matName + '.m' matStr = network.netToMat(networkJson, matName) with open(pJoin(modelDir, matFileName),"w") as outMat: for row in matStr: outMat.write(row) # Build the MATPOWER command. matDir = pJoin(__neoMetaModel__._omfDir,'solvers','matpower5.1') if platform.system() == "Windows": pathSep = ";" else: pathSep = ":" matPath = '"' + pathSep.join([matDir,pJoin(matDir,'t'),pJoin(matDir,'extras')]) + '"' algorithm = inputDict.get("algorithm","NR") pfArg = "'pf.alg', '" + algorithm + "'" modelArg = "'model', '" + inputDict.get("model","AC") + "'" iterCode = "pf." + algorithm[:2].lower() + ".max_it" pfItArg = "'" + iterCode + "', " + str(inputDict.get("iteration",10)) pfTolArg = "'pf.tol', " + str(inputDict.get("tolerance",math.pow(10,-8))) pfEnflArg = "'pf.enforce_q_lims', " + str(inputDict.get("genLimits",0)) if platform.system() == "Windows": # Find the location of octave-cli tool. envVars = os.environ["PATH"].split(';') octavePath = "C:\\Octave\\Octave-4.2.0" for pathVar in envVars: if "octave" in pathVar.lower(): octavePath = pathVar # Run Windows-specific Octave command. mpoptArg = "mpoption(" + pfArg + ", " + modelArg + ", " + pfItArg + ", " + pfTolArg+", " + pfEnflArg + ") " cmd = "runpf('"+pJoin(modelDir,matFileName)+"'," + mpoptArg +")" args = [octavePath + '\\bin\\octave-cli','-p',matPath, "--eval", cmd] myOut = subprocess.check_output(args, shell=True) with open(pJoin(modelDir, "matout.txt"), "w") as matOut: matOut.write(myOut) else: # Run UNIX Octave command. mpoptArg = "mpopt = mpoption("+pfArg+", "+modelArg+", "+pfItArg+", "+pfTolArg+", "+pfEnflArg+"); " command = "octave -p " + matPath + "--no-gui --eval \""+mpoptArg+"runpf('"+pJoin(modelDir,matFileName)+"', mpopt)\" > \"" + pJoin(modelDir,"matout.txt") + "\"" proc = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True) print(command) (out, err) = proc.communicate() imgSrc = pJoin(__neoMetaModel__._omfDir,'scratch','transmission','inData') # Read matout.txt and parse into outData. gennums=[] todo = None with open(pJoin(modelDir,"matout.txt")) as f: for i,line in enumerate(f): # Determine what type of data is coming up. if "How many?" in line: todo = "count" elif "Generator Data" in line: todo = "gen" lineNo = i elif "Bus Data" in line: todo = "node" lineNo = i elif "Branch Data" in line: todo = "line" lineNo = i # Parse lines. line = line.split(' ') line = [a for a in line if a != ''] if todo=="count": if "Buses" in line: busCount = int(line[1]) elif "Generators" in line: genCount = int(line[1]) elif "Loads" in line: loadCount = int(line[1]) elif "Branches" in line: branchCount = int(line[1]) elif "Transformers" in line: transfCount = int(line[1]) todo = None elif todo=="gen": if i>(lineNo+4) and i<(lineNo+4+genCount+1): # gen bus numbers. gennums.append(line[1]) elif i>(lineNo+4+genCount+1): todo = None elif todo=="node": if i>(lineNo+4) and i<(lineNo+4+busCount+1): # voltage if line[0] in gennums: comp="gen" else: comp="node" outData['tableData']['volts'][0].append(comp+str(line[0])) outData['tableData']['powerReal'][0].append(comp+str(line[0])) outData['tableData']['powerReact'][0].append(comp+str(line[0])) outData['tableData']['volts'][1].append(line[1]) outData['tableData']['powerReal'][1].append(line[3]) outData['tableData']['powerReact'][1].append(line[4]) elif i>(lineNo+4+busCount+1): todo = None elif todo=="line": if i>(lineNo+4) and i<(lineNo+4+branchCount+1): # power outData['tableData']['powerReal'][0].append("line"+str(line[0])) outData['tableData']['powerReact'][0].append("line"+str(line[0])) outData['tableData']['powerReal'][1].append(line[3]) outData['tableData']['powerReact'][1].append(line[4]) elif i>(lineNo+4+branchCount+1): todo = None # Massage the data. for powerOrVolt in outData['tableData'].keys(): for i in range(len(outData['tableData'][powerOrVolt][1])): if outData['tableData'][powerOrVolt][1][i]!='-': outData['tableData'][powerOrVolt][1][i]=float(outData['tableData'][powerOrVolt][1][i]) #Create chart nodeVolts = outData["tableData"]["volts"][1] minNum = min(nodeVolts) maxNum = max(nodeVolts) norm = matplotlib.colors.Normalize(vmin=minNum, vmax=maxNum, clip=True) cmViridis = plt.get_cmap('viridis') mapper = cm.ScalarMappable(norm=norm, cmap=cmViridis) mapper._A = [] plt.figure(figsize=(10,10)) plt.colorbar(mapper) plt.axis('off') plt.tight_layout() plt.gca().invert_yaxis() # HACK: to make latitudes show up right. TODO: y-flip the transEdit.html and remove this. plt.gca().set_aspect('equal') busLocations = {} i = 0 for busName, busInfo in networkJson["bus"].items(): y = float(busInfo["latitude"]) x = float(busInfo["longitude"]) plt.plot([x], [y], marker='o', markersize=12.0, color=mapper.to_rgba(nodeVolts[i]), zorder=5) busLocations[busName] = [x, y] i = i + 1 for genName, genInfo in networkJson["gen"].items(): x,y = busLocations[genInfo["bus"]] plt.plot([x], [y], 's', color='gray', zorder=10, markersize=6.0) for branchName, branchInfo in networkJson["branch"].items(): x1, y1 = busLocations[branchInfo["fbus"]] x2, y2 = busLocations[branchInfo["tbus"]] plt.plot([x1, x2], [y1,y2], color='black', marker = '', zorder=0) plt.savefig(modelDir + '/output.png') with open(pJoin(modelDir,"output.png"),"rb") as inFile: outData["chart"] = base64.standard_b64encode(inFile.read()).decode('ascii') # Stdout/stderr. outData["stdout"] = "Success" outData["stderr"] = "" return outData
def work(modelDir, inputDict): ''' Run the model in its directory.''' outData = { 'tableData' : {'volts': [[],[]], 'powerReal' : [[],[]], 'powerReact' : [[],[]]}, # 'charts' : {'volts' : '', 'powerReact' : '', 'powerReal' : ''}, 'voltsChart' : '', 'powerReactChart' : '', 'powerRealChart' : '', 'stdout' : '', 'stderr' : '' } # Read feeder and convert to .mat. try: networkName = [x for x in os.listdir(modelDir) if x.endswith('.omt')][0][0:-4] except: networkName = 'case9' networkJson = json.load(open(pJoin(modelDir,networkName+".omt"))) matName = 'matIn' matFileName = matName + '.m' matStr = network.netToMat(networkJson, matName) with open(pJoin(modelDir, matFileName),"w") as outMat: for row in matStr: outMat.write(row) # Build the MATPOWER command. matDir = pJoin(__neoMetaModel__._omfDir,'solvers','matpower5.1') if platform.system() == "Windows": pathSep = ";" else: pathSep = ":" matPath = '"' + pathSep.join([matDir,pJoin(matDir,'t'),pJoin(matDir,'extras')]) + '"' algorithm = inputDict.get("algorithm","NR") pfArg = "'pf.alg', '" + algorithm + "'" modelArg = "'model', '" + inputDict.get("model","AC") + "'" iterCode = "pf." + algorithm[:2].lower() + ".max_it" pfItArg = "'" + iterCode + "', " + str(inputDict.get("iteration",10)) pfTolArg = "'pf.tol', " + str(inputDict.get("tolerance",math.pow(10,-8))) pfEnflArg = "'pf.enforce_q_lims', " + str(inputDict.get("genLimits",0)) if platform.system() == "Windows": # Find the location of octave-cli tool. envVars = os.environ["PATH"].split(';') octavePath = "C:\\Octave\\Octave-4.2.0" for pathVar in envVars: if "octave" in pathVar.lower(): octavePath = pathVar # Run Windows-specific Octave command. mpoptArg = "mpoption(" + pfArg + ", " + modelArg + ", " + pfItArg + ", " + pfTolArg+", " + pfEnflArg + ") " cmd = "runpf('"+pJoin(modelDir,matFileName)+"'," + mpoptArg +")" args = [octavePath + '\\bin\\octave-cli','-p',matPath, "--eval", cmd] myOut = subprocess.check_output(args, shell=True) with open(pJoin(modelDir, "matout.txt"), "w") as matOut: matOut.write(myOut) else: # Run UNIX Octave command. mpoptArg = "mpopt = mpoption("+pfArg+", "+modelArg+", "+pfItArg+", "+pfTolArg+", "+pfEnflArg+"); " command = "octave -p " + matPath + "--no-gui --eval \""+mpoptArg+"runpf('"+pJoin(modelDir,matFileName)+"', mpopt)\" > \"" + pJoin(modelDir,"matout.txt") + "\"" proc = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True) print command (out, err) = proc.communicate() imgSrc = pJoin(__neoMetaModel__._omfDir,'scratch','transmission','inData') # Read matout.txt and parse into outData. gennums=[] todo = None with open(pJoin(modelDir,"matout.txt")) as f: for i,line in enumerate(f): # Determine what type of data is coming up. if "How many?" in line: todo = "count" elif "Generator Data" in line: todo = "gen" lineNo = i elif "Bus Data" in line: todo = "node" lineNo = i elif "Branch Data" in line: todo = "line" lineNo = i # Parse lines. line = line.split(' ') line = filter(lambda a: a!= '', line) if todo=="count": if "Buses" in line: busCount = int(line[1]) elif "Generators" in line: genCount = int(line[1]) elif "Loads" in line: loadCount = int(line[1]) elif "Branches" in line: branchCount = int(line[1]) elif "Transformers" in line: transfCount = int(line[1]) todo = None elif todo=="gen": if i>(lineNo+4) and i<(lineNo+4+genCount+1): # gen bus numbers. gennums.append(line[1]) elif i>(lineNo+4+genCount+1): todo = None elif todo=="node": if i>(lineNo+4) and i<(lineNo+4+busCount+1): # voltage if line[0] in gennums: comp="gen" else: comp="node" outData['tableData']['volts'][0].append(comp+str(line[0])) outData['tableData']['powerReal'][0].append(comp+str(line[0])) outData['tableData']['powerReact'][0].append(comp+str(line[0])) outData['tableData']['volts'][1].append(line[1]) outData['tableData']['powerReal'][1].append(line[3]) outData['tableData']['powerReact'][1].append(line[4]) elif i>(lineNo+4+busCount+1): todo = None elif todo=="line": if i>(lineNo+4) and i<(lineNo+4+branchCount+1): # power outData['tableData']['powerReal'][0].append("line"+str(line[0])) outData['tableData']['powerReact'][0].append("line"+str(line[0])) outData['tableData']['powerReal'][1].append(line[3]) outData['tableData']['powerReact'][1].append(line[4]) elif i>(lineNo+4+branchCount+1): todo = None # Massage the data. for powerOrVolt in outData['tableData'].keys(): for i in range(len(outData['tableData'][powerOrVolt][1])): if outData['tableData'][powerOrVolt][1][i]!='-': outData['tableData'][powerOrVolt][1][i]=float(outData['tableData'][powerOrVolt][1][i]) #Create chart nodeVolts = outData["tableData"]["volts"][1] minNum = min(nodeVolts) maxNum = max(nodeVolts) norm = matplotlib.colors.Normalize(vmin=minNum, vmax=maxNum, clip=True) cmViridis = plt.get_cmap('viridis') mapper = cm.ScalarMappable(norm=norm, cmap=cmViridis) mapper._A = [] plt.figure(figsize=(10,10)) plt.colorbar(mapper) plt.axis('off') plt.tight_layout() plt.gca().invert_yaxis() # HACK: to make latitudes show up right. TODO: y-flip the transEdit.html and remove this. plt.gca().set_aspect('equal') busLocations = {} i = 0 for busName, busInfo in networkJson["bus"].items(): y = float(busInfo["latitude"]) x = float(busInfo["longitude"]) plt.plot([x], [y], marker='o', markersize=12.0, color=mapper.to_rgba(nodeVolts[i]), zorder=5) busLocations[busName] = [x, y] i = i + 1 for genName, genInfo in networkJson["gen"].items(): x,y = busLocations[genInfo["bus"]] plt.plot([x], [y], 's', color='gray', zorder=10, markersize=6.0) for branchName, branchInfo in networkJson["branch"].items(): x1, y1 = busLocations[branchInfo["fbus"]] x2, y2 = busLocations[branchInfo["tbus"]] plt.plot([x1, x2], [y1,y2], color='black', marker = '', zorder=0) plt.savefig(modelDir + '/output.png') with open(pJoin(modelDir,"output.png"),"rb") as inFile: outData["chart"] = inFile.read().encode("base64") # Stdout/stderr. outData["stdout"] = "Success" outData["stderr"] = "" return outData