Optimize a reaction path using the nudged elastic band algorithm. An electronic structure method implemented in Gaussian 09/16, Q-Chem or BAGEL is used to calculate the energy and forces. The optimization itself is driven by the BFGS algorithm.
Nudged elastic band (NEB) method for finding minimum energy paths (MEP) and saddle points. Implementation based on "Improved tangent estimate in the nudged elastic band method for finding minimum energy paths and saddle points" by Henkelman, G.; Jonsson, H. J.Chem.Phys. 113, 9978 (2000)"
Python 2.7+ or 3.5+
-
numpy, argparse, future
Download the NEB directory
git clone https://github.com/mitric-lab/NEB.gitGo into this new directory and install the Python package
cd NEB
python setup.py installNow it should be possible to call the NEB program:
optmize_neb --helpThe execution of the NEB program is only possible within the SLURM environment. The idea is that
a SLURM job will execute the optimize_neb script and this job will automatically submit the force
calculations of the individual images (geometries).
Therefore, this NEB package contains submission scripts to send Gaussian/Q-Chem/Bagel jobs to the SLURM queue.
It might be necessary to adopt them to your system. They are located in
NEB/run_scripts/
Additionally, it is important that this path is included in your $PATH environment variable. In bash
you can execute something like this:
export PATH=__PATH_TO_YOUR_NEB_DIRECTORY__/NEB/run_scripts/:$PATH
The NEB calculations are parallelized over the images. The number of images that are
processed at the same time are specified by the option parallel_images.
The calculation for each image can be run in parallel, as well. The %Nproc=... line
in the Gaussian job file should agree with the value provided in the option procs_per_image.
Every N time steps the current path and the energy profile are written
to neb_####.xyz and path_energies_####.dat where #### is replaced by the
name of the input xyz-file and the time step.
To see all options for controlling the NEB calculation, call optimize_neb
with the --help option.
path.xyz - xyz-file with educt, intermediates and product
for Gaussian 09/16
neb.gjf - Gaussian 09/16 input script driving the energy calculation (see below)
for Q-Chem
neb.in - Q-Chem input script driving the energy calculation (see below)
neb_####.xyz - current reaction path
path_energies_####.dat - current energy profile
The program expects the initial (unoptimised) paths (xyz file) as a single argument, e.g:
optimize_neb path.xyz
This single argument should be an xyz-file containing initial guess geometries along the reaction path. This path will be optimized using the nudged elastic band (NEB) algorithm.
The initial path for the NEB should be interpolated between the two minimum structures. There are two different
algorithms that can be used. Either a linear interpolation (in internal coordinates), which is a for example a part
of the DFTBaby package by A. Humeniuk (see interpolate_linearly.py in DFTBaby). The more sophisticated way is to use
the geodesic interpolation algorithm developed by T. Martinez and coworkers (see Ref.).
Their algorithm is implemented in a python package and can be obtained from their Github repository.
A number of 12 to 16 interpolated structures is often a good choice.
In addition you have to set up a Gaussian input script called neb.gjf
that computes the gradient and saves it in a checkpoint file called
'grad.chk'. The geometry is updated via a file called geom that
is imported at the end of the script.
An example neb.gjf is given below:
------- example for neb.gjf ----------
%Chk=grad.chk !<-- Do not change this filename
%Nproc=1 !<-- This should be the same number as the --procs_per_image keyword
%Mem=1Gb !<-- This number be 20-30% lower than the --mem_per_image keyword
# B3LYP/def2SVP Force
NoSymm
s0 gradient
0 1
@geom !<-- Do not change this filename
!<-- Don't forget the extra line at the end
--------------------------------------
To use the NEB package in combination with Q-Chem you have to prepare a Q-Chem input
script called neb.in. Within this input file it is important that you request a force calculation
and that a Checkpoint file will be written. An example input script is shown below:
$comment
Q-Chem input file
1. A line prefixed with an exclamation mark ‘!’ is treated as a comment and will be ignored by the program
2. Variables are case-insensitive (as is the whole Q-CHEM input file).
$end
$molecule
0 1 ! Charge | Multiplicity | You do not have to specify the molecule here!
$end
$rem
!--GENERAL Q-CHEM SETTINGS -----------------------------------------------------------------------
MEM_TOTAL 12250 ! maximum amount of ram memory (MB)
MEM_STATIC 2000 ! static memory used (MB).
AO2MO_DISK 50000 ! specifies maximum amount of memory written to scratch files (MB)
GUI 2 ! 0: generate no checkpoint file | 2: generate fchk
!-------------------------------------------------------------------------------------------------
!--SCF PROCEDURE ---------------------------------------------------------------------------------
SCF_ALGORITHM DIIS ! DIIS |DM | GDM | RCA | ROOTHAN | DIIS_GDM | DIIS_DM | RCA_DIIS
SCF_CONVERGENCE 8 ! SCF is converged when energy change is below 1e-X hartree
SCF_MAX_CYCLES 150 ! controls the maximum number of scf iterations perimetted
SYMMETRY_IGNORE true ! control whether to use symmetry and reorienation of the molecule
!-------------------------------------------------------------------------------------------------
!--SPECIFICATION OF JOBTYPE ----------------------------------------------------------------------
JOBTYPE force ! requests the computation of gradients
!-------------------------------------------------------------------------------------------------
!--LEVEL OF THEORY -------------------------------------------------------------------------------
METHOD B3lYP ! specifies the (TD)-DFT functional
BASIS def2-svp ! specifies basis set to be used
!-------------------------------------------------------------------------------------------------
$end
After successful minimization of the reaction pathn you can plot the energy of the path during each iteration. Within the
directory where the neb_####.xyz and path_energies_####.dat files are located, you can just call:
optimize_neb plot
This will open a Matplotlib window where you can slide through the iterations as shown below:
Some examples with a submit script can be found in the NEB/examples directory.
water_flip_g16: Reaction path of water flip with Gaussian16 in the singlet ground state at the DFT level.water_flip_g16_excited_state: Reaction path of water flip with Gaussian16 in the first singlet excited state at the DFT level.water_flip_qchem: Reaction path of water flip with Q-Chem in the singlet ground state at the DFT level.
Make sure that the `optimize_neb` script is within your `$PATH` variable, so that it can be called from the command-line. The NEB computations can be performed in the electronic ground state as well as in the excited state. The interfaces allow these features at least for Gaussian 16 and Q-Chem. Optimization within the frame of spin-polarised/unrestricted wave functions are also possible and tested with Gaussian 16 and Q-Chem.
Optional arguments:
-
-h,--helpshow this help message and exit -
-i PROCS_PER_IMAGE,--procs_per_image=PROCS_PER_IMAGENumber of processors used in the calculation for a single image [default: 1] -
-m MEM_PER_IMAGE,--mem_per_image=MEM_PER_IMAGEAmount of memory to be allocated for each image calculation [default: 6Gb] -
-p PARALLEL_IMAGES,--parallel_images=PARALLEL_IMAGESHow many images should be processed in parallel? Each image will be run withprocs_per_imageprocessors [default: 1] -
-c FORCE_CONSTANT,--force_constant=FORCE_CONSTANTForce constant for strings connecting the beads on the elastic band [default: 0.1] -
--mass=MASSMass of beads [default: 1.0] -
-t TOLERANCE,--tolerance=TOLERANCEThe optimization is finished, if the maximum force on the band drops below this value [default: 0.02] -
-n NSTEPS,--nsteps=NSTEPSRun damped dynamics for NSTEPS steps [default: 1000] -
--dt=DTTime step for integrating damped dynamics [default: 0.1] -
-f FRICTION,--friction=FRICTIONdamping coefficient between 0.0 (no damping) and 1.0 (do not use such high damping) [default: 0.2] -
-e,--optimize_endpointsOptimize the endpoints of the path as well [default: not set] -
-s SCRATCH_DIR,--scratch_dir=SCRATCH_DIRPath to scratch directory [default: /sscratch/$PBS_JOBID] -
--print_every=PRINT_EVERYPrint current path and energies every N-th step [default: 1] -
--integrator=INTEGRATORChoose the integration algorithm for the optimization steps. Use either 'verlet' or 'bfgs' (default). BFGS is strongly recommended. -
--maxstep=MAXSTEPMaximum step length for BFGS optimization in Angstrom [default: 0.01] -
--calculator=CALCULATORChoose electronic structure program, 'g09' or 'g16' (Gaussian) or 'qchem'. If Q-Chem is chosen, an input file called 'neb.in' has to be present instead of 'neb.gjf' [default: g16]
