program main use omp_lib implicit none integer ( kind = 4 ), parameter :: n = 100000 real ( kind = 8 ) a real ( kind = 8 ) b integer ( kind = 4 ) i integer ( kind = 4 ) it real ( kind = 8 ) :: tol = 1.0D-10 real ( kind = 8 ) w(0:n) real ( kind = 8 ) wtime real ( kind = 8 ) x(0:n) write ( *, '(a)' ) ' ' write ( *, '(a,i8)' ) ' Number of processors available = ', omp_get_num_procs ( ) write ( * ,'(a,i8)' ) ' Number of threads = ', omp_get_max_threads ( ) wtime = omp_get_wtime ( ) ! !$omp parallel private ( a, b, i, it ) shared ( tol, w, x ) !$omp do do i = 0, n x(i) = ( ( n - i ) * 1.0 + i * 100.0 ) / n w(i) = x(i) + log ( x(i) ) it = 0 do if ( 100 < it ) then exit end if if ( abs ( ( x(i) - w(i) * exp ( w(i) ) ) ) < & tol * abs ( ( w(i) + 1.0D+00 ) * exp ( w(i) ) ) ) then exit end if a = w(i) * exp ( w(i) ) - x(i) b = ( w(i) + 1.0D+00 ) * exp ( w(i) ) & - ( w(i) + 2.0D+00 ) * ( w(i) * exp ( w(i) ) - x(i) ) & / ( 2.0D+00 * w(i) + 2.0D+00 ) w(i) = w(i) - a / b it = it + 1 end do end do !$omp end do !$omp end parallel wtime = omp_get_wtime ( ) - wtime write ( *, '(g14.6,a)' ) wtime, ' seconds.' return end