Changeset 14072 for NEMO/trunk/src/OCE/LBC/lib_mpp.F90
- Timestamp:
- 2020-12-04T08:48:38+01:00 (3 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/trunk/src/OCE/LBC/lib_mpp.F90
r13982 r14072 20 20 !! 4.0 ! 2011 (G. Madec) move ctl_ routines from in_out_manager 21 21 !! 3.5 ! 2012 (S.Mocavero, I. Epicoco) Add mpp_lnk_bdy_3d/2d routines to optimize the BDY comm. 22 !! 3.5 ! 2013 (C. Ethe, G. Madec) message passing arrays as local variables 22 !! 3.5 ! 2013 (C. Ethe, G. Madec) message passing arrays as local variables 23 23 !! 3.5 ! 2013 (S.Mocavero, I.Epicoco - CMCC) north fold optimizations 24 24 !! 3.6 ! 2015 (O. Tintó and M. Castrillo - BSC) Added '_multiple' case for 2D lbc and max … … 77 77 PUBLIC MPI_Wtime 78 78 #endif 79 79 80 80 !! * Interfaces 81 81 !! define generic interface for these routine as they are called sometimes … … 115 115 !$AGRIF_END_DO_NOT_TREAT 116 116 LOGICAL, PUBLIC, PARAMETER :: lk_mpp = .TRUE. !: mpp flag 117 #else 117 #else 118 118 INTEGER, PUBLIC, PARAMETER :: MPI_STATUS_SIZE = 1 119 119 INTEGER, PUBLIC, PARAMETER :: MPI_REAL = 4 … … 183 183 REAL(dp), DIMENSION(2), PUBLIC :: waiting_time = 0._dp 184 184 REAL(dp) , PUBLIC :: compute_time = 0._dp, elapsed_time = 0._dp 185 185 186 186 REAL(wp), DIMENSION(:), ALLOCATABLE, SAVE :: tampon ! buffer in case of bsend 187 187 188 188 LOGICAL, PUBLIC :: ln_nnogather !: namelist control of northfold comms 189 189 LOGICAL, PUBLIC :: l_north_nogather = .FALSE. !: internal control of northfold comms 190 190 191 191 !! * Substitutions 192 192 # include "do_loop_substitute.h90" … … 223 223 IF( ierr /= MPI_SUCCESS ) CALL ctl_stop( 'STOP', ' lib_mpp: Error in routine mpi_init' ) 224 224 ENDIF 225 225 226 226 IF( PRESENT(localComm) ) THEN 227 227 IF( Agrif_Root() ) THEN … … 473 473 END SUBROUTINE mppscatter 474 474 475 475 476 476 SUBROUTINE mpp_delay_sum( cdname, cdelay, y_in, pout, ldlast, kcom ) 477 477 !!---------------------------------------------------------------------- … … 498 498 499 499 isz = SIZE(y_in) 500 500 501 501 IF( narea == 1 .AND. numcom == -1 ) CALL mpp_report( cdname, ld_dlg = .TRUE. ) 502 502 … … 519 519 END IF 520 520 ENDIF 521 521 522 522 IF( ndelayid(idvar) == -1 ) THEN ! first call without restart: define %y1d and %z1d from y_in with blocking allreduce 523 523 ! -------------------------- … … 547 547 END SUBROUTINE mpp_delay_sum 548 548 549 549 550 550 SUBROUTINE mpp_delay_max( cdname, cdelay, p_in, pout, ldlast, kcom ) 551 551 !!---------------------------------------------------------------------- … … 557 557 CHARACTER(len=*), INTENT(in ) :: cdname ! name of the calling subroutine 558 558 CHARACTER(len=*), INTENT(in ) :: cdelay ! name (used as id) of the delayed operation 559 REAL(wp), INTENT(in ), DIMENSION(:) :: p_in ! 560 REAL(wp), INTENT( out), DIMENSION(:) :: pout ! 559 REAL(wp), INTENT(in ), DIMENSION(:) :: p_in ! 560 REAL(wp), INTENT( out), DIMENSION(:) :: pout ! 561 561 LOGICAL, INTENT(in ) :: ldlast ! true if this is the last time we call this routine 562 562 INTEGER, INTENT(in ), OPTIONAL :: kcom … … 567 567 INTEGER :: MPI_TYPE 568 568 !!---------------------------------------------------------------------- 569 569 570 570 #if defined key_mpp_mpi 571 571 if( wp == dp ) then … … 575 575 else 576 576 CALL ctl_stop( "Error defining type, wp is neither dp nor sp" ) 577 577 578 578 end if 579 579 … … 629 629 END SUBROUTINE mpp_delay_max 630 630 631 631 632 632 SUBROUTINE mpp_delay_rcv( kid ) 633 633 !!---------------------------------------------------------------------- 634 634 !! *** routine mpp_delay_rcv *** 635 635 !! 636 !! ** Purpose : force barrier for delayed mpp (needed for restart) 637 !! 638 !!---------------------------------------------------------------------- 639 INTEGER,INTENT(in ) :: kid 636 !! ** Purpose : force barrier for delayed mpp (needed for restart) 637 !! 638 !!---------------------------------------------------------------------- 639 INTEGER,INTENT(in ) :: kid 640 640 INTEGER :: ierr 641 641 !!---------------------------------------------------------------------- … … 674 674 END SUBROUTINE mpp_bcast_nml 675 675 676 676 677 677 !!---------------------------------------------------------------------- 678 678 !! *** mppmax_a_int, mppmax_int, mppmax_a_real, mppmax_real *** 679 !! 679 !! 680 680 !!---------------------------------------------------------------------- 681 681 !! … … 729 729 !!---------------------------------------------------------------------- 730 730 !! *** mppmin_a_int, mppmin_int, mppmin_a_real, mppmin_real *** 731 !! 731 !! 732 732 !!---------------------------------------------------------------------- 733 733 !! … … 781 781 !!---------------------------------------------------------------------- 782 782 !! *** mppsum_a_int, mppsum_int, mppsum_a_real, mppsum_real *** 783 !! 783 !! 784 784 !! Global sum of 1D array or a variable (integer, real or complex) 785 785 !!---------------------------------------------------------------------- … … 855 855 !!---------------------------------------------------------------------- 856 856 !! *** mpp_minloc2d, mpp_minloc3d, mpp_maxloc2d, mpp_maxloc3d 857 !! 857 !! 858 858 !!---------------------------------------------------------------------- 859 859 !! … … 935 935 936 936 937 SUBROUTINE mppstop( ld_abort ) 937 SUBROUTINE mppstop( ld_abort ) 938 938 !!---------------------------------------------------------------------- 939 939 !! *** routine mppstop *** … … 1080 1080 !! collectives 1081 1081 !! 1082 !! ** Method : - Create graph communicators starting from the processes 1082 !! ** Method : - Create graph communicators starting from the processes 1083 1083 !! distribution along i and j directions 1084 1084 ! … … 1411 1411 jj = 0 1412 1412 END IF 1413 jj = jj + 1 1413 jj = jj + 1 1414 1414 END DO 1415 1415 WRITE(numcom,'(A, I4, A, A)') ' - ', jj,' times by subroutine ', TRIM(crname_glb(n_sequence_glb)) … … 1427 1427 jj = 0 1428 1428 END IF 1429 jj = jj + 1 1429 jj = jj + 1 1430 1430 END DO 1431 1431 WRITE(numcom,'(A, I4, A, A)') ' - ', jj,' times by subroutine ', TRIM(crname_dlg(n_sequence_dlg)) … … 1443 1443 END SUBROUTINE mpp_report 1444 1444 1445 1445 1446 1446 SUBROUTINE tic_tac (ld_tic, ld_global) 1447 1447 … … 1459 1459 IF( ld_global ) ii = 2 1460 1460 END IF 1461 1461 1462 1462 IF ( ld_tic ) THEN 1463 1463 tic_wt(ii) = MPI_Wtime() ! start count tic->tac (waiting time) … … 1468 1468 ENDIF 1469 1469 #endif 1470 1470 1471 1471 END SUBROUTINE tic_tac 1472 1472 … … 1478 1478 END SUBROUTINE mpi_wait 1479 1479 1480 1480 1481 1481 FUNCTION MPI_Wtime() 1482 1482 REAL(wp) :: MPI_Wtime … … 1540 1540 ! 1541 1541 IF( cd1 == 'STOP' ) THEN 1542 WRITE(numout,*) 1542 WRITE(numout,*) 1543 1543 WRITE(numout,*) 'huge E-R-R-O-R : immediate stop' 1544 WRITE(numout,*) 1544 WRITE(numout,*) 1545 1545 CALL FLUSH(numout) 1546 1546 CALL SLEEP(60) ! make sure that all output and abort files are written by all cores. 60s should be enough... … … 1639 1639 ENDIF 1640 1640 IF( iost /= 0 .AND. TRIM(clfile) == '/dev/null' ) & ! for windows 1641 & OPEN(UNIT=knum,FILE='NUL', FORM=cdform, ACCESS=cdacce, STATUS=cdstat , ERR=100, IOSTAT=iost ) 1641 & OPEN(UNIT=knum,FILE='NUL', FORM=cdform, ACCESS=cdacce, STATUS=cdstat , ERR=100, IOSTAT=iost ) 1642 1642 IF( iost == 0 ) THEN 1643 1643 IF(ldwp .AND. kout > 0) THEN … … 1681 1681 ! 1682 1682 WRITE (clios, '(I5.0)') kios 1683 IF( kios < 0 ) THEN 1683 IF( kios < 0 ) THEN 1684 1684 CALL ctl_warn( 'end of record or file while reading namelist ' & 1685 1685 & // TRIM(cdnam) // ' iostat = ' // TRIM(clios) ) … … 1727 1727 !csp = NEW_LINE('A') 1728 1728 ! a new line character is the best seperator but some systems (e.g.Cray) 1729 ! seem to terminate namelist reads from internal files early if they 1729 ! seem to terminate namelist reads from internal files early if they 1730 1730 ! encounter new-lines. Use a single space for safety. 1731 1731 csp = ' ' … … 1746 1746 iltc = LEN_TRIM(chline) 1747 1747 IF ( iltc.GT.0 ) THEN 1748 inl = INDEX(chline, '!') 1748 inl = INDEX(chline, '!') 1749 1749 IF( inl.eq.0 ) THEN 1750 1750 itot = itot + iltc + 1 ! +1 for the newline character
Note: See TracChangeset
for help on using the changeset viewer.