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/2020/dev_r13383_HPC-02_Daley_Tiling/src/OCE/TRA – NEMO

source: NEMO/branches/2020/dev_r13383_HPC-02_Daley_Tiling/src/OCE/TRA/traadv_ubs.F90 @ 13551

Last change on this file since 13551 was 13551, checked in by hadcv, 4 years ago

#2365: Replace trd_tra workarounds with ctl_warn if using tiling

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