def jobrunner(infile=None, job=None): """ run the job prep and submit from a specific file or supplied prepared job """ starttime = time.time() if not job: if infile: job = jobsetup(infile) logging.debug("Job setup complete.") else: logging.critical("Job input file or prepared job must be supplied.") raise JobLogicError("No input file or supplied prepared job to submit.") logging.debug("Working with {}.".format(job.name)) write_coord(job) logging.debug("coord written") if ( job.jobtype == "opt" or job.jobtype == "optfreq" or job.jobtype == "ts" or job.jobtype == "sp" or job.jobtype == "prep" ): defstart = time.time() run_define(job) logging.debug("define complete.") defend = time.time() logging.debug("define ended in {0:.2f}s".format(defend - defstart)) if job.cosmo != None: try: run_cosmo(job) except Exception as e: logging.warn("Some error in cosmo running: {}".format(e)) elif job.jobtype == "aoforce" or job.jobtype == "numforce": if not turbogo_helpers.check_files_exist(["GEO_OPT_CONVERGED", "converged"]): logging.warning("Convergence required before {} job.".format(job.jobtype)) raise JobLogicError("Convergence required before {} job.".format(job.jobtype)) if job.control_remove or job.control_add: control_edit(job) logging.debug("control file editing complete.") else: logging.debug("No control file edits") script = submit_script_prepare(job) logging.debug("Submit script written.") if job.jobtype != "prep": jobid = submit_job(job, script) else: logging.info("Job not submitted - prep flag in input.") logging.debug("Submitted in {0:.2f} seconds.".format(time.time() - starttime)) return jobid, job.freqopts, job.name, job.jobtype
def check_opt(job): """ Check if an opt job is done or crashed, if done: resubmit to queue if freq is required. Return a status string """ if turbogo_helpers.check_files_exist([ os.path.join(job.indir, 'GEO_OPT_CONVERGED')]): #Job converged logging.info('Job {} completed optimization.'.format(job.name)) if job.jobtype == 'opt' or job.jobtype == 'optfreq': opttime = turbogo_helpers.get_calc_time(job.indir, 'opt.out') elif job.jobtype == 'ts': opttime = turbogo_helpers.get_calc_time(job.indir, 'ts.out') elif job.jobtype == 'sp': opttime = turbogo_helpers.get_calc_time(job.indir, 'sp.out') else: opttime = False if opttime: job.otime += opttime else: job.otime += (time() - job.curstart) if job.freqopt != None: newid = freq_submit(job) if newid != -99: job.curstart = time() job.jobid = newid job.status = "Freq Submitted" return 'freq' else: job.status = "Freq Setup Failed" return 'fcrashed' else: if reformat: convert_filetype(os.path.join(job.indir, 'finalgeometry.xyz'), os.path.join(job.indir, 'finalgeometry.mol')) return 'completed' else: logging.warning("Job {} crashed in optimization." .format(job.name)) job.status = "Opt Crashed" return 'ocrashed'
def main(): """Manages the code""" logging.basicConfig( format=("%(asctime)s - %(name)s - [%(levelname)s] - %(message)s"), filename="turbogo.log", level=logging.DEBUG ) logging.info("Started") parser = argparse.ArgumentParser("Usage: %prog [options]") parser.add_argument("file", help="Read input from gaussian-type input FILE") group = parser.add_mutually_exclusive_group() group.add_argument("-v", "--verbose", action="store_true", help="Run more verbose (show debugging info)") group.add_argument("-q", "--quiet", action="store_true", help="Run less verbose (show only warnings)") args = parser.parse_args() ch = logging.StreamHandler(sys.stdout) ch.setLevel(logging.INFO) if args.verbose: ch.setLevel(logging.DEBUG) elif args.quiet: ch.setLevel(logging.WARNING) logging.getLogger().setLevel(logging.INFO) formatter = logging.Formatter("%(asctime)s - %(name)s - [%(levelname)s] - %(message)s") ch.setFormatter(formatter) logging.getLogger().addHandler(ch) infile = args.file logging.debug("Specified file {} in args".format(infile)) # check file exists, if not request file. ifile = turbogo_helpers.check_files_exist([infile]) if not ifile: logging.critical("Input file {} does not exist.".format(infile)) exit() # file is good. let's go! jobid, freqopts, _name, _type = jobrunner(infile=infile) if not args.verbose: try: os.remove(os.path.join(os.path.curdir, "define.log")) except (OSError, IOError): pass logging.debug("Jobid: {}\nFreqStatus: {}".format(jobid, freqopts)) exit()
def write_freeh(job): """ Writes a line to the freeh file for each job that completes successfully with freeh requested. """ if not turbogo_helpers.check_files_exist(['freeh.txt']): #write the header to the file try: with open('freeh.txt', 'w') as f: f.write("{name:^16}{directory:^20}{zpe:^14}{t:^10}" \ "{p:^11}{qtrans:^12}{qrot:^10}" \ "{pot:^14}{eng:^14}{entr:^20}{cv:^14}{cp:^14}{enth:^14}\n" .format( name='Name', directory = 'Directory', zpe = 'ZPE (kJ/mol)', t = 'Temp (K)', p = 'p (MPa)', qtrans = 'ln(qtrans)', qrot = 'ln(qrot)', qvib = 'ln(qvib)', pot = 'Pot (kJ/mol)', eng = 'Eng (kJ/mol)', entr = 'Entropy (kJ/mol/K)', cv = 'Cv (kJ/molK)', cp = 'Cp (kJ/molK)', enth = 'Enthalpy (kJ/mol)' )) logging.debug("Wrote freeh titles") except IOError as e: logging.warning("Error preparing freeh file: {}".format(e)) except Exception as e: logging.warning("Unknown error {}".format(e)) name = job.name directory = os.path.join(job.indir, job.infile) zpe = job.data['zpe'] t = job.data['t'] p = job.data['p'] qtrans = job.data['qtrans'] qrot = job.data['qrot'] qvib = job.data['qvib'] pot = job.data['pot'] eng = job.data['eng'] entr = job.data['entr'] cv = job.data['cv'] cp = job.data['cp'] enth = job.data['enth'] try: with open('freeh.txt', 'a') as f: f.write("{name:^16}{directory:^20}{zpe:^14}{t:^10}" \ "{p:^11}{qtrans:^12}{qrot:^10}" \ "{pot:^14}{eng:^14}{entr:^20}{cv:^14}{cp:^14}{enth:^14}\n" .format( name=name, directory = directory, zpe = zpe, t = t[0], p = p[0], qtrans = qtrans[0], qrot = qrot[0], qvib = qvib[0], pot = pot[0], eng = eng[0], entr = entr[0], cv = cv[0], cp = cp[0], enth = enth[0] )) if len(t) > 1: #don't rewrite name/zpe for each line for i in range(1, len(t)): f.write("{name:^16}{directory:^20}{zpe:^14}{t:^8}" \ "{p:^11}{qtrans:^12}{qrot:^10}" \ "{pot:^14}{eng:^14}{entr:^20}{cv:^14}{cp:^14}{enth:^14}\n" .format( name='', directory = '', zpe = '', t = t[i], p = p[i], qtrans = qtrans[i], qrot = qrot[i], qvib = qvib[i], pot = pot[i], eng = eng[i], entr = entr[i], cv = cv[i], cp = cp[i], enth = enth[i] )) except (OSError, IOError) as e: logging.warning("Error writing freeh file: {}".format(e))
def write_stats(job): """ Writes a line to the stats file for each job that completes successfully. """ if not turbogo_helpers.check_files_exist(['stats.txt']): #write the header to the file try: with open('stats.txt', 'w') as f: f.write("{name:^16}{directory:^20}{optsteps:^10}{opttime:^12}" \ "{freqtime:^12}{tottime:^12}{firstfreq:^16}{energy:^16}" .format( name='Name', directory = 'Directory', optsteps = 'Opt Steps', opttime = 'Opt Time', freqtime = 'Freq Time', tottime = 'Total Time', firstfreq = '1st Frequency', energy = 'Energy', )) f.write('\n') except IOError as e: logging.warning("Error preparing stats file: {}".format(e)) except Exception as e: logging.warning("Unknown error {}".format(e)) name = job.name directory = os.path.join(job.indir, job.infile) try: with open(os.path.join(job.indir, 'energy')) as f: lines = f.readlines() except IOError as e: logging.warning("Error reading energy file for stats: {}".format(e)) optsteps = '?' energy = '?' except Exception as e: logging.warning("Unknown error {}.".format(e)) else: optsteps = lines[-2][:6].strip() energy = lines[-2][6:22].strip() opttime = turbogo_helpers.time_readable(job.otime) freqtime = turbogo_helpers.time_readable(job.ftime) tottime = turbogo_helpers.time_readable(job.otime + job.ftime) firstfreq = job.firstfreq try: with open('stats.txt', 'a') as f: f.write("{name:^16.16}{directory:^20.20}{optsteps:^10.10}" \ "{opttime:^12.12}{freqtime:^12.12}{tottime:^12.12}" \ "{firstfreq:^16.16}{energy:^16.16}" .format( name=name, directory = directory, optsteps = optsteps, opttime = opttime, freqtime = freqtime, tottime = tottime, firstfreq = firstfreq, energy = energy, )) f.write('\n') except (OSError, IOError) as e: logging.warning("Error writing stats file: {}".format(e))