예제 #1
0
 def __init__(self, mol, inp, nrange = 1):
     self.mol = mol
     self.inp = inp
     self.nrange = nrange
     self.freq_molden = -1 
     self.freq_save_output = -1 
     self.freq_save_wfu = -1 
     self.count = 0
     if str(self.inp) == "InputMOLPRO":
         root, ext = os.path.splitext(self.inp.get_inputname())
         self.outp = OutputMOLPRO(root + ".out", self.mol)
예제 #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>","")
     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)
     self.count_save = -1
예제 #3
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 __str__(self):
        return "Potential_TSH_CASPT2"
    
    def set_now_state(self,now_state,nrange):
        self.now_state = now_state
        self.nrange = nrange 
        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>","")
        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)
        self.count_save = -1
    
    def get_potential_energy_multi(self):
        self.ci_coeff = self.outp.get_ci_coeff_casscf()
        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 
        # refer to eq.13
        pos_save,vel_save = self.mol.get_positions(), self.mol.get_velocities()
        len_vel =  np.linalg.norm(vel_save)
        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.11
        v_d1 = np.einsum("ip, jq, pq -> ij",self.co,dco,self.s)
        #self.doutp.remove()  
        return len_vel * v_d1 

    def get_velocity_adjustment_vector(self,now_state, cand_state,count): 
        if count != self.count_save:
            self.inp.set_caspt2_istate(cand_state, self.nrange) 
            self.inp.make_input()
            self.inp.write()
            os.system(self.inp.get_command())
            self.adjust_forces = -self.outp.get_gradient_multi(cand_state)
            self.inp.set_caspt2_istate(now_state, self.nrange) 
            self.count_save = count 
            #self.outp.remove()  
        return self.adjust_forces - self.mol.get_forces() 

    def get_nacme_multi(self):
        return np.zeros((self.nrange,self.nrange)) 
    
    def get_mixing_coeff(self):
        return self.co

    def remove_outputs(self):
        self.outp.remove()  
        self.doutp.remove()  
예제 #4
0
 def override_output(self, wfile,mol=None):
     if mol is None: mol = self.mol 
     self.outp = OutputMOLPRO(wfile, self.mol)
예제 #5
0
class Potential_QM:
    
    def __init__(self, mol, inp, nrange = 1):
        self.mol = mol
        self.inp = inp
        self.nrange = nrange
        self.freq_molden = -1 
        self.freq_save_output = -1 
        self.freq_save_wfu = -1 
        self.count = 0
        if str(self.inp) == "InputMOLPRO":
            root, ext = os.path.splitext(self.inp.get_inputname())
            self.outp = OutputMOLPRO(root + ".out", self.mol)

    def set_freq_molden(self,freq):
        self.freq_molden = freq

    def set_freq_save_output(self,freq):
        self.freq_save_output = freq
    
    def set_freq_save_wfu(self,freq):
        self.freq_save_wfu = freq
    
    def override_output(self, wfile,mol=None):
        if mol is None: mol = self.mol 
        self.outp = OutputMOLPRO(wfile, self.mol)

    def calc(self):
        self.inp.set_molecule(self.mol) 
        self.inp.make_input()
        if self.freq_molden > -1 and self.count % self.freq_molden == 0:
            self.inp.add_method("put, molden, tmp_{}.molden".format(self.count))
        self.inp.write()
        os.system(self.inp.get_command())            
        if self.freq_save_output > -1 and self.count % self.freq_save_output == 0:
            os.system("cp tmp.out tmp_{}.out".format(self.count)) 
        if self.freq_save_wfu > -1 and self.count % self.freq_save_wfu == 0:
            os.system("cp /scr/nimi/tmp.wfu ./tmp_{}.wfu".format(self.count)) 
        self.mol.set_potential_energy_multi(self.get_potential_energy_multi())
        self.mol.set_potential_energy(self.get_potential_energy())
        self.mol.set_forces(-self.get_gradient())
        self.mol.set_addinfo(self.get_addinfo())
        self.count += 1

    def remove_outputs(self):
        self.outp.remove()  
    
    def get_check_pbc(self):
        return False 
    
    def get_pbc_adjusted(self, position):
        return position 
    
    def get_potential_energy(self):
        pass 
    
    def get_potential_energy_multi(self):
        pass 

    def get_gradient(self):
        pass

    def get_nrange(self):
        return self.nrange

    def get_addinfo(self):
        return []