measuring Lindemann index?


Can some please help, how I can measure the Lindemann index for a group of atoms in lammps? I have searched in mailing list, but couldn’t find a hint.
Thank you.

I think you’d need to write a new compute to calculate
that. There are several computes line centro/atom that
use an atom’s local neighborhood to calculate a value
per atom.


Couple of Qs about the Lindemann index.
I assume you want a local index, i.e. a value calculated
for each atom. Assume you have the neighbors of each
atom, within a cutoff distance. Does
the sum in the formula include all those atoms,
so it might be a different N for every atom? Or does
the user choose N and the formula is for the N closest
atoms to each central atom? What happens if an
atom does not have N neighbors within the cutoff
(e.g. it is an atom at a surface) - does that mean
it’s index is set to 0.0?

If you clarify those Qs, it should be an easy compute
to write.


Thank you for your follow-up Steve. These are good questions and I mention my opinions based on what I have read in papers.

I think:
The formula should include all the atoms. As the atoms on the surface play their role in the transition (such as a melting of a nanoparticle), they definitely should be considered.

"r**ij is the distance between atoms i and j, N is the number of atoms in the particle, and the brackets represent the ensemble average at the temperature of the sample."

As examples, I recommend you take a look at these papers and their descriptions about how they defined and used the Lindemann index:


The Lindemann implementations I’ve seen seem to be very difficult to implement in LAMMPS, as they require storing data for every i-j pair in the system. Some people who use LAMMPS calculate it through postprocessing.


you may be right. Reading the forumla on the wiki

page again, it seems like is meant to be

a time average of the distance between

a particular pair of I,J atoms. I don’t see a simple

way to do that w/out keeping track of an old

neighbor list. I also don’t see how it is even computable

(within LAMMPS) over long periods of time if

atoms move far enough so that I,J are not neighbors

at a later time.


I once hacked something together using Colvars, but there were many icky things about that implementation. But it was possible within that framework.


I’m thinking about writing another compute (for calc of a slip vector),
which needs to know info about the neighbors of an atom
at a previous time step. I.e. each atom would store
the atom IDs and coords of its N nearest neighbors at time 0,
where maybe N = 12 for fcc lattices. Can a similar
storage also be used to compute the Lindemann index?
Maybe storing the neighbor IDs and the running time-averaged
distance to them.

But I’m still unclear on the wiki-page formula how its computed
exactly. Do you define some # of neighs/atom at time
0 and carry those forward in time to get time-averaged distances
to the same neighbors over time? What if old neighbors
move away, and new neighbors move close? What if you
don’t have N neighbors? For Lindemann, is N small or
big? It would require a lot of memory if N = 50 or 100.

If someone can clarify the
explicit details, this might be do-able with code
similar to the slip vector compute.


The implementations I’ve seen (in homebrew codes) use all i-j pairs (so all possible distances are used). But the only applications of this kind calculations were for small clusters, where memory is not that much of an issue. In the literature I saw people calculating the Lindemann Index differently, just using the MSD (which, definitely in bulk systems, gives the same kind of information).