Skip to content

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

Merge request reports