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 5883 for branches/2015/dev_r5836_NOC3_vvl_by_default/NEMOGCM/NEMO/OPA_SRC/DYN/dynadv_cen2.F90 – NEMO

Ignore:
Timestamp:
2015-11-13T08:01:08+01:00 (8 years ago)
Author:
gm
Message:

#1613: vvl by default: TRA/TRC remove optimization associated with linear free surface

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2015/dev_r5836_NOC3_vvl_by_default/NEMOGCM/NEMO/OPA_SRC/DYN/dynadv_cen2.F90

    r5866 r5883  
    1010 
    1111   !!---------------------------------------------------------------------- 
    12    !!   dyn_adv_cen2       : flux form momentum advection (ln_dynadv_cen2=T) 
    13    !!                        trends using a 2nd order centred scheme   
     12   !!   dyn_adv_cen2  : flux form momentum advection (ln_dynadv_cen2=T) using a 2nd order centred scheme   
    1413   !!---------------------------------------------------------------------- 
    1514   USE oce            ! ocean dynamics and tracers 
     
    6766      ENDIF 
    6867      ! 
    69       IF( l_trddyn ) THEN           ! Save ua and va trends 
     68      IF( l_trddyn ) THEN           ! trends: store the input trends 
    7069         zfu_uw(:,:,:) = ua(:,:,:) 
    7170         zfv_vw(:,:,:) = va(:,:,:) 
    7271      ENDIF 
    73  
    74       !                                      ! ====================== ! 
    75       !                                      !  Horizontal advection  ! 
    76       DO jk = 1, jpkm1                       ! ====================== ! 
    77          !                                         ! horizontal volume fluxes 
     72      ! 
     73      !                             !==  Horizontal advection  ==! 
     74      ! 
     75      DO jk = 1, jpkm1                    ! horizontal transport 
    7876         zfu(:,:,jk) = 0.25 * e2u(:,:) * e3u_n(:,:,jk) * un(:,:,jk) 
    7977         zfv(:,:,jk) = 0.25 * e1v(:,:) * e3v_n(:,:,jk) * vn(:,:,jk) 
    80          ! 
    81          DO jj = 1, jpjm1                          ! horizontal momentum fluxes at T- and F-point 
     78         DO jj = 1, jpjm1                 ! horizontal momentum fluxes (at T- and F-point) 
    8279            DO ji = 1, fs_jpim1   ! vector opt. 
    83                zfu_t(ji+1,jj  ,jk) = ( zfu(ji,jj,jk) + zfu(ji+1,jj  ,jk) ) * ( un(ji,jj,jk) + un(ji+1,jj  ,jk) ) 
    84                zfv_f(ji  ,jj  ,jk) = ( zfv(ji,jj,jk) + zfv(ji+1,jj  ,jk) ) * ( un(ji,jj,jk) + un(ji  ,jj+1,jk) ) 
    85                zfu_f(ji  ,jj  ,jk) = ( zfu(ji,jj,jk) + zfu(ji  ,jj+1,jk) ) * ( vn(ji,jj,jk) + vn(ji+1,jj  ,jk) ) 
    86                zfv_t(ji  ,jj+1,jk) = ( zfv(ji,jj,jk) + zfv(ji  ,jj+1,jk) ) * ( vn(ji,jj,jk) + vn(ji  ,jj+1,jk) ) 
     80               zfu_t(ji+1,jj  ,jk) = ( zfu(ji,jj,jk) + zfu(ji+1,jj,jk) ) * ( un(ji,jj,jk) + un(ji+1,jj  ,jk) ) 
     81               zfv_f(ji  ,jj  ,jk) = ( zfv(ji,jj,jk) + zfv(ji+1,jj,jk) ) * ( un(ji,jj,jk) + un(ji  ,jj+1,jk) ) 
     82               zfu_f(ji  ,jj  ,jk) = ( zfu(ji,jj,jk) + zfu(ji,jj+1,jk) ) * ( vn(ji,jj,jk) + vn(ji+1,jj  ,jk) ) 
     83               zfv_t(ji  ,jj+1,jk) = ( zfv(ji,jj,jk) + zfv(ji,jj+1,jk) ) * ( vn(ji,jj,jk) + vn(ji  ,jj+1,jk) ) 
    8784            END DO 
    8885         END DO 
    89          DO jj = 2, jpjm1                          ! divergence of horizontal momentum fluxes 
     86         DO jj = 2, jpjm1                 ! divergence of horizontal momentum fluxes 
    9087            DO ji = fs_2, fs_jpim1   ! vector opt. 
    9188               zbu = e1e2u(ji,jj) * e3u_n(ji,jj,jk) 
    9289               zbv = e1e2v(ji,jj) * e3v_n(ji,jj,jk) 
    9390               ! 
    94                ua(ji,jj,jk) = ua(ji,jj,jk) - (  zfu_t(ji+1,jj  ,jk) - zfu_t(ji  ,jj  ,jk)    & 
    95                   &                           + zfv_f(ji  ,jj  ,jk) - zfv_f(ji  ,jj-1,jk)  ) / zbu 
    96                va(ji,jj,jk) = va(ji,jj,jk) - (  zfu_f(ji  ,jj  ,jk) - zfu_f(ji-1,jj  ,jk)    & 
    97                   &                           + zfv_t(ji  ,jj+1,jk) - zfv_t(ji  ,jj  ,jk)  ) / zbv 
     91               ua(ji,jj,jk) = ua(ji,jj,jk) - (  zfu_t(ji+1,jj,jk) - zfu_t(ji,jj  ,jk)    & 
     92                  &                           + zfv_f(ji  ,jj,jk) - zfv_f(ji,jj-1,jk)  ) / zbu 
     93               va(ji,jj,jk) = va(ji,jj,jk) - (  zfu_f(ji,jj  ,jk) - zfu_f(ji-1,jj,jk)    & 
     94                  &                           + zfv_t(ji,jj+1,jk) - zfv_t(ji  ,jj,jk)  ) / zbv 
    9895            END DO 
    9996         END DO 
    10097      END DO 
    10198      ! 
    102       IF( l_trddyn ) THEN                          ! save the horizontal advection trend for diagnostic 
     99      IF( l_trddyn ) THEN           ! trends: send trend to trddyn for diagnostic 
    103100         zfu_uw(:,:,:) = ua(:,:,:) - zfu_uw(:,:,:) 
    104101         zfv_vw(:,:,:) = va(:,:,:) - zfv_vw(:,:,:) 
     
    108105      ENDIF 
    109106      ! 
    110  
    111       !                                      ! ==================== ! 
    112       !                                      !  Vertical advection  ! 
    113       DO jk = 1, jpkm1                       ! ==================== ! 
    114          !                                         ! Vertical volume fluxesÊ 
    115          zfw(:,:,jk) = 0.25 * e1e2t(:,:) * wn(:,:,jk) 
    116          ! 
    117          IF( jk == 1 ) THEN                        ! surface/bottom advective fluxes                    
    118             zfu_uw(:,:,jpk) = 0.e0                      ! Bottom  value : flux set to zero 
    119             zfv_vw(:,:,jpk) = 0.e0 
    120             !                                           ! Surface value : 
    121             IF( .NOT.ln_linssh ) THEN                        ! variable volume : flux set to zero 
    122                zfu_uw(:,:, 1 ) = 0._wp     
    123                zfv_vw(:,:, 1 ) = 0._wp 
    124             ELSE                                             ! constant volume : advection through the surface 
    125                DO jj = 2, jpjm1 
    126                   DO ji = fs_2, fs_jpim1 
    127                      zfu_uw(ji,jj, 1 ) = 2.e0 * ( zfw(ji,jj,1) + zfw(ji+1,jj  ,1) ) * un(ji,jj,1) 
    128                      zfv_vw(ji,jj, 1 ) = 2.e0 * ( zfw(ji,jj,1) + zfw(ji  ,jj+1,1) ) * vn(ji,jj,1) 
    129                   END DO 
    130                END DO 
    131             ENDIF 
    132          ELSE                                      ! interior fluxes 
    133             DO jj = 2, jpjm1 
    134                DO ji = fs_2, fs_jpim1   ! vector opt. 
    135                   zfu_uw(ji,jj,jk) = ( zfw(ji,jj,jk)+ zfw(ji+1,jj  ,jk) ) * ( un(ji,jj,jk) + un(ji,jj,jk-1) ) 
    136                   zfv_vw(ji,jj,jk) = ( zfw(ji,jj,jk)+ zfw(ji  ,jj+1,jk) ) * ( vn(ji,jj,jk) + vn(ji,jj,jk-1) ) 
    137                END DO 
     107      !                             !==  Vertical advection  ==! 
     108      ! 
     109      DO jj = 2, jpjm1                    ! surface/bottom advective fluxes set to zero 
     110         DO ji = fs_2, fs_jpim1 
     111            zfu_uw(ji,jj,jpk) = 0._wp   ;   zfv_vw(jj,jj,jpk) = 0._wp 
     112            zfu_uw(ji,jj, 1 ) = 0._wp   ;   zfv_vw(jj,jj, 1 ) = 0._wp 
     113         END DO 
     114      END DO 
     115      IF( ln_linssh ) THEN                ! linear free surface: advection through the surface 
     116         DO jj = 2, jpjm1 
     117            DO ji = fs_2, fs_jpim1 
     118               zfu_uw(ji,jj,1) = 0.5_wp * ( e1e2t(ji,jj) * wn(ji,jj,1) + e1e2t(ji+1,jj) * wn(ji+1,jj,1) ) * un(ji,jj,1) 
     119               zfv_vw(ji,jj,1) = 0.5_wp * ( e1e2t(ji,jj) * wn(ji,jj,1) + e1e2t(ji,jj+1) * wn(ji,jj+1,1) ) * vn(ji,jj,1) 
    138120            END DO 
    139          ENDIF 
    140       END DO 
    141       DO jk = 1, jpkm1                             ! divergence of vertical momentum flux divergence 
    142          DO jj = 2, jpjm1  
     121         END DO 
     122      ENDIF 
     123      DO jk = 2, jpkm1                    ! interior advective fluxes 
     124         DO jj = 2, jpjm1                       ! 1/4 * Vertical transport 
     125            DO ji = fs_2, fs_jpim1 
     126               zfw(ji,jj,jk) = 0.25_wp * e1e2t(ji,jj) * wn(ji,jj,jk) 
     127            END DO 
     128         END DO 
     129         DO jj = 2, jpjm1 
    143130            DO ji = fs_2, fs_jpim1   ! vector opt. 
    144                ua(ji,jj,jk) =  ua(ji,jj,jk) - ( zfu_uw(ji,jj,jk) - zfu_uw(ji,jj,jk+1) )    & 
    145                   &  / ( e1e2u(ji,jj) * e3u_n(ji,jj,jk) ) 
    146                va(ji,jj,jk) =  va(ji,jj,jk) - ( zfv_vw(ji,jj,jk) - zfv_vw(ji,jj,jk+1) )    & 
    147                   &  / ( e1e2v(ji,jj) * e3v_n(ji,jj,jk) ) 
     131               zfu_uw(ji,jj,jk) = ( zfw(ji,jj,jk) + zfw(ji+1,jj  ,jk) ) * ( un(ji,jj,jk) + un(ji,jj,jk-1) ) 
     132               zfv_vw(ji,jj,jk) = ( zfw(ji,jj,jk) + zfw(ji  ,jj+1,jk) ) * ( vn(ji,jj,jk) + vn(ji,jj,jk-1) ) 
    148133            END DO 
    149134         END DO 
    150135      END DO 
    151136      ! 
    152       IF( l_trddyn ) THEN                          ! save the vertical advection trend for diagnostic 
     137      DO jk = 1, jpkm1                    ! divergence of vertical momentum flux divergence 
     138         DO jj = 2, jpjm1  
     139            DO ji = fs_2, fs_jpim1   ! vector opt. 
     140               ua(ji,jj,jk) = ua(ji,jj,jk) - ( zfu_uw(ji,jj,jk) - zfu_uw(ji,jj,jk+1) ) * r1_e1e2u(ji,jj) / e3u_n(ji,jj,jk) 
     141               va(ji,jj,jk) = va(ji,jj,jk) - ( zfv_vw(ji,jj,jk) - zfv_vw(ji,jj,jk+1) ) * r1_e1e2v(ji,jj) / e3v_n(ji,jj,jk) 
     142            END DO 
     143         END DO 
     144      END DO 
     145      ! 
     146      IF( l_trddyn ) THEN                 ! trends: send trend to trddyn for diagnostic 
    153147         zfu_t(:,:,:) = ua(:,:,:) - zfu_t(:,:,:) 
    154148         zfv_t(:,:,:) = va(:,:,:) - zfv_t(:,:,:) 
    155149         CALL trd_dyn( zfu_t, zfv_t, jpdyn_zad, kt ) 
    156150      ENDIF 
    157       !                                            ! Control print 
     151      !                                   ! Control print 
    158152      IF(ln_ctl)   CALL prt_ctl( tab3d_1=ua, clinfo1=' cen2 adv - Ua: ', mask1=umask,   & 
    159153         &                       tab3d_2=va, clinfo2=           ' Va: ', mask2=vmask, clinfo3='dyn' ) 
Note: See TracChangeset for help on using the changeset viewer.