| | |
| | | import time |
| | | import datetime |
| | | import subprocess |
| | | import shutil |
| | | |
| | | # Process status |
| | | TS_NOLOCK=0 # lock file does not exist |
| | |
| | | version=root.find('trisurfversion') |
| | | self.tape=Tape() |
| | | self.tape.setTape(tapetxt.text) |
| | | |
| | | |
| | | def getPID(self): |
| | | self.Dir=Directory(maindir=self.maindir,simdir=self.subdir) |
| | | #self.Dir.makeifnotexist() |
| | |
| | | return TS_NOLOCK |
| | | if(psutil.pid_exists(int(pid))): |
| | | proc= psutil.Process(int(pid)) |
| | | #psutil.__version__ == '3.4.2' requires name() and status(), some older versions reguire name, status |
| | | if proc.name()=="trisurf": |
| | | if proc.status()=="stopped": |
| | | return TS_STOPPED |
| | |
| | | |
| | | def start(self): |
| | | if(self.getStatus()==0 or self.getStatus()==TS_COMPLETED): |
| | | #check if executable exists |
| | | 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()): |
| | |
| | | else: |
| | | try: |
| | | with open (os.path.join(self.Dir.fullpath(),"tape"), "w") as myfile: |
| | | myfile.write("#This is automatically generated tape file from snapshot\n") |
| | | myfile.write("#This is automatically generated tape file from snapshot") |
| | | myfile.write(str(self.tape)) |
| | | except: |
| | | print("Error -- cannot make tapefile "+ os.path.join(self.Dir.fullpath(),"tape")+" from the snapshot in the running directory") |
| | |
| | | |
| | | #check if the simulation has been completed. in this case notify user and stop executing. |
| | | if(self.isCompleted() and ("--force-from-tape" not in self.runArgs) and ("--reset-iteration-count" not in self.runArgs)): |
| | | print("The simulation was completed. Not starting executable at localhost in "+self.Dir.fullpath()+"\n") |
| | | print("The simulation was completed. Not starting executable in "+self.Dir.fullpath()) |
| | | return |
| | | |
| | | cwd=Directory(maindir=os.getcwd()) |
| | | self.Dir.goto() |
| | | print("Starting trisurf-ng executable at localhost in "+self.Dir.fullpath()+"\n") |
| | | print("Starting trisurf-ng executable in "+self.Dir.fullpath()) |
| | | if(self.fromSnapshot==True): |
| | | params=["trisurf", "--restore-from-vtk",self.snapshotFile]+self.runArgs |
| | | else: |
| | |
| | | subprocess.Popen (params, stdout=subprocess.DEVNULL) |
| | | cwd.goto() |
| | | else: |
| | | print("Process already running. Not starting\n") |
| | | print("Process in "+self.Dir.fullpath()+" already running. Not starting.") |
| | | return |
| | | |
| | | def stop(self): |
| | |
| | | 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(); |
| | | 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(status==TS_NONEXISTANT or status==TS_NOLOCK): |
| | | statustxt="Not running" |
| | | pid="" |
| | | ETA="" |
| | | elif status==TS_STOPPED: |
| | | statustxt="Stopped" |
| | | ETA="N/A" |
| | | elif status==TS_COMPLETED: |
| | | statustxt="Completed" |
| | | pid="" |
| | | ETA="" |
| | | else: |
| | | statustxt="Running" |
| | | |
| | | if(self.statistics.fileOK): |
| | | report=[time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(int(self.statistics.startDate))),str(datetime.timedelta(microseconds=(int(self.tape.config['iterations'])-int(self.statistics.last))*self.statistics.dT)*1000000), statustxt, pid, str(self.Dir.fullpath()), self.Comment.getText()] |
| | | 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\t",statustxt, pid, str(self.Dir.fullpath()), self.Comment.getText()] |
| | | report=["N/A","N/A",statustxt, pid, str(self.Dir.fullpath()), self.Comment.getText()] |
| | | return report |
| | | |
| | | def writeComment(self, data, mode='w'): |