I am wondering the theoretical method used to enumerate structures for genstr code. I noticed that the enumlib code released by Hart et al. is also for this purpose.
Three more special questions for clarification:
Are the structures generated by genstr are unique to each other, i.e. equivalent structures are removed?
If so, can one get the number of distinct (unequal) strucutres with one size (e.g. 16atoms) by genstr? And the total number of the complete derivative structures (including duplicates)?
Does genstr adopt the same scheme to dig out the distinct (nonequivalent) structures to that of enumlib code? or others.
genstr enumerates all unequivalent structure up to some nb of atom per unit cell because this is what most people need. You can easily extract only those with a given nb of atom, since they are sorted by nb of atom.
That you can just compute. Of course it depends how you handle different but equivalent lattice vectors.
It adopts some of the techniques by Hart and Forcade (to avoid looping over all occupations). I didn’t go into optimizing the internal representation of the structures as pure integers, however.
In my experience, it is rare that one needs to enumerate so many structures that the additional optimizations made by Hart et al. are worth it.
To your question: I am currently working on the enumration of all possible unique inequivalent supercells (random distribution on one sublattice, e.g. (Ti0.5_W0.5_N1 possible superlattice or solution) with a given nb of atom (of course with small number generally <64 atoms) in order to get properties of some special ordered structures from them.
By the way, does genstr cover all the geometrically inequivalent structures? or only part of them? If all covered, does it mean that it will give the same number of unique structure to that from enumlib or other codes?
Why would you ask that? The goal of the code is obviously to enumerate all inequivalent structures, not just some of them.
I can already anticipate that you believe my code is missing some structure, so just send me your test case and which structure you claim is missing. I always welcome bug reports, as they help improve the code.
Please note that ATAT was used to debug the output of enumlib…
Thanks for your clarification!
To "Why would you ask that? ", when I used both genstr and enumlib to enumerate inequivalent structures, I got different numbers for the same system:
3.8 3.8 3.8 90 90 90
0 0.5 0.5
0.5 0 0.5
0.5 0.5 0
0 0 0 Cu,Au
For genstr,
>>genstr -l lat.in -n 3
there are total 10,
For enumlib,
>>enum.x latt.in
I got 11 number.
Calculating derivative structures for index n= 1 to 3
Including only structures of which the concentration of each atom is in the range:
Type: 1: 0/2–2/2
Type: 2: 0/2–2/2
Volume CPU #HNFs#SNFs#reduced % dups volTot RunTot
1 0.0020 1 1 1 0.0000 2 2
2 0.0030 7 1 3 0.5714 3 5
3 0.0040 13 1 3 0.7692 6 11
When I increase the n, the difference becomes bigger. I am not sure why they got different number and asked the question last time. I am still trying to learning both codes, maybe i misunderstood something to generate the inequivalent structures by both codes.
One important difference is than Hart & Forcade consider 2 structures equivalent if changing all atom types (Cu to Au and vice versa) while my code considers such two structures as distinct.
The strange thing in your result with enumlib is that they don’t agree with the original paper describing the method: https://journals.aps.org/prb/abstract/1 … .77.224115
(See table IV and V)
But genstr does agree with these tables.