! !== IN: ptab is an array ==! # if defined REAL_TYPE # define ARRAY_TYPE(i) REAL(wp) , INTENT(inout) :: ARRAY_IN(i) # define TMP_TYPE(i) REAL(wp) , ALLOCATABLE :: work(i) # define MPI_TYPE mpi_double_precision # endif # if defined INTEGER_TYPE # define ARRAY_TYPE(i) INTEGER , INTENT(inout) :: ARRAY_IN(i) # define TMP_TYPE(i) INTEGER , ALLOCATABLE :: work(i) # define MPI_TYPE mpi_integer # endif # if defined COMPLEX_TYPE # define ARRAY_TYPE(i) COMPLEX , INTENT(inout) :: ARRAY_IN(i) # define TMP_TYPE(i) COMPLEX , ALLOCATABLE :: work(i) # define MPI_TYPE mpi_double_complex # endif # if defined DIM_0d # define ARRAY_IN(i) ptab # define I_SIZE(ptab) 1 # endif # if defined DIM_1d # define ARRAY_IN(i) ptab(i) # define I_SIZE(ptab) SIZE(ptab,1) # endif # if defined OPERATION_MAX # define MPI_OPERATION mpi_max # endif # if defined OPERATION_MIN # define MPI_OPERATION mpi_min # endif # if defined OPERATION_SUM # define MPI_OPERATION mpi_sum # endif # if defined OPERATION_SUM_DD # define MPI_OPERATION mpi_sumdd # endif SUBROUTINE ROUTINE_ALLREDUCE( cdname, ptab, kdim, kcom ) !!---------------------------------------------------------------------- CHARACTER(len=*), INTENT(in ) :: cdname ! name of the calling subroutine ARRAY_TYPE(:) ! array or pointer of arrays on which the boundary condition is applied INTEGER, OPTIONAL, INTENT(in ) :: kdim ! optional pointer dimension INTEGER, OPTIONAL, INTENT(in ) :: kcom ! optional communicator ! INTEGER :: ipi, ii, ierr INTEGER :: ierror, ilocalcomm TMP_TYPE(:) ! ilocalcomm = mpi_comm_oce IF( PRESENT(kcom) ) ilocalcomm = kcom ! IF( PRESENT(kdim) ) then ipi = kdim ELSE ipi = I_SIZE(ptab) ! 1st dimension ENDIF IF( ln_timing ) CALL tic_tac(.TRUE., ld_global = .TRUE.) ALLOCATE(work(ipi)) CALL mpi_allreduce( ARRAY_IN(:), work, ipi, MPI_TYPE, MPI_OPERATION, ilocalcomm, ierror ) DO ii = 1, ipi ARRAY_IN(ii) = work(ii) ENDDO DEALLOCATE(work) IF( ln_timing ) CALL tic_tac(.FALSE., ld_global = .TRUE.) ! IF( narea == 1 .AND. ncom_stp == nit000+5 ) THEN IF( .NOT. ALLOCATED( crname_glb) ) THEN ALLOCATE( crname_glb(2000), STAT=ierr ) IF( ierr /= 0 ) CALL ctl_stop( 'STOP', 'allreduce_generic, cannot allocate crname' ) ENDIF n_sequence_glb = n_sequence_glb + 1 IF( n_sequence_glb > 2000 ) CALL ctl_stop( 'STOP', 'allreduce_generic, increase crname_glb first dimension' ) crname_glb(n_sequence_glb) = cdname ! keep the name of the calling routine ENDIF END SUBROUTINE ROUTINE_ALLREDUCE #undef ARRAY_TYPE #undef ARRAY_IN #undef I_SIZE #undef MPI_OPERATION #undef TMP_TYPE #undef MPI_TYPE