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_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.