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 14428 – NEMO

Changeset 14428


Ignore:
Timestamp:
2021-02-10T19:12:36+01:00 (3 years ago)
Author:
techene
Message:

#2605 loop optimisation from gm

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2021/dev_r14318_RK3_stage1/src/OCE/DYN/dynzad.F90

    r14072 r14428  
    44   !! Ocean dynamics : vertical advection trend 
    55   !!====================================================================== 
    6    !! History :  OPA  ! 1991-01  (G. Madec) Original code 
    7    !!   NEMO     0.5  ! 2002-07  (G. Madec) Free form, F90 
     6   !! History :  OPA  !  1991-01  (G. Madec) Original code 
     7   !!   NEMO     0.5  !  2002-07  (G. Madec) Free form, F90 
     8   !!            4.5  !  2021-01  (S. Techene, G. Madec) memory optimization 
    89   !!---------------------------------------------------------------------- 
    910 
     
    5455      !!              - Send the trends to trddyn for diagnostics (l_trddyn=T) 
    5556      !!---------------------------------------------------------------------- 
    56       INTEGER                             , INTENT( in )  ::  kt               ! ocean time-step inedx 
    57       INTEGER                             , INTENT( in )  ::  Kmm, Krhs        ! ocean time level indices 
    58       REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::  puu, pvv         ! ocean velocities and RHS of momentum equation 
     57      INTEGER                             , INTENT(in   ) ::    kt, Kmm, Krhs   ! ocean time-step & time-level indices 
     58      REAL(wp), DIMENSION(jpi,jpj,jpk,jpt), INTENT(inout) ::    puu, pvv        ! ocean velocities and RHS of momentum equation 
    5959      ! 
    6060      INTEGER  ::   ji, jj, jk   ! dummy loop indices 
    61       REAL(wp) ::   zua, zva     ! local scalars 
    62       REAL(wp), DIMENSION(jpi,jpj)     ::   zww 
    63       REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zwuw, zwvw 
    64       REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztrdu, ztrdv 
     61      REAL(wp) ::   zWf, zWfi, zzWfu, zzWdzU   ! local scalars 
     62      REAL(wp) ::        zWfj, zzWfv, zzWdzV   !   -      - 
     63      REAL(wp), DIMENSION(A2D(0))             ::   zWdzU, zWdzV   ! 2D inner workspace 
     64      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztrdu, ztrdv   ! 3D workspace 
    6565      !!---------------------------------------------------------------------- 
    6666      ! 
     
    7171         IF(lwp) WRITE(numout,*) 'dyn_zad : 2nd order vertical advection scheme' 
    7272      ENDIF 
    73  
     73      ! 
    7474      IF( l_trddyn )   THEN           ! Save puu(:,:,:,Krhs) and pvv(:,:,:,Krhs) trends 
    7575         ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) ) 
     
    7777         ztrdv(:,:,:) = pvv(:,:,:,Krhs) 
    7878      ENDIF 
    79  
    80       DO jk = 2, jpkm1                ! Vertical momentum advection at level w and u- and v- vertical 
    81          DO_2D( 0, 1, 0, 1 )              ! vertical fluxes 
    82           IF( ln_vortex_force ) THEN 
    83             zww(ji,jj) = 0.25_wp * e1e2t(ji,jj) * ( ww(ji,jj,jk) + wsd(ji,jj,jk) ) 
    84           ELSE 
    85             zww(ji,jj) = 0.25_wp * e1e2t(ji,jj) * ww(ji,jj,jk) 
    86           ENDIF 
    87          END_2D 
    88          DO_2D( 0, 0, 0, 0 )              ! vertical momentum advection at w-point 
    89             zwuw(ji,jj,jk) = ( zww(ji+1,jj  ) + zww(ji,jj) ) * ( puu(ji,jj,jk-1,Kmm) - puu(ji,jj,jk,Kmm) ) 
    90             zwvw(ji,jj,jk) = ( zww(ji  ,jj+1) + zww(ji,jj) ) * ( pvv(ji,jj,jk-1,Kmm) - pvv(ji,jj,jk,Kmm) ) 
    91          END_2D 
    92       END DO 
    9379      ! 
    94       ! Surface and bottom advective fluxes set to zero 
    95       DO_2D( 0, 0, 0, 0 ) 
    96          zwuw(ji,jj, 1 ) = 0._wp 
    97          zwvw(ji,jj, 1 ) = 0._wp 
    98          zwuw(ji,jj,jpk) = 0._wp 
    99          zwvw(ji,jj,jpk) = 0._wp 
    100       END_2D 
     80      !                                !==  vertical momentum advection ==!   at u- and v-points 
    10181      ! 
    102       DO_3D( 0, 0, 0, 0, 1, jpkm1 )   ! Vertical momentum advection at u- and v-points 
    103          puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) - ( zwuw(ji,jj,jk) + zwuw(ji,jj,jk+1) ) * r1_e1e2u(ji,jj)   & 
    104             &                                      / e3u(ji,jj,jk,Kmm) 
    105          pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) - ( zwvw(ji,jj,jk) + zwvw(ji,jj,jk+1) ) * r1_e1e2v(ji,jj)   & 
    106             &                                      / e3v(ji,jj,jk,Kmm) 
     82      zWdzU(A2D(0)) = 0._wp                  ! set surface (jk=1) vertical advection to zero 
     83      zWdzV(A2D(0)) = 0._wp 
     84      ! 
     85      DO_3D( 0, 0, 0, 0, 1, jpkm1 )  
     86         !                                ! vertical transport at jk+1 uw/vw-level (x2): 2*mi/j[e1e2t*(We)] 
     87         IF( ln_vortex_force ) THEN             ! We = ww+wsd 
     88            zWf  = e1e2t(ji  ,jj  ) * ( ww(ji  ,jj  ,jk+1) + wsd(ji  ,jj  ,jk+1) ) 
     89            zWfi = e1e2t(ji+1,jj  ) * ( ww(ji+1,jj  ,jk+1) + wsd(ji+1,jj  ,jk+1) ) 
     90            zWfj = e1e2t(ji  ,jj+1) * ( ww(ji  ,jj+1,jk+1) + wsd(ji  ,jj+1,jk+1) ) 
     91         ELSE                                   ! We = ww 
     92            zWf  = e1e2t(ji  ,jj  ) *   ww(ji  ,jj  ,jk+1) 
     93            zWfi = e1e2t(ji+1,jj  ) *   ww(ji+1,jj  ,jk+1) 
     94            zWfj = e1e2t(ji  ,jj+1) *   ww(ji  ,jj+1,jk+1) 
     95         ENDIF 
     96         zzWfu = zWfi + zWf                     ! averaging at uw- and vw-points (x2) 
     97         zzWfv = zWfj + zWf  
     98         !                                ! vertical advection at jk+1 uw-level (x4): zzWfu/v*dk+1[u/v]  
     99         zzWdzU = zzWfu * ( puu(ji,jj,jk,Kmm) - puu(ji,jj,jk+1,Kmm) ) 
     100         zzWdzV = zzWfv * ( pvv(ji,jj,jk,Kmm) - pvv(ji,jj,jk+1,Kmm) ) 
     101         ! 
     102         !                                ! vertical advection  at jk u/v-level  
     103         puu(ji,jj,jk,Krhs) = puu(ji,jj,jk,Krhs) - 0.25_wp * r1_e1e2u(ji,jj) / e3u(ji,jj,jk,Kmm)   & 
     104            &                                    * ( zWdzU(ji,jj) + zzWdzU ) 
     105         pvv(ji,jj,jk,Krhs) = pvv(ji,jj,jk,Krhs) - 0.25_wp * r1_e1e2v(ji,jj) / e3v(ji,jj,jk,Kmm)   & 
     106            &                                    * ( zWdzV(ji,jj) + zzWdzV ) 
     107         ! 
     108         IF( jk /= jpkm1 ) THEN             ! save for next level computation  
     109            zWdzU(ji,jj) = zzWdzU  
     110            zWdzV(ji,jj) = zzWdzV 
     111         ENDIF 
     112         ! 
    107113      END_3D 
    108  
     114      ! 
    109115      IF( l_trddyn ) THEN             ! save the vertical advection trends for diagnostic 
    110116         ztrdu(:,:,:) = puu(:,:,:,Krhs) - ztrdu(:,:,:) 
Note: See TracChangeset for help on using the changeset viewer.