Ignore:
Timestamp:
2021-06-21T17:16:11+02:00 (6 months ago)
Author:
smasson
Message:

trunk: small optimization following [15033], #2699

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/trunk/src/ICE/icedyn_adv_pra.F90

    r15033 r15037  
    11701170      REAL(wp), DIMENSION(:,:,:), INTENT(in ) ::   pice   ! input 
    11711171      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pmax   ! output 
     1172      ! 
     1173      REAL(wp), DIMENSION(Nis0:Nie0) ::   zmax1, zmax2 
     1174      REAL(wp)                       ::   zmax3 
    11721175      INTEGER  ::   ji, jj, jl   ! dummy loop indices 
    11731176      !!---------------------------------------------------------------------- 
     1177      ! basic version: get the max of epsi20 + 9 neighbours 
     1178!!$      DO jl = 1, jpl 
     1179!!$         DO_2D( 0, 0, 0, 0 ) 
     1180!!$            pmax(ji,jj,jl) = MAX( epsi20, pice(ji-1,jj-1,jl), pice(ji,jj-1,jl), pice(ji+1,jj-1,jl),   & 
     1181!!$               &                          pice(ji-1,jj  ,jl), pice(ji,jj  ,jl), pice(ji+1,jj  ,jl),   & 
     1182!!$               &                          pice(ji-1,jj+1,jl), pice(ji,jj+1,jl), pice(ji+1,jj+1,jl) ) 
     1183!!$         END_2D 
     1184!!$      END DO 
     1185      ! optimized version : does a little bit more than 2 max of epsi20 + 3 neighbours 
    11741186      DO jl = 1, jpl 
     1187         DO ji = Nis0, Nie0 
     1188            zmax1(ji) = MAX( epsi20, pice(ji,Njs0-1,jl), pice(ji-1,Njs0-1,jl), pice(ji+1,Njs0-1,jl) ) 
     1189            zmax2(ji) = MAX( epsi20, pice(ji,Njs0  ,jl), pice(ji-1,Njs0  ,jl), pice(ji+1,Njs0  ,jl) ) 
     1190         END DO 
    11751191         DO_2D( 0, 0, 0, 0 ) 
    1176             pmax(ji,jj,jl) = MAX( epsi20, pice(ji-1,jj-1,jl), pice(ji,jj-1,jl), pice(ji+1,jj-1,jl),   & 
    1177                &                          pice(ji-1,jj  ,jl), pice(ji,jj  ,jl), pice(ji+1,jj  ,jl),   & 
    1178                &                          pice(ji-1,jj+1,jl), pice(ji,jj+1,jl), pice(ji+1,jj+1,jl) ) 
     1192            zmax3 = MAX( epsi20, pice(ji,jj+1,jl), pice(ji-1,jj+1,jl), pice(ji+1,jj+1,jl) ) 
     1193            pmax(ji,jj,jl) = MAX( epsi20, zmax1(ji), zmax2(ji), zmax3 ) 
     1194            zmax1(ji) = zmax2(ji) 
     1195            zmax2(ji) = zmax3 
    11791196         END_2D 
    11801197      END DO 
     1198       
    11811199   END SUBROUTINE icemax3D 
    1182  
     1200          
    11831201   SUBROUTINE icemax4D( pice , pmax ) 
    11841202      !!--------------------------------------------------------------------- 
     
    11881206      REAL(wp), DIMENSION(:,:,:,:), INTENT(in ) ::   pice   ! input 
    11891207      REAL(wp), DIMENSION(:,:,:,:), INTENT(out) ::   pmax   ! output 
     1208      ! 
     1209      REAL(wp), DIMENSION(Nis0:Nie0) ::   zmax1, zmax2 
     1210      REAL(wp)                       ::   zmax3 
    11901211      INTEGER  ::   jlay, ji, jj, jk, jl   ! dummy loop indices 
    11911212      !!---------------------------------------------------------------------- 
    11921213      jlay = SIZE( pice , 3 )   ! size of input arrays 
     1214      ! basic version: get the max of epsi20 + 9 neighbours 
     1215!!$      DO jl = 1, jpl 
     1216!!$         DO jk = 1, jlay 
     1217!!$            DO_2D( 0, 0, 0, 0 ) 
     1218!!$               pmax(ji,jj,jk,jl) = MAX( epsi20, pice(ji-1,jj-1,jk,jl), pice(ji,jj-1,jk,jl), pice(ji+1,jj-1,jk,jl),   & 
     1219!!$                  &                             pice(ji-1,jj  ,jk,jl), pice(ji,jj  ,jk,jl), pice(ji+1,jj  ,jk,jl),   & 
     1220!!$                  &                             pice(ji-1,jj+1,jk,jl), pice(ji,jj+1,jk,jl), pice(ji+1,jj+1,jk,jl) ) 
     1221!!$            END_2D 
     1222!!$         END DO 
     1223!!$      END DO 
     1224      ! optimized version : does a little bit more than 2 max of epsi20 + 3 neighbours 
    11931225      DO jl = 1, jpl 
    11941226         DO jk = 1, jlay 
     1227            DO ji = Nis0, Nie0 
     1228               zmax1(ji) = MAX( epsi20, pice(ji,Njs0-1,jk,jl), pice(ji-1,Njs0-1,jk,jl), pice(ji+1,Njs0-1,jk,jl) ) 
     1229               zmax2(ji) = MAX( epsi20, pice(ji,Njs0  ,jk,jl), pice(ji-1,Njs0  ,jk,jl), pice(ji+1,Njs0  ,jk,jl) ) 
     1230            END DO 
    11951231            DO_2D( 0, 0, 0, 0 ) 
    1196                pmax(ji,jj,jk,jl) = MAX( epsi20, pice(ji-1,jj-1,jk,jl), pice(ji,jj-1,jk,jl), pice(ji+1,jj-1,jk,jl),   & 
    1197                   &                             pice(ji-1,jj  ,jk,jl), pice(ji,jj  ,jk,jl), pice(ji+1,jj  ,jk,jl),   & 
    1198                   &                             pice(ji-1,jj+1,jk,jl), pice(ji,jj+1,jk,jl), pice(ji+1,jj+1,jk,jl) ) 
     1232               zmax3 = MAX( epsi20, pice(ji,jj+1,jk,jl), pice(ji-1,jj+1,jk,jl), pice(ji+1,jj+1,jk,jl) ) 
     1233               pmax(ji,jj,jk,jl) = MAX( epsi20, zmax1(ji), zmax2(ji), zmax3 ) 
     1234               zmax1(ji) = zmax2(ji) 
     1235               zmax2(ji) = zmax3 
    11991236            END_2D 
    12001237         END DO 
    12011238      END DO 
     1239 
    12021240   END SUBROUTINE icemax4D 
    12031241 
Note: See TracChangeset for help on using the changeset viewer.