Exemple #1
0
def deal_with_path(target, dlevel, software, ltemp, dctc, pathvars, dtes,
                   dchem, dhighlvl, dimasses):
    dof = PN.get_dof(dlevel)
    plotfile = PN.get_plf(dlevel)
    # gts file for this TS
    ctc, itc = PN.name2data(target)
    gtsTS = dctc[ctc].gtsfile(itc)
    # rotational symmetry
    moleculeTS = Molecule()
    moleculeTS.set_from_gts(gtsTS)
    symmetry = str(moleculeTS._pgroup), int(moleculeTS._rotsigma)
    # temporal folder
    TMP = PN.TMPi % (target)
    # if exists,remove content (unless keeptmp is activated)
    # (to avoid reading old files from different levels of calculation)
    if os.path.exists(TMP) and not pathvars._keeptmp:
        shutil.rmtree(TMP, ignore_errors=True)
    # split target
    ctc, itc = PN.name2data(target)
    # name of rst file
    rstfile = PN.get_rst(ctc, itc)
    # tuple software
    tes = dtes.get(software, {}).get(ctc, None)
    tsoftw = (software, tes)
    # internal coordinates
    if itc in dctc[ctc]._dics.keys(): ics = dctc[ctc]._dics[itc]
    elif "*" in dctc[ctc]._dics.keys(): ics = dctc[ctc]._dics["*"]
    else: ics = None
    if itc in dctc[ctc]._dicsbw.keys(): icsbw = dctc[ctc]._dicsbw[itc]
    elif "*" in dctc[ctc]._dicsbw.keys(): icsbw = dctc[ctc]._dicsbw["*"]
    else: icsbw = None
    if itc in dctc[ctc]._dicsfw.keys(): icsfw = dctc[ctc]._dicsfw[itc]
    elif "*" in dctc[ctc]._dicsfw.keys(): icsfw = dctc[ctc]._dicsfw["*"]
    else: icsfw = None
    # path variables
    pathvars.set_ics(ics, icsbw, icsfw)  # before setup3!!
    pathvars.apply_specific(itc)
    pathvars.setup1()
    pathvars.setup2()
    pathvars.setup3()
    # Set Eref (from reaction)
    pathvars.set_eref_from_reaction(target, dchem, dof)
    # Quantum reaction coordinate qrc
    pathvars.prepare_qrc(dchem, dctc, dimasses)
    # frequency scaling factor
    pathvars._freqscal = float(dctc[ctc]._fscal)
    # if dlevel --> no convergence and dlevel data
    if dlevel:
        exception = Exc.NoDLEVELdata(Exception)
        pathvars._scterr = None
        keydhl = "%s.%s.path" % (ctc, itc)
        if keydhl not in dhighlvl.keys():
            # maybe only TS
            keydhl = "%s.%s" % (dctc[ctc]._root, itc)
            if keydhl in dhighlvl.keys():
                dictE = {0.0: dhighlvl[keydhl]}
            else:
                global WARNINGS
                WARNINGS.append("No high-level data for %s" % target)
                raise exception
        else:
            dictE = dhighlvl[keydhl]
        pathvars._dlevel = dictE
    # LOGGER
    pof = PN.get_pof(dlevel, "path", target)
    sys.stdout = Logger(pof, "w", True)
    sys.stdout.writeinfile(PS.init_txt())
    #string
    fncs.print_string(PS.smep_title(target, pathvars, pof), 2)
    # Was previously converged???
    ffloat = "%.3f"
    drstconv = RW.read_rstconv()
    if target in drstconv.keys() and not dlevel and os.path.exists(rstfile):
        lowtemp, useics, scterr, converged = drstconv[target]
        b0 = (converged == "yes")
        b1 = (pathvars._useics == useics)
        b2 = (ffloat % pathvars._scterr == ffloat % scterr)
        b3 = (ffloat % min(ltemp) == ffloat % lowtemp)
        if b0 and b1 and b2 and b3:
            pathvars._scterr = None
            fncs.print_string("THIS PATH IS STORED AS CONVERGED!\n", 4)
            tpath, tcommon, drst = ff.read_rst(rstfile)
            lbw, lfw, sbw, sfw, V0bw, V0fw = sd.rstlimits(drst)
            pathvars._sbw = sbw
            pathvars._sfw = sfw
            del drst
    #----------------#
    # calculate path #
    #----------------#

    # 1. Only MEP
    if not pathvars._beyondmep:
        common, drst, pathvars = calc_mep(target, gtsTS, pathvars, tsoftw, TMP)
        dcoefs = {}
        del drst
        # raise error
        raise Exc.OnlyMEP(Exception)

    # 2. MEP expanded till SCT convergence
    elif pathvars.sct_convergence():
        dcoefs, converged = get_path_sctconv(target, gtsTS, pathvars, tsoftw,
                                             ltemp, TMP, symmetry, plotfile)
        # save convergence in file!
        drstconv = RW.read_rstconv()
        if converged:
            drstconv[target] = (min(ltemp), pathvars._useics, pathvars._scterr,
                                "yes")
        else:
            drstconv[target] = (min(ltemp), pathvars._useics, pathvars._scterr,
                                "no")
        RW.write_rstconv(drstconv)

    # 3. Coefs with the current MEP extension
    else:
        tcommon, drst, pathvars = calc_mep(target, gtsTS, pathvars, tsoftw,
                                           TMP)
        dcoefs, pathvars, palpha, pomega = calc_coefs(target, tcommon, drst,
                                                      pathvars, ltemp,
                                                      symmetry, plotfile)
        del drst

    # print summary with the coefficients
    fncs.print_string(PS.spath_allcoefs(ltemp, dcoefs), 3)
    # return data
    return dcoefs, pathvars
Exemple #2
0
def deal_with_path(target, dlevel, software, ltemp, dctc, pathvars, dtes,
                   dchem, dhighlvl, dimasses):
    dof = PN.get_dof(dlevel)
    plotfile = PN.get_plf(dlevel)
    # gts file for this TS
    ctc, itc = PN.name2data(target)
    gtsTS = dctc[ctc].gtsfile(itc)
    # temporal folder
    TMP = PN.TMPi % (target)
    # if exists,remove content
    # (to avoid reading old files from different levels of calculation)
    if os.path.exists(TMP): shutil.rmtree(TMP, ignore_errors=True)
    # split target
    ctc, itc = PN.name2data(target)
    # name of rst file
    rstfile = PN.get_rst(ctc, itc)
    # tuple software
    tes = dtes.get(software, {}).get(ctc, None)
    tsoftw = (software, tes)
    # internal coordinates
    dics = dctc[ctc]._dics
    if itc in dics.keys(): ics = dics[itc]
    elif "*" in dics.keys(): ics = dics["*"]
    else: ics = None
    # path variables
    pathvars.set_ics(ics)  # before setup3!!
    pathvars.apply_specific(itc)
    pathvars.setup1()
    pathvars.setup2()
    pathvars.setup3()
    # Set Eref (from reaction)
    pathvars.set_eref_from_reaction(target, dchem, dof)
    # Quantum reaction coordinate qrc
    pathvars.prepare_qrc(dchem, dctc, dimasses)
    # frequency scaling factor
    pathvars._freqscal = float(dctc[ctc]._fscal)
    # if dlevel --> no convergence and dlevel data
    if dlevel:
        exception = Exc.NoDLEVELdata(Exception)
        pathvars._sctmns = 0
        keydhl = "%s.%s.path" % (ctc, itc)
        if keydhl not in dhighlvl.keys():
            # maybe only TS
            keydhl = "%s.%s" % (dctc[ctc]._root, itc)
            if keydhl in dhighlvl.keys():
                dictE = {0.0: dhighlvl[keydhl]}
            else:
                global WARNINGS
                WARNINGS.append("No high-level data for %s" % target)
                raise exception
        else:
            dictE = dhighlvl[keydhl]
        pathvars._dlevel = dictE
    # LOGGER
    pof = PN.get_pof(dlevel, "path", target)
    sys.stdout = Logger(pof, "w", True)
    #string
    fncs.print_string(PS.smep_title(target, pathvars, pof), 2)
    #----------------#
    # calculate path #
    #----------------#
    # 1. MEP
    if not pathvars._beyondmep:
        common, drst, pathvars = calc_mep(target,
                                          gtsTS,
                                          pathvars,
                                          tsoftw,
                                          TMP,
                                          decrease=False)
        dcoefs = {}
        del drst
        # raise error
        raise Exc.OnlyMEP(Exception)
    # 2. MEP + coefs
    else:
        # 2.1 MEP expanded till SCT convergence
        if pathvars.sct_convergence():
            dcoefs = get_path_sctconv(target, gtsTS, pathvars, tsoftw, ltemp,
                                      TMP, plotfile)
        # 2.2 Coefs with the current MEP extension
        else:
            tcommon, drst, pathvars = calc_mep(target,
                                               gtsTS,
                                               pathvars,
                                               tsoftw,
                                               TMP,
                                               decrease=False)
            dcoefs, pathvars = calc_coefs(target, tcommon, drst, pathvars,
                                          ltemp, plotfile)
            del drst
    # print summary with the coefficients
    fncs.print_string(PS.spath_allcoefs(ltemp, dcoefs), 3)
    # return data
    return dcoefs, pathvars