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_qck_lf.F90 in NEMO/trunk/src/OCE/TRA – NEMO

source: NEMO/trunk/src/OCE/TRA/traadv_qck_lf.F90

Last change on this file was 14978, checked in by hadcv, 3 years ago

#2640: correct tra_adv_qck results on the north fold

File size: 20.5 KB
Line 
1MODULE traadv_qck_lf
2   !!==============================================================================
3   !!                       ***  MODULE  traadv_qck  ***
4   !! Ocean tracers:  horizontal & vertical advective trend
5   !!==============================================================================
6   !! History :  3.0  !  2008-07  (G. Reffray)  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_qck    : update the tracer trend with the horizontal advection
12   !!                    trends using a 3rd order finite difference scheme
13   !!   tra_adv_qck_i  : apply QUICK scheme in i-direction
14   !!   tra_adv_qck_j  : apply QUICK scheme in j-direction
15   !!   tra_adv_cen2_k : 2nd centered scheme for the vertical advection
16   !!----------------------------------------------------------------------
17   USE oce             ! ocean dynamics and active tracers
18   USE dom_oce         ! ocean space and time domain
19   USE trc_oce         ! share passive tracers/Ocean variables
20   USE trd_oce         ! trends: ocean variables
21   USE trdtra          ! trends manager: tracers
22   USE diaptr          ! poleward transport diagnostics
23   USE iom
24   !
25   USE in_out_manager  ! I/O manager
26   USE lib_mpp         ! distribued memory computing
27   USE lbclnk          ! ocean lateral boundary condition (or mpp link)
28   USE lib_fortran     ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined)
29
30   IMPLICIT NONE
31   PRIVATE
32
33   PUBLIC   tra_adv_qck_lf   ! routine called by step.F90
34
35   REAL(wp) :: r1_6 = 1./ 6.   ! 1/6 ratio
36
37   LOGICAL  ::   l_trd   ! flag to compute trends
38   LOGICAL  ::   l_ptr   ! flag to compute poleward transport
39
40
41   !! * Substitutions
42#  include "do_loop_substitute.h90"
43#  include "domzgr_substitute.h90"
44   !!----------------------------------------------------------------------
45   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
46   !! $Id: traadv_qck.F90 14776 2021-04-30 12:33:41Z mocavero $
47   !! Software governed by the CeCILL license (see ./LICENSE)
48   !!----------------------------------------------------------------------
49CONTAINS
50
51   SUBROUTINE tra_adv_qck_lf ( kt, kit000, cdtype, p2dt, pU, pV, pW, Kbb, Kmm, pt, kjpt, Krhs )
52      !!----------------------------------------------------------------------
53      !!                  ***  ROUTINE tra_adv_qck  ***
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      !!
58      !! ** Method :   The advection is evaluated by a third order scheme
59      !!             For a positive velocity u :              u(i)>0
60      !!                                          |--FU--|--FC--|--FD--|------|
61      !!                                             i-1    i      i+1   i+2
62      !!
63      !!             For a negative velocity u :              u(i)<0
64      !!                                          |------|--FD--|--FC--|--FU--|
65      !!                                             i-1    i      i+1   i+2
66      !!             where  FU is the second upwind point
67      !!                    FD is the first douwning point
68      !!                    FC is the central point (or the first upwind point)
69      !!
70      !!      Flux(i) = u(i) * { 0.5(FC+FD)  -0.5C(i)(FD-FC)  -((1-C(i))/6)(FU+FD-2FC) }
71      !!                with C(i)=|u(i)|dx(i)/dt (=Courant number)
72      !!
73      !!         dt = 2*rdtra and the scalar values are tb and sb
74      !!
75      !!       On the vertical, the simple centered scheme used pt(:,:,:,:,Kmm)
76      !!
77      !!               The fluxes are bounded by the ULTIMATE limiter to
78      !!             guarantee the monotonicity of the solution and to
79      !!            prevent the appearance of spurious numerical oscillations
80      !!
81      !! ** Action : - update pt(:,:,:,:,Krhs)  with the now advective tracer trends
82      !!             - send trends to trdtra module for further diagnostcs (l_trdtra=T)
83      !!             - poleward advective heat and salt transport (ln_diaptr=T)
84      !!
85      !! ** Reference : Leonard (1979, 1991)
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      REAL(wp)                                 , INTENT(in   ) ::   p2dt            ! tracer time-step
93      ! TEMP: [tiling] This can be A2D(nn_hls) if using XIOS (subdomain support)
94      REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pU, pV, pW      ! 3 ocean volume transport components
95      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! tracers and RHS of tracer equation
96      !!----------------------------------------------------------------------
97      !
98      IF( ntile == 0 .OR. ntile == 1 )  THEN                       ! Do only on the first tile
99         IF( kt == kit000 )  THEN
100            IF(lwp) WRITE(numout,*)
101            IF(lwp) WRITE(numout,*) 'tra_adv_qck : 3rd order quickest advection scheme on ', cdtype
102            IF(lwp) WRITE(numout,*) '~~~~~~~~~~~~'
103            IF(lwp) WRITE(numout,*)
104         ENDIF
105         !
106         l_trd = .FALSE.
107         l_ptr = .FALSE.
108         IF( ( cdtype == 'TRA' .AND. l_trdtra ) .OR. ( cdtype == 'TRC' .AND. l_trdtrc ) )   l_trd = .TRUE.
109         IF(   cdtype == 'TRA' .AND. ( iom_use( 'sophtadv' ) .OR. iom_use( 'sophtadv' ) ) ) l_ptr = .TRUE.
110      ENDIF
111      !
112      !        ! horizontal fluxes are computed with the QUICKEST + ULTIMATE scheme
113      CALL tra_adv_qck_i_lf( kt, cdtype, p2dt, pU, Kbb, Kmm, pt, kjpt, Krhs )
114      CALL tra_adv_qck_j_lf( kt, cdtype, p2dt, pV, Kbb, Kmm, pt, kjpt, Krhs )
115
116      !        ! vertical fluxes are computed with the 2nd order centered scheme
117      CALL tra_adv_cen2_k_lf( kt, cdtype, pW, Kmm, pt, kjpt, Krhs )
118      !
119   END SUBROUTINE tra_adv_qck_lf
120
121
122   SUBROUTINE tra_adv_qck_i_lf( kt, cdtype, p2dt, pU, Kbb, Kmm, pt, kjpt, Krhs )
123      !!----------------------------------------------------------------------
124      !!
125      !!----------------------------------------------------------------------
126      INTEGER                                  , INTENT(in   ) ::   kt         ! ocean time-step index
127      INTEGER                                  , INTENT(in   ) ::   Kbb, Kmm, Krhs  ! ocean time level indices
128      CHARACTER(len=3)                         , INTENT(in   ) ::   cdtype     ! =TRA or TRC (tracer indicator)
129      INTEGER                                  , INTENT(in   ) ::   kjpt       ! number of tracers
130      REAL(wp)                                 , INTENT(in   ) ::   p2dt       ! tracer time-step
131      ! TEMP: [tiling] This can be A2D(nn_hls) if using XIOS (subdomain support)
132      REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pU        ! i-velocity components
133      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! active tracers and RHS of tracer equation
134      !!
135      INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices
136      REAL(wp) ::   ztra, zbtr, zdir, zdx, zmsk  ! local scalars
137      REAL(wp) ::   zzfc, zzfd, zzfu, zzfu_ip1   !   -     -
138      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zwx, zfu, zfc, zfd
139      !----------------------------------------------------------------------
140      !
141      !                                                          ! ===========
142      DO jn = 1, kjpt                                            ! tracer loop
143         !                                                       ! ===========
144         zfu(:,:,:) = 0._wp     ;   zfc(:,:,:) = 0._wp
145         zfd(:,:,:) = 0._wp     ;   zwx(:,:,:) = 0._wp
146         !
147!!gm why not using a SHIFT instruction...
148         DO_3D( 1, 0, 0, 0, 1, jpkm1 )     !--- Computation of the ustream and downstream value of the tracer and the mask
149            zzfc = pt(ji-1,jj,jk,jn,Kbb)        ! Upstream   in the x-direction for the tracer
150            zzfd = pt(ji+2,jj,jk,jn,Kbb)        ! Downstream in the x-direction for the tracer
151            !
152            ! Horizontal advective fluxes
153            ! ---------------------------
154            zdir = 0.5 + SIGN( 0.5_wp, pU(ji,jj,jk) )   ! if pU > 0 : zdir = 1 otherwise zdir = 0
155            zfu(ji,jj,jk) = zdir * zzfc + ( 1. - zdir ) * zzfd  ! FU in the x-direction for T
156            !
157            zdir = 0.5 + SIGN( 0.5_wp, pU(ji,jj,jk) )   ! if pU > 0 : zdir = 1 otherwise zdir = 0
158            zdx = ( zdir * e1t(ji,jj) + ( 1. - zdir ) * e1t(ji+1,jj) ) * e2u(ji,jj) * e3u(ji,jj,jk,Kmm)
159            zwx(ji,jj,jk)  = ABS( pU(ji,jj,jk) ) * p2dt / zdx    ! (0<zc_cfl<1 : Courant number on x-direction)
160            zfc(ji,jj,jk)  = zdir * pt(ji  ,jj,jk,jn,Kbb) + ( 1. - zdir ) * pt(ji+1,jj,jk,jn,Kbb)  ! FC in the x-direction for T
161            zfd(ji,jj,jk)  = zdir * pt(ji+1,jj,jk,jn,Kbb) + ( 1. - zdir ) * pt(ji  ,jj,jk,jn,Kbb)  ! FD in the x-direction for T
162         END_3D
163         !--- Lateral boundary conditions
164
165         !--- QUICKEST scheme
166         CALL quickest( zfu, zfd, zfc, zwx )
167         !
168         ! Mask at the T-points in the x-direction (mask=0 or mask=1)
169         DO_3D( 1, 0, 0, 0, 1, jpkm1 )
170            zzfu = tmask(ji-1,jj,jk) + tmask(ji,jj,jk) + tmask(ji+1,jj,jk) - 2.
171            zzfu_ip1 = tmask(ji,jj,jk) + tmask(ji+1,jj,jk) + tmask(ji+2,jj,jk) - 2.
172            !
173            ! Tracer flux on the x-direction
174            zdir = 0.5 + SIGN( 0.5_wp, pU(ji,jj,jk) )   ! if pU > 0 : zdir = 1 otherwise zdir = 0
175            !--- If the second ustream point is a land point
176            !--- the flux is computed by the 1st order UPWIND scheme
177            zmsk = zdir * zzfu + ( 1. - zdir ) * zzfu_ip1
178            zwx(ji,jj,jk) = zmsk * zwx(ji,jj,jk) + ( 1. - zmsk ) * zfc(ji,jj,jk)
179            zwx(ji,jj,jk) = zwx(ji,jj,jk) * pU(ji,jj,jk)
180         END_3D
181         !
182         ! Computation of the trend
183         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
184            zbtr = r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm)
185            ! horizontal advective trends
186            ztra = - zbtr * ( zwx(ji,jj,jk) - zwx(ji-1,jj,jk) )
187            !--- add it to the general tracer trends
188            pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) + ztra
189         END_3D
190         !                                 ! trend diagnostics
191         IF( l_trd )   CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_xad, zwx, pU, pt(:,:,:,jn,Kmm) )
192         !
193      END DO
194      !
195   END SUBROUTINE tra_adv_qck_i_lf
196
197
198   SUBROUTINE tra_adv_qck_j_lf( kt, cdtype, p2dt, pV, Kbb, Kmm, pt, kjpt, Krhs )
199      !!----------------------------------------------------------------------
200      !!
201      !!----------------------------------------------------------------------
202      INTEGER                                  , INTENT(in   ) ::   kt         ! ocean time-step index
203      INTEGER                                  , INTENT(in   ) ::   Kbb, Kmm, Krhs  ! ocean time level indices
204      CHARACTER(len=3)                         , INTENT(in   ) ::   cdtype     ! =TRA or TRC (tracer indicator)
205      INTEGER                                  , INTENT(in   ) ::   kjpt       ! number of tracers
206      REAL(wp)                                 , INTENT(in   ) ::   p2dt       ! tracer time-step
207      ! TEMP: [tiling] This can be A2D(nn_hls) if using XIOS (subdomain support)
208      REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pV        ! j-velocity components
209      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! active tracers and RHS of tracer equation
210      !!
211      INTEGER  :: ji, jj, jk, jn                ! dummy loop indices
212      REAL(wp) :: ztra, zbtr, zdir, zdx, zmsk   ! local scalars
213      REAL(wp) :: zzfc, zzfd, zzfu, zzfu_jp1    !   -     -
214      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zwy, zfu, zfc, zfd   ! 3D workspace
215      !----------------------------------------------------------------------
216      !
217      !                                                          ! ===========
218      DO jn = 1, kjpt                                            ! tracer loop
219         !                                                       ! ===========
220         zfu(:,:,:) = 0.0     ;   zfc(:,:,:) = 0.0
221         zfd(:,:,:) = 0.0     ;   zwy(:,:,:) = 0.0
222         !
223         !--- Computation of the ustream and downstream value of the tracer and the mask
224         DO_3D( 0, 0, 1, 0, 1, jpkm1 )
225            ! Upstream in the x-direction for the tracer
226            zzfc = pt(ji,jj-1,jk,jn,Kbb)
227            ! Downstream in the x-direction for the tracer
228            zzfd = pt(ji,jj+2,jk,jn,Kbb)
229            !
230            ! Horizontal advective fluxes
231            ! ---------------------------
232            !
233            zdir = 0.5 + SIGN( 0.5_wp, pV(ji,jj,jk) )   ! if pU > 0 : zdir = 1 otherwise zdir = 0
234            zfu(ji,jj,jk) = zdir * zzfc + ( 1. - zdir ) * zzfd  ! FU in the x-direction for T
235            !
236            zdir = 0.5 + SIGN( 0.5_wp, pV(ji,jj,jk) )   ! if pU > 0 : zdir = 1 otherwise zdir = 0
237            zdx = ( zdir * e2t(ji,jj) + ( 1. - zdir ) * e2t(ji,jj+1) ) * e1v(ji,jj) * e3v(ji,jj,jk,Kmm)
238            zwy(ji,jj,jk)  = ABS( pV(ji,jj,jk) ) * p2dt / zdx    ! (0<zc_cfl<1 : Courant number on x-direction)
239            zfc(ji,jj,jk)  = zdir * pt(ji,jj  ,jk,jn,Kbb) + ( 1. - zdir ) * pt(ji,jj+1,jk,jn,Kbb)  ! FC in the x-direction for T
240            zfd(ji,jj,jk)  = zdir * pt(ji,jj+1,jk,jn,Kbb) + ( 1. - zdir ) * pt(ji,jj  ,jk,jn,Kbb)  ! FD in the x-direction for T
241         END_3D
242
243         !--- QUICKEST scheme
244         CALL quickest( zfu, zfd, zfc, zwy )
245         !
246         ! Mask at the T-points in the x-direction (mask=0 or mask=1)
247         DO_3D( 0, 0, 1, 0, 1, jpkm1 )
248            zzfu = tmask(ji,jj-1,jk) + tmask(ji,jj,jk) + tmask(ji,jj+1,jk) - 2.
249            zzfu_jp1 = tmask(ji,jj,jk) + tmask(ji,jj+1,jk) + tmask(ji,jj+2,jk) - 2.
250            !
251            ! Tracer flux on the x-direction
252            zdir = 0.5 + SIGN( 0.5_wp, pV(ji,jj,jk) )   ! if pU > 0 : zdir = 1 otherwise zdir = 0
253            !--- If the second ustream point is a land point
254            !--- the flux is computed by the 1st order UPWIND scheme
255            zmsk = zdir * zzfu + ( 1. - zdir ) * zzfu_jp1
256            zwy(ji,jj,jk) = zmsk * zwy(ji,jj,jk) + ( 1. - zmsk ) * zfc(ji,jj,jk)
257            zwy(ji,jj,jk) = zwy(ji,jj,jk) * pV(ji,jj,jk)
258         END_3D
259         !
260         ! Computation of the trend
261         DO_3D( 0, 0, 0, 0, 1, jpkm1 )
262            zbtr = r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm)
263            ! horizontal advective trends
264            ztra = - zbtr * ( zwy(ji,jj,jk) - zwy(ji,jj-1,jk) )
265            !--- add it to the general tracer trends
266            pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) + ztra
267         END_3D
268         !                                 ! trend diagnostics
269         IF( l_trd )   CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_yad, zwy, pV, pt(:,:,:,jn,Kmm) )
270         !                                 ! "Poleward" heat and salt transports (contribution of upstream fluxes)
271         IF( l_ptr )   CALL dia_ptr_hst( jn, 'adv', zwy(:,:,:) )
272         !
273      END DO
274      !
275   END SUBROUTINE tra_adv_qck_j_lf
276
277
278   SUBROUTINE tra_adv_cen2_k_lf( kt, cdtype, pW, Kmm, pt, kjpt, Krhs )
279      !!----------------------------------------------------------------------
280      !!
281      !!----------------------------------------------------------------------
282      INTEGER                                  , INTENT(in   ) ::   kt       ! ocean time-step index
283      INTEGER                                  , INTENT(in   ) ::   Kmm, Krhs  ! ocean time level indices
284      CHARACTER(len=3)                         , INTENT(in   ) ::   cdtype   ! =TRA or TRC (tracer indicator)
285      INTEGER                                  , INTENT(in   ) ::   kjpt     ! number of tracers
286      ! TEMP: [tiling] This can be A2D(nn_hls) if using XIOS (subdomain support)
287      REAL(wp), DIMENSION(jpi,jpj,jpk         ), INTENT(in   ) ::   pW      ! vertical velocity
288      REAL(wp), DIMENSION(jpi,jpj,jpk,kjpt,jpt), INTENT(inout) ::   pt              ! active tracers and RHS of tracer equation
289      !
290      INTEGER  ::   ji, jj, jk, jn   ! dummy loop indices
291      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zwz   ! 3D workspace
292      !!----------------------------------------------------------------------
293      !
294      zwz(:,:, 1 ) = 0._wp       ! surface & bottom values set to zero for all tracers
295      zwz(:,:,jpk) = 0._wp
296      !
297      !                                                          ! ===========
298      DO jn = 1, kjpt                                            ! tracer loop
299         !                                                       ! ===========
300         !
301         DO_3D( 0, 0, 0, 0, 2, jpkm1 )       !* Interior point   (w-masked 2nd order centered flux)
302            zwz(ji,jj,jk) = 0.5 * pW(ji,jj,jk) * ( pt(ji,jj,jk-1,jn,Kmm) + pt(ji,jj,jk,jn,Kmm) ) * wmask(ji,jj,jk)
303         END_3D
304         IF( ln_linssh ) THEN                !* top value   (only in linear free surf. as zwz is multiplied by wmask)
305            IF( ln_isfcav ) THEN                  ! ice-shelf cavities (top of the ocean)
306               DO_2D( 0, 0, 0, 0 )
307                  zwz(ji,jj, mikt(ji,jj) ) = pW(ji,jj,mikt(ji,jj)) * pt(ji,jj,mikt(ji,jj),jn,Kmm)   ! linear free surface
308               END_2D
309            ELSE                                   ! no ocean cavities (only ocean surface)
310               DO_2D( 0, 0, 0, 0 )
311                  zwz(ji,jj,1) = pW(ji,jj,1) * pt(ji,jj,1,jn,Kmm)
312               END_2D
313            ENDIF
314         ENDIF
315         !
316         DO_3D( 0, 0, 0, 0, 1, jpkm1 )   !==  Tracer flux divergence added to the general trend  ==!
317            pt(ji,jj,jk,jn,Krhs) = pt(ji,jj,jk,jn,Krhs) - ( zwz(ji,jj,jk) - zwz(ji,jj,jk+1) )   &
318               &                                * r1_e1e2t(ji,jj) / e3t(ji,jj,jk,Kmm)
319         END_3D
320         !                                 ! Send trends for diagnostic
321         IF( l_trd )  CALL trd_tra( kt, Kmm, Krhs, cdtype, jn, jptra_zad, zwz, pW, pt(:,:,:,jn,Kmm) )
322         !
323      END DO
324      !
325   END SUBROUTINE tra_adv_cen2_k_lf
326
327
328   SUBROUTINE quickest( pfu, pfd, pfc, puc )
329      !!----------------------------------------------------------------------
330      !!
331      !! ** Purpose :  Computation of advective flux with Quickest scheme
332      !!
333      !! ** Method :
334      !!----------------------------------------------------------------------
335      REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(in   ) ::   pfu   ! second upwind point
336      REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(in   ) ::   pfd   ! first douwning point
337      REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(in   ) ::   pfc   ! the central point (or the first upwind point)
338      REAL(wp), DIMENSION(A2D(nn_hls),jpk), INTENT(inout) ::   puc   ! input as Courant number ; output as flux
339      !!
340      INTEGER  ::  ji, jj, jk               ! dummy loop indices
341      REAL(wp) ::  zcoef1, zcoef2, zcoef3   ! local scalars
342      REAL(wp) ::  zc, zcurv, zfho          !   -      -
343      !----------------------------------------------------------------------
344      !
345      DO_3D( 2, 2, 2, 2, 1, jpkm1 )
346         zc     = puc(ji,jj,jk)                         ! Courant number
347         zcurv  = pfd(ji,jj,jk) + pfu(ji,jj,jk) - 2. * pfc(ji,jj,jk)
348         zcoef1 = 0.5 *      ( pfc(ji,jj,jk) + pfd(ji,jj,jk) )
349         zcoef2 = 0.5 * zc * ( pfd(ji,jj,jk) - pfc(ji,jj,jk) )
350         zcoef3 = ( 1. - ( zc * zc ) ) * r1_6 * zcurv
351         zfho   = zcoef1 - zcoef2 - zcoef3              !  phi_f QUICKEST
352         !
353         zcoef1 = pfd(ji,jj,jk) - pfu(ji,jj,jk)
354         zcoef2 = ABS( zcoef1 )
355         zcoef3 = ABS( zcurv )
356         IF( zcoef3 >= zcoef2 ) THEN
357            zfho = pfc(ji,jj,jk)
358         ELSE
359            zcoef3 = pfu(ji,jj,jk) + ( ( pfc(ji,jj,jk) - pfu(ji,jj,jk) ) / MAX( zc, 1.e-9 ) )    ! phi_REF
360            IF( zcoef1 >= 0. ) THEN
361               zfho = MAX( pfc(ji,jj,jk), zfho )
362               zfho = MIN( zfho, MIN( zcoef3, pfd(ji,jj,jk) ) )
363            ELSE
364               zfho = MIN( pfc(ji,jj,jk), zfho )
365               zfho = MAX( zfho, MAX( zcoef3, pfd(ji,jj,jk) ) )
366            ENDIF
367         ENDIF
368         puc(ji,jj,jk) = zfho
369      END_3D
370      !
371   END SUBROUTINE quickest
372
373   !!======================================================================
374END MODULE traadv_qck_lf
Note: See TracBrowser for help on using the repository browser.