Draft: Non block cyclic orbital distribution
This adds a constructor for non-block-cyclic orbital distributions.
The constructor expects a list of local orbitals (and the number thereof) instead of a BlockSize. From this information, the constructor determines explicit maps between local and global indices (ng2l, nl2g), as well as a map between the global indices and the processor handling it (ng2p).
All other machinery for this type of distribution already existed, this adds a missing constructor.
Currently, there is no error checking for doubly assigned orbitals etc. This will lead to unexpected behavior if multiple processors within the same communicator group are assigned the orbital. I'm not sure whether this should be checked inside the constructor or in the routine that calls the constructor.
A check could be added after the ng2p is constructed: each processor iterates over the orbital local to it and checks whether the processor listed in ng2p coincides with its own rank. In the case of mismatch, the code should probably die.
Sketch
do io = 1, nl_orbs
if ( this%data%ng2p(l_orbs(io)) /= this%data%node ) then
die('Orbitals are not uniquely assigned to processors.')
end do