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 Orbit now initializes its own multicomponent vectors during initialization. This is now possible since the Structure know 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 ClusterVectorElement struct in Orbit, which keeps track of these things. It is similar to the ClusterVectorElementInfo struct 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.cpp can be removed.
  • A keyword ignore_permutations has 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

Merge request reports

Loading