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