1! { dg-do run }
2
3module e_51_2_mod
4contains
5  subroutine init (v1, v2, N)
6    integer :: i, N
7    real :: v1(N), v2(N)
8    do i = 1, N
9      v1(i) = i + 2.0
10      v2(i) = i - 3.0
11    end do
12  end subroutine
13
14  subroutine init_again (v1, v2, N)
15    integer :: i, N
16    real :: v1(N), v2(N)
17    do i = 1, N
18      v1(i) = i - 3.0
19      v2(i) = i + 2.0
20    end do
21  end subroutine
22
23  subroutine check (p, N)
24    integer :: i, N
25    real, parameter :: EPS = 0.00001
26    real :: diff, p(N)
27    do i = 1, N
28      diff = p(i) - 2 * (i + 2.0) * (i - 3.0)
29      if (diff > EPS .or. -diff > EPS) call abort
30    end do
31  end subroutine
32
33  subroutine vec_mult (N)
34    real :: p(N), v1(N), v2(N)
35    integer :: i, N
36    call init (v1, v2, N)
37    !$omp target data map(from: p)
38      !$omp target map(to: v1, v2 )
39        !$omp parallel do
40        do i = 1, N
41          p(i) = v1(i) * v2(i)
42        end do
43      !$omp end target
44      call init_again (v1, v2, N)
45      !$omp target map(to: v1, v2 )
46        !$omp parallel do
47        do i = 1, N
48          p(i) = p(i) + v1(i) * v2(i)
49        end do
50      !$omp end target
51    !$omp end target data
52    call check (p, N)
53  end subroutine
54end module
55
56program e_51_2
57  use e_51_2_mod, only : vec_mult
58  integer :: n
59  n = 1000
60  call vec_mult (n)
61end program
62