xref: /petsc/src/sys/tutorials/ex3f90.F90 (revision cb9ef012bfbb6ad62d979c01e30be5766f6ea67d)
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
39*cb9ef012SToby Isaac      integer(c_int)               msgLen_c_int
402dfe2926SJacob Faibussowitsch
412dfe2926SJacob Faibussowitsch      ! Own stuff
422dfe2926SJacob Faibussowitsch      integer4                  :: role                 ! is this process a BOY, a GIRL or a TEACHER?
432dfe2926SJacob Faibussowitsch      integer4                  :: i, j
442dfe2926SJacob Faibussowitsch      integer4,parameter        :: one=1
45f8402805SBarry Smith
462dfe2926SJacob Faibussowitsch!     Initializations
47d8606c27SBarry Smith      PetscCallA( PetscInitialize(ierr))
48f8402805SBarry Smith      PetscCallMPIA(MPI_Comm_size(PETSC_COMM_WORLD, size,ierr))
49f8402805SBarry Smith      PetscCallMPIA(MPI_Comm_rank(PETSC_COMM_WORLD, rank,ierr))
502dfe2926SJacob Faibussowitsch
512dfe2926SJacob Faibussowitsch      if (rank==0) then
522dfe2926SJacob Faibussowitsch         role = TEACHER
532dfe2926SJacob Faibussowitsch      else if (rank<0.4*size) then
542dfe2926SJacob Faibussowitsch         role = GIRL
552dfe2926SJacob Faibussowitsch      else
562dfe2926SJacob Faibussowitsch         role = BOY
572dfe2926SJacob Faibussowitsch      end if
582dfe2926SJacob Faibussowitsch
592dfe2926SJacob Faibussowitsch      allocate(message(msgLen,msglen))
602dfe2926SJacob Faibussowitsch      do i = 1,msgLen
612dfe2926SJacob Faibussowitsch         do j  = 1,msgLen
622dfe2926SJacob Faibussowitsch            message(i,j) = 10.0*j + i*1.0/(rank+one)
632dfe2926SJacob Faibussowitsch         end do
642dfe2926SJacob Faibussowitsch      end do
652dfe2926SJacob Faibussowitsch!
662dfe2926SJacob Faibussowitsch!     Create new user-defined events
672dfe2926SJacob Faibussowitsch      classid = 0
68f8402805SBarry Smith      PetscCallA(PetscLogEventRegister('Morning',         classid, Morning,   ierr))
69f8402805SBarry Smith      PetscCallA(PetscLogEventRegister('Afternoon',       classid, Afternoon, ierr))
70f8402805SBarry Smith      PetscCallA(PetscLogEventRegister('Play Ball',       classid, PlayBall,  ierr))
71f8402805SBarry Smith      PetscCallA(PetscLogEventRegister('Skip Rope',       classid, SkipRope,  ierr))
72f8402805SBarry Smith      PetscCallA(PetscLogEventRegister('Tidy Classroom',  classid, TidyClass, ierr))
73f8402805SBarry Smith      PetscCallA(PetscLogEventRegister('Lessons',         classid, Lessons,   ierr))
74f8402805SBarry Smith      PetscCallA(PetscLogEventRegister('Correct Homework',classid,CorrectHomework,ierr))
752dfe2926SJacob Faibussowitsch      if (verbose>=1) then
762dfe2926SJacob Faibussowitsch        print '(a,i0,a)','[',rank,'] SchoolDay events have been defined'
772dfe2926SJacob Faibussowitsch      endif
782dfe2926SJacob Faibussowitsch
792dfe2926SJacob Faibussowitsch!     Go through the school day
80f8402805SBarry Smith      PetscCallA(PetscLogEventBegin(Morning,ierr))
812dfe2926SJacob Faibussowitsch
82f8402805SBarry Smith         PetscCallA(PetscLogFlops(190000d0,ierr))
83f8402805SBarry Smith         PetscCallA(PetscSleep(0.5*second,ierr))
842dfe2926SJacob Faibussowitsch
85f8402805SBarry Smith         PetscCallA(PetscLogEventBegin(Lessons,ierr))
86f8402805SBarry Smith         PetscCallA(PetscLogFlops(23000d0,ierr))
87f8402805SBarry Smith         PetscCallA(PetscSleep(1*second, ierr))
882dfe2926SJacob Faibussowitsch         if (size>1) then
89d8606c27SBarry Smith           PetscCallMPIA(MPI_Isend( message, msgLen, MPI_DOUBLE_PRECISION,mod(rank+1,size),tagMsg+rank, PETSC_COMM_WORLD, req, ierr))
90d8606c27SBarry 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))
91f8402805SBarry Smith           PetscCallMPIA(MPI_Wait(req,MPI_STATUS_IGNORE,ierr))
92*cb9ef012SToby Isaac           msgLen_c_int = msgLen
93*cb9ef012SToby Isaac           ierr = PetscASend(msgLen_c_int, MPI_DOUBLE_PRECISION)
94*cb9ef012SToby Isaac           ierr = PetscARecv(msgLen_c_int, MPI_DOUBLE_PRECISION)
952dfe2926SJacob Faibussowitsch         end if
96f8402805SBarry Smith         PetscCallA(PetscLogEventEnd(Lessons,ierr))
972dfe2926SJacob Faibussowitsch
982dfe2926SJacob Faibussowitsch         if (role==TEACHER) then
99f8402805SBarry Smith            PetscCallA(PetscLogEventBegin(TidyClass,ierr))
100f8402805SBarry Smith            PetscCallA(PetscLogFlops(600000d0,ierr))
101f8402805SBarry Smith            PetscCallA(PetscSleep(0.6*second, ierr))
102f8402805SBarry Smith               PetscCallA(PetscLogEventBegin(CorrectHomework,ierr))
103f8402805SBarry Smith               PetscCallA(PetscLogFlops(234700d0,ierr))
104f8402805SBarry Smith               PetscCallA(PetscSleep(0.4*second, ierr))
105f8402805SBarry Smith               PetscCallA(PetscLogEventEnd(CorrectHomework,ierr))
106f8402805SBarry Smith            PetscCallA(PetscLogEventEnd(TidyClass,ierr))
1072dfe2926SJacob Faibussowitsch         else if (role==BOY) then
108f8402805SBarry Smith            PetscCallA(PetscLogEventBegin(SkipRope,ierr))
109f8402805SBarry Smith            PetscCallA(PetscSleep(0.8*second, ierr))
110f8402805SBarry Smith            PetscCallA(PetscLogEventEnd(SkipRope,ierr))
1112dfe2926SJacob Faibussowitsch         else
112f8402805SBarry Smith            PetscCallA(PetscLogEventBegin(PlayBall,ierr))
113f8402805SBarry Smith            PetscCallA(PetscSleep(0.9*second, ierr))
114f8402805SBarry Smith            PetscCallA(PetscLogEventEnd(PlayBall,ierr))
1152dfe2926SJacob Faibussowitsch         end if
1162dfe2926SJacob Faibussowitsch
117f8402805SBarry Smith         PetscCallA(PetscLogEventBegin(Lessons,ierr))
118f8402805SBarry Smith         PetscCallA(PetscLogFlops(120000d0,ierr))
119f8402805SBarry Smith         PetscCallA(PetscSleep(0.7*second, ierr))
120f8402805SBarry Smith         PetscCallA(PetscLogEventEnd(Lessons,ierr))
1212dfe2926SJacob Faibussowitsch
122f8402805SBarry Smith      PetscCallA(PetscLogEventEnd(Morning,ierr))
1232dfe2926SJacob Faibussowitsch
124f8402805SBarry Smith      PetscCallA(PetscLogEventBegin(Afternoon,ierr))
1252dfe2926SJacob Faibussowitsch
1262dfe2926SJacob Faibussowitsch         item = rank*(3-rank)
127f8402805SBarry Smith         PetscCallMPIA(MPI_Allreduce(item, maxItem, 1, MPI_INTEGER, MPI_MAX,PETSC_COMM_WORLD, ierr))
128*cb9ef012SToby Isaac         ierr = PetscAReduce()
1292dfe2926SJacob Faibussowitsch
1302dfe2926SJacob Faibussowitsch         item = rank*(10-rank)
131f8402805SBarry Smith         PetscCallMPIA(MPI_Allreduce(item, maxItem, 1, MPI_INTEGER, MPI_MAX,PETSC_COMM_WORLD, ierr))
132*cb9ef012SToby Isaac         ierr = PetscAReduce()
1332dfe2926SJacob Faibussowitsch
134f8402805SBarry Smith         PetscCallA(PetscLogFlops(58988d0,ierr))
135f8402805SBarry Smith         PetscCallA(PetscSleep(0.6*second,ierr))
1362dfe2926SJacob Faibussowitsch
137f8402805SBarry Smith         PetscCallA(PetscLogEventBegin(Lessons,ierr))
138f8402805SBarry Smith         PetscCallA(PetscLogFlops(123456d0,ierr))
139f8402805SBarry Smith         PetscCallA(PetscSleep(1*second, ierr))
140f8402805SBarry Smith         PetscCallA(PetscLogEventEnd(Lessons,ierr))
1412dfe2926SJacob Faibussowitsch
1422dfe2926SJacob Faibussowitsch         if (role==TEACHER) then
143f8402805SBarry Smith            PetscCallA(PetscLogEventBegin(TidyClass,ierr))
144f8402805SBarry Smith            PetscCallA(PetscLogFlops(17800d0,ierr))
145f8402805SBarry Smith            PetscCallA(PetscSleep(1.1*second, ierr))
146f8402805SBarry Smith            PetscCallA(PetscLogEventBegin(Lessons,ierr))
147f8402805SBarry Smith            PetscCallA(PetscLogFlops(72344d0,ierr))
148f8402805SBarry Smith            PetscCallA(PetscSleep(0.5*second, ierr))
149f8402805SBarry Smith            PetscCallA(PetscLogEventEnd(Lessons,ierr))
150f8402805SBarry Smith            PetscCallA(PetscLogEventEnd(TidyClass,ierr))
1512dfe2926SJacob Faibussowitsch         else if (role==GIRL) then
152f8402805SBarry Smith            PetscCallA(PetscLogEventBegin(SkipRope,ierr))
153f8402805SBarry Smith            PetscCallA(PetscSleep(0.7*second, ierr))
154f8402805SBarry Smith            PetscCallA(PetscLogEventEnd(SkipRope,ierr))
1552dfe2926SJacob Faibussowitsch         else
156f8402805SBarry Smith            PetscCallA(PetscLogEventBegin(PlayBall,ierr))
157f8402805SBarry Smith            PetscCallA(PetscSleep(0.8*second, ierr))
158f8402805SBarry Smith            PetscCallA(PetscLogEventEnd(PlayBall,ierr))
1592dfe2926SJacob Faibussowitsch         end if
1602dfe2926SJacob Faibussowitsch
161f8402805SBarry Smith         PetscCallA(PetscLogEventBegin(Lessons,ierr))
162f8402805SBarry Smith         PetscCallA(PetscLogFlops(72344d0,ierr))
163f8402805SBarry Smith         PetscCallA(PetscSleep(0.5*second, ierr))
164f8402805SBarry Smith         PetscCallA(PetscLogEventEnd(Lessons,ierr))
1652dfe2926SJacob Faibussowitsch
166f8402805SBarry Smith      PetscCallA(PetscLogEventEnd(Afternoon,ierr))
1672dfe2926SJacob Faibussowitsch
1682dfe2926SJacob Faibussowitsch      if (.false.) then
1692dfe2926SJacob Faibussowitsch         continue
1702dfe2926SJacob Faibussowitsch      else if (role==TEACHER) then
171f8402805SBarry Smith         PetscCallA(PetscLogEventBegin(TidyClass,ierr))
172f8402805SBarry Smith         PetscCallA(PetscLogFlops(612300d0,ierr))
173f8402805SBarry Smith         PetscCallA(PetscSleep(1.1*second, ierr))
174f8402805SBarry Smith         PetscCallA(PetscLogEventEnd(TidyClass,ierr))
175f8402805SBarry Smith         PetscCallA(PetscLogEventBegin(CorrectHomework,ierr))
176f8402805SBarry Smith         PetscCallA(PetscLogFlops(234700d0,ierr))
177f8402805SBarry Smith         PetscCallA(PetscSleep(1.1*second, ierr))
178f8402805SBarry Smith         PetscCallA(PetscLogEventEnd(CorrectHomework,ierr))
1792dfe2926SJacob Faibussowitsch      else
180f8402805SBarry Smith         PetscCallA(PetscLogEventBegin(SkipRope,ierr))
181f8402805SBarry Smith         PetscCallA(PetscSleep(0.7*second, ierr))
182f8402805SBarry Smith         PetscCallA(PetscLogEventEnd(SkipRope,ierr))
183f8402805SBarry Smith         PetscCallA(PetscLogEventBegin(PlayBall,ierr))
184f8402805SBarry Smith         PetscCallA(PetscSleep(0.8*second, ierr))
185f8402805SBarry Smith         PetscCallA(PetscLogEventEnd(PlayBall,ierr))
1862dfe2926SJacob Faibussowitsch      end if
1872dfe2926SJacob Faibussowitsch
188f8402805SBarry Smith      PetscCallA(PetscLogEventBegin(Lessons,ierr))
189f8402805SBarry Smith      PetscCallA(PetscLogFlops(120000d0,ierr))
190f8402805SBarry Smith      PetscCallA(PetscSleep(0.7*second, ierr))
191f8402805SBarry Smith      PetscCallA(PetscLogEventEnd(Lessons,ierr))
1922dfe2926SJacob Faibussowitsch
193f8402805SBarry Smith      PetscCallA(PetscSleep(0.25*second,ierr))
1942dfe2926SJacob Faibussowitsch
195f8402805SBarry Smith      PetscCallA(PetscLogEventBegin(Morning,ierr))
1962dfe2926SJacob Faibussowitsch
197f8402805SBarry Smith         PetscCallA(PetscLogFlops(190000d0,ierr))
198f8402805SBarry Smith         PetscCallA(PetscSleep(0.5*second,ierr))
1992dfe2926SJacob Faibussowitsch
200f8402805SBarry Smith         PetscCallA(PetscLogEventBegin(Lessons,ierr))
201f8402805SBarry Smith         PetscCallA(PetscLogFlops(23000d0,ierr))
202f8402805SBarry Smith         PetscCallA(PetscSleep(1*second, ierr))
2032dfe2926SJacob Faibussowitsch         if (size>1) then
204d8606c27SBarry Smith           PetscCallMPIA(MPI_Isend( message, msgLen, MPI_DOUBLE_PRECISION,mod(rank+1,size),tagMsg+rank, PETSC_COMM_WORLD, req, ierr))
205d8606c27SBarry 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))
206f8402805SBarry Smith           PetscCallMPIA(MPI_Wait(req,MPI_STATUS_IGNORE,ierr))
207*cb9ef012SToby Isaac           msgLen_c_int = msgLen
208*cb9ef012SToby Isaac           ierr = PetscASend(msgLen_c_int, MPI_DOUBLE_PRECISION)
209*cb9ef012SToby Isaac           ierr = PetscARecv(msgLen_c_int, MPI_DOUBLE_PRECISION)
2102dfe2926SJacob Faibussowitsch         end if
211f8402805SBarry Smith         PetscCallA(PetscLogEventEnd(Lessons,ierr))
2122dfe2926SJacob Faibussowitsch
2132dfe2926SJacob Faibussowitsch         if (role==TEACHER) then
214f8402805SBarry Smith            PetscCallA(PetscLogEventBegin(TidyClass,ierr))
215f8402805SBarry Smith            PetscCallA(PetscLogFlops(600000d0,ierr))
216f8402805SBarry Smith            PetscCallA(PetscSleep(1.2*second, ierr))
217f8402805SBarry Smith            PetscCallA(PetscLogEventEnd(TidyClass,ierr))
2182dfe2926SJacob Faibussowitsch         else if (role==BOY) then
219f8402805SBarry Smith            PetscCallA(PetscLogEventBegin(SkipRope,ierr))
220f8402805SBarry Smith            PetscCallA(PetscSleep(0.8*second, ierr))
221f8402805SBarry Smith            PetscCallA(PetscLogEventEnd(SkipRope,ierr))
2222dfe2926SJacob Faibussowitsch         else
223f8402805SBarry Smith            PetscCallA(PetscLogEventBegin(PlayBall,ierr))
224f8402805SBarry Smith            PetscCallA(PetscSleep(0.9*second, ierr))
225f8402805SBarry Smith            PetscCallA(PetscLogEventEnd(PlayBall,ierr))
2262dfe2926SJacob Faibussowitsch         end if
2272dfe2926SJacob Faibussowitsch
228f8402805SBarry Smith         PetscCallA(PetscLogEventBegin(Lessons,ierr))
229f8402805SBarry Smith         PetscCallA(PetscLogFlops(120000d0,ierr))
230f8402805SBarry Smith         PetscCallA(PetscSleep(0.7*second, ierr))
231f8402805SBarry Smith         PetscCallA(PetscLogEventEnd(Lessons,ierr))
2322dfe2926SJacob Faibussowitsch
233f8402805SBarry Smith      PetscCallA(PetscLogEventEnd(Morning,ierr))
2342dfe2926SJacob Faibussowitsch
2352dfe2926SJacob Faibussowitsch      deallocate(message)
2362dfe2926SJacob Faibussowitsch
237f8402805SBarry Smith      PetscCallA(PetscFinalize(ierr))
2382dfe2926SJacob Faibussowitsch      end program SchoolDay
2392dfe2926SJacob Faibussowitsch
2402dfe2926SJacob Faibussowitsch!/*TEST
2412dfe2926SJacob Faibussowitsch!
2422dfe2926SJacob Faibussowitsch! testset:
2432dfe2926SJacob Faibussowitsch!   suffix: no_log
2442dfe2926SJacob Faibussowitsch!   requires: !defined(PETSC_USE_LOG)
2452dfe2926SJacob Faibussowitsch!   test:
2462dfe2926SJacob Faibussowitsch!     suffix: ascii
247758f5028SMatthew G. Knepley!     args: -log_view ascii:filename.txt -log_all
2482dfe2926SJacob Faibussowitsch!   test:
2492dfe2926SJacob Faibussowitsch!     suffix: detail
2502dfe2926SJacob Faibussowitsch!     args: -log_view ascii:filename.txt:ascii_info_detail
2512dfe2926SJacob Faibussowitsch!   test:
2522dfe2926SJacob Faibussowitsch!     suffix: xml
2532dfe2926SJacob Faibussowitsch!     args: -log_view ascii:filename.xml:ascii_xml
2542dfe2926SJacob Faibussowitsch!
2552dfe2926SJacob Faibussowitsch! testset:
2562dfe2926SJacob Faibussowitsch!   args: -log_view ascii:filename.txt
2572dfe2926SJacob Faibussowitsch!   output_file: output/ex3f90.out
2582dfe2926SJacob Faibussowitsch!   requires: defined(PETSC_USE_LOG)
2592dfe2926SJacob Faibussowitsch!   test:
2602dfe2926SJacob Faibussowitsch!     suffix: 1
2612dfe2926SJacob Faibussowitsch!     nsize: 1
2622dfe2926SJacob Faibussowitsch!   test:
2632dfe2926SJacob Faibussowitsch!     suffix: 2
2642dfe2926SJacob Faibussowitsch!     nsize: 2
2652dfe2926SJacob Faibussowitsch!   test:
2662dfe2926SJacob Faibussowitsch!     suffix: 3
2672dfe2926SJacob Faibussowitsch!     nsize: 3
2682dfe2926SJacob Faibussowitsch!
2692dfe2926SJacob Faibussowitsch! testset:
2702dfe2926SJacob Faibussowitsch!   suffix: detail
2712dfe2926SJacob Faibussowitsch!   args: -log_view ascii:filename.txt:ascii_info_detail
2722dfe2926SJacob Faibussowitsch!   output_file: output/ex3f90.out
2732dfe2926SJacob Faibussowitsch!   requires: defined(PETSC_USE_LOG)
2742dfe2926SJacob Faibussowitsch!   test:
2752dfe2926SJacob Faibussowitsch!     suffix: 1
2762dfe2926SJacob Faibussowitsch!     nsize: 1
2772dfe2926SJacob Faibussowitsch!   test:
2782dfe2926SJacob Faibussowitsch!     suffix: 2
2792dfe2926SJacob Faibussowitsch!     nsize: 2
2802dfe2926SJacob Faibussowitsch!   test:
2812dfe2926SJacob Faibussowitsch!     suffix: 3
2822dfe2926SJacob Faibussowitsch!     nsize: 3
2832dfe2926SJacob Faibussowitsch!
2842dfe2926SJacob Faibussowitsch! testset:
2852dfe2926SJacob Faibussowitsch!   suffix: xml
2862dfe2926SJacob Faibussowitsch!   args: -log_view ascii:filename.xml:ascii_xml
2872dfe2926SJacob Faibussowitsch!   output_file: output/ex3f90.out
2882dfe2926SJacob Faibussowitsch!   requires: defined(PETSC_USE_LOG)
2892dfe2926SJacob Faibussowitsch!   test:
2902dfe2926SJacob Faibussowitsch!     suffix: 1
2912dfe2926SJacob Faibussowitsch!     nsize: 1
2922dfe2926SJacob Faibussowitsch!   test:
2932dfe2926SJacob Faibussowitsch!     suffix: 2
2942dfe2926SJacob Faibussowitsch!     nsize: 2
2952dfe2926SJacob Faibussowitsch!   test:
2962dfe2926SJacob Faibussowitsch!     suffix: 3
2972dfe2926SJacob Faibussowitsch!     nsize: 3
2982dfe2926SJacob Faibussowitsch!
2992dfe2926SJacob Faibussowitsch!TEST*/
300