示例#1
0
 def step(self):
     # select the transfered atom  
     ind = randint(0,self.nmol_tot)
     if ind >= self.nmol: 
         self.count_qm += 1
         x_mol_save = copy(self.mol_qm.get_positions())  
         #print euler_rotation(*self.delta_mol) * x_mol_save.T
         alpha, beta, gamma = self.delta_qm[1] * random_v(3)
         alpha *= pi; beta *= pi * 0.5; gamma *= pi 
         x_mol_try = (euler_rotation(alpha, beta, gamma) * x_mol_save.T).T
         x_mol_try += self.delta_qm[0]*random_v(self.mol.get_ndims()) 
         self.mol_qm.set_positions(x_mol_try) 
         ene_qmmm_pre = np.sum(self.interaction_qmmm_save)
         for i in xrange(len(self.mol)):
             self.int_trial_ary[i] = self.pot_qmmm.get_interaction_energy_mc(i)
         ene_qmmm_pro = np.sum(self.int_trial_ary) 
         delta_e =  ene_qmmm_pro - ene_qmmm_pre 
         #print ene_qmmm_pre, ene_qmmm_pro, delta_e 
         if delta_e < 0.0: judge = True
         else:
             try: judge = exp(- self.beta * delta_e) > random()
             except OverflowError: judge = False 
         # the trial movement is judged 
         if judge: 
             self.count_accept_qm += 1 
             for i in xrange(len(self.mol)):
                 self.interaction_qmmm_save[i] = self.int_trial_ary[i]
             self.mol_qm.set_potential_energy(ene_qmmm_pro)  
             self.alpha_save += alpha; self.beta_save += beta; self.gamma_save += gamma 
         else: self.mol_qm.set_positions(x_mol_save)
     else:
         self.count_mm += 1
         if self.which_frozen[ind]: return 
         x_save = copy(self.mol.get_positions()[ind])  
         if self.pot.get_check_pbc(): 
             self.mol.set_positions_index(ind, self.pot.get_pbc_adjusted(x_save \
             + self.delta[ind] * random_v(3)))
         else:
             self.mol.set_positions_index(ind, x_save \
             + self.delta[ind] * random_v(3))
         int_trial = self.pot.get_interaction_energy_mc(ind) 
         int_trial_qmmm = self.pot_qmmm.get_interaction_energy_mc(ind) 
         delta_e_mm = np.sum(int_trial) - sum(self.interaction_save[ind])
         delta_e_qmmm = int_trial_qmmm - self.interaction_qmmm_save[ind]
         delta_e = delta_e_mm + delta_e_qmmm 
         if delta_e < 0.0: judge = True
         else:
             try: 
                 judge = exp(- self.beta * delta_e) > random()  
             except OverflowError: judge = False 
         # the trial movement is judged 
         if judge: 
             self.count_accept_mm += 1 
             self.interaction_save[ind,:] = int_trial 
             self.interaction_save[:,ind] = int_trial 
             self.interaction_qmmm_save[ind] = int_trial_qmmm
             self.mol.set_potential_energy(self.mol.get_potential_energy() + delta_e_mm)  
             self.mol_qm.set_potential_energy(self.mol_qm.get_potential_energy() + delta_e_qmmm)  
         else: self.mol.set_positions_index(ind, x_save)
