xref: /petsc/src/sys/tutorials/ex3f90.F90 (revision f84028053d197aff3fdf060e86d88b3f1b0f0110)
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
44*f8402805SBarry Smith
452dfe2926SJacob Faibussowitsch!     Initializations
46*f8402805SBarry Smith      PetscCallA( PetscInitialize(PETSC_NULL_CHARACTER,ierr))
47*f8402805SBarry Smith      PetscCallMPIA(MPI_Comm_size(PETSC_COMM_WORLD, size,ierr))
48*f8402805SBarry 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
67*f8402805SBarry Smith      PetscCallA(PetscLogEventRegister('Morning',         classid, Morning,   ierr))
68*f8402805SBarry Smith      PetscCallA(PetscLogEventRegister('Afternoon',       classid, Afternoon, ierr))
69*f8402805SBarry Smith      PetscCallA(PetscLogEventRegister('Play Ball',       classid, PlayBall,  ierr))
70*f8402805SBarry Smith      PetscCallA(PetscLogEventRegister('Skip Rope',       classid, SkipRope,  ierr))
71*f8402805SBarry Smith      PetscCallA(PetscLogEventRegister('Tidy Classroom',  classid, TidyClass, ierr))
72*f8402805SBarry Smith      PetscCallA(PetscLogEventRegister('Lessons',         classid, Lessons,   ierr))
73*f8402805SBarry 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
79*f8402805SBarry Smith      PetscCallA(PetscLogEventBegin(Morning,ierr))
802dfe2926SJacob Faibussowitsch
81*f8402805SBarry Smith         PetscCallA(PetscLogFlops(190000d0,ierr))
82*f8402805SBarry Smith         PetscCallA(PetscSleep(0.5*second,ierr))
832dfe2926SJacob Faibussowitsch
84*f8402805SBarry Smith         PetscCallA(PetscLogEventBegin(Lessons,ierr))
85*f8402805SBarry Smith         PetscCallA(PetscLogFlops(23000d0,ierr))
86*f8402805SBarry Smith         PetscCallA(PetscSleep(1*second, ierr))
872dfe2926SJacob Faibussowitsch         if (size>1) then
882dfe2926SJacob Faibussowitsch         call MPI_Isend( message, msgLen, MPI_DOUBLE_PRECISION,                             &
892dfe2926SJacob Faibussowitsch     &                        mod(rank+1,size),                                             &
902dfe2926SJacob Faibussowitsch     &                        tagMsg+rank, PETSC_COMM_WORLD, req, ierr)
912dfe2926SJacob Faibussowitsch         call  MPI_Recv( message, msgLen, MPI_DOUBLE_PRECISION,                             &
922dfe2926SJacob Faibussowitsch     &                       mod(rank-1+size,size),                                         &
932dfe2926SJacob Faibussowitsch     &                  tagMsg+mod(rank-1+size,size), PETSC_COMM_WORLD,                     &
942dfe2926SJacob Faibussowitsch     &        status, ierr)
95*f8402805SBarry Smith         PetscCallMPIA(MPI_Wait(req,MPI_STATUS_IGNORE,ierr))
962dfe2926SJacob Faibussowitsch         end if
97*f8402805SBarry Smith         PetscCallA(PetscLogEventEnd(Lessons,ierr))
982dfe2926SJacob Faibussowitsch
992dfe2926SJacob Faibussowitsch         if (role==TEACHER) then
100*f8402805SBarry Smith            PetscCallA(PetscLogEventBegin(TidyClass,ierr))
101*f8402805SBarry Smith            PetscCallA(PetscLogFlops(600000d0,ierr))
102*f8402805SBarry Smith            PetscCallA(PetscSleep(0.6*second, ierr))
103*f8402805SBarry Smith               PetscCallA(PetscLogEventBegin(CorrectHomework,ierr))
104*f8402805SBarry Smith               PetscCallA(PetscLogFlops(234700d0,ierr))
105*f8402805SBarry Smith               PetscCallA(PetscSleep(0.4*second, ierr))
106*f8402805SBarry Smith               PetscCallA(PetscLogEventEnd(CorrectHomework,ierr))
107*f8402805SBarry Smith            PetscCallA(PetscLogEventEnd(TidyClass,ierr))
1082dfe2926SJacob Faibussowitsch         else if (role==BOY) then
109*f8402805SBarry Smith            PetscCallA(PetscLogEventBegin(SkipRope,ierr))
110*f8402805SBarry Smith            PetscCallA(PetscSleep(0.8*second, ierr))
111*f8402805SBarry Smith            PetscCallA(PetscLogEventEnd(SkipRope,ierr))
1122dfe2926SJacob Faibussowitsch         else
113*f8402805SBarry Smith            PetscCallA(PetscLogEventBegin(PlayBall,ierr))
114*f8402805SBarry Smith            PetscCallA(PetscSleep(0.9*second, ierr))
115*f8402805SBarry Smith            PetscCallA(PetscLogEventEnd(PlayBall,ierr))
1162dfe2926SJacob Faibussowitsch         end if
1172dfe2926SJacob Faibussowitsch
118*f8402805SBarry Smith         PetscCallA(PetscLogEventBegin(Lessons,ierr))
119*f8402805SBarry Smith         PetscCallA(PetscLogFlops(120000d0,ierr))
120*f8402805SBarry Smith         PetscCallA(PetscSleep(0.7*second, ierr))
121*f8402805SBarry Smith         PetscCallA(PetscLogEventEnd(Lessons,ierr))
1222dfe2926SJacob Faibussowitsch
123*f8402805SBarry Smith      PetscCallA(PetscLogEventEnd(Morning,ierr))
1242dfe2926SJacob Faibussowitsch
125*f8402805SBarry Smith      PetscCallA(PetscLogEventBegin(Afternoon,ierr))
1262dfe2926SJacob Faibussowitsch
1272dfe2926SJacob Faibussowitsch         item = rank*(3-rank)
128*f8402805SBarry Smith         PetscCallMPIA(MPI_Allreduce(item, maxItem, 1, MPI_INTEGER, MPI_MAX,PETSC_COMM_WORLD, ierr))
1292dfe2926SJacob Faibussowitsch
1302dfe2926SJacob Faibussowitsch         item = rank*(10-rank)
131*f8402805SBarry Smith         PetscCallMPIA(MPI_Allreduce(item, maxItem, 1, MPI_INTEGER, MPI_MAX,PETSC_COMM_WORLD, ierr))
1322dfe2926SJacob Faibussowitsch
133*f8402805SBarry Smith         PetscCallA(PetscLogFlops(58988d0,ierr))
134*f8402805SBarry Smith         PetscCallA(PetscSleep(0.6*second,ierr))
1352dfe2926SJacob Faibussowitsch
136*f8402805SBarry Smith         PetscCallA(PetscLogEventBegin(Lessons,ierr))
137*f8402805SBarry Smith         PetscCallA(PetscLogFlops(123456d0,ierr))
138*f8402805SBarry Smith         PetscCallA(PetscSleep(1*second, ierr))
139*f8402805SBarry Smith         PetscCallA(PetscLogEventEnd(Lessons,ierr))
1402dfe2926SJacob Faibussowitsch
1412dfe2926SJacob Faibussowitsch         if (role==TEACHER) then
142*f8402805SBarry Smith            PetscCallA(PetscLogEventBegin(TidyClass,ierr))
143*f8402805SBarry Smith            PetscCallA(PetscLogFlops(17800d0,ierr))
144*f8402805SBarry Smith            PetscCallA(PetscSleep(1.1*second, ierr))
145*f8402805SBarry Smith            PetscCallA(PetscLogEventBegin(Lessons,ierr))
146*f8402805SBarry Smith            PetscCallA(PetscLogFlops(72344d0,ierr))
147*f8402805SBarry Smith            PetscCallA(PetscSleep(0.5*second, ierr))
148*f8402805SBarry Smith            PetscCallA(PetscLogEventEnd(Lessons,ierr))
149*f8402805SBarry Smith            PetscCallA(PetscLogEventEnd(TidyClass,ierr))
1502dfe2926SJacob Faibussowitsch         else if (role==GIRL) then
151*f8402805SBarry Smith            PetscCallA(PetscLogEventBegin(SkipRope,ierr))
152*f8402805SBarry Smith            PetscCallA(PetscSleep(0.7*second, ierr))
153*f8402805SBarry Smith            PetscCallA(PetscLogEventEnd(SkipRope,ierr))
1542dfe2926SJacob Faibussowitsch         else
155*f8402805SBarry Smith            PetscCallA(PetscLogEventBegin(PlayBall,ierr))
156*f8402805SBarry Smith            PetscCallA(PetscSleep(0.8*second, ierr))
157*f8402805SBarry Smith            PetscCallA(PetscLogEventEnd(PlayBall,ierr))
1582dfe2926SJacob Faibussowitsch         end if
1592dfe2926SJacob Faibussowitsch
160*f8402805SBarry Smith         PetscCallA(PetscLogEventBegin(Lessons,ierr))
161*f8402805SBarry Smith         PetscCallA(PetscLogFlops(72344d0,ierr))
162*f8402805SBarry Smith         PetscCallA(PetscSleep(0.5*second, ierr))
163*f8402805SBarry Smith         PetscCallA(PetscLogEventEnd(Lessons,ierr))
1642dfe2926SJacob Faibussowitsch
165*f8402805SBarry Smith      PetscCallA(PetscLogEventEnd(Afternoon,ierr))
1662dfe2926SJacob Faibussowitsch
1672dfe2926SJacob Faibussowitsch      if (.false.) then
1682dfe2926SJacob Faibussowitsch         continue
1692dfe2926SJacob Faibussowitsch      else if (role==TEACHER) then
170*f8402805SBarry Smith         PetscCallA(PetscLogEventBegin(TidyClass,ierr))
171*f8402805SBarry Smith         PetscCallA(PetscLogFlops(612300d0,ierr))
172*f8402805SBarry Smith         PetscCallA(PetscSleep(1.1*second, ierr))
173*f8402805SBarry Smith         PetscCallA(PetscLogEventEnd(TidyClass,ierr))
174*f8402805SBarry Smith         PetscCallA(PetscLogEventBegin(CorrectHomework,ierr))
175*f8402805SBarry Smith         PetscCallA(PetscLogFlops(234700d0,ierr))
176*f8402805SBarry Smith         PetscCallA(PetscSleep(1.1*second, ierr))
177*f8402805SBarry Smith         PetscCallA(PetscLogEventEnd(CorrectHomework,ierr))
1782dfe2926SJacob Faibussowitsch      else
179*f8402805SBarry Smith         PetscCallA(PetscLogEventBegin(SkipRope,ierr))
180*f8402805SBarry Smith         PetscCallA(PetscSleep(0.7*second, ierr))
181*f8402805SBarry Smith         PetscCallA(PetscLogEventEnd(SkipRope,ierr))
182*f8402805SBarry Smith         PetscCallA(PetscLogEventBegin(PlayBall,ierr))
183*f8402805SBarry Smith         PetscCallA(PetscSleep(0.8*second, ierr))
184*f8402805SBarry Smith         PetscCallA(PetscLogEventEnd(PlayBall,ierr))
1852dfe2926SJacob Faibussowitsch      end if
1862dfe2926SJacob Faibussowitsch
187*f8402805SBarry Smith      PetscCallA(PetscLogEventBegin(Lessons,ierr))
188*f8402805SBarry Smith      PetscCallA(PetscLogFlops(120000d0,ierr))
189*f8402805SBarry Smith      PetscCallA(PetscSleep(0.7*second, ierr))
190*f8402805SBarry Smith      PetscCallA(PetscLogEventEnd(Lessons,ierr))
1912dfe2926SJacob Faibussowitsch
192*f8402805SBarry Smith      PetscCallA(PetscSleep(0.25*second,ierr))
1932dfe2926SJacob Faibussowitsch
194*f8402805SBarry Smith      PetscCallA(PetscLogEventBegin(Morning,ierr))
1952dfe2926SJacob Faibussowitsch
196*f8402805SBarry Smith         PetscCallA(PetscLogFlops(190000d0,ierr))
197*f8402805SBarry Smith         PetscCallA(PetscSleep(0.5*second,ierr))
1982dfe2926SJacob Faibussowitsch
199*f8402805SBarry Smith         PetscCallA(PetscLogEventBegin(Lessons,ierr))
200*f8402805SBarry Smith         PetscCallA(PetscLogFlops(23000d0,ierr))
201*f8402805SBarry Smith         PetscCallA(PetscSleep(1*second, ierr))
2022dfe2926SJacob Faibussowitsch         if (size>1) then
2032dfe2926SJacob Faibussowitsch         call MPI_Isend( message, msgLen, MPI_DOUBLE_PRECISION,                             &
2042dfe2926SJacob Faibussowitsch     &                   mod(rank+1,size),                                                  &
2052dfe2926SJacob Faibussowitsch     &                   tagMsg+rank, PETSC_COMM_WORLD, req, ierr)
2062dfe2926SJacob Faibussowitsch         call MPI_Recv( message, msgLen, MPI_DOUBLE_PRECISION,                              &
2072dfe2926SJacob Faibussowitsch     &                  mod(rank-1+size,size),                                              &
2082dfe2926SJacob Faibussowitsch     &                  tagMsg+mod(rank-1+size,size), PETSC_COMM_WORLD,                     &
2092dfe2926SJacob Faibussowitsch     &                  status, ierr)
210*f8402805SBarry Smith         PetscCallMPIA(MPI_Wait(req,MPI_STATUS_IGNORE,ierr))
2112dfe2926SJacob Faibussowitsch         end if
212*f8402805SBarry Smith         PetscCallA(PetscLogEventEnd(Lessons,ierr))
2132dfe2926SJacob Faibussowitsch
2142dfe2926SJacob Faibussowitsch         if (role==TEACHER) then
215*f8402805SBarry Smith            PetscCallA(PetscLogEventBegin(TidyClass,ierr))
216*f8402805SBarry Smith            PetscCallA(PetscLogFlops(600000d0,ierr))
217*f8402805SBarry Smith            PetscCallA(PetscSleep(1.2*second, ierr))
218*f8402805SBarry Smith            PetscCallA(PetscLogEventEnd(TidyClass,ierr))
2192dfe2926SJacob Faibussowitsch         else if (role==BOY) then
220*f8402805SBarry Smith            PetscCallA(PetscLogEventBegin(SkipRope,ierr))
221*f8402805SBarry Smith            PetscCallA(PetscSleep(0.8*second, ierr))
222*f8402805SBarry Smith            PetscCallA(PetscLogEventEnd(SkipRope,ierr))
2232dfe2926SJacob Faibussowitsch         else
224*f8402805SBarry Smith            PetscCallA(PetscLogEventBegin(PlayBall,ierr))
225*f8402805SBarry Smith            PetscCallA(PetscSleep(0.9*second, ierr))
226*f8402805SBarry Smith            PetscCallA(PetscLogEventEnd(PlayBall,ierr))
2272dfe2926SJacob Faibussowitsch         end if
2282dfe2926SJacob Faibussowitsch
229*f8402805SBarry Smith         PetscCallA(PetscLogEventBegin(Lessons,ierr))
230*f8402805SBarry Smith         PetscCallA(PetscLogFlops(120000d0,ierr))
231*f8402805SBarry Smith         PetscCallA(PetscSleep(0.7*second, ierr))
232*f8402805SBarry Smith         PetscCallA(PetscLogEventEnd(Lessons,ierr))
2332dfe2926SJacob Faibussowitsch
234*f8402805SBarry Smith      PetscCallA(PetscLogEventEnd(Morning,ierr))
2352dfe2926SJacob Faibussowitsch
2362dfe2926SJacob Faibussowitsch      deallocate(message)
2372dfe2926SJacob Faibussowitsch
238*f8402805SBarry Smith      PetscCallA(PetscFinalize(ierr))
2392dfe2926SJacob Faibussowitsch      end program SchoolDay
2402dfe2926SJacob Faibussowitsch
2412dfe2926SJacob Faibussowitsch!/*TEST
2422dfe2926SJacob Faibussowitsch!
2432dfe2926SJacob Faibussowitsch! testset:
2442dfe2926SJacob Faibussowitsch!   suffix: no_log
2452dfe2926SJacob Faibussowitsch!   requires: !defined(PETSC_USE_LOG)
2462dfe2926SJacob Faibussowitsch!   test:
2472dfe2926SJacob Faibussowitsch!     suffix: ascii
2482dfe2926SJacob Faibussowitsch!     args: -log_view ascii:filename.txt
2492dfe2926SJacob Faibussowitsch!   test:
2502dfe2926SJacob Faibussowitsch!     suffix: detail
2512dfe2926SJacob Faibussowitsch!     args: -log_view ascii:filename.txt:ascii_info_detail
2522dfe2926SJacob Faibussowitsch!   test:
2532dfe2926SJacob Faibussowitsch!     suffix: xml
2542dfe2926SJacob Faibussowitsch!     args: -log_view ascii:filename.xml:ascii_xml
2552dfe2926SJacob Faibussowitsch!
2562dfe2926SJacob Faibussowitsch! testset:
2572dfe2926SJacob Faibussowitsch!   args: -log_view ascii:filename.txt
2582dfe2926SJacob Faibussowitsch!   output_file: output/ex3f90.out
2592dfe2926SJacob Faibussowitsch!   requires: defined(PETSC_USE_LOG)
2602dfe2926SJacob Faibussowitsch!   test:
2612dfe2926SJacob Faibussowitsch!     suffix: 1
2622dfe2926SJacob Faibussowitsch!     nsize: 1
2632dfe2926SJacob Faibussowitsch!   test:
2642dfe2926SJacob Faibussowitsch!     suffix: 2
2652dfe2926SJacob Faibussowitsch!     nsize: 2
2662dfe2926SJacob Faibussowitsch!   test:
2672dfe2926SJacob Faibussowitsch!     suffix: 3
2682dfe2926SJacob Faibussowitsch!     nsize: 3
2692dfe2926SJacob Faibussowitsch!
2702dfe2926SJacob Faibussowitsch! testset:
2712dfe2926SJacob Faibussowitsch!   suffix: detail
2722dfe2926SJacob Faibussowitsch!   args: -log_view ascii:filename.txt:ascii_info_detail
2732dfe2926SJacob Faibussowitsch!   output_file: output/ex3f90.out
2742dfe2926SJacob Faibussowitsch!   requires: defined(PETSC_USE_LOG)
2752dfe2926SJacob Faibussowitsch!   test:
2762dfe2926SJacob Faibussowitsch!     suffix: 1
2772dfe2926SJacob Faibussowitsch!     nsize: 1
2782dfe2926SJacob Faibussowitsch!   test:
2792dfe2926SJacob Faibussowitsch!     suffix: 2
2802dfe2926SJacob Faibussowitsch!     nsize: 2
2812dfe2926SJacob Faibussowitsch!   test:
2822dfe2926SJacob Faibussowitsch!     suffix: 3
2832dfe2926SJacob Faibussowitsch!     nsize: 3
2842dfe2926SJacob Faibussowitsch!
2852dfe2926SJacob Faibussowitsch! testset:
2862dfe2926SJacob Faibussowitsch!   suffix: xml
2872dfe2926SJacob Faibussowitsch!   args: -log_view ascii:filename.xml:ascii_xml
2882dfe2926SJacob Faibussowitsch!   output_file: output/ex3f90.out
2892dfe2926SJacob Faibussowitsch!   requires: defined(PETSC_USE_LOG)
2902dfe2926SJacob Faibussowitsch!   test:
2912dfe2926SJacob Faibussowitsch!     suffix: 1
2922dfe2926SJacob Faibussowitsch!     nsize: 1
2932dfe2926SJacob Faibussowitsch!   test:
2942dfe2926SJacob Faibussowitsch!     suffix: 2
2952dfe2926SJacob Faibussowitsch!     nsize: 2
2962dfe2926SJacob Faibussowitsch!   test:
2972dfe2926SJacob Faibussowitsch!     suffix: 3
2982dfe2926SJacob Faibussowitsch!     nsize: 3
2992dfe2926SJacob Faibussowitsch!
3002dfe2926SJacob Faibussowitsch!TEST*/
301