📄 fpilog.f
字号:
!! (C) 2001 by Argonne National Laboratory.! See COPYRIGHT in top-level directory.!!**********************************************************************! pi.f - compute pi by integrating f(x) = 4/(1 + x**2) ! ! Each node: ! 1) receives the number of rectangles used in the approximation.! 2) calculates the areas of it's rectangles.! 3) Synchronizes for a global summation.! Node 0 prints the result.!! Variables:!! pi the calculated result! n number of points of integration. ! x midpoint of each rectangle's interval! f function to integrate! sum,pi area of rectangles! tmp temporary scratch space for global summation! i do loop index!**************************************************************************** double precision function f( a ) implicit none double precision a f = 4.d0 / (1.d0 + a*a) return end!!! program main implicit none include 'mpif.h' include 'mpe_logf.h' double precision PI25DT parameter (PI25DT = 3.141592653589793238462643d0) double precision mypi, pi, h, sum, x integer n, myid, numprocs, ii, idx double precision f external f integer event1a, event1b, event2a, event2b integer event3a, event3b, event4a, event4b integer ierr call MPI_Init( ierr ) call MPI_Comm_rank( MPI_COMM_WORLD, myid, ierr ) call MPI_Comm_size( MPI_COMM_WORLD, numprocs, ierr ) write(6,*) "Process ", myid, " of ", numprocs, " is alive"! Demonstrate the use of MPE_Log_state_eventIDs() and MPE_Log_solo_eventID()! which replace the deprecated function MPE_Log_get_event_number. ! ierr = MPE_Log_get_state_eventIDs( event1a, event1b ) ierr = MPE_Log_get_state_eventIDs( event2a, event2b ) ierr = MPE_Log_get_solo_eventID( event3a ) ierr = MPE_Log_get_solo_eventID( event3b ) ierr = MPE_Log_get_state_eventIDs( event4a, event4b )! Demonstrate the use MPE_Describe_event() to describe single-timestamped! drawable, i.e. event. Caution: One can use MPE_Describe_state() instead! of 2 MPE_Dresribe_event() calls. The difference is that one will see! one state instead of 2 events. if ( myid .eq. 0 ) then ierr = MPE_Describe_state( event1a, event1b, & "User_Broadcast", "red" ) ierr = MPE_Describe_state( event2a, event2b, & "User_Barrier", "blue" ) ierr = MPE_Describe_event( event3a, "User_Compute_Start", & "orange" ) ierr = MPE_Describe_event( event3b, "User_Compute_Final", & "orange" ) ierr = MPE_Describe_state( event4a, event4b, & "User_Reduce", "green" ) write(6,*) "event IDs are ", event1a, event1b, ", ", & event2a, event2b, ", ", & event3a, event3b, ", ", & event4a, event4b endif if ( myid .eq. 0 ) then! write(6,98)! 98 format('Enter the number of intervals: (0 quits)')! read(5,99) n! 99 format(i10) n = 1000000 write(6,*) 'The number of intervals =', n! check for quit signal! if ( n .le. 0 ) goto 30 endif call MPI_Barrier( MPI_COMM_WORLD, ierr ) do idx = 1, 5 ierr = MPE_Log_event( event1a, 0, '' ) call MPI_Bcast( n, 1, MPI_INTEGER, 0, MPI_COMM_WORLD, ierr ) ierr = MPE_Log_event( event1b, 0, '' ) call MPI_Pcontrol( 0, ierr ) ierr = MPE_Log_event( event2a, 0, '' ) call MPI_Barrier( MPI_COMM_WORLD, ierr ) ierr = MPE_Log_event( event2b, 0, '' ) call MPI_Pcontrol( 1, ierr ) ierr = MPE_Log_event( event3a, 0, '' ) h = 1.0d0/n sum = 0.0d0 do ii = myid+1, n, numprocs x = h * (dble(ii) - 0.5d0) sum = sum + f(x) enddo mypi = h * sum ierr = MPE_Log_event( event3b, 0, '' ) ierr = MPE_Log_event( event4a, 0, '' ) pi = 0.0d0 call MPI_Reduce( mypi, pi, 1, MPI_DOUBLE_PRECISION, MPI_SUM, & 0, MPI_COMM_WORLD, ierr ) ierr = MPE_Log_event( event4b, 0, '' ) if ( myid .eq. 0 ) then write(6, 97) pi, abs(pi - PI25DT) 97 format(' pi is approximately: ', F18.16, + ' Error is: ', F18.16) endif enddo! - Only GNU fortran does not flush stdout, so calling flush() is! absolutely needed with GNU compiler to get all stdout messages.! - XLF needs flush_() instead of flush() otherwise needs -qextname=flush! - Pathscale fortran compiler needs -intrinsic=G77{or PGI}.! call flush(6) call MPI_Finalize( ierr ) end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -