integer :: v(16), i do i = 1, 16 v(i) = i end do !$omp parallel num_threads (4) !$omp single !$omp taskgroup do i = 1, 16, 2 !$omp task !$omp task v(i) = v(i) + 1 !$omp end task !$omp task v(i + 1) = v(i + 1) + 1 !$omp end task !$omp end task end do !$omp end taskgroup do i = 1, 16 if (v(i).ne.(i + 1)) call abort end do !$omp taskgroup do i = 1, 16, 2 !$omp task !$omp task v(i) = v(i) + 1 !$omp endtask !$omp task v(i + 1) = v(i + 1) + 1 !$omp endtask !$omp taskwait !$omp endtask end do !$omp endtaskgroup do i = 1, 16 if (v(i).ne.(i + 2)) call abort end do !$omp taskgroup do i = 1, 16, 2 !$omp task !$omp task v(i) = v(i) + 1 !$omp end task v(i + 1) = v(i + 1) + 1 !$omp end task end do !$omp taskwait do i = 1, 16, 2 !$omp task v(i + 1) = v(i + 1) + 1 !$omp end task end do !$omp end taskgroup do i = 1, 16, 2 if (v(i).ne.(i + 3)) call abort if (v(i + 1).ne.(i + 5)) call abort end do !$omp taskgroup do i = 1, 16, 2 !$omp taskgroup !$omp task v(i) = v(i) + 1 !$omp end task !$omp task v(i + 1) = v(i + 1) + 1 !$omp end task !$omp end taskgroup if (v(i).ne.(i + 4).or.v(i + 1).ne.(i + 6)) call abort !$omp task v(i) = v(i) + 1 !$omp end task end do !$omp end taskgroup do i = 1, 16 if (v(i).ne.(i + 5)) call abort end do !$omp end single !$omp end parallel end