[ase-users] Parallelizing over NEB images

Gaël Donval G.Donval at bath.ac.uk
Tue Nov 21 18:44:52 CET 2017


Please keep things on the list, especially as I am clearly not the most
knowledgeable about NEB here (and if I was, other people might be
interested as well).

> Thanks, Gaël for your prompt reply. I believe I was confusing the
> “actual” force on the images between the saddle point and minimas
> (which will be higher than fmax since they lie on a high curvature)
> with the “nudged” force which has to be lower than fmax. The log then
> gives me the actual force rather than the nudged which is why it is
> so far off the fmax. Does this make sense?

Not really no, unless you've mixed things up when writing. The forces
that are calculated, and compared to fmax, are the resultant ones
applied to each atom individually. The rational is that if those forces
(which include the quadratic potential used for image coupling) are all
null, the structure is at the bottom of the local minimum (constrained
by the other images). This is what you optimise. As a result of this,
you get different structures of different energies. From the energy
curvature, you can calculate new forces. These forces are a
*consequence* of the optimisation of the atomic forces and don't
represent the same thing at all! The first ones concern individual
atoms, the second one concerns the reaction path you have just probed.

Gaël


> 
> The remainder of what you said makes complete sense.
> 
> Cheers,
> Divya
> 
> On 21/11/17 17:05, "ase-users-bounces at listserv.fysik.dtu.dk on behalf
> of Gaël Donval via ase-users" <ase-users-bounces at listserv.fysik.dtu.d
> k on behalf of ase-users at listserv.fysik.dtu.dk> wrote:
> 
>     Hi Divya,
>     
>     > Dear ASE users,
>     > 
>     > I am trying to perform my first CI-NEB calculation where I have
> 4
>     > images between the initial and final images and the
> optimization of
>     > the images is parallelized (script below). I would greatly
> appreciate
>     > your help on the below 2 questions:
>     > 
>     > 
>     > 1.       What does the fmax for the optimizer specify exactly?
> Is
>     > this taken as the curvature at the initial and final states of
> the
>     > NEB interpolation? How does NEB determine the convergence
> criterion
>     > for the each of the images on the minimum energy path and where
> can I
>     > see this?
>     
>     The `fmax` keyword is always a maximum force of some sort. To go
> into
>     more details, your LBFGS optimizer is going to call the
> `get_forces`
>     method to whatever object is provided (in your case a NEB
> object),
>     calculate their norm and check if none of them is greater than
> `fmax`.
>     For an NEB object, `get_forces` is going to gather all the forces
> from
>     all the inner images (that is, all images except the end-points
> --that
>     are untouched).
>     
>     So the `fmax` you provide *is* the convergence criterion for all
>     images: the images are interdependent; they are coupled;
> "converging"
>     one by itself makes little sense.
>     
>     > 
>     > 
>     > 2.       When I read the log file, it seems like instead of
> logging
>     > the energy and max force for each image, it is logging the
> potential
>     > energy and max force for the image with the highest energy. I
> want to
>     > confirm that despite this, each of the images are separately
>     > optimized towards the convergence criteria and that this
> logging does
>     > not affect the optimization itself. Also, how can I make the
> log the
>     > forces and energies of each image separately for it to make
> more
>     > sense?
>     
>     The energy in your logfile is indeed the maximum energy. What NEB
> is
>     usually used for is determining an energy barrier providing known
> end-
>     points. In that context, providing the maximum energy point on
> the NEB
>     path as a summary of the advance of the algorithm is the only
> thing
>     that really makes sense. Though this is just a log file, a
> summary: all
>     the other inner images are constantly optimised too.
>     
>     Actually, you should really think of all the images as a single
> system.
>     
>     Regarding local information, you can extract it either from the
>     trajectory file generated by LBGFS (provided you gave a value to
> its
>     `trajectory` argument); you could extract that from the images
>     themselves or you could use (and study if you need something
> more)
>     `ase.neb.NEBTools`.
>     
>     Cheers,
>     Gaël
>     
>     
>     > 
>     > Thanks in advance.
>     > 
>     > Best regards,
>     > Divya
>     > 
>     > from __future__ import print_function
>     > from ase.constraints import FixAtoms
>     > from ase.optimize import BFGS, QuasiNewton, LBFGS, MDMin
>     > from ase.lattice.cubic import FaceCenteredCubic
>     > from ase.build import fcc110, add_adsorbate
>     > from gpaw import GPAW, PW, FermiDirac, Mixer
>     > from ase.io import write, read,Trajectory
>     > from ase import Atoms, Atom
>     > from ase.neb import NEB
>     > from ase.optimize.fire import FIRE
>     > from ase.parallel import rank, size
>     > import numpy as np
>     > 
>     > calc = GPAW('Ag110_2x3x6_BEEF.gpw')
>     > CO2_slab=read('CINEB_Ag110_2x3x6_CO2-H_reference.traj')
>     > COOH_slab=read('Ag110_2x3x6_COOHupLbridge_rot_BEEF.traj')
>     > 
>     > initial = CO2_slab
>     > final = COOH_slab
>     > 
>     > constraint = FixAtoms(mask=[atom.tag > 2 for atom in initial])
>     > 
>     > n = size // 4      # number of cpu's per image
>     > j = 1 + rank // n  # my image number
>     > assert 4 * n == size
>     > 
>     > images = [initial]
>     > 
>     > for i in range(4):
>     >     ranks = range(i * n, (i + 1) * n)
>     >     image = initial.copy()
>     > 
>     >     if rank in ranks:
>     >         calc=GPAW(mode=PW(450), xc='BEEF-vdW', basis='dzp',
>     > gpts=(48,48,160), kpts=(3,3,1), txt='CINEB_Ag110_2x3x6_CO2-
>     > COOH_Tafel_neb%d.txt' % j, occupations=FermiDirac(0.1),
>     > mixer=Mixer(beta=0.1, nmaxold=5, weight=50.0),
> communicator=ranks)
>     >         image.set_calculator(calc)
>     > 
>     >     image.set_constraint(constraint)
>     >     images += [image]
>     > 
>     > images += [final]
>     > 
>     > neb = NEB(images, parallel=True, climb=True)
>     > neb.interpolate('idpp')
>     > #Run NEB calculation
>     > opt = LBFGS(neb, logfile='CINEB_Ag110_2x3x6_CO2-
> COOH_Tafel.log')
>     > opt.run(fmax=0.05)
>     > 
>     > for i in range(1, 5):
>     >     opt.attach(io.write('CINEB_Ag110_2x3x6_CO2-COOH_Tafel-
> %d.cif' %
>     > i, 'w', images[i]))
>     >     opt.attach(io.Trajectory('CINEB_Ag110_2x3x6_CO2-COOH_Tafel-
>     > %d.traj' % i, 'w', images[i]))
>     > 
>     > 
>     > #Logfile
>     > 
>     > LBFGS:   0  18:17:31    -5379.937600       6.8668
>     > LBFGS:   1  18:44:44    -5380.096707       6.1825
>     > LBFGS:   2  19:11:00    -5380.155402       4.4230
>     > LBFGS:   3  19:39:07    -5380.249108       3.3944
>     > LBFGS:   4  20:07:05    -5380.368769       3.2199
>     > LBFGS:   5  20:35:12    -5380.521739       3.4305
>     > LBFGS:   6  21:03:11    -5380.727266       3.9711
>     > LBFGS:   7  21:31:13    -5380.953959       4.5234
>     > LBFGS:   8  21:57:42    -5381.208836       5.0993
>     > LBFGS:   9  22:24:52    -5381.490995       5.6717
>     > LBFGS:  10  22:51:58    -5381.801246       6.2453
>     > LBFGS:  11  23:19:50    -5382.139225       6.7877
>     > LBFGS:  12  23:47:46    -5382.503905       7.2781
>     > LBFGS:  13  00:14:56    -5382.896339       7.7335
>     > LBFGS:  14  00:43:06    -5383.314196       8.1039
>     > LBFGS:  15  01:12:07    -5383.755902       8.3441
>     > LBFGS:  16  01:42:02    -5384.209731       8.3273
>     > LBFGS:  17  02:12:50    -5384.660808       7.9158
>     > LBFGS:  18  02:44:25    -5385.012915       7.1416
>     > LBFGS:  19  03:14:20    -5385.247200       6.9705
>     > LBFGS:  20  03:45:01    -5385.395184       7.2958
>     > LBFGS:  21  04:15:33    -5385.502550       7.5201
>     > LBFGS:  22  04:46:22    -5385.588210       7.6800
>     > LBFGS:  23  05:17:00    -5385.661367       7.7952
>     > LBFGS:  24  05:47:43    -5385.726172       7.8750
>     > LBFGS:  25  06:18:26    -5385.784934       7.9238
>     > LBFGS:  26  06:49:07    -5385.839004       7.9446
>     > LBFGS:  27  07:20:34    -5385.889114       7.9381
>     > LBFGS:  28  07:52:51    -5385.935424       7.9049
>     > LBFGS:  29  08:25:06    -5385.974499       7.8480
>     > LBFGS:  30  08:57:26    -5386.006282       7.7645
>     > LBFGS:  31  09:29:42    -5386.029139       7.6479
>     > LBFGS:  32  10:02:02    -5386.039673       7.4886
>     > LBFGS:  33  10:35:16    -5386.032930       7.2809
>     > LBFGS:  34  11:07:37    -5386.006100       7.0377
>     > LBFGS:  35  11:39:01    -5385.960810       6.7818
>     > LBFGS:  36  12:11:23    -5385.900440       6.5308
>     > LBFGS:  37  12:44:37    -5385.829873       6.2943
>     > LBFGS:  38  13:17:49    -5385.753279       6.0716
>     > LBFGS:  39  13:50:59    -5385.675096       6.1741
>     > LBFGS:  40  14:23:24    -5385.599475       6.4399
>     > LBFGS:  41  14:54:54    -5385.530148       6.6489
>     > LBFGS:  42  15:28:03    -5385.469514       6.8101
>     > 
>     > 
>     > _______________________________________________
>     > ase-users mailing list
>     > ase-users at listserv.fysik.dtu.dk
>     > https://listserv.fysik.dtu.dk/mailman/listinfo/ase-users
>     
>     _______________________________________________
>     ase-users mailing list
>     ase-users at listserv.fysik.dtu.dk
>     https://listserv.fysik.dtu.dk/mailman/listinfo/ase-users
> 



More information about the ase-users mailing list