From fbbc8ee59b12f68bd8575333dbb449eba2b75fd4 Mon Sep 17 00:00:00 2001 From: Samo Penic <samo.penic@fe.uni-lj.si> Date: Mon, 14 Mar 2016 13:15:06 +0000 Subject: [PATCH] Added locking to c? Not used yet, not debugged. --- python/trisurf/trisurf.py | 182 +++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 167 insertions(+), 15 deletions(-) diff --git a/python/trisurf/trisurf.py b/python/trisurf/trisurf.py index 6478f39..bf0809e 100644 --- a/python/trisurf/trisurf.py +++ b/python/trisurf/trisurf.py @@ -1,7 +1,14 @@ #!/usr/bin/python3 import configobj - +import xml.etree.ElementTree as ET +import base64 +import zlib +import io +import os +from itertools import islice +import mmap +import shlex ''' This is a trisurf instance manager written in python @@ -27,47 +34,192 @@ except: print("Error reading or parsing tape file!\n") exit(1) - def setTape(self, string): - self.tape=string + self.config=configobj.ConfigObj(io.StringIO(string)) return def getValue(self,key): return self.config[key] + def __str__(self): + retval="" + for key,val in self.config.iteritems(): + retval=retval+str(key)+" = "+str(val)+"\n" + return retval + + + +class Directory: + def __init__(self, maindir=".", simdir=""): + self.maindir=maindir + self.simdir=simdir + return + + def fullpath(self): + return os.path.join(self.maindir,self.simdir) + + def exists(self): + path=self.fullpath() + if(os.path.exists(path)): + return 1 + else: + return 0 + + def make(self): + try: + os.makedirs(self.fullpath()) + except: + print("Cannot make directory "+self.fullpath()+"\n") + exit(1) + return + + def makeifnotexist(self): + if(self.exists()==0): + self.make() + return + + def remove(self): + if(self.exists()): + try: + os.rmdir(self.fullpath()) + except: + print("Cannot remove directory "+self.fullpath()+ "\n") + exit(1) + return + + def goto(self): + try: + os.chdir(self.fullpath()) + except: + print("Cannot go to directory "+self.fullpath()+"\n") + return + + +class Statistics: + def __init__(self,path,filename="statistics.csv"): + self.path=path + self.filename=filename + self.fullname=os.path.join(path,filename) + self.read() + return + + def __str__(self): + return(str(self.fullname)) + + def exists(self): + if(os.path.isfile(self.fullname)): + return True + else: + return False + + def mapcount(self): + f = open(self.fullname, "r+") + buf = mmap.mmap(f.fileno(), 0) + lines = 0 + readline = buf.readline + while readline(): + lines += 1 + return lines + + def read(self): + if(self.exists()): + nlines=self.mapcount() + try: + with open(self.fullname, "r+") as fin: + i=0; + for line in fin: + if(i==1): + #print (line) + fields=shlex.split(line) + epoch1=fields[0] + n1=fields[1] + if(i==nlines-1): + fields=shlex.split(line) + epoch2=fields[0] + n2=fields[1] + i=i+1 + except: + print("Cannot read statistics file in "+self.fullname+"\n") + return(False) + else: + print("File "+self.fullname+" does not exists.\n") + return(False) + + self.dT=(int(epoch2)-int(epoch1))/(int(n2)-int(n1)) + return(True) class Runner: ''' Class Runner consists of a single running or terminated instance of the trisurf ''' - def initFromTape(self, tape='tape'): - self.tape=Tape() - self.tape.readTape(tape) - pass - - def initFromSnapshot(self, tape='snapshot.vtu'): - pass - def __init__(self, subdir='run0', tape='', snapshot=''): self.subdir=subdir if(tape!=''): self.initFromTape(tape) if(snapshot!=''): self.initFromSnapshot(snapshot) - return + + def initFromTape(self, tape): + self.tape=Tape() + self.tape.readTape(tape) + + def initFromSnapshot(self, snapshotfile): + try: + tree = ET.parse(snapshotfile) + except: + print("Error reading snapshot file") + exit(1) + + root = tree.getroot() + tapetxt=root.find('tape') + version=root.find('trisurfversion') + self.tape=Tape() + self.tape.setTape(tapetxt.text) + def getStatus(self): - pass + return 0 def start(self): - pass + if(self.getStatus()==0): + self.Dir=Directory(maindir=self.maindir,simdir=self.subdir) + self.Dir.makeifnotexist() + self.Dir.goto() + print("Starting trisurf-ng executable at "+self.Dir.fullpath()+"\n") + else: + print("Process already running. Not starting\n") + return def stop(self): pass + def setMaindir(self,prefix,variables): + maindir="./" + for p,v in zip(prefix,variables): + if(v=="xk0"): + tv=str(round(float(self.tape.config[v]))) + else: + tv=self.tape.config[v] + maindir=maindir+p+tv + self.maindir=maindir + return + + def setSubdir(self, subdir="run0"): + self.subdir=subdir + return + + def getStatistics(self, statfile="statistics.csv"): + self.statistics=Statistics("", statfile) # we are already in the running directory, so local path is needed! + return + def __str__(self): - return("Running instance") + if(self.getStatus()==0): + str=" not running." + else: + str=" running." + return(self.Dir.fullpath()+str) + -- Gitblit v1.9.3