5 subroutine init (v1
, v2
, N
)
14 subroutine init_again (v1
, v2
, N
)
23 subroutine check (p
, N
)
25 real, parameter :: EPS
= 0.00001
28 diff
= p(i
) - (i
* i
+ (i
+ 2.0) * (i
- 3.0))
29 if (diff
> EPS
.or
. -diff
> EPS
) call abort
33 logical function maybe_init_again (v
, N
)
39 maybe_init_again
= .true
.
42 subroutine vec_mult (p
, v1
, v2
, N
)
43 real :: p(N
), v1(N
), v2(N
)
47 !$omp target data map(to: v1, v2) map(from: p)
54 changed
= maybe_init_again (v1
, N
)
55 !$omp target update if(changed) to(v1(:N))
56 changed
= maybe_init_again (v2
, N
)
57 !$omp target update if(changed) to(v2(:N))
61 p(i
) = p(i
) + v1(i
) * v2(i
)
70 use e_52_2_mod
, only
: vec_mult
72 real, pointer :: p(:), v1(:), v2(:)
74 allocate (p(n
), v1(n
), v2(n
))
75 call vec_mult (p
, v1
, v2
, n
)
76 deallocate (p
, v1
, v2
)