D.3.5 Generate_Even_Distribution Procedure

The main documentation of the Generate_Even_Distribution Procedure contains additional explanation of this code listing.

  subroutine Generate_Even_Distribution (Vector, NItems)
  
    ! Input variable.

    ! Number of items to be evenly distributed.
    type(integer), intent(in) :: NItems 
  
    ! Input/Output variable.
    
    ! Vector to hold the even distribution.
    type(integer,1) :: Vector 
  
    ! Internal variables.

    type(integer) :: extra   ! Leveling variable.
    type(integer) :: i       ! Loop counter.
    type(integer) :: NSlots  ! Number of slots available in the Vector.

    !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  
    ! Verify requirements.
  
    VERIFY(Valid_State(Vector),5)  ! Vector is valid.
    VERIFY(Valid_State(NItems),5)  ! NItems is valid.
    VERIFY(NItems>=SIZE(Vector),5) ! NItems is big enough.
  
    ! Generate the even distribution.

    NSlots = SIZE(Vector)
    do i = 1, NSlots-1
      Vector(i) = NItems / NSlots
    end do
    Vector(NSlots) = NItems - SUM(Vector(1:NSlots-1))
    extra = Vector(NSlots) - NItems / NSlots
    do i = 1, extra
      Vector(i) = Vector(i) + 1
    end do
    Vector(NSlots) = NItems - SUM(Vector(1:NSlots-1))
  
    ! Verify guarantees.

    VERIFY(Valid_State(Vector),5)              ! Vector is valid.
    VERIFY(SUM(Vector)==NItems,5)              ! Vector sum is correct.
    VERIFY(MAXVAL(Vector)-MINVAL(Vector)<=1,5) ! Vector is evenly distributed.

    return
  end subroutine Generate_Even_Distribution



Michael L. Hall