Ejemplo n.º 1
0
def obtain_adipot(tcommon, drst, pathvars, symmetry):
    print("")
    fncs.print_string("Calculating adiabatic potential...", 4)
    print()
    ics = pathvars.get_ics()
    icsbw = pathvars._icsbw
    icsfw = pathvars._icsfw
    if pathvars._useics == "yes" and (ics is None or len(ics) == 0):
        raise Exc.NoICS(Exception)
    # calculate adiabatic potential
    idata = (tcommon, drst, pathvars._eref, ics, pathvars._useics,
             pathvars._lowfq, pathvars._freqscal, icsbw, icsfw, symmetry)
    dMols, ccVadi, icVadi, tuple_cc, tuple_ic, listV0 = ap.path2vadi(*idata)
    # expand tuples
    data_x, lcc_frqs, lcc_tzpe = tuple_cc
    data_x, lic_frqs, lic_tzpe = tuple_ic
    # check data
    fncs.print_string(PS.sadipot_ics(ics, pathvars._useics, icsbw, icsfw), 8)
    if pathvars._useics == "yes":
        ok1 = ap.ccvsic_checknfreqs(lcc_frqs, lic_frqs)
        ok2 = ap.ccvsic_checkts(data_x, lcc_frqs, lic_frqs)
        ok3 = ap.ccvsic_checkzpe(lcc_tzpe, lic_tzpe)
        checks = (ok1, ok2, ok3)
        # select spline
        if not ok1 or not ok2: Vadi, pathvars._useics = ccVadi, "no"
        elif pathvars._useics == "yes": Vadi, pathvars._useics = icVadi, "yes"
        else: Vadi, pathvars._useics = ccVadi, "no"
    else:
        ok1, ok2, ok3 = True, True, True
        Vadi, pathvars._useics = ccVadi, "no"
    # Any imag freq along the MEP?
    if pathvars._useics == "yes": lfqs = list(lic_frqs)
    else: lfqs = list(lcc_frqs)
    nfreqs = min([len(xx) for xx in lcc_frqs])
    allfqreal = True
    for lfq in lfqs:
        if len(lfq) > nfreqs: lfq = lfq[1:]
        if True in [fq < 0.0 for fq in lfq]: allfqreal = False
    del lfqs
    # print checks
    fncs.print_string(
        PS.sadipot_checks(ok1, ok2, ok3, pathvars._useics, allfqreal), 8)
    # setup spline
    Vadi.setup()
    data4print = (Vadi.xx(), Vadi.yy(), Vadi._sAG, Vadi._VAG, listV0, lcc_tzpe,
                  lic_tzpe, pathvars._eref)
    fncs.print_string(PS.sadipot_table(*data4print), 8)
    # print freqs
    fncs.print_string("- Vibrational frequencies summary: cc (ic) [in cm^-1]:",
                      8)
    print("")
    fncs.print_string(PS.sadipot_freqs(Vadi.xx(), lcc_frqs, lic_frqs), 8)
    return dMols, Vadi, pathvars
Ejemplo n.º 2
0
    def setup3(self):
        '''
          apply default value to those not defined!
          '''
        # use ics but no ics?
        if self._useics == "yes" and (self._ics is None
                                      or len(self._ics) == 0):
            raise Exc.NoICS(Exception)

        # path variables (via input) - advanced
        if self._fwdir == "default": self._fwdir = None  # ("1-2","++")
        if self._cvt == "default": self._cvt = "yes"
        if self._sct == "default": self._sct = "yes"
        if self._mtype == "default": self._mtype = "pm"
        if self._mu == "default": self._mu = 1.0 / AMU
        if self._cubic == "default": self._cubic = "no"
        if self._eref in ["default", "auto"]: self._eref = None
        if self._paral == "default": self._paral = "no"
        if self._epse == "default": self._epse = 1e-8
        if self._epsg == "default": self._epsg = 1e-4
        if self._useics == "default": self._useics = "yes"
        if self._v1mode == "default": self._v1mode = "grad"
        if self._scterr == "default": self._scterr = 0.0
        if self._e0 in ["default", "auto"]: self._e0 = None
        if self._lowfq == "default": self._lowfq = {}
        if self._muintrpl == "default": self._muintrpl = ("linear", 0)
        if self._qrc == "default": self._qrc = None
        if self._onioml == "default": self._onioml = []
        if self._oniomm == "default": self._oniomm = []
        if self._oniomh == "default": self._oniomh = []

        # setup parallel
        self._paral = do_parallel(self._paral)

        # setup cag
        self.set_cag()

        # useics = yes but there are no ics?
        if self._useics == "yes" and (self._ics is None
                                      or len(self._ics) == 0):
            self._useics = "no"
Ejemplo n.º 3
0
def obtain_adipot(tcommon, drst, pathvars):
    print
    print "    Calculating adiabatic potential..."
    print
    ics = pathvars.get_ics()
    if pathvars._useics == "yes" and (ics is None or len(ics) == 0):
        raise Exc.NoICS(Exception)
    # calculate adiabatic potential
    idata = (tcommon, drst, pathvars._eref, ics, pathvars._useics,
             pathvars._lowfq, pathvars._freqscal)
    dMols, ccVadi, icVadi, tuple_cc, tuple_ic, listV0 = ap.path2vadi(*idata)
    # expand tuples
    data_x, lcc_frqs, lcc_tzpe = tuple_cc
    data_x, lic_frqs, lic_tzpe = tuple_ic
    # check data
    fncs.print_string(PS.sadipot_ics(ics, pathvars._useics), 8)
    if pathvars._useics == "yes":
        ok1 = ap.ccvsic_checknfreqs(lcc_frqs, lic_frqs)
        ok2 = ap.ccvsic_checkts(data_x, lcc_frqs, lic_frqs)
        ok3 = ap.ccvsic_checkzpe(lcc_tzpe, lic_tzpe)
        checks = (ok1, ok2, ok3)
        fncs.print_string(PS.sadipot_checks(checks), 8)
        # select spline
        if not ok1 or not ok2: Vadi, pathvars._useics = ccVadi, "no"
        elif pathvars._useics == "yes": Vadi, pathvars._useics = icVadi, "yes"
        else: Vadi, pathvars._useics = ccVadi, "no"
    else:
        Vadi, pathvars._useics = ccVadi, "no"
    # setup spline
    Vadi.setup()
    data4print = (Vadi.xx(), Vadi.yy(), Vadi._sAG, Vadi._VAG, listV0, lcc_tzpe,
                  lic_tzpe, pathvars._eref)
    fncs.print_string(PS.sadipot_table(*data4print), 8)
    # print freqs
    print "      Vibrational frequencies summary: cc (ic) [in cm^-1]:"
    fncs.print_string(PS.sadipot_freqs(Vadi.xx(), lcc_frqs, lic_frqs), 8)
    return dMols, Vadi, pathvars
Ejemplo n.º 4
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