Ignore:
Timestamp:
Jun 5, 2019 1:25:35 PM (2 years ago)
Author:
raasch
Message:

all reals changed to double precision in order to work with 32-bit working precision, otherwise calculated time intervals would mostly give zero; variable child_domain_nvn eliminated

File:
1 edited

Legend:

Unmodified
Added
Removed
  • palm/trunk/SOURCE/cpulog_mod.f90

    r3885 r4015  
    2525! -----------------
    2626! $Id$
     27! all reals changed to double precision in order to work with 32-bit working precision,
     28! otherwise calculated time intervals would mostly give zero
     29!
     30! 3885 2019-04-11 11:29:34Z kanani
    2731! Changes related to global restructuring of location messages and introduction
    2832! of additional debug messages
     
    151155 
    152156
    153     USE control_parameters,                                                    &
    154         ONLY: message_string, nr_timesteps_this_run, run_description_header,   &
    155               synchronous_exchange
     157    USE control_parameters,                                                                        &
     158        ONLY: message_string, nr_timesteps_this_run, run_description_header, synchronous_exchange
    156159               
    157     USE indices,                                                               &
     160    USE indices,                                                                                   &
    158161        ONLY: ngp_3d, nx, ny, nz
    159162       
     
    165168
    166169    PRIVATE
    167     PUBLIC   cpu_log, cpu_log_barrierwait, cpu_log_nowait, cpu_statistics,     &
    168              initial_wallclock_time, log_point, log_point_s
     170    PUBLIC   cpu_log, cpu_log_barrierwait, cpu_log_nowait, cpu_statistics, initial_wallclock_time, &
     171             log_point, log_point_s
    169172
    170173    INTERFACE cpu_log
     
    184187    LOGICAL, PARAMETER ::  cpu_log_nowait = .FALSE.       !<
    185188
    186     REAL(wp) ::  initial_wallclock_time  !<
     189    REAL(dp) ::  initial_wallclock_time  !<
    187190
    188191    TYPE logpoint
    189        REAL(wp)           ::  isum       !<
    190        REAL(wp)           ::  ivect      !<
    191        REAL(wp)           ::  mean       !<
    192        REAL(wp)           ::  mtime      !<
    193        REAL(wp)           ::  mtimevec   !<
    194        REAL(wp)           ::  sum        !<
    195        REAL(wp)           ::  vector     !<
     192       REAL(dp)           ::  isum       !<
     193       REAL(dp)           ::  ivect      !<
     194       REAL(dp)           ::  mean       !<
     195       REAL(dp)           ::  mtime      !<
     196       REAL(dp)           ::  mtimevec   !<
     197       REAL(dp)           ::  sum        !<
     198       REAL(dp)           ::  vector     !<
    196199       INTEGER(iwp)       ::  counts     !<
    197200       CHARACTER (LEN=25) ::  place      !<
    198201    END TYPE logpoint
    199202
    200     TYPE(logpoint), DIMENSION(100) ::  log_point = logpoint( 0.0_wp, 0.0_wp,   &
    201                                        0.0_wp, 0.0_wp, 0.0_wp, 0.0_wp, 0.0_wp, &
    202                                        0, ' ' )
    203     TYPE(logpoint), DIMENSION(100) ::  log_point_s = logpoint( 0.0_wp, 0.0_wp, &
    204                                        0.0_wp, 0.0_wp, 0.0_wp, 0.0_wp, 0.0_wp, &
    205                                        0, ' ' )
     203    TYPE(logpoint), DIMENSION(100) ::  log_point = logpoint( 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp,       &
     204                                                             0.0_dp, 0.0_dp, 0.0_dp, 0, ' ' )
     205    TYPE(logpoint), DIMENSION(100) ::  log_point_s = logpoint( 0.0_dp, 0.0_dp, 0.0_dp, 0.0_dp,     &
     206                                                               0.0_dp, 0.0_dp, 0.0_dp, 0, ' ' )
    206207
    207208    SAVE
     
    225226       LOGICAL, SAVE     ::  first = .TRUE.     !<
    226227       
    227        REAL(wp)          ::  mtime = 0.0_wp     !<
    228        REAL(wp)          ::  mtimevec = 0.0_wp  !<
     228       REAL(dp)          ::  mtime = 0.0_dp     !<
     229       REAL(dp)          ::  mtimevec = 0.0_dp  !<
    229230       TYPE(logpoint)    ::  log_event          !<
    230231
     
    238239          log_event%place = place
    239240       ELSEIF ( log_event%place /= place )  THEN
    240           WRITE( message_string, * ) 'wrong argument expected: ',              &
    241                             TRIM(log_event%place), ' given: ',  TRIM( place )
     241          WRITE( message_string, * ) 'wrong argument expected: ',                                  &
     242                                     TRIM(log_event%place), ' given: ',  TRIM( place )
    242243          CALL message( 'cpu_log', 'PA0174', 1, 2, 0, 6, 0 )
    243244       ENDIF
     
    256257!--    PEs that have not yet finished
    257258#if defined( __parallel )
    258        IF ( cpu_log_barrierwait  .AND.  wait_allowed  .AND.                    &
     259       IF ( cpu_log_barrierwait  .AND.  wait_allowed  .AND.                                        &
    259260            ( modus == 'start'  .OR.  modus == 'continue' ) )  THEN
    260261          CALL MPI_BARRIER( comm2d, ierr )
     
    265266!--    Take current time
    266267       CALL SYSTEM_CLOCK( count, count_rate )
    267        mtime = REAL( count, KIND=wp ) / REAL( count_rate, KIND=wp )
     268       mtime = REAL( count, KIND=dp ) / REAL( count_rate, KIND=dp )
    268269
    269270!
     
    274275       ELSEIF ( modus == 'pause' )  THEN
    275276          IF ( ( mtime - log_event%mtime ) < 0.0  .AND.  first )  THEN
    276              WRITE( message_string, * ) 'negative time interval occured',      &
    277                          '&PE',myid,' L=PAUSE "',TRIM(log_event%place),        &
    278                          '" new=', mtime,' last=',log_event%mtime
     277             WRITE( message_string, * ) 'negative time interval occured',                          &
     278                                        '&PE',myid,' L=PAUSE "',TRIM(log_event%place),             &
     279                                        '" new=', mtime,' last=',log_event%mtime
    279280             CALL message( 'cpu_log', 'PA0176', 0, 1, -1, 6, 0 )
    280281             first = .FALSE.
     
    283284          log_event%ivect    = log_event%ivect  + mtimevec - log_event%mtimevec
    284285       ELSEIF ( modus == 'stop' )  THEN
    285           IF ( ( mtime - log_event%mtime + log_event%isum ) < 0.0  .AND.       &
    286                first )  THEN
    287              WRITE( message_string, * ) 'negative time interval occured',      &
    288                        '&PE',myid,' L=STOP "',TRIM(log_event%place),'" new=',  &
    289                        mtime,' last=',log_event%mtime,' isum=',log_event%isum
     286          IF ( ( mtime - log_event%mtime + log_event%isum ) < 0.0  .AND. first )  THEN
     287             WRITE( message_string, * ) 'negative time interval occured',                          &
     288                                        '&PE',myid,' L=STOP "',TRIM(log_event%place),'" new=',     &
     289                                        mtime,' last=',log_event%mtime,' isum=',log_event%isum
    290290             CALL message( 'cpu_log', 'PA0177', 0, 1, -1, 6, 0 )
    291291             first = .FALSE.
     
    295295          log_event%sum      = log_event%sum  + log_event%mtime
    296296          IF ( log_event%sum < 0.0  .AND.  first )  THEN
    297              WRITE( message_string, * ) 'negative time interval occured',      &
    298                        '&PE',myid,' L=STOP "',TRIM(log_event%place),'" sum=',  &
    299                        log_event%sum,' mtime=',log_event%mtime
     297             WRITE( message_string, * ) 'negative time interval occured',                          &
     298                                        '&PE',myid,' L=STOP "',TRIM(log_event%place),'" sum=',     &
     299                                        log_event%sum,' mtime=',log_event%mtime
    300300             CALL message( 'cpu_log', 'PA0178', 0, 1, -1, 6, 0 )
    301301             first = .FALSE.
     
    303303          log_event%vector   = log_event%vector + log_event%mtimevec
    304304          log_event%counts   = log_event%counts + 1
    305           log_event%isum     = 0.0_wp
    306           log_event%ivect    = 0.0_wp
     305          log_event%isum     = 0.0_dp
     306          log_event%ivect    = 0.0_dp
    307307       ELSE
    308           message_string = 'unknown modus of time measurement: ' //            &
    309                            TRIM( modus )
     308          message_string = 'unknown modus of time measurement: ' // TRIM( modus )
    310309          CALL message( 'cpu_log', 'PA0179', 0, 1, -1, 6, 0 )
    311310       ENDIF
     
    331330       INTEGER(iwp)    ::  iii             !<
    332331       INTEGER(iwp)    ::  sender          !<
    333        REAL(wp)       ::  average_cputime  !<
    334        REAL(wp), SAVE ::  norm = 1.0_wp    !<
    335        REAL(wp), DIMENSION(:),   ALLOCATABLE ::  pe_max        !<
    336        REAL(wp), DIMENSION(:),   ALLOCATABLE ::  pe_min        !<
    337        REAL(wp), DIMENSION(:),   ALLOCATABLE ::  pe_rms        !<
    338        REAL(wp), DIMENSION(:),   ALLOCATABLE ::  pe_tmp        !<
    339        REAL(wp), DIMENSION(:),   ALLOCATABLE ::  sum           !<
    340        REAL(wp), DIMENSION(:,:), ALLOCATABLE ::  pe_log_points !<
     332       REAL(dp)       ::  average_cputime  !<
     333       REAL(dp), SAVE ::  norm = 1.0_dp    !<
     334       REAL(dp), DIMENSION(:),   ALLOCATABLE ::  pe_max        !<
     335       REAL(dp), DIMENSION(:),   ALLOCATABLE ::  pe_min        !<
     336       REAL(dp), DIMENSION(:),   ALLOCATABLE ::  pe_rms        !<
     337       REAL(dp), DIMENSION(:),   ALLOCATABLE ::  pe_tmp        !<
     338       REAL(dp), DIMENSION(:),   ALLOCATABLE ::  sum           !<
     339       REAL(dp), DIMENSION(:,:), ALLOCATABLE ::  pe_log_points !<
    341340
    342341
     
    358357!
    359358!--       Allocate and initialize temporary arrays needed for statistics
    360           ALLOCATE( pe_max( SIZE( log_point ) ), pe_min( SIZE( log_point ) ),  &
    361                     pe_rms( SIZE( log_point ) ), pe_tmp( SIZE( log_point ) ),  &
     359          ALLOCATE( pe_max( SIZE( log_point ) ), pe_min( SIZE( log_point ) ),                      &
     360                    pe_rms( SIZE( log_point ) ), pe_tmp( SIZE( log_point ) ),                      &
    362361                    pe_log_points( SIZE( log_point ), 0:numprocs-1 ) )
    363362          pe_min = log_point%sum
    364363          pe_max = log_point%sum    ! need to be set in case of 1 PE
    365           pe_rms = 0.0_wp
    366           pe_tmp = 0.0_wp
     364          pe_rms = 0.0_dp
     365          pe_tmp = 0.0_dp
    367366
    368367#if defined( __parallel )
     
    370369!--       Receive data from all PEs
    371370          DO  i = 1, numprocs-1
    372              CALL MPI_RECV( pe_tmp(1), SIZE( log_point ), MPI_REAL,            &
    373                             i, i, comm2d, status, ierr )
     371             CALL MPI_RECV( pe_tmp(1), SIZE( log_point ), MPI_DOUBLE_PRECISION, i, i, comm2d,      &
     372                            status, ierr )
    374373             sender = status(MPI_SOURCE)
    375374             pe_log_points(:,sender) = pe_tmp
     
    389388!--          Calculate rms
    390389             DO  i = 0, numprocs-1
    391                 pe_rms(iii) = pe_rms(iii) + (                                  &
    392                                     pe_log_points(iii,i) - log_point(iii)%sum  &
    393                                             )**2
     390                pe_rms(iii) = pe_rms(iii) + ( pe_log_points(iii,i) - log_point(iii)%sum )**2
    394391             ENDDO
    395392             pe_rms(iii) = SQRT( pe_rms(iii) / numprocs )
     
    401398          ALLOCATE( pe_max( SIZE( log_point ) ) )
    402399          pe_max = log_point%sum
    403           CALL MPI_SEND( pe_max(1), SIZE( log_point ), MPI_REAL, 0, myid,      &
    404                          comm2d, ierr )
     400          CALL MPI_SEND( pe_max(1), SIZE( log_point ), MPI_DOUBLE_PRECISION, 0, myid, comm2d, ierr )
    405401#endif
    406402
     
    416412             sum = log_point%sum
    417413          ELSEWHERE
    418              sum = -1.0_wp
     414             sum = -1.0_dp
    419415          ENDWHERE
    420416
     
    423419!--       timestep
    424420          IF ( nr_timesteps_this_run /= 0 )  THEN
    425              average_cputime = log_point(1)%sum / REAL( ngp_3d(0), KIND=wp ) / &
    426                                REAL( nr_timesteps_this_run, KIND=wp ) * 1E6_wp
    427                                ! in micro-sec
     421             average_cputime = log_point(1)%sum / REAL( ngp_3d(0), KIND=dp ) /                     &
     422                               REAL( nr_timesteps_this_run, KIND=dp ) * 1E6_dp     ! in micro-sec
    428423          ELSE
    429              average_cputime = -1.0_wp
     424             average_cputime = -1.0_dp
    430425          ENDIF
    431426
     
    434429          CALL check_open( 18 )
    435430#if defined( __parallel )
    436           WRITE ( 18, 100 )  TRIM( run_description_header ),                   &
    437                              numprocs * threads_per_task, pdims(1), pdims(2),  &
    438                              threads_per_task, nx+1, ny+1, nz,                 &
     431          WRITE ( 18, 100 )  TRIM( run_description_header ), numprocs * threads_per_task,          &
     432                             pdims(1), pdims(2), threads_per_task, nx+1, ny+1, nz,                 &
    439433                             nr_timesteps_this_run, average_cputime
    440434
    441435          WRITE ( 18, 110 )
    442436#else
    443           WRITE ( 18, 100 )  TRIM( run_description_header ),                   &
    444                              numprocs * threads_per_task, 1, 1,                &
    445                              threads_per_task, nx+1, ny+1, nz,                 &
    446                              nr_timesteps_this_run, average_cputime
     437          WRITE ( 18, 100 )  TRIM( run_description_header ), numprocs * threads_per_task, 1, 1,    &
     438                             threads_per_task, nx+1, ny+1, nz, nr_timesteps_this_run,              &
     439                             average_cputime
    447440
    448441          WRITE ( 18, 110 )
     
    451444             ii = MAXLOC( sum )
    452445             i = ii(1)
    453              IF ( sum(i) /= -1.0_wp )  THEN
    454                 WRITE ( 18, 102 ) &
    455               log_point(i)%place, log_point(i)%sum,                            &
    456                    log_point(i)%sum / log_point(1)%sum * 100.0_wp,             &
    457                    log_point(i)%counts, pe_min(i), pe_max(i), pe_rms(i)
    458                 sum(i) = -1.0_wp
     446             IF ( sum(i) /= -1.0_dp )  THEN
     447                WRITE ( 18, 102 )  log_point(i)%place, log_point(i)%sum,                           &
     448                                   log_point(i)%sum / log_point(1)%sum * 100.0_dp,                 &
     449                                   log_point(i)%counts, pe_min(i), pe_max(i), pe_rms(i)
     450                sum(i) = -1.0_dp
    459451             ELSE
    460452                EXIT
     
    488480          pe_min = log_point_s%sum
    489481          pe_max = log_point_s%sum    ! need to be set in case of 1 PE
    490           pe_rms = 0.0_wp
     482          pe_rms = 0.0_dp
    491483
    492484#if defined( __parallel )
     
    494486!--       Receive data from all PEs
    495487          DO  i = 1, numprocs-1
    496              CALL MPI_RECV( pe_tmp(1), SIZE( log_point ), MPI_REAL, &
    497                             MPI_ANY_SOURCE, MPI_ANY_TAG, comm2d, status, ierr )
     488             CALL MPI_RECV( pe_tmp(1), SIZE( log_point ), MPI_DOUBLE_PRECISION, MPI_ANY_SOURCE,    &
     489                            MPI_ANY_TAG, comm2d, status, ierr )
    498490             sender = status(MPI_SOURCE)
    499491             pe_log_points(:,sender) = pe_tmp
     
    505497          DO  iii = 1, SIZE( log_point )
    506498             DO  i = 1, numprocs-1
    507                 log_point_s(iii)%sum = log_point_s(iii)%sum +                  &
    508                                        pe_log_points(iii,i)
     499                log_point_s(iii)%sum = log_point_s(iii)%sum + pe_log_points(iii,i)
    509500                pe_min(iii) = MIN( pe_min(iii), pe_log_points(iii,i) )
    510501                pe_max(iii) = MAX( pe_max(iii), pe_log_points(iii,i) )
     
    514505!--          Calculate rms
    515506             DO  i = 0, numprocs-1
    516                 pe_rms(iii) = pe_rms(iii) + (                                  &
    517                                    pe_log_points(iii,i) - log_point_s(iii)%sum &
    518                                             )**2
     507                pe_rms(iii) = pe_rms(iii) + ( pe_log_points(iii,i) - log_point_s(iii)%sum )**2
    519508             ENDDO
    520509             pe_rms(iii) = SQRT( pe_rms(iii) / numprocs )
     
    525514!--       the data in order to avoid sending the data type log)
    526515          pe_max = log_point_s%sum
    527           CALL MPI_SEND( pe_max(1), SIZE( log_point ), MPI_REAL, 0, 0, comm2d, &
    528                          ierr )
     516          CALL MPI_SEND( pe_max(1), SIZE( log_point ), MPI_DOUBLE_PRECISION, 0, 0, comm2d, ierr )
    529517#endif
    530518
     
    539527             sum = log_point_s%sum
    540528          ELSEWHERE
    541              sum = -1.0_wp
     529             sum = -1.0_dp
    542530          ENDWHERE
    543531
     
    548536             ii = MAXLOC( sum )
    549537             i = ii(1)
    550              IF ( sum(i) /= -1.0_wp )  THEN
    551                 WRITE ( 18, 102 )                                              &
    552                    log_point_s(i)%place, log_point_s(i)%sum,                   &
    553                    log_point_s(i)%sum / log_point(1)%sum * 100.0_wp,           &
    554                    log_point_s(i)%counts, pe_min(i), pe_max(i), pe_rms(i)
    555                 sum(i) = -1.0_wp
     538             IF ( sum(i) /= -1.0_dp )  THEN
     539                WRITE ( 18, 102 )  log_point_s(i)%place, log_point_s(i)%sum,                       &
     540                                   log_point_s(i)%sum / log_point(1)%sum * 100.0_dp,               &
     541                                   log_point_s(i)%counts, pe_min(i), pe_max(i), pe_rms(i)
     542                sum(i) = -1.0_dp
    556543             ELSE
    557544                EXIT
     
    587574
    588575
    589    100 FORMAT (A/11('-')//'CPU measures for ',I5,' PEs (',I5,'(x) * ',I5,'(y', &
    590                &') tasks *',I5,' threads):'//                                  &
    591                'gridpoints (x/y/z): ',20X,I5,' * ',I5,' * ',I5/                &
    592                'nr of timesteps: ',22X,I6/                                     &
     576   100 FORMAT (A/11('-')//'CPU measures for ',I5,' PEs (',I5,'(x) * ',I5,'(y',                     &
     577               &') tasks *',I5,' threads):'//                                                      &
     578               'gridpoints (x/y/z): ',20X,I5,' * ',I5,' * ',I5/                                    &
     579               'nr of timesteps: ',22X,I6/                                                         &
    593580               'cpu time per grid point and timestep: ',5X,F8.5,' * 10**-6 s')
    594581
    595582   101 FORMAT (/'special measures:'/ &
    596                &'-----------------------------------------------------------', &
     583               &'-----------------------------------------------------------',                     &
    597584               &'---------------------')
    598585
     
    603590   106 FORMAT (/'Exchange of ghostpoints via MPI_ISEND/MPI_IRECV')
    604591   107 FORMAT (//)
    605    110 FORMAT ('------------------------------------------------------------', &
    606                &'----------'//                                                 &
    607                &'place:                              mean        counts     ', &
    608                &' min       max    rms'/                                       &
    609                &'                                sec.      %                ', &
    610                &'sec.      sec.   sec.'/                                       &
    611                &'-----------------------------------------------------------', &
     592   110 FORMAT ('------------------------------------------------------------',                     &
     593               &'----------'//                                                                     &
     594               &'place:                              mean        counts     ',                     &
     595               &' min       max    rms'/                                                           &
     596               &'                                sec.      %                ',                     &
     597               &'sec.      sec.   sec.'/                                                           &
     598               &'-----------------------------------------------------------',                     &
    612599               &'---------------------')
    613600   111 FORMAT (/'Barriers are set at beginning (start/continue) of measurements')
Note: See TracChangeset for help on using the changeset viewer.