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.
traadv_ubs.F90 in branches/2016/dev_r7233_CMIP6_diags_trunk_version/NEMOGCM/NEMO/OPA_SRC/TRA – NEMO

source: branches/2016/dev_r7233_CMIP6_diags_trunk_version/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_ubs.F90 @ 7352

Last change on this file since 7352 was 7352, checked in by timgraham, 8 years ago

Changes suggested byt reviewer

  • Property svn:keywords set to Id
File size: 20.8 KB
RevLine 
[503]1MODULE traadv_ubs
2   !!==============================================================================
3   !!                       ***  MODULE  traadv_ubs  ***
4   !! Ocean active tracers:  horizontal & vertical advective trend
5   !!==============================================================================
[2528]6   !! History :  1.0  !  2006-08  (L. Debreu, R. Benshila)  Original code
7   !!            3.3  !  2010-05  (C. Ethe, G. Madec)  merge TRC-TRA + switch from velocity to transport
[503]8   !!----------------------------------------------------------------------
9
10   !!----------------------------------------------------------------------
11   !!   tra_adv_ubs : update the tracer trend with the horizontal
12   !!                 advection trends using a third order biaised scheme 
13   !!----------------------------------------------------------------------
[3625]14   USE oce            ! ocean dynamics and active tracers
15   USE dom_oce        ! ocean space and time domain
[4990]16   USE trc_oce        ! share passive tracers/Ocean variables
17   USE trd_oce        ! trends: ocean variables
[5836]18   USE traadv_fct      ! acces to routine interp_4th_cpt
[4990]19   USE trdtra         ! trends manager: tracers
20   USE diaptr         ! poleward transport diagnostics
[7352]21   USE diaar5         ! AR5 diagnostics
22
[4990]23   !
[7352]24   USE iom
[4990]25   USE lib_mpp        ! I/O library
[3625]26   USE lbclnk         ! ocean lateral boundary condition (or mpp link)
27   USE in_out_manager ! I/O manager
28   USE wrk_nemo       ! Memory Allocation
29   USE timing         ! Timing
30   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
[503]31
32   IMPLICIT NONE
33   PRIVATE
34
35   PUBLIC   tra_adv_ubs   ! routine called by traadv module
36
[7352]37   LOGICAL :: l_trd   ! flag to compute trends
38   LOGICAL :: l_ptr   ! flag to compute poleward transport
39   LOGICAL :: l_hst   ! flag to compute heat transport
[503]40
[7352]41
[503]42   !! * Substitutions
43#  include "vectopt_loop_substitute.h90"
44   !!----------------------------------------------------------------------
[5836]45   !! NEMO/OPA 3.7 , NEMO Consortium (2015)
[1152]46   !! $Id$
[2528]47   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
[503]48   !!----------------------------------------------------------------------
49CONTAINS
50
[5836]51   SUBROUTINE tra_adv_ubs( kt, kit000, cdtype, p2dt, pun, pvn, pwn,          &
52      &                                                ptb, ptn, pta, kjpt, kn_ubs_v )
[503]53      !!----------------------------------------------------------------------
54      !!                  ***  ROUTINE tra_adv_ubs  ***
55      !!                 
56      !! ** Purpose :   Compute the now trend due to the advection of tracers
57      !!      and add it to the general trend of passive tracer equations.
58      !!
[5836]59      !! ** Method  :   The 3rd order Upstream Biased Scheme (UBS) is based on an
[3787]60      !!      upstream-biased parabolic interpolation (Shchepetkin and McWilliams 2005)
[519]61      !!      It is only used in the horizontal direction.
62      !!      For example the i-component of the advective fluxes are given by :
[3787]63      !!                !  e2u e3u un ( mi(Tn) - zltu(i  ) )   if un(i) >= 0
[4990]64      !!          ztu = !  or
[3787]65      !!                !  e2u e3u un ( mi(Tn) - zltu(i+1) )   if un(i) < 0
[519]66      !!      where zltu is the second derivative of the before temperature field:
67      !!          zltu = 1/e3t di[ e2u e3u / e1u di[Tb] ]
[5836]68      !!        This results in a dissipatively dominant (i.e. hyper-diffusive)
[519]69      !!      truncation error. The overall performance of the advection scheme
70      !!      is similar to that reported in (Farrow and Stevens, 1995).
[5836]71      !!        For stability reasons, the first term of the fluxes which corresponds
[519]72      !!      to a second order centered scheme is evaluated using the now velocity
73      !!      (centered in time) while the second term which is the diffusive part
74      !!      of the scheme, is evaluated using the before velocity (forward in time).
75      !!      Note that UBS is not positive. Do not use it on passive tracers.
[5836]76      !!                On the vertical, the advection is evaluated using a FCT scheme,
77      !!      as the UBS have been found to be too diffusive.
[6140]78      !!                kn_ubs_v argument controles whether the FCT is based on
79      !!      a 2nd order centrered scheme (kn_ubs_v=2) or on a 4th order compact
80      !!      scheme (kn_ubs_v=4).
[503]81      !!
[6140]82      !! ** Action : - update pta  with the now advective tracer trends
83      !!             - send trends to trdtra module for further diagnostcs (l_trdtra=T)
84      !!             - htr_adv, str_adv : poleward advective heat and salt transport (ln_diaptr=T)
[519]85      !!
86      !! Reference : Shchepetkin, A. F., J. C. McWilliams, 2005, Ocean Modelling, 9, 347-404.
87      !!             Farrow, D.E., Stevens, D.P., 1995, J. Phys. Ocean. 25, 1731Ð1741.
[503]88      !!----------------------------------------------------------------------
[2528]89      INTEGER                              , INTENT(in   ) ::   kt              ! ocean time-step index
[3294]90      INTEGER                              , INTENT(in   ) ::   kit000          ! first time step index
[2528]91      CHARACTER(len=3)                     , INTENT(in   ) ::   cdtype          ! =TRA or TRC (tracer indicator)
92      INTEGER                              , INTENT(in   ) ::   kjpt            ! number of tracers
[5836]93      INTEGER                              , INTENT(in   ) ::   kn_ubs_v        ! number of tracers
[6140]94      REAL(wp)                             , INTENT(in   ) ::   p2dt            ! tracer time-step
[3787]95      REAL(wp), DIMENSION(jpi,jpj,jpk     ), INTENT(in   ) ::   pun, pvn, pwn   ! 3 ocean transport components
[2528]96      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(in   ) ::   ptb, ptn        ! before and now tracer fields
97      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt), INTENT(inout) ::   pta             ! tracer trend
[2715]98      !
99      INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices
[6140]100      REAL(wp) ::   ztra, zbtr, zcoef                       ! local scalars
[2715]101      REAL(wp) ::   zfp_ui, zfm_ui, zcenut, ztak, zfp_wk, zfm_wk   !   -      -
102      REAL(wp) ::   zfp_vj, zfm_vj, zcenvt, zeeu, zeev, z_hdivn    !   -      -
[3294]103      REAL(wp), POINTER, DIMENSION(:,:,:) :: ztu, ztv, zltu, zltv, zti, ztw
[503]104      !!----------------------------------------------------------------------
[3294]105      !
106      IF( nn_timing == 1 )  CALL timing_start('tra_adv_ubs')
107      !
[5836]108      CALL wrk_alloc( jpi,jpj,jpk,   ztu, ztv, zltu, zltv, zti, ztw )
[3294]109      !
110      IF( kt == kit000 )  THEN
[503]111         IF(lwp) WRITE(numout,*)
[2528]112         IF(lwp) WRITE(numout,*) 'tra_adv_ubs :  horizontal UBS advection scheme on ', cdtype
[503]113         IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~'
114      ENDIF
[2528]115      !
[4499]116      l_trd = .FALSE.
[7352]117      l_hst = .FALSE.
118      l_ptr = .FALSE.
119      IF( ( cdtype == 'TRA' .AND. l_trdtra ) .OR. ( cdtype == 'TRC' .AND. l_trdtrc ) )      l_trd = .TRUE.
120      IF(   cdtype == 'TRA' .AND. ln_diaptr )                                               l_ptr = .TRUE. 
121      IF(   cdtype == 'TRA' .AND. ( iom_use("uadv_heattr") .OR. iom_use("vadv_heattr") .OR. &
122         &                          iom_use("uadv_salttr") .OR. iom_use("vadv_salttr")  ) ) l_hst = .TRUE.
[4499]123      !
[6140]124      ztw (:,:, 1 ) = 0._wp      ! surface & bottom value : set to zero for all tracers
125      zltu(:,:,jpk) = 0._wp   ;   zltv(:,:,jpk) = 0._wp
[5836]126      ztw (:,:,jpk) = 0._wp   ;   zti (:,:,jpk) = 0._wp
127      !
[2528]128      !                                                          ! ===========
129      DO jn = 1, kjpt                                            ! tracer loop
130         !                                                       ! ===========
131         !                                             
[5836]132         DO jk = 1, jpkm1        !==  horizontal laplacian of before tracer ==!
133            DO jj = 1, jpjm1              ! First derivative (masked gradient)
[2528]134               DO ji = 1, fs_jpim1   ! vector opt.
[6140]135                  zeeu = e2_e1u(ji,jj) * e3u_n(ji,jj,jk) * umask(ji,jj,jk)
136                  zeev = e1_e2v(ji,jj) * e3v_n(ji,jj,jk) * vmask(ji,jj,jk)
[2528]137                  ztu(ji,jj,jk) = zeeu * ( ptb(ji+1,jj  ,jk,jn) - ptb(ji,jj,jk,jn) )
138                  ztv(ji,jj,jk) = zeev * ( ptb(ji  ,jj+1,jk,jn) - ptb(ji,jj,jk,jn) )
139               END DO
[503]140            END DO
[5836]141            DO jj = 2, jpjm1              ! Second derivative (divergence)
[2528]142               DO ji = fs_2, fs_jpim1   ! vector opt.
[6140]143                  zcoef = 1._wp / ( 6._wp * e3t_n(ji,jj,jk) )
[2528]144                  zltu(ji,jj,jk) = (  ztu(ji,jj,jk) - ztu(ji-1,jj,jk)  ) * zcoef
145                  zltv(ji,jj,jk) = (  ztv(ji,jj,jk) - ztv(ji,jj-1,jk)  ) * zcoef
146               END DO
[503]147            END DO
[2528]148            !                                   
[5836]149         END DO         
[2528]150         CALL lbc_lnk( zltu, 'T', 1. )   ;    CALL lbc_lnk( zltv, 'T', 1. )   ! Lateral boundary cond. (unchanged sgn)
151         !   
[5836]152         DO jk = 1, jpkm1        !==  Horizontal advective fluxes  ==!     (UBS)
[2528]153            DO jj = 1, jpjm1
154               DO ji = 1, fs_jpim1   ! vector opt.
[5836]155                  zfp_ui = pun(ji,jj,jk) + ABS( pun(ji,jj,jk) )      ! upstream transport (x2)
[2528]156                  zfm_ui = pun(ji,jj,jk) - ABS( pun(ji,jj,jk) )
157                  zfp_vj = pvn(ji,jj,jk) + ABS( pvn(ji,jj,jk) )
158                  zfm_vj = pvn(ji,jj,jk) - ABS( pvn(ji,jj,jk) )
[5836]159                  !                                                  ! 2nd order centered advective fluxes (x2)
[3787]160                  zcenut = pun(ji,jj,jk) * ( ptn(ji,jj,jk,jn) + ptn(ji+1,jj  ,jk,jn) )
161                  zcenvt = pvn(ji,jj,jk) * ( ptn(ji,jj,jk,jn) + ptn(ji  ,jj+1,jk,jn) )
[5836]162                  !                                                  ! UBS advective fluxes
[4990]163                  ztu(ji,jj,jk) = 0.5 * ( zcenut - zfp_ui * zltu(ji,jj,jk) - zfm_ui * zltu(ji+1,jj,jk) )
164                  ztv(ji,jj,jk) = 0.5 * ( zcenvt - zfp_vj * zltv(ji,jj,jk) - zfm_vj * zltv(ji,jj+1,jk) )
[2528]165               END DO
[503]166            END DO
[5836]167         END DO         
168         !
169         zltu(:,:,:) = pta(:,:,:,jn)      ! store the initial trends before its update
170         !
171         DO jk = 1, jpkm1        !==  add the horizontal advective trend  ==!
[503]172            DO jj = 2, jpjm1
173               DO ji = fs_2, fs_jpim1   ! vector opt.
[4990]174                  pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn)                        &
175                     &             - (  ztu(ji,jj,jk) - ztu(ji-1,jj  ,jk)    &
[6140]176                     &                + ztv(ji,jj,jk) - ztv(ji  ,jj-1,jk)  ) * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk)
[503]177               END DO
178            END DO
[2528]179            !                                             
[5836]180         END DO
181         !
182         zltu(:,:,:) = pta(:,:,:,jn) - zltu(:,:,:)    ! Horizontal advective trend used in vertical 2nd order FCT case
183         !                                            ! and/or in trend diagnostic (l_trd=T)
[4990]184         !               
185         IF( l_trd ) THEN                  ! trend diagnostics
186             CALL trd_tra( kt, cdtype, jn, jptra_xad, ztu, pun, ptn(:,:,:,jn) )
187             CALL trd_tra( kt, cdtype, jn, jptra_yad, ztv, pvn, ptn(:,:,:,jn) )
[2528]188         END IF
[7352]189         !     
190         !                                ! "Poleward" heat and salt transports (contribution of upstream fluxes)
191         IF( l_ptr )  CALL dia_ptr_hst( jn, 'adv', ztv(:,:,:) )
192         !                                !  heati/salt transport
193         IF( l_hst )  CALL dia_ar5_hst( jn, 'adv', ztu(:,:,:), ztv(:,:,:) )
[5836]194         !
[7352]195         !
[5836]196         !                       !== vertical advective trend  ==!
197         !
198         SELECT CASE( kn_ubs_v )       ! select the vertical advection scheme
199         !
200         CASE(  2  )                   ! 2nd order FCT
201            !         
202            IF( l_trd )   zltv(:,:,:) = pta(:,:,:,jn)          ! store pta if trend diag.
203            !
204            !                          !*  upstream advection with initial mass fluxes & intermediate update  ==!
205            DO jk = 2, jpkm1                 ! Interior value (w-masked)
206               DO jj = 1, jpj
207                  DO ji = 1, jpi
208                     zfp_wk = pwn(ji,jj,jk) + ABS( pwn(ji,jj,jk) )
209                     zfm_wk = pwn(ji,jj,jk) - ABS( pwn(ji,jj,jk) )
210                     ztw(ji,jj,jk) = 0.5_wp * (  zfp_wk * ptb(ji,jj,jk,jn) + zfm_wk * ptb(ji,jj,jk-1,jn)  ) * wmask(ji,jj,jk)
211                  END DO
[2528]212               END DO
[5836]213            END DO
[6140]214            IF( ln_linssh ) THEN             ! top ocean value (only in linear free surface as ztw has been w-masked)
[5836]215               IF( ln_isfcav ) THEN                ! top of the ice-shelf cavities and at the ocean surface
216                  DO jj = 1, jpj
217                     DO ji = 1, jpi
218                        ztw(ji,jj, mikt(ji,jj) ) = pwn(ji,jj,mikt(ji,jj)) * ptb(ji,jj,mikt(ji,jj),jn)   ! linear free surface
219                     END DO
220                  END DO   
221               ELSE                                ! no cavities: only at the ocean surface
222                  ztw(:,:,1) = pwn(:,:,1) * ptb(:,:,1,jn)
223               ENDIF
224            ENDIF
225            !
226            DO jk = 1, jpkm1           !* trend and after field with monotonic scheme
227               DO jj = 2, jpjm1
228                  DO ji = fs_2, fs_jpim1   ! vector opt.
[6140]229                     ztak = - ( ztw(ji,jj,jk) - ztw(ji,jj,jk+1) ) * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk)
[5836]230                     pta(ji,jj,jk,jn) =   pta(ji,jj,jk,jn) +  ztak 
[6140]231                     zti(ji,jj,jk)    = ( ptb(ji,jj,jk,jn) + p2dt * ( ztak + zltu(ji,jj,jk) ) ) * tmask(ji,jj,jk)
[5836]232                  END DO
233               END DO
[2528]234            END DO
[5836]235            CALL lbc_lnk( zti, 'T', 1. )      ! Lateral boundary conditions on zti, zsi   (unchanged sign)
236            !
237            !                          !*  anti-diffusive flux : high order minus low order
238            DO jk = 2, jpkm1        ! Interior value  (w-masked)
239               DO jj = 1, jpj
240                  DO ji = 1, jpi
241                     ztw(ji,jj,jk) = (   0.5_wp * pwn(ji,jj,jk) * ( ptn(ji,jj,jk,jn) + ptn(ji,jj,jk-1,jn) )   &
242                        &              - ztw(ji,jj,jk)   ) * wmask(ji,jj,jk)
243                  END DO
[503]244               END DO
245            END DO
[5836]246            !                                            ! top ocean value: high order == upstream  ==>>  zwz=0
[6140]247            IF( ln_linssh )   ztw(:,:, 1 ) = 0._wp       ! only ocean surface as interior zwz values have been w-masked
[5836]248            !
249            CALL nonosc_z( ptb(:,:,:,jn), ztw, zti, p2dt )      !  monotonicity algorithm
250            !
251         CASE(  4  )                               ! 4th order COMPACT
252            CALL interp_4th_cpt( ptn(:,:,:,jn) , ztw )         ! 4th order compact interpolation of T at w-point
253            DO jk = 2, jpkm1
254               DO jj = 2, jpjm1
255                  DO ji = fs_2, fs_jpim1
256                     ztw(ji,jj,jk) = pwn(ji,jj,jk) * ztw(ji,jj,jk) * wmask(ji,jj,jk)
257                  END DO
[2528]258               END DO
[503]259            END DO
[6140]260            IF( ln_linssh )   ztw(:,:, 1 ) = pwn(:,:,1) * ptn(:,:,1,jn)     !!gm ISF & 4th COMPACT doesn't work
[5836]261            !
262         END SELECT
[2528]263         !
[5836]264         DO jk = 1, jpkm1        !  final trend with corrected fluxes
[2528]265            DO jj = 2, jpjm1 
266               DO ji = fs_2, fs_jpim1   ! vector opt.   
[6140]267                  pta(ji,jj,jk,jn) = pta(ji,jj,jk,jn) - ( ztw(ji,jj,jk) - ztw(ji,jj,jk+1) ) * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk)
[2528]268               END DO
[503]269            END DO
270         END DO
[5836]271         !
272         IF( l_trd )  THEN       ! vertical advective trend diagnostics
[2528]273            DO jk = 1, jpkm1                       ! (compute -w.dk[ptn]= -dk[w.ptn] + ptn.dk[w])
274               DO jj = 2, jpjm1
275                  DO ji = fs_2, fs_jpim1   ! vector opt.
[5836]276                     zltv(ji,jj,jk) = pta(ji,jj,jk,jn) - zltv(ji,jj,jk)                          &
277                        &           + ptn(ji,jj,jk,jn) * (  pwn(ji,jj,jk) - pwn(ji,jj,jk+1)  )   &
[6140]278                        &                              * r1_e1e2t(ji,jj) / e3t_n(ji,jj,jk)
[2528]279                  END DO
280               END DO
[503]281            END DO
[4990]282            CALL trd_tra( kt, cdtype, jn, jptra_zad, zltv )
[2528]283         ENDIF
284         !
[4990]285      END DO
[503]286      !
[5836]287      CALL wrk_dealloc( jpi,jpj,jpk,   ztu, ztv, zltu, zltv, zti, ztw )
[2715]288      !
[3294]289      IF( nn_timing == 1 )  CALL timing_stop('tra_adv_ubs')
290      !
[2528]291   END SUBROUTINE tra_adv_ubs
[503]292
293
[2528]294   SUBROUTINE nonosc_z( pbef, pcc, paft, p2dt )
[503]295      !!---------------------------------------------------------------------
296      !!                    ***  ROUTINE nonosc_z  ***
297      !!     
298      !! **  Purpose :   compute monotonic tracer fluxes from the upstream
299      !!       scheme and the before field by a nonoscillatory algorithm
300      !!
301      !! **  Method  :   ... ???
302      !!       warning : pbef and paft must be masked, but the boundaries
303      !!       conditions on the fluxes are not necessary zalezak (1979)
304      !!       drange (1995) multi-dimensional forward-in-time and upstream-
305      !!       in-space based differencing for fluid
306      !!----------------------------------------------------------------------
[6140]307      REAL(wp), INTENT(in   )                          ::   p2dt   ! tracer time-step
[2528]308      REAL(wp),                DIMENSION (jpi,jpj,jpk) ::   pbef   ! before field
[503]309      REAL(wp), INTENT(inout), DIMENSION (jpi,jpj,jpk) ::   paft   ! after field
310      REAL(wp), INTENT(inout), DIMENSION (jpi,jpj,jpk) ::   pcc    ! monotonic flux in the k direction
[2715]311      !
312      INTEGER  ::   ji, jj, jk   ! dummy loop indices
313      INTEGER  ::   ikm1         ! local integer
[6140]314      REAL(wp) ::   zpos, zneg, zbt, za, zb, zc, zbig, zrtrn   ! local scalars
[3294]315      REAL(wp), POINTER, DIMENSION(:,:,:) :: zbetup, zbetdo
[503]316      !!----------------------------------------------------------------------
[3294]317      !
318      IF( nn_timing == 1 )  CALL timing_start('nonosc_z')
319      !
[5836]320      CALL wrk_alloc( jpi,jpj,jpk,   zbetup, zbetdo )
[3294]321      !
[2715]322      zbig  = 1.e+40_wp
323      zrtrn = 1.e-15_wp
324      zbetup(:,:,:) = 0._wp   ;   zbetdo(:,:,:) = 0._wp
[5836]325      !
[503]326      ! Search local extrema
327      ! --------------------
[5836]328      !                    ! large negative value (-zbig) inside land
[503]329      pbef(:,:,:) = pbef(:,:,:) * tmask(:,:,:) - zbig * ( 1.e0 - tmask(:,:,:) )
330      paft(:,:,:) = paft(:,:,:) * tmask(:,:,:) - zbig * ( 1.e0 - tmask(:,:,:) )
[5836]331      !
332      DO jk = 1, jpkm1     ! search maximum in neighbourhood
[503]333         ikm1 = MAX(jk-1,1)
334         DO jj = 2, jpjm1
335            DO ji = fs_2, fs_jpim1   ! vector opt.
336               zbetup(ji,jj,jk) = MAX(  pbef(ji  ,jj  ,jk  ), paft(ji  ,jj  ,jk  ),   &
337                  &                     pbef(ji  ,jj  ,ikm1), pbef(ji  ,jj  ,jk+1),   &
338                  &                     paft(ji  ,jj  ,ikm1), paft(ji  ,jj  ,jk+1)  )
339            END DO
340         END DO
341      END DO
[5836]342      !                    ! large positive value (+zbig) inside land
[503]343      pbef(:,:,:) = pbef(:,:,:) * tmask(:,:,:) + zbig * ( 1.e0 - tmask(:,:,:) )
344      paft(:,:,:) = paft(:,:,:) * tmask(:,:,:) + zbig * ( 1.e0 - tmask(:,:,:) )
[5836]345      !
346      DO jk = 1, jpkm1     ! search minimum in neighbourhood
[503]347         ikm1 = MAX(jk-1,1)
348         DO jj = 2, jpjm1
349            DO ji = fs_2, fs_jpim1   ! vector opt.
350               zbetdo(ji,jj,jk) = MIN(  pbef(ji  ,jj  ,jk  ), paft(ji  ,jj  ,jk  ),   &
351                  &                     pbef(ji  ,jj  ,ikm1), pbef(ji  ,jj  ,jk+1),   &
352                  &                     paft(ji  ,jj  ,ikm1), paft(ji  ,jj  ,jk+1)  )
353            END DO
354         END DO
355      END DO
[5836]356      !                    ! restore masked values to zero
[503]357      pbef(:,:,:) = pbef(:,:,:) * tmask(:,:,:)
358      paft(:,:,:) = paft(:,:,:) * tmask(:,:,:)
[5836]359      !
360      ! Positive and negative part of fluxes and beta terms
361      ! ---------------------------------------------------
[503]362      DO jk = 1, jpkm1
363         DO jj = 2, jpjm1
364            DO ji = fs_2, fs_jpim1   ! vector opt.
365               ! positive & negative part of the flux
366               zpos = MAX( 0., pcc(ji  ,jj  ,jk+1) ) - MIN( 0., pcc(ji  ,jj  ,jk  ) )
367               zneg = MAX( 0., pcc(ji  ,jj  ,jk  ) ) - MIN( 0., pcc(ji  ,jj  ,jk+1) )
368               ! up & down beta terms
[6140]369               zbt = e1e2t(ji,jj) * e3t_n(ji,jj,jk) / p2dt
[503]370               zbetup(ji,jj,jk) = ( zbetup(ji,jj,jk) - paft(ji,jj,jk) ) / (zpos+zrtrn) * zbt
371               zbetdo(ji,jj,jk) = ( paft(ji,jj,jk) - zbetdo(ji,jj,jk) ) / (zneg+zrtrn) * zbt
372            END DO
373         END DO
374      END DO
[5836]375      !
[503]376      ! monotonic flux in the k direction, i.e. pcc
377      ! -------------------------------------------
378      DO jk = 2, jpkm1
379         DO jj = 2, jpjm1
380            DO ji = fs_2, fs_jpim1   ! vector opt.
381               za = MIN( 1., zbetdo(ji,jj,jk), zbetup(ji,jj,jk-1) )
382               zb = MIN( 1., zbetup(ji,jj,jk), zbetdo(ji,jj,jk-1) )
383               zc = 0.5 * ( 1.e0 + SIGN( 1.e0, pcc(ji,jj,jk) ) )
384               pcc(ji,jj,jk) = pcc(ji,jj,jk) * ( zc * za + ( 1.e0 - zc) * zb )
385            END DO
386         END DO
387      END DO
388      !
[5836]389      CALL wrk_dealloc( jpi,jpj,jpk,   zbetup, zbetdo )
[2715]390      !
[3294]391      IF( nn_timing == 1 )  CALL timing_stop('nonosc_z')
392      !
[503]393   END SUBROUTINE nonosc_z
394
395   !!======================================================================
396END MODULE traadv_ubs
Note: See TracBrowser for help on using the repository browser.