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

source: NEMO/trunk/src/OCE/ZDF/zdfphy.F90 @ 15293

Last change on this file since 15293 was 15293, checked in by clem, 2 years ago

try to pass debug mode with outputs activated. One issue was that the shear was not calculated at the top and bottom levels. Another issue is that the shear is not defined in the haloes but solving this one probably requires to wait for the new xios to be released

  • Property svn:keywords set to Id
File size: 22.9 KB
Line 
1MODULE zdfphy
2   !!======================================================================
3   !!                      ***  MODULE  zdfphy  ***
4   !! Vertical ocean physics :   manager of all vertical physics packages
5   !!======================================================================
6   !! History :  4.0  !  2017-04  (G. Madec)  original code
7   !!----------------------------------------------------------------------
8
9   !!----------------------------------------------------------------------
10   !!   zdf_phy_init  : initialization of all vertical physics packages
11   !!   zdf_phy       : upadate at each time-step the vertical mixing coeff.
12   !!----------------------------------------------------------------------
13   USE oce            ! ocean dynamics and tracers variables
14   ! TEMP: [tiling] This change not necessary after finalisation of zdf_osm (not yet tiled)
15   USE domtile
16   USE zdf_oce        ! vertical physics: shared variables
17   USE zdfdrg         ! vertical physics: top/bottom drag coef.
18   USE zdfsh2         ! vertical physics: shear production term of TKE
19   USE zdfric         ! vertical physics: RIChardson dependent vertical mixing
20   USE zdftke         ! vertical physics: TKE vertical mixing
21   USE zdfgls         ! vertical physics: GLS vertical mixing
22   USE zdfosm         ! vertical physics: OSMOSIS vertical mixing
23   USE zdfddm         ! vertical physics: double diffusion mixing
24   USE zdfevd         ! vertical physics: convection via enhanced vertical diffusion
25   USE zdfmfc         ! vertical physics: Mass Flux Convection
26   USE zdfiwm         ! vertical physics: internal wave-induced mixing
27   USE zdfswm         ! vertical physics: surface  wave-induced mixing
28   USE zdfmxl         ! vertical physics: mixed layer
29   USE tranpc         ! convection: non penetrative adjustment
30   USE trc_oce        ! variables shared between passive tracer & ocean
31   USE sbc_oce        ! surface module (only for nn_isf in the option compatibility test)
32   USE sbcrnf         ! surface boundary condition: runoff variables
33   USE sbc_ice        ! sea ice drag
34#if defined key_agrif
35   USE agrif_oce_interp   ! interpavm
36#endif
37   !
38   USE in_out_manager ! I/O manager
39   USE iom            ! IOM library
40   USE lbclnk         ! lateral boundary conditions
41   USE lib_mpp        ! distribued memory computing
42   USE timing         ! Timing
43
44   IMPLICIT NONE
45   PRIVATE
46
47   PUBLIC   zdf_phy_init  ! called by nemogcm.F90
48   PUBLIC   zdf_phy       ! called by step.F90
49
50   INTEGER ::   nzdf_phy   ! type of vertical closure used
51   !                       ! associated indicators
52   INTEGER, PARAMETER ::   np_CST = 1   ! Constant Kz
53   INTEGER, PARAMETER ::   np_RIC = 2   ! Richardson number dependent Kz
54   INTEGER, PARAMETER ::   np_TKE = 3   ! Turbulente Kinetic Eenergy closure scheme for Kz
55   INTEGER, PARAMETER ::   np_GLS = 4   ! Generic Length Scale closure scheme for Kz
56   INTEGER, PARAMETER ::   np_OSM = 5   ! OSMOSIS-OBL closure scheme for Kz
57
58   LOGICAL, PUBLIC ::   l_zdfsh2   ! shear production term flag (=F for CST, =T otherwise (i.e. TKE, GLS, RIC))
59
60   REAL(wp), SAVE, ALLOCATABLE, DIMENSION(:,:,:) ::   avm_k_n !: "Now" avm_k used for calculation of zsh2 with tiling
61
62   !! * Substitutions
63#  include "do_loop_substitute.h90"
64   !!----------------------------------------------------------------------
65   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
66   !! $Id$
67   !! Software governed by the CeCILL license (see ./LICENSE)
68   !!----------------------------------------------------------------------
69CONTAINS
70
71   SUBROUTINE zdf_phy_init( Kmm )
72      !!----------------------------------------------------------------------
73      !!                  ***  ROUTINE zdf_phy_init  ***
74      !!
75      !! ** Purpose :   initializations of the vertical ocean physics
76      !!
77      !! ** Method  :   Read namelist namzdf, control logicals
78      !!                set horizontal shape and vertical profile of background mixing coef.
79      !!----------------------------------------------------------------------
80      INTEGER, INTENT(in)    :: Kmm ! time level index (middle)
81      !
82      INTEGER ::   jk            ! dummy loop indices
83      INTEGER ::   ioptio, ios   ! local integers
84      !!
85      NAMELIST/namzdf/ ln_zdfcst, ln_zdfric, ln_zdftke, ln_zdfgls,   &     ! type of closure scheme
86         &             ln_zdfosm,                                    &     ! type of closure scheme
87         &             ln_zdfmfc,                                    &     ! convection : mass flux
88         &             ln_zdfevd, nn_evdm, rn_evd ,                  &     ! convection : evd
89         &             ln_zdfnpc, nn_npc , nn_npcp,                  &     ! convection : npc
90         &             ln_zdfddm, rn_avts, rn_hsbfr,                 &     ! double diffusion
91         &             ln_zdfswm,                                    &     ! surface  wave-induced mixing
92         &             ln_zdfiwm,                                    &     ! internal  -      -      -
93         &             ln_zad_Aimp,                                  &     ! apdative-implicit vertical advection
94         &             rn_avm0, rn_avt0, nn_avb, nn_havtb                  ! coefficients
95      !!----------------------------------------------------------------------
96      !
97      IF(lwp) THEN
98         WRITE(numout,*)
99         WRITE(numout,*) 'zdf_phy_init: ocean vertical physics'
100         WRITE(numout,*) '~~~~~~~~~~~~'
101      ENDIF
102      !
103      !                           !==  Namelist  ==!
104      READ  ( numnam_ref, namzdf, IOSTAT = ios, ERR = 901)
105901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namzdf in reference namelist' )
106      !
107      READ  ( numnam_cfg, namzdf, IOSTAT = ios, ERR = 902 )
108902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namzdf in configuration namelist' )
109      IF(lwm)   WRITE ( numond, namzdf )
110      !
111      IF(lwp) THEN                      ! Parameter print
112         WRITE(numout,*) '   Namelist namzdf : set vertical mixing mixing parameters'
113         WRITE(numout,*) '      adaptive-implicit vertical advection'
114         WRITE(numout,*) '         Courant number targeted application   ln_zad_Aimp = ', ln_zad_Aimp
115         WRITE(numout,*) '      vertical closure scheme'
116         WRITE(numout,*) '         constant vertical mixing coefficient    ln_zdfcst = ', ln_zdfcst
117         WRITE(numout,*) '         Richardson number dependent closure     ln_zdfric = ', ln_zdfric
118         WRITE(numout,*) '         Turbulent Kinetic Energy closure (TKE)  ln_zdftke = ', ln_zdftke
119         WRITE(numout,*) '         Generic Length Scale closure (GLS)      ln_zdfgls = ', ln_zdfgls
120         WRITE(numout,*) '         OSMOSIS-OBL closure (OSM)               ln_zdfosm = ', ln_zdfosm
121         WRITE(numout,*) '      convection: '
122         WRITE(numout,*) '         convection mass flux (mfc)              ln_zdfmfc = ', ln_zdfmfc
123         WRITE(numout,*) '         enhanced vertical diffusion             ln_zdfevd = ', ln_zdfevd
124         WRITE(numout,*) '            applied on momentum (=1/0)             nn_evdm = ', nn_evdm
125         WRITE(numout,*) '            vertical coefficient for evd           rn_evd  = ', rn_evd
126         WRITE(numout,*) '         non-penetrative convection (npc)        ln_zdfnpc = ', ln_zdfnpc
127         WRITE(numout,*) '            npc call  frequency                    nn_npc  = ', nn_npc
128         WRITE(numout,*) '            npc print frequency                    nn_npcp = ', nn_npcp
129         WRITE(numout,*) '      double diffusive mixing                    ln_zdfddm = ', ln_zdfddm
130         WRITE(numout,*) '         maximum avs for dd mixing                 rn_avts = ', rn_avts
131         WRITE(numout,*) '         heat/salt buoyancy flux ratio             rn_hsbfr= ', rn_hsbfr
132         WRITE(numout,*) '      gravity wave-induced mixing'
133         WRITE(numout,*) '         surface  wave (Qiao et al 2010)         ln_zdfswm = ', ln_zdfswm                                          ! surface wave induced mixing
134         WRITE(numout,*) '         internal wave (de Lavergne et al 2017)  ln_zdfiwm = ', ln_zdfiwm
135         WRITE(numout,*) '      coefficients : '
136         WRITE(numout,*) '         vertical eddy viscosity                 rn_avm0   = ', rn_avm0
137         WRITE(numout,*) '         vertical eddy diffusivity               rn_avt0   = ', rn_avt0
138         WRITE(numout,*) '         constant background or profile          nn_avb    = ', nn_avb
139         WRITE(numout,*) '         horizontal variation for avtb           nn_havtb  = ', nn_havtb
140      ENDIF
141
142      IF( ln_zad_Aimp ) THEN
143         IF( zdf_phy_alloc() /= 0 )   &
144            &       CALL ctl_stop( 'STOP', 'zdf_phy_init : unable to allocate adaptive-implicit z-advection arrays' )
145         Cu_adv(:,:,:) = 0._wp
146         wi    (:,:,:) = 0._wp
147      ENDIF
148      !                                  ! Initialise zdf_mxl arrays (only hmld as not set everywhere when nn_hls > 1)
149      IF( zdf_mxl_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'zdf_mxl : unable to allocate arrays' )
150      hmld(:,:) = 0._wp
151      !                          !==  Background eddy viscosity and diffusivity  ==!
152      IF( nn_avb == 0 ) THEN             ! Define avmb, avtb from namelist parameter
153         avmb(:) = rn_avm0
154         avtb(:) = rn_avt0
155      ELSE                               ! Background profile of avt (fit a theoretical/observational profile (Krauss 1990)
156         avmb(:) = rn_avm0
157         avtb(:) = rn_avt0 + ( 3.e-4_wp - 2._wp * rn_avt0 ) * 1.e-4_wp * gdepw_1d(:)   ! m2/s
158         IF(ln_sco .AND. lwp)   CALL ctl_warn( 'avtb profile not valid in sco' )
159      ENDIF
160      !                                  ! 2D shape of the avtb
161      avtb_2d(:,:) = 1._wp                   ! uniform
162      !
163      IF( nn_havtb == 1 ) THEN               ! decrease avtb by a factor of ten in the equatorial band
164           !                                 !   -15S -5S : linear decrease from avt0 to avt0/10.
165           !                                 !   -5S  +5N : cst value avt0/10.
166           !                                 !    5N  15N : linear increase from avt0/10, to avt0
167           WHERE(-15. <= gphit .AND. gphit < -5 )   avtb_2d = (1.  - 0.09 * (gphit + 15.))
168           WHERE( -5. <= gphit .AND. gphit <  5 )   avtb_2d =  0.1
169           WHERE(  5. <= gphit .AND. gphit < 15 )   avtb_2d = (0.1 + 0.09 * (gphit -  5.))
170      ENDIF
171      !
172      DO jk = 1, jpk                      ! set turbulent closure Kz to the background value (avt_k, avm_k)
173         avt_k(:,:,jk) = avtb_2d(:,:) * avtb(jk) * wmask (:,:,jk)
174         avm_k(:,:,jk) =                avmb(jk) * wmask (:,:,jk)
175      END DO
176!!gm  to be tested only the 1st & last levels
177!      avt  (:,:, 1 ) = 0._wp   ;   avs(:,:, 1 ) = 0._wp   ;   avm  (:,:, 1 ) = 0._wp
178!      avt  (:,:,jpk) = 0._wp   ;   avs(:,:,jpk) = 0._wp   ;   avm  (:,:,jpk) = 0._wp
179!!gm
180      avt  (:,:,:) = 0._wp   ;   avs(:,:,:) = 0._wp   ;   avm  (:,:,:) = 0._wp
181
182      !                          !==  Convection  ==!
183      !
184      IF( ln_zdfnpc .AND. ln_zdfevd )   CALL ctl_stop( 'zdf_phy_init: chose between ln_zdfnpc and ln_zdfevd' )
185      IF( ln_zdfosm .AND. ln_zdfevd )   CALL ctl_stop( 'zdf_phy_init: chose between ln_zdfosm and ln_zdfevd' )
186      IF( ln_zdfmfc .AND. ln_zdfevd )   CALL ctl_stop( 'zdf_phy_init: chose between ln_zdfmfc and ln_zdfevd' )
187      IF( ln_zdfmfc .AND. ln_zdfnpc )   CALL ctl_stop( 'zdf_phy_init: chose between ln_zdfmfc and ln_zdfnpc' )
188      IF( ln_zdfmfc .AND. ln_zdfosm )   CALL ctl_stop( 'zdf_phy_init: chose between ln_zdfmfc and ln_zdfosm' )
189      IF( lk_top    .AND. ln_zdfnpc )   CALL ctl_stop( 'zdf_phy_init: npc scheme is not working with key_top' )
190      IF( lk_top    .AND. ln_zdfosm )   CALL ctl_warn( 'zdf_phy_init: osmosis gives no non-local fluxes for TOP tracers yet' )
191      IF( lk_top    .AND. ln_zdfmfc )   CALL ctl_stop( 'zdf_phy_init: Mass Flux scheme is not working with key_top' )
192      IF(lwp) THEN
193         WRITE(numout,*)
194         IF    ( ln_zdfnpc ) THEN  ;   WRITE(numout,*) '   ==>>>   convection: use non penetrative convective scheme'
195         ELSEIF( ln_zdfevd ) THEN  ;   WRITE(numout,*) '   ==>>>   convection: use enhanced vertical diffusion scheme'
196         ELSEIF( ln_zdfmfc ) THEN  ;   WRITE(numout,*) '   ==>>>   convection: use Mass Flux scheme'
197         ELSE                      ;   WRITE(numout,*) '   ==>>>   convection: no specific scheme used'
198         ENDIF
199      ENDIF
200
201      IF(lwp) THEN               !==  Double Diffusion Mixing parameterization  ==!   (ddm)
202         WRITE(numout,*)
203         IF( ln_zdfddm ) THEN   ;   WRITE(numout,*) '   ==>>>   use double diffusive mixing: avs /= avt'
204         ELSE                   ;   WRITE(numout,*) '   ==>>>   No  double diffusive mixing: avs = avt'
205         ENDIF
206      ENDIF
207
208      !                          !==  type of vertical turbulent closure  ==!    (set nzdf_phy)
209      ioptio = 0
210      IF( ln_zdfcst ) THEN   ;   ioptio = ioptio + 1   ;    nzdf_phy = np_CST   ;   ENDIF
211      IF( ln_zdfric ) THEN   ;   ioptio = ioptio + 1   ;    nzdf_phy = np_RIC   ;   CALL zdf_ric_init          ;   ENDIF
212      IF( ln_zdftke ) THEN   ;   ioptio = ioptio + 1   ;    nzdf_phy = np_TKE   ;   CALL zdf_tke_init( Kmm )   ;   ENDIF
213      IF( ln_zdfgls ) THEN   ;   ioptio = ioptio + 1   ;    nzdf_phy = np_GLS   ;   CALL zdf_gls_init          ;   ENDIF
214      IF( ln_zdfosm ) THEN   ;   ioptio = ioptio + 1   ;    nzdf_phy = np_OSM   ;   CALL zdf_osm_init( Kmm )   ;   ENDIF
215      !
216      IF( ioptio /= 1 )    CALL ctl_stop( 'zdf_phy_init: one and only one vertical diffusion option has to be defined ' )
217      IF( ln_isfcav ) THEN
218      IF( ln_zdfric )      CALL ctl_stop( 'zdf_phy_init: zdfric never tested with ice shelves cavities ' )
219      ENDIF
220      !                                ! shear production term flag
221      IF( ln_zdfcst .OR. ln_zdfosm ) THEN   ;   l_zdfsh2 = .FALSE.
222      ELSE                                  ;   l_zdfsh2 = .TRUE.
223      ENDIF
224      IF( ln_tile .AND. l_zdfsh2 ) ALLOCATE( avm_k_n(jpi,jpj,jpk) )
225      !                          !== Mass Flux Convectiive algorithm  ==!
226      IF( ln_zdfmfc )   CALL zdf_mfc_init       ! Convection computed with eddy diffusivity mass flux
227      !
228      !                          !== gravity wave-driven mixing  ==!
229      IF( ln_zdfiwm )   CALL zdf_iwm_init       ! internal wave-driven mixing
230      IF( ln_zdfswm )   CALL zdf_swm_init       ! surface  wave-driven mixing
231
232      !                          !== top/bottom friction  ==!
233      CALL zdf_drg_init
234      !
235      !                          !== time-stepping  ==!
236      ! Check/update of time stepping done in dynzdf_init/trazdf_init
237      !!gm move it here ?
238      !
239   END SUBROUTINE zdf_phy_init
240
241
242   SUBROUTINE zdf_phy( kt, Kbb, Kmm, Krhs )
243      !!----------------------------------------------------------------------
244      !!                     ***  ROUTINE zdf_phy  ***
245      !!
246      !! ** Purpose :  Update ocean physics at each time-step
247      !!
248      !! ** Method  :
249      !!
250      !! ** Action  :   avm, avt vertical eddy viscosity and diffusivity at w-points
251      !!                nmld ??? mixed layer depth in level and meters   <<<<====verifier !
252      !!                bottom stress.....                               <<<<====verifier !
253      !!----------------------------------------------------------------------
254      INTEGER, INTENT(in) ::   kt         ! ocean time-step index
255      INTEGER, INTENT(in) ::   Kbb, Kmm, Krhs   ! ocean time level indices
256      !
257      INTEGER ::   ji, jj, jk   ! dummy loop indice
258      REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zsh2   ! shear production
259      !! ---------------------------------------------------------------------
260      !
261      IF( ln_timing )   CALL timing_start('zdf_phy')
262      !
263      IF( l_zdfdrg ) THEN     !==  update top/bottom drag  ==!   (non-linear cases)
264         !
265         !                       !* bottom drag
266         CALL zdf_drg( kt, Kmm, mbkt , r_Cdmin_bot, r_Cdmax_bot,   &   ! <<== in
267            &              r_z0_bot,   r_ke0_bot,    rCd0_bot,   &
268            &                                        rCdU_bot  )     ! ==>> out : bottom drag [m/s]
269         IF( ln_isfcav ) THEN    !* top drag   (ocean cavities)
270            CALL zdf_drg( kt, Kmm, mikt , r_Cdmin_top, r_Cdmax_top,   &   ! <<== in
271               &              r_z0_top,   r_ke0_top,    rCd0_top,   &
272               &                                        rCdU_top  )     ! ==>> out : bottom drag [m/s]
273         ENDIF
274      ENDIF
275      !
276#if defined key_si3
277      IF ( ln_drgice_imp) THEN
278         IF ( ln_isfcav ) THEN
279            DO_2D_OVR( 1, 1, 1, 1 )
280               rCdU_top(ji,jj) = rCdU_top(ji,jj) + ssmask(ji,jj) * tmask(ji,jj,1) * rCdU_ice(ji,jj)
281            END_2D
282         ELSE
283            DO_2D_OVR( 1, 1, 1, 1 )
284               rCdU_top(ji,jj) = rCdU_ice(ji,jj)
285            END_2D
286         ENDIF
287      ENDIF
288#endif
289      !
290      CALL zdf_mxl( kt, Kmm )                        !* mixed layer depth, and level
291      !
292      !                       !==  Kz from chosen turbulent closure  ==!   (avm_k, avt_k)
293      !
294      ! NOTE: [tiling] the closure schemes (zdf_tke etc) will update avm_k. With tiling, the calculation of zsh2 on adjacent tiles then uses both updated (next timestep) and non-updated (current timestep) values of avm_k. To preserve results, we save a read-only copy of the "now" avm_k to use in the calculation of zsh2.
295      IF( l_zdfsh2 ) THEN        !* shear production at w-points (energy conserving form)
296         IF( ln_tile ) THEN
297            IF( ntile == 1 ) avm_k_n(:,:,:) = avm_k(:,:,:)     ! Preserve "now" avm_k for calculation of zsh2
298            CALL zdf_sh2( Kbb, Kmm, avm_k_n, &     ! <<== in
299               &                     zsh2    )     ! ==>> out : shear production
300         ELSE
301            CALL zdf_sh2( Kbb, Kmm, avm_k,   &     ! <<== in
302               &                     zsh2    )     ! ==>> out : shear production
303         ENDIF
304      ENDIF
305      !
306      SELECT CASE ( nzdf_phy )                  !* Vertical eddy viscosity and diffusivity coefficients at w-points
307      CASE( np_RIC )   ;   CALL zdf_ric( kt,      Kmm, zsh2, avm_k, avt_k )    ! Richardson number dependent Kz
308      CASE( np_TKE )   ;   CALL zdf_tke( kt, Kbb, Kmm, zsh2, avm_k, avt_k )    ! TKE closure scheme for Kz
309      CASE( np_GLS )   ;   CALL zdf_gls( kt, Kbb, Kmm, zsh2, avm_k, avt_k )    ! GLS closure scheme for Kz
310      CASE( np_OSM )   ;   CALL zdf_osm( kt, Kbb, Kmm, Krhs, avm_k, avt_k )    ! OSMOSIS closure scheme for Kz
311   !     CASE( np_CST )                                  ! Constant Kz (reset avt, avm to the background value)
312   !         ! avt_k and avm_k set one for all at initialisation phase
313!!gm         avt(2:jpim1,2:jpjm1,1:jpkm1) = rn_avt0 * wmask(2:jpim1,2:jpjm1,1:jpkm1)
314!!gm         avm(2:jpim1,2:jpjm1,1:jpkm1) = rn_avm0 * wmask(2:jpim1,2:jpjm1,1:jpkm1)
315      END SELECT
316      !
317      !                          !==  ocean Kz  ==!   (avt, avs, avm)
318      !
319      !                                         !* start from turbulent closure values
320      DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, jpkm1 )
321         avt(ji,jj,jk) = avt_k(ji,jj,jk)
322         avm(ji,jj,jk) = avm_k(ji,jj,jk)
323      END_3D
324      !
325      IF( ln_rnf_mouth ) THEN                   !* increase diffusivity at rivers mouths
326         DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 2, nkrnf )
327            avt(ji,jj,jk) = avt(ji,jj,jk) + 2._wp * rn_avt_rnf * rnfmsk(ji,jj) * wmask(ji,jj,jk)
328         END_3D
329      ENDIF
330      !
331      IF( ln_zdfevd )   CALL zdf_evd( kt, Kmm, Krhs, avm, avt )  !* convection: enhanced vertical eddy diffusivity
332      !
333      !                                         !* double diffusive mixing
334      IF( ln_zdfddm ) THEN                            ! update avt and compute avs
335                        CALL zdf_ddm( kt, Kmm,  avm, avt, avs )
336      ELSE                                            ! same mixing on all tracers
337         DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )
338            avs(ji,jj,jk) = avt(ji,jj,jk)
339         END_3D
340      ENDIF
341      !
342      !                                         !* wave-induced mixing
343      IF( ln_zdfswm )   CALL zdf_swm( kt, Kmm, avm, avt, avs )   ! surface  wave (Qiao et al. 2004)
344      IF( ln_zdfiwm )   CALL zdf_iwm( kt, Kmm, avm, avt, avs )   ! internal wave (de Lavergne et al 2017)
345
346#if defined key_agrif
347      ! interpolation parent grid => child grid for avm_k ( ex : at west border: update column 1 and 2)
348      IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN                       ! Do only on the last tile
349         IF( l_zdfsh2 )   CALL Agrif_avm
350      ENDIF
351#endif
352
353      !                                         !* Lateral boundary conditions (sign unchanged)
354      IF(nn_hls==1) THEN
355         IF( l_zdfsh2 ) THEN
356            CALL lbc_lnk( 'zdfphy', avm_k, 'W', 1.0_wp , avt_k, 'W', 1.0_wp,   &
357                  &                 avm  , 'W', 1.0_wp , avt  , 'W', 1.0_wp , avs , 'W', 1.0_wp )
358         ELSE
359            CALL lbc_lnk( 'zdfphy', avm  , 'W', 1.0_wp , avt  , 'W', 1.0_wp , avs , 'W', 1.0_wp )
360         ENDIF
361         !
362         IF( l_zdfdrg ) THEN     ! drag  have been updated (non-linear cases)
363            IF( ln_isfcav ) THEN   ;  CALL lbc_lnk( 'zdfphy', rCdU_top, 'T', 1.0_wp , rCdU_bot, 'T', 1.0_wp )   ! top & bot drag
364            ELSE                   ;  CALL lbc_lnk( 'zdfphy', rCdU_bot, 'T', 1.0_wp )                           ! bottom drag only
365            ENDIF
366         ENDIF
367      ENDIF
368      !
369      CALL zdf_mxl_turb( kt, Kmm )                   !* turbocline depth
370      !
371      IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN                       ! Do only on the last tile
372         IF( lrst_oce ) THEN                       !* write TKE, GLS or RIC fields in the restart file
373            IF( ln_zdftke )   CALL tke_rst( kt, 'WRITE' )
374            IF( ln_zdfgls )   CALL gls_rst( kt, 'WRITE' )
375            IF( ln_zdfric )   CALL ric_rst( kt, 'WRITE' )
376            ! NB. OSMOSIS restart (osm_rst) will be called in step.F90 after ww has been updated
377         ENDIF
378      ENDIF
379      !
380      ! diagnostics of energy dissipation
381      IF( iom_use('avt_k') .OR. iom_use('avm_k') .OR. iom_use('eshear_k') .OR. iom_use('estrat_k') ) THEN
382         IF( l_zdfsh2 ) THEN
383            CALL iom_put( 'avt_k'   ,   avt_k       * wmask )
384            CALL iom_put( 'avm_k'   ,   avm_k       * wmask )
385            CALL iom_put( 'eshear_k',   zsh2        * wmask )
386            CALL iom_put( 'estrat_k', - avt_k * rn2 * wmask )
387         ENDIF
388      ENDIF
389      !
390      IF( ln_timing )   CALL timing_stop('zdf_phy')
391      !
392   END SUBROUTINE zdf_phy
393
394
395   INTEGER FUNCTION zdf_phy_alloc()
396      !!----------------------------------------------------------------------
397      !!                 ***  FUNCTION zdf_phy_alloc  ***
398      !!----------------------------------------------------------------------
399     ! Allocate wi array (declared in oce.F90) for use with the adaptive-implicit vertical velocity option
400     ALLOCATE(     wi(jpi,jpj,jpk), Cu_adv(jpi,jpj,jpk),  STAT= zdf_phy_alloc )
401     IF( zdf_phy_alloc /= 0 )   CALL ctl_warn('zdf_phy_alloc: failed to allocate ln_zad_Aimp=T required arrays')
402     CALL mpp_sum ( 'zdfphy', zdf_phy_alloc )
403   END FUNCTION zdf_phy_alloc
404
405   !!======================================================================
406END MODULE zdfphy
Note: See TracBrowser for help on using the repository browser.