示例#2
0
 def step(self):
     # select the transfered atom  
     ind = randint(0,len(self.mol)-1)
     if ind in self.treated_as_molecule: 
         self.count_tot_mol += 1
         x_mol_save = copy(self.mol.get_positions_index(self.treated_as_molecule))  
         #print euler_rotation(*self.delta_mol) * x_mol_save.T
         alpha, beta, gamma = self.delta_mol[1] * random_v(3)
         alpha *= pi; beta *= pi * 0.5; gamma *= pi 
         x_mol_try = (euler_rotation(alpha, beta, gamma) * x_mol_save.T).T
         x_mol_try += self.delta_mol[0]*random_v(self.mol.get_ndims()) 
         self.mol.set_positions_index(self.treated_as_molecule, x_mol_try) 
         int_trial_matrix = np.array([self.pot.get_interaction_energy(i) for i in self.treated_as_molecule])
         int_save_matrix = np.array([self.interaction_save[i] for i in self.treated_as_molecule])
         delta_e = np.sum(int_trial_matrix) - np.sum(int_save_matrix)  
         try: 
             judge = exp(- self.beta * delta_e) > random()  
         except OverflowError: 
             if delta_e < 0: judge = True
             else: judge = False
         # the trial movement is judged 
         if judge: 
             self.count_accept_mol += 1 
             for i in self.treated_as_molecule: self.interaction_save[i,:] = int_trial_matrix[i]  
             for i in self.treated_as_molecule: self.interaction_save[:,i] = int_trial_matrix[i]  
             self.mol.set_potential_energy(self.mol.get_potential_energy() + delta_e)  
             self.alpha_save += alpha; self.beta_save += beta; self.gamma_save += gamma 
         else: self.mol.set_positions_index(self.treated_as_molecule, x_mol_save)
     else:
         self.count_tot += 1
         if self.which_frozen[ind]: return 
         x_save = copy(self.mol.get_positions_index(ind))  
         if self.pot.get_check_pbc(): 
             self.mol.set_positions_index(ind, self.pot.get_pbc_adjusted(x_save \
             + self.delta[ind] * random_v(self.mol.get_ndims())))
         else:
             self.mol.set_positions_index(ind, x_save \
             + self.delta[ind] * random_v(self.mol.get_ndims()))
         int_trial = self.pot.get_interaction_energy(ind) 
         delta_e = np.sum(int_trial) - np.sum(self.interaction_save[ind])  
         try: 
             judge = exp(- self.beta * delta_e) > random()  
         except OverflowError: 
             if delta_e < 0: judge = True
             else: judge = False
         # the trial movement is judged 
         if judge: 
             self.count_accept += 1 
             self.interaction_save[ind,:] = int_trial 
             self.interaction_save[:,ind] = int_trial 
             self.mol.set_potential_energy(self.mol.get_potential_energy() + delta_e)  
         else: self.mol.set_positions_index(ind, x_save)
示例#3
0
 def step(self):
     # select the transfered atom
     ind = randint(0, self.nmol_tot)
     if ind >= self.nmol:
         self.count_qm += 1
         x_mol_save = copy(self.mol_qm.get_positions())
         #print euler_rotation(*self.delta_mol) * x_mol_save.T
         alpha, beta, gamma = self.delta_qm[1] * random_v(3)
         alpha *= pi
         beta *= pi * 0.5
         gamma *= pi
         x_mol_try = (euler_rotation(alpha, beta, gamma) * x_mol_save.T).T
         x_mol_try += self.delta_qm[0] * random_v(self.mol.get_ndims())
         self.mol_qm.set_positions(x_mol_try)
         ene_qmmm_pre = np.sum(self.interaction_qmmm_save)
         for i in xrange(len(self.mol)):
             self.int_trial_ary[
                 i] = self.pot_qmmm.get_interaction_energy_mc(i)
         ene_qmmm_pro = np.sum(self.int_trial_ary)
         delta_e = ene_qmmm_pro - ene_qmmm_pre
         #print ene_qmmm_pre, ene_qmmm_pro, delta_e
         if delta_e < 0.0: judge = True
         else:
             try:
                 judge = exp(-self.beta * delta_e) > random()
             except OverflowError:
                 judge = False
         # the trial movement is judged
         if judge:
             self.count_accept_qm += 1
             for i in xrange(len(self.mol)):
                 self.interaction_qmmm_save[i] = self.int_trial_ary[i]
             self.mol_qm.set_potential_energy(ene_qmmm_pro)
             self.alpha_save += alpha
             self.beta_save += beta
             self.gamma_save += gamma
         else:
             self.mol_qm.set_positions(x_mol_save)
     else:
         self.count_mm += 1
         if self.which_frozen[ind]: return
         x_save = copy(self.mol.get_positions()[ind])
         if self.pot.get_check_pbc():
             self.mol.set_positions_index(ind, self.pot.get_pbc_adjusted(x_save \
             + self.delta[ind] * random_v(3)))
         else:
             self.mol.set_positions_index(ind, x_save \
             + self.delta[ind] * random_v(3))
         int_trial = self.pot.get_interaction_energy_mc(ind)
         int_trial_qmmm = self.pot_qmmm.get_interaction_energy_mc(ind)
         delta_e_mm = np.sum(int_trial) - sum(self.interaction_save[ind])
         delta_e_qmmm = int_trial_qmmm - self.interaction_qmmm_save[ind]
         delta_e = delta_e_mm + delta_e_qmmm
         if delta_e < 0.0: judge = True
         else:
             try:
                 judge = exp(-self.beta * delta_e) > random()
             except OverflowError:
                 judge = False
         # the trial movement is judged
         if judge:
             self.count_accept_mm += 1
             self.interaction_save[ind, :] = int_trial
             self.interaction_save[:, ind] = int_trial
             self.interaction_qmmm_save[ind] = int_trial_qmmm
             self.mol.set_potential_energy(self.mol.get_potential_energy() +
                                           delta_e_mm)
             self.mol_qm.set_potential_energy(
                 self.mol_qm.get_potential_energy() + delta_e_qmmm)
         else:
             self.mol.set_positions_index(ind, x_save)
