diff --git a/test/fortran/test_util_stride.f90 b/test/fortran/test_util_stride.f90 new file mode 100644 index 0000000000000000000000000000000000000000..e432da4c4b9a23afa38b144e0c72445573f9269d --- /dev/null +++ b/test/fortran/test_util_stride.f90 @@ -0,0 +1,66 @@ +! ICON +! +! --------------------------------------------------------------- +! Copyright (C) 2004-2024, DWD, MPI-M, DKRZ, KIT, ETH, MeteoSwiss +! Contact information: icon-model.org +! +! See AUTHORS.TXT for a list of authors +! See LICENSES/ for license information +! SPDX-License-Identifier: BSD-3-Clause +! --------------------------------------------------------------- + +MODULE test_mo_util_stride + USE FORTUTF + USE ISO_C_BINDING, ONLY: c_int, c_ptr, c_loc, c_size_t + USE mo_util_stride + CONTAINS + SUBROUTINE TEST_util_stride_1d + INTEGER(c_int) :: f_out, elemsize + REAL, DIMENSION(10), TARGET :: array + TYPE(c_ptr) :: p1, p2 + + CALL TAG_TEST("util_stride_1d") + array = [1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0] + elemsize = SIZEOF(array(1)) + p1 = c_loc(array(1)) + p2 = c_loc(array(2)) + + CALL util_stride_1d(f_out, elemsize, p1, p2) + + CALL ASSERT_EQUAL(f_out, 1) + END SUBROUTINE TEST_util_stride_1d + + SUBROUTINE TEST_util_stride_2d + INTEGER(c_int) :: f_out(2), elemsize + REAL, DIMENSION(10, 10), TARGET :: array + TYPE(c_ptr) :: p1, p2, p3 + + CALL TAG_TEST("util_stride_2d") + array = RESHAPE([(i, i=1,100)], [10, 10]) + elemsize = SIZEOF(array(1, 1)) + p1 = c_loc(array(1, 1)) + p2 = c_loc(array(2, 1)) + p3 = c_loc(array(1, 2)) + + CALL util_stride_2d(f_out, elemsize, p1, p2, p3) + + CALL ASSERT_EQUAL(f_out(1) , 1) + CALL ASSERT_EQUAL(f_out(2), 10) + END SUBROUTINE TEST_util_stride_2d +SUBROUTINE TEST_util_get_ptrdiff + INTEGER(c_size_t) :: s + REAL, DIMENSION(1, 10), TARGET :: array + TYPE(c_ptr) :: p1, p2 + + CALL TAG_TEST("util_get_ptrdiff") + + array = RESHAPE([1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0], [1, 10]) + p1 = c_loc(array(1, 1)) + p2 = c_loc(array(1, 10)) + + print *, TRANSFER(p1, 0_c_size_t), TRANSFER(p2, 0_c_size_t) + s = util_get_ptrdiff(TRANSFER(p1, 0_c_size_t), TRANSFER(p2, 0_c_size_t)) + + CALL ASSERT_EQUAL(s , 14 * SIZEOF(array(1, 1))) +END SUBROUTINE TEST_util_get_ptrdiff +END MODULE test_mo_util_stride