anchor.diff:      ALLOCATE(per_proc_row_end(total_processors))
       ALLOCATE(per_proc_col_start(total_processors))
       ALLOCATE(per_proc_col_end(total_processors))
  -    ! CALL MPI_Allgather(row_start, 1, MPI_INT, per_proc_row_start, 1, MPI_INT,&
  -    !      & global_comm, grid_error)
  -    ! CALL MPI_Allgather(row_end, 1, MPI_INT, per_proc_row_end, 1, MPI_INT, &
  -    !      & global_comm, grid_error)
  -    ! CALL MPI_Allgather(column_start, 1, MPI_INT, per_proc_col_start, 1, &
  -    !      & MPI_INT, global_comm, grid_error)
  -    ! CALL MPI_Allgather(column_end, 1, MPI_INT, per_proc_col_end, 1, MPI_INT, &
  -    !      & global_comm, grid_error)
  +    CALL MPI_Allgather(row_start, 1, MPI_INT, per_proc_row_start, 1, MPI_INT,&
  +         & global_comm, grid_error)
  +    CALL MPI_Allgather(row_end, 1, MPI_INT, per_proc_row_end, 1, MPI_INT, &
  +         & global_comm, grid_error)
  +    CALL MPI_Allgather(column_start, 1, MPI_INT, per_proc_col_start, 1, &
  +         & MPI_INT, global_comm, grid_error)
  +    CALL MPI_Allgather(column_end, 1, MPI_INT, per_proc_col_end, 1, MPI_INT, &
  +         & global_comm, grid_error)
   
       !! Count The Number of Elements To Send To Each Process
  -    ALLOCATE(elements_per_proc(total_processors))
  -    elements_per_proc = 0
  +    ALLOCATE(send_per_proc(total_processors))
  +    send_per_proc = 0
       DO counter = 1, local_triplet_list%CurrentSize
          DO p_counter = 1, total_processors
          END DO
  
positive.code:     INTEGER, DIMENSION(:), ALLOCATABLE :: per_proc_row_end
      INTEGER, DIMENSION(:), ALLOCATABLE :: per_proc_col_start
      INTEGER, DIMENSION(:), ALLOCATABLE :: per_proc_col_end
      INTEGER, DIMENSION(:), ALLOCATABLE :: elements_per_proc
      !! Send Buffer
      INTEGER, DIMENSION(:), ALLOCATABLE :: send_buffer_offsets
      INTEGER, DIMENSION(:), ALLOCATABLE :: send_buffer_row
      INTEGER, DIMENSION(:), ALLOCATABLE :: send_buffer_column
      INTEGER, DIMENSION(:), ALLOCATABLE :: send_buffer_values
      !! Temporary
      INTEGER :: counter, p_counter
  
      !! Merge all the local data
      CALL MergeLocalBlocks(this, merged_local_data)
  
negative.code: 
      !! Build a send buffer
      ALLOCATE(send_buffer_offsets(total_processors))
      ALLOCATE(send_buffer_row(local_triplet_list%CurrentSize))
      ALLOCATE(send_buffer_col(local_triplet_list%CurrentSize))
      ALLOCATE(send_buffer_val(local_triplet_list%CurrentSize))
      DO counter = 1, local_triplet_list%CurrentSize
         DO p_counter = 1, total_processors
         END DO
      END DO
  
      !! Build a receive buffer
      ALLOCATE(recv_per_proc(total_processors))
      ALLOCATE(recv_buffer_offsets(total_processors))
      CALL MPI_Alltoall(send_per_proc, 1, MPI_INT, recv_per_proc, 1, MPI_INT, &
           & global_comm, grid_error)
      ALLOCATE(recv_buffer_row(SUM(recv_per_proc)))
      ALLOCATE(recv_buffer_col(SUM(recv_per_proc)))
      ALLOCATE(recv_buffer_val(SUM(recv_per_proc)))
  
      !! Send
      CALL MPI_Alltoallv(send_buffer_row, send_per_proc, send_buffer_offsets, &
           & MPI_INT, recv_buffer_row, recv_per_proc, recv_buffer_offsets, &
           & MPI_INT, global_comm, grid_error)
      CALL MPI_Alltoallv(send_buffer_col, send_per_proc, send_buffer_offsets, &
           & MPI_INT, recv_buffer_col, recv_per_proc, recv_buffer_offsets, &
           & MPI_INT, global_comm, grid_error)
      CALL MPI_Alltoallv(send_buffer_val, send_per_proc, send_buffer_offsets, &
           & MPINTREAL, recv_buffer_val, recv_per_proc, recv_buffer_offsets, &
           & MPINTREAL, global_comm, grid_error)
  
      !! Convert receive buffer to triplet list
      CALL ConstructTripletList(triplet_list, size_in=SUM(recv_per_proc))
      DO counter=1, SUM(recv_per_proc)
         triplet_list%data(counter)%index_row = recv_buffer_row(counter)
         triplet_list%data(counter)%index_column = recv_buffer_col(counter)
         triplet_list%data(counter)%point_value = recv_buffer_val(counter)
      END DO
  
      !! Cleanup
      DEALLOCATE(recv_buffer_offsets)
      DEALLOCATE(recv_buffer_val)
      DEALLOCATE(recv_buffer_col)
      DEALLOCATE(recv_buffer_row)
      DEALLOCATE(recv_per_proc)
      DEALLOCATE(send_buffer_val)
      DEALLOCATE(send_buffer_col)
      DEALLOCATE(send_buffer_row)
      DEALLOCATE(send_buffer_offsets)
      DEALLOCATE(send_per_proc)
      DEALLOCATE(per_proc_row_start)
      DEALLOCATE(per_proc_row_end)
      DEALLOCATE(per_proc_col_start)
  