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
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
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