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/branches/2021/dev_r14116_HPC-10_mcastril_Mixed_Precision_implementation/src/OCE/TRA – NEMO

source: NEMO/branches/2021/dev_r14116_HPC-10_mcastril_Mixed_Precision_implementation/src/OCE/TRA/traadv_ubs.F90 @ 15540

Last change on this file since 15540 was 15540, checked in by sparonuz, 3 years ago

Mixed precision version, tested up to 30 years on ORCA2.

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