task2.f90 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. integer :: err
  2. err = 0
  3. !$omp parallel num_threads (4) default (none) shared (err)
  4. !$omp single
  5. call test
  6. !$omp end single
  7. !$omp end parallel
  8. if (err.ne.0) call abort
  9. contains
  10. subroutine check (x, y, l)
  11. integer :: x, y
  12. logical :: l
  13. l = l .or. x .ne. y
  14. end subroutine check
  15. subroutine foo (c, d, e, f, g, h, i, j, k, n)
  16. use omp_lib
  17. integer :: n
  18. character (len = *) :: c
  19. character (len = n) :: d
  20. integer, dimension (2, 3:5, n) :: e
  21. integer, dimension (2, 3:n, n) :: f
  22. character (len = *), dimension (5, 3:n) :: g
  23. character (len = n), dimension (5, 3:n) :: h
  24. real, dimension (:, :, :) :: i
  25. double precision, dimension (3:, 5:, 7:) :: j
  26. integer, dimension (:, :, :) :: k
  27. logical :: l
  28. integer :: p, q, r
  29. character (len = n) :: s
  30. integer, dimension (2, 3:5, n) :: t
  31. integer, dimension (2, 3:n, n) :: u
  32. character (len = n), dimension (5, 3:n) :: v
  33. character (len = 2 * n + 24) :: w
  34. integer :: x, z
  35. character (len = 1) :: y
  36. s = 'PQRSTUV'
  37. forall (p = 1:2, q = 3:5, r = 1:7) t(p, q, r) = -10 + p - q + 2 * r
  38. forall (p = 1:2, q = 3:7, r = 1:7) u(p, q, r) = 30 - p + q - 2 * r
  39. forall (p = 1:5, q = 3:7, p + q .le. 8) v(p, q) = '_+|/Oo_'
  40. forall (p = 1:5, q = 3:7, p + q .gt. 8) v(p, q) = '///|||!'
  41. !$omp task default (none) firstprivate (c, d, e, f, g, h, i, j, k) &
  42. !$omp & firstprivate (s, t, u, v) private (l, p, q, r, w, x, y) shared (err)
  43. l = .false.
  44. l = l .or. c .ne. 'abcdefghijkl'
  45. l = l .or. d .ne. 'ABCDEFG'
  46. l = l .or. s .ne. 'PQRSTUV'
  47. do 100, p = 1, 2
  48. do 100, q = 3, 7
  49. do 100, r = 1, 7
  50. if (q .lt. 6) l = l .or. e(p, q, r) .ne. 5 + p + q + 2 * r
  51. l = l .or. f(p, q, r) .ne. 25 + p + q + 2 * r
  52. if (r .lt. 6 .and. q + r .le. 8) l = l .or. g(r, q) .ne. '0123456789AB'
  53. if (r .lt. 6 .and. q + r .gt. 8) l = l .or. g(r, q) .ne. '9876543210ZY'
  54. if (r .lt. 6 .and. q + r .le. 8) l = l .or. h(r, q) .ne. '0123456'
  55. if (r .lt. 6 .and. q + r .gt. 8) l = l .or. h(r, q) .ne. '9876543'
  56. if (q .lt. 6) l = l .or. t(p, q, r) .ne. -10 + p - q + 2 * r
  57. l = l .or. u(p, q, r) .ne. 30 - p + q - 2 * r
  58. if (r .lt. 6 .and. q + r .le. 8) l = l .or. v(r, q) .ne. '_+|/Oo_'
  59. if (r .lt. 6 .and. q + r .gt. 8) l = l .or. v(r, q) .ne. '///|||!'
  60. 100 continue
  61. do 101, p = 3, 5
  62. do 101, q = 2, 6
  63. do 101, r = 1, 7
  64. l = l .or. i(p - 2, q - 1, r) .ne. 7.5 * p * q * r
  65. l = l .or. j(p, q + 3, r + 6) .ne. 9.5 * p * q * r
  66. 101 continue
  67. do 102, p = 1, 5
  68. do 102, q = 4, 6
  69. l = l .or. k(p, 1, q - 3) .ne. 19 + p + 7 + 3 * q
  70. 102 continue
  71. call check (size (e, 1), 2, l)
  72. call check (size (e, 2), 3, l)
  73. call check (size (e, 3), 7, l)
  74. call check (size (e), 42, l)
  75. call check (size (f, 1), 2, l)
  76. call check (size (f, 2), 5, l)
  77. call check (size (f, 3), 7, l)
  78. call check (size (f), 70, l)
  79. call check (size (g, 1), 5, l)
  80. call check (size (g, 2), 5, l)
  81. call check (size (g), 25, l)
  82. call check (size (h, 1), 5, l)
  83. call check (size (h, 2), 5, l)
  84. call check (size (h), 25, l)
  85. call check (size (i, 1), 3, l)
  86. call check (size (i, 2), 5, l)
  87. call check (size (i, 3), 7, l)
  88. call check (size (i), 105, l)
  89. call check (size (j, 1), 4, l)
  90. call check (size (j, 2), 5, l)
  91. call check (size (j, 3), 7, l)
  92. call check (size (j), 140, l)
  93. call check (size (k, 1), 5, l)
  94. call check (size (k, 2), 1, l)
  95. call check (size (k, 3), 3, l)
  96. call check (size (k), 15, l)
  97. if (l) then
  98. !$omp atomic
  99. err = err + 1
  100. end if
  101. !$omp end task
  102. c = ''
  103. d = ''
  104. e(:, :, :) = 199
  105. f(:, :, :) = 198
  106. g(:, :) = ''
  107. h(:, :) = ''
  108. i(:, :, :) = 7.0
  109. j(:, :, :) = 8.0
  110. k(:, :, :) = 9
  111. s = ''
  112. t(:, :, :) = 10
  113. u(:, :, :) = 11
  114. v(:, :) = ''
  115. end subroutine foo
  116. subroutine test
  117. character (len = 12) :: c
  118. character (len = 7) :: d
  119. integer, dimension (2, 3:5, 7) :: e
  120. integer, dimension (2, 3:7, 7) :: f
  121. character (len = 12), dimension (5, 3:7) :: g
  122. character (len = 7), dimension (5, 3:7) :: h
  123. real, dimension (3:5, 2:6, 1:7) :: i
  124. double precision, dimension (3:6, 2:6, 1:7) :: j
  125. integer, dimension (1:5, 7:7, 4:6) :: k
  126. integer :: p, q, r
  127. c = 'abcdefghijkl'
  128. d = 'ABCDEFG'
  129. forall (p = 1:2, q = 3:5, r = 1:7) e(p, q, r) = 5 + p + q + 2 * r
  130. forall (p = 1:2, q = 3:7, r = 1:7) f(p, q, r) = 25 + p + q + 2 * r
  131. forall (p = 1:5, q = 3:7, p + q .le. 8) g(p, q) = '0123456789AB'
  132. forall (p = 1:5, q = 3:7, p + q .gt. 8) g(p, q) = '9876543210ZY'
  133. forall (p = 1:5, q = 3:7, p + q .le. 8) h(p, q) = '0123456'
  134. forall (p = 1:5, q = 3:7, p + q .gt. 8) h(p, q) = '9876543'
  135. forall (p = 3:5, q = 2:6, r = 1:7) i(p, q, r) = 7.5 * p * q * r
  136. forall (p = 3:6, q = 2:6, r = 1:7) j(p, q, r) = 9.5 * p * q * r
  137. forall (p = 1:5, q = 7:7, r = 4:6) k(p, q, r) = 19 + p + q + 3 * r
  138. call foo (c, d, e, f, g, h, i, j, k, 7)
  139. end subroutine test
  140. end