Changeset 15037


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

trunk: small optimization following [15033], #2699

Location:
NEMO/trunk/src/ICE
Files:
2 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 
  • NEMO/trunk/src/ICE/icedyn_adv_umx.F90

    r15033 r15037  
    16231623      REAL(wp), DIMENSION(:,:,:), INTENT(in ) ::   pice   ! input 
    16241624      REAL(wp), DIMENSION(:,:,:), INTENT(out) ::   pmax   ! output 
     1625      ! 
     1626      REAL(wp), DIMENSION(Nis0:Nie0) ::   zmax1, zmax2 
     1627      REAL(wp)                       ::   zmax3 
    16251628      INTEGER  ::   ji, jj, jl   ! dummy loop indices 
    16261629      !!---------------------------------------------------------------------- 
    1627       DO jl = 1, jpl 
     1630      ! basic version: get the max of epsi20 + 9 neighbours 
     1631!!$      DO jl = 1, jpl 
     1632!!$         DO_2D( 0, 0, 0, 0 ) 
     1633!!$            pmax(ji,jj,jl) = MAX( epsi20, pice(ji-1,jj-1,jl), pice(ji,jj-1,jl), pice(ji+1,jj-1,jl),   & 
     1634!!$               &                          pice(ji-1,jj  ,jl), pice(ji,jj  ,jl), pice(ji+1,jj  ,jl),   & 
     1635!!$               &                          pice(ji-1,jj+1,jl), pice(ji,jj+1,jl), pice(ji+1,jj+1,jl) ) 
     1636!!$         END_2D 
     1637!!$      END DO 
     1638      ! optimized version : does a little bit more than 2 max of epsi20 + 3 neighbours 
     1639      DO jl = 1, jpl 
     1640         DO ji = Nis0, Nie0 
     1641            zmax1(ji) = MAX( epsi20, pice(ji,Njs0-1,jl), pice(ji-1,Njs0-1,jl), pice(ji+1,Njs0-1,jl) ) 
     1642            zmax2(ji) = MAX( epsi20, pice(ji,Njs0  ,jl), pice(ji-1,Njs0  ,jl), pice(ji+1,Njs0  ,jl) ) 
     1643         END DO 
    16281644         DO_2D( 0, 0, 0, 0 ) 
    1629             pmax(ji,jj,jl) = MAX( epsi20, pice(ji-1,jj-1,jl), pice(ji,jj-1,jl), pice(ji+1,jj-1,jl),   & 
    1630                &                          pice(ji-1,jj  ,jl), pice(ji,jj  ,jl), pice(ji+1,jj  ,jl),   & 
    1631                &                          pice(ji-1,jj+1,jl), pice(ji,jj+1,jl), pice(ji+1,jj+1,jl) ) 
    1632          END_2D 
    1633       END DO 
     1645            zmax3 = MAX( epsi20, pice(ji,jj+1,jl), pice(ji-1,jj+1,jl), pice(ji+1,jj+1,jl) ) 
     1646            pmax(ji,jj,jl) = MAX( epsi20, zmax1(ji), zmax2(ji), zmax3 ) 
     1647            zmax1(ji) = zmax2(ji) 
     1648            zmax2(ji) = zmax3 
     1649         END_2D 
     1650      END DO 
     1651 
    16341652   END SUBROUTINE icemax3D 
    16351653 
     
    16411659      REAL(wp), DIMENSION(:,:,:,:), INTENT(in ) ::   pice   ! input 
    16421660      REAL(wp), DIMENSION(:,:,:,:), INTENT(out) ::   pmax   ! output 
     1661      ! 
     1662      REAL(wp), DIMENSION(Nis0:Nie0) ::   zmax1, zmax2 
     1663      REAL(wp)                       ::   zmax3 
    16431664      INTEGER  ::   jlay, ji, jj, jk, jl   ! dummy loop indices 
    16441665      !!---------------------------------------------------------------------- 
    16451666      jlay = SIZE( pice , 3 )   ! size of input arrays 
     1667      ! basic version: get the max of epsi20 + 9 neighbours 
     1668!!$      DO jl = 1, jpl 
     1669!!$         DO jk = 1, jlay 
     1670!!$            DO_2D( 0, 0, 0, 0 ) 
     1671!!$               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),   & 
     1672!!$                  &                             pice(ji-1,jj  ,jk,jl), pice(ji,jj  ,jk,jl), pice(ji+1,jj  ,jk,jl),   & 
     1673!!$                  &                             pice(ji-1,jj+1,jk,jl), pice(ji,jj+1,jk,jl), pice(ji+1,jj+1,jk,jl) ) 
     1674!!$            END_2D 
     1675!!$         END DO 
     1676!!$      END DO 
     1677      ! optimized version : does a little bit more than 2 max of epsi20 + 3 neighbours 
    16461678      DO jl = 1, jpl 
    16471679         DO jk = 1, jlay 
     1680            DO ji = Nis0, Nie0 
     1681               zmax1(ji) = MAX( epsi20, pice(ji,Njs0-1,jk,jl), pice(ji-1,Njs0-1,jk,jl), pice(ji+1,Njs0-1,jk,jl) ) 
     1682               zmax2(ji) = MAX( epsi20, pice(ji,Njs0  ,jk,jl), pice(ji-1,Njs0  ,jk,jl), pice(ji+1,Njs0  ,jk,jl) ) 
     1683            END DO 
    16481684            DO_2D( 0, 0, 0, 0 ) 
    1649                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),   & 
    1650                   &                             pice(ji-1,jj  ,jk,jl), pice(ji,jj  ,jk,jl), pice(ji+1,jj  ,jk,jl),   & 
    1651                   &                             pice(ji-1,jj+1,jk,jl), pice(ji,jj+1,jk,jl), pice(ji+1,jj+1,jk,jl) ) 
    1652             END_2D 
    1653          END DO 
    1654       END DO 
     1685               zmax3 = MAX( epsi20, pice(ji,jj+1,jk,jl), pice(ji-1,jj+1,jk,jl), pice(ji+1,jj+1,jk,jl) ) 
     1686               pmax(ji,jj,jk,jl) = MAX( epsi20, zmax1(ji), zmax2(ji), zmax3 ) 
     1687               zmax1(ji) = zmax2(ji) 
     1688               zmax2(ji) = zmax3 
     1689            END_2D 
     1690         END DO 
     1691      END DO 
     1692       
    16551693   END SUBROUTINE icemax4D 
    16561694 
Note: See TracChangeset for help on using the changeset viewer.