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.
dynbfr.F90 in branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/OPA_SRC/DYN – NEMO

source: branches/2017/dev_CNRS_2017/NEMOGCM/NEMO/OPA_SRC/DYN/dynbfr.F90 @ 8882

Last change on this file since 8882 was 8882, checked in by flavoni, 6 years ago

dev_CNRS_2017 branch: merged dev_r7881_ENHANCE09_RK3 with trunk r8864

  • Property svn:keywords set to Id
File size: 5.2 KB
Line 
1MODULE dynbfr
2   !!==============================================================================
3   !!                 ***  MODULE  dynbfr  ***
4   !! Ocean dynamics :  bottom friction component of the momentum mixing trend
5   !!==============================================================================
6   !! History :  3.2  ! 2008-11  (A. C. Coward)  Original code
7   !!            3.4  ! 2011-09  (H. Liu) Make it consistent with semi-implicit Bottom friction (ln_drgimp =T)
8   !!            4.0  ! 2017-05  (G. Madec)  drag coef. defined at t-point (zdfdrg.F90)
9   !!----------------------------------------------------------------------
10
11   !!----------------------------------------------------------------------
12   !!   dyn_bfr       : Update the momentum trend with the bottom friction contribution
13   !!----------------------------------------------------------------------
14   USE oce            ! ocean dynamics and tracers variables
15   USE dom_oce        ! ocean space and time domain variables
16   USE zdf_oce        ! vertical physics: variables
17   USE zdfdrg         ! vertical physics: top/bottom drag coef.
18   USE trd_oce        ! trends: ocean variables
19   USE trddyn         ! trend manager: dynamics
20   !
21   USE in_out_manager ! I/O manager
22   USE prtctl         ! Print control
23   USE timing         ! Timing
24
25   IMPLICIT NONE
26   PRIVATE
27
28   PUBLIC   dyn_bfr   !  routine called by step.F90
29
30   !! * Substitutions
31#  include "vectopt_loop_substitute.h90"
32   !!----------------------------------------------------------------------
33   !! NEMO/OPA 4.0 , NEMO Consortium (2017)
34   !! $Id$
35   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
36   !!----------------------------------------------------------------------
37CONTAINS
38   
39   SUBROUTINE dyn_bfr( kt )
40      !!----------------------------------------------------------------------
41      !!                  ***  ROUTINE dyn_bfr  ***
42      !!
43      !! ** Purpose :   compute the bottom friction ocean dynamics physics.
44      !!
45      !!              only for explicit bottom friction form
46      !!              implicit bfr is implemented in dynzdf_imp
47      !!
48      !! ** Action  :   (ua,va)   momentum trend increased by bottom friction trend
49      !!---------------------------------------------------------------------
50      INTEGER, INTENT(in) ::   kt   ! ocean time-step index
51      !!
52      INTEGER  ::   ji, jj       ! dummy loop indexes
53      INTEGER  ::   ikbu, ikbv   ! local integers
54      REAL(wp) ::   zm1_2dt      ! local scalar
55      REAL(wp) ::   zCdu, zCdv   !   -      -
56      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztrdu, ztrdv
57      !!---------------------------------------------------------------------
58      !
59      IF( ln_timing )   CALL timing_start('dyn_bfr')
60      !
61!!gm bug : time step is only rdt (not 2 rdt if euler start !)
62         zm1_2dt = - 1._wp / ( 2._wp * rdt )
63
64      IF( l_trddyn ) THEN      ! trends: store the input trends
65         ALLOCATE( ztrdu(jpi,jpj,jpk) , ztrdv(jpi,jpj,jpk) )
66         ztrdu(:,:,:) = ua(:,:,:)
67            ztrdv(:,:,:) = va(:,:,:)
68      ENDIF
69
70
71      DO jj = 2, jpjm1
72         DO ji = 2, jpim1
73            ikbu = mbku(ji,jj)          ! deepest wet ocean u- & v-levels
74            ikbv = mbkv(ji,jj)
75            !
76            ! Apply stability criteria on absolute value  : abs(bfr/e3) < 1/(2dt) => bfr/e3 > -1/(2dt)
77            zCdu = 0.5*( rCdU_bot(ji+1,jj)+rCdU_bot(ji,jj) ) / e3u_n(ji,jj,ikbu)
78            zCdv = 0.5*( rCdU_bot(ji,jj+1)+rCdU_bot(ji,jj) ) / e3v_n(ji,jj,ikbv)
79            !
80            ua(ji,jj,ikbu) = ua(ji,jj,ikbu) + MAX(  zCdu , zm1_2dt  ) * ub(ji,jj,ikbu)
81            va(ji,jj,ikbv) = va(ji,jj,ikbv) + MAX(  zCdv , zm1_2dt  ) * vb(ji,jj,ikbv)
82         END DO
83      END DO
84      !
85      IF( ln_isfcav ) THEN        ! ocean cavities
86         DO jj = 2, jpjm1
87            DO ji = 2, jpim1
88               ikbu = miku(ji,jj)          ! first wet ocean u- & v-levels
89               ikbv = mikv(ji,jj)
90               !
91               ! Apply stability criteria on absolute value  : abs(bfr/e3) < 1/(2dt) => bfr/e3 > -1/(2dt)
92               zCdu = 0.5*( rCdU_top(ji+1,jj)+rCdU_top(ji,jj) ) / e3u_n(ji,jj,ikbu)    ! NB: Cdtop masked
93               zCdv = 0.5*( rCdU_top(ji,jj+1)+rCdU_top(ji,jj) ) / e3v_n(ji,jj,ikbv)
94               !
95               ua(ji,jj,ikbu) = ua(ji,jj,ikbu) + MAX(  zCdu , zm1_2dt  ) * ub(ji,jj,ikbu)
96               va(ji,jj,ikbv) = va(ji,jj,ikbv) + MAX(  zCdv , zm1_2dt  ) * vb(ji,jj,ikbv)
97           END DO
98         END DO
99      ENDIF
100      !
101      IF( l_trddyn ) THEN      ! trends: send trends to trddyn for further diagnostics
102         ztrdu(:,:,:) = ua(:,:,:) - ztrdu(:,:,:)
103         ztrdv(:,:,:) = va(:,:,:) - ztrdv(:,:,:)
104         CALL trd_dyn( ztrdu(:,:,:), ztrdv(:,:,:), jpdyn_bfr, kt )
105         DEALLOCATE( ztrdu, ztrdv )
106      ENDIF
107      !                                          ! print mean trends (used for debugging)
108      IF(ln_ctl)   CALL prt_ctl( tab3d_1=ua, clinfo1=' bfr  - Ua: ', mask1=umask,               &
109         &                       tab3d_2=va, clinfo2=       ' Va: ', mask2=vmask, clinfo3='dyn' )
110      !
111      IF( ln_timing )   CALL timing_stop('dyn_bfr')
112      !
113   END SUBROUTINE dyn_bfr
114
115   !!==============================================================================
116END MODULE dynbfr
Note: See TracBrowser for help on using the repository browser.