subroutine copy_matrix_sp(dest, source, threaded)
!! copy a matrix of datatype sp
real(sp), intent(inout) :: dest(:, :)
real(sp), 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)
use_threads = pic_optional(threaded, use_threaded_default)
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_sp