Let Orbit handle multicomponent vectors and related quantities
Closes #569, #566 (closed)
In >2-component systems, each orbit comes with multiple cluster vector elements, each corresponding to a specific multicomponent vector. In icet, it has been the responsibility of ClusterSpace to calculate and store these. It has not been possible to calculate them in Orbit because one needs to have information about allowed occupations, which the orbit has not had.
Changes
- C++
Structures are now responsible to know about allowed occupations of their sites. - Each
Orbitnow initializes its own multicomponent vectors during initialization. This is now possible since theStructureknow about the allowed occupations. I tried to make this calculation a bit more transparent. - Each multicomponent vector also comes with a set of permutations and a multiplicity. To keep track of these, I introduced a
ClusterVectorElementstruct inOrbit, which keeps track of these things. It is similar to theClusterVectorElementInfostruct that I previously introduced on the C++ side. I'm not entirely happy with the name of this variable so suggestions are welcome. - No chemical symbols are ever handled C++-side now, only atomic numbers, which means that
PeriodicTable.cppcan be removed. - A keyword
ignore_permutationshas to be used if one wants to merge orbits with mismatch in permutations/multicomponent vectors.
The only significant performance change I've seen with this MR is a ~20 % boost in initialization of a ClusterExpansionCalculator.
Edited by Magnus Rahm