subroutine comm_isend_real_dp_array_2d(comm, data, dest, tag, request)
type(comm_t), intent(in) :: comm
real(dp), intent(in) :: data(:, :)
integer(int32), intent(in) :: dest
integer(int32), intent(in) :: tag
type(request_t), intent(out) :: request
integer(int32) :: ierr, dim1, dim2
! Send dimensions first (blocking - simple approach)
dim1 = size(data, 1)
dim2 = size(data, 2)
call MPI_Send(dim1, 1_int32, MPI_INTEGER, dest, tag, comm%m_comm, ierr)
call MPI_Send(dim2, 1_int32, MPI_INTEGER, dest, tag, comm%m_comm, ierr)
! Send data (non-blocking)
call MPI_Isend(data, size(data), MPI_DOUBLE_PRECISION, dest, tag, comm%m_comm, request%m_request, ierr)
request%is_valid = .true.
end subroutine comm_isend_real_dp_array_2d