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/2017/dev_r7881_no_wrk_alloc/NEMOGCM/NEMO/OPA_SRC/TRA – NEMO

source: branches/2017/dev_r7881_no_wrk_alloc/NEMOGCM/NEMO/OPA_SRC/TRA/traadv_ubs.F90 @ 7910

Last change on this file since 7910 was 7910, checked in by timgraham, 7 years ago

All wrk_alloc removed

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