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 3294 for trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynbfr.F90 – NEMO

Ignore:
Timestamp:
2012-01-28T17:44:18+01:00 (12 years ago)
Author:
rblod
Message:

Merge of 3.4beta into the trunk

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/NEMOGCM/NEMO/OPA_SRC/DYN/dynbfr.F90

    r2715 r3294  
    55   !!============================================================================== 
    66   !! History :  3.2  ! 2008-11  (A. C. Coward)  Original code 
     7   !!            3.4  ! 2011-09  (H. Liu) Make it consistent with semi-implicit 
     8   !!                            Bottom friction (ln_bfrimp = .true.)  
    79   !!---------------------------------------------------------------------- 
    810 
     
    1315   USE dom_oce         ! ocean space and time domain variables  
    1416   USE zdf_oce         ! ocean vertical physics variables 
     17   USE zdfbfr          ! ocean bottom friction variables 
    1518   USE trdmod          ! ocean active dynamics and tracers trends  
    1619   USE trdmod_oce      ! ocean variables trends 
    1720   USE in_out_manager  ! I/O manager 
    1821   USE prtctl          ! Print control 
     22   USE timing          ! Timing 
     23   USE wrk_nemo        ! Memory Allocation 
    1924 
    2025   IMPLICIT NONE 
     
    4247      !! ** Action  :   (ua,va)   momentum trend increased by bottom friction trend 
    4348      !!--------------------------------------------------------------------- 
    44       USE oce, ONLY:   ztrduv => tsa   ! tsa used as 4D workspace 
    45       !! 
    4649      INTEGER, INTENT(in) ::   kt   ! ocean time-step index 
    4750      !!  
     
    4952      INTEGER  ::   ikbu, ikbv   ! local integers 
    5053      REAL(wp) ::   zm1_2dt      ! local scalar 
     54      REAL(wp), POINTER, DIMENSION(:,:,:) ::  ztrdu, ztrdv 
    5155      !!--------------------------------------------------------------------- 
    5256      ! 
    53       zm1_2dt = - 1._wp / ( 2._wp * rdt ) 
     57      IF( nn_timing == 1 )  CALL timing_start('dyn_bfr') 
     58      ! 
     59      IF( .NOT.ln_bfrimp) THEN     ! only for explicit bottom friction form 
     60                                    ! implicit bfr is implemented in dynzdf_imp 
    5461 
    55       IF( l_trddyn )   THEN                      ! temporary save of ua and va trends 
    56          ztrduv(:,:,:,1) = ua(:,:,:) 
    57          ztrduv(:,:,:,2) = va(:,:,:) 
    58       ENDIF 
     62        zm1_2dt = - 1._wp / ( 2._wp * rdt ) 
     63 
     64        IF( l_trddyn )   THEN                      ! temporary save of ua and va trends 
     65           CALL wrk_alloc( jpi,jpj,jpk, ztrdu, ztrdv ) 
     66           ztrdu(:,:,:) = ua(:,:,:) 
     67           ztrdv(:,:,:) = va(:,:,:) 
     68        ENDIF 
     69 
    5970 
    6071# if defined key_vectopt_loop 
    61       DO jj = 1, 1 
    62          DO ji = jpi+2, jpij-jpi-1   ! vector opt. (forced unrolling) 
     72        DO jj = 1, 1 
     73           DO ji = jpi+2, jpij-jpi-1   ! vector opt. (forced unrolling) 
    6374# else 
    64       DO jj = 2, jpjm1 
    65          DO ji = 2, jpim1 
     75        DO jj = 2, jpjm1 
     76           DO ji = 2, jpim1 
    6677# endif 
    67             ikbu = mbku(ji,jj)          ! deepest ocean u- & v-levels 
    68             ikbv = mbkv(ji,jj) 
    69             ! 
    70             ! Apply stability criteria on absolute value  : abs(bfr/e3) < 1/(2dt) => bfr/e3 > -1/(2dt) 
    71             ua(ji,jj,ikbu) = ua(ji,jj,ikbu) + MAX(  bfrua(ji,jj) / fse3u(ji,jj,ikbu) , zm1_2dt  ) * ub(ji,jj,ikbu) 
    72             va(ji,jj,ikbv) = va(ji,jj,ikbv) + MAX(  bfrva(ji,jj) / fse3v(ji,jj,ikbv) , zm1_2dt  ) * vb(ji,jj,ikbv) 
    73          END DO 
    74       END DO 
     78              ikbu = mbku(ji,jj)          ! deepest ocean u- & v-levels 
     79              ikbv = mbkv(ji,jj) 
     80              ! 
     81              ! Apply stability criteria on absolute value  : abs(bfr/e3) < 1/(2dt) => bfr/e3 > -1/(2dt) 
     82              ua(ji,jj,ikbu) = ua(ji,jj,ikbu) + MAX(  bfrua(ji,jj) / fse3u(ji,jj,ikbu) , zm1_2dt  ) * ub(ji,jj,ikbu) 
     83              va(ji,jj,ikbv) = va(ji,jj,ikbv) + MAX(  bfrva(ji,jj) / fse3v(ji,jj,ikbv) , zm1_2dt  ) * vb(ji,jj,ikbv) 
     84           END DO 
     85        END DO 
    7586 
     87        ! 
     88        IF( l_trddyn )   THEN                      ! save the vertical diffusive trends for further diagnostics 
     89           ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:) 
     90           ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:) 
     91           CALL trd_mod( ztrdu(:,:,:), ztrdv(:,:,:), jpdyn_trd_bfr, 'DYN', kt ) 
     92           CALL wrk_dealloc( jpi,jpj,jpk, ztrdu, ztrdv ) 
     93        ENDIF 
     94        !                                          ! print mean trends (used for debugging) 
     95        IF(ln_ctl)   CALL prt_ctl( tab3d_1=ua, clinfo1=' bfr  - Ua: ', mask1=umask,               & 
     96           &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
     97        ! 
     98      ENDIF     ! end explicit bottom friction 
    7699      ! 
    77       IF( l_trddyn )   THEN                      ! save the vertical diffusive trends for further diagnostics 
    78          ztrduv(:,:,:,1) = ua(:,:,:) - ztrduv(:,:,:,1) 
    79          ztrduv(:,:,:,2) = va(:,:,:) - ztrduv(:,:,:,2) 
    80          CALL trd_mod( ztrduv(:,:,:,1), ztrduv(:,:,:,2), jpdyn_trd_bfr, 'DYN', kt ) 
    81       ENDIF 
    82       !                                          ! print mean trends (used for debugging) 
    83       IF(ln_ctl)   CALL prt_ctl( tab3d_1=ua, clinfo1=' bfr  - Ua: ', mask1=umask,               & 
    84          &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' ) 
     100      IF( nn_timing == 1 )  CALL timing_stop('dyn_bfr') 
    85101      ! 
    86102   END SUBROUTINE dyn_bfr 
Note: See TracChangeset for help on using the changeset viewer.