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.
zdfbfr.F90 in trunk/NEMO/OPA_SRC/ZDF – NEMO

source: trunk/NEMO/OPA_SRC/ZDF/zdfbfr.F90 @ 3

Last change on this file since 3 was 3, checked in by opalod, 20 years ago

Initial revision

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.5 KB
Line 
1MODULE zdfbfr
2   !!======================================================================
3   !!                       ***  MODULE  zdfbfr  ***
4   !! Ocean physics: Bottom friction
5   !!======================================================================
6
7   !!----------------------------------------------------------------------
8   !!   zdf_bfr      : update momentum Kz at the ocean bottom due to the
9   !!                  type of bottom friction chosen
10   !!   zdf_bfr_init : read in namelist and control the bottom friction
11   !!                  parameters.
12   !!----------------------------------------------------------------------
13   !! * Modules used
14   USE oce             ! ocean dynamics and tracers variables
15   USE dom_oce         ! ocean space and time domain variables
16   USE zdf_oce         ! ocean vertical physics variables
17   USE in_out_manager  ! I/O manager
18   USE lbclnk          ! ocean lateral boundary conditions (or mpp link)
19
20   IMPLICIT NONE
21   PRIVATE
22
23   !! * Routine accessibility
24   PUBLIC zdf_bfr    ! called by step.F90
25
26   !! * Module variables
27   INTEGER ::             & !!! ** bottom friction namelist (nambfr) **
28      nbotfr = 0             ! = 0/1/2/3 type of bottom friction
29   REAL(wp) ::            & !!! ** bottom friction namelist (nambfr) **
30      bfri1 = 4.0e-4_wp,  &  ! bottom drag coefficient (linear case)
31      bfri2 = 1.0e-3_wp,  &  ! bottom drag coefficient (non linear case)
32      bfeb2 = 2.5e-3_wp      ! background bottom turbulent kinetic energy  (m2/s2)
33
34   !! * Substitutions
35#  include "domzgr_substitute.h90"
36   !!----------------------------------------------------------------------
37   !!   OPA 9.0 , LODYC-IPSL  (2003)
38   !!----------------------------------------------------------------------
39
40CONTAINS
41
42   SUBROUTINE zdf_bfr( kt )
43      !!----------------------------------------------------------------------
44      !!                   ***  ROUTINE zdf_bfr  ***
45      !!                 
46      !! ** Purpose :   Applied the bottom friction through a specification of
47      !!      Kz at the ocean bottom.
48      !!
49      !! ** Method  :   Update the value of avmu and avmv at the ocean bottom
50      !!       level following the chosen friction type (no-slip, free-slip,
51      !!       linear, or quadratic)
52      !!
53      !! History :
54      !!   8.0  !  97-06  (G. Madec, A.-M. Treguier)  Original code
55      !!   8.5  !  02-06  (G. Madec)  F90: Free form and module
56      !!----------------------------------------------------------------------
57      !! * Arguments
58      INTEGER, INTENT( in ) ::   kt   ! ocean time-step index
59
60      !! * Local declarations
61      INTEGER ::   &
62         ji, jj,                   &  ! dummy loop indexes
63         ikbu, ikbv,               &  ! temporary integers
64         ikbum1, ikbvm1               !
65      REAL(wp) ::   &
66         zvu, zuv, zecu, zecv         ! temporary scalars
67      !!----------------------------------------------------------------------
68
69
70      IF( kt == nit000 )   CALL zdf_bfr_init
71
72
73      ! Compute avmu, avmv at the ocean bottom
74      ! --------------------------------------
75
76      SELECT CASE (nbotfr)
77
78      CASE( 0 )                 ! no-slip boundary condition
79# if defined key_vectopt_loop   &&   ! defined key_autotasking
80         jj = 1
81         DO ji = jpi+2, jpij-jpi-1   ! vector opt. (forced unrolling)
82# else
83         DO jj = 2, jpjm1
84            DO ji = 2, jpim1
85# endif
86               ikbu   = MIN( mbathy(ji+1,jj  ), mbathy(ji,jj) )
87               ikbv   = MIN( mbathy(ji  ,jj+1), mbathy(ji,jj) )
88               ikbum1 = MAX( ikbu-1, 1 )
89               ikbvm1 = MAX( ikbv-1, 1 )
90               avmu(ji,jj,ikbu) = 2. * avmu(ji,jj,ikbum1)
91               avmv(ji,jj,ikbv) = 2. * avmv(ji,jj,ikbvm1)
92# if ! defined key_vectopt_loop   ||   defined key_autotasking
93            END DO
94# endif
95         END DO
96
97      CASE( 1 )                 ! linear botton friction
98# if defined key_vectopt_loop   &&   ! defined key_autotasking
99         jj = 1
100         DO ji = jpi+2, jpij-jpi-1   ! vector opt. (forced unrolling)
101# else
102         DO jj = 2, jpjm1
103            DO ji = 2, jpim1
104# endif
105               ikbu = MIN( mbathy(ji+1,jj), mbathy(ji,jj) )
106               ikbv = MIN( mbathy(ji,jj+1), mbathy(ji,jj) )
107               avmu(ji,jj,ikbu) = bfri1 * fse3uw(ji,jj,ikbu)
108               avmv(ji,jj,ikbv) = bfri1 * fse3vw(ji,jj,ikbv)
109# if ! defined key_vectopt_loop   ||   defined key_autotasking
110            END DO
111# endif
112         END DO
113
114      CASE( 2 )                 ! quadratic botton friction
115# if defined key_vectopt_loop   &&   ! defined key_autotasking
116         jj = 1
117!CDIR NOVERRCHK
118         DO ji = jpi+2, jpij-jpi-1   ! vector opt. (forced unrolling)
119# else
120!CDIR NOVERRCHK
121         DO jj = 2, jpjm1
122!CDIR NOVERRCHK
123            DO ji = 2, jpim1
124# endif
125               ikbu   = MIN( mbathy(ji+1,jj  ), mbathy(ji,jj) )
126               ikbv   = MIN( mbathy(ji  ,jj+1), mbathy(ji,jj) )
127               ikbum1 = MAX( ikbu-1, 1 )
128               ikbvm1 = MAX( ikbv-1, 1 )
129               
130               zvu  = 0.25 * (  vn(ji,jj  ,ikbum1) + vn(ji+1,jj  ,ikbum1)     &
131                              + vn(ji,jj-1,ikbum1) + vn(ji+1,jj-1,ikbum1)  )
132               
133               zuv  = 0.25 * (  un(ji,jj  ,ikbvm1) + un(ji-1,jj  ,ikbvm1)     &
134                              + un(ji,jj+1,ikbvm1) + un(ji-1,jj+1,ikbvm1)  )
135               
136               zecu = SQRT(  un(ji,jj,ikbum1) * un(ji,jj,ikbum1) + zvu*zvu + bfeb2  )
137               zecv = SQRT(  vn(ji,jj,ikbvm1) * vn(ji,jj,ikbvm1) + zuv*zuv + bfeb2  )
138               
139               avmu(ji,jj,ikbu) = bfri2 * zecu * fse3uw(ji,jj,ikbu)
140               avmv(ji,jj,ikbv) = bfri2 * zecv * fse3vw(ji,jj,ikbv)
141# if ! defined key_vectopt_loop   ||   defined key_autotasking
142            END DO
143# endif
144         END DO
145
146      CASE( 3 )                 ! free-slip boundary condition
147# if defined key_vectopt_loop   &&   ! defined key_autotasking
148         jj = 1
149         DO ji = jpi+2, jpij-jpi-1   ! vector opt. (forced unrolling)
150# else
151         DO jj = 2, jpjm1
152            DO ji = 2, jpim1
153# endif
154               ikbu = MIN( mbathy(ji+1,jj  ), mbathy(ji,jj) )
155               ikbv = MIN( mbathy(ji  ,jj+1), mbathy(ji,jj) )
156               avmu(ji,jj,ikbu) = 0.e0
157               avmv(ji,jj,ikbv) = 0.e0
158# if ! defined key_vectopt_loop   ||   defined key_autotasking
159            END DO
160# endif
161         END DO
162
163      END SELECT
164
165      ! Lateral boundary condition on (avmu,avmv)   (unchanged sign)
166      ! ------------------------------===========
167      CALL lbc_lnk( avmu, 'U', 1. )
168      CALL lbc_lnk( avmv, 'V', 1. )
169
170   END SUBROUTINE zdf_bfr
171
172
173   SUBROUTINE zdf_bfr_init
174      !!----------------------------------------------------------------------
175      !!                  ***  ROUTINE zdf_bfr_init  ***
176      !!                   
177      !! ** Purpose :   Initialization of the bottom friction
178      !!
179      !! ** Method  :   Read the nammbf namelist and check their consistency
180      !!      called at the first timestep (nit000)
181      !!
182      !! History :
183      !!   9.0  !  02-06  (G. Madec)  Original code
184      !!----------------------------------------------------------------------
185      !! * Local declarations
186      NAMELIST/nambfr/ nbotfr, bfri1, bfri2, bfeb2
187      !!----------------------------------------------------------------------
188
189      ! Read Namelist nambfr : bottom momentum boundary condition
190      ! --------------------
191      REWIND ( numnam )
192      READ   ( numnam, nambfr )
193
194
195      ! Parameter control and print
196      ! ---------------------------
197      IF(lwp) WRITE(numout,*)
198      IF(lwp) WRITE(numout,*) 'zdf_bfr : momentum bottom friction'
199      IF(lwp) WRITE(numout,*) '~~~~~~~'
200      IF(lwp) WRITE(numout,*) '          Namelist nambfr : set bottom friction parameters'
201
202      SELECT CASE (nbotfr)
203
204      CASE( 0 )
205         IF(lwp) WRITE(numout,*) '            no-slip '
206
207      CASE( 1 )
208         IF(lwp) WRITE(numout,*) '            linear botton friction'
209         IF(lwp) WRITE(numout,*) '            friction coef.   bfri1  = ', bfri1
210
211      CASE( 2 )
212         IF(lwp) WRITE(numout,*) '            quadratic botton friction'
213         IF(lwp) WRITE(numout,*) '            friction coef.   bfri2  = ', bfri2
214         IF(lwp) WRITE(numout,*) '            background tke   bfeb2  = ', bfeb2
215
216      CASE( 3 )
217         IF(lwp) WRITE(numout,*) '            free-slip '
218
219      CASE DEFAULT
220         IF(lwp) WRITE(numout,cform_err)
221         IF(lwp) WRITE(numout,*) '         bad flag value for nbotfr = ', nbotfr
222         nstop = nstop + 1
223
224      END SELECT
225
226   END SUBROUTINE zdf_bfr_init
227
228   !!======================================================================
229END MODULE zdfbfr
Note: See TracBrowser for help on using the repository browser.