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/tests/BENCH/MY_SRC – NEMO

source: NEMO/branches/2019/dev_r11613_ENHANCE-04_namelists_as_internalfiles/tests/BENCH/MY_SRC/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.

File size: 25.1 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: zdfiwm.F90 8093 2017-05-30 08:13:14Z gm $
55   !! Software governed by the CeCILL licence     (./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        ! 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         zemx_iwm(:,:,jk) = zfact(:,:) * (  EXP( ( gde3w_n(:,:,jk  ) - zhdep(:,:) ) / hcri_iwm(:,:) )                      &
160            &                             - EXP( ( gde3w_n(:,:,jk-1) - zhdep(:,:) ) / hcri_iwm(:,:) )  ) * wmask(:,:,jk)   &
161            &                          / ( gde3w_n(:,:,jk) - gde3w_n(:,:,jk-1) )
162
163!!gm delta(gde3w_n) = e3t_n  !!  Please verify the grid-point position w versus t-point
164!!gm it seems to me that only 1/hcri_iwm  is used ==>  compute it one for all
165
166      END DO
167
168      !                        !* Pycnocline-intensified mixing: distribute energy over the time-varying
169      !                        !* ocean depth as proportional to sqrt(rn2)^nn_zpyc
170      !                                          ! (NB: N2 is masked, so no use of wmask here)
171      SELECT CASE ( nn_zpyc )
172      !
173      CASE ( 1 )               ! Dissipation scales as N (recommended)
174         !
175         zfact(:,:) = 0._wp
176         DO jk = 2, jpkm1              ! part independent of the level
177            zfact(:,:) = zfact(:,:) + e3w_n(:,:,jk) * SQRT(  MAX( 0._wp, rn2(:,:,jk) )  ) * wmask(:,:,jk)
178         END DO
179         !
180         DO jj = 1, jpj
181            DO ji = 1, jpi
182               IF( zfact(ji,jj) /= 0 )   zfact(ji,jj) = epyc_iwm(ji,jj) / ( rau0 * zfact(ji,jj) )
183            END DO
184         END DO
185         !
186         DO jk = 2, jpkm1              ! complete with the level-dependent part
187            zemx_iwm(:,:,jk) = zemx_iwm(:,:,jk) + zfact(:,:) * SQRT(  MAX( 0._wp, rn2(:,:,jk) )  ) * wmask(:,:,jk)
188         END DO
189         !
190      CASE ( 2 )               ! Dissipation scales as N^2
191         !
192         zfact(:,:) = 0._wp
193         DO jk = 2, jpkm1              ! part independent of the level
194            zfact(:,:) = zfact(:,:) + e3w_n(:,:,jk) * MAX( 0._wp, rn2(:,:,jk) ) * wmask(:,:,jk)
195         END DO
196         !
197         DO jj= 1, jpj
198            DO ji = 1, jpi
199               IF( zfact(ji,jj) /= 0 )   zfact(ji,jj) = epyc_iwm(ji,jj) / ( rau0 * zfact(ji,jj) )
200            END DO
201         END DO
202         !
203         DO jk = 2, jpkm1              ! complete with the level-dependent part
204            zemx_iwm(:,:,jk) = zemx_iwm(:,:,jk) + zfact(:,:) * MAX( 0._wp, rn2(:,:,jk) ) * wmask(:,:,jk)
205         END DO
206         !
207      END SELECT
208
209      !                        !* WKB-height dependent mixing: distribute energy over the time-varying
210      !                        !* ocean depth as proportional to rn2 * exp(-z_wkb/rn_hbot)
211      !
212      zwkb (:,:,:) = 0._wp
213      zfact(:,:)   = 0._wp
214      DO jk = 2, jpkm1
215         zfact(:,:) = zfact(:,:) + e3w_n(:,:,jk) * SQRT(  MAX( 0._wp, rn2(:,:,jk) )  ) * wmask(:,:,jk)
216         zwkb(:,:,jk) = zfact(:,:)
217      END DO
218!!gm even better:
219!      DO jk = 2, jpkm1
220!         zwkb(:,:) = zwkb(:,:) + e3w_n(:,:,jk) * SQRT(  MAX( 0._wp, rn2(:,:,jk) )  )
221!      END DO
222!      zfact(:,:) = zwkb(:,:,jpkm1)
223!!gm or just use zwkb(k=jpk-1) instead of zfact...
224!!gm
225      !
226      DO jk = 2, jpkm1
227         DO jj = 1, jpj
228            DO ji = 1, jpi
229               IF( zfact(ji,jj) /= 0 )   zwkb(ji,jj,jk) = zhdep(ji,jj) * ( zfact(ji,jj) - zwkb(ji,jj,jk) )   &
230                  &                                     * wmask(ji,jj,jk) / zfact(ji,jj)
231            END DO
232         END DO
233      END DO
234      zwkb(:,:,1) = zhdep(:,:) * wmask(:,:,1)
235      !
236      zweight(:,:,:) = 0._wp
237      DO jk = 2, jpkm1
238         zweight(:,:,jk) = MAX( 0._wp, rn2(:,:,jk) ) * hbot_iwm(:,:) * wmask(:,:,jk)                    &
239            &   * (  EXP( -zwkb(:,:,jk) / hbot_iwm(:,:) ) - EXP( -zwkb(:,:,jk-1) / hbot_iwm(:,:) )  )
240      END DO
241      !
242      zfact(:,:) = 0._wp
243      DO jk = 2, jpkm1              ! part independent of the level
244         zfact(:,:) = zfact(:,:) + zweight(:,:,jk)
245      END DO
246      !
247      DO jj = 1, jpj
248         DO ji = 1, jpi
249            IF( zfact(ji,jj) /= 0 )   zfact(ji,jj) = ebot_iwm(ji,jj) / ( rau0 * zfact(ji,jj) )
250         END DO
251      END DO
252      !
253      DO jk = 2, jpkm1              ! complete with the level-dependent part
254         zemx_iwm(:,:,jk) = zemx_iwm(:,:,jk) + zweight(:,:,jk) * zfact(:,:) * wmask(:,:,jk)   &
255            &                                / ( gde3w_n(:,:,jk) - gde3w_n(:,:,jk-1) )
256!!gm  use of e3t_n just above?
257      END DO
258      !
259!!gm  this is to be replaced by just a constant value znu=1.e-6 m2/s
260      ! Calculate molecular kinematic viscosity
261      znu_t(:,:,:) = 1.e-4_wp * (  17.91_wp - 0.53810_wp * tsn(:,:,:,jp_tem) + 0.00694_wp * tsn(:,:,:,jp_tem) * tsn(:,:,:,jp_tem)  &
262         &                                  + 0.02305_wp * tsn(:,:,:,jp_sal)  ) * tmask(:,:,:) * r1_rau0
263      DO jk = 2, jpkm1
264         znu_w(:,:,jk) = 0.5_wp * ( znu_t(:,:,jk-1) + znu_t(:,:,jk) ) * wmask(:,:,jk)
265      END DO
266!!gm end
267      !
268      ! Calculate turbulence intensity parameter Reb
269      DO jk = 2, jpkm1
270         zReb(:,:,jk) = zemx_iwm(:,:,jk) / MAX( 1.e-20_wp, znu_w(:,:,jk) * rn2(:,:,jk) )
271      END DO
272      !
273      ! Define internal wave-induced diffusivity
274      DO jk = 2, jpkm1
275         zav_wave(:,:,jk) = znu_w(:,:,jk) * zReb(:,:,jk) * r1_6   ! This corresponds to a constant mixing efficiency of 1/6
276      END DO
277      !
278      IF( ln_mevar ) THEN              ! Variable mixing efficiency case : modify zav_wave in the
279         DO jk = 2, jpkm1              ! energetic (Reb > 480) and buoyancy-controlled (Reb <10.224 ) regimes
280            DO jj = 1, jpj
281               DO ji = 1, jpi
282                  IF( zReb(ji,jj,jk) > 480.00_wp ) THEN
283                     zav_wave(ji,jj,jk) = 3.6515_wp * znu_w(ji,jj,jk) * SQRT( zReb(ji,jj,jk) )
284                  ELSEIF( zReb(ji,jj,jk) < 10.224_wp ) THEN
285                     zav_wave(ji,jj,jk) = 0.052125_wp * znu_w(ji,jj,jk) * zReb(ji,jj,jk) * SQRT( zReb(ji,jj,jk) )
286                  ENDIF
287               END DO
288            END DO
289         END DO
290      ENDIF
291      !
292      DO jk = 2, jpkm1                 ! Bound diffusivity by molecular value and 100 cm2/s
293         zav_wave(:,:,jk) = MIN(  MAX( 1.4e-7_wp, zav_wave(:,:,jk) ), 1.e-2_wp  ) * wmask(:,:,jk)
294      END DO
295      !
296      IF( kt == nit000 ) THEN        !* Control print at first time-step: diagnose the energy consumed by zav_wave
297         zztmp = 0._wp
298!!gm used of glosum 3D....
299         DO jk = 2, jpkm1
300            DO jj = 1, jpj
301               DO ji = 1, jpi
302                  zztmp = zztmp + e3w_n(ji,jj,jk) * e1e2t(ji,jj)   &
303                     &          * MAX( 0._wp, rn2(ji,jj,jk) ) * zav_wave(ji,jj,jk) * wmask(ji,jj,jk) * tmask_i(ji,jj)
304               END DO
305            END DO
306         END DO
307         CALL mpp_sum( 'zdfiwm', zztmp )
308         zztmp = rau0 * zztmp ! Global integral of rauo * Kz * N^2 = power contributing to mixing
309         !
310         IF(lwp) THEN
311            WRITE(numout,*)
312            WRITE(numout,*) 'zdf_iwm : Internal wave-driven mixing (iwm)'
313            WRITE(numout,*) '~~~~~~~ '
314            WRITE(numout,*)
315            WRITE(numout,*) '      Total power consumption by av_wave =  ', zztmp * 1.e-12_wp, 'TW'
316         ENDIF
317      ENDIF
318
319      !                          ! ----------------------- !
320      !                          !   Update  mixing coefs  !                         
321      !                          ! ----------------------- !
322      !     
323      IF( ln_tsdiff ) THEN          !* Option for differential mixing of salinity and temperature
324         DO jk = 2, jpkm1              ! Calculate S/T diffusivity ratio as a function of Reb
325            DO jj = 1, jpj
326               DO ji = 1, jpi
327                  zav_ratio(ji,jj,jk) = ( 0.505_wp + 0.495_wp *                                                                  &
328                      &   TANH(    0.92_wp * (   LOG10(  MAX( 1.e-20_wp, zReb(ji,jj,jk) * 5._wp * r1_6 )  ) - 0.60_wp   )    )   &
329                      &                 ) * wmask(ji,jj,jk)
330               END DO
331            END DO
332         END DO
333         CALL iom_put( "av_ratio", zav_ratio )
334         DO jk = 2, jpkm1           !* update momentum & tracer diffusivity with wave-driven mixing
335            p_avs(:,:,jk) = p_avs(:,:,jk) + zav_wave(:,:,jk) * zav_ratio(:,:,jk)
336            p_avt(:,:,jk) = p_avt(:,:,jk) + zav_wave(:,:,jk)
337            p_avm(:,:,jk) = p_avm(:,:,jk) + zav_wave(:,:,jk)
338         END DO
339         !
340      ELSE                          !* update momentum & tracer diffusivity with wave-driven mixing
341         DO jk = 2, jpkm1
342            p_avs(:,:,jk) = p_avs(:,:,jk) + zav_wave(:,:,jk)
343            p_avt(:,:,jk) = p_avt(:,:,jk) + zav_wave(:,:,jk)
344            p_avm(:,:,jk) = p_avm(:,:,jk) + zav_wave(:,:,jk)
345         END DO
346      ENDIF
347
348      !                             !* output internal wave-driven mixing coefficient
349      CALL iom_put( "av_wave", zav_wave )
350                                    !* output useful diagnostics: Kz*N^2 ,
351!!gm Kz*N2 should take into account the ratio avs/avt if it is used.... (see diaar5)
352                                    !  vertical integral of rau0 * Kz * N^2 , energy density (zemx_iwm)
353      IF( iom_use("bflx_iwm") .OR. iom_use("pcmap_iwm") ) THEN
354         ALLOCATE( z2d(jpi,jpj) , z3d(jpi,jpj,jpk) )
355         z3d(:,:,:) = MAX( 0._wp, rn2(:,:,:) ) * zav_wave(:,:,:)
356         z2d(:,:) = 0._wp
357         DO jk = 2, jpkm1
358            z2d(:,:) = z2d(:,:) + e3w_n(:,:,jk) * z3d(:,:,jk) * wmask(:,:,jk)
359         END DO
360         z2d(:,:) = rau0 * z2d(:,:)
361         CALL iom_put( "bflx_iwm", z3d )
362         CALL iom_put( "pcmap_iwm", z2d )
363         DEALLOCATE( z2d , z3d )
364      ENDIF
365      CALL iom_put( "emix_iwm", zemx_iwm )
366     
367      IF(ln_ctl)   CALL prt_ctl(tab3d_1=zav_wave , clinfo1=' iwm - av_wave: ', tab3d_2=avt, clinfo2=' avt: ', kdim=jpk)
368      !
369   END SUBROUTINE zdf_iwm
370
371
372   SUBROUTINE zdf_iwm_init
373      !!----------------------------------------------------------------------
374      !!                  ***  ROUTINE zdf_iwm_init  ***
375      !!                     
376      !! ** Purpose :   Initialization of the wave-driven vertical mixing, reading
377      !!              of input power maps and decay length scales in netcdf files.
378      !!
379      !! ** Method  : - Read the namzdf_iwm namelist and check the parameters
380      !!
381      !!              - Read the input data in NetCDF files :
382      !!              power available from high-mode wave breaking (mixing_power_bot.nc)
383      !!              power available from pycnocline-intensified wave-breaking (mixing_power_pyc.nc)
384      !!              power available from critical slope wave-breaking (mixing_power_cri.nc)
385      !!              WKB decay scale for high-mode wave-breaking (decay_scale_bot.nc)
386      !!              decay scale for critical slope wave-breaking (decay_scale_cri.nc)
387      !!
388      !! ** input   : - Namlist namzdf_iwm
389      !!              - NetCDF files : mixing_power_bot.nc, mixing_power_pyc.nc, mixing_power_cri.nc,
390      !!              decay_scale_bot.nc decay_scale_cri.nc
391      !!
392      !! ** Action  : - Increase by 1 the nstop flag is setting problem encounter
393      !!              - Define ebot_iwm, epyc_iwm, ecri_iwm, hbot_iwm, hcri_iwm
394      !!
395      !! References : de Lavergne et al. JPO, 2015 ; de Lavergne PhD 2016
396      !!              de Lavergne et al. in prep., 2017
397      !!----------------------------------------------------------------------
398      INTEGER  ::   ji, jj, jk   ! dummy loop indices
399      INTEGER  ::   inum         ! local integer
400      INTEGER  ::   ios
401      REAL(wp) ::   zbot, zpyc, zcri   ! local scalars
402      !!
403      NAMELIST/namzdf_iwm/ nn_zpyc, ln_mevar, ln_tsdiff
404      !!----------------------------------------------------------------------
405      !
406      READ  ( numnam_ref, namzdf_iwm, IOSTAT = ios, ERR = 901)
407901   IF( ios /= 0 )   CALL ctl_nam ( ios , 'namzdf_iwm in reference namelist' )
408      !
409      READ  ( numnam_cfg, namzdf_iwm, IOSTAT = ios, ERR = 902 )
410902   IF( ios >  0 )   CALL ctl_nam ( ios , 'namzdf_iwm in configuration namelist' )
411      IF(lwm) WRITE ( numond, namzdf_iwm )
412      !
413      IF(lwp) THEN                  ! Control print
414         WRITE(numout,*)
415         WRITE(numout,*) 'zdf_iwm_init : internal wave-driven mixing'
416         WRITE(numout,*) '~~~~~~~~~~~~'
417         WRITE(numout,*) '   Namelist namzdf_iwm : set wave-driven mixing parameters'
418         WRITE(numout,*) '      Pycnocline-intensified diss. scales as N (=1) or N^2 (=2) = ', nn_zpyc
419         WRITE(numout,*) '      Variable (T) or constant (F) mixing efficiency            = ', ln_mevar
420         WRITE(numout,*) '      Differential internal wave-driven mixing (T) or not (F)   = ', ln_tsdiff
421      ENDIF
422     
423      ! The new wave-driven mixing parameterization elevates avt and avm in the interior, and
424      ! ensures that avt remains larger than its molecular value (=1.4e-7). Therefore, avtb should
425      ! be set here to a very small value, and avmb to its (uniform) molecular value (=1.4e-6).
426      avmb(:) = 1.4e-6_wp        ! viscous molecular value
427      avtb(:) = 1.e-10_wp        ! very small diffusive minimum (background avt is specified in zdf_iwm)   
428      avtb_2d(:,:) = 1.e0_wp     ! uniform
429      IF(lwp) THEN                  ! Control print
430         WRITE(numout,*)
431         WRITE(numout,*) '   Force the background value applied to avm & avt in TKE to be everywhere ',   &
432            &               'the viscous molecular value & a very small diffusive value, resp.'
433      ENDIF
434           
435      !                             ! allocate iwm arrays
436      IF( zdf_iwm_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'zdf_iwm_init : unable to allocate iwm arrays' )
437      !
438      !                             ! read necessary fields
439!!$      CALL iom_open('mixing_power_bot',inum)       ! energy flux for high-mode wave breaking [W/m2]
440!!$      CALL iom_get  (inum, jpdom_data, 'field', ebot_iwm, 1 )
441!!$      CALL iom_close(inum)
442      ebot_iwm(:,:) = 1.e-6
443      !
444!!$      CALL iom_open('mixing_power_pyc',inum)       ! energy flux for pynocline-intensified wave breaking [W/m2]
445!!$      CALL iom_get  (inum, jpdom_data, 'field', epyc_iwm, 1 )
446!!$      CALL iom_close(inum)
447      epyc_iwm(:,:) = 1.e-6
448      !
449!!$      CALL iom_open('mixing_power_cri',inum)       ! energy flux for critical slope wave breaking [W/m2]
450!!$      CALL iom_get  (inum, jpdom_data, 'field', ecri_iwm, 1 )
451!!$      CALL iom_close(inum)
452      ecri_iwm(:,:) = 1.e-10
453      !
454!!$      CALL iom_open('decay_scale_bot',inum)        ! spatially variable decay scale for high-mode wave breaking [m]
455!!$      CALL iom_get  (inum, jpdom_data, 'field', hbot_iwm, 1 )
456!!$      CALL iom_close(inum)
457      hbot_iwm(:,:) = 100.
458      !
459!!$      CALL iom_open('decay_scale_cri',inum)        ! spatially variable decay scale for critical slope wave breaking [m]
460!!$      CALL iom_get  (inum, jpdom_data, 'field', hcri_iwm, 1 )
461!!$      CALL iom_close(inum)
462      hcri_iwm(:,:) = 100.
463
464      ebot_iwm(:,:) = ebot_iwm(:,:) * ssmask(:,:)
465      epyc_iwm(:,:) = epyc_iwm(:,:) * ssmask(:,:)
466      ecri_iwm(:,:) = ecri_iwm(:,:) * ssmask(:,:)
467
468      zbot = glob_sum( 'zdfiwm', e1e2t(:,:) * ebot_iwm(:,:) )
469      zpyc = glob_sum( 'zdfiwm', e1e2t(:,:) * epyc_iwm(:,:) )
470      zcri = glob_sum( 'zdfiwm', e1e2t(:,:) * ecri_iwm(:,:) )
471      IF(lwp) THEN
472         WRITE(numout,*) '      High-mode wave-breaking energy:             ', zbot * 1.e-12_wp, 'TW'
473         WRITE(numout,*) '      Pycnocline-intensifed wave-breaking energy: ', zpyc * 1.e-12_wp, 'TW'
474         WRITE(numout,*) '      Critical slope wave-breaking energy:        ', zcri * 1.e-12_wp, 'TW'
475      ENDIF
476      !
477   END SUBROUTINE zdf_iwm_init
478
479   !!======================================================================
480END MODULE zdfiwm
Note: See TracBrowser for help on using the repository browser.