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