def test_dimer_method(testdir): # 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.calc = EMT() atoms.get_potential_energy() # Set up the dimer with DimerControl(initial_eigenmode_method='displacement', displacement_method='vector', logfile=None, mask=[0, 0, 0, 0, 1]) as d_control: 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 with MinModeTranslate(d_atoms, trajectory='dimer_method.traj', logfile="dimer_method.log") as dim_rlx: dim_rlx.run(fmax=0.001)
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)
# Relax the initial state: QuasiNewton(initial).run(fmax=0.05) e0 = initial.get_potential_energy() traj = Trajectory('dimer_along.traj', 'w', initial) traj.write() # Making dimer mask list: d_mask = [False] * (N - 1) + [True] # Set up the dimer: d_control = DimerControl(initial_eigenmode_method='displacement', displacement_method='vector', logfile=None, mask=d_mask) d_atoms = MinModeAtoms(initial, d_control) # Displacement settings: displacement_vector = np.zeros((N, 3)) # Strength of displacement along y axis = along row: displacement_vector[-1, 1] = 0.001 # The direction of the displacement is set by the a in # displacement_vector[-1, a], where a can be 0 for x, 1 for y and 2 for z. d_atoms.displace(displacement_vector=displacement_vector) # Converge to a saddle point: dim_rlx = MinModeTranslate(d_atoms, trajectory=traj, logfile=None) dim_rlx.run(fmax=0.001) diff = initial.get_potential_energy() - e0 print(('The energy barrier is %f eV.' % diff))
'trial_angle': pi / 4.0, 'trial_trans_step': 0.001, 'maximum_translation': 0.1, 'cg_translation': True, 'use_central_forces': True, 'dimer_separation': 0.0001, 'initial_eigenmode_method': 'gauss''displacement', 'extrapolate_forces': False, 'displacement_method': 'gauss''vector, 'gauss_std': 0.1, 'order': 1, 'mask': None, # NB mask should not be a "parameter" 'displacement_center': None, 'displacement_radius': None, 'number_of_displacement_atoms': None}""" d_atoms = MinModeAtoms(runner, d_control) """# Enable with 'displacement' - 'vector' # Displacement settings: # initial vector: displacement_vector = np.zeros((N, 3)) # Strength of displacement along y axis = along row: displacement_vector[-1, 0] = 0.1 # The direction of the displacement needed if usint displacement vector method # displacement_vector[-1, a], where a can be 0 for x, 1 for y and 2 for z. d_atoms.displace(displacement_vector=displacement_vector)""" # Converge to a saddle point: dim_rlx = MinModeTranslate(d_atoms, trajectory=traj) # , logfile=None) dim_rlx.run(fmax=0.001)
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()) 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)
# dimer setup dimer_control = DimerControl(initial_eigenmode_method='displacement', displacement_method='vector', maximum_translation=0.2, trial_trans_step=5.0e-3, dimer_separation=dimer_dist, mask=d_mask, f_rot_min=0.01, f_rot_max=0.2, 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
# Relax the initial state: QuasiNewton(initial).run(fmax=0.05) e0 = initial.get_potential_energy() traj = Trajectory('dimer_along.traj', 'w', initial) traj.write() # Making dimer mask list: d_mask = [False] * (N - 1) + [True] # Set up the dimer: d_control = DimerControl(initial_eigenmode_method='displacement', displacement_method='vector', logfile=None, mask=d_mask) d_atoms = MinModeAtoms(initial, d_control) # Displacement settings: displacement_vector = np.zeros((N, 3)) # Strength of displacement along y axis = along row: displacement_vector[-1, 1] = 0.001 # The direction of the displacement is set by the a in # displacement_vector[-1, a], where a can be 0 for x, 1 for y and 2 for z. d_atoms.displace(displacement_vector=displacement_vector) # Converge to a saddle point: dim_rlx = MinModeTranslate(d_atoms, trajectory=traj, logfile=None) dim_rlx.run(fmax=0.001)
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()) 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