Пример #1
0
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
Пример #2
0
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'
Пример #3
0
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()
Пример #4
0
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))
Пример #5
0
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))