def wigner_distribution(fname_output,nsample, make_file=True): # read the hessian from output file outp = OutputMOLPRO(fname_output) mol = outp.get_mol_info() hess_mw, q_eq = outp.get_hessian_and_eqcoord() q_eq = np.ravel(q_eq) # diagonalization eig, trs_mw = linalg.eigh(hess_mw) eig = eig/amu2me hess_mw = hess_mw/amu2me eig = np.sqrt(eig[6:]) print np.sum(eig*au2cm) # print the frequency in cm-1 # sampling mass-weighted normal-mode coordinates and momenta q_rand = np.sqrt(0.5/eig)[:,np.newaxis]*np.random.randn(len(eig),nsample) p_rand = np.sqrt(0.5*eig)[:,np.newaxis]*np.random.randn(len(eig),nsample) # translate to mass-weighted Cartesian coordinates and momenta trs_mw = trs_mw[:,6:] q_mw = np.dot(trs_mw,q_rand) p_mw = np.dot(trs_mw,p_rand) # translate to mass-weighted Cartesian coordinates and momenta #mass_3row = np.ravel(np.ones((len(mol),3))*mol.get_atomic_masses()[:,np.newaxis]) mass_3row = np.ravel(np.ones((len(mol),3))*mol.get_masses()[:,np.newaxis]) q = q_mw/np.sqrt(mass_3row)[:,np.newaxis] + q_eq[:,np.newaxis] p = p_mw*np.sqrt(mass_3row)[:,np.newaxis] v = p/mass_3row[:,np.newaxis] #if as_instance: # return q.T.reshape(nsample, len(mol),3),\ # v.T.reshape(nsample, len(mol),3) # print coordinates and velocities if make_file: for i in xrange(nsample): fq_name = "coord" + str(i+1) fv_name = "velocity" + str(i+1) fq = open(fq_name,"w") fv = open(fv_name,"w") for j in xrange(len(mol)): fq.write("{0: 10.8f} {1: 10.8f} {2: 10.8f}\n".format(*q.T[i].reshape(len(mol),3)[j])) fv.write("{0: 10.8f} {1: 10.8f} {2: 10.8f}\n".format(*v.T[i].reshape(len(mol),3)[j])) fq.close() fv.close() # obtain the kintic and potential energy ene_kin = 0.5*np.sum(p_mw*p_mw,axis=0) ene_pot = 0.5*np.sum(q_mw*np.dot(hess_mw,q_mw),axis=0) ene_tot = ene_kin + ene_pot print 0.5*np.sum(eig) print np.average(ene_kin) print np.average(ene_pot) print np.average(ene_tot)
def setup(self): self.eps = 0.01 dinp = deepcopy(self.inp) dinp.set_inputname("tmp2.com") s = dinp.get_method_save().replace("<force>\n","") s = s.replace("<cpmcscf>\n","").replace("force\n","") dinp.set_method_save(s) dinp.set_caspt2_istate(self.now_state, self.nrange) self.dinp = dinp if str(self.dinp) == "InputMOLPRO": root, ext = os.path.splitext(self.dinp.get_inputname()) self.doutp = OutputMOLPRO(root + ".out",self.mol)
def set_zero_energy_velocities(fname_output,nsample, make_file=True): # This method is modified such that the kinetic energy is # set to zero point energy and the structure is the eq coordinate # read the hessian from output file outp = OutputMOLPRO(fname_output) mol = outp.get_mol_info() hess_mw, q_eq = outp.get_hessian_and_eqcoord() q_eq = np.ravel(q_eq) # diagonalization eig, trs_mw = linalg.eigh(hess_mw) eig = eig/amu2me hess_mw = hess_mw/amu2me eig = np.sqrt(eig[6:]) print np.sum(eig*au2cm) # print the frequency in cm-1 # sampling mass-weighted normal-mode coordinates and momenta #p_rand = np.sqrt(1.0*eig)[:,np.newaxis]*np.random.randn(len(eig),nsample) p_rand = np.sqrt(1.0*eig)[:,np.newaxis]*np.ones((len(eig),nsample)) # translate to mass-weighted Cartesian coordinates and momenta trs_mw = trs_mw[:,6:] p_mw = np.dot(trs_mw,p_rand) # translate to mass-weighted Cartesian coordinates and momenta #mass_3row = np.ravel(np.ones((len(mol),3))*mol.get_atomic_masses()[:,np.newaxis]) mass_3row = np.ravel(np.ones((len(mol),3))*mol.get_masses()[:,np.newaxis]) p = p_mw*np.sqrt(mass_3row)[:,np.newaxis] v = p/mass_3row[:,np.newaxis] #if as_instance: # return q.T.reshape(nsample, len(mol),3),\ # v.T.reshape(nsample, len(mol),3) # print coordinates and velocities if make_file: for i in xrange(nsample): fv_name = "velocity" + str(i+1) fv = open(fv_name,"w") for j in xrange(len(mol)): fv.write("{0: 10.8f} {1: 10.8f} {2: 10.8f}\n".format(*v.T[i].reshape(len(mol),3)[j])) fv.close() # obtain the kintic and potential energy ene_kin = 0.5*np.sum(p_mw*p_mw,axis=0) print ene_kin print 0.5*np.sum(eig) print np.average(ene_kin)
class Potential_TSH_CASPT2(Potential_TSH): def __init__(self, mol, inp, now_state, nrange): Potential_TSH.__init__(self, mol, inp, now_state, nrange) #super(Potential_TSH_CASPT2, self).__init__(mol, inp, now_state, nrange) self.setup() def set_now_state(self,now_state): self.now_state = now_state self.inp.set_caspt2_istate(self.now_state,self.nrange) def setup(self): self.eps = 0.01 dinp = deepcopy(self.inp) dinp.set_inputname("tmp2.com") s = dinp.get_method_save().replace("<force>\n","") s = s.replace("<cpmcscf>\n","").replace("force\n","") dinp.set_method_save(s) dinp.set_caspt2_istate(self.now_state, self.nrange) self.dinp = dinp if str(self.dinp) == "InputMOLPRO": root, ext = os.path.splitext(self.dinp.get_inputname()) self.doutp = OutputMOLPRO(root + ".out",self.mol) def get_potential_energy_multi(self): self.ene, self.co, self.s = self.outp.get_data_caspt2_multi(self.nrange) return self.ene def get_inner_v_d(self): # the sign of nacv must be checked befor it is used # refert to eq.13 pos_save,vel_save = self.mol.get_positions(), self.mol.get_velocities() len_vel = sqrt(np.sum(vel_save)**2) self.mol.set_positions(pos_save + self.eps * vel_save / len_vel) self.dinp.set_molecule(self.mol) self.dinp.make_input() self.dinp.write() os.system(self.dinp.get_command()) self.mol.set_positions(pos_save) ene2, co2, s2 = self.doutp.get_data_caspt2_multi(self.nrange) dco = (co2 - self.co) / self.eps # refert to eq.9 v_d1 = np.einsum("ip, jq, pq -> ij",self.co,dco,self.s) v_d2 = np.einsum("ip,pqlm,jq -> ijlm",self.co,self.d_multi,self.co) return len_vel * v_d1 + np.einsum("pq,ijpq -> ij",vel_save,v_d2) def get_velocity_adjustment_vecotr(self): return self.mol.get_forces()
def __init__(self, mol, inp): self.mol = mol self.inp = inp if str(self.inp) == "InputMOLPRO": root, ext = os.path.splitext(self.inp.get_inputname()) self.outp = OutputMOLPRO(root + ".out",self.mol)
def override_output(self, wfile,mol=None): if mol is None: mol = self.mol self.outp = OutputMOLPRO(wfile,self.mol)