copy_matrix_int64 Subroutine

private subroutine copy_matrix_int64(dest, source, threaded)

Arguments

Type IntentOptional Attributes Name
integer(kind=int64), intent(inout) :: dest(:,:)
integer(kind=int64), intent(in) :: source(:,:)
logical, intent(in), optional :: threaded

Called by

proc~~copy_matrix_int64~~CalledByGraph proc~copy_matrix_int64 copy_matrix_int64 interface~copy copy interface~copy->proc~copy_matrix_int64

Variables

Type Visibility Attributes Name Initial
integer(kind=default_int), private :: cols
integer(kind=default_int), private :: i
integer(kind=default_int), private :: ii
integer(kind=default_int), private :: j
integer(kind=default_int), private :: jj
integer(kind=default_int), private :: rows
logical, private :: use_threads

Source Code

   subroutine copy_matrix_int64(dest, source, threaded)
      integer(int64), intent(inout) :: dest(:, :)
      integer(int64), intent(in)    :: source(:, :)
      logical, intent(in), optional :: threaded
      logical :: use_threads
      integer(default_int) :: i, j, rows, cols
      integer(default_int) :: ii, jj
      if (size(dest, 1) /= size(source, 1) .or. size(dest, 2) /= size(source, 2)) then
         error stop "Matrix size mismatch"
      end if
      rows = size(source, 1)
      cols = size(source, 2)
      if (present(threaded)) then
         use_threads = threaded
      else
         use_threads = use_threaded_default
      end if
      if (use_threads) then
         !$omp parallel do collapse(2) private(i,j,ii,jj)
         do jj = 1, cols, block_size
            do ii = 1, rows, block_size
               do j = jj, min(jj + block_size - 1, cols)
                  do i = ii, min(ii + block_size - 1, rows)
                     dest(i, j) = source(i, j)
                  end do
               end do
            end do
         end do
         !$omp end parallel do
      else
         dest = source
      end if
   end subroutine copy_matrix_int64