New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 681 for trunk/NEMO/OPA_SRC/lib_mpp.F90 – NEMO

Ignore:
Timestamp:
2007-06-29T18:31:31+02:00 (17 years ago)
Author:
rblod
Message:

nemo_v2_update_019 : SM : add mppmax for integer

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMO/OPA_SRC/lib_mpp.F90

    r635 r681  
    2626   !!                mppmin_int , mppmin_a_int , mppmin_real, mppmin_a_real 
    2727   !!   mpp_max    : generic interface for : 
    28    !!                mppmax_real, mppmax_a_real 
     28   !!                mppmax_int , mppmax_a_int , mppmax_real, mppmax_a_real 
    2929   !!   mpp_sum    : generic interface for : 
    3030   !!                mppsum_int , mppsum_a_int , mppsum_real, mppsum_a_real 
     
    4848   !!---------------------------------------------------------------------- 
    4949   !!  OPA 9.0 , LOCEAN-IPSL (2005)  
    50    !! $Header$  
     50   !! $Header: /home/opalod/NEMOCVSROOT/NEMO/OPA_SRC/lib_mpp.F90,v 1.21 2007/06/05 10:28:55 opalod Exp $  
    5151   !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt  
    5252   !!--------------------------------------------------------------------- 
     
    7777   END INTERFACE 
    7878   INTERFACE mpp_max 
    79       MODULE PROCEDURE mppmax_a_real, mppmax_real 
     79      MODULE PROCEDURE mppmax_a_int, mppmax_int, mppmax_a_real, mppmax_real 
    8080   END INTERFACE 
    8181   INTERFACE mpp_sum 
     
    270270   !!---------------------------------------------------------------------- 
    271271   !!  OPA 9.0 , LOCEAN-IPSL (2005)  
    272    !! $Header$  
     272   !! $Header: /home/opalod/NEMOCVSROOT/NEMO/OPA_SRC/lib_mpp.F90,v 1.21 2007/06/05 10:28:55 opalod Exp $  
    273273   !! This software is governed by the CeCILL licence see modipsl/doc/NEMO_CeCILL.txt  
    274274   !!--------------------------------------------------------------------- 
     
    30693069 
    30703070 
     3071   SUBROUTINE mppmax_a_int( ktab, kdim ) 
     3072      !!---------------------------------------------------------------------- 
     3073      !!                  ***  routine mppmax_a_int  *** 
     3074      !!  
     3075      !! ** Purpose :   Find maximum value in an integer layout array 
     3076      !! 
     3077      !!---------------------------------------------------------------------- 
     3078      !! * Arguments 
     3079      INTEGER , INTENT( in  )                  ::   kdim        ! size of array 
     3080      INTEGER , INTENT(inout), DIMENSION(kdim) ::   ktab        ! input array 
     3081   
     3082#if defined key_mpp_shmem 
     3083      !! * Local declarations    (SHMEM version) 
     3084      INTEGER :: ji 
     3085      INTEGER, SAVE :: ibool=0 
     3086   
     3087      IF( kdim > jpmppsum ) CALL ctl_stop( 'mppmax_a_int routine : kdim is too big', & 
     3088           &                               'change jpmppsum dimension in mpp.h' ) 
     3089   
     3090      DO ji = 1, kdim 
     3091         niltab_shmem(ji) = ktab(ji) 
     3092      END DO 
     3093      CALL  barrier() 
     3094      IF(ibool == 0 ) THEN  
     3095         CALL shmem_int8_max_to_all (niltab_shmem,niltab_shmem,kdim,0,0   & 
     3096              ,N$PES,nil1wrk_shmem,nil1sync_shmem ) 
     3097      ELSE 
     3098         CALL shmem_int8_max_to_all (niltab_shmem,niltab_shmem,kdim,0,0   & 
     3099              ,N$PES,nil2wrk_shmem,nil2sync_shmem ) 
     3100      ENDIF 
     3101      CALL  barrier() 
     3102      ibool=ibool+1 
     3103      ibool=MOD( ibool,2) 
     3104      DO ji = 1, kdim 
     3105         ktab(ji) = niltab_shmem(ji) 
     3106      END DO 
     3107   
     3108#  elif defined key_mpp_mpi 
     3109   
     3110      !! * Local variables   (MPI version) 
     3111      INTEGER :: ierror 
     3112      INTEGER, DIMENSION(kdim) ::   iwork 
     3113   
     3114      CALL mpi_allreduce( ktab, iwork, kdim, mpi_integer,   & 
     3115           &                mpi_max, mpi_comm_opa, ierror ) 
     3116   
     3117      ktab(:) = iwork(:) 
     3118#endif 
     3119 
     3120   END SUBROUTINE mppmax_a_int 
     3121 
     3122 
     3123   SUBROUTINE mppmax_int( ktab ) 
     3124      !!---------------------------------------------------------------------- 
     3125      !!                  ***  routine mppmax_int  *** 
     3126      !! 
     3127      !! ** Purpose : 
     3128      !!     Massively parallel processors 
     3129      !!     Find maximum value in an integer layout array 
     3130      !! 
     3131      !!---------------------------------------------------------------------- 
     3132      !! * Arguments 
     3133      INTEGER, INTENT(inout) ::   ktab      ! ??? 
     3134   
     3135      !! * Local declarations 
     3136 
     3137#if defined key_mpp_shmem 
     3138 
     3139      !! * Local variables   (SHMEM version) 
     3140      INTEGER :: ji 
     3141      INTEGER, SAVE :: ibool=0 
     3142   
     3143      niltab_shmem(1) = ktab 
     3144      CALL  barrier() 
     3145      IF(ibool == 0 ) THEN  
     3146         CALL shmem_int8_max_to_all (niltab_shmem,niltab_shmem, 1,0,0   & 
     3147              ,N$PES,nil1wrk_shmem,nil1sync_shmem ) 
     3148      ELSE 
     3149         CALL shmem_int8_max_to_all (niltab_shmem,niltab_shmem, 1,0,0   & 
     3150              ,N$PES,nil2wrk_shmem,nil2sync_shmem ) 
     3151      ENDIF 
     3152      CALL  barrier() 
     3153      ibool=ibool+1 
     3154      ibool=MOD( ibool,2) 
     3155      ktab = niltab_shmem(1) 
     3156   
     3157#  elif defined key_mpp_mpi 
     3158 
     3159      !! * Local variables   (MPI version) 
     3160      INTEGER ::  ierror, iwork 
     3161   
     3162      CALL mpi_allreduce(ktab,iwork, 1,mpi_integer   & 
     3163           &              ,mpi_max,mpi_comm_opa,ierror) 
     3164   
     3165      ktab = iwork 
     3166#endif 
     3167 
     3168   END SUBROUTINE mppmax_int 
     3169 
     3170 
    30713171   SUBROUTINE mppmin_a_int( ktab, kdim ) 
    30723172      !!---------------------------------------------------------------------- 
     
    51175217   END INTERFACE 
    51185218   INTERFACE mpp_max 
    5119       MODULE PROCEDURE mppmax_a_real, mppmax_real 
     5219      MODULE PROCEDURE mppmax_a_int, mppmax_int, mppmax_a_real, mppmax_real 
    51205220   END INTERFACE 
    51215221   INTERFACE mpp_min 
     
    51985298   END SUBROUTINE mppmin_real 
    51995299 
     5300   SUBROUTINE mppmax_a_int( karr, kdim ) 
     5301      INTEGER, DIMENSION(:) :: karr 
     5302      INTEGER               :: kdim 
     5303      WRITE(*,*) 'mppmax_a_int: You should not have seen this print! error?', kdim, karr(1) 
     5304   END SUBROUTINE mppmax_a_int 
     5305 
     5306   SUBROUTINE mppmax_int( kint ) 
     5307      INTEGER               :: kint 
     5308      WRITE(*,*) 'mppmax_int: You should not have seen this print! error?', kint 
     5309   END SUBROUTINE mppmax_int 
     5310 
    52005311   SUBROUTINE mppmin_a_int( karr, kdim ) 
    52015312      INTEGER, DIMENSION(:) :: karr 
Note: See TracChangeset for help on using the changeset viewer.