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 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
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()
def override_output(self, wfile,mol=None): if mol is None: mol = self.mol self.outp = OutputMOLPRO(wfile, self.mol)
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 []