| | |
| | | import xml.etree.ElementTree as ET |
| | | import base64 |
| | | import zlib |
| | | import io |
| | | import sys,io |
| | | import os |
| | | from itertools import islice |
| | | import mmap |
| | |
| | | try: |
| | | self.dT=int(epoch2)-int(epoch1) |
| | | self.last=n2 |
| | | print(epoch1) |
| | | print(epoch2) |
| | | print(self.dT) |
| | | print(self.last) |
| | | #print(epoch1) |
| | | #print(epoch2) |
| | | #print(self.dT) |
| | | #print(self.last) |
| | | self.startDate=os.path.getmtime(os.path.join(self.path,'.lock')) |
| | | except: |
| | | return(False) |
| | | return(True) |
| | | |
| | | def readText(self): |
| | | with open(self.fullname, 'r+') as fin: |
| | | cont=fin.read() |
| | | return cont |
| | | |
| | | def read_old(self): |
| | | ''' |
| | |
| | | ''' |
| | | Class Runner consists of a single running or terminated instance of the trisurf. It manages starting, stopping, verifying the running process and printing the reports of the configured instances. |
| | | ''' |
| | | |
| | | @property |
| | | def Dir(self): |
| | | return Directory(maindir=self.maindir,simdir=self.subdir) |
| | | |
| | | |
| | | @property |
| | | def Statistics(self): |
| | | return Statistics(self.Dir.fullpath(), "statistics.csv") |
| | | |
| | | def __init__(self, subdir='run0', tape=None, snapshot=None, runArgs=[]): |
| | | self.subdir=subdir |
| | | self.runArgs=runArgs |
| | |
| | | |
| | | |
| | | def initFromTape(self, tape): |
| | | self.tape=Tape() |
| | | self.tape.readTape(tape) |
| | | self.tapeFile=tape |
| | | self.Tape=Tape() |
| | | self.Tape.readTape(tape) |
| | | self.tapeFilename=tape |
| | | |
| | | def initFromSnapshot(self, snapshotfile): |
| | | try: |
| | |
| | | root = tree.getroot() |
| | | tapetxt=root.find('tape') |
| | | version=root.find('trisurfversion') |
| | | self.tape=Tape() |
| | | self.tape.setTape(tapetxt.text) |
| | | self.Tape=Tape() |
| | | self.Tape.setTape(tapetxt.text) |
| | | |
| | | def getPID(self): |
| | | self.Dir=Directory(maindir=self.maindir,simdir=self.subdir) |
| | | #self.Dir.makeifnotexist() |
| | | try: |
| | | fp = open(os.path.join(self.Dir.fullpath(),'.lock')) |
| | | except IOError as e: |
| | |
| | | return int(pid) |
| | | |
| | | def getLastIteration(self): |
| | | self.Dir=Directory(maindir=self.maindir,simdir=self.subdir) |
| | | #self.Dir.makeifnotexist() |
| | | try: |
| | | fp = open(os.path.join(self.Dir.fullpath(),'.status')) |
| | | except IOError as e: |
| | |
| | | return int(status) |
| | | |
| | | def isCompleted(self): |
| | | if (int(self.tape.getValue("iterations"))==self.getLastIteration()+1): |
| | | if int(self.Tape.getValue("iterations"))+int(self.Tape.getValue("inititer"))==self.getLastIteration()+1: |
| | | return True |
| | | else: |
| | | return False |
| | |
| | | if(shutil.which('trisurf')==None): |
| | | print("Error. Trisurf executable not found in PATH. Please install trisurf prior to running trisurf manager.") |
| | | exit(1) |
| | | self.Dir=Directory(maindir=self.maindir,simdir=self.subdir) |
| | | #Symlinks tape file to the directory or create tape file from snapshot in the direcory... |
| | | if(self.Dir.makeifnotexist()): |
| | | if(self.fromSnapshot==False): |
| | | try: |
| | | os.symlink(os.path.abspath(self.tapeFile), self.Dir.fullpath()+"/tape") |
| | | os.symlink(os.path.abspath(self.tapeFilename), self.Dir.fullpath()+"/tape") |
| | | except: |
| | | print("Error while symlinking "+os.path.abspath(self.tapeFile)+" to "+self.Dir.fullpath()+"/tape") |
| | | print("Error while symlinking "+os.path.abspath(self.tapeFilename)+" to "+self.Dir.fullpath()+"/tape") |
| | | exit(1) |
| | | else: |
| | | try: |
| | | with open (os.path.join(self.Dir.fullpath(),"tape"), "w") as myfile: |
| | | #myfile.write("#This is automatically generated tape file from snapshot") |
| | | myfile.write(str(self.tape.rawText)) |
| | | myfile.write(str(self.Tape.rawText)) |
| | | except: |
| | | print("Error -- cannot make tapefile "+ os.path.join(self.Dir.fullpath(),"tape")+" from the snapshot in the running directory") |
| | | exit(1) |
| | |
| | | maindir="" |
| | | for p,v in zip(prefix,variables): |
| | | if(v=="xk0"): |
| | | tv=str(round(float(self.tape.config[v]))) |
| | | tv=str(round(float(self.Tape.config[v]))) |
| | | if sys.version_info<(3,0): |
| | | tv=str(int(float(self.Tape.config[v]))) |
| | | else: |
| | | tv=self.tape.config[v] |
| | | tv=self.Tape.config[v] |
| | | maindir=maindir+p+tv |
| | | self.maindir=maindir |
| | | return |
| | |
| | | return |
| | | |
| | | def getStatistics(self, statfile="statistics.csv"): |
| | | self.Dir=Directory(maindir=self.maindir,simdir=self.subdir) |
| | | self.statistics=Statistics(self.Dir.fullpath(), statfile) |
| | | self.Comment=FileContent(os.path.join(self.Dir.fullpath(),".comment")) |
| | | pid=self.getPID() |
| | | status=self.getStatus() |
| | | if(self.statistics.fileOK): |
| | | ETA=str(datetime.timedelta(microseconds=(int(self.tape.config['iterations'])-int(self.statistics.last))*self.statistics.dT)*1000000) |
| | | if(self.Statistics.fileOK): |
| | | ETA=str(datetime.timedelta(microseconds=(int(self.Tape.config['iterations'])-int(self.Statistics.last))*self.Statistics.dT)*1000000) |
| | | if(status==TS_NONEXISTANT or status==TS_NOLOCK): |
| | | statustxt="Not running" |
| | | pid="" |
| | |
| | | else: |
| | | statustxt="Running" |
| | | |
| | | if(self.statistics.fileOK): |
| | | report=[time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(int(self.statistics.startDate))),ETA, statustxt, pid, str(self.Dir.fullpath()), self.Comment.getText()] |
| | | if(self.Statistics.fileOK): |
| | | report=[time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(int(self.Statistics.startDate))),ETA, statustxt, pid, str(self.Dir.fullpath()), self.Comment.getText()] |
| | | else: |
| | | report=["N/A","N/A",statustxt, pid, str(self.Dir.fullpath()), self.Comment.getText()] |
| | | return report |
| | | |
| | | |
| | | def stop(self): |
| | | p=psutil.Process(self.getPID()) |
| | | p.kill() |
| | | try: |
| | | p=psutil.Process(self.getPID()) |
| | | p.kill() |
| | | except: |
| | | print("Could not stop the process. Is the process running? Do you have sufficient privileges?") |
| | | |
| | | |
| | | def writeComment(self, data, mode='w'): |
| | | self.Dir=Directory(maindir=self.maindir,simdir=self.subdir) |
| | | self.Comment=FileContent(os.path.join(self.Dir.fullpath(),".comment")) |
| | | self.Comment.writefile(data,mode=mode) |
| | | |
| | | |
| | | def getLastVTU(self): |
| | | vtuidx=self.getLastIteration() |
| | | vtuidx=self.getLastIteration()-int(self.Tape.getValue("inititer")) |
| | | if vtuidx<0: |
| | | return None |
| | | else: |