| module m |
| implicit none (type, external) |
| type t |
| integer, allocatable :: arr(:,:) |
| integer :: var |
| integer, allocatable :: slr |
| end type t |
| |
| contains |
| |
| subroutine check_it (is_present, dummy_alloced, inner_alloc, & |
| scalar, array, a_scalar, a_array, & |
| l_scalar, l_array, la_scalar, la_array, & |
| opt_scalar, opt_array, a_opt_scalar, a_opt_array) |
| type(t), intent(inout) :: & |
| scalar, array(:,:), opt_scalar, opt_array(:,:), a_scalar, a_array(:,:), & |
| a_opt_scalar, a_opt_array(:,:), & |
| l_scalar, l_array(:,:), la_scalar, la_array(:,:) |
| optional :: opt_scalar, opt_array, a_opt_scalar, a_opt_array |
| allocatable :: a_scalar, a_array, a_opt_scalar, a_opt_array, la_scalar, la_array |
| logical, value :: is_present, dummy_alloced, inner_alloc |
| integer :: i, j, k, l |
| |
| ! CHECK VALUE |
| if (scalar%var /= 42) stop 1 |
| if (l_scalar%var /= 42) stop 1 |
| if (is_present) then |
| if (opt_scalar%var /= 42) stop 2 |
| end if |
| if (any (shape(array) /= [3,2])) stop 1 |
| if (any (shape(l_array) /= [3,2])) stop 1 |
| if (is_present) then |
| if (any (shape(opt_array) /= [3,2])) stop 1 |
| end if |
| do j = 1, 2 |
| do i = 1, 3 |
| if (array(i,j)%var /= i*97 + 100*41*j) stop 3 |
| if (l_array(i,j)%var /= i*97 + 100*41*j) stop 3 |
| if (is_present) then |
| if (opt_array(i,j)%var /= i*97 + 100*41*j) stop 4 |
| end if |
| end do |
| end do |
| |
| if (dummy_alloced) then |
| if (a_scalar%var /= 42) stop 1 |
| if (la_scalar%var /= 42) stop 1 |
| if (is_present) then |
| if (a_opt_scalar%var /= 42) stop 1 |
| end if |
| if (any (shape(a_array) /= [3,2])) stop 1 |
| if (any (shape(la_array) /= [3,2])) stop 1 |
| if (is_present) then |
| if (any (shape(a_opt_array) /= [3,2])) stop 1 |
| end if |
| do j = 1, 2 |
| do i = 1, 3 |
| if (a_array(i,j)%var /= i*97 + 100*41*j) stop 1 |
| if (la_array(i,j)%var /= i*97 + 100*41*j) stop 1 |
| if (is_present) then |
| if (a_opt_array(i,j)%var /= i*97 + 100*41*j) stop 1 |
| end if |
| end do |
| end do |
| else |
| if (allocated (a_scalar)) stop 1 |
| if (allocated (la_scalar)) stop 1 |
| if (allocated (a_array)) stop 1 |
| if (allocated (la_array)) stop 1 |
| if (is_present) then |
| if (allocated (a_opt_scalar)) stop 1 |
| if (allocated (a_opt_array)) stop 1 |
| end if |
| end if |
| |
| if (inner_alloc) then |
| if (scalar%slr /= 467) stop 5 |
| if (l_scalar%slr /= 467) stop 5 |
| if (a_scalar%slr /= 467) stop 6 |
| if (la_scalar%slr /= 467) stop 6 |
| if (is_present) then |
| if (opt_scalar%slr /= 467) stop 7 |
| if (a_opt_scalar%slr /= 467) stop 8 |
| end if |
| do j = 1, 2 |
| do i = 1, 3 |
| if (array(i,j)%slr /= (i*97 + 100*41*j) + 467) stop 9 |
| if (l_array(i,j)%slr /= (i*97 + 100*41*j) + 467) stop 9 |
| if (a_array(i,j)%slr /= (i*97 + 100*41*j) + 467) stop 10 |
| if (la_array(i,j)%slr /= (i*97 + 100*41*j) + 467) stop 10 |
| if (is_present) then |
| if (opt_array(i,j)%slr /= (i*97 + 100*41*j) + 467) stop 11 |
| if (a_opt_array(i,j)%slr /= (i*97 + 100*41*j) + 467) stop 12 |
| end if |
| end do |
| end do |
| |
| do l = 1, 5 |
| do k = 1, 4 |
| if (any (shape(scalar%arr) /= [4,5])) stop 1 |
| if (any (shape(l_scalar%arr) /= [4,5])) stop 1 |
| if (any (shape(a_scalar%arr) /= [4,5])) stop 1 |
| if (any (shape(la_scalar%arr) /= [4,5])) stop 1 |
| if (scalar%arr(k,l) /= (i*27 + 1000*11*j) + 467) stop 13 |
| if (l_scalar%arr(k,l) /= (i*27 + 1000*11*j) + 467) stop 13 |
| if (a_scalar%arr(k,l) /= (i*27 + 1000*11*j) + 467) stop 14 |
| if (la_scalar%arr(k,l) /= (i*27 + 1000*11*j) + 467) stop 14 |
| if (is_present) then |
| if (any (shape(opt_scalar%arr) /= [4,5])) stop 1 |
| if (any (shape(a_opt_scalar%arr) /= [4,5])) stop 1 |
| if (opt_scalar%arr(k,l) /= (i*27 + 1000*11*j) + 467) stop 15 |
| if (a_opt_scalar%arr(k,l) /= (i*27 + 1000*11*j) + 467) stop 16 |
| end if |
| end do |
| end do |
| do j = 1, 2 |
| do i = 1, 3 |
| if (any (shape(array(i,j)%arr) /= [i,j])) stop 1 |
| if (any (shape(l_array(i,j)%arr) /= [i,j])) stop 1 |
| if (any (shape(a_array(i,j)%arr) /= [i,j])) stop 1 |
| if (any (shape(la_array(i,j)%arr) /= [i,j])) stop 1 |
| if (is_present) then |
| if (any (shape(opt_array(i,j)%arr) /= [i,j])) stop 1 |
| if (any (shape(a_opt_array(i,j)%arr) /= [i,j])) stop 1 |
| endif |
| do l = 1, j |
| do k = 1, i |
| if (array(i,j)%arr(k,l) /= i*27 + 1000*11*j + 467 + 3*k +53*l) stop 17 |
| if (l_array(i,j)%arr(k,l) /= i*27 + 1000*11*j + 467 + 3*k +53*l) stop 17 |
| if (a_array(i,j)%arr(k,l) /= i*27 + 1000*11*j + 467 + 3*k +53*l) stop 18 |
| if (la_array(i,j)%arr(k,l) /= i*27 + 1000*11*j + 467 + 3*k +53*l) stop 18 |
| if (is_present) then |
| if (opt_array(i,j)%arr(k,l) /= i*27 + 1000*11*j + 467 + 3*k +53*l) stop 19 |
| if (a_opt_array(i,j)%arr(k,l) /= i*27 + 1000*11*j + 467 + 3*k +53*l) stop 20 |
| end if |
| end do |
| end do |
| end do |
| end do |
| else if (dummy_alloced) then |
| if (allocated (scalar%slr)) stop 1 |
| if (allocated (l_scalar%slr)) stop 1 |
| if (allocated (a_scalar%slr)) stop 1 |
| if (allocated (la_scalar%slr)) stop 1 |
| if (is_present) then |
| if (allocated (opt_scalar%slr)) stop 1 |
| if (allocated (a_opt_scalar%slr)) stop 1 |
| endif |
| if (allocated (scalar%arr)) stop 1 |
| if (allocated (l_scalar%arr)) stop 1 |
| if (allocated (a_scalar%arr)) stop 1 |
| if (allocated (la_scalar%arr)) stop 1 |
| if (is_present) then |
| if (allocated (opt_scalar%arr)) stop 1 |
| if (allocated (a_opt_scalar%arr)) stop 1 |
| endif |
| end if |
| |
| ! SET VALUE |
| scalar%var = 42 + 13 |
| l_scalar%var = 42 + 13 |
| if (is_present) then |
| opt_scalar%var = 42 + 13 |
| endif |
| do j = 1, 2 |
| do i = 1, 3 |
| array(i,j)%var = i*97 + 100*41*j + 13 |
| l_array(i,j)%var = i*97 + 100*41*j + 13 |
| if (is_present) then |
| opt_array(i,j)%var = i*97 + 100*41*j + 13 |
| end if |
| end do |
| end do |
| |
| if (dummy_alloced) then |
| a_scalar%var = 42 + 13 |
| la_scalar%var = 42 + 13 |
| if (is_present) then |
| a_opt_scalar%var = 42 + 13 |
| endif |
| do j = 1, 2 |
| do i = 1, 3 |
| a_array(i,j)%var = i*97 + 100*41*j + 13 |
| la_array(i,j)%var = i*97 + 100*41*j + 13 |
| if (is_present) then |
| a_opt_array(i,j)%var = i*97 + 100*41*j + 13 |
| endif |
| end do |
| end do |
| end if |
| |
| if (inner_alloc) then |
| scalar%slr = 467 + 13 |
| l_scalar%slr = 467 + 13 |
| a_scalar%slr = 467 + 13 |
| la_scalar%slr = 467 + 13 |
| if (is_present) then |
| opt_scalar%slr = 467 + 13 |
| a_opt_scalar%slr = 467 + 13 |
| end if |
| do j = 1, 2 |
| do i = 1, 3 |
| array(i,j)%slr = (i*97 + 100*41*j) + 467 + 13 |
| l_array(i,j)%slr = (i*97 + 100*41*j) + 467 + 13 |
| a_array(i,j)%slr = (i*97 + 100*41*j) + 467 + 13 |
| la_array(i,j)%slr = (i*97 + 100*41*j) + 467 + 13 |
| if (is_present) then |
| opt_array(i,j)%slr = (i*97 + 100*41*j) + 467 + 13 |
| a_opt_array(i,j)%slr = (i*97 + 100*41*j) + 467 + 13 |
| end if |
| end do |
| end do |
| |
| do l = 1, 5 |
| do k = 1, 4 |
| scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 + 13 |
| l_scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 + 13 |
| a_scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 + 13 |
| la_scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 + 13 |
| if (is_present) then |
| opt_scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 + 13 |
| a_opt_scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 + 13 |
| end if |
| end do |
| end do |
| do j = 1, 2 |
| do i = 1, 3 |
| do l = 1, j |
| do k = 1, i |
| array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l + 13 |
| l_array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l + 13 |
| a_array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l + 13 |
| la_array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l + 13 |
| if (is_present) then |
| opt_array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l + 13 |
| a_opt_array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l + 13 |
| end if |
| end do |
| end do |
| end do |
| end do |
| end if |
| |
| end subroutine |
| subroutine check_reset (is_present, dummy_alloced, inner_alloc, & |
| scalar, array, a_scalar, a_array, & |
| l_scalar, l_array, la_scalar, la_array, & |
| opt_scalar, opt_array, a_opt_scalar, a_opt_array) |
| type(t), intent(inout) :: & |
| scalar, array(:,:), opt_scalar, opt_array(:,:), a_scalar, a_array(:,:), & |
| a_opt_scalar, a_opt_array(:,:), & |
| l_scalar, l_array(:,:), la_scalar, la_array(:,:) |
| optional :: opt_scalar, opt_array, a_opt_scalar, a_opt_array |
| allocatable :: a_scalar, a_array, a_opt_scalar, a_opt_array, la_scalar, la_array |
| logical, value :: is_present, dummy_alloced, inner_alloc |
| integer :: i, j, k, l |
| |
| ! CHECK VALUE |
| if (scalar%var /= 42 + 13) stop 1 |
| if (l_scalar%var /= 42 + 13) stop 1 |
| if (is_present) then |
| if (opt_scalar%var /= 42 + 13) stop 2 |
| end if |
| if (any (shape(array) /= [3,2])) stop 1 |
| if (any (shape(l_array) /= [3,2])) stop 1 |
| if (is_present) then |
| if (any (shape(opt_array) /= [3,2])) stop 1 |
| end if |
| do j = 1, 2 |
| do i = 1, 3 |
| if (array(i,j)%var /= i*97 + 100*41*j + 13) stop 3 |
| if (l_array(i,j)%var /= i*97 + 100*41*j + 13) stop 3 |
| if (is_present) then |
| if (opt_array(i,j)%var /= i*97 + 100*41*j + 13) stop 4 |
| end if |
| end do |
| end do |
| |
| if (dummy_alloced) then |
| if (a_scalar%var /= 42 + 13) stop 1 |
| if (la_scalar%var /= 42 + 13) stop 1 |
| if (is_present) then |
| if (a_opt_scalar%var /= 42 + 13) stop 1 |
| end if |
| if (any (shape(a_array) /= [3,2])) stop 1 |
| if (any (shape(la_array) /= [3,2])) stop 1 |
| if (is_present) then |
| if (any (shape(a_opt_array) /= [3,2])) stop 1 |
| end if |
| do j = 1, 2 |
| do i = 1, 3 |
| if (a_array(i,j)%var /= i*97 + 100*41*j + 13) stop 1 |
| if (la_array(i,j)%var /= i*97 + 100*41*j + 13) stop 1 |
| if (is_present) then |
| if (a_opt_array(i,j)%var /= i*97 + 100*41*j + 13) stop 1 |
| end if |
| end do |
| end do |
| else |
| if (allocated (a_scalar)) stop 1 |
| if (allocated (la_scalar)) stop 1 |
| if (allocated (a_array)) stop 1 |
| if (allocated (la_array)) stop 1 |
| if (is_present) then |
| if (allocated (a_opt_scalar)) stop 1 |
| if (allocated (a_opt_array)) stop 1 |
| end if |
| end if |
| |
| if (inner_alloc) then |
| if (scalar%slr /= 467 + 13) stop 5 |
| if (l_scalar%slr /= 467 + 13) stop 5 |
| if (a_scalar%slr /= 467 + 13) stop 6 |
| if (la_scalar%slr /= 467 + 13) stop 6 |
| if (is_present) then |
| if (opt_scalar%slr /= 467 + 13) stop 7 |
| if (a_opt_scalar%slr /= 467 + 13) stop 8 |
| end if |
| do j = 1, 2 |
| do i = 1, 3 |
| if (array(i,j)%slr /= (i*97 + 100*41*j) + 467 + 13) stop 9 |
| if (l_array(i,j)%slr /= (i*97 + 100*41*j) + 467 + 13) stop 9 |
| if (a_array(i,j)%slr /= (i*97 + 100*41*j) + 467 + 13) stop 10 |
| if (la_array(i,j)%slr /= (i*97 + 100*41*j) + 467 + 13) stop 10 |
| if (is_present) then |
| if (opt_array(i,j)%slr /= (i*97 + 100*41*j) + 467 + 13) stop 11 |
| if (a_opt_array(i,j)%slr /= (i*97 + 100*41*j) + 467 + 13) stop 12 |
| end if |
| end do |
| end do |
| |
| do l = 1, 5 |
| do k = 1, 4 |
| if (any (shape(scalar%arr) /= [4,5])) stop 1 |
| if (any (shape(l_scalar%arr) /= [4,5])) stop 1 |
| if (any (shape(a_scalar%arr) /= [4,5])) stop 1 |
| if (any (shape(la_scalar%arr) /= [4,5])) stop 1 |
| if (scalar%arr(k,l) /= (i*27 + 1000*11*j) + 467 + 13) stop 13 |
| if (l_scalar%arr(k,l) /= (i*27 + 1000*11*j) + 467 + 13) stop 13 |
| if (a_scalar%arr(k,l) /= (i*27 + 1000*11*j) + 467 + 13) stop 14 |
| if (la_scalar%arr(k,l) /= (i*27 + 1000*11*j) + 467 + 13) stop 14 |
| if (is_present) then |
| if (any (shape(opt_scalar%arr) /= [4,5])) stop 1 |
| if (any (shape(a_opt_scalar%arr) /= [4,5])) stop 1 |
| if (opt_scalar%arr(k,l) /= (i*27 + 1000*11*j) + 467 + 13) stop 15 |
| if (a_opt_scalar%arr(k,l) /= (i*27 + 1000*11*j) + 467 + 13) stop 16 |
| end if |
| end do |
| end do |
| do j = 1, 2 |
| do i = 1, 3 |
| if (any (shape(array(i,j)%arr) /= [i,j])) stop 1 |
| if (any (shape(l_array(i,j)%arr) /= [i,j])) stop 1 |
| if (any (shape(a_array(i,j)%arr) /= [i,j])) stop 1 |
| if (any (shape(la_array(i,j)%arr) /= [i,j])) stop 1 |
| if (is_present) then |
| if (any (shape(opt_array(i,j)%arr) /= [i,j])) stop 1 |
| if (any (shape(a_opt_array(i,j)%arr) /= [i,j])) stop 1 |
| endif |
| do l = 1, j |
| do k = 1, i |
| if (array(i,j)%arr(k,l) /= i*27 + 1000*11*j + 467 + 3*k +53*l + 13) stop 17 |
| if (l_array(i,j)%arr(k,l) /= i*27 + 1000*11*j + 467 + 3*k +53*l + 13) stop 17 |
| if (a_array(i,j)%arr(k,l) /= i*27 + 1000*11*j + 467 + 3*k +53*l + 13) stop 18 |
| if (la_array(i,j)%arr(k,l) /= i*27 + 1000*11*j + 467 + 3*k +53*l + 13) stop 18 |
| if (is_present) then |
| if (opt_array(i,j)%arr(k,l) /= i*27 + 1000*11*j + 467 + 3*k +53*l + 13) stop 19 |
| if (a_opt_array(i,j)%arr(k,l) /= i*27 + 1000*11*j + 467 + 3*k +53*l + 13) stop 20 |
| end if |
| end do |
| end do |
| end do |
| end do |
| else if (dummy_alloced) then |
| if (allocated (scalar%slr)) stop 1 |
| if (allocated (l_scalar%slr)) stop 1 |
| if (allocated (a_scalar%slr)) stop 1 |
| if (allocated (la_scalar%slr)) stop 1 |
| if (is_present) then |
| if (allocated (opt_scalar%slr)) stop 1 |
| if (allocated (a_opt_scalar%slr)) stop 1 |
| endif |
| if (allocated (scalar%arr)) stop 1 |
| if (allocated (l_scalar%arr)) stop 1 |
| if (allocated (a_scalar%arr)) stop 1 |
| if (allocated (la_scalar%arr)) stop 1 |
| if (is_present) then |
| if (allocated (opt_scalar%arr)) stop 1 |
| if (allocated (a_opt_scalar%arr)) stop 1 |
| endif |
| end if |
| |
| ! (RE)SET VALUE |
| scalar%var = 42 |
| l_scalar%var = 42 |
| if (is_present) then |
| opt_scalar%var = 42 |
| endif |
| do j = 1, 2 |
| do i = 1, 3 |
| array(i,j)%var = i*97 + 100*41*j |
| l_array(i,j)%var = i*97 + 100*41*j |
| if (is_present) then |
| opt_array(i,j)%var = i*97 + 100*41*j |
| end if |
| end do |
| end do |
| |
| if (dummy_alloced) then |
| a_scalar%var = 42 |
| la_scalar%var = 42 |
| if (is_present) then |
| a_opt_scalar%var = 42 |
| endif |
| do j = 1, 2 |
| do i = 1, 3 |
| a_array(i,j)%var = i*97 + 100*41*j |
| la_array(i,j)%var = i*97 + 100*41*j |
| if (is_present) then |
| a_opt_array(i,j)%var = i*97 + 100*41*j |
| endif |
| end do |
| end do |
| end if |
| |
| if (inner_alloc) then |
| scalar%slr = 467 |
| l_scalar%slr = 467 |
| a_scalar%slr = 467 |
| la_scalar%slr = 467 |
| if (is_present) then |
| opt_scalar%slr = 467 |
| a_opt_scalar%slr = 467 |
| end if |
| do j = 1, 2 |
| do i = 1, 3 |
| array(i,j)%slr = (i*97 + 100*41*j) + 467 |
| l_array(i,j)%slr = (i*97 + 100*41*j) + 467 |
| a_array(i,j)%slr = (i*97 + 100*41*j) + 467 |
| la_array(i,j)%slr = (i*97 + 100*41*j) + 467 |
| if (is_present) then |
| opt_array(i,j)%slr = (i*97 + 100*41*j) + 467 |
| a_opt_array(i,j)%slr = (i*97 + 100*41*j) + 467 |
| end if |
| end do |
| end do |
| |
| do l = 1, 5 |
| do k = 1, 4 |
| scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 |
| l_scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 |
| a_scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 |
| la_scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 |
| if (is_present) then |
| opt_scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 |
| a_opt_scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 |
| end if |
| end do |
| end do |
| do j = 1, 2 |
| do i = 1, 3 |
| do l = 1, j |
| do k = 1, i |
| array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l |
| l_array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l |
| a_array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l |
| la_array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l |
| if (is_present) then |
| opt_array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l |
| a_opt_array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l |
| end if |
| end do |
| end do |
| end do |
| end do |
| end if |
| end subroutine |
| |
| subroutine test(scalar, array, a_scalar, a_array, opt_scalar, opt_array, & |
| a_opt_scalar, a_opt_array) |
| type(t) :: scalar, array(:,:), opt_scalar, opt_array(:,:), a_scalar, a_array(:,:) |
| type(t) :: a_opt_scalar, a_opt_array(:,:) |
| type(t) :: l_scalar, l_array(3,2), la_scalar, la_array(:,:) |
| allocatable :: a_scalar, a_array, a_opt_scalar, a_opt_array, la_scalar, la_array |
| optional :: opt_scalar, opt_array, a_opt_scalar, a_opt_array |
| |
| integer :: i, j, k, l |
| logical :: is_present, dummy_alloced, local_alloced, inner_alloc |
| is_present = present(opt_scalar) |
| dummy_alloced = allocated(a_scalar) |
| inner_alloc = allocated(scalar%slr) |
| |
| l_scalar%var = 42 |
| do j = 1, 2 |
| do i = 1, 3 |
| l_array(i,j)%var = i*97 + 100*41*j |
| end do |
| end do |
| |
| if (dummy_alloced) then |
| allocate(la_scalar, la_array(3,2)) |
| a_scalar%var = 42 |
| la_scalar%var = 42 |
| do j = 1, 2 |
| do i = 1, 3 |
| l_array(i,j)%var = i*97 + 100*41*j |
| la_array(i,j)%var = i*97 + 100*41*j |
| end do |
| end do |
| end if |
| |
| if (inner_alloc) then |
| l_scalar%slr = 467 |
| la_scalar%slr = 467 |
| do j = 1, 2 |
| do i = 1, 3 |
| l_array(i,j)%slr = (i*97 + 100*41*j) + 467 |
| la_array(i,j)%slr = (i*97 + 100*41*j) + 467 |
| end do |
| end do |
| |
| allocate(l_scalar%arr(4,5), la_scalar%arr(4,5)) |
| do l = 1, 5 |
| do k = 1, 4 |
| l_scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 |
| la_scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 |
| end do |
| end do |
| do j = 1, 2 |
| do i = 1, 3 |
| allocate(l_array(i,j)%arr(i,j), la_array(i,j)%arr(i,j)) |
| do l = 1, j |
| do k = 1, i |
| l_array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l |
| la_array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l |
| end do |
| end do |
| end do |
| end do |
| end if |
| |
| ! implicit mapping |
| !$omp target |
| if (is_present) then |
| call check_it (is_present, dummy_alloced, inner_alloc, & |
| scalar, array, a_scalar, a_array, & |
| l_scalar, l_array, la_scalar, la_array, & |
| opt_scalar, opt_array, a_opt_scalar, a_opt_array) |
| else |
| call check_it (is_present, dummy_alloced, inner_alloc, & |
| scalar, array, a_scalar, a_array, & |
| l_scalar, l_array, la_scalar, la_array) |
| end if |
| !$omp end target |
| |
| if (is_present) then |
| call check_reset (is_present, dummy_alloced, inner_alloc, & |
| scalar, array, a_scalar, a_array, & |
| l_scalar, l_array, la_scalar, la_array, & |
| opt_scalar, opt_array, a_opt_scalar, a_opt_array) |
| else |
| call check_reset (is_present, dummy_alloced, inner_alloc, & |
| scalar, array, a_scalar, a_array, & |
| l_scalar, l_array, la_scalar, la_array) |
| endif |
| |
| ! explicit mapping |
| !$omp target map(scalar, array, opt_scalar, opt_array, a_scalar, a_array) & |
| !$omp& map(a_opt_scalar, a_opt_array) & |
| !$omp& map(l_scalar, l_array, la_scalar, la_array) |
| if (is_present) then |
| call check_it (is_present, dummy_alloced, inner_alloc, & |
| scalar, array, a_scalar, a_array, & |
| l_scalar, l_array, la_scalar, la_array, & |
| opt_scalar, opt_array, a_opt_scalar, a_opt_array) |
| else |
| call check_it (is_present, dummy_alloced, inner_alloc, & |
| scalar, array, a_scalar, a_array, & |
| l_scalar, l_array, la_scalar, la_array) |
| endif |
| !$omp end target |
| |
| if (is_present) then |
| call check_reset (is_present, dummy_alloced, inner_alloc, & |
| scalar, array, a_scalar, a_array, & |
| l_scalar, l_array, la_scalar, la_array, & |
| opt_scalar, opt_array, a_opt_scalar, a_opt_array) |
| else |
| call check_reset (is_present, dummy_alloced, inner_alloc, & |
| scalar, array, a_scalar, a_array, & |
| l_scalar, l_array, la_scalar, la_array) |
| endif |
| end subroutine |
| end module |
| |
| program main |
| use m |
| implicit none (type, external) |
| type(t) :: scalar, array(3,2), opt_scalar, opt_array(3,2), a_scalar, a_array(:,:) |
| type(t) :: a_opt_scalar, a_opt_array(:,:) |
| allocatable :: a_scalar, a_array, a_opt_scalar, a_opt_array |
| integer :: i, j, k, l, n |
| |
| scalar%var = 42 |
| opt_scalar%var = 42 |
| do j = 1, 2 |
| do i = 1, 3 |
| array(i,j)%var = i*97 + 100*41*j |
| opt_array(i,j)%var = i*97 + 100*41*j |
| end do |
| end do |
| |
| ! unallocated |
| call test (scalar, array, a_scalar, a_array) |
| call test (scalar, array, a_scalar, a_array, opt_scalar, opt_array, a_opt_scalar, a_opt_array) |
| |
| ! allocated |
| allocate(a_scalar, a_opt_scalar, a_array(3,2), a_opt_array(3,2)) |
| a_scalar%var = 42 |
| a_opt_scalar%var = 42 |
| do j = 1, 2 |
| do i = 1, 3 |
| a_array(i,j)%var = i*97 + 100*41*j |
| a_opt_array(i,j)%var = i*97 + 100*41*j |
| end do |
| end do |
| |
| call test (scalar, array, a_scalar, a_array) |
| call test (scalar, array, a_scalar, a_array, opt_scalar, opt_array, a_opt_scalar, a_opt_array) |
| |
| ! comps allocated |
| scalar%slr = 467 |
| a_scalar%slr = 467 |
| opt_scalar%slr = 467 |
| a_opt_scalar%slr = 467 |
| do j = 1, 2 |
| do i = 1, 3 |
| array(i,j)%slr = (i*97 + 100*41*j) + 467 |
| a_array(i,j)%slr = (i*97 + 100*41*j) + 467 |
| opt_array(i,j)%slr = (i*97 + 100*41*j) + 467 |
| a_opt_array(i,j)%slr = (i*97 + 100*41*j) + 467 |
| end do |
| end do |
| |
| allocate(scalar%arr(4,5), a_scalar%arr(4,5), opt_scalar%arr(4,5), a_opt_scalar%arr(4,5)) |
| do l = 1, 5 |
| do k = 1, 4 |
| scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 |
| a_scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 |
| opt_scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 |
| a_opt_scalar%arr(k,l) = (i*27 + 1000*11*j) + 467 |
| end do |
| end do |
| do j = 1, 2 |
| do i = 1, 3 |
| allocate(array(i,j)%arr(i,j), a_array(i,j)%arr(i,j), opt_array(i,j)%arr(i,j), a_opt_array(i,j)%arr(i,j)) |
| do l = 1, j |
| do k = 1, i |
| array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l |
| a_array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l |
| opt_array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l |
| a_opt_array(i,j)%arr(k,l) = i*27 + 1000*11*j + 467 + 3*k +53*l |
| end do |
| end do |
| end do |
| end do |
| |
| call test (scalar, array, a_scalar, a_array) |
| call test (scalar, array, a_scalar, a_array, opt_scalar, opt_array, a_opt_scalar, a_opt_array) |
| |
| deallocate(a_scalar, a_opt_scalar, a_array, a_opt_array) |
| end |