function sum_3d_tensor_int64(tensor, threaded) result(res)
!! perform the total sum of all components of type int64 in a 3d tensor
integer(int64), intent(in) :: tensor(:, :, :)
logical, intent(in), optional :: threaded
logical :: use_threads
integer(int64) :: res
integer(default_int) :: nx, ny, nz
integer(default_int) :: i, j, k, ii, jj, kk
nx = size(tensor, 1)
ny = size(tensor, 2)
nz = size(tensor, 3)
use_threads = pic_optional(threaded, use_threaded_default)
res = 0_int64
if (use_threads) then
!$omp parallel do collapse(3) private(i,j,k,ii,jj,kk) reduction(+: res)
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)
res = res + tensor(i, j, k)
end do
end do
end do
end do
end do
end do
!$omp end parallel do
else
res = sum(tensor)
end if
end function sum_3d_tensor_int64