subroutine copy_3d_tensor_dp(dest, source, threaded)
!! copy a tensor of datatype dp
real(dp), intent(inout) :: dest(:, :, :)
real(dp), intent(in) :: source(:, :, :)
logical, intent(in), optional :: threaded
logical :: use_threads
integer(default_int) :: i, j, k
integer(default_int) :: ii, jj, kk
integer(default_int) :: nx, ny, nz
! --- Size checks ---
if (size(dest, 1) /= size(source, 1) &
.or. size(dest, 2) /= size(source, 2) &
.or. size(dest, 3) /= size(source, 3)) then
error stop "Tensor size mismatch"
end if
nx = size(source, 1)
ny = size(source, 2)
nz = size(source, 3)
use_threads = pic_optional(threaded, use_threaded_default)
if (use_threads) then
!$omp parallel do collapse(3) private(i,j,k,ii,jj,kk)
do kk = 1, nz, block_size
do jj = 1, ny, block_size
do ii = 1, nx, block_size
do k = kk, min(kk + block_size - 1, nz)
do j = jj, min(jj + block_size - 1, ny)
do i = ii, min(ii + block_size - 1, nx)
dest(i, j, k) = source(i, j, k)
end do
end do
end do
end do
end do
end do
!$omp end parallel do
else
dest = source
end if
end subroutine copy_3d_tensor_dp