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/2015/dev_CMCC_merge_2015/NEMOGCM/NEMO/OPA_SRC/TRA – NEMO

source: branches/2015/dev_CMCC_merge_2015/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_ubs.F90 @ 6051

Last change on this file since 6051 was 6051, checked in by lovato, 8 years ago

Merge branches/2015/dev_r5056_CMCC4_simplification (see ticket #1456)

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