⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fpilog.f

📁 fortran并行计算包
💻 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 + -