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.
sshwzv.F90 in NEMO/branches/2021/ticket2669_isf_fluxes/src/OCE/DYN – NEMO

source: NEMO/branches/2021/ticket2669_isf_fluxes/src/OCE/DYN/sshwzv.F90 @ 14917

Last change on this file since 14917 was 14834, checked in by hadcv, 3 years ago

#2600: Merge in dev_r14273_HPC-02_Daley_Tiling

  • Property svn:keywords set to Id
File size: 22.0 KB
Line 
1MODULE sshwzv   
2   !!==============================================================================
3   !!                       ***  MODULE  sshwzv  ***
4   !! Ocean dynamics : sea surface height and vertical velocity
5   !!==============================================================================
6   !! History :  3.1  !  2009-02  (G. Madec, M. Leclair)  Original code
7   !!            3.3  !  2010-04  (M. Leclair, G. Madec)  modified LF-RA
8   !!             -   !  2010-05  (K. Mogensen, A. Weaver, M. Martin, D. Lea)  Assimilation interface
9   !!             -   !  2010-09  (D.Storkey and E.O'Dea)  bug fixes for BDY module
10   !!            3.3  !  2011-10  (M. Leclair)  split former ssh_wzv routine and remove all vvl related work
11   !!            4.0  !  2018-12  (A. Coward)  add mixed implicit/explicit advection
12   !!            4.1  !  2019-08  (A. Coward, D. Storkey)  Rename ssh_nxt -> ssh_atf. Now only does time filtering.
13   !!             -   !  2020-08  (S. Techene, G. Madec)  add here ssh initiatlisation
14   !!----------------------------------------------------------------------
15
16   !!----------------------------------------------------------------------
17   !!   ssh_nxt       : after ssh
18   !!   ssh_atf       : time filter the ssh arrays
19   !!   wzv           : compute now vertical velocity
20   !!----------------------------------------------------------------------
21   USE oce            ! ocean dynamics and tracers variables
22   USE isf_oce        ! ice shelf
23   USE dom_oce        ! ocean space and time domain variables
24   USE sbc_oce        ! surface boundary condition: ocean
25   USE domvvl         ! Variable volume
26   USE divhor         ! horizontal divergence
27   USE phycst         ! physical constants
28   USE bdy_oce , ONLY : ln_bdy, bdytmask   ! Open BounDarY
29   USE bdydyn2d       ! bdy_ssh routine
30   USE wet_dry        ! Wetting/Drying flux limiting
31#if defined key_agrif
32   USE agrif_oce
33   USE agrif_oce_interp
34#endif
35   !
36   USE iom 
37   USE in_out_manager ! I/O manager
38   USE restart        ! only for lrst_oce
39   USE prtctl         ! Print control
40   USE lbclnk         ! ocean lateral boundary condition (or mpp link)
41   USE lib_mpp        ! MPP library
42   USE timing         ! Timing
43   
44   IMPLICIT NONE
45   PRIVATE
46
47   PUBLIC   ssh_nxt        ! called by step.F90
48   PUBLIC   wzv            ! called by step.F90
49   PUBLIC   wAimp          ! called by step.F90
50   PUBLIC   ssh_atf        ! called by step.F90
51
52   !! * Substitutions
53#  include "do_loop_substitute.h90"
54#  include "domzgr_substitute.h90"
55   !!----------------------------------------------------------------------
56   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
57   !! $Id$
58   !! Software governed by the CeCILL license (see ./LICENSE)
59   !!----------------------------------------------------------------------
60CONTAINS
61
62   SUBROUTINE ssh_nxt( kt, Kbb, Kmm, pssh, Kaa )
63      !!----------------------------------------------------------------------
64      !!                ***  ROUTINE ssh_nxt  ***
65      !!                   
66      !! ** Purpose :   compute the after ssh (ssh(Kaa))
67      !!
68      !! ** Method  : - Using the incompressibility hypothesis, the ssh increment
69      !!      is computed by integrating the horizontal divergence and multiply by
70      !!      by the time step.
71      !!
72      !! ** action  :   ssh(:,:,Kaa), after sea surface height
73      !!
74      !! Reference  : Leclair, M., and G. Madec, 2009, Ocean Modelling.
75      !!----------------------------------------------------------------------
76      INTEGER                         , INTENT(in   ) ::   kt             ! time step
77      INTEGER                         , INTENT(in   ) ::   Kbb, Kmm, Kaa  ! time level index
78      REAL(wp), DIMENSION(jpi,jpj,jpt), INTENT(inout) ::   pssh           ! sea-surface height
79      !
80      INTEGER  ::   ji, jj, jk      ! dummy loop index
81      REAL(wp) ::   zcoef   ! local scalar
82      REAL(wp), DIMENSION(jpi,jpj) ::   zhdiv   ! 2D workspace
83      !!----------------------------------------------------------------------
84      !
85      IF( ln_timing )   CALL timing_start('ssh_nxt')
86      !
87      IF( kt == nit000 ) THEN
88         IF(lwp) WRITE(numout,*)
89         IF(lwp) WRITE(numout,*) 'ssh_nxt : after sea surface height'
90         IF(lwp) WRITE(numout,*) '~~~~~~~ '
91      ENDIF
92      !
93      zcoef = 0.5_wp * r1_rho0
94
95      !                                           !------------------------------!
96      !                                           !   After Sea Surface Height   !
97      !                                           !------------------------------!
98      IF(ln_wd_il) THEN
99         CALL wad_lmt(pssh(:,:,Kbb), zcoef * (emp_b(:,:) + emp(:,:)), rDt, Kmm, uu, vv )
100      ENDIF
101
102      CALL div_hor( kt, Kbb, Kmm )                     ! Horizontal divergence
103      !
104      zhdiv(:,:) = 0._wp
105      DO_3D( 1, nn_hls, 1, nn_hls, 1, jpkm1 )                                 ! Horizontal divergence of barotropic transports
106        zhdiv(ji,jj) = zhdiv(ji,jj) + e3t(ji,jj,jk,Kmm) * hdiv(ji,jj,jk)
107      END_3D
108      !                                                ! Sea surface elevation time stepping
109      ! In time-split case we need a first guess of the ssh after (using the baroclinic timestep) in order to
110      ! compute the vertical velocity which can be used to compute the non-linear terms of the momentum equations.
111      !
112      DO_2D_OVR( 1, nn_hls, 1, nn_hls )                ! Loop bounds limited by hdiv definition in div_hor
113         pssh(ji,jj,Kaa) = (  pssh(ji,jj,Kbb) - rDt * ( zcoef * ( emp_b(ji,jj) + emp(ji,jj) ) + zhdiv(ji,jj) )  ) * ssmask(ji,jj)
114      END_2D
115      ! pssh must be defined everywhere (true for dyn_spg_ts, not for dyn_spg_exp)
116      IF ( .NOT. ln_dynspg_ts .AND. nn_hls == 2 ) CALL lbc_lnk( 'sshwzv', pssh(:,:,Kaa), 'T', 1.0_wp )
117      !
118#if defined key_agrif
119      Kbb_a = Kbb   ;   Kmm_a = Kmm   ;   Krhs_a = Kaa
120      CALL agrif_ssh( kt )
121#endif
122      !
123      IF ( .NOT.ln_dynspg_ts ) THEN
124         IF( ln_bdy ) THEN
125            IF (nn_hls==1) CALL lbc_lnk( 'sshwzv', pssh(:,:,Kaa), 'T', 1.0_wp )    ! Not sure that's necessary
126            CALL bdy_ssh( pssh(:,:,Kaa) )             ! Duplicate sea level across open boundaries
127         ENDIF
128      ENDIF
129      !                                           !------------------------------!
130      !                                           !           outputs            !
131      !                                           !------------------------------!
132      !
133      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab2d_1=pssh(:,:,Kaa), clinfo1=' pssh(:,:,Kaa)  - : ', mask1=tmask )
134      !
135      IF( ln_timing )   CALL timing_stop('ssh_nxt')
136      !
137   END SUBROUTINE ssh_nxt
138
139   
140   SUBROUTINE wzv( kt, Kbb, Kmm, Kaa, pww )
141      !!----------------------------------------------------------------------
142      !!                ***  ROUTINE wzv  ***
143      !!                   
144      !! ** Purpose :   compute the now vertical velocity
145      !!
146      !! ** Method  : - Using the incompressibility hypothesis, the vertical
147      !!      velocity is computed by integrating the horizontal divergence 
148      !!      from the bottom to the surface minus the scale factor evolution.
149      !!        The boundary conditions are w=0 at the bottom (no flux) and.
150      !!
151      !! ** action  :   pww      : now vertical velocity
152      !!
153      !! Reference  : Leclair, M., and G. Madec, 2009, Ocean Modelling.
154      !!----------------------------------------------------------------------
155      INTEGER                         , INTENT(in)    ::   kt             ! time step
156      INTEGER                         , INTENT(in)    ::   Kbb, Kmm, Kaa  ! time level indices
157      REAL(wp), DIMENSION(jpi,jpj,jpk), INTENT(inout) ::   pww            ! vertical velocity at Kmm
158      !
159      INTEGER  ::   ji, jj, jk   ! dummy loop indices
160      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   zhdiv
161      !!----------------------------------------------------------------------
162      !
163      IF( ln_timing )   CALL timing_start('wzv')
164      !
165      IF( kt == nit000 ) THEN
166         IF(lwp) WRITE(numout,*)
167         IF(lwp) WRITE(numout,*) 'wzv : now vertical velocity '
168         IF(lwp) WRITE(numout,*) '~~~~~ '
169         !
170         pww(:,:,jpk) = 0._wp                  ! bottom boundary condition: w=0 (set once for all)
171      ENDIF
172      !                                           !------------------------------!
173      !                                           !     Now Vertical Velocity    !
174      !                                           !------------------------------!
175      !
176      !                                               !===============================!
177      IF( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN      !==  z_tilde and layer cases  ==!
178         !                                            !===============================!
179         ALLOCATE( zhdiv(jpi,jpj,jpk) ) 
180         !
181         DO jk = 1, jpkm1
182            ! horizontal divergence of thickness diffusion transport ( velocity multiplied by e3t)
183            ! - ML - note: computation already done in dom_vvl_sf_nxt. Could be optimized (not critical and clearer this way)
184            DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
185               zhdiv(ji,jj,jk) = r1_e1e2t(ji,jj) * ( un_td(ji,jj,jk) - un_td(ji-1,jj,jk) + vn_td(ji,jj,jk) - vn_td(ji,jj-1,jk) )
186            END_2D
187         END DO
188         IF (nn_hls==1) CALL lbc_lnk('sshwzv', zhdiv, 'T', 1.0_wp)  ! - ML - Perhaps not necessary: not used for horizontal "connexions"
189         !                             ! Is it problematic to have a wrong vertical velocity in boundary cells?
190         !                             ! Same question holds for hdiv. Perhaps just for security
191         DO_3DS( 1, 1, 1, 1, jpkm1, 1, -1 )         ! integrate from the bottom the hor. divergence
192            ! computation of w
193            pww(ji,jj,jk) = pww(ji,jj,jk+1) - (   e3t(ji,jj,jk,Kmm) * hdiv(ji,jj,jk)   &
194               &                                  +                  zhdiv(ji,jj,jk)   &
195               &                                  + r1_Dt * (  e3t(ji,jj,jk,Kaa)       &
196               &                                             - e3t(ji,jj,jk,Kbb) )   ) * tmask(ji,jj,jk)
197         END_3D
198         !          IF( ln_vvl_layer ) pww(:,:,:) = 0.e0
199         DEALLOCATE( zhdiv ) 
200         !                                            !=================================!
201      ELSEIF( ln_linssh )   THEN                      !==  linear free surface cases  ==!
202         !                                            !=================================!
203         DO_3DS( 1, 1, 1, 1, jpkm1, 1, -1 )                 ! integrate from the bottom the hor. divergence
204            pww(ji,jj,jk) = pww(ji,jj,jk+1) - (  e3t(ji,jj,jk,Kmm) * hdiv(ji,jj,jk)  ) * tmask(ji,jj,jk)
205         END_3D
206         !                                            !==========================================!
207      ELSE                                            !==  Quasi-Eulerian vertical coordinate  ==!   ('key_qco')
208         !                                            !==========================================!
209         DO_3DS( 1, 1, 1, 1, jpkm1, 1, -1 )                 ! integrate from the bottom the hor. divergence
210            pww(ji,jj,jk) = pww(ji,jj,jk+1) - (  e3t(ji,jj,jk,Kmm) * hdiv(ji,jj,jk)    &
211               &                                 + r1_Dt * (  e3t(ji,jj,jk,Kaa)        &
212               &                                            - e3t(ji,jj,jk,Kbb)  )   ) * tmask(ji,jj,jk)
213         END_3D
214      ENDIF
215
216      IF( ln_bdy ) THEN
217         DO jk = 1, jpkm1
218            pww(:,:,jk) = pww(:,:,jk) * bdytmask(:,:)
219         END DO
220      ENDIF
221      !
222#if defined key_agrif
223      IF( .NOT. AGRIF_Root() ) THEN
224         !
225         ! Mask vertical velocity at first/last columns/row
226         ! inside computational domain (cosmetic)
227         DO jk = 1, jpkm1
228            IF( lk_west ) THEN                             ! --- West --- !
229               DO ji = mi0(2+nn_hls), mi1(2+nn_hls)
230                  DO jj = 1, jpj
231                     pww(ji,jj,jk) = 0._wp 
232                  END DO
233               END DO
234            ENDIF
235            IF( lk_east ) THEN                             ! --- East --- !
236               DO ji = mi0(jpiglo-1-nn_hls), mi1(jpiglo-1-nn_hls)
237                  DO jj = 1, jpj
238                     pww(ji,jj,jk) = 0._wp
239                  END DO
240               END DO
241            ENDIF
242            IF( lk_south ) THEN                            ! --- South --- !
243               DO jj = mj0(2+nn_hls), mj1(2+nn_hls)
244                  DO ji = 1, jpi
245                     pww(ji,jj,jk) = 0._wp
246                  END DO
247               END DO
248            ENDIF
249            IF( lk_north ) THEN                            ! --- North --- !
250               DO jj = mj0(jpjglo-1-nn_hls), mj1(jpjglo-1-nn_hls)
251                  DO ji = 1, jpi
252                     pww(ji,jj,jk) = 0._wp
253                  END DO
254               END DO
255            ENDIF
256            !
257         END DO
258         !
259      ENDIF 
260#endif
261      !
262      IF( ln_timing )   CALL timing_stop('wzv')
263      !
264   END SUBROUTINE wzv
265
266
267   SUBROUTINE ssh_atf( kt, Kbb, Kmm, Kaa, pssh )
268      !!----------------------------------------------------------------------
269      !!                    ***  ROUTINE ssh_atf  ***
270      !!
271      !! ** Purpose :   Apply Asselin time filter to now SSH.
272      !!
273      !! ** Method  : - apply Asselin time fiter to now ssh (excluding the forcing
274      !!              from the filter, see Leclair and Madec 2010) and swap :
275      !!                pssh(:,:,Kmm) = pssh(:,:,Kaa) + rn_atfp * ( pssh(:,:,Kbb) -2 pssh(:,:,Kmm) + pssh(:,:,Kaa) )
276      !!                            - rn_atfp * rn_Dt * ( emp_b - emp ) / rho0
277      !!
278      !! ** action  : - pssh(:,:,Kmm) time filtered
279      !!
280      !! Reference  : Leclair, M., and G. Madec, 2009, Ocean Modelling.
281      !!----------------------------------------------------------------------
282      INTEGER                         , INTENT(in   ) ::   kt             ! ocean time-step index
283      INTEGER                         , INTENT(in   ) ::   Kbb, Kmm, Kaa  ! ocean time level indices
284      REAL(wp), DIMENSION(jpi,jpj,jpt), INTENT(inout) ::   pssh           ! SSH field
285      !
286      REAL(wp) ::   zcoef   ! local scalar
287      !!----------------------------------------------------------------------
288      !
289      IF( ln_timing )   CALL timing_start('ssh_atf')
290      !
291      IF( kt == nit000 ) THEN
292         IF(lwp) WRITE(numout,*)
293         IF(lwp) WRITE(numout,*) 'ssh_atf : Asselin time filter of sea surface height'
294         IF(lwp) WRITE(numout,*) '~~~~~~~ '
295      ENDIF
296      !
297      IF( .NOT.l_1st_euler ) THEN   ! Apply Asselin time filter on Kmm field (not on euler 1st)
298         !
299         IF( ln_linssh ) THEN                ! filtered "now" field
300            pssh(:,:,Kmm) = pssh(:,:,Kmm) + rn_atfp * ( pssh(:,:,Kbb) - 2 * pssh(:,:,Kmm) + pssh(:,:,Kaa) )
301            !
302         ELSE                                ! filtered "now" field with forcing removed
303            zcoef = rn_atfp * rn_Dt * r1_rho0
304            pssh(:,:,Kmm) = pssh(:,:,Kmm) + rn_atfp * ( pssh(:,:,Kbb) - 2 * pssh(:,:,Kmm) + pssh(:,:,Kaa) )   &
305               &                          - zcoef   * (         emp_b(:,:) -        emp(:,:)   &
306               &                                              - rnf_b(:,:) +        rnf(:,:)   &
307               &                                       + fwfisf_cav_b(:,:) - fwfisf_cav(:,:)   &
308               &                                       + fwfisf_par_b(:,:) - fwfisf_par(:,:)   ) * ssmask(:,:)
309
310            ! ice sheet coupling
311            IF( ln_isf .AND. ln_isfcpl .AND. kt == nit000+1 )   &
312               &   pssh(:,:,Kbb) = pssh(:,:,Kbb) - rn_atfp * rn_Dt * ( risfcpl_ssh(:,:) - 0._wp ) * ssmask(:,:)
313
314         ENDIF
315      ENDIF
316      !
317      IF(sn_cfctl%l_prtctl)   CALL prt_ctl( tab2d_1=pssh(:,:,Kmm), clinfo1=' atf  - pssh(:,:,Kmm): ', mask1=tmask )
318      !
319      IF( ln_timing )   CALL timing_stop('ssh_atf')
320      !
321   END SUBROUTINE ssh_atf
322
323   
324   SUBROUTINE wAimp( kt, Kmm )
325      !!----------------------------------------------------------------------
326      !!                ***  ROUTINE wAimp  ***
327      !!                   
328      !! ** Purpose :   compute the Courant number and partition vertical velocity
329      !!                if a proportion needs to be treated implicitly
330      !!
331      !! ** Method  : -
332      !!
333      !! ** action  :   ww      : now vertical velocity (to be handled explicitly)
334      !!            :   wi      : now vertical velocity (for implicit treatment)
335      !!
336      !! Reference  : Shchepetkin, A. F. (2015): An adaptive, Courant-number-dependent
337      !!              implicit scheme for vertical advection in oceanic modeling.
338      !!              Ocean Modelling, 91, 38-69.
339      !!----------------------------------------------------------------------
340      INTEGER, INTENT(in) ::   kt   ! time step
341      INTEGER, INTENT(in) ::   Kmm  ! time level index
342      !
343      INTEGER  ::   ji, jj, jk   ! dummy loop indices
344      REAL(wp)             ::   zCu, zcff, z1_e3t, zdt                ! local scalars
345      REAL(wp) , PARAMETER ::   Cu_min = 0.15_wp                      ! local parameters
346      REAL(wp) , PARAMETER ::   Cu_max = 0.30_wp                      ! local parameters
347      REAL(wp) , PARAMETER ::   Cu_cut = 2._wp*Cu_max - Cu_min        ! local parameters
348      REAL(wp) , PARAMETER ::   Fcu    = 4._wp*Cu_max*(Cu_max-Cu_min) ! local parameters
349      !!----------------------------------------------------------------------
350      !
351      IF( ln_timing )   CALL timing_start('wAimp')
352      !
353      IF( kt == nit000 ) THEN
354         IF(lwp) WRITE(numout,*)
355         IF(lwp) WRITE(numout,*) 'wAimp : Courant number-based partitioning of now vertical velocity '
356         IF(lwp) WRITE(numout,*) '~~~~~ '
357         wi(:,:,:) = 0._wp
358      ENDIF
359      !
360      ! Calculate Courant numbers
361      zdt = 2._wp * rn_Dt                            ! 2*rn_Dt and not rDt (for restartability)
362      IF( ln_vvl_ztilde .OR. ln_vvl_layer ) THEN
363         DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )
364            z1_e3t = 1._wp / e3t(ji,jj,jk,Kmm)
365            Cu_adv(ji,jj,jk) =   zdt *                                                         &
366               &  ( ( MAX( ww(ji,jj,jk) , 0._wp ) - MIN( ww(ji,jj,jk+1) , 0._wp ) )            &
367               &  + ( MAX( e2u(ji  ,jj) * e3u(ji  ,jj,jk,Kmm)                                  &
368               &                        * uu (ji  ,jj,jk,Kmm) + un_td(ji  ,jj,jk), 0._wp ) -   &
369               &      MIN( e2u(ji-1,jj) * e3u(ji-1,jj,jk,Kmm)                                  &
370               &                        * uu (ji-1,jj,jk,Kmm) + un_td(ji-1,jj,jk), 0._wp ) )   &
371               &                               * r1_e1e2t(ji,jj)                                                                     &
372               &  + ( MAX( e1v(ji,jj  ) * e3v(ji,jj  ,jk,Kmm)                                  &
373               &                        * vv (ji,jj  ,jk,Kmm) + vn_td(ji,jj  ,jk), 0._wp ) -   &
374               &      MIN( e1v(ji,jj-1) * e3v(ji,jj-1,jk,Kmm)                                  &
375               &                        * vv (ji,jj-1,jk,Kmm) + vn_td(ji,jj-1,jk), 0._wp ) )   &
376               &                               * r1_e1e2t(ji,jj)                                                                     &
377               &                             ) * z1_e3t
378         END_3D
379      ELSE
380         DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )
381            z1_e3t = 1._wp / e3t(ji,jj,jk,Kmm)
382            Cu_adv(ji,jj,jk) =   zdt *                                                      &
383               &  ( ( MAX( ww(ji,jj,jk) , 0._wp ) - MIN( ww(ji,jj,jk+1) , 0._wp ) )         &
384               &                             + ( MAX( e2u(ji  ,jj)*e3u(ji  ,jj,jk,Kmm)*uu(ji  ,jj,jk,Kmm), 0._wp ) -   &
385               &                                 MIN( e2u(ji-1,jj)*e3u(ji-1,jj,jk,Kmm)*uu(ji-1,jj,jk,Kmm), 0._wp ) )   &
386               &                               * r1_e1e2t(ji,jj)                                                 &
387               &                             + ( MAX( e1v(ji,jj  )*e3v(ji,jj  ,jk,Kmm)*vv(ji,jj  ,jk,Kmm), 0._wp ) -   &
388               &                                 MIN( e1v(ji,jj-1)*e3v(ji,jj-1,jk,Kmm)*vv(ji,jj-1,jk,Kmm), 0._wp ) )   &
389               &                               * r1_e1e2t(ji,jj)                                                 &
390               &                             ) * z1_e3t
391         END_3D
392      ENDIF
393      IF (nn_hls==1) CALL lbc_lnk( 'sshwzv', Cu_adv, 'T', 1.0_wp )
394      !
395      CALL iom_put("Courant",Cu_adv)
396      !
397      IF( MAXVAL( Cu_adv(:,:,:) ) > Cu_min ) THEN       ! Quick check if any breaches anywhere
398         DO_3DS( nn_hls, nn_hls, nn_hls, nn_hls, jpkm1, 2, -1 )             ! or scan Courant criterion and partition ! w where necessary
399            !
400            zCu = MAX( Cu_adv(ji,jj,jk) , Cu_adv(ji,jj,jk-1) )
401! alt:
402!                  IF ( ww(ji,jj,jk) > 0._wp ) THEN
403!                     zCu =  Cu_adv(ji,jj,jk)
404!                  ELSE
405!                     zCu =  Cu_adv(ji,jj,jk-1)
406!                  ENDIF
407            !
408            IF( zCu <= Cu_min ) THEN              !<-- Fully explicit
409               zcff = 0._wp
410            ELSEIF( zCu < Cu_cut ) THEN           !<-- Mixed explicit
411               zcff = ( zCu - Cu_min )**2
412               zcff = zcff / ( Fcu + zcff )
413            ELSE                                  !<-- Mostly implicit
414               zcff = ( zCu - Cu_max )/ zCu
415            ENDIF
416            zcff = MIN(1._wp, zcff)
417            !
418            wi(ji,jj,jk) =           zcff   * ww(ji,jj,jk)
419            ww(ji,jj,jk) = ( 1._wp - zcff ) * ww(ji,jj,jk)
420            !
421            Cu_adv(ji,jj,jk) = zcff               ! Reuse array to output coefficient below and in stp_ctl
422         END_3D
423         Cu_adv(:,:,1) = 0._wp 
424      ELSE
425         ! Fully explicit everywhere
426         Cu_adv(:,:,:) = 0._wp                          ! Reuse array to output coefficient below and in stp_ctl
427         wi    (:,:,:) = 0._wp
428      ENDIF
429      CALL iom_put("wimp",wi) 
430      CALL iom_put("wi_cff",Cu_adv)
431      CALL iom_put("wexp",ww)
432      !
433      IF( ln_timing )   CALL timing_stop('wAimp')
434      !
435   END SUBROUTINE wAimp
436     
437   !!======================================================================
438END MODULE sshwzv
Note: See TracBrowser for help on using the repository browser.