Esempio n. 1
0
def execute(ifile,ofile,err,folder=None):
    # Add folder to names
    if folder is not None:
       if not folder.endswith("/"): folder = folder + "/"
       ifile = folder + ifile
       ofile = folder + ofile
       err   = folder + err
    # Execution file?
    set_EXE()
    check_EXE()
    # Exception
    exception = Exc.CalcFails(Exception)
    exception._var = ofile
    # Execute Gaussian
    command = "%s <%s 1>%s 2>%s"%(EXE,ifile,ofile,err)
    # Try up to NN times
    NN = 5
    for ii in range(NN):
        try   : status = os.system(command)
        except: status = 0
        # interrupted by ctrl+c (status = 2?)
        if status == 2: raise KeyboardInterrupt
        # Get log status
        logstatus = log_status(ofile)
        # Act according log status
        # (a) Normal termination
        if   logstatus == 1       : break
        # (b) empty file, no file or open-new-file error
        elif logstatus in (-1,0,2):
             time.sleep(1)
             continue
        # (c) other type of error
        else: raise exception
    return status
Esempio n. 2
0
def pilgrim_spc(xcc,symbols,bhessian,mname,eargs):
    # expand extra-args
    if   len(eargs) == 1:
        spc_template = eargs[0]
        folder, clean = None, False
    elif len(eargs) == 2:
        spc_template, folder = eargs
        clean = False
    elif len(eargs) == 3:
        spc_template, folder, clean = eargs
    # no template??
    if spc_template is None: raise Exc.NoTemplateGiven(Exception)
    # create folder
    if folder is not None:
        if not os.path.exists(folder): os.mkdir(folder)
    # Calculate gradient&hessian or just gradient
    if bhessian: inkey3 = "! EnGrad Freq "
    else       : inkey3 = "! EnGrad      "
    # names of files
    wname, ifile, ofile, engrad, hess, gbw, err = ITF.iofiles(mname,folder)
    # Input
    string_ifile = ""
    for line in spc_template.split("\n"):
        if key1 in line:
           line = ""
           for idx,symbol in enumerate(symbols):
               x,y,z  = fncs.xyz(xcc,idx)
               linedata = (symbol,x*pc.ANGSTROM,y*pc.ANGSTROM,z*pc.ANGSTROM)
               line += "%2s   %+11.6f  %+11.6f  %+11.6f\n"%linedata
        if key2 in line:
           pos  = line.find(key2)
           line = line[0:pos] + wname + line[pos+len(key2):]
        if key3 in line:
           pos  = line.find(key3)
           line = line[0:pos] + inkey3 + line[pos+len(key3):]
        # Add \n to line
        if not line.endswith("\n"): line += "\n"
        string_ifile += line
    ff.write_file(ifile,string_ifile)
    # Send calculation
    status = ITF.execute(ifile,ofile,err)
  # # Sleep 0.5 seconds, so Orca can write the files
  # time.sleep(0.5)
    # Check output
    exception = Exc.CalcFails(Exception)
    exception._var = ofile
    if not ITF.normal_termination(ofile): raise exception
    # Read data
    xcc, atonums, ch, mtp, E, gcc, Fcc, masses, clevel = ff.read_orca(ofile)
    # Remove files
    if clean:
       files = os.listdir(folder)
       files = [fff for fff in files if     fff.startswith(name)   ]
       files = [fff for fff in files if not fff.endswith(".inp")   ]
       files = [fff for fff in files if not fff.endswith(".out")   ]
       files = [fff for fff in files if not fff.endswith(".engrad")]
       files = [fff for fff in files if not fff.endswith(".hess")  ]
       for fff in files: os.remove(folder+fff)
    return xcc, atonums, ch, mtp,  E, gcc, Fcc, masses
Esempio n. 3
0
def genfchk(chk,fchk,err,folder=None):
    # Add folder to names
    if folder is not None:
       if not folder.endswith("/"): folder = folder + "/"
       chk   = folder + chk
       fchk  = folder + fchk
       err   = folder + err
    # fchk tool?
    set_FCHK()
    check_FCHK()
    # Exception
    exception = Exc.CalcFails(Exception)
    exception._var = chk
    # Execute fchk tool
    command = "%s %s %s 1>%s 2>&1"%(FCHK,chk,fchk,err)
    try   : status = os.system(command)
    except: raise exception
    return status
Esempio n. 4
0
def execute(ifile,ofile,err,folder=None):
    # Add folder to names
    if folder is not None:
       if not folder.endswith("/"): folder = folder + "/"
       ifile = folder + ifile
       ofile = folder + ofile
       err   = folder + err
    # Execution file?
    set_EXE()
    check_EXE()
    # Exception
    exception = Exc.CalcFails(Exception)
    exception._var = ofile
    # Execute command
    command = "%s %s 1>%s 2>%s"%(EXE,ifile,ofile,err)
    try   : status  = os.system(command)
    except: raise exception
    return status
Esempio n. 5
0
def pilgrim_spc(xcc, symbols, bhessian, mname, eargs):
    # initialize
    folder = None
    clean = False
    oniomH = []
    oniomM = []
    oniomL = []
    frozen = ([], [])
    # expand extra-args
    if len(eargs) == 1:
        spc_template = eargs[0]
    elif len(eargs) == 2:
        spc_template, folder = eargs
    elif len(eargs) == 3:
        spc_template, folder, clean = eargs
    elif len(eargs) == 5:
        spc_template, folder, clean, frozen, oniom_layers = eargs
        oniomH, oniomM, oniomL = oniom_layers
    # no template??
    if spc_template is None: raise Exc.NoTemplateGiven(Exception)
    # create folder
    if folder is not None:
        if not os.path.exists(folder): os.mkdir(folder)
    # Calculate gradient&hessian or just gradient
    if bhessian: inkey3 = "freq=noraman "
    else: inkey3 = "force        "
    # names of files
    wname, ifile, ofile, chk, fchk, err = ITF.iofiles(mname, folder)
    # Input
    string_ifile = ""
    for line in spc_template.split("\n"):
        if key1 in line:
            line = ""
            for idx, symbol in enumerate(symbols):
                x, y, z = fncs.xyz(xcc, idx)
                if idx in oniomH: layer = " H"
                elif idx in oniomM: layer = " M"
                elif idx in oniomL: layer = " L"
                else: layer = "  "
                linedata = (symbol, x * pc.ANGSTROM, y * pc.ANGSTROM,
                            z * pc.ANGSTROM, layer)
                line += "%2s  %+11.6f  %+11.6f  %+11.6f %s\n" % linedata
            # add frozen atoms
            frozen_symbols, frozen_xcc = frozen
            for idx, symbol in enumerate(frozen_symbols):
                x, y, z = fncs.xyz(frozen_xcc, idx)
                # oniom layer?
                at = len(symbols) + idx
                if at in oniomH: layer = " H"
                elif at in oniomM: layer = " M"
                elif at in oniomL: layer = " L"
                else: layer = "  "
                linedata = (symbol, x * pc.ANGSTROM, y * pc.ANGSTROM,
                            z * pc.ANGSTROM, layer)
                line += "%2s  -1 %+11.6f  %+11.6f  %+11.6f %s\n" % linedata
        if key2 in line:
            pos = line.find(key2)
            line = line[0:pos] + wname + line[pos + len(key2):]
        if key3 in line:
            pos = line.find(key3)
            line = line[0:pos] + inkey3 + line[pos + len(key3):]
        # Add \n to line
        if not line.endswith("\n"): line += "\n"
        string_ifile += line
    ff.write_file(ifile, string_ifile)
    # Send calculation
    status = ITF.execute(ifile, ofile, err)
    # Check output
    exception = Exc.CalcFails(Exception)
    exception._var = ofile
    if not ITF.normal_termination(ofile): raise exception
    # (a) chk exists!
    if os.path.exists(chk):
        # Generate fchk
        status = ITF.genfchk(chk, fchk, err)
        # Read data
        xcc, atonums, ch, mtp, E, gcc, Fcc, masses, clevel = ff.read_fchk(fchk)
    # (b) chk does not exist!
    else:
        xcc, atonums, ch, mtp, E, gcc, Fcc, masses, clevel = ITF.read_gauout(
            ofile)
    # Remove files
    if clean:
        files = os.listdir(folder)
        files = [fff for fff in files if fff.startswith(name)]
        files = [fff for fff in files if not fff.endswith(".gjf")]
        files = [fff for fff in files if not fff.endswith(".log")]
        files = [fff for fff in files if not fff.endswith(".out")]
        files = [fff for fff in files if not fff.endswith(".chk")]
        files = [fff for fff in files if not fff.endswith(".fchk")]
        for fff in files:
            os.remove(folder + fff)
    return xcc, atonums, ch, mtp, E, gcc, Fcc, masses
Esempio n. 6
0
def pilgrim_spc(xcc, symbols, bhessian, mname, eargs):
    # expand extra-args
    if len(eargs) == 1:
        spc_template = eargs[0]
        folder, clean = None, False
    elif len(eargs) == 2:
        spc_template, folder = eargs
        clean = False
    elif len(eargs) == 3:
        spc_template, folder, clean = eargs
    elif len(eargs) == 5:
        spc_template, folder, clean, frozen, oniom_layers = eargs
    # no template??
    if spc_template is None: raise Exc.NoTemplateGiven(Exception)

    # lines for GRADIENT (if any)
    gradient_lines = None
    if key4a in spc_template and key4b in spc_template:
        gradient_lines = spc_template.split(key4a)[1].split(key4b)[0]
        spc_template = spc_template.replace(gradient_lines,
                                            "").replace(key4b, "")
        gradient_lines = gradient_lines.strip()

    # lines for HESSIAN (if any)
    hessian_lines = None
    if key5a in spc_template and key5b in spc_template:
        hessian_lines = spc_template.split(key5a)[1].split(key5b)[0]
        spc_template = spc_template.replace(hessian_lines,
                                            "").replace(key5b, "")
        hessian_lines = hessian_lines.strip()

    # create folder
    if folder is not None:
        if not os.path.exists(folder): os.mkdir(folder)
    # names of files
    wname, ifile, ofile, engrad, hess, gbw, err = ITF.iofiles(mname, folder)
    # Input
    string_ifile = ""
    for line in spc_template.split("\n"):
        if key1 in line:
            line = ""
            for idx, symbol in enumerate(symbols):
                x, y, z = fncs.xyz(xcc, idx)
                linedata = (symbol, x * pc.ANGSTROM, y * pc.ANGSTROM,
                            z * pc.ANGSTROM)
                line += "%2s   %+11.6f  %+11.6f  %+11.6f\n" % linedata
        if key2 in line:
            pos = line.find(key2)
            line = line[0:pos] + wname + line[pos + len(key2):]

        #--------------------------------#
        # Gradient & Hessian computation #
        #--------------------------------#
        # (a) via key3
        if key3 in line:
            if bhessian: inkey3 = "! EnGrad Freq "
            else: inkey3 = "! EnGrad      "
            pos = line.find(key3)
            line = line[0:pos] + inkey3 + line[pos + len(key3):]
        # (b) via key4 & key5
        if key4a in line:
            line = line.replace(key4a, gradient_lines)
        if key5a in line:
            if bhessian: line = line.replace(key5a, hessian_lines)
            else: continue
        #--------------------------------#

        # Add \n to line
        if not line.endswith("\n"): line += "\n"
        string_ifile += line

    with open(ifile, 'w') as asdf:
        asdf.write(string_ifile)
    # Send calculation
    status = ITF.execute(ifile, ofile, err)
    # # Sleep 0.5 seconds, so Orca can write the files
    # time.sleep(0.5)
    # Check output
    exception = Exc.CalcFails(Exception)
    exception._var = ofile
    if not ITF.normal_termination(ofile): raise exception
    # Read data
    xcc, atonums, ch, mtp, E, gcc, Fcc, masses, clevel = ITF.read_orca(ofile)
    # Remove files
    if clean:
        files = os.listdir(folder)
        files = [fff for fff in files if fff.startswith(name)]
        files = [fff for fff in files if not fff.endswith(".inp")]
        files = [fff for fff in files if not fff.endswith(".out")]
        files = [fff for fff in files if not fff.endswith(".engrad")]
        files = [fff for fff in files if not fff.endswith(".hess")]
        for fff in files:
            os.remove(folder + fff)
    return xcc, atonums, ch, mtp, E, gcc, Fcc, masses