def test_dimer_method(): # Set up a small "slab" with an adatoms atoms = fcc100('Pt', size=(2, 2, 1), vacuum=10.0) add_adsorbate(atoms, 'Pt', 1.611, 'hollow') # Freeze the "slab" mask = [atom.tag > 0 for atom in atoms] atoms.set_constraint(FixAtoms(mask=mask)) # Calculate using EMT atoms.set_calculator(EMT()) atoms.get_potential_energy() # Set up the dimer d_control = DimerControl(initial_eigenmode_method = 'displacement', \ displacement_method = 'vector', logfile = None, \ mask = [0, 0, 0, 0, 1]) d_atoms = MinModeAtoms(atoms, d_control) # Displace the atoms displacement_vector = [[0.0] * 3] * 5 displacement_vector[-1][1] = -0.1 d_atoms.displace(displacement_vector=displacement_vector) # Converge to a saddle point dim_rlx = MinModeTranslate(d_atoms, trajectory = 'dimer_method.traj', \ logfile = None) dim_rlx.run(fmax=0.001) # Test the results tolerance = 1e-3 assert (d_atoms.get_barrier_energy() - 1.03733136918 < tolerance) assert (abs(d_atoms.get_curvature() + 0.900467048707) < tolerance) assert (d_atoms.get_eigenmode()[-1][1] < -0.99) assert (abs(d_atoms.get_positions()[-1][1]) < tolerance)
# Freeze the "slab" mask = [atom.tag > 0 for atom in atoms] atoms.set_constraint(FixAtoms(mask = mask)) # Calculate using EMT atoms.set_calculator(EMT()) relaxed_energy = atoms.get_potential_energy() # Set up the dimer d_control = DimerControl(initial_eigenmode_method = 'displacement', \ displacement_method = 'vector', logfile = None, \ mask = [0, 0, 0, 0, 1]) d_atoms = MinModeAtoms(atoms, d_control) # Dispalce the atoms displacement_vector = [[0.0]*3]*5 displacement_vector[-1][1] = -0.1 d_atoms.displace(displacement_vector = displacement_vector) # Converge to a saddle point dim_rlx = MinModeTranslate(d_atoms, trajectory = 'dimer_method.traj', \ logfile = None) dim_rlx.run(fmax = 0.001) # Test the results tolerance = 1e-3 assert(d_atoms.get_barrier_energy() - 1.03733136918 < tolerance) assert(abs(d_atoms.get_curvature() + 0.889396) < tolerance) assert(d_atoms.get_eigenmode()[-1][1] < -0.99) assert(abs(d_atoms.get_positions()[-1][1]) < tolerance)
trial_angle=pi / 4, max_num_rot=2, logfile='%s_control.log' % prefix, eigenmode_logfile='%s_eigenmode.log' % prefix) dimer_atoms = MinModeAtoms(dimer, dimer_control, eigenmodes=[mode]) dimer_atoms.displace(displacement_vector=mode) dimer_relax = MinModeTranslate(dimer_atoms, trajectory='%s.traj' % prefix, logfile='%s_relax.log' % prefix) # also possible to use these: #dimer_relax = FIRE(dimer_atoms, trajectory='dimer.traj', # restart='restart_file', # dt=0.1, # default 0.1 # maxmove=0.2, # default 0.2 # dtmax=1.0, # default 1.0 # Nmin=3, # default 5 # finc=1.1, # default 3 # fdec=0.71, # default 0.5 # astart=0.2, # default 0.1 # fa=0.99) # default 0.99 #dimer_relax = BFGS(dimer_atoms, trajectory='dimer.traj', restart='restart_file') # run dimer dimer_relax.run(fmax=force_tol) # clean up np.savetxt('%s.MODE' % prefix, dimer_atoms.get_eigenmode()) write('POSCAR.vasp', dimer_atoms.get_atoms(), format='vasp')
# Freeze the "slab" mask = [atom.tag > 0 for atom in atoms] atoms.set_constraint(FixAtoms(mask=mask)) # Calculate using EMT atoms.set_calculator(EMT()) relaxed_energy = atoms.get_potential_energy() # Set up the dimer d_control = DimerControl( initial_eigenmode_method="displacement", displacement_method="vector", logfile=None, mask=[0, 0, 0, 0, 1] ) d_atoms = MinModeAtoms(atoms, d_control) # Displace the atoms displacement_vector = [[0.0] * 3] * 5 displacement_vector[-1][1] = -0.1 d_atoms.displace(displacement_vector=displacement_vector) # Converge to a saddle point dim_rlx = MinModeTranslate(d_atoms, trajectory="dimer_method.traj", logfile=None) dim_rlx.run(fmax=0.001) # Test the results tolerance = 1e-3 assert d_atoms.get_barrier_energy() - 1.03733136918 < tolerance assert abs(d_atoms.get_curvature() + 0.900467048707) < tolerance assert d_atoms.get_eigenmode()[-1][1] < -0.99 assert abs(d_atoms.get_positions()[-1][1]) < tolerance