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.
trabbl_adv.h90 in trunk/NEMO/OPA_SRC/TRA – NEMO

source: trunk/NEMO/OPA_SRC/TRA/trabbl_adv.h90 @ 216

Last change on this file since 216 was 216, checked in by opalod, 19 years ago

CT : UPDATE151 : New trends organization

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 22.2 KB
Line 
1   !!----------------------------------------------------------------------
2   !!                     ***  trabbl_adv.h90  ***
3   !!----------------------------------------------------------------------
4
5   !!----------------------------------------------------------------------
6   !!   OPA 9.0 , LODYC-IPSL  (2003)
7   !!----------------------------------------------------------------------
8
9   SUBROUTINE tra_bbl_adv( kt )
10      !!----------------------------------------------------------------------
11      !!                  ***  ROUTINE tra_bbl_adv  ***
12      !!                   
13      !! ** Purpose :   Compute the before tracer (t & s) trend associated
14      !!     with the bottom boundary layer and add it to the general trend
15      !!     of tracer equations. The bottom boundary layer is supposed to be
16      !!     both an advective and diffusive bottom boundary layer.
17      !!
18      !! ** Method  :   Computes the bottom boundary horizontal and vertical
19      !!      advection terms. Add it to the general trend : ta =ta + adv_bbl.
20      !!        When the product grad( rho) * grad(h) < 0 (where grad is a
21      !!      along bottom slope gradient) an additional lateral 2nd order
22      !!      diffusion along the bottom slope is added to the general
23      !!      tracer trend, otherwise the additional trend is set to 0.
24      !!      Second order operator (laplacian type) with variable coefficient
25      !!      computed as follow for temperature (idem on s):
26      !!         difft = 1/(e1t*e2t*e3t) { di-1[ ahbt e2u*e3u/e1u di[ztb] ]
27      !!                                 + dj-1[ ahbt e1v*e3v/e2v dj[ztb] ] }
28      !!      where ztb is a 2D array: the bottom ocean te;perature and ahtb
29      !!      is a time and space varying diffusive coefficient defined by:
30      !!         ahbt = zahbp    if grad(rho).grad(h) < 0
31      !!              = 0.       otherwise.
32      !!      Note that grad(.) is the along bottom slope gradient. grad(rho)
33      !!      is evaluated using the local density (i.e. referenced at the
34      !!      local depth). Typical value of ahbt is 2000 m2/s (equivalent to
35      !!      a downslope velocity of 20 cm/s if the condition for slope
36      !!      convection is satified)
37      !!        Add this before trend to the general trend (ta,sa) of the
38      !!      botton ocean tracer point:
39      !!              ta = ta + difft
40      !!
41      !! ** Action  : - update (ta,sa) at the bottom level with the bottom
42      !!                boundary layer trend
43      !!              - save the lateral diffusion trends in tldfbbl/sldfbbl ('key_trdtra')
44      !!              - save the horizontal advection trends in tladbbl/sladbbl ('key_trdtra')
45      !!
46      !! References :
47      !!     Beckmann, A., and R. Doscher, 1997, J. Phys.Oceanogr., 581-591.
48      !!
49      !! History :
50      !!   8.5  !  02-12  (A. de Miranda, G. Madec)  Original Code
51      !!   9.0  !  04-01  (A. de Miranda, G. Madec, J.M. Molines )
52      !!   9.0  !  04-08  (C. Talandier) New trends organization
53      !!----------------------------------------------------------------------     
54      !! * Modules used
55      USE eosbn2
56      USE flxrnf
57      USE ocfzpt
58      USE lbclnk
59      USE oce, ONLY :    ztdta => ua,    & ! use ua as 3D workspace   
60                         ztdsa => va       ! use va as 3D workspace   
61
62      !! * Arguments
63      INTEGER, INTENT( in ) ::   kt        ! ocean time-step
64     
65      !! * Local declarations
66      INTEGER :: ji, jj, jk                ! dummy loop indices
67      INTEGER :: ik, iku, ikv              ! temporary integers
68
69      REAL(wp) ::   &
70         zsign, zt, zs, zh, zalbet,     &  ! temporary scalars
71         zgdrho, zbtr, zta, zsa            !    "         "
72      REAL(wp), DIMENSION(jpi,jpj) ::   &
73         zki, zkj, zkw, zkx, zky, zkz,  &  ! temporary workspace arrays
74         ztnb, zsnb, zdep, ztbb, zsbb,  &  !    "                  "
75         zahu, zahv                        !    "                  "
76      REAL(wp), DIMENSION(jpi,jpj) ::   &  ! temporary workspace arrays
77         zalphax, zwu, zunb,            &  !    "                  "
78         zalphay, zwv, zvnb,            &  !    "                  "
79         zwx, zwy, zww, zwz                !    "                  "
80      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   &
81         zhdivn                            ! temporary workspace arrays
82      REAL(wp) ::   &
83         zfui, zfvj, zbt, zsigna           ! temporary scalars
84      REAL(wp) ::   &
85         fsalbt, pft, pfs, pfh             ! statement function
86      !!----------------------------------------------------------------------
87      ! ratio alpha/beta
88      ! ================
89      !  fsalbt: ratio of thermal over saline expension coefficients
90      !       pft :  potential temperature in degrees celcius
91      !       pfs :  salinity anomaly (s-35) in psu
92      !       pfh :  depth in meters
93
94      fsalbt( pft, pfs, pfh ) =                                              &
95         ( ( ( -0.255019e-07 * pft + 0.298357e-05 ) * pft                    &
96                                   - 0.203814e-03 ) * pft                    &
97                                   + 0.170907e-01 ) * pft                    &
98                                   + 0.665157e-01                            &
99         +(-0.678662e-05 * pfs - 0.846960e-04 * pft + 0.378110e-02 ) * pfs   &
100         +  ( ( - 0.302285e-13 * pfh                                         &
101                - 0.251520e-11 * pfs                                         &
102                + 0.512857e-12 * pft * pft          ) * pfh                  &
103                                     - 0.164759e-06   * pfs                  &
104             +(   0.791325e-08 * pft - 0.933746e-06 ) * pft                  &
105                                     + 0.380374e-04 ) * pfh
106      !!----------------------------------------------------------------------
107
108
109      IF( kt == nit000 )   CALL tra_bbl_init    ! initialization at first time-step
110
111      ! Save ta and sa trends
112      IF( l_trdtra )   THEN
113         ztdta(:,:,:) = ta(:,:,:)
114         ztdsa(:,:,:) = sa(:,:,:)
115      ENDIF
116
117      ! 1. 2D fields of bottom temperature and salinity, and bottom slope
118      ! -----------------------------------------------------------------
119      ! mbathy= number of w-level, minimum value=1 (cf dommsk.F)
120
121#if defined key_vectopt_loop   &&   ! defined key_autotasking
122      jj = 1
123      DO ji = 1, jpij   ! vector opt. (forced unrolling)
124#else
125      DO jj = 1, jpj
126         DO ji = 1, jpi
127#endif
128            ik = mbkt(ji,jj)                               ! index of the bottom ocean T-level
129            ztnb(ji,jj) = tn(ji,jj,ik) * tmask(ji,jj,1)    ! masked now T at the ocean bottom
130            zsnb(ji,jj) = sn(ji,jj,ik) * tmask(ji,jj,1)    ! masked now S at the ocean bottom
131            ztbb(ji,jj) = tb(ji,jj,ik) * tmask(ji,jj,1)    ! masked before T at the ocean bottom
132            zsbb(ji,jj) = sb(ji,jj,ik) * tmask(ji,jj,1)    ! masked before S at the ocean bottom
133            zdep(ji,jj) = fsdept(ji,jj,ik)                 ! depth of the ocean bottom T-level
134#if ! defined key_vectopt_loop   ||   defined key_autotasking
135         END DO
136#endif
137      END DO
138#if defined key_vectopt_loop   &&   ! defined key_autotasking
139      jj = 1
140      DO ji = 1, jpij-jpi   ! vector opt. (forced unrolling)
141            zunb(ji,jj) = un(ji,jj,mbku(ji,jj)) * umask(ji,jj,1)
142            zvnb(ji,jj) = vn(ji,jj,mbkv(ji,jj)) * vmask(ji,jj,1)   ! retirer le mask en u, v et t !
143      END DO
144#else
145      DO jj = 1, jpjm1
146         DO ji = 1, jpim1
147            zunb(ji,jj) = un(ji,jj,mbku(ji,jj)) * umask(ji,jj,1)
148            zvnb(ji,jj) = vn(ji,jj,mbkv(ji,jj)) * vmask(ji,jj,1)
149         END DO
150      END DO
151#endif
152 
153      ! boundary conditions on zunb and zvnb   (changed sign)
154       CALL lbc_lnk( zunb, 'U', -1. )   ;   CALL lbc_lnk( zvnb, 'V', -1. )
155      ! boundary condition on ztnb and znbb
156       CALL lbc_lnk( ztnb, 'T', 1. )    ;   CALL lbc_lnk( ztbb, 'T', 1. )
157      ! boundary condition on zsnb and zsbb
158       CALL lbc_lnk( zsnb, 'T', 1. )    ;   CALL lbc_lnk( zsbb, 'T', 1. )
159
160      ! Conditional diffusion along the slope in the bottom boundary layer
161
162#if defined key_trabbl_dif
163# if defined key_vectopt_loop   &&   ! defined key_autotasking
164      jj = 1
165      DO ji = 1, jpij-jpi   ! vector opt. (forced unrolling)
166# else
167      DO jj = 1, jpjm1
168         DO ji = 1, jpim1
169# endif
170            iku = mbku(ji,jj)
171            ikv = mbkv(ji,jj)
172            zahu(ji,jj) = atrbbl*e2u(ji,jj)*fse3u(ji,jj,iku)/e1u(ji,jj) * umask(ji,jj,1)
173            zahv(ji,jj) = atrbbl*e1v(ji,jj)*fse3v(ji,jj,ikv)/e2v(ji,jj) * vmask(ji,jj,1)
174# if ! defined key_vectopt_loop   ||   defined key_autotasking
175         END DO
176# endif
177      END DO
178#endif
179
180
181      ! 2. Criteria of additional bottom diffusivity: grad(rho).grad(h)<0
182      ! --------------------------------------------
183      ! Sign of the local density gradient along the i- and j-slopes
184      ! multiplied by the slope of the ocean bottom
185
186      SELECT CASE ( neos )
187
188      CASE ( 0 )               ! Jackett and McDougall (1994) formulation
189
190      DO jj = 1, jpjm1
191        DO ji = 1, fs_jpim1   ! vector opt.
192      !   ... temperature, salinity anomalie and depth
193          zt = 0.5 * ( ztnb(ji,jj) + ztnb(ji+1,jj) )
194          zs = 0.5 * ( zsnb(ji,jj) + zsnb(ji+1,jj) ) - 35.0
195          zh = 0.5 * ( zdep(ji,jj) + zdep(ji+1,jj) )
196      !   ... masked ratio alpha/beta
197          zalbet = fsalbt( zt, zs, zh )*umask(ji,jj,1)
198      !   ... local density gradient along i-bathymetric slope
199          zgdrho = zalbet*( ztnb(ji+1,jj) - ztnb(ji,jj) )   &
200                     -    ( zsnb(ji+1,jj) - zsnb(ji,jj) )
201          zgdrho = zgdrho * umask(ji,jj,1)
202      !   ... sign of local i-gradient of density multiplied by the i-slope
203          zsign = sign( 0.5, -zgdrho * ( zdep(ji+1,jj) - zdep(ji,jj) ) )
204          zki(ji,jj) = ( 0.5 - zsign ) * zahu(ji,jj)
205
206          zsigna= sign(0.5, zunb(ji,jj)*(  zdep(ji+1,jj) - zdep(ji,jj) ))
207          zalphax(ji,jj)=(0.5+zsigna)*(0.5-zsign)*umask(ji,jj,1)
208        END DO
209      END DO
210
211      DO jj = 1, jpjm1
212        DO ji = 1, fs_jpim1   ! vector opt.
213      !   ... temperature, salinity anomalie and depth
214          zt = 0.5 * ( ztnb(ji,jj+1) + ztnb(ji,jj) )
215          zs = 0.5 * ( zsnb(ji,jj+1) + zsnb(ji,jj) ) - 35.0
216          zh = 0.5 * ( zdep(ji,jj+1) + zdep(ji,jj) )
217      !   ... masked ratio alpha/beta
218          zalbet = fsalbt( zt, zs, zh )*vmask(ji,jj,1)
219      !   ... local density gradient along j-bathymetric slope
220          zgdrho = zalbet*( ztnb(ji,jj+1) - ztnb(ji,jj) )   &
221                     -    ( zsnb(ji,jj+1) - zsnb(ji,jj) )
222          zgdrho = zgdrho*vmask(ji,jj,1)
223      !   ... sign of local j-gradient of density multiplied by the j-slope
224          zsign = sign( 0.5, -zgdrho * ( zdep(ji,jj+1) - zdep(ji,jj) ) )
225          zkj(ji,jj) = ( 0.5 - zsign ) * zahv(ji,jj)
226
227          zsigna= sign(0.5, zvnb(ji,jj)*(zdep(ji,jj+1) - zdep(ji,jj) ) )
228          zalphay(ji,jj)=(0.5+zsigna)*(0.5-zsign)*vmask(ji,jj,1)
229        END DO
230      END DO
231
232
233      CASE ( 1 )               ! Linear formulation function of temperature only
234
235         IF(lwp) WRITE(numout,cform_err)
236         IF(lwp) WRITE(numout,*) '          use of linear eos rho(T,S) = rau0 * ( rbeta * S - ralpha * T )'
237         IF(lwp) WRITE(numout,*) '          bbl not implented: easy to do it '
238         nstop = nstop + 1
239
240      CASE ( 2 )               ! Linear formulation function of temperature and salinity
241
242         IF(lwp) WRITE(numout,cform_err)
243         IF(lwp) WRITE(numout,*) '          use of linear eos rho(T,S) = rau0 * ( rbeta * S - ralpha * T )'
244         IF(lwp) WRITE(numout,*) '          bbl not implented: easy to do it '
245         nstop = nstop + 1
246
247      CASE DEFAULT
248
249         IF(lwp) WRITE(numout,cform_err)
250         IF(lwp) WRITE(numout,*) '          bad flag value for neos = ', neos
251         nstop = nstop + 1
252
253      END SELECT
254
255      ! lateral boundary conditions on zalphax and zalphay   (unchanged sign)
256       CALL lbc_lnk( zalphax, 'U', 1. )   ;   CALL lbc_lnk( zalphay, 'V', 1. )
257
258
259      ! 3. Velocities that are exchanged between ajacent bottom boxes.
260      !---------------------------------------------------------------
261
262      ! ... is equal to zero but where bbl will work.
263          u_bbl(:,:,:) = 0.e0
264          v_bbl(:,:,:) = 0.e0
265# if defined key_vectopt_loop   &&   ! defined key_autotasking
266      jj = 1
267      DO ji = 1, jpij-jpi   ! vector opt. (forced unrolling)
268# else
269      DO jj = 1, jpjm1
270         DO ji = 1, jpim1
271# endif
272            iku = mbku(ji,jj)
273            ikv = mbkv(ji,jj)
274            IF( MAX(iku,ikv) >  1 ) THEN
275               u_bbl(ji,jj,iku) = zalphax(ji,jj) * un(ji,jj,iku) * umask(ji,jj,1)
276               v_bbl(ji,jj,ikv) = zalphay(ji,jj) * vn(ji,jj,ikv) * vmask(ji,jj,1)
277            ENDIF
278# if ! defined key_vectopt_loop   ||   defined key_autotasking
279         END DO
280# endif
281          END DO
282
283      ! lateral boundary conditions on u_bbl and v_bbl   (changed sign)
284       CALL lbc_lnk( u_bbl, 'U', -1. )   ;   CALL lbc_lnk( v_bbl, 'V', -1. )
285
286
287
288#if defined key_trabbl_dif
289      ! 4. Additional second order diffusive trends
290      ! -------------------------------------------
291
292      ! ... first derivative (gradient)
293      DO jj = 1, jpjm1
294         DO ji = 1, fs_jpim1   ! vertor opt.
295            zkx(ji,jj) = zki(ji,jj)*( ztbb(ji+1,jj) - ztbb(ji,jj) )
296            zkz(ji,jj) = zki(ji,jj)*( zsbb(ji+1,jj) - zsbb(ji,jj) )
297
298            zky(ji,jj) = zkj(ji,jj)*( ztbb(ji,jj+1) - ztbb(ji,jj) )
299            zkw(ji,jj) = zkj(ji,jj)*( zsbb(ji,jj+1) - zsbb(ji,jj) )
300         END DO
301      END DO
302
303      IF( cp_cfg == "orca" ) THEN   
304         SELECT CASE ( jp_cfg )
305            !                                        ! =======================
306            CASE ( 2 )                               !  ORCA_R2 configuration
307               !                                     ! =======================
308               ! Gibraltar enhancement of BBL
309               zkx( mi0(139):mi1(140) , mj0(102):mj1(102) ) = 4.e0 * zkx( mi0(139):mi1(140) , mj0(102):mj1(102) )
310               zky( mi0(139):mi1(140) , mj0(102):mj1(102) ) = 4.e0 * zky( mi0(139):mi1(140) , mj0(102):mj1(102) )
311   
312               ! Red Sea enhancement of BBL
313               zkx( mi0(161):mi1(162) , mj0(88):mj1(88) ) = 10.e0 * zkx( mi0(161):mi1(162) , mj0(88):mj1(88) )
314               zky( mi0(161):mi1(162) , mj0(88):mj1(88) ) = 10.e0 * zky( mi0(161):mi1(162) , mj0(88):mj1(88) )
315   
316               !                                     ! =======================
317            CASE ( 4 )                               !  ORCA_R4 configuration
318               !                                     ! =======================
319               ! Gibraltar enhancement of BBL
320               zkx( mi0(70):mi1(71) , mj0(52):mj1(52) ) = 4.e0 * zkx( mi0(70):mi1(71) , mj0(52):mj1(52) )
321               zky( mi0(70):mi1(71) , mj0(52):mj1(52) ) = 4.e0 * zky( mi0(70):mi1(71) , mj0(52):mj1(52) )
322 
323         END SELECT
324 
325      ENDIF
326
327      ! ... second derivative (divergence) and add to the general tracer trend
328
329# if defined key_vectopt_loop   &&   ! defined key_autotasking
330      jj = 1
331      DO ji = jpi+2, jpij-jpi-1   ! vector opt. (forced unrolling)
332# else
333      DO jj = 2, jpjm1
334         DO ji = 2, jpim1
335# endif
336            ik = mbkt(ji,jj)
337            zbtr = 1. / ( e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,ik) )
338            zta = (  zkx(ji,jj) - zkx(ji-1,jj  )   &
339               &   + zky(ji,jj) - zky(ji  ,jj-1)  ) * zbtr
340            zsa = (  zkz(ji,jj) - zkz(ji-1,jj  )   &
341               &   + zkw(ji,jj) - zkw(ji  ,jj-1)  ) * zbtr
342            ta(ji,jj,ik) = ta(ji,jj,ik) + zta
343            sa(ji,jj,ik) = sa(ji,jj,ik) + zsa
344#if ! defined key_vectopt_loop   ||   defined key_autotasking
345         END DO
346#endif
347      END DO
348
349      ! save the trends for diagnostic
350      ! BBL lateral diffusion tracers trends
351      IF( l_trdtra )   THEN
352#  if defined key_vectopt_loop   &&   ! defined key_autotasking
353         jj = 1
354         DO ji = jpi+2, jpij-jpi-1   ! vector opt. (forced unrolling)
355#  else
356         DO jj = 2, jpjm1
357            DO ji = 2, jpim1
358#  endif
359            ik = mbkt(ji,jj)
360            tldfbbl(ji,jj) = ta(ji,jj,ik) - ztdta(ji,jj,ik)
361            sldfbbl(ji,jj) = sa(ji,jj,ik) - ztdsa(ji,jj,ik)
362#  if ! defined key_vectopt_loop   ||   defined key_autotasking
363            END DO
364#  endif
365         END DO
366
367         ! save the new ta & sa trends
368         ztdta(:,:,:) = ta(:,:,:)
369         ztdsa(:,:,:) = sa(:,:,:)
370
371      ENDIF
372
373#endif
374
375      ! 5. Along sigma advective trend
376      ! -------------------------------
377      ! ... Second order centered tracer flux at u and v-points
378
379# if defined key_vectopt_loop   &&   ! defined key_autotasking
380      jj = 1
381      DO ji = 1, jpij-jpi   ! vector opt. (forced unrolling)
382# else
383      DO jj = 1, jpjm1
384         DO ji = 1, jpim1
385# endif
386            iku = mbku(ji,jj)
387            ikv = mbkv(ji,jj)
388            zfui = zalphax(ji,jj) *e2u(ji,jj) * fse3u(ji,jj,iku) * zunb(ji,jj)
389            zfvj = zalphay(ji,jj) *e1v(ji,jj) * fse3v(ji,jj,ikv) * zvnb(ji,jj)
390            ! centered scheme
391!           zwx(ji,jj) = 0.5* zfui * ( ztnb(ji,jj) + ztnb(ji+1,jj) )
392!           zwy(ji,jj) = 0.5* zfvj * ( ztnb(ji,jj) + ztnb(ji,jj+1) )
393!           zww(ji,jj) = 0.5* zfui * ( zsnb(ji,jj) + zsnb(ji+1,jj) )
394!           zwz(ji,jj) = 0.5* zfvj * ( zsnb(ji,jj) + zsnb(ji,jj+1) )
395            ! upstream scheme
396            zwx(ji,jj) = ( ( zfui + ABS( zfui ) ) * ztbb(ji  ,jj  )   &
397               &          +( zfui - ABS( zfui ) ) * ztbb(ji+1,jj  ) ) * 0.5
398            zwy(ji,jj) = ( ( zfui + ABS( zfvj ) ) * ztbb(ji  ,jj  )   &
399               &          +( zfui - ABS( zfvj ) ) * ztbb(ji  ,jj+1) ) * 0.5
400            zww(ji,jj) = ( ( zfui + ABS( zfui ) ) * zsbb(ji  ,jj  )   &
401               &          +( zfui - ABS( zfui ) ) * zsbb(ji+1,jj  ) ) * 0.5
402            zwz(ji,jj) = ( ( zfui + ABS( zfvj ) ) * zsbb(ji  ,jj  )   &
403               &          +( zfui - ABS( zfvj ) ) * zsbb(ji  ,jj+1) ) * 0.5
404#if ! defined key_vectopt_loop   ||   defined key_autotasking
405         END DO
406#endif
407        END DO
408# if defined key_vectopt_loop   &&   ! defined key_autotasking
409      jj = 1
410      DO ji = jpi+2, jpij-jpi-1   ! vector opt. (forced unrolling)
411# else
412      DO jj = 2, jpjm1
413         DO ji = 2, jpim1
414# endif
415            ik = mbkt(ji,jj)
416            zbtr = 1. / ( e1t(ji,jj)*e2t(ji,jj)*fse3t(ji,jj,ik) )
417            ! horizontal advective trends
418            zta = - zbtr * (  zwx(ji,jj) - zwx(ji-1,jj  )   &
419               &            + zwy(ji,jj) - zwy(ji  ,jj-1)  )
420            zsa = - zbtr * (  zww(ji,jj) - zww(ji-1,jj  )   &
421               &            + zwz(ji,jj) - zwz(ji  ,jj-1)  )
422
423            ! add it to the general tracer trends
424            ta(ji,jj,ik) = ta(ji,jj,ik) + zta
425            sa(ji,jj,ik) = sa(ji,jj,ik) + zsa
426#if ! defined key_vectopt_loop   ||   defined key_autotasking
427         END DO
428#endif
429      END DO
430
431      ! save the trends for diagnostic
432      ! BBL lateral advection tracers trends
433      IF( l_trdtra )   THEN
434#  if defined key_vectopt_loop   &&   ! defined key_autotasking
435         jj = 1
436         DO ji = jpi+2, jpij-jpi-1   ! vector opt. (forced unrolling)
437#  else
438         DO jj = 2, jpjm1
439            DO ji = 2, jpim1
440#  endif
441            ik = mbkt(ji,jj)
442            tladbbl(ji,jj) = ta(ji,jj,ik) - ztdta(ji,jj,ik)
443            sladbbl(ji,jj) = sa(ji,jj,ik) - ztdsa(ji,jj,ik)
444#  if ! defined key_vectopt_loop   ||   defined key_autotasking
445            END DO
446#  endif
447         END DO
448
449      ENDIF
450
451      IF(l_ctl) THEN
452         zta = SUM( ta(2:nictl,2:njctl,1:jpkm1) * tmask(2:nictl,2:njctl,1:jpkm1) )
453         zsa = SUM( sa(2:nictl,2:njctl,1:jpkm1) * tmask(2:nictl,2:njctl,1:jpkm1) )
454         WRITE(numout,*) ' bbl  - Ta: ', zta-t_ctl, ' Sa: ', zsa-s_ctl
455         t_ctl = zta   ;   s_ctl = zsa
456      ENDIF
457
458
459      ! 6. Vertical advection velocities
460      ! --------------------------------
461      ! ... computes divergence perturbation (velocties to be removed from upper t boxes :
462      DO jk= 1, jpkm1
463         DO jj=1, jpjm1
464            DO ji = 1, fs_jpim1   ! vertor opt.
465               zwu(ji,jj) = -e2u(ji,jj) * u_bbl(ji,jj,jk)
466               zwv(ji,jj) = -e1v(ji,jj) * v_bbl(ji,jj,jk)
467            END DO
468         END DO
469
470      ! ... horizontal divergence
471         DO jj = 2, jpjm1
472            DO ji = fs_2, fs_jpim1   ! vector opt.
473               zbt = e1t(ji,jj) * e2t(ji,jj)
474               zhdivn(ji,jj,jk) = (  zwu(ji,jj) - zwu(ji-1,jj  )   &
475                                   + zwv(ji,jj) - zwv(ji  ,jj-1)  ) / zbt
476            END DO
477         END DO
478      END DO
479
480
481      ! ... horizontal bottom divergence
482# if defined key_vectopt_loop   &&   ! defined key_autotasking
483      jj = 1
484      DO ji = 1, jpij-jpi   ! vector opt. (forced unrolling)
485# else
486      DO jj = 1, jpjm1
487         DO ji = 1, jpim1
488# endif
489            iku = mbku(ji,jj)
490            ikv = mbkv(ji,jj)
491            zwu(ji,jj) = zalphax(ji,jj) * e2u(ji,jj) * fse3u(ji,jj,iku)
492            zwv(ji,jj) = zalphay(ji,jj) * e1v(ji,jj) * fse3v(ji,jj,ikv)
493#if ! defined key_vectopt_loop   ||   defined key_autotasking
494         END DO
495#endif
496        END DO
497
498# if defined key_vectopt_loop   &&   ! defined key_autotasking
499      jj = 1
500      DO ji = jpi+2, jpij-jpi-1   ! vector opt. (forced unrolling)
501# else
502      DO jj = 2, jpjm1
503         DO ji = 2, jpim1
504# endif
505            ik = mbkt(ji,jj)
506            zbt = e1t(ji,jj) * e2t(ji,jj) * fse3t(ji,jj,ik)
507            zhdivn(ji,jj,ik) =   &
508               &   (  zwu(ji  ,jj  ) * ( zunb(ji  ,jj  ) - un(ji  ,jj  ,ik) *umask(ji  ,jj  ,1) )   &
509               &    - zwu(ji-1,jj  ) * ( zunb(ji-1,jj  ) - un(ji-1,jj  ,ik) *umask(ji-1,jj  ,1) )   &
510               &    + zwv(ji  ,jj  ) * ( zvnb(ji  ,jj  ) - vn(ji  ,jj  ,ik) *vmask(ji  ,jj  ,1) )   &
511               &    - zwv(ji  ,jj-1) * ( zvnb(ji  ,jj-1) - vn(ji  ,jj-1,ik) *vmask(ji  ,jj-1,1) )   &
512               &   ) / zbt
513
514# if ! defined key_vectopt_loop   ||   defined key_autotasking
515         END DO
516# endif
517        END DO
518
519      ! 7. compute additional vertical velocity to be used in t boxes
520      ! -------------------------------------------------------------
521
522      ! ... Computation from the bottom
523      ! Note that w_bbl(:,:,jpk) has been set to 0 in tra_bbl_init
524      DO jk = jpkm1, 1, -1
525         DO jj= 2, jpjm1
526            DO ji = fs_2, fs_jpim1   ! vector opt.
527               w_bbl(ji,jj,jk) = w_bbl(ji,jj,jk+1) - fse3t(ji,jj,jk)*zhdivn(ji,jj,jk)
528            END DO
529         END DO
530      END DO
531
532      ! Boundary condition on w_bbl   (unchanged sign)
533      CALL lbc_lnk( w_bbl, 'W', 1. )
534
535   END SUBROUTINE tra_bbl_adv
Note: See TracBrowser for help on using the repository browser.