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