Exemplo n.º 1
0
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)
Exemplo n.º 2
0
 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)
Exemplo n.º 3
0
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)
Exemplo n.º 4
0
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() 
Exemplo n.º 5
0
 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)
Exemplo n.º 6
0
 def override_output(self, wfile,mol=None):
     if mol is None: mol = self.mol 
     self.outp = OutputMOLPRO(wfile,self.mol)