Beispiel #1
0
def obtain_cvt(dMols,
               points,
               VadiSpl,
               temps,
               pathvars,
               si=-float("inf"),
               sj=+float("inf"),
               dcfs={}):
    print("")
    fncs.print_string("Calculating CVT variational coefficient...", 4)
    print("")
    useics = pathvars._useics
    if len(temps) == 0: raise Exc.NoTemps(Exception)
    # Only points between si and sj
    points = [pp for pp in points if si <= dMols[pp][0] <= sj]
    lcvt_s, lcvt_gamma, gibbs_matrix, gibbsTS, lnew = cv.get_cvt(
        dMols, points, VadiSpl, temps, useics)
    # print gibbs
    svals = [dMols[point][0] for point in points]
    fncs.print_string(
        PS.scvt_gibbs(svals, temps, gibbs_matrix.copy(), pathvars, gibbsTS), 8)
    # print cvt coefs
    fncs.print_string(PS.scvt_coefs(lcvt_s, lcvt_gamma, temps), 8)
    # save data
    dcfs["cvt"] = lcvt_gamma
    return dcfs, lcvt_s, gibbs_matrix, lnew
Beispiel #2
0
def obtain_sct(dMols, points, VadiSpl, temps, dv1, pathvars, dcfs={}):
    print("")
    fncs.print_string("Calculating SCT transmission coefficient...", 4)
    print("")
    # data from  pathvars
    useics = pathvars._useics
    v1mode = pathvars._v1mode
    # E0 value
    if pathvars._e0 is None:
        V1bw = pathvars._eref + VadiSpl.get_alpha()[1]
        V1fw = pathvars._eref + VadiSpl.get_omega()[1]
        if pathvars._V1R is not None: E0bw = pathvars._V1R
        else: E0bw = V1bw
        if pathvars._V1P is not None: E0fw = pathvars._V1P
        else: E0fw = V1fw
        E0 = max(E0bw, E0fw) - pathvars._eref
    else:
        E0 = pathvars._e0 - pathvars._eref
    # some checks
    if len(temps) == 0: raise Exc.NoTemps(Exception)
    if useics in ["yes", True]: case = "ic"
    else: case = "cc"
    # MEP LIMITS
    sbw, sfw = VadiSpl.get_alpha()[0], VadiSpl.get_omega()[0]
    # Part I - Get E0 and VAG
    E0 = sct.get_sct_part1(points, VadiSpl, E0)
    sAG, VAG = VadiSpl.get_max()
    fncs.print_string(PS.ssct_init(E0, VadiSpl, pathvars, v1mode), 8)
    # Part II - Calculate tbar, bmfs and mueff
    tuple_part2 = (dMols, points, dv1, case, pathvars._muintrpl)
    svals, lkappa, ltbar, ldtbar, mu, lmueff, toignore = sct.get_sct_part2(
        *tuple_part2)
    fncs.print_string(
        PS.ssct_mueff(svals, VadiSpl, lkappa, ltbar, lmueff, mu, toignore), 8)
    #----------#
    # E0 < VAG #
    #----------#
    if E0 < VAG:
        # Part III - Quantum reaction coordinate
        fncs.print_string(PS.ssct_E0VAG(E0, VAG), 8)
        if pathvars._qrc is not None:
            afreq = pathvars._qrcafreq
            lEquant = [E0 + E_i for E_i in pathvars._qrclE]
            fncs.print_string(PS.ssct_qrc(pathvars), 8)
            if pathvars._qrccase != 0: return dcfs, None, E0, VAG
            qrc_ZCT = sct.get_sct_part3(svals, mu, VadiSpl, afreq, lEquant, E0,
                                        VAG, temps)
            qrc_SCT = sct.get_sct_part3(svals, lmueff, VadiSpl, afreq, lEquant,
                                        E0, VAG, temps)
            fncs.print_string(
                PS.ssct_probs(qrc_SCT[1], qrc_ZCT[2], qrc_SCT[2], qrc_SCT[3],
                              sbw, sfw), 12)
            kappaI1_zct = qrc_ZCT[0]
            kappaI1_sct = qrc_SCT[0]
            qrc_Elim = lEquant[1]
        else:
            kappaI1_zct = None
            kappaI1_sct = None
            qrc_Elim = None
        # apply QRC always?
        if not pathvars._qrcauto: qrc_Elim = None
        # Part IV - calculate thetas and probs
        fncs.print_string(
            "Transmission probabilities for Kappa^SAG calculation:", 8)
        print("")
        outZCT = sct.get_sct_part4(svals, mu, VadiSpl, E0)
        outSCT = sct.get_sct_part4(svals, lmueff, VadiSpl, E0)
        weights_ZCT, lE_ZCT, probs_ZCT, rpoints_ZCT, diffs_ZCT, (
            pZCT0, rpZCT0) = outZCT
        weights_SCT, lE_SCT, probs_SCT, rpoints_SCT, diffs_SCT, (
            pSCT0, rpSCT0) = outSCT
        # include also prob at E=E0 (pZCT0 and pSCT0)
        fncs.print_string(PS.ssct_probs(         [E0]+lE_SCT   ,\
                                        [pZCT0 ]+probs_ZCT,\
                                        [pSCT0 ]+probs_SCT,\
                                        [rpSCT0]+rpoints_SCT,sbw,sfw),8)
        fncs.print_string(PS.ssct_diffs(lE_SCT, diffs_SCT), 8)
        # Part V - calculate coefficients
        ZCTdata = sct.get_sct_part5(lE_ZCT, probs_ZCT, weights_ZCT, E0, VAG,
                                    temps, kappaI1_zct, qrc_Elim)
        SCTdata = sct.get_sct_part5(lE_SCT, probs_SCT, weights_SCT, E0, VAG,
                                    temps, kappaI1_sct, qrc_Elim)
        ZCT, lIi_ZCT, RTE_ZCT, INTG_ZCT, bqrcZCT = ZCTdata
        SCT, lIi_SCT, RTE_SCT, INTG_SCT, bqrcSCT = SCTdata
        fncs.print_string(
            PS.ssct_kappa(temps,
                          ZCT,
                          lIi_ZCT,
                          RTE_ZCT,
                          E0,
                          bqrcZCT,
                          case="zct"), 8)
        fncs.print_string(
            PS.ssct_kappa(temps,
                          SCT,
                          lIi_SCT,
                          RTE_SCT,
                          E0,
                          bqrcSCT,
                          case="sct"), 8)
    #----------#
    # E0 > VAG #
    #----------#
    else:
        ZCT = [1.0 for T in temps]
        SCT = [1.0 for T in temps]
        INTG_ZCT = None
        INTG_SCT = None
        RTE_ZCT = None
        RTE_SCT = None
        fncs.print_string(PS.ssct_E0_above_VAG(E0, VAG), 8)
        fncs.print_string(PS.ssct_onlykappa(temps, ZCT, SCT), 8)
    # data for the plot
    forplot = (svals, lmueff, temps, INTG_ZCT, INTG_SCT, RTE_ZCT, RTE_SCT, E0,
               VAG)
    # save data
    dcfs["zct"] = ZCT
    dcfs["sct"] = SCT
    return dcfs, forplot, E0, VAG
