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 NEMO/trunk/src/OCE/TRA – NEMO

source: NEMO/trunk/src/OCE/TRA/traadv_ubs.F90 @ 15267

Last change on this file since 15267 was 14922, checked in by hadcv, 3 years ago

#2682: Fix AMM12 and AGRIF_DEMO failing with debug flags and nn_hls = 1

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