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.
zdftmx.F90 in branches/2015/dev_r5803_NOC_WAD/NEMOGCM/NEMO/OPA_SRC/ZDF – NEMO

source: branches/2015/dev_r5803_NOC_WAD/NEMOGCM/NEMO/OPA_SRC/ZDF/zdftmx.F90 @ 5870

Last change on this file since 5870 was 5870, checked in by acc, 8 years ago

Branch 2015/dev_r5803_NOC_WAD. Merge in trunk changes from 5803 to 5869 in preparation for merge. Also tidied and reorganised some wetting and drying code. Renamed wadlmt.F90 to wetdry.F90. Wetting drying code changes restricted to domzgr.F90, domvvl.F90 nemogcm.F90 sshwzv.F90, dynspg_ts.F90, wetdry.F90 and dynhpg.F90. Code passes full SETTE tests with ln_wd=.false.. Still awaiting test case for checking with ln_wd=.false.

  • Property svn:keywords set to Id
File size: 27.4 KB
Line 
1MODULE zdftmx
2   !!========================================================================
3   !!                       ***  MODULE  zdftmx  ***
4   !! Ocean physics: vertical tidal mixing coefficient
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   !!----------------------------------------------------------------------
10#if defined key_zdftmx
11   !!----------------------------------------------------------------------
12   !!   'key_zdftmx'                                  Tidal vertical mixing
13   !!----------------------------------------------------------------------
14   !!   zdf_tmx       : global     momentum & tracer Kz with tidal induced Kz
15   !!   tmx_itf       : Indonesian momentum & tracer Kz with tidal 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 lbclnk         ! ocean lateral boundary conditions (or mpp link)
21   USE eosbn2         ! ocean equation of state
22   USE phycst         ! physical constants
23   USE prtctl         ! Print control
24   USE in_out_manager ! I/O manager
25   USE iom            ! I/O Manager
26   USE lib_mpp        ! MPP library
27   USE wrk_nemo       ! work arrays
28   USE timing         ! Timing
29   USE lib_fortran    ! Fortran utilities (allows no signed zero when 'key_nosignedzero' defined) 
30
31   IMPLICIT NONE
32   PRIVATE
33
34   PUBLIC   zdf_tmx         ! called in step module
35   PUBLIC   zdf_tmx_init    ! called in opa module
36   PUBLIC   zdf_tmx_alloc   ! called in nemogcm module
37
38   LOGICAL, PUBLIC, PARAMETER ::   lk_zdftmx = .TRUE.    !: tidal mixing flag
39
40   !                       !!* Namelist  namzdf_tmx : tidal mixing *
41   REAL(wp) ::  rn_htmx     ! vertical decay scale for turbulence (meters)
42   REAL(wp) ::  rn_n2min    ! threshold of the Brunt-Vaisala frequency (s-1)
43   REAL(wp) ::  rn_tfe      ! tidal dissipation efficiency (St Laurent et al. 2002)
44   REAL(wp) ::  rn_me       ! mixing efficiency (Osborn 1980)
45   LOGICAL  ::  ln_tmx_itf  ! Indonesian Through Flow (ITF): Koch-Larrouy et al. (2007) parameterization
46   REAL(wp) ::  rn_tfe_itf  ! ITF tidal dissipation efficiency (St Laurent et al. 2002)
47
48   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   en_tmx     ! energy available for tidal mixing (W/m2)
49   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:)   ::   mask_itf   ! mask to use over Indonesian area
50   REAL(wp), ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::   az_tmx     ! coefficient used to evaluate the tidal induced Kz
51
52   !! * Substitutions
53#  include "domzgr_substitute.h90"
54#  include "vectopt_loop_substitute.h90"
55   !!----------------------------------------------------------------------
56   !! NEMO/OPA 3.7 , NEMO Consortium (2014)
57   !! $Id$
58   !! Software governed by the CeCILL licence     (NEMOGCM/NEMO_CeCILL.txt)
59   !!----------------------------------------------------------------------
60CONTAINS
61
62   INTEGER FUNCTION zdf_tmx_alloc()
63      !!----------------------------------------------------------------------
64      !!                ***  FUNCTION zdf_tmx_alloc  ***
65      !!----------------------------------------------------------------------
66      ALLOCATE(en_tmx(jpi,jpj), mask_itf(jpi,jpj), az_tmx(jpi,jpj,jpk), STAT=zdf_tmx_alloc )
67      !
68      IF( lk_mpp             )   CALL mpp_sum ( zdf_tmx_alloc )
69      IF( zdf_tmx_alloc /= 0 )   CALL ctl_warn('zdf_tmx_alloc: failed to allocate arrays')
70   END FUNCTION zdf_tmx_alloc
71
72
73   SUBROUTINE zdf_tmx( kt )
74      !!----------------------------------------------------------------------
75      !!                  ***  ROUTINE zdf_tmx  ***
76      !!                   
77      !! ** Purpose :   add to the vertical mixing coefficients the effect of
78      !!              tidal mixing (Simmons et al 2004).
79      !!
80      !! ** Method  : - tidal-induced vertical mixing is given by:
81      !!                  Kz_tides = az_tmx / max( rn_n2min, N^2 )
82      !!              where az_tmx is a coefficient that specified the 3D space
83      !!              distribution of the faction of tidal energy taht is used
84      !!              for mixing. Its expression is set in zdf_tmx_init routine,
85      !!              following Simmons et al. 2004.
86      !!                NB: a specific bounding procedure is performed on av_tide
87      !!              so that the input tidal energy is actually almost used. The
88      !!              basic maximum value is 60 cm2/s, but values of 300 cm2/s
89      !!              can be reached in area where bottom stratification is too
90      !!              weak.
91      !!
92      !!              - update av_tide in the Indonesian Through Flow area
93      !!              following Koch-Larrouy et al. (2007) parameterisation
94      !!              (see tmx_itf routine).
95      !!
96      !!              - update the model vertical eddy viscosity and diffusivity:
97      !!                     avt  = avt  +    av_tides
98      !!                     avm  = avm  +    av_tides
99      !!                     avmu = avmu + mi(av_tides)
100      !!                     avmv = avmv + mj(av_tides)
101      !!
102      !! ** Action  :   avt, avm, avmu, avmv   increased by tidal mixing
103      !!
104      !! References : Simmons et al. 2004, Ocean Modelling, 6, 3-4, 245-263.
105      !!              Koch-Larrouy et al. 2007, GRL.
106      !!----------------------------------------------------------------------
107      INTEGER, INTENT(in) ::   kt   ! ocean time-step
108      !
109      INTEGER  ::   ji, jj, jk   ! dummy loop indices
110      REAL(wp) ::   ztpc         ! scalar workspace
111      REAL(wp), POINTER, DIMENSION(:,:)   ::   zkz
112      REAL(wp), POINTER, DIMENSION(:,:,:) ::   zav_tide
113      !!----------------------------------------------------------------------
114      !
115      IF( nn_timing == 1 )  CALL timing_start('zdf_tmx')
116      !
117      CALL wrk_alloc( jpi,jpj,       zkz )
118      CALL wrk_alloc( jpi,jpj,jpk,   zav_tide )
119      !
120      !                          ! ----------------------- !
121      !                          !  Standard tidal mixing  !  (compute zav_tide)
122      !                          ! ----------------------- !
123      !                             !* First estimation (with n2 bound by rn_n2min) bounded by 60 cm2/s
124      zav_tide(:,:,:) = MIN(  60.e-4, az_tmx(:,:,:) / MAX( rn_n2min, rn2(:,:,:) )  )
125
126      zkz(:,:) = 0.e0               !* Associated potential energy consummed over the whole water column
127      DO jk = 2, jpkm1
128         zkz(:,:) = zkz(:,:) + fse3w(:,:,jk) * MAX( 0.e0, rn2(:,:,jk) ) * rau0 * zav_tide(:,:,jk) * wmask(:,:,jk)
129      END DO
130
131      DO jj = 1, jpj                !* Here zkz should be equal to en_tmx ==> multiply by en_tmx/zkz to recover en_tmx
132         DO ji = 1, jpi
133            IF( zkz(ji,jj) /= 0.e0 )   zkz(ji,jj) = en_tmx(ji,jj) / zkz(ji,jj)
134         END DO
135      END DO
136
137      DO jk = 2, jpkm1     !* Mutiply by zkz to recover en_tmx, BUT bound by 30/6 ==> zav_tide bound by 300 cm2/s
138         zav_tide(:,:,jk) = zav_tide(:,:,jk) * MIN( zkz(:,:), 30./6. ) * wmask(:,:,jk)  !kz max = 300 cm2/s
139      END DO
140
141      IF( kt == nit000 ) THEN       !* check at first time-step: diagnose the energy consumed by zav_tide
142         ztpc = 0._wp
143         DO jk= 1, jpk
144            DO jj= 1, jpj
145               DO ji= 1, jpi
146                  ztpc = ztpc + fse3w(ji,jj,jk) * e1e2t(ji,jj)                  &
147                     &        * MAX( 0.e0, rn2(ji,jj,jk) ) * zav_tide(ji,jj,jk) * tmask(ji,jj,jk) * tmask_i(ji,jj)
148               END DO
149            END DO
150         END DO
151         ztpc= rau0 / ( rn_tfe * rn_me ) * ztpc
152         IF( lk_mpp )   CALL mpp_sum( ztpc )
153         IF(lwp) WRITE(numout,*) 
154         IF(lwp) WRITE(numout,*) '          N Total power consumption by av_tide    : ztpc = ', ztpc * 1.e-12 ,'TW'
155      ENDIF
156       
157      !                          ! ----------------------- !
158      !                          !    ITF  tidal mixing    !  (update zav_tide)
159      !                          ! ----------------------- !
160      IF( ln_tmx_itf )   CALL tmx_itf( kt, zav_tide )
161
162      !                          ! ----------------------- !
163      !                          !   Update  mixing coefs  !                         
164      !                          ! ----------------------- !
165      DO jk = 2, jpkm1              !* update momentum & tracer diffusivity with tidal mixing
166         avt(:,:,jk) = avt(:,:,jk) + zav_tide(:,:,jk) * wmask(:,:,jk)
167         avm(:,:,jk) = avm(:,:,jk) + zav_tide(:,:,jk) * wmask(:,:,jk)
168         DO jj = 2, jpjm1
169            DO ji = fs_2, fs_jpim1  ! vector opt.
170               avmu(ji,jj,jk) = avmu(ji,jj,jk) + 0.5 * ( zav_tide(ji,jj,jk) + zav_tide(ji+1,jj  ,jk) ) * wumask(ji,jj,jk)
171               avmv(ji,jj,jk) = avmv(ji,jj,jk) + 0.5 * ( zav_tide(ji,jj,jk) + zav_tide(ji  ,jj+1,jk) ) * wvmask(ji,jj,jk)
172            END DO
173         END DO
174      END DO
175      CALL lbc_lnk( avmu, 'U', 1. )   ;   CALL lbc_lnk( avmv, 'V', 1. )      ! lateral boundary condition
176
177      !                             !* output tidal mixing coefficient
178      CALL iom_put( "av_tide", zav_tide )
179
180      IF(ln_ctl)   CALL prt_ctl(tab3d_1=zav_tide , clinfo1=' tmx - av_tide: ', tab3d_2=avt, clinfo2=' avt: ', ovlap=1, kdim=jpk)
181      !
182      CALL wrk_dealloc( jpi,jpj,       zkz )
183      CALL wrk_dealloc( jpi,jpj,jpk,   zav_tide )
184      !
185      IF( nn_timing == 1 )  CALL timing_stop('zdf_tmx')
186      !
187   END SUBROUTINE zdf_tmx
188
189
190   SUBROUTINE tmx_itf( kt, pav )
191      !!----------------------------------------------------------------------
192      !!                  ***  ROUTINE tmx_itf  ***
193      !!                   
194      !! ** Purpose :   modify the vertical eddy diffusivity coefficients
195      !!              (pav) in the Indonesian Through Flow area (ITF).
196      !!
197      !! ** Method  : - Following Koch-Larrouy et al. (2007), in the ITF defined
198      !!                by msk_itf (read in a file, see tmx_init), the tidal
199      !!                mixing coefficient is computed with :
200      !!                  * q=1 (i.e. all the tidal energy remains trapped in
201      !!                         the area and thus is used for mixing)
202      !!                  * the vertical distribution of the tifal energy is a
203      !!                    proportional to N above the thermocline (d(N^2)/dz > 0)
204      !!                    and to N^2 below the thermocline (d(N^2)/dz < 0)
205      !!
206      !! ** Action  :   av_tide   updated in the ITF area (msk_itf)
207      !!
208      !! References :  Koch-Larrouy et al. 2007, GRL
209      !!----------------------------------------------------------------------
210      INTEGER , INTENT(in   )                         ::   kt   ! ocean time-step
211      REAL(wp), INTENT(inout), DIMENSION(jpi,jpj,jpk) ::   pav  ! Tidal mixing coef.
212      !!
213      INTEGER  ::   ji, jj, jk    ! dummy loop indices
214      REAL(wp) ::   zcoef, ztpc   ! temporary scalar
215      REAL(wp), DIMENSION(:,:)  , POINTER ::   zkz                        ! 2D workspace
216      REAL(wp), DIMENSION(:,:)  , POINTER ::   zsum1 , zsum2 , zsum       !  -      -
217      REAL(wp), DIMENSION(:,:,:), POINTER ::   zempba_3d_1, zempba_3d_2   ! 3D workspace
218      REAL(wp), DIMENSION(:,:,:), POINTER ::   zempba_3d  , zdn2dz        !  -      -
219      REAL(wp), DIMENSION(:,:,:), POINTER ::   zavt_itf                   !  -      -
220      !!----------------------------------------------------------------------
221      !
222      IF( nn_timing == 1 )  CALL timing_start('tmx_itf')
223      !
224      CALL wrk_alloc( jpi,jpj, zkz, zsum1 , zsum2 , zsum )
225      CALL wrk_alloc( jpi,jpj,jpk, zempba_3d_1, zempba_3d_2, zempba_3d, zdn2dz, zavt_itf )
226
227      !                             ! compute the form function using N2 at each time step
228      zempba_3d_1(:,:,jpk) = 0.e0
229      zempba_3d_2(:,:,jpk) = 0.e0
230      DO jk = 1, jpkm1             
231         zdn2dz     (:,:,jk) = rn2(:,:,jk) - rn2(:,:,jk+1)           ! Vertical profile of dN2/dz
232         zempba_3d_1(:,:,jk) = SQRT(  MAX( 0.e0, rn2(:,:,jk) )  )    !    -        -    of N
233         zempba_3d_2(:,:,jk) =        MAX( 0.e0, rn2(:,:,jk) )       !    -        -    of N^2
234      END DO
235      !
236      zsum (:,:) = 0.e0
237      zsum1(:,:) = 0.e0
238      zsum2(:,:) = 0.e0
239      DO jk= 2, jpk
240         zsum1(:,:) = zsum1(:,:) + zempba_3d_1(:,:,jk) * fse3w(:,:,jk) * wmask(:,:,jk)
241         zsum2(:,:) = zsum2(:,:) + zempba_3d_2(:,:,jk) * fse3w(:,:,jk) * wmask(:,:,jk)               
242      END DO
243      DO jj = 1, jpj
244         DO ji = 1, jpi
245            IF( zsum1(ji,jj) /= 0.e0 )   zsum1(ji,jj) = 1.e0 / zsum1(ji,jj)
246            IF( zsum2(ji,jj) /= 0.e0 )   zsum2(ji,jj) = 1.e0 / zsum2(ji,jj)               
247         END DO
248      END DO
249
250      DO jk= 1, jpk
251         DO jj = 1, jpj
252            DO ji = 1, jpi
253               zcoef = 0.5 - SIGN( 0.5, zdn2dz(ji,jj,jk) )       ! =0 if dN2/dz > 0, =1 otherwise
254               ztpc  = zempba_3d_1(ji,jj,jk) * zsum1(ji,jj) *        zcoef     &
255                  &  + zempba_3d_2(ji,jj,jk) * zsum2(ji,jj) * ( 1. - zcoef )
256               !
257               zempba_3d(ji,jj,jk) =               ztpc 
258               zsum     (ji,jj)    = zsum(ji,jj) + ztpc * fse3w(ji,jj,jk)
259            END DO
260         END DO
261       END DO
262       DO jj = 1, jpj
263          DO ji = 1, jpi
264             IF( zsum(ji,jj) > 0.e0 )   zsum(ji,jj) = 1.e0 / zsum(ji,jj)               
265          END DO
266       END DO
267
268      !                             ! first estimation bounded by 10 cm2/s (with n2 bounded by rn_n2min)
269      zcoef = rn_tfe_itf / ( rn_tfe * rau0 )
270      DO jk = 1, jpk
271         zavt_itf(:,:,jk) = MIN(  10.e-4, zcoef * en_tmx(:,:) * zsum(:,:) * zempba_3d(:,:,jk)   &
272            &                                      / MAX( rn_n2min, rn2(:,:,jk) ) * tmask(:,:,jk)  )
273      END DO           
274
275      zkz(:,:) = 0.e0               ! Associated potential energy consummed over the whole water column
276      DO jk = 2, jpkm1
277         zkz(:,:) = zkz(:,:) + fse3w(:,:,jk) * MAX( 0.e0, rn2(:,:,jk) ) * rau0 * zavt_itf(:,:,jk) * wmask(:,:,jk)
278      END DO
279
280      DO jj = 1, jpj                ! Here zkz should be equal to en_tmx ==> multiply by en_tmx/zkz to recover en_tmx
281         DO ji = 1, jpi
282            IF( zkz(ji,jj) /= 0.e0 )   zkz(ji,jj) = en_tmx(ji,jj) * rn_tfe_itf / rn_tfe / zkz(ji,jj)
283         END DO
284      END DO
285
286      DO jk = 2, jpkm1              ! Mutiply by zkz to recover en_tmx, BUT bound by 30/6 ==> zavt_itf bound by 300 cm2/s
287         zavt_itf(:,:,jk) = zavt_itf(:,:,jk) * MIN( zkz(:,:), 120./10. ) * wmask(:,:,jk)   ! kz max = 120 cm2/s
288      END DO
289
290      IF( kt == nit000 ) THEN       ! diagnose the nergy consumed by zavt_itf
291         ztpc = 0.e0
292         DO jk= 1, jpk
293            DO jj= 1, jpj
294               DO ji= 1, jpi
295                  ztpc = ztpc + e1e2t(ji,jj) * fse3w(ji,jj,jk) * MAX( 0.e0, rn2(ji,jj,jk) )   &
296                     &                       * zavt_itf(ji,jj,jk) * tmask(ji,jj,jk) * tmask_i(ji,jj)
297               END DO
298            END DO
299         END DO
300         IF( lk_mpp )   CALL mpp_sum( ztpc )
301         ztpc= rau0 * ztpc / ( rn_me * rn_tfe_itf )
302         IF(lwp) WRITE(numout,*) '          N Total power consumption by zavt_itf: ztpc = ', ztpc * 1.e-12 ,'TW'
303      ENDIF
304
305      !                             ! Update pav with the ITF mixing coefficient
306      DO jk = 2, jpkm1
307         pav(:,:,jk) = pav     (:,:,jk) * ( 1.e0 - mask_itf(:,:) )   &
308            &        + zavt_itf(:,:,jk) *          mask_itf(:,:) 
309      END DO
310      !
311      CALL wrk_dealloc( jpi,jpj, zkz, zsum1 , zsum2 , zsum )
312      CALL wrk_dealloc( jpi,jpj,jpk, zempba_3d_1, zempba_3d_2, zempba_3d, zdn2dz, zavt_itf )
313      !
314      IF( nn_timing == 1 )  CALL timing_stop('tmx_itf')
315      !
316   END SUBROUTINE tmx_itf
317
318
319   SUBROUTINE zdf_tmx_init
320      !!----------------------------------------------------------------------
321      !!                  ***  ROUTINE zdf_tmx_init  ***
322      !!                     
323      !! ** Purpose :   Initialization of the vertical tidal mixing, Reading
324      !!              of M2 and K1 tidal energy in nc files
325      !!
326      !! ** Method  : - Read the namtmx namelist and check the parameters
327      !!
328      !!              - Read the input data in NetCDF files :
329      !!              M2 and K1 tidal energy. The total tidal energy, en_tmx,
330      !!              is the sum of M2, K1 and S2 energy where S2 is assumed
331      !!              to be: S2=(1/2)^2 * M2
332      !!              mask_itf, a mask array that determine where substituing
333      !!              the standard Simmons et al. (2005) formulation with the
334      !!              one of Koch_Larrouy et al. (2007).
335      !!
336      !!              - Compute az_tmx, a 3D coefficient that allows to compute
337      !!             the standard tidal-induced vertical mixing as follows:
338      !!                  Kz_tides = az_tmx / max( rn_n2min, N^2 )
339      !!             with az_tmx a bottom intensified coefficient is given by:
340      !!                 az_tmx(z) = en_tmx / ( rau0 * rn_htmx ) * EXP( -(H-z)/rn_htmx )
341      !!                                                  / ( 1. - EXP( - H   /rn_htmx ) )
342      !!             where rn_htmx the characteristic length scale of the bottom
343      !!             intensification, en_tmx the tidal energy, and H the ocean depth
344      !!
345      !! ** input   :   - Namlist namtmx
346      !!                - NetCDF file : M2_ORCA2.nc, K1_ORCA2.nc, and mask_itf.nc
347      !!
348      !! ** Action  : - Increase by 1 the nstop flag is setting problem encounter
349      !!              - defined az_tmx used to compute tidal-induced mixing
350      !!
351      !! References : Simmons et al. 2004, Ocean Modelling, 6, 3-4, 245-263.
352      !!              Koch-Larrouy et al. 2007, GRL.
353      !!----------------------------------------------------------------------
354      INTEGER  ::   ji, jj, jk   ! dummy loop indices
355      INTEGER  ::   inum         ! local integer
356      INTEGER  ::   ios
357      REAL(wp) ::   ztpc, ze_z   ! local scalars
358      REAL(wp), DIMENSION(:,:)  , POINTER ::  zem2, zek1     ! read M2 and K1 tidal energy
359      REAL(wp), DIMENSION(:,:)  , POINTER ::  zkz            ! total M2, K1 and S2 tidal energy
360      REAL(wp), DIMENSION(:,:)  , POINTER ::  zfact          ! used for vertical structure function
361      REAL(wp), DIMENSION(:,:)  , POINTER ::  zhdep          ! Ocean depth
362      REAL(wp), DIMENSION(:,:,:), POINTER ::  zpc, zav_tide  ! power consumption
363      !!
364      NAMELIST/namzdf_tmx/ rn_htmx, rn_n2min, rn_tfe, rn_me, ln_tmx_itf, rn_tfe_itf
365      !!----------------------------------------------------------------------
366      !
367      IF( nn_timing == 1 )  CALL timing_start('zdf_tmx_init')
368      !
369      CALL wrk_alloc( jpi,jpj,       zem2, zek1, zkz, zfact, zhdep )
370      CALL wrk_alloc( jpi,jpj,jpk,   zpc, zav_tide )
371      !
372      REWIND( numnam_ref )             ! Namelist namzdf_tmx in reference namelist : Tidal Mixing
373      READ  ( numnam_ref, namzdf_tmx, IOSTAT = ios, ERR = 901)
374901   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namzdf_tmx in reference namelist', lwp )
375      !
376      REWIND( numnam_cfg )             ! Namelist namzdf_tmx in configuration namelist : Tidal Mixing
377      READ  ( numnam_cfg, namzdf_tmx, IOSTAT = ios, ERR = 902 )
378902   IF( ios /= 0 ) CALL ctl_nam ( ios , 'namzdf_tmx in configuration namelist', lwp )
379      IF(lwm) WRITE ( numond, namzdf_tmx )
380      !
381      IF(lwp) THEN                     ! Control print
382         WRITE(numout,*)
383         WRITE(numout,*) 'zdf_tmx_init : tidal mixing'
384         WRITE(numout,*) '~~~~~~~~~~~~'
385         WRITE(numout,*) '   Namelist namzdf_tmx : set tidal mixing parameters'
386         WRITE(numout,*) '      Vertical decay scale for turbulence   = ', rn_htmx 
387         WRITE(numout,*) '      Brunt-Vaisala frequency threshold     = ', rn_n2min
388         WRITE(numout,*) '      Tidal dissipation efficiency          = ', rn_tfe
389         WRITE(numout,*) '      Mixing efficiency                     = ', rn_me
390         WRITE(numout,*) '      ITF specific parameterisation         = ', ln_tmx_itf
391         WRITE(numout,*) '      ITF tidal dissipation efficiency      = ', rn_tfe_itf
392      ENDIF
393      !                                ! allocate tmx arrays
394      IF( zdf_tmx_alloc() /= 0 )   CALL ctl_stop( 'STOP', 'zdf_tmx_init : unable to allocate tmx arrays' )
395
396      IF( ln_tmx_itf ) THEN            ! read the Indonesian Through Flow mask
397         CALL iom_open('mask_itf',inum)
398         CALL iom_get (inum, jpdom_data, 'tmaskitf',mask_itf,1) !
399         CALL iom_close(inum)
400      ENDIF
401      !                                ! read M2 tidal energy flux : W/m2  ( zem2 < 0 )
402      CALL iom_open('M2rowdrg',inum)
403      CALL iom_get (inum, jpdom_data, 'field',zem2,1) !
404      CALL iom_close(inum)
405      !                                ! read K1 tidal energy flux : W/m2  ( zek1 < 0 )
406      CALL iom_open('K1rowdrg',inum)
407      CALL iom_get (inum, jpdom_data, 'field',zek1,1) !
408      CALL iom_close(inum)
409      !                                ! Total tidal energy ( M2, S2 and K1  with S2=(1/2)^2 * M2 )
410      !                                ! only the energy available for mixing is taken into account,
411      !                                ! (mixing efficiency tidal dissipation efficiency)
412      en_tmx(:,:) = - rn_tfe * rn_me * ( zem2(:,:) * 1.25 + zek1(:,:) ) * ssmask(:,:)
413
414!============
415!TG: Bug for VVL? Should this section be moved out of _init and be updated at every timestep?
416!!gm : you are right, but tidal mixing acts in deep ocean (H>500m) where e3 is O(100m)
417!!     the error is thus ~1% which I feel comfortable with, compared to uncertainties in tidal energy dissipation.
418      !                                ! Vertical structure (az_tmx)
419      DO jj = 1, jpj                         ! part independent of the level
420         DO ji = 1, jpi
421            zhdep(ji,jj) = gdepw_0(ji,jj,mbkt(ji,jj)+1)       ! depth of the ocean
422            zfact(ji,jj) = rau0 * rn_htmx * ( 1. - EXP( -zhdep(ji,jj) / rn_htmx ) )
423            IF( zfact(ji,jj) /= 0 )   zfact(ji,jj) = en_tmx(ji,jj) / zfact(ji,jj)
424         END DO
425      END DO
426      DO jk= 1, jpk                          ! complete with the level-dependent part
427         DO jj = 1, jpj
428            DO ji = 1, jpi
429               az_tmx(ji,jj,jk) = zfact(ji,jj) * EXP( -( zhdep(ji,jj)-gdepw_0(ji,jj,jk) ) / rn_htmx ) * tmask(ji,jj,jk)
430            END DO
431         END DO
432      END DO
433!===========
434      !
435      IF( nprint == 1 .AND. lwp ) THEN
436         ! Control print
437         ! Total power consumption due to vertical mixing
438         ! zpc = rau0 * 1/rn_me * rn2 * zav_tide
439         zav_tide(:,:,:) = 0.e0
440         DO jk = 2, jpkm1
441            zav_tide(:,:,jk) = az_tmx(:,:,jk) / MAX( rn_n2min, rn2(:,:,jk) )
442         END DO
443         !
444         ztpc = 0._wp
445         zpc(:,:,:) = MAX(rn_n2min,rn2(:,:,:)) * zav_tide(:,:,:)
446         DO jk= 2, jpkm1
447            DO jj = 1, jpj
448               DO ji = 1, jpi
449                  ztpc = ztpc + fse3w(ji,jj,jk) * e1e2t(ji,jj) * zpc(ji,jj,jk) * wmask(ji,jj,jk) * tmask_i(ji,jj)
450               END DO
451            END DO
452         END DO
453         IF( lk_mpp )   CALL mpp_sum( ztpc )
454         ztpc= rau0 * 1/(rn_tfe * rn_me) * ztpc
455         !
456         WRITE(numout,*) 
457         WRITE(numout,*) '          Total power consumption of the tidally driven part of Kz : ztpc = ', ztpc * 1.e-12 ,'TW'
458         !
459         ! control print 2
460         zav_tide(:,:,:) = MIN( zav_tide(:,:,:), 60.e-4 )   
461         zkz(:,:) = 0._wp
462         DO jk = 2, jpkm1
463               zkz(:,:) = zkz(:,:) + fse3w(:,:,jk) * MAX(0.e0, rn2(:,:,jk)) * rau0 * zav_tide(:,:,jk) * wmask(:,:,jk)
464         END DO
465         ! Here zkz should be equal to en_tmx ==> multiply by en_tmx/zkz
466         DO jj = 1, jpj
467            DO ji = 1, jpi
468               IF( zkz(ji,jj) /= 0.e0 )   THEN
469                   zkz(ji,jj) = en_tmx(ji,jj) / zkz(ji,jj)
470               ENDIF
471            END DO
472         END DO
473         ztpc = 1.e50
474         DO jj = 1, jpj
475            DO ji = 1, jpi
476               IF( zkz(ji,jj) /= 0.e0 )   THEN
477                   ztpc = Min( zkz(ji,jj), ztpc)
478               ENDIF
479            END DO
480         END DO
481         WRITE(numout,*) '          Min de zkz ', ztpc, ' Max = ', maxval(zkz(:,:) )
482         !
483         DO jk = 2, jpkm1
484            zav_tide(:,:,jk) = zav_tide(:,:,jk) * MIN( zkz(:,:), 30./6. ) * wmask(:,:,jk)  !kz max = 300 cm2/s
485         END DO
486         ztpc = 0._wp
487         zpc(:,:,:) = Max(0.e0,rn2(:,:,:)) * zav_tide(:,:,:)
488         DO jk= 1, jpk
489            DO jj = 1, jpj
490               DO ji = 1, jpi
491                  ztpc = ztpc + fse3w(ji,jj,jk) * e1e2t(ji,jj) * zpc(ji,jj,jk) * wmask(ji,jj,jk) * tmask_i(ji,jj)
492               END DO
493            END DO
494         END DO
495         IF( lk_mpp )   CALL mpp_sum( ztpc )
496         ztpc= rau0 * 1/(rn_tfe * rn_me) * ztpc
497         WRITE(numout,*) '          2 Total power consumption of the tidally driven part of Kz : ztpc = ', ztpc * 1.e-12 ,'TW'
498!!gm bug mpp  in these diagnostics
499         DO jk = 1, jpk
500            ze_z =                  SUM( e1e2t(:,:) * zav_tide(:,:,jk) * tmask_i(:,:) )   &
501               &     / MAX( 1.e-20, SUM( e1e2t(:,:) * wmask   (:,:,jk) * tmask_i(:,:) ) )
502            ztpc = 1.e50
503            DO jj = 1, jpj
504               DO ji = 1, jpi
505                  IF( zav_tide(ji,jj,jk) /= 0.e0 )   ztpc = MIN( ztpc, zav_tide(ji,jj,jk) )
506               END DO
507            END DO
508            WRITE(numout,*) '            N2 min - jk= ', jk,'   ', ze_z * 1.e4,' cm2/s min= ',ztpc*1.e4,   &
509               &       'max= ', MAXVAL(zav_tide(:,:,jk) )*1.e4, ' cm2/s'
510         END DO
511
512         WRITE(numout,*) '          e_tide : ', SUM( e1e2t*en_tmx ) / ( rn_tfe * rn_me ) * 1.e-12, 'TW'
513         WRITE(numout,*) 
514         WRITE(numout,*) '          Initial profile of tidal vertical mixing'
515         DO jk = 1, jpk
516            DO jj = 1,jpj
517               DO ji = 1,jpi
518                  zkz(ji,jj) = az_tmx(ji,jj,jk) /MAX( rn_n2min, rn2(ji,jj,jk) )
519               END DO
520            END DO
521            ze_z =                  SUM( e1e2t(:,:) * zkz  (:,:)    * tmask_i(:,:) )   &
522               &     / MAX( 1.e-20, SUM( e1e2t(:,:) * wmask(:,:,jk) * tmask_i(:,:) ) )
523            WRITE(numout,*) '                jk= ', jk,'   ', ze_z * 1.e4,' cm2/s'
524         END DO
525         DO jk = 1, jpk
526            zkz(:,:) = az_tmx(:,:,jk) /rn_n2min
527            ze_z =                  SUM( e1e2t(:,:) * zkz  (:,:)    * tmask_i(:,:) )   &
528               &     / MAX( 1.e-20, SUM( e1e2t(:,:) * wmask(:,:,jk) * tmask_i(:,:) ) )
529            WRITE(numout,*) 
530            WRITE(numout,*) '          N2 min - jk= ', jk,'   ', ze_z * 1.e4,' cm2/s min= ',MINVAL(zkz)*1.e4,   &
531               &       'max= ', MAXVAL(zkz)*1.e4, ' cm2/s'
532         END DO
533!!gm  end bug mpp
534         !
535      ENDIF
536      !
537      CALL wrk_dealloc( jpi,jpj, zem2, zek1, zkz, zfact, zhdep )
538      CALL wrk_dealloc( jpi,jpj,jpk, zpc )
539      !
540      IF( nn_timing == 1 )  CALL timing_stop('zdf_tmx_init')
541      !
542   END SUBROUTINE zdf_tmx_init
543
544#else
545   !!----------------------------------------------------------------------
546   !!   Default option          Dummy module                NO Tidal MiXing
547   !!----------------------------------------------------------------------
548   LOGICAL, PUBLIC, PARAMETER ::   lk_zdftmx = .FALSE.   !: tidal mixing flag
549CONTAINS
550   SUBROUTINE zdf_tmx_init           ! Dummy routine
551      WRITE(*,*) 'zdf_tmx: You should not have seen this print! error?'
552   END SUBROUTINE zdf_tmx_init
553   SUBROUTINE zdf_tmx( kt )          ! Dummy routine
554      WRITE(*,*) 'zdf_tmx: You should not have seen this print! error?', kt
555   END SUBROUTINE zdf_tmx
556#endif
557
558   !!======================================================================
559END MODULE zdftmx
Note: See TracBrowser for help on using the repository browser.