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.
zdfiwm.F90 in NEMO/branches/2019/dev_r11613_ENHANCE-04_namelists_as_internalfiles/src/OCE/ZDF – NEMO

source: NEMO/branches/2019/dev_r11613_ENHANCE-04_namelists_as_internalfiles/src/OCE/ZDF/zdfiwm.F90 @ 11671

Last change on this file since 11671 was 11671, checked in by acc, 5 years ago

Branch 2019/dev_r11613_ENHANCE-04_namelists_as_internalfiles. Final, non-substantive changes to complete this branch. These changes remove all REWIND statements on the old namelist fortran units (now character variables for internal files). These changes have been left until last since they are easily repeated via a script and it may be preferable to use the previous revision for merge purposes and reapply these last changes separately. This branch has been fully SETTE tested.

  • Property svn:keywords set to Id
File size: 25.5 KB
Line 
1MODULE zdfiwm
2   !!========================================================================
3   !!                       ***  MODULE  zdfiwm  ***
4   !! Ocean physics: Internal gravity wave-driven vertical mixing
5   !!========================================================================
6   !! History :  1.0  !  2004-04  (L. Bessieres, G. Madec)  Original code
7   !!             -   !  2006-08  (A. Koch-Larrouy)  Indonesian strait
8   !!            3.3  !  2010-10  (C. Ethe, G. Madec)  reorganisation of initialisation phase
9   !!            3.6  !  2016-03  (C. de Lavergne)  New param: internal wave-driven mixing
10   !!            4.0  !  2017-04  (G. Madec)  renamed module, remove the old param. and the CPP keys
11   !!----------------------------------------------------------------------
12
13   !!----------------------------------------------------------------------
14   !!   zdf_iwm       : global     momentum & tracer Kz with wave induced Kz
15   !!   zdf_iwm_init  : global     momentum & tracer Kz with wave induced Kz
16   !!----------------------------------------------------------------------
17   USE oce            ! ocean dynamics and tracers variables
18   USE dom_oce        ! ocean space and time domain variables
19   USE zdf_oce        ! ocean vertical physics variables
20   USE zdfddm         ! ocean vertical physics: double diffusive mixing
21   USE lbclnk         ! ocean lateral boundary conditions (or mpp link)
22   USE eosbn2         ! ocean equation of state
23   USE phycst         ! physical constants
24   !
25   USE prtctl         ! Print control
26   USE in_out_manager ! I/O manager
27   USE iom            ! I/O Manager
28   USE lib_mpp        ! MPP library
29   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
30
31   IMPLICIT NONE
32   PRIVATE
33
34   PUBLIC   zdf_iwm        ! called in step module
35   PUBLIC   zdf_iwm_init   ! called in nemogcm module
36
37   !                      !!* Namelist  namzdf_iwm : internal wave-driven mixing *
38   INTEGER ::  nn_zpyc     ! pycnocline-intensified mixing energy proportional to N (=1) or N^2 (=2)
39   LOGICAL ::  ln_mevar    ! variable (=T) or constant (=F) mixing efficiency
40   LOGICAL ::  ln_tsdiff   ! account for differential T/S wave-driven mixing (=T) or not (=F)
41
42   REAL(wp)::  r1_6 = 1._wp / 6._wp
43
44   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ebot_iwm   ! power available from high-mode wave breaking (W/m2)
45   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   epyc_iwm   ! power available from low-mode, pycnocline-intensified wave breaking (W/m2)
46   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ecri_iwm   ! power available from low-mode, critical slope wave breaking (W/m2)
47   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   hbot_iwm   ! WKB decay scale for high-mode energy dissipation (m)
48   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:) ::   hcri_iwm   ! decay scale for low-mode critical slope dissipation (m)
49
50   !! * Substitutions
51#  include "vectopt_loop_substitute.h90"
52   !!----------------------------------------------------------------------
53   !! NEMO/OCE 4.0 , NEMO Consortium (2018)
54   !! $Id$
55   !! Software governed by the CeCILL license (see ./LICENSE)
56   !!----------------------------------------------------------------------
57CONTAINS
58
59   INTEGER FUNCTION zdf_iwm_alloc()
60      !!----------------------------------------------------------------------
61      !!                ***  FUNCTION zdf_iwm_alloc  ***
62      !!----------------------------------------------------------------------
63      ALLOCATE( ebot_iwm(jpi,jpj),  epyc_iwm(jpi,jpj),  ecri_iwm(jpi,jpj) ,     &
64      &         hbot_iwm(jpi,jpj),  hcri_iwm(jpi,jpj)                     , STAT=zdf_iwm_alloc )
65      !
66      CALL mpp_sum ( 'zdfiwm', zdf_iwm_alloc )
67      IF( zdf_iwm_alloc /= 0 )   CALL ctl_stop( 'STOP', 'zdf_iwm_alloc: failed to allocate arrays' )
68   END FUNCTION zdf_iwm_alloc
69
70
71   SUBROUTINE zdf_iwm( kt, p_avm, p_avt, p_avs )
72      !!----------------------------------------------------------------------
73      !!                  ***  ROUTINE zdf_iwm  ***
74      !!                   
75      !! ** Purpose :   add to the vertical mixing coefficients the effect of
76      !!              breaking internal waves.
77      !!
78      !! ** Method  : - internal wave-driven vertical mixing is given by:
79      !!                  Kz_wave = min(  100 cm2/s, f(  Reb = zemx_iwm /( Nu * N^2 )  )
80      !!              where zemx_iwm is the 3D space distribution of the wave-breaking
81      !!              energy and Nu the molecular kinematic viscosity.
82      !!              The function f(Reb) is linear (constant mixing efficiency)
83      !!              if the namelist parameter ln_mevar = F and nonlinear if ln_mevar = T.
84      !!
85      !!              - Compute zemx_iwm, the 3D power density that allows to compute
86      !!              Reb and therefrom the wave-induced vertical diffusivity.
87      !!              This is divided into three components:
88      !!                 1. Bottom-intensified low-mode dissipation at critical slopes
89      !!                     zemx_iwm(z) = ( ecri_iwm / rau0 ) * EXP( -(H-z)/hcri_iwm )
90      !!                                   / ( 1. - EXP( - H/hcri_iwm ) ) * hcri_iwm
91      !!              where hcri_iwm is the characteristic length scale of the bottom
92      !!              intensification, ecri_iwm a map of available power, and H the ocean depth.
93      !!                 2. Pycnocline-intensified low-mode dissipation
94      !!                     zemx_iwm(z) = ( epyc_iwm / rau0 ) * ( sqrt(rn2(z))^nn_zpyc )
95      !!                                   / SUM( sqrt(rn2(z))^nn_zpyc * e3w(z) )
96      !!              where epyc_iwm is a map of available power, and nn_zpyc
97      !!              is the chosen stratification-dependence of the internal wave
98      !!              energy dissipation.
99      !!                 3. WKB-height dependent high mode dissipation
100      !!                     zemx_iwm(z) = ( ebot_iwm / rau0 ) * rn2(z) * EXP(-z_wkb(z)/hbot_iwm)
101      !!                                   / SUM( rn2(z) * EXP(-z_wkb(z)/hbot_iwm) * e3w(z) )
102      !!              where hbot_iwm is the characteristic length scale of the WKB bottom
103      !!              intensification, ebot_iwm is a map of available power, and z_wkb is the
104      !!              WKB-stretched height above bottom defined as
105      !!                    z_wkb(z) = H * SUM( sqrt(rn2(z'>=z)) * e3w(z'>=z) )
106      !!                                 / SUM( sqrt(rn2(z'))    * e3w(z')    )
107      !!
108      !!              - update the model vertical eddy viscosity and diffusivity:
109      !!                     avt  = avt  +    av_wave
110      !!                     avm  = avm  +    av_wave
111      !!
112      !!              - if namelist parameter ln_tsdiff = T, account for differential mixing:
113      !!                     avs  = avt  +    av_wave * diffusivity_ratio(Reb)
114      !!
115      !! ** Action  : - avt, avs, avm, increased by tide internal wave-driven mixing   
116      !!
117      !! References :  de Lavergne et al. 2015, JPO; 2016, in prep.
118      !!----------------------------------------------------------------------
119      INTEGER                    , INTENT(in   ) ::   kt             ! ocean time step
120      REAL(wp), DIMENSION(:,:,:) , INTENT(inout) ::   p_avm          ! momentum Kz (w-points)
121      REAL(wp), DIMENSION(:,:,:) , INTENT(inout) ::   p_avt, p_avs   ! tracer   Kz (w-points)
122      !
123      INTEGER  ::   ji, jj, jk   ! dummy loop indices
124      REAL(wp) ::   zztmp, ztmp1, ztmp2        ! scalar workspace
125      REAL(wp), DIMENSION(jpi,jpj)     ::   zfact       ! Used for vertical structure
126      REAL(wp), DIMENSION(jpi,jpj)     ::   zhdep       ! Ocean depth
127      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zwkb        ! WKB-stretched height above bottom
128      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zweight     ! Weight for high mode vertical distribution
129      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   znu_t       ! Molecular kinematic viscosity (T grid)
130      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   znu_w       ! Molecular kinematic viscosity (W grid)
131      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zReb        ! Turbulence intensity parameter
132      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zemx_iwm    ! local energy density available for mixing (W/kg)
133      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zav_ratio   ! S/T diffusivity ratio (only for ln_tsdiff=T)
134      REAL(wp), DIMENSION(jpi,jpj,jpk) ::   zav_wave    ! Internal wave-induced diffusivity
135      REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) ::   z3d  ! 3D workspace used for iom_put
136      REAL(wp), ALLOCATABLE, DIMENSION(:,:)   ::   z2d  ! 2D     -      -    -     -
137      !!----------------------------------------------------------------------
138      !
139      !                       !* Set to zero the 1st and last vertical levels of appropriate variables
140      zemx_iwm (:,:,1) = 0._wp   ;   zemx_iwm (:,:,jpk) = 0._wp
141      zav_ratio(:,:,1) = 0._wp   ;   zav_ratio(:,:,jpk) = 0._wp
142      zav_wave (:,:,1) = 0._wp   ;   zav_wave (:,:,jpk) = 0._wp
143      !
144      !                       ! ----------------------------- !
145      !                       !  Internal wave-driven mixing  !  (compute zav_wave)
146      !                       ! ----------------------------- !
147      !                             
148      !                       !* Critical slope mixing: distribute energy over the time-varying ocean depth,
149      !                                                 using an exponential decay from the seafloor.
150      DO jj = 1, jpj                ! part independent of the level
151         DO ji = 1, jpi
152            zhdep(ji,jj) = gdepw_0(ji,jj,mbkt(ji,jj)+1)       ! depth of the ocean
153            zfact(ji,jj) = rau0 * (  1._wp - EXP( -zhdep(ji,jj) / hcri_iwm(ji,jj) )  )
154            IF( zfact(ji,jj) /= 0._wp )   zfact(ji,jj) = ecri_iwm(ji,jj) / zfact(ji,jj)
155         END DO
156      END DO
157!!gm gde3w ==>>>  check for ssh taken into account.... seem OK gde3w_n=gdept_n - sshn
158      DO jk = 2, jpkm1              ! complete with the level-dependent part
159         DO jj = 1, jpj             
160            DO ji = 1, jpi
161               IF ( zfact(ji,jj) == 0._wp .OR. wmask(ji,jj,jk) == 0._wp ) THEN   ! optimization
162                  zemx_iwm(ji,jj,jk) = 0._wp
163               ELSE
164                  zemx_iwm(ji,jj,jk) = zfact(ji,jj) * (  EXP( ( gde3w_n(ji,jj,jk  ) - zhdep(ji,jj) ) / hcri_iwm(ji,jj) )     &
165                       &                               - EXP( ( gde3w_n(ji,jj,jk-1) - zhdep(ji,jj) ) / hcri_iwm(ji,jj) ) )   &
166                       &                            / ( gde3w_n(ji,jj,jk) - gde3w_n(ji,jj,jk-1) )
167               ENDIF
168            END DO
169         END DO
170!!gm delta(gde3w_n) = e3t_n  !!  Please verify the grid-point position w versus t-point
171!!gm it seems to me that only 1/hcri_iwm  is used ==>  compute it one for all
172
173      END DO
174
175      !                        !* Pycnocline-intensified mixing: distribute energy over the time-varying
176      !                        !* ocean depth as proportional to sqrt(rn2)^nn_zpyc
177      !                                          ! (NB: N2 is masked, so no use of wmask here)
178      SELECT CASE ( nn_zpyc )
179      !
180      CASE ( 1 )               ! Dissipation scales as N (recommended)
181         !
182         zfact(:,:) = 0._wp
183         DO jk = 2, jpkm1              ! part independent of the level
184            zfact(:,:) = zfact(:,:) + e3w_n(:,:,jk) * SQRT(  MAX( 0._wp, rn2(:,:,jk) )  ) * wmask(:,:,jk)
185         END DO
186         !
187         DO jj = 1, jpj
188            DO ji = 1, jpi
189               IF( zfact(ji,jj) /= 0 )   zfact(ji,jj) = epyc_iwm(ji,jj) / ( rau0 * zfact(ji,jj) )
190            END DO
191         END DO
192         !
193         DO jk = 2, jpkm1              ! complete with the level-dependent part
194            zemx_iwm(:,:,jk) = zemx_iwm(:,:,jk) + zfact(:,:) * SQRT(  MAX( 0._wp, rn2(:,:,jk) )  ) * wmask(:,:,jk)
195         END DO
196         !
197      CASE ( 2 )               ! Dissipation scales as N^2
198         !
199         zfact(:,:) = 0._wp
200         DO jk = 2, jpkm1              ! part independent of the level
201            zfact(:,:) = zfact(:,:) + e3w_n(:,:,jk) * MAX( 0._wp, rn2(:,:,jk) ) * wmask(:,:,jk)
202         END DO
203         !
204         DO jj= 1, jpj
205            DO ji = 1, jpi
206               IF( zfact(ji,jj) /= 0 )   zfact(ji,jj) = epyc_iwm(ji,jj) / ( rau0 * zfact(ji,jj) )
207            END DO
208         END DO
209         !
210         DO jk = 2, jpkm1              ! complete with the level-dependent part
211            zemx_iwm(:,:,jk) = zemx_iwm(:,:,jk) + zfact(:,:) * MAX( 0._wp, rn2(:,:,jk) ) * wmask(:,:,jk)
212         END DO
213         !
214      END SELECT
215
216      !                        !* WKB-height dependent mixing: distribute energy over the time-varying
217      !                        !* ocean depth as proportional to rn2 * exp(-z_wkb/rn_hbot)
218      !
219      zwkb (:,:,:) = 0._wp
220      zfact(:,:)   = 0._wp
221      DO jk = 2, jpkm1
222         zfact(:,:) = zfact(:,:) + e3w_n(:,:,jk) * SQRT(  MAX( 0._wp, rn2(:,:,jk) )  ) * wmask(:,:,jk)
223         zwkb(:,:,jk) = zfact(:,:)
224      END DO
225!!gm even better:
226!      DO jk = 2, jpkm1
227!         zwkb(:,:) = zwkb(:,:) + e3w_n(:,:,jk) * SQRT(  MAX( 0._wp, rn2(:,:,jk) )  )
228!      END DO
229!      zfact(:,:) = zwkb(:,:,jpkm1)
230!!gm or just use zwkb(k=jpk-1) instead of zfact...
231!!gm
232      !
233      DO jk = 2, jpkm1
234         DO jj = 1, jpj
235            DO ji = 1, jpi
236               IF( zfact(ji,jj) /= 0 )   zwkb(ji,jj,jk) = zhdep(ji,jj) * ( zfact(ji,jj) - zwkb(ji,jj,jk) )   &
237                  &                                     * wmask(ji,jj,jk) / zfact(ji,jj)
238            END DO
239         END DO
240      END DO
241      zwkb(:,:,1) = zhdep(:,:) * wmask(:,:,1)
242      !
243      DO jk = 2, jpkm1
244         DO jj = 1, jpj
245            DO ji = 1, jpi
246               IF ( rn2(ji,jj,jk) <= 0._wp .OR. wmask(ji,jj,jk) == 0._wp ) THEN   ! optimization
247                  zweight(ji,jj,jk) = 0._wp
248               ELSE
249                  zweight(ji,jj,jk) = rn2(ji,jj,jk) * hbot_iwm(ji,jj)    &
250                     &   * (  EXP( -zwkb(ji,jj,jk) / hbot_iwm(ji,jj) ) - EXP( -zwkb(ji,jj,jk-1) / hbot_iwm(ji,jj) )  )
251               ENDIF
252            END DO
253         END DO
254      END DO
255      !
256      zfact(:,:) = 0._wp
257      DO jk = 2, jpkm1              ! part independent of the level
258         zfact(:,:) = zfact(:,:) + zweight(:,:,jk)
259      END DO
260      !
261      DO jj = 1, jpj
262         DO ji = 1, jpi
263            IF( zfact(ji,jj) /= 0 )   zfact(ji,jj) = ebot_iwm(ji,jj) / ( rau0 * zfact(ji,jj) )
264         END DO
265      END DO
266      !
267      DO jk = 2, jpkm1              ! complete with the level-dependent part
268         zemx_iwm(:,:,jk) = zemx_iwm(:,:,jk) + zweight(:,:,jk) * zfact(:,:) * wmask(:,:,jk)   &
269            &                                / ( gde3w_n(:,:,jk) - gde3w_n(:,:,jk-1) )
270!!gm  use of e3t_n just above?
271      END DO
272      !
273!!gm  this is to be replaced by just a constant value znu=1.e-6 m2/s
274      ! Calculate molecular kinematic viscosity
275      znu_t(:,:,:) = 1.e-4_wp * (  17.91_wp - 0.53810_wp * tsn(:,:,:,jp_tem) + 0.00694_wp * tsn(:,:,:,jp_tem) * tsn(:,:,:,jp_tem)  &
276         &                                  + 0.02305_wp * tsn(:,:,:,jp_sal)  ) * tmask(:,:,:) * r1_rau0
277      DO jk = 2, jpkm1
278         znu_w(:,:,jk) = 0.5_wp * ( znu_t(:,:,jk-1) + znu_t(:,:,jk) ) * wmask(:,:,jk)
279      END DO
280!!gm end
281      !
282      ! Calculate turbulence intensity parameter Reb
283      DO jk = 2, jpkm1
284         zReb(:,:,jk) = zemx_iwm(:,:,jk) / MAX( 1.e-20_wp, znu_w(:,:,jk) * rn2(:,:,jk) )
285      END DO
286      !
287      ! Define internal wave-induced diffusivity
288      DO jk = 2, jpkm1
289         zav_wave(:,:,jk) = znu_w(:,:,jk) * zReb(:,:,jk) * r1_6   ! This corresponds to a constant mixing efficiency of 1/6
290      END DO
291      !
292      IF( ln_mevar ) THEN              ! Variable mixing efficiency case : modify zav_wave in the
293         DO jk = 2, jpkm1              ! energetic (Reb > 480) and buoyancy-controlled (Reb <10.224 ) regimes
294            DO jj = 1, jpj
295               DO ji = 1, jpi
296                  IF( zReb(ji,jj,jk) > 480.00_wp ) THEN
297                     zav_wave(ji,jj,jk) = 3.6515_wp * znu_w(ji,jj,jk) * SQRT( zReb(ji,jj,jk) )
298                  ELSEIF( zReb(ji,jj,jk) < 10.224_wp ) THEN
299                     zav_wave(ji,jj,jk) = 0.052125_wp * znu_w(ji,jj,jk) * zReb(ji,jj,jk) * SQRT( zReb(ji,jj,jk) )
300                  ENDIF
301               END DO
302            END DO
303         END DO
304      ENDIF
305      !
306      DO jk = 2, jpkm1                 ! Bound diffusivity by molecular value and 100 cm2/s
307         zav_wave(:,:,jk) = MIN(  MAX( 1.4e-7_wp, zav_wave(:,:,jk) ), 1.e-2_wp  ) * wmask(:,:,jk)
308      END DO
309      !
310      IF( kt == nit000 ) THEN        !* Control print at first time-step: diagnose the energy consumed by zav_wave
311         zztmp = 0._wp
312!!gm used of glosum 3D....
313         DO jk = 2, jpkm1
314            DO jj = 1, jpj
315               DO ji = 1, jpi
316                  zztmp = zztmp + e3w_n(ji,jj,jk) * e1e2t(ji,jj)   &
317                     &          * MAX( 0._wp, rn2(ji,jj,jk) ) * zav_wave(ji,jj,jk) * wmask(ji,jj,jk) * tmask_i(ji,jj)
318               END DO
319            END DO
320         END DO
321         CALL mpp_sum( 'zdfiwm', zztmp )
322         zztmp = rau0 * zztmp ! Global integral of rauo * Kz * N^2 = power contributing to mixing
323         !
324         IF(lwp) THEN
325            WRITE(numout,*)
326            WRITE(numout,*) 'zdf_iwm : Internal wave-driven mixing (iwm)'
327            WRITE(numout,*) '~~~~~~~ '
328            WRITE(numout,*)
329            WRITE(numout,*) '      Total power consumption by av_wave =  ', zztmp * 1.e-12_wp, 'TW'
330         ENDIF
331      ENDIF
332
333      !                          ! ----------------------- !
334      !                          !   Update  mixing coefs  !                         
335      !                          ! ----------------------- !
336      !     
337      IF( ln_tsdiff ) THEN          !* Option for differential mixing of salinity and temperature
338         ztmp1 = 0.505_wp + 0.495_wp * TANH( 0.92_wp * ( LOG10( 1.e-20_wp ) - 0.60_wp ) )
339         DO jk = 2, jpkm1              ! Calculate S/T diffusivity ratio as a function of Reb
340            DO jj = 1, jpj
341               DO ji = 1, jpi
342                  ztmp2 = zReb(ji,jj,jk) * 5._wp * r1_6
343                  IF ( ztmp2 > 1.e-20_wp .AND. wmask(ji,jj,jk) == 1._wp ) THEN
344                     zav_ratio(ji,jj,jk) = 0.505_wp + 0.495_wp * TANH( 0.92_wp * ( LOG10(ztmp2) - 0.60_wp ) )
345                  ELSE
346                     zav_ratio(ji,jj,jk) = ztmp1 * wmask(ji,jj,jk)
347                  ENDIF
348               END DO
349            END DO
350         END DO
351         CALL iom_put( "av_ratio", zav_ratio )
352         DO jk = 2, jpkm1           !* update momentum & tracer diffusivity with wave-driven mixing
353            p_avs(:,:,jk) = p_avs(:,:,jk) + zav_wave(:,:,jk) * zav_ratio(:,:,jk)
354            p_avt(:,:,jk) = p_avt(:,:,jk) + zav_wave(:,:,jk)
355            p_avm(:,:,jk) = p_avm(:,:,jk) + zav_wave(:,:,jk)
356         END DO
357         !
358      ELSE                          !* update momentum & tracer diffusivity with wave-driven mixing
359         DO jk = 2, jpkm1
360            p_avs(:,:,jk) = p_avs(:,:,jk) + zav_wave(:,:,jk)
361            p_avt(:,:,jk) = p_avt(:,:,jk) + zav_wave(:,:,jk)
362            p_avm(:,:,jk) = p_avm(:,:,jk) + zav_wave(:,:,jk)
363         END DO
364      ENDIF
365
366      !                             !* output internal wave-driven mixing coefficient
367      CALL iom_put( "av_wave", zav_wave )
368                                    !* output useful diagnostics: Kz*N^2 ,
369!!gm Kz*N2 should take into account the ratio avs/avt if it is used.... (see diaar5)
370                                    !  vertical integral of rau0 * Kz * N^2 , energy density (zemx_iwm)
371      IF( iom_use("bflx_iwm") .OR. iom_use("pcmap_iwm") ) THEN
372         ALLOCATE( z2d(jpi,jpj) , z3d(jpi,jpj,jpk) )
373         z3d(:,:,:) = MAX( 0._wp, rn2(:,:,:) ) * zav_wave(:,:,:)
374         z2d(:,:) = 0._wp
375         DO jk = 2, jpkm1
376            z2d(:,:) = z2d(:,:) + e3w_n(:,:,jk) * z3d(:,:,jk) * wmask(:,:,jk)
377         END DO
378         z2d(:,:) = rau0 * z2d(:,:)
379         CALL iom_put( "bflx_iwm", z3d )
380         CALL iom_put( "pcmap_iwm", z2d )
381         DEALLOCATE( z2d , z3d )
382      ENDIF
383      CALL iom_put( "emix_iwm", zemx_iwm )
384     
385      IF(ln_ctl)   CALL prt_ctl(tab3d_1=zav_wave , clinfo1=' iwm - av_wave: ', tab3d_2=avt, clinfo2=' avt: ', kdim=jpk)
386      !
387   END SUBROUTINE zdf_iwm
388
389
390   SUBROUTINE zdf_iwm_init
391      !!----------------------------------------------------------------------
392      !!                  ***  ROUTINE zdf_iwm_init  ***
393      !!                     
394      !! ** Purpose :   Initialization of the wave-driven vertical mixing, reading
395      !!              of input power maps and decay length scales in netcdf files.
396      !!
397      !! ** Method  : - Read the namzdf_iwm namelist and check the parameters
398      !!
399      !!              - Read the input data in NetCDF files :
400      !!              power available from high-mode wave breaking (mixing_power_bot.nc)
401      !!              power available from pycnocline-intensified wave-breaking (mixing_power_pyc.nc)
402      !!              power available from critical slope wave-breaking (mixing_power_cri.nc)
403      !!              WKB decay scale for high-mode wave-breaking (decay_scale_bot.nc)
404      !!              decay scale for critical slope wave-breaking (decay_scale_cri.nc)
405      !!
406      !! ** input   : - Namlist namzdf_iwm
407      !!              - NetCDF files : mixing_power_bot.nc, mixing_power_pyc.nc, mixing_power_cri.nc,
408      !!              decay_scale_bot.nc decay_scale_cri.nc
409      !!
410      !! ** Action  : - Increase by 1 the nstop flag is setting problem encounter
411      !!              - Define ebot_iwm, epyc_iwm, ecri_iwm, hbot_iwm, hcri_iwm
412      !!
413      !! References : de Lavergne et al. JPO, 2015 ; de Lavergne PhD 2016
414      !!              de Lavergne et al. in prep., 2017
415      !!----------------------------------------------------------------------
416      INTEGER  ::   ji, jj, jk   ! dummy loop indices
417      INTEGER  ::   inum         ! local integer
418      INTEGER  ::   ios
419      REAL(wp) ::   zbot, zpyc, zcri   ! local scalars
420      !!
421      NAMELIST/namzdf_iwm/ nn_zpyc, ln_mevar, ln_tsdiff
422      !!----------------------------------------------------------------------
423      !
424      READ  ( numnam_ref, namzdf_iwm, IOSTAT = ios, ERR = 901)
425901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namzdf_iwm in reference namelist' )
426      !
427      READ  ( numnam_cfg, namzdf_iwm, IOSTAT = ios, ERR = 902 )
428902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namzdf_iwm in configuration namelist' )
429      IF(lwm) WRITE ( numond, namzdf_iwm )
430      !
431      IF(lwp) THEN                  ! Control print
432         WRITE(numout,*)
433         WRITE(numout,*) 'zdf_iwm_init : internal wave-driven mixing'
434         WRITE(numout,*) '~~~~~~~~~~~~'
435         WRITE(numout,*) '   Namelist namzdf_iwm : set wave-driven mixing parameters'
436         WRITE(numout,*) '      Pycnocline-intensified diss. scales as N (=1) or N^2 (=2) = ', nn_zpyc
437         WRITE(numout,*) '      Variable (T) or constant (F) mixing efficiency            = ', ln_mevar
438         WRITE(numout,*) '      Differential internal wave-driven mixing (T) or not (F)   = ', ln_tsdiff
439      ENDIF
440     
441      ! The new wave-driven mixing parameterization elevates avt and avm in the interior, and
442      ! ensures that avt remains larger than its molecular value (=1.4e-7). Therefore, avtb should
443      ! be set here to a very small value, and avmb to its (uniform) molecular value (=1.4e-6).
444      avmb(:) = 1.4e-6_wp        ! viscous molecular value
445      avtb(:) = 1.e-10_wp        ! very small diffusive minimum (background avt is specified in zdf_iwm)   
446      avtb_2d(:,:) = 1.e0_wp     ! uniform
447      IF(lwp) THEN                  ! Control print
448         WRITE(numout,*)
449         WRITE(numout,*) '   Force the background value applied to avm & avt in TKE to be everywhere ',   &
450            &               'the viscous molecular value & a very small diffusive value, resp.'
451      ENDIF
452           
453      !                             ! allocate iwm arrays
454      IF( zdf_iwm_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'zdf_iwm_init : unable to allocate iwm arrays' )
455      !
456      !                             ! read necessary fields
457      CALL iom_open('mixing_power_bot',inum)       ! energy flux for high-mode wave breaking [W/m2]
458      CALL iom_get  (inum, jpdom_data, 'field', ebot_iwm, 1 ) 
459      CALL iom_close(inum)
460      !
461      CALL iom_open('mixing_power_pyc',inum)       ! energy flux for pynocline-intensified wave breaking [W/m2]
462      CALL iom_get  (inum, jpdom_data, 'field', epyc_iwm, 1 )
463      CALL iom_close(inum)
464      !
465      CALL iom_open('mixing_power_cri',inum)       ! energy flux for critical slope wave breaking [W/m2]
466      CALL iom_get  (inum, jpdom_data, 'field', ecri_iwm, 1 )
467      CALL iom_close(inum)
468      !
469      CALL iom_open('decay_scale_bot',inum)        ! spatially variable decay scale for high-mode wave breaking [m]
470      CALL iom_get  (inum, jpdom_data, 'field', hbot_iwm, 1 )
471      CALL iom_close(inum)
472      !
473      CALL iom_open('decay_scale_cri',inum)        ! spatially variable decay scale for critical slope wave breaking [m]
474      CALL iom_get  (inum, jpdom_data, 'field', hcri_iwm, 1 )
475      CALL iom_close(inum)
476
477      ebot_iwm(:,:) = ebot_iwm(:,:) * ssmask(:,:)
478      epyc_iwm(:,:) = epyc_iwm(:,:) * ssmask(:,:)
479      ecri_iwm(:,:) = ecri_iwm(:,:) * ssmask(:,:)
480
481      zbot = glob_sum( 'zdfiwm', e1e2t(:,:) * ebot_iwm(:,:) )
482      zpyc = glob_sum( 'zdfiwm', e1e2t(:,:) * epyc_iwm(:,:) )
483      zcri = glob_sum( 'zdfiwm', e1e2t(:,:) * ecri_iwm(:,:) )
484      IF(lwp) THEN
485         WRITE(numout,*) '      High-mode wave-breaking energy:             ', zbot * 1.e-12_wp, 'TW'
486         WRITE(numout,*) '      Pycnocline-intensifed wave-breaking energy: ', zpyc * 1.e-12_wp, 'TW'
487         WRITE(numout,*) '      Critical slope wave-breaking energy:        ', zcri * 1.e-12_wp, 'TW'
488      ENDIF
489      !
490   END SUBROUTINE zdf_iwm_init
491
492   !!======================================================================
493END MODULE zdfiwm
Note: See TracBrowser for help on using the repository browser.