xref: /petsc/src/sys/tutorials/ex3f90.F90 (revision d8606c274c09e255c003062beb17b1be973467bc)
12dfe2926SJacob Faibussowitsch!
22dfe2926SJacob Faibussowitsch!
32dfe2926SJacob Faibussowitsch!   Description: Demonstrates how users can augment the PETSc profiling by
42dfe2926SJacob Faibussowitsch!                inserting their own event logging.
52dfe2926SJacob Faibussowitsch!
62dfe2926SJacob Faibussowitsch
72dfe2926SJacob Faibussowitsch      program SchoolDay
82dfe2926SJacob Faibussowitsch#include <petsc/finclude/petscsys.h>
92dfe2926SJacob Faibussowitsch#include <petsc/finclude/petsclog.h>
102dfe2926SJacob Faibussowitsch      use petscmpi  ! or mpi or mpi_f08
112dfe2926SJacob Faibussowitsch      use petscsys
122dfe2926SJacob Faibussowitsch      implicit none
132dfe2926SJacob Faibussowitsch
142dfe2926SJacob Faibussowitsch      ! Settings:
152dfe2926SJacob Faibussowitsch      integer, parameter        :: verbose=0               ! 0: silent, >=1 : increasing amount of debugging output
162dfe2926SJacob Faibussowitsch      integer, parameter        :: msgLen = 30             ! number of reals which is sent with MPI_Isend
172dfe2926SJacob Faibussowitsch      PetscReal, parameter      :: second=0.1;             ! time is sped up by a factor 10
182dfe2926SJacob Faibussowitsch
192dfe2926SJacob Faibussowitsch      ! Codes
202dfe2926SJacob Faibussowitsch      integer, parameter        :: BOY=1, GIRL=2, TEACHER=0
212dfe2926SJacob Faibussowitsch      PetscMPIInt, parameter    :: tagMsg   = 1200;
222dfe2926SJacob Faibussowitsch
232dfe2926SJacob Faibussowitsch      ! Timers
242dfe2926SJacob Faibussowitsch      PetscLogEvent :: Morning,  Afternoon
252dfe2926SJacob Faibussowitsch      PetscLogEvent :: PlayBall, SkipRope
262dfe2926SJacob Faibussowitsch      PetscLogEvent :: TidyClass
272dfe2926SJacob Faibussowitsch      PetscLogEvent :: Lessons,  CorrectHomework
282dfe2926SJacob Faibussowitsch      PetscClassId classid
292dfe2926SJacob Faibussowitsch
302dfe2926SJacob Faibussowitsch      ! Petsc-stuff
312dfe2926SJacob Faibussowitsch      PetscErrorCode            :: ierr
322dfe2926SJacob Faibussowitsch
332dfe2926SJacob Faibussowitsch      ! MPI-stuff
342dfe2926SJacob Faibussowitsch      PetscMPIInt              :: rank, size
352dfe2926SJacob Faibussowitsch      PetscReal, allocatable    :: message(:,:)
362dfe2926SJacob Faibussowitsch      integer                   :: item, maxItem
372dfe2926SJacob Faibussowitsch      integer4                  :: status(MPI_STATUS_SIZE)
382dfe2926SJacob Faibussowitsch      PetscMPIInt                  req
392dfe2926SJacob Faibussowitsch
402dfe2926SJacob Faibussowitsch      ! Own stuff
412dfe2926SJacob Faibussowitsch      integer4                  :: role                 ! is this process a BOY, a GIRL or a TEACHER?
422dfe2926SJacob Faibussowitsch      integer4                  :: i, j
432dfe2926SJacob Faibussowitsch      integer4,parameter        :: one=1
44f8402805SBarry Smith
452dfe2926SJacob Faibussowitsch!     Initializations
46*d8606c27SBarry Smith      PetscCallA( PetscInitialize(ierr))
47f8402805SBarry Smith      PetscCallMPIA(MPI_Comm_size(PETSC_COMM_WORLD, size,ierr))
48f8402805SBarry Smith      PetscCallMPIA(MPI_Comm_rank(PETSC_COMM_WORLD, rank,ierr))
492dfe2926SJacob Faibussowitsch
502dfe2926SJacob Faibussowitsch      if (rank==0) then
512dfe2926SJacob Faibussowitsch         role = TEACHER
522dfe2926SJacob Faibussowitsch      else if (rank<0.4*size) then
532dfe2926SJacob Faibussowitsch         role = GIRL
542dfe2926SJacob Faibussowitsch      else
552dfe2926SJacob Faibussowitsch         role = BOY
562dfe2926SJacob Faibussowitsch      end if
572dfe2926SJacob Faibussowitsch
582dfe2926SJacob Faibussowitsch      allocate(message(msgLen,msglen))
592dfe2926SJacob Faibussowitsch      do i = 1,msgLen
602dfe2926SJacob Faibussowitsch         do j  = 1,msgLen
612dfe2926SJacob Faibussowitsch            message(i,j) = 10.0*j + i*1.0/(rank+one)
622dfe2926SJacob Faibussowitsch         end do
632dfe2926SJacob Faibussowitsch      end do
642dfe2926SJacob Faibussowitsch!
652dfe2926SJacob Faibussowitsch!     Create new user-defined events
662dfe2926SJacob Faibussowitsch      classid = 0
67f8402805SBarry Smith      PetscCallA(PetscLogEventRegister('Morning',         classid, Morning,   ierr))
68f8402805SBarry Smith      PetscCallA(PetscLogEventRegister('Afternoon',       classid, Afternoon, ierr))
69f8402805SBarry Smith      PetscCallA(PetscLogEventRegister('Play Ball',       classid, PlayBall,  ierr))
70f8402805SBarry Smith      PetscCallA(PetscLogEventRegister('Skip Rope',       classid, SkipRope,  ierr))
71f8402805SBarry Smith      PetscCallA(PetscLogEventRegister('Tidy Classroom',  classid, TidyClass, ierr))
72f8402805SBarry Smith      PetscCallA(PetscLogEventRegister('Lessons',         classid, Lessons,   ierr))
73f8402805SBarry Smith      PetscCallA(PetscLogEventRegister('Correct Homework',classid,CorrectHomework,ierr))
742dfe2926SJacob Faibussowitsch      if (verbose>=1) then
752dfe2926SJacob Faibussowitsch        print '(a,i0,a)','[',rank,'] SchoolDay events have been defined'
762dfe2926SJacob Faibussowitsch      endif
772dfe2926SJacob Faibussowitsch
782dfe2926SJacob Faibussowitsch!     Go through the school day
79f8402805SBarry Smith      PetscCallA(PetscLogEventBegin(Morning,ierr))
802dfe2926SJacob Faibussowitsch
81f8402805SBarry Smith         PetscCallA(PetscLogFlops(190000d0,ierr))
82f8402805SBarry Smith         PetscCallA(PetscSleep(0.5*second,ierr))
832dfe2926SJacob Faibussowitsch
84f8402805SBarry Smith         PetscCallA(PetscLogEventBegin(Lessons,ierr))
85f8402805SBarry Smith         PetscCallA(PetscLogFlops(23000d0,ierr))
86f8402805SBarry Smith         PetscCallA(PetscSleep(1*second, ierr))
872dfe2926SJacob Faibussowitsch         if (size>1) then
88*d8606c27SBarry Smith           PetscCallMPIA(MPI_Isend( message, msgLen, MPI_DOUBLE_PRECISION,mod(rank+1,size),tagMsg+rank, PETSC_COMM_WORLD, req, ierr))
89*d8606c27SBarry Smith           PetscCallMPIA(MPI_Recv( message, msgLen, MPI_DOUBLE_PRECISION,mod(rank-1+size,size),tagMsg+mod(rank-1+size,size), PETSC_COMM_WORLD,status, ierr))
90f8402805SBarry Smith           PetscCallMPIA(MPI_Wait(req,MPI_STATUS_IGNORE,ierr))
912dfe2926SJacob Faibussowitsch         end if
92f8402805SBarry Smith         PetscCallA(PetscLogEventEnd(Lessons,ierr))
932dfe2926SJacob Faibussowitsch
942dfe2926SJacob Faibussowitsch         if (role==TEACHER) then
95f8402805SBarry Smith            PetscCallA(PetscLogEventBegin(TidyClass,ierr))
96f8402805SBarry Smith            PetscCallA(PetscLogFlops(600000d0,ierr))
97f8402805SBarry Smith            PetscCallA(PetscSleep(0.6*second, ierr))
98f8402805SBarry Smith               PetscCallA(PetscLogEventBegin(CorrectHomework,ierr))
99f8402805SBarry Smith               PetscCallA(PetscLogFlops(234700d0,ierr))
100f8402805SBarry Smith               PetscCallA(PetscSleep(0.4*second, ierr))
101f8402805SBarry Smith               PetscCallA(PetscLogEventEnd(CorrectHomework,ierr))
102f8402805SBarry Smith            PetscCallA(PetscLogEventEnd(TidyClass,ierr))
1032dfe2926SJacob Faibussowitsch         else if (role==BOY) then
104f8402805SBarry Smith            PetscCallA(PetscLogEventBegin(SkipRope,ierr))
105f8402805SBarry Smith            PetscCallA(PetscSleep(0.8*second, ierr))
106f8402805SBarry Smith            PetscCallA(PetscLogEventEnd(SkipRope,ierr))
1072dfe2926SJacob Faibussowitsch         else
108f8402805SBarry Smith            PetscCallA(PetscLogEventBegin(PlayBall,ierr))
109f8402805SBarry Smith            PetscCallA(PetscSleep(0.9*second, ierr))
110f8402805SBarry Smith            PetscCallA(PetscLogEventEnd(PlayBall,ierr))
1112dfe2926SJacob Faibussowitsch         end if
1122dfe2926SJacob Faibussowitsch
113f8402805SBarry Smith         PetscCallA(PetscLogEventBegin(Lessons,ierr))
114f8402805SBarry Smith         PetscCallA(PetscLogFlops(120000d0,ierr))
115f8402805SBarry Smith         PetscCallA(PetscSleep(0.7*second, ierr))
116f8402805SBarry Smith         PetscCallA(PetscLogEventEnd(Lessons,ierr))
1172dfe2926SJacob Faibussowitsch
118f8402805SBarry Smith      PetscCallA(PetscLogEventEnd(Morning,ierr))
1192dfe2926SJacob Faibussowitsch
120f8402805SBarry Smith      PetscCallA(PetscLogEventBegin(Afternoon,ierr))
1212dfe2926SJacob Faibussowitsch
1222dfe2926SJacob Faibussowitsch         item = rank*(3-rank)
123f8402805SBarry Smith         PetscCallMPIA(MPI_Allreduce(item, maxItem, 1, MPI_INTEGER, MPI_MAX,PETSC_COMM_WORLD, ierr))
1242dfe2926SJacob Faibussowitsch
1252dfe2926SJacob Faibussowitsch         item = rank*(10-rank)
126f8402805SBarry Smith         PetscCallMPIA(MPI_Allreduce(item, maxItem, 1, MPI_INTEGER, MPI_MAX,PETSC_COMM_WORLD, ierr))
1272dfe2926SJacob Faibussowitsch
128f8402805SBarry Smith         PetscCallA(PetscLogFlops(58988d0,ierr))
129f8402805SBarry Smith         PetscCallA(PetscSleep(0.6*second,ierr))
1302dfe2926SJacob Faibussowitsch
131f8402805SBarry Smith         PetscCallA(PetscLogEventBegin(Lessons,ierr))
132f8402805SBarry Smith         PetscCallA(PetscLogFlops(123456d0,ierr))
133f8402805SBarry Smith         PetscCallA(PetscSleep(1*second, ierr))
134f8402805SBarry Smith         PetscCallA(PetscLogEventEnd(Lessons,ierr))
1352dfe2926SJacob Faibussowitsch
1362dfe2926SJacob Faibussowitsch         if (role==TEACHER) then
137f8402805SBarry Smith            PetscCallA(PetscLogEventBegin(TidyClass,ierr))
138f8402805SBarry Smith            PetscCallA(PetscLogFlops(17800d0,ierr))
139f8402805SBarry Smith            PetscCallA(PetscSleep(1.1*second, ierr))
140f8402805SBarry Smith            PetscCallA(PetscLogEventBegin(Lessons,ierr))
141f8402805SBarry Smith            PetscCallA(PetscLogFlops(72344d0,ierr))
142f8402805SBarry Smith            PetscCallA(PetscSleep(0.5*second, ierr))
143f8402805SBarry Smith            PetscCallA(PetscLogEventEnd(Lessons,ierr))
144f8402805SBarry Smith            PetscCallA(PetscLogEventEnd(TidyClass,ierr))
1452dfe2926SJacob Faibussowitsch         else if (role==GIRL) then
146f8402805SBarry Smith            PetscCallA(PetscLogEventBegin(SkipRope,ierr))
147f8402805SBarry Smith            PetscCallA(PetscSleep(0.7*second, ierr))
148f8402805SBarry Smith            PetscCallA(PetscLogEventEnd(SkipRope,ierr))
1492dfe2926SJacob Faibussowitsch         else
150f8402805SBarry Smith            PetscCallA(PetscLogEventBegin(PlayBall,ierr))
151f8402805SBarry Smith            PetscCallA(PetscSleep(0.8*second, ierr))
152f8402805SBarry Smith            PetscCallA(PetscLogEventEnd(PlayBall,ierr))
1532dfe2926SJacob Faibussowitsch         end if
1542dfe2926SJacob Faibussowitsch
155f8402805SBarry Smith         PetscCallA(PetscLogEventBegin(Lessons,ierr))
156f8402805SBarry Smith         PetscCallA(PetscLogFlops(72344d0,ierr))
157f8402805SBarry Smith         PetscCallA(PetscSleep(0.5*second, ierr))
158f8402805SBarry Smith         PetscCallA(PetscLogEventEnd(Lessons,ierr))
1592dfe2926SJacob Faibussowitsch
160f8402805SBarry Smith      PetscCallA(PetscLogEventEnd(Afternoon,ierr))
1612dfe2926SJacob Faibussowitsch
1622dfe2926SJacob Faibussowitsch      if (.false.) then
1632dfe2926SJacob Faibussowitsch         continue
1642dfe2926SJacob Faibussowitsch      else if (role==TEACHER) then
165f8402805SBarry Smith         PetscCallA(PetscLogEventBegin(TidyClass,ierr))
166f8402805SBarry Smith         PetscCallA(PetscLogFlops(612300d0,ierr))
167f8402805SBarry Smith         PetscCallA(PetscSleep(1.1*second, ierr))
168f8402805SBarry Smith         PetscCallA(PetscLogEventEnd(TidyClass,ierr))
169f8402805SBarry Smith         PetscCallA(PetscLogEventBegin(CorrectHomework,ierr))
170f8402805SBarry Smith         PetscCallA(PetscLogFlops(234700d0,ierr))
171f8402805SBarry Smith         PetscCallA(PetscSleep(1.1*second, ierr))
172f8402805SBarry Smith         PetscCallA(PetscLogEventEnd(CorrectHomework,ierr))
1732dfe2926SJacob Faibussowitsch      else
174f8402805SBarry Smith         PetscCallA(PetscLogEventBegin(SkipRope,ierr))
175f8402805SBarry Smith         PetscCallA(PetscSleep(0.7*second, ierr))
176f8402805SBarry Smith         PetscCallA(PetscLogEventEnd(SkipRope,ierr))
177f8402805SBarry Smith         PetscCallA(PetscLogEventBegin(PlayBall,ierr))
178f8402805SBarry Smith         PetscCallA(PetscSleep(0.8*second, ierr))
179f8402805SBarry Smith         PetscCallA(PetscLogEventEnd(PlayBall,ierr))
1802dfe2926SJacob Faibussowitsch      end if
1812dfe2926SJacob Faibussowitsch
182f8402805SBarry Smith      PetscCallA(PetscLogEventBegin(Lessons,ierr))
183f8402805SBarry Smith      PetscCallA(PetscLogFlops(120000d0,ierr))
184f8402805SBarry Smith      PetscCallA(PetscSleep(0.7*second, ierr))
185f8402805SBarry Smith      PetscCallA(PetscLogEventEnd(Lessons,ierr))
1862dfe2926SJacob Faibussowitsch
187f8402805SBarry Smith      PetscCallA(PetscSleep(0.25*second,ierr))
1882dfe2926SJacob Faibussowitsch
189f8402805SBarry Smith      PetscCallA(PetscLogEventBegin(Morning,ierr))
1902dfe2926SJacob Faibussowitsch
191f8402805SBarry Smith         PetscCallA(PetscLogFlops(190000d0,ierr))
192f8402805SBarry Smith         PetscCallA(PetscSleep(0.5*second,ierr))
1932dfe2926SJacob Faibussowitsch
194f8402805SBarry Smith         PetscCallA(PetscLogEventBegin(Lessons,ierr))
195f8402805SBarry Smith         PetscCallA(PetscLogFlops(23000d0,ierr))
196f8402805SBarry Smith         PetscCallA(PetscSleep(1*second, ierr))
1972dfe2926SJacob Faibussowitsch         if (size>1) then
198*d8606c27SBarry Smith           PetscCallMPIA(MPI_Isend( message, msgLen, MPI_DOUBLE_PRECISION,mod(rank+1,size),tagMsg+rank, PETSC_COMM_WORLD, req, ierr))
199*d8606c27SBarry Smith           PetscCallMPIA(MPI_Recv( message, msgLen, MPI_DOUBLE_PRECISION,mod(rank-1+size,size),tagMsg+mod(rank-1+size,size), PETSC_COMM_WORLD,status, ierr))
200f8402805SBarry Smith           PetscCallMPIA(MPI_Wait(req,MPI_STATUS_IGNORE,ierr))
2012dfe2926SJacob Faibussowitsch         end if
202f8402805SBarry Smith         PetscCallA(PetscLogEventEnd(Lessons,ierr))
2032dfe2926SJacob Faibussowitsch
2042dfe2926SJacob Faibussowitsch         if (role==TEACHER) then
205f8402805SBarry Smith            PetscCallA(PetscLogEventBegin(TidyClass,ierr))
206f8402805SBarry Smith            PetscCallA(PetscLogFlops(600000d0,ierr))
207f8402805SBarry Smith            PetscCallA(PetscSleep(1.2*second, ierr))
208f8402805SBarry Smith            PetscCallA(PetscLogEventEnd(TidyClass,ierr))
2092dfe2926SJacob Faibussowitsch         else if (role==BOY) then
210f8402805SBarry Smith            PetscCallA(PetscLogEventBegin(SkipRope,ierr))
211f8402805SBarry Smith            PetscCallA(PetscSleep(0.8*second, ierr))
212f8402805SBarry Smith            PetscCallA(PetscLogEventEnd(SkipRope,ierr))
2132dfe2926SJacob Faibussowitsch         else
214f8402805SBarry Smith            PetscCallA(PetscLogEventBegin(PlayBall,ierr))
215f8402805SBarry Smith            PetscCallA(PetscSleep(0.9*second, ierr))
216f8402805SBarry Smith            PetscCallA(PetscLogEventEnd(PlayBall,ierr))
2172dfe2926SJacob Faibussowitsch         end if
2182dfe2926SJacob Faibussowitsch
219f8402805SBarry Smith         PetscCallA(PetscLogEventBegin(Lessons,ierr))
220f8402805SBarry Smith         PetscCallA(PetscLogFlops(120000d0,ierr))
221f8402805SBarry Smith         PetscCallA(PetscSleep(0.7*second, ierr))
222f8402805SBarry Smith         PetscCallA(PetscLogEventEnd(Lessons,ierr))
2232dfe2926SJacob Faibussowitsch
224f8402805SBarry Smith      PetscCallA(PetscLogEventEnd(Morning,ierr))
2252dfe2926SJacob Faibussowitsch
2262dfe2926SJacob Faibussowitsch      deallocate(message)
2272dfe2926SJacob Faibussowitsch
228f8402805SBarry Smith      PetscCallA(PetscFinalize(ierr))
2292dfe2926SJacob Faibussowitsch      end program SchoolDay
2302dfe2926SJacob Faibussowitsch
2312dfe2926SJacob Faibussowitsch!/*TEST
2322dfe2926SJacob Faibussowitsch!
2332dfe2926SJacob Faibussowitsch! testset:
2342dfe2926SJacob Faibussowitsch!   suffix: no_log
2352dfe2926SJacob Faibussowitsch!   requires: !defined(PETSC_USE_LOG)
2362dfe2926SJacob Faibussowitsch!   test:
2372dfe2926SJacob Faibussowitsch!     suffix: ascii
2382dfe2926SJacob Faibussowitsch!     args: -log_view ascii:filename.txt
2392dfe2926SJacob Faibussowitsch!   test:
2402dfe2926SJacob Faibussowitsch!     suffix: detail
2412dfe2926SJacob Faibussowitsch!     args: -log_view ascii:filename.txt:ascii_info_detail
2422dfe2926SJacob Faibussowitsch!   test:
2432dfe2926SJacob Faibussowitsch!     suffix: xml
2442dfe2926SJacob Faibussowitsch!     args: -log_view ascii:filename.xml:ascii_xml
2452dfe2926SJacob Faibussowitsch!
2462dfe2926SJacob Faibussowitsch! testset:
2472dfe2926SJacob Faibussowitsch!   args: -log_view ascii:filename.txt
2482dfe2926SJacob Faibussowitsch!   output_file: output/ex3f90.out
2492dfe2926SJacob Faibussowitsch!   requires: defined(PETSC_USE_LOG)
2502dfe2926SJacob Faibussowitsch!   test:
2512dfe2926SJacob Faibussowitsch!     suffix: 1
2522dfe2926SJacob Faibussowitsch!     nsize: 1
2532dfe2926SJacob Faibussowitsch!   test:
2542dfe2926SJacob Faibussowitsch!     suffix: 2
2552dfe2926SJacob Faibussowitsch!     nsize: 2
2562dfe2926SJacob Faibussowitsch!   test:
2572dfe2926SJacob Faibussowitsch!     suffix: 3
2582dfe2926SJacob Faibussowitsch!     nsize: 3
2592dfe2926SJacob Faibussowitsch!
2602dfe2926SJacob Faibussowitsch! testset:
2612dfe2926SJacob Faibussowitsch!   suffix: detail
2622dfe2926SJacob Faibussowitsch!   args: -log_view ascii:filename.txt:ascii_info_detail
2632dfe2926SJacob Faibussowitsch!   output_file: output/ex3f90.out
2642dfe2926SJacob Faibussowitsch!   requires: defined(PETSC_USE_LOG)
2652dfe2926SJacob Faibussowitsch!   test:
2662dfe2926SJacob Faibussowitsch!     suffix: 1
2672dfe2926SJacob Faibussowitsch!     nsize: 1
2682dfe2926SJacob Faibussowitsch!   test:
2692dfe2926SJacob Faibussowitsch!     suffix: 2
2702dfe2926SJacob Faibussowitsch!     nsize: 2
2712dfe2926SJacob Faibussowitsch!   test:
2722dfe2926SJacob Faibussowitsch!     suffix: 3
2732dfe2926SJacob Faibussowitsch!     nsize: 3
2742dfe2926SJacob Faibussowitsch!
2752dfe2926SJacob Faibussowitsch! testset:
2762dfe2926SJacob Faibussowitsch!   suffix: xml
2772dfe2926SJacob Faibussowitsch!   args: -log_view ascii:filename.xml:ascii_xml
2782dfe2926SJacob Faibussowitsch!   output_file: output/ex3f90.out
2792dfe2926SJacob Faibussowitsch!   requires: defined(PETSC_USE_LOG)
2802dfe2926SJacob Faibussowitsch!   test:
2812dfe2926SJacob Faibussowitsch!     suffix: 1
2822dfe2926SJacob Faibussowitsch!     nsize: 1
2832dfe2926SJacob Faibussowitsch!   test:
2842dfe2926SJacob Faibussowitsch!     suffix: 2
2852dfe2926SJacob Faibussowitsch!     nsize: 2
2862dfe2926SJacob Faibussowitsch!   test:
2872dfe2926SJacob Faibussowitsch!     suffix: 3
2882dfe2926SJacob Faibussowitsch!     nsize: 3
2892dfe2926SJacob Faibussowitsch!
2902dfe2926SJacob Faibussowitsch!TEST*/
291