Beispiel #3
0
def obtain_sct(dMols, points, VadiSpl, temps, dv1, pathvars, dcfs={}):
    print
    print "    Calculating SCT transmission coefficient..."
    print
    # data from  pathvars
    useics = pathvars._useics
    v1mode = pathvars._v1mode
    # E0 value
    if pathvars._e0 is None:
        V1bw = pathvars._eref + VadiSpl.get_alpha()[1]
        V1fw = pathvars._eref + VadiSpl.get_omega()[1]
        if pathvars._V1R is not None: E0bw = pathvars._V1R
        else: E0bw = V1bw
        if pathvars._V1P is not None: E0fw = pathvars._V1P
        else: E0fw = V1fw
        E0 = max(E0bw, E0fw) - pathvars._eref
    else:
        E0 = pathvars._e0 - pathvars._eref
    # some checks
    if len(temps) == 0: raise Exc.NoTemps(Exception)
    if useics in ["yes", True]: case = "ic"
    else: case = "cc"
    # Part I - Get E0 and VAG
    E0 = sct.get_sct_part1(points, VadiSpl, E0)
    sAG, VAG = VadiSpl.get_max()
    fncs.print_string(PS.ssct_init(E0, VadiSpl, pathvars, v1mode), 8)
    # Part II - Calculate tbar, bmfs and mueff
    tuple_part2 = (dMols, points, dv1, case, pathvars._muintrpl)
    svals, lkappa, ltbar, ldtbar, mu, lmueff, toignore = sct.get_sct_part2(
        *tuple_part2)
    fncs.print_string(
        PS.ssct_mueff(svals, VadiSpl, lkappa, ltbar, lmueff, toignore), 8)
    # Part III - Quantum reaction coordinate
    fncs.print_string(PS.ssct_E0VAG(E0, VAG), 8)
    if pathvars._qrc is not None:
        afreq = pathvars._qrcafreq
        lEquant = pathvars._qrclE
        print "        Quantum reaction coordinate keyword (qrc) activated!"
        print
        mode = pathvars._qrc[0] + 1
        numst = pathvars._qrc[1]
        print "           * reactant mode     : %i (%.2f cm^-1)" % (
            mode, fncs.afreq2cm(afreq))
        print "           * number of states  : %i" % numst
        print "           * contribution to kappa_SCT from E0 to VAG will"
        print "             be obtained from discrete set of energies"
        print
        print "           * calculating transmission probabilities..."
        print
        qrc_ZCT = sct.get_sct_part3(svals, mu, VadiSpl, afreq, lEquant, E0,
                                    VAG, temps)
        qrc_SCT = sct.get_sct_part3(svals, lmueff, VadiSpl, afreq, lEquant, E0,
                                    VAG, temps)
        nE = len(qrc_SCT[1])
        fncs.print_string(
            PS.ssct_probs(qrc_SCT[1], qrc_ZCT[2], qrc_SCT[2], qrc_SCT[3]), 12)
        print "           * number of included states  : %i" % nE
        print
        kappaI1_zct = qrc_ZCT[0]
        kappaI1_sct = qrc_SCT[0]
    else:
        kappaI1_zct = None
        kappaI1_sct = None
    # Part IV - calculate thetas and probs
    print "        Transmission probabilities for kappa_SCT calculation:"
    print
    weights_ZCT, lE_ZCT, probs_ZCT, rpoints_ZCT, diffs_ZCT = sct.get_sct_part4(
        svals, mu, VadiSpl, E0)
    weights_SCT, lE_SCT, probs_SCT, rpoints_SCT, diffs_SCT = sct.get_sct_part4(
        svals, lmueff, VadiSpl, E0)
    fncs.print_string(PS.ssct_probs(lE_SCT, probs_ZCT, probs_SCT, rpoints_SCT),
                      8)
    fncs.print_string(PS.ssct_diffs(lE_SCT, diffs_SCT), 8)
    # Part V - calculate coefficients
    ZCTdata = sct.get_sct_part5(lE_ZCT, probs_ZCT, weights_ZCT, E0, VAG, temps,
                                kappaI1_zct)
    SCTdata = sct.get_sct_part5(lE_SCT, probs_SCT, weights_SCT, E0, VAG, temps,
                                kappaI1_sct)
    ZCT, lIi_ZCT, RTE_ZCT, INTG_ZCT = ZCTdata
    SCT, lIi_SCT, RTE_SCT, INTG_SCT = SCTdata
    fncs.print_string(
        PS.ssct_kappa(temps, ZCT, lIi_ZCT, RTE_ZCT, E0, case="zct"), 8)
    fncs.print_string(
        PS.ssct_kappa(temps, SCT, lIi_SCT, RTE_SCT, E0, case="sct"), 8)
    #fncs.print_string(PS.ssct_kappa(temps,ZCT,SCT,RTE_ZCT,RTE_SCT,E0),8)
    # save data
    dcfs["zct"] = ZCT
    dcfs["sct"] = SCT
    # data for the plot
    forplot = (svals, lmueff, temps, INTG_ZCT, INTG_SCT, RTE_ZCT, RTE_SCT, E0,
               VAG)
    return dcfs, forplot