示例#4
0
 def step(self):
     # select the transfered atom
     ind = randint(0, len(self.mol) - 1)
     if ind in self.treated_as_molecule:
         self.count_tot_mol += 1
         x_mol_save = copy(
             self.mol.get_positions_index(self.treated_as_molecule))
         #print euler_rotation(*self.delta_mol) * x_mol_save.T
         alpha, beta, gamma = self.delta_mol[1] * random_v(3)
         alpha *= pi
         beta *= pi * 0.5
         gamma *= pi
         x_mol_try = (euler_rotation(alpha, beta, gamma) * x_mol_save.T).T
         x_mol_try += self.delta_mol[0] * random_v(self.mol.get_ndims())
         self.mol.set_positions_index(self.treated_as_molecule, x_mol_try)
         int_trial_matrix = np.array([
             self.pot.get_interaction_energy(i)
             for i in self.treated_as_molecule
         ])
         int_save_matrix = np.array(
             [self.interaction_save[i] for i in self.treated_as_molecule])
         delta_e = np.sum(int_trial_matrix) - np.sum(int_save_matrix)
         try:
             judge = exp(-self.beta * delta_e) > random()
         except OverflowError:
             if delta_e < 0: judge = True
             else: judge = False
         # the trial movement is judged
         if judge:
             self.count_accept_mol += 1
             for i in self.treated_as_molecule:
                 self.interaction_save[i, :] = int_trial_matrix[i]
             for i in self.treated_as_molecule:
                 self.interaction_save[:, i] = int_trial_matrix[i]
             self.mol.set_potential_energy(self.mol.get_potential_energy() +
                                           delta_e)
             self.alpha_save += alpha
             self.beta_save += beta
             self.gamma_save += gamma
         else:
             self.mol.set_positions_index(self.treated_as_molecule,
                                          x_mol_save)
     else:
         self.count_tot += 1
         if self.which_frozen[ind]: return
         x_save = copy(self.mol.get_positions_index(ind))
         if self.pot.get_check_pbc():
             self.mol.set_positions_index(ind, self.pot.get_pbc_adjusted(x_save \
             + self.delta[ind] * random_v(self.mol.get_ndims())))
         else:
             self.mol.set_positions_index(ind, x_save \
             + self.delta[ind] * random_v(self.mol.get_ndims()))
         int_trial = self.pot.get_interaction_energy(ind)
         delta_e = np.sum(int_trial) - np.sum(self.interaction_save[ind])
         try:
             judge = exp(-self.beta * delta_e) > random()
         except OverflowError:
             if delta_e < 0: judge = True
             else: judge = False
         # the trial movement is judged
         if judge:
             self.count_accept += 1
             self.interaction_save[ind, :] = int_trial
             self.interaction_save[:, ind] = int_trial
             self.mol.set_potential_energy(self.mol.get_potential_energy() +
                                           delta_e)
         else:
             self.mol.set_positions_index(ind, x_save)