xref: /petsc/src/sys/tutorials/ex3f90.F90 (revision 749c190bad46ba447444c173d8c7a4080c70750e)
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#include <petsc/finclude/petscsys.h>
72dfe2926SJacob Faibussowitsch#include <petsc/finclude/petsclog.h>
8c5e229c2SMartin Diehlprogram SchoolDay
92dfe2926SJacob Faibussowitsch  use petscsys
102dfe2926SJacob Faibussowitsch  implicit none
112dfe2926SJacob Faibussowitsch
122dfe2926SJacob Faibussowitsch  ! Settings:
132dfe2926SJacob Faibussowitsch  integer, parameter        :: verbose = 0               ! 0: silent, >=1 : increasing amount of debugging output
14*b06eb4cdSBarry Smith  integer4, parameter       :: msgLen = 30             ! number of reals which is sent with MPI_Isend
15ccfd86f1SBarry Smith  PetscReal, parameter      :: second = 0.1             ! time is sped up by a factor 10
162dfe2926SJacob Faibussowitsch
172dfe2926SJacob Faibussowitsch  ! Codes
182dfe2926SJacob Faibussowitsch  integer, parameter        :: BOY = 1, GIRL = 2, TEACHER = 0
19ccfd86f1SBarry Smith  PetscMPIInt, parameter    :: tagMsg = 1200
202dfe2926SJacob Faibussowitsch
212dfe2926SJacob Faibussowitsch  ! Timers
222dfe2926SJacob Faibussowitsch  PetscLogEvent :: Morning, Afternoon
232dfe2926SJacob Faibussowitsch  PetscLogEvent :: PlayBall, SkipRope
242dfe2926SJacob Faibussowitsch  PetscLogEvent :: TidyClass
252dfe2926SJacob Faibussowitsch  PetscLogEvent :: Lessons, CorrectHomework
262dfe2926SJacob Faibussowitsch  PetscClassId classid
272dfe2926SJacob Faibussowitsch
282dfe2926SJacob Faibussowitsch  ! Petsc-stuff
292dfe2926SJacob Faibussowitsch  PetscErrorCode            :: ierr
302dfe2926SJacob Faibussowitsch
312dfe2926SJacob Faibussowitsch  ! MPI-stuff
322dfe2926SJacob Faibussowitsch  PetscMPIInt              :: rank, size
332dfe2926SJacob Faibussowitsch  PetscReal, allocatable    :: message(:, :)
34*b06eb4cdSBarry Smith  integer                   :: item
35*b06eb4cdSBarry Smith  PetscMPIInt :: maxItem
36*b06eb4cdSBarry Smith#if defined(PETSC_USE_MPI_F08)
37*b06eb4cdSBarry Smith  MPIU_Status                  :: status
38*b06eb4cdSBarry Smith#else
39*b06eb4cdSBarry Smith  MPIU_Status                  :: status(MPI_STATUS_SIZE)
40*b06eb4cdSBarry Smith#endif
41*b06eb4cdSBarry Smith  MPIU_Request req
422dfe2926SJacob Faibussowitsch
432dfe2926SJacob Faibussowitsch  ! Own stuff
442dfe2926SJacob Faibussowitsch  integer4                  :: role                 ! is this process a BOY, a GIRL or a TEACHER?
452dfe2926SJacob Faibussowitsch  integer4                  :: i, j
46f8402805SBarry Smith
472dfe2926SJacob Faibussowitsch!     Initializations
48d8606c27SBarry Smith  PetscCallA(PetscInitialize(ierr))
49f8402805SBarry Smith  PetscCallMPIA(MPI_Comm_size(PETSC_COMM_WORLD, size, ierr))
50f8402805SBarry Smith  PetscCallMPIA(MPI_Comm_rank(PETSC_COMM_WORLD, rank, ierr))
512dfe2926SJacob Faibussowitsch
522dfe2926SJacob Faibussowitsch  if (rank == 0) then
532dfe2926SJacob Faibussowitsch    role = TEACHER
54*b06eb4cdSBarry Smith  else if (rank < 0.4_PETSC_REAL_KIND*size) then
552dfe2926SJacob Faibussowitsch    role = GIRL
562dfe2926SJacob Faibussowitsch  else
572dfe2926SJacob Faibussowitsch    role = BOY
582dfe2926SJacob Faibussowitsch  end if
592dfe2926SJacob Faibussowitsch
602dfe2926SJacob Faibussowitsch  allocate (message(msgLen, msglen))
612dfe2926SJacob Faibussowitsch  do i = 1, msgLen
622dfe2926SJacob Faibussowitsch    do j = 1, msgLen
63*b06eb4cdSBarry Smith      message(i, j) = 10.0_PETSC_REAL_KIND*j + i*1.0_PETSC_REAL_KIND/(rank + 1_PETSC_MPIINT_KIND)
642dfe2926SJacob Faibussowitsch    end do
652dfe2926SJacob Faibussowitsch  end do
662dfe2926SJacob Faibussowitsch!
672dfe2926SJacob Faibussowitsch!     Create new user-defined events
682dfe2926SJacob Faibussowitsch  classid = 0
69f8402805SBarry Smith  PetscCallA(PetscLogEventRegister('Morning', classid, Morning, ierr))
70f8402805SBarry Smith  PetscCallA(PetscLogEventRegister('Afternoon', classid, Afternoon, ierr))
71f8402805SBarry Smith  PetscCallA(PetscLogEventRegister('Play Ball', classid, PlayBall, ierr))
72f8402805SBarry Smith  PetscCallA(PetscLogEventRegister('Skip Rope', classid, SkipRope, ierr))
73f8402805SBarry Smith  PetscCallA(PetscLogEventRegister('Tidy Classroom', classid, TidyClass, ierr))
74f8402805SBarry Smith  PetscCallA(PetscLogEventRegister('Lessons', classid, Lessons, ierr))
75f8402805SBarry Smith  PetscCallA(PetscLogEventRegister('Correct Homework', classid, CorrectHomework, ierr))
762dfe2926SJacob Faibussowitsch  if (verbose >= 1) then
772dfe2926SJacob Faibussowitsch    print '(a,i0,a)', '[', rank, '] SchoolDay events have been defined'
782dfe2926SJacob Faibussowitsch  end if
792dfe2926SJacob Faibussowitsch
802dfe2926SJacob Faibussowitsch!     Go through the school day
81f8402805SBarry Smith  PetscCallA(PetscLogEventBegin(Morning, ierr))
822dfe2926SJacob Faibussowitsch
83f8402805SBarry Smith  PetscCallA(PetscLogFlops(190000d0, ierr))
84f8402805SBarry Smith  PetscCallA(PetscSleep(0.5*second, ierr))
852dfe2926SJacob Faibussowitsch
86f8402805SBarry Smith  PetscCallA(PetscLogEventBegin(Lessons, ierr))
87f8402805SBarry Smith  PetscCallA(PetscLogFlops(23000d0, ierr))
88f8402805SBarry Smith  PetscCallA(PetscSleep(1*second, ierr))
892dfe2926SJacob Faibussowitsch  if (size > 1) then
90*b06eb4cdSBarry Smith    PetscCallMPIA(MPI_Isend(message, msgLen, MPIU_REAL, mod(rank + 1_PETSC_MPIINT_KIND, size), tagMsg + rank, PETSC_COMM_WORLD, req, ierr))
91*b06eb4cdSBarry Smith    PetscCallMPIA(MPI_Recv(message, msgLen, MPIU_REAL, mod(rank - 1_PETSC_MPIINT_KIND + size, size), tagMsg + mod(rank - 1_PETSC_MPIINT_KIND + size, size), PETSC_COMM_WORLD, status, ierr))
92f8402805SBarry Smith    PetscCallMPIA(MPI_Wait(req, MPI_STATUS_IGNORE, ierr))
932dfe2926SJacob Faibussowitsch  end if
94f8402805SBarry Smith  PetscCallA(PetscLogEventEnd(Lessons, ierr))
952dfe2926SJacob Faibussowitsch
962dfe2926SJacob Faibussowitsch  if (role == TEACHER) then
97f8402805SBarry Smith    PetscCallA(PetscLogEventBegin(TidyClass, ierr))
98f8402805SBarry Smith    PetscCallA(PetscLogFlops(600000d0, ierr))
99f8402805SBarry Smith    PetscCallA(PetscSleep(0.6*second, ierr))
100f8402805SBarry Smith    PetscCallA(PetscLogEventBegin(CorrectHomework, ierr))
101f8402805SBarry Smith    PetscCallA(PetscLogFlops(234700d0, ierr))
102f8402805SBarry Smith    PetscCallA(PetscSleep(0.4*second, ierr))
103f8402805SBarry Smith    PetscCallA(PetscLogEventEnd(CorrectHomework, ierr))
104f8402805SBarry Smith    PetscCallA(PetscLogEventEnd(TidyClass, ierr))
1052dfe2926SJacob Faibussowitsch  else if (role == BOY) then
106f8402805SBarry Smith    PetscCallA(PetscLogEventBegin(SkipRope, ierr))
107f8402805SBarry Smith    PetscCallA(PetscSleep(0.8*second, ierr))
108f8402805SBarry Smith    PetscCallA(PetscLogEventEnd(SkipRope, ierr))
1092dfe2926SJacob Faibussowitsch  else
110f8402805SBarry Smith    PetscCallA(PetscLogEventBegin(PlayBall, ierr))
111f8402805SBarry Smith    PetscCallA(PetscSleep(0.9*second, ierr))
112f8402805SBarry Smith    PetscCallA(PetscLogEventEnd(PlayBall, ierr))
1132dfe2926SJacob Faibussowitsch  end if
1142dfe2926SJacob Faibussowitsch
115f8402805SBarry Smith  PetscCallA(PetscLogEventBegin(Lessons, ierr))
116f8402805SBarry Smith  PetscCallA(PetscLogFlops(120000d0, ierr))
117f8402805SBarry Smith  PetscCallA(PetscSleep(0.7*second, ierr))
118f8402805SBarry Smith  PetscCallA(PetscLogEventEnd(Lessons, ierr))
1192dfe2926SJacob Faibussowitsch
120f8402805SBarry Smith  PetscCallA(PetscLogEventEnd(Morning, ierr))
1212dfe2926SJacob Faibussowitsch
122f8402805SBarry Smith  PetscCallA(PetscLogEventBegin(Afternoon, ierr))
1232dfe2926SJacob Faibussowitsch
1242dfe2926SJacob Faibussowitsch  item = rank*(3 - rank)
125*b06eb4cdSBarry Smith  PetscCallMPIA(MPI_Allreduce(item, maxItem, 1_PETSC_MPIINT_KIND, MPI_INTEGER, MPI_MAX, PETSC_COMM_WORLD, ierr))
1262dfe2926SJacob Faibussowitsch
1272dfe2926SJacob Faibussowitsch  item = rank*(10 - rank)
128*b06eb4cdSBarry Smith  PetscCallMPIA(MPI_Allreduce(item, maxItem, 1_PETSC_MPIINT_KIND, MPI_INTEGER, MPI_MAX, PETSC_COMM_WORLD, ierr))
1292dfe2926SJacob Faibussowitsch
130f8402805SBarry Smith  PetscCallA(PetscLogFlops(58988d0, ierr))
131f8402805SBarry Smith  PetscCallA(PetscSleep(0.6*second, ierr))
1322dfe2926SJacob Faibussowitsch
133f8402805SBarry Smith  PetscCallA(PetscLogEventBegin(Lessons, ierr))
134f8402805SBarry Smith  PetscCallA(PetscLogFlops(123456d0, ierr))
135f8402805SBarry Smith  PetscCallA(PetscSleep(1*second, ierr))
136f8402805SBarry Smith  PetscCallA(PetscLogEventEnd(Lessons, ierr))
1372dfe2926SJacob Faibussowitsch
1382dfe2926SJacob Faibussowitsch  if (role == TEACHER) then
139f8402805SBarry Smith    PetscCallA(PetscLogEventBegin(TidyClass, ierr))
140f8402805SBarry Smith    PetscCallA(PetscLogFlops(17800d0, ierr))
141f8402805SBarry Smith    PetscCallA(PetscSleep(1.1*second, ierr))
142f8402805SBarry Smith    PetscCallA(PetscLogEventBegin(Lessons, ierr))
143f8402805SBarry Smith    PetscCallA(PetscLogFlops(72344d0, ierr))
144f8402805SBarry Smith    PetscCallA(PetscSleep(0.5*second, ierr))
145f8402805SBarry Smith    PetscCallA(PetscLogEventEnd(Lessons, ierr))
146f8402805SBarry Smith    PetscCallA(PetscLogEventEnd(TidyClass, ierr))
1472dfe2926SJacob Faibussowitsch  else if (role == GIRL) then
148f8402805SBarry Smith    PetscCallA(PetscLogEventBegin(SkipRope, ierr))
149f8402805SBarry Smith    PetscCallA(PetscSleep(0.7*second, ierr))
150f8402805SBarry Smith    PetscCallA(PetscLogEventEnd(SkipRope, ierr))
1512dfe2926SJacob Faibussowitsch  else
152f8402805SBarry Smith    PetscCallA(PetscLogEventBegin(PlayBall, ierr))
153f8402805SBarry Smith    PetscCallA(PetscSleep(0.8*second, ierr))
154f8402805SBarry Smith    PetscCallA(PetscLogEventEnd(PlayBall, ierr))
1552dfe2926SJacob Faibussowitsch  end if
1562dfe2926SJacob Faibussowitsch
157f8402805SBarry Smith  PetscCallA(PetscLogEventBegin(Lessons, ierr))
158f8402805SBarry Smith  PetscCallA(PetscLogFlops(72344d0, ierr))
159f8402805SBarry Smith  PetscCallA(PetscSleep(0.5*second, ierr))
160f8402805SBarry Smith  PetscCallA(PetscLogEventEnd(Lessons, ierr))
1612dfe2926SJacob Faibussowitsch
162f8402805SBarry Smith  PetscCallA(PetscLogEventEnd(Afternoon, ierr))
1632dfe2926SJacob Faibussowitsch
1642dfe2926SJacob Faibussowitsch  if (.false.) then
1652dfe2926SJacob Faibussowitsch    continue
1662dfe2926SJacob Faibussowitsch  else if (role == TEACHER) then
167f8402805SBarry Smith    PetscCallA(PetscLogEventBegin(TidyClass, ierr))
168f8402805SBarry Smith    PetscCallA(PetscLogFlops(612300d0, ierr))
169f8402805SBarry Smith    PetscCallA(PetscSleep(1.1*second, ierr))
170f8402805SBarry Smith    PetscCallA(PetscLogEventEnd(TidyClass, ierr))
171f8402805SBarry Smith    PetscCallA(PetscLogEventBegin(CorrectHomework, ierr))
172f8402805SBarry Smith    PetscCallA(PetscLogFlops(234700d0, ierr))
173f8402805SBarry Smith    PetscCallA(PetscSleep(1.1*second, ierr))
174f8402805SBarry Smith    PetscCallA(PetscLogEventEnd(CorrectHomework, ierr))
1752dfe2926SJacob Faibussowitsch  else
176f8402805SBarry Smith    PetscCallA(PetscLogEventBegin(SkipRope, ierr))
177f8402805SBarry Smith    PetscCallA(PetscSleep(0.7*second, ierr))
178f8402805SBarry Smith    PetscCallA(PetscLogEventEnd(SkipRope, ierr))
179f8402805SBarry Smith    PetscCallA(PetscLogEventBegin(PlayBall, ierr))
180f8402805SBarry Smith    PetscCallA(PetscSleep(0.8*second, ierr))
181f8402805SBarry Smith    PetscCallA(PetscLogEventEnd(PlayBall, ierr))
1822dfe2926SJacob Faibussowitsch  end if
1832dfe2926SJacob Faibussowitsch
184f8402805SBarry Smith  PetscCallA(PetscLogEventBegin(Lessons, ierr))
185f8402805SBarry Smith  PetscCallA(PetscLogFlops(120000d0, ierr))
186f8402805SBarry Smith  PetscCallA(PetscSleep(0.7*second, ierr))
187f8402805SBarry Smith  PetscCallA(PetscLogEventEnd(Lessons, ierr))
1882dfe2926SJacob Faibussowitsch
189f8402805SBarry Smith  PetscCallA(PetscSleep(0.25*second, ierr))
1902dfe2926SJacob Faibussowitsch
191f8402805SBarry Smith  PetscCallA(PetscLogEventBegin(Morning, ierr))
1922dfe2926SJacob Faibussowitsch
193f8402805SBarry Smith  PetscCallA(PetscLogFlops(190000d0, ierr))
194f8402805SBarry Smith  PetscCallA(PetscSleep(0.5*second, ierr))
1952dfe2926SJacob Faibussowitsch
196f8402805SBarry Smith  PetscCallA(PetscLogEventBegin(Lessons, ierr))
197f8402805SBarry Smith  PetscCallA(PetscLogFlops(23000d0, ierr))
198f8402805SBarry Smith  PetscCallA(PetscSleep(1*second, ierr))
1992dfe2926SJacob Faibussowitsch  if (size > 1) then
200*b06eb4cdSBarry Smith    PetscCallMPIA(MPI_Isend(message, msgLen, MPIU_REAL, mod(rank + 1_PETSC_MPIINT_KIND, size), tagMsg + rank, PETSC_COMM_WORLD, req, ierr))
201*b06eb4cdSBarry Smith    PetscCallMPIA(MPI_Recv(message, msgLen, MPIU_REAL, mod(rank - 1_PETSC_MPIINT_KIND + size, size), tagMsg + mod(rank - 1_PETSC_MPIINT_KIND + size, size), PETSC_COMM_WORLD, status, ierr))
202f8402805SBarry Smith    PetscCallMPIA(MPI_Wait(req, MPI_STATUS_IGNORE, ierr))
2032dfe2926SJacob Faibussowitsch  end if
204f8402805SBarry Smith  PetscCallA(PetscLogEventEnd(Lessons, ierr))
2052dfe2926SJacob Faibussowitsch
2062dfe2926SJacob Faibussowitsch  if (role == TEACHER) then
207f8402805SBarry Smith    PetscCallA(PetscLogEventBegin(TidyClass, ierr))
208f8402805SBarry Smith    PetscCallA(PetscLogFlops(600000d0, ierr))
209f8402805SBarry Smith    PetscCallA(PetscSleep(1.2*second, ierr))
210f8402805SBarry Smith    PetscCallA(PetscLogEventEnd(TidyClass, ierr))
2112dfe2926SJacob Faibussowitsch  else if (role == BOY) then
212f8402805SBarry Smith    PetscCallA(PetscLogEventBegin(SkipRope, ierr))
213f8402805SBarry Smith    PetscCallA(PetscSleep(0.8*second, ierr))
214f8402805SBarry Smith    PetscCallA(PetscLogEventEnd(SkipRope, ierr))
2152dfe2926SJacob Faibussowitsch  else
216f8402805SBarry Smith    PetscCallA(PetscLogEventBegin(PlayBall, ierr))
217f8402805SBarry Smith    PetscCallA(PetscSleep(0.9*second, ierr))
218f8402805SBarry Smith    PetscCallA(PetscLogEventEnd(PlayBall, ierr))
2192dfe2926SJacob Faibussowitsch  end if
2202dfe2926SJacob Faibussowitsch
221f8402805SBarry Smith  PetscCallA(PetscLogEventBegin(Lessons, ierr))
222f8402805SBarry Smith  PetscCallA(PetscLogFlops(120000d0, ierr))
223f8402805SBarry Smith  PetscCallA(PetscSleep(0.7*second, ierr))
224f8402805SBarry Smith  PetscCallA(PetscLogEventEnd(Lessons, ierr))
2252dfe2926SJacob Faibussowitsch
226f8402805SBarry Smith  PetscCallA(PetscLogEventEnd(Morning, ierr))
2272dfe2926SJacob Faibussowitsch
2282dfe2926SJacob Faibussowitsch  deallocate (message)
2292dfe2926SJacob Faibussowitsch
230f8402805SBarry Smith  PetscCallA(PetscFinalize(ierr))
2312dfe2926SJacob Faibussowitschend program SchoolDay
2322dfe2926SJacob Faibussowitsch
2332dfe2926SJacob Faibussowitsch!/*TEST
2342dfe2926SJacob Faibussowitsch!
2352dfe2926SJacob Faibussowitsch! testset:
2362dfe2926SJacob Faibussowitsch!   suffix: no_log
2372dfe2926SJacob Faibussowitsch!   requires: !defined(PETSC_USE_LOG)
2382dfe2926SJacob Faibussowitsch!   test:
2392dfe2926SJacob Faibussowitsch!     suffix: ascii
240758f5028SMatthew G. Knepley!     args: -log_view ascii:filename.txt -log_all
2412dfe2926SJacob Faibussowitsch!   test:
2422dfe2926SJacob Faibussowitsch!     suffix: detail
2432dfe2926SJacob Faibussowitsch!     args: -log_view ascii:filename.txt:ascii_info_detail
2442dfe2926SJacob Faibussowitsch!   test:
2452dfe2926SJacob Faibussowitsch!     suffix: xml
2462dfe2926SJacob Faibussowitsch!     args: -log_view ascii:filename.xml:ascii_xml
2472dfe2926SJacob Faibussowitsch!
2482dfe2926SJacob Faibussowitsch! testset:
2492dfe2926SJacob Faibussowitsch!   args: -log_view ascii:filename.txt
2503886731fSPierre Jolivet!   output_file: output/empty.out
2512dfe2926SJacob Faibussowitsch!   requires: defined(PETSC_USE_LOG)
2522dfe2926SJacob Faibussowitsch!   test:
2532dfe2926SJacob Faibussowitsch!     suffix: 1
2542dfe2926SJacob Faibussowitsch!     nsize: 1
2552dfe2926SJacob Faibussowitsch!   test:
2562dfe2926SJacob Faibussowitsch!     suffix: 2
2572dfe2926SJacob Faibussowitsch!     nsize: 2
2582dfe2926SJacob Faibussowitsch!   test:
2592dfe2926SJacob Faibussowitsch!     suffix: 3
2602dfe2926SJacob Faibussowitsch!     nsize: 3
2612dfe2926SJacob Faibussowitsch!
2622dfe2926SJacob Faibussowitsch! testset:
2632dfe2926SJacob Faibussowitsch!   suffix: detail
2642dfe2926SJacob Faibussowitsch!   args: -log_view ascii:filename.txt:ascii_info_detail
2653886731fSPierre Jolivet!   output_file: output/empty.out
2662dfe2926SJacob Faibussowitsch!   requires: defined(PETSC_USE_LOG)
2672dfe2926SJacob Faibussowitsch!   test:
2682dfe2926SJacob Faibussowitsch!     suffix: 1
2692dfe2926SJacob Faibussowitsch!     nsize: 1
2702dfe2926SJacob Faibussowitsch!   test:
2712dfe2926SJacob Faibussowitsch!     suffix: 2
2722dfe2926SJacob Faibussowitsch!     nsize: 2
2732dfe2926SJacob Faibussowitsch!   test:
2742dfe2926SJacob Faibussowitsch!     suffix: 3
2752dfe2926SJacob Faibussowitsch!     nsize: 3
2762dfe2926SJacob Faibussowitsch!
2772dfe2926SJacob Faibussowitsch! testset:
2782dfe2926SJacob Faibussowitsch!   suffix: xml
2792dfe2926SJacob Faibussowitsch!   args: -log_view ascii:filename.xml:ascii_xml
2803886731fSPierre Jolivet!   output_file: output/empty.out
2812dfe2926SJacob Faibussowitsch!   requires: defined(PETSC_USE_LOG)
2822dfe2926SJacob Faibussowitsch!   test:
2832dfe2926SJacob Faibussowitsch!     suffix: 1
2842dfe2926SJacob Faibussowitsch!     nsize: 1
2852dfe2926SJacob Faibussowitsch!   test:
2862dfe2926SJacob Faibussowitsch!     suffix: 2
2872dfe2926SJacob Faibussowitsch!     nsize: 2
2882dfe2926SJacob Faibussowitsch!   test:
2892dfe2926SJacob Faibussowitsch!     suffix: 3
2902dfe2926SJacob Faibussowitsch!     nsize: 3
2912dfe2926SJacob Faibussowitsch!
2922dfe2926SJacob Faibussowitsch!TEST*/
293