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 3764 for branches/2012/dev_MERGE_2012/NEMOGCM/NEMO/OPA_SRC/lib_fortran.F90 – NEMO

Ignore:
Timestamp:
2013-01-23T15:33:04+01:00 (11 years ago)
Author:
smasson
Message:

dev_MERGE_2012: report bugfixes done in the trunk from r3555 to r3763 into dev_MERGE_2012

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2012/dev_MERGE_2012/NEMOGCM/NEMO/OPA_SRC/lib_fortran.F90

    r3632 r3764  
    88 
    99   !!---------------------------------------------------------------------- 
    10    !!   glob_sum    : generic interface for global masked summation over  
     10   !!   glob_sum    : generic interface for global masked summation over 
    1111   !!                 the interior domain for 1 or 2 2D or 3D arrays 
    12    !!                 it works only for T points    
     12   !!                 it works only for T points 
    1313   !!   SIGN        : generic interface for SIGN to overwrite f95 behaviour 
    1414   !!                 of intrinsinc sign function 
     
    2929 
    3030   INTERFACE glob_sum 
    31       MODULE PROCEDURE glob_sum_2d, glob_sum_3d,glob_sum_2d_a, glob_sum_3d_a  
     31      MODULE PROCEDURE glob_sum_1d, glob_sum_2d, glob_sum_3d, & 
     32         &             glob_sum_2d_a, glob_sum_3d_a 
    3233   END INTERFACE 
    3334 
    34 #if defined key_nosignedzero    
     35#if defined key_nosignedzero 
    3536   INTERFACE SIGN 
    3637      MODULE PROCEDURE SIGN_SCALAR, SIGN_ARRAY_1D, SIGN_ARRAY_2D, SIGN_ARRAY_3D,   & 
    37          &             SIGN_ARRAY_1D_A, SIGN_ARRAY_2D_A, SIGN_ARRAY_3D_A,          &  
    38          &             SIGN_ARRAY_1D_B, SIGN_ARRAY_2D_B, SIGN_ARRAY_3D_B  
     38         &             SIGN_ARRAY_1D_A, SIGN_ARRAY_2D_A, SIGN_ARRAY_3D_A,          & 
     39         &             SIGN_ARRAY_1D_B, SIGN_ARRAY_2D_B, SIGN_ARRAY_3D_B 
    3940   END INTERFACE 
    4041#endif 
     
    4243   !!---------------------------------------------------------------------- 
    4344   !! NEMO/OPA 3.3 , NEMO Consortium (2010) 
    44    !! $Id$  
     45   !! $Id$ 
    4546   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt) 
    4647   !!---------------------------------------------------------------------- 
    47 CONTAINS  
     48CONTAINS 
    4849 
    4950#if ! defined key_mpp_rep 
    50  
    51    FUNCTION glob_sum_2d( ptab )  
     51   FUNCTION glob_sum_1d( ptab, kdim ) 
     52      !!----------------------------------------------------------------------- 
     53      !!                  ***  FUNCTION  glob_sum_1D  *** 
     54      !! 
     55      !! ** Purpose : perform a masked sum on the inner global domain of a 1D array 
     56      !!----------------------------------------------------------------------- 
     57      INTEGER :: kdim 
     58      REAL(wp), INTENT(in), DIMENSION(kdim) ::   ptab        ! input 1D array 
     59      REAL(wp)                              ::   glob_sum_1d ! global sum 
     60      !!----------------------------------------------------------------------- 
     61      ! 
     62      glob_sum_1d = SUM( ptab(:) ) 
     63      IF( lk_mpp )   CALL mpp_sum( glob_sum_1d ) 
     64      ! 
     65   END FUNCTION glob_sum_1d 
     66 
     67   FUNCTION glob_sum_2d( ptab ) 
    5268      !!----------------------------------------------------------------------- 
    5369      !!                  ***  FUNCTION  glob_sum_2D  *** 
     
    6379      ! 
    6480   END FUNCTION glob_sum_2d 
    65     
    66     
    67    FUNCTION glob_sum_3d( ptab )  
     81 
     82 
     83   FUNCTION glob_sum_3d( ptab ) 
    6884      !!----------------------------------------------------------------------- 
    6985      !!                  ***  FUNCTION  glob_sum_3D  *** 
     
    86102 
    87103 
    88    FUNCTION glob_sum_2d_a( ptab1, ptab2 )  
     104   FUNCTION glob_sum_2d_a( ptab1, ptab2 ) 
    89105      !!----------------------------------------------------------------------- 
    90106      !!                  ***  FUNCTION  glob_sum_2D _a *** 
     
    95111      REAL(wp)            , DIMENSION(2)   ::   glob_sum_2d_a   ! global masked sum 
    96112      !!----------------------------------------------------------------------- 
    97       !              
     113      ! 
    98114      glob_sum_2d_a(1) = SUM( ptab1(:,:)*tmask_i(:,:) ) 
    99115      glob_sum_2d_a(2) = SUM( ptab2(:,:)*tmask_i(:,:) ) 
     
    101117      ! 
    102118   END FUNCTION glob_sum_2d_a 
    103   
    104   
    105    FUNCTION glob_sum_3d_a( ptab1, ptab2 )  
     119 
     120 
     121   FUNCTION glob_sum_3d_a( ptab1, ptab2 ) 
    106122      !!----------------------------------------------------------------------- 
    107123      !!                  ***  FUNCTION  glob_sum_3D_a *** 
     
    124140   END FUNCTION glob_sum_3d_a 
    125141 
    126 #else   
     142#else 
    127143   !!---------------------------------------------------------------------- 
    128144   !!   'key_mpp_rep'                                   MPP reproducibility 
    129145   !!---------------------------------------------------------------------- 
    130     
    131    FUNCTION glob_sum_2d( ptab )  
     146 
     147   FUNCTION glob_sum_1d( ptab, kdim ) 
     148      !!---------------------------------------------------------------------- 
     149      !!                  ***  FUNCTION  glob_sum_1d *** 
     150      !! 
     151      !! ** Purpose : perform a sum in calling DDPDD routine 
     152      !!---------------------------------------------------------------------- 
     153      INTEGER , INTENT(in) :: kdim 
     154      REAL(wp), INTENT(in), DIMENSION(kdim) ::   ptab 
     155      REAL(wp)                              ::   glob_sum_1d   ! global sum 
     156      !! 
     157      COMPLEX(wp)::   ctmp 
     158      REAL(wp)   ::   ztmp 
     159      INTEGER    ::   ji   ! dummy loop indices 
     160      !!----------------------------------------------------------------------- 
     161      ! 
     162      ztmp = 0.e0 
     163      ctmp = CMPLX( 0.e0, 0.e0, wp ) 
     164      DO ji = 1, kdim 
     165         ztmp =  ptab(ji) 
     166         CALL DDPDD( CMPLX( ztmp, 0.e0, wp ), ctmp ) 
     167         END DO 
     168      IF( lk_mpp )   CALL mpp_sum( ctmp )   ! sum over the global domain 
     169      glob_sum_1d = REAL(ctmp,wp) 
     170      ! 
     171   END FUNCTION glob_sum_1d 
     172 
     173   FUNCTION glob_sum_2d( ptab ) 
    132174      !!---------------------------------------------------------------------- 
    133175      !!                  ***  FUNCTION  glob_sum_2d *** 
     
    154196      glob_sum_2d = REAL(ctmp,wp) 
    155197      ! 
    156    END FUNCTION glob_sum_2d    
    157  
    158  
    159    FUNCTION glob_sum_3d( ptab )  
     198   END FUNCTION glob_sum_2d 
     199 
     200 
     201   FUNCTION glob_sum_3d( ptab ) 
    160202      !!---------------------------------------------------------------------- 
    161203      !!                  ***  FUNCTION  glob_sum_3d *** 
     
    179221            CALL DDPDD( CMPLX( ztmp, 0.e0, wp ), ctmp ) 
    180222            END DO 
    181          END DO     
     223         END DO 
    182224      END DO 
    183225      IF( lk_mpp )   CALL mpp_sum( ctmp )   ! sum over the global domain 
    184226      glob_sum_3d = REAL(ctmp,wp) 
    185227      ! 
    186    END FUNCTION glob_sum_3d    
    187  
    188  
    189    FUNCTION glob_sum_2d_a( ptab1, ptab2 )  
     228   END FUNCTION glob_sum_3d 
     229 
     230 
     231   FUNCTION glob_sum_2d_a( ptab1, ptab2 ) 
    190232      !!---------------------------------------------------------------------- 
    191233      !!                  ***  FUNCTION  glob_sum_2d_a *** 
     
    214256      glob_sum_2d_a = REAL(ctmp,wp) 
    215257      ! 
    216    END FUNCTION glob_sum_2d_a    
    217  
    218  
    219    FUNCTION glob_sum_3d_a( ptab1, ptab2 )  
     258   END FUNCTION glob_sum_2d_a 
     259 
     260 
     261   FUNCTION glob_sum_3d_a( ptab1, ptab2 ) 
    220262      !!---------------------------------------------------------------------- 
    221263      !!                  ***  FUNCTION  glob_sum_3d_a *** 
     
    241283            CALL DDPDD( CMPLX( ztmp, 0.e0, wp ), ctmp ) 
    242284            END DO 
    243          END DO     
     285         END DO 
    244286      END DO 
    245287      IF( lk_mpp )   CALL mpp_sum( ctmp )   ! sum over the global domain 
    246288      glob_sum_3d_a = REAL(ctmp,wp) 
    247289      ! 
    248    END FUNCTION glob_sum_3d_a    
     290   END FUNCTION glob_sum_3d_a 
    249291 
    250292#endif 
     
    253295      !!---------------------------------------------------------------------- 
    254296      !!               ***  ROUTINE DDPDD *** 
    255       !!           
     297      !! 
    256298      !! ** Purpose : Add a scalar element to a sum 
    257       !!              
    258       !! 
    259       !! ** Method  : The code uses the compensated summation with doublet  
     299      !! 
     300      !! 
     301      !! ** Method  : The code uses the compensated summation with doublet 
    260302      !!              (sum,error) emulated useing complex numbers. ydda is the 
    261       !!               scalar to add to the summ yddb  
    262       !!  
    263       !! ** Action  : This does only work for MPI.  
     303      !!               scalar to add to the summ yddb 
     304      !! 
     305      !! ** Action  : This does only work for MPI. 
    264306      !! 
    265307      !! References : Using Acurate Arithmetics to Improve Numerical 
    266308      !!              Reproducibility and Sability in Parallel Applications 
    267       !!              Yun HE and Chris H. Q. DING, Journal of Supercomputing 18, 259-277, 2001  
     309      !!              Yun HE and Chris H. Q. DING, Journal of Supercomputing 18, 259-277, 2001 
    268310      !!---------------------------------------------------------------------- 
    269311      COMPLEX(wp), INTENT(in   ) ::   ydda 
     
    288330   !!   'key_nosignedzero'                                         F90 SIGN 
    289331   !!---------------------------------------------------------------------- 
    290     
     332 
    291333   FUNCTION SIGN_SCALAR( pa, pb ) 
    292334      !!----------------------------------------------------------------------- 
     
    304346 
    305347 
    306    FUNCTION SIGN_ARRAY_1D( pa, pb )  
     348   FUNCTION SIGN_ARRAY_1D( pa, pb ) 
    307349      !!----------------------------------------------------------------------- 
    308350      !!                  ***  FUNCTION SIGN_ARRAY_1D  *** 
     
    319361 
    320362 
    321    FUNCTION SIGN_ARRAY_2D(pa,pb)  
     363   FUNCTION SIGN_ARRAY_2D(pa,pb) 
    322364      !!----------------------------------------------------------------------- 
    323365      !!                  ***  FUNCTION SIGN_ARRAY_2D  *** 
     
    333375   END FUNCTION SIGN_ARRAY_2D 
    334376 
    335    FUNCTION SIGN_ARRAY_3D(pa,pb)  
     377   FUNCTION SIGN_ARRAY_3D(pa,pb) 
    336378      !!----------------------------------------------------------------------- 
    337379      !!                  ***  FUNCTION SIGN_ARRAY_3D  *** 
     
    348390 
    349391 
    350    FUNCTION SIGN_ARRAY_1D_A(pa,pb)  
     392   FUNCTION SIGN_ARRAY_1D_A(pa,pb) 
    351393      !!----------------------------------------------------------------------- 
    352394      !!                  ***  FUNCTION SIGN_ARRAY_1D_A  *** 
     
    363405 
    364406 
    365    FUNCTION SIGN_ARRAY_2D_A(pa,pb)  
     407   FUNCTION SIGN_ARRAY_2D_A(pa,pb) 
    366408      !!----------------------------------------------------------------------- 
    367409      !!                  ***  FUNCTION SIGN_ARRAY_2D_A  *** 
     
    378420 
    379421 
    380    FUNCTION SIGN_ARRAY_3D_A(pa,pb)  
     422   FUNCTION SIGN_ARRAY_3D_A(pa,pb) 
    381423      !!----------------------------------------------------------------------- 
    382424      !!                  ***  FUNCTION SIGN_ARRAY_3D_A  *** 
     
    393435 
    394436 
    395    FUNCTION SIGN_ARRAY_1D_B(pa,pb)  
     437   FUNCTION SIGN_ARRAY_1D_B(pa,pb) 
    396438      !!----------------------------------------------------------------------- 
    397439      !!                  ***  FUNCTION SIGN_ARRAY_1D_B  *** 
     
    408450 
    409451 
    410    FUNCTION SIGN_ARRAY_2D_B(pa,pb)  
     452   FUNCTION SIGN_ARRAY_2D_B(pa,pb) 
    411453      !!----------------------------------------------------------------------- 
    412454      !!                  ***  FUNCTION SIGN_ARRAY_2D_B  *** 
     
    423465 
    424466 
    425    FUNCTION SIGN_ARRAY_3D_B(pa,pb)  
     467   FUNCTION SIGN_ARRAY_3D_B(pa,pb) 
    426468      !!----------------------------------------------------------------------- 
    427469      !!                  ***  FUNCTION SIGN_ARRAY_3D_B  *** 
Note: See TracChangeset for help on using the changeset viewer.