Пример #1
0
def get_ts_ifreq(xcc, gcc, Fcc, E, tcommon):
    ch, mtp, atonums, masses, mu = tcommon
    ts = Molecule()
    ts.setvar(xcc=xcc, gcc=gcc, Fcc=Fcc)
    ts.setvar(atonums=atonums, masses=masses)
    ts.setvar(ch=ch, mtp=mtp, V0=E)
    ts.prepare()
    ts.setup(mu)
    ts.ana_freqs()
    [(ifreq, evec)] = ts._ccimag
    return ifreq, mu
Пример #2
0
def log_data(log, inpvars, fscal, folder="./"):
    if inpvars._ts: fmode = -1
    else: fmode = 0
    # name from log
    name = log.split(".")[-2]
    point = TorPESpoint(name, inpvars._tlimit)
    # Read log file
    logdata = gau.read_gaussian_log(folder + log)
    # prepare data
    logdata = prepare_log_data(logdata)
    ch, mtp, V0, symbols, symbols_wo, xcc_wo, gcc_wo, Fcc_wo, lzmat, zmatvals = logdata

    # string for fccards
    string_fccards = gau.get_fccards_string(gcc_wo, Fcc_wo)

    # generate Molecule instance
    molecule = Molecule()
    molecule.setvar(xcc=xcc_wo, Fcc=Fcc_wo, V0=V0)
    molecule.setvar(fscal=fscal)
    molecule.setvar(symbols=symbols_wo)
    molecule.setvar(ch=ch, mtp=mtp)
    molecule.prepare()
    molecule.setup()
    molecule.ana_freqs()

    # Calculate partition functions for the temperatures
    qtot, V1, qis = molecule.calc_pfns(inpvars._temps, fmode=fmode)
    qtr, qrot, qvib, qele = qis
    Qrv = np.array([xx * yy for xx, yy in zip(qrot, qvib)])
    # Calculate partition functions at target temperature
    qtot, V1, qis = molecule.calc_pfns([inpvars._temp], fmode=fmode)
    # remove rotsigma for Gibbs
    gibbs = V1 - pc.KB * inpvars._temp * np.log(qtot[0] * molecule._rotsigma)

    # imaginary frequency
    if len(molecule._ccimag) == 0: ifreq = None
    elif len(molecule._ccimag) == 1:
        ifreq = [ifreq for ifreq, ivec in list(molecule._ccimag)][0]
    else:
        ifreq = None

    # weight for this conformer
    if inpvars._enantio and molecule._pgroup.lower() == "c1": weight = 2
    else: weight = 1
    # pack and return data
    conf_tuple = (point, V0, V1, gibbs, weight, Qrv, ifreq, lzmat, zmatvals,
                  log)
    return conf_tuple, symbols, string_fccards
Пример #3
0
def molecule_prep(gts, eslist=[], tiso=None, fscal=1.0):
    # generate instance of Molecule
    molecule = Molecule()
    # read gts
    molecule.set_from_gts(gts)
    # masses
    if tiso is not None:
        imods, imasses = tiso
        molecule.apply_imods(imods, imasses)
    # electronic states
    molecule.setvar(les=eslist)
    # set frequency scaling
    molecule.setvar(fscal=fscal)
    # setup
    molecule.setup()
    molecule.ana_freqs("cc")
    return molecule
Пример #4
0
def get_imag_freq(log, fscal):
    try:
        # Read log file
        logdata = gau.read_gaussian_log(log)
        logdata = prepare_log_data(logdata)
        ch, mtp, V0, symbols, symbols_wo, xcc_wo, gcc_wo, Fcc_wo, lzmat, zmatvals = logdata

        # diagonalize Fcc
        molecule = Molecule()
        molecule.setvar(xcc=xcc_wo, Fcc=Fcc_wo, V0=V0)
        molecule.setvar(fscal=fscal)
        molecule.setvar(symbols=symbols_wo)
        molecule.setvar(ch=ch, mtp=mtp)
        molecule.prepare()
        molecule.setup()
        molecule.ana_freqs()
        ifreq = molecule._ccimag[0][0]
    except:
        ifreq = None
    # return
    return ifreq
Пример #5
0
def path2vadi(tcommon,drst,Eref=None,ics=None,boolint=False,lowfq={},freqscal=1.0,icsbw=None,icsfw=None,symmetry=None):
    '''
    lowfq: in case of imaginary frequencies
    '''
    # boolint as boolean
    if   boolint in [False,"no","No","n","N",None]: boolint = False
    elif boolint in [True,"yes","YES","y","Y"]    : boolint = True
    # check there are internal coordinates if required
    if boolint and ics in [None,False,[]]: raise Exc.NoICS(Exception)
    # expand data in tcommon
    ch,mtp,atnums,masses,mu = tcommon
    # Sorted labels (by s)
    slabels = sd.sorted_points(drst,hess=True)
    # Reference energy
    if Eref is None: lbw, lfw, sbw, sfw, Eref, Efw = sd.rstlimits(drst)
    # Independent variable
    data_x = [drst[label][0] for label in slabels]
    # mep energy (relative value)
    listV0 = [drst[label][1]-Eref for label in slabels]

    # Initializing data
    lcc_tzpe, lcc_frqs, lcc_Vadi = [], [], []
    lic_tzpe, lic_frqs, lic_Vadi = [], [], []
    dMols = {}

    # Updating data
    for label in slabels:
        # data in drst
        s_i, E_i, xms_i,gms_i,Fms_i,v0_i,v1_i,t_i = drst[label]
        # project gradient
        if s_i == 0.0: bool_pg = False
        else         : bool_pg = True
        # lowfq
        if   s_i == 0.0: dlowfq = {}
        elif s_i  < 0.0: dlowfq = lowfq.get("bw",{})
        elif s_i  > 0.0: dlowfq = lowfq.get("fw",{})
        # mass-scaled --> Cartesian coords
        xcc = fncs.ms2cc_x(xms_i,masses,mu)
        gcc = fncs.ms2cc_g(gms_i,masses,mu)
        Fcc = fncs.ms2cc_F(Fms_i,masses,mu)
        # create Molecule instance
        mol = Molecule()
        mol.setvar(xcc=xcc,gcc=gcc,Fcc=Fcc)
        mol.setvar(atonums=atnums,masses=masses)
        mol.setvar(ch=ch,mtp=mtp,V0=E_i)
        mol.setvar(fscal=freqscal)
        if symmetry is not None:
            mol.setvar(pgroup=symmetry[0])
            mol.setvar(rotsigma=symmetry[1])
        mol.prepare()
        mol.setup(mu,projgrad=bool_pg)
        mol.clean_freqs("cc")       # it may be needed with orca
        mol.deal_lowfq(dlowfq,"cc") # deal with low frequencies
        mol.ana_freqs("cc")         # calculate zpe
        # append data
        lcc_tzpe.append(float(mol._cczpe)   )
        lcc_Vadi.append(mol._ccV1 - Eref    )
        lcc_frqs.append(list(mol._ccfreqs))
        # internal coordinates
        if boolint:
           if   s_i < 0.0 and icsbw is not None: mol.icfreqs(icsbw,bool_pg)
           elif s_i > 0.0 and icsfw is not None: mol.icfreqs(icsfw,bool_pg)
           else                                : mol.icfreqs(ics  ,bool_pg)
           mol.deal_lowfq(dlowfq,"ic")
           mol.ana_freqs("ic")
           # append data
           lic_tzpe.append(float(mol._iczpe) )
           lic_Vadi.append(mol._icV1 - Eref  )
           lic_frqs.append(list(mol._icfreqs))
        # save instance
        dMols[label] = (s_i,mol)

    # package data
    tuple_cc = (data_x,lcc_frqs,lcc_tzpe)
    tuple_ic = (data_x,lic_frqs,lic_tzpe)
    # Generate splines
    Vadi_cc = VadiSpline(data_x,lcc_Vadi)
    if boolint: Vadi_ic = VadiSpline(data_x,lic_Vadi)
    else      : Vadi_ic = None
    # Return data
    return dMols, Vadi_cc, Vadi_ic, tuple_cc, tuple_ic, listV0