Changeset 13284 for NEMO/releases/r4.0/r4.0-HEAD/src/OCE/ZDF
- Timestamp:
- 2020-07-09T17:12:23+02:00 (4 years ago)
- Location:
- NEMO/releases/r4.0/r4.0-HEAD/src/OCE/ZDF
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/releases/r4.0/r4.0-HEAD/src/OCE/ZDF/zdfdrg.F90
r13268 r13284 32 32 USE lib_mpp ! distributed memory computing 33 33 USE prtctl ! Print control 34 USE sbc_oce , ONLY : nn_ice 34 35 35 36 IMPLICIT NONE … … 46 47 LOGICAL :: ln_loglayer ! logarithmic drag: Cd = vkarmn/log(z/z0) 47 48 LOGICAL , PUBLIC :: ln_drgimp ! implicit top/bottom friction flag 48 49 LOGICAL , PUBLIC :: ln_drgice_imp ! implicit ice-ocean drag 49 50 ! !!* Namelist namdrg_top & _bot: TOP or BOTTOM coefficient namelist * 50 51 REAL(wp) :: rn_Cd0 !: drag coefficient [ - ] … … 231 232 INTEGER :: ios, ioptio ! local integers 232 233 !! 233 NAMELIST/namdrg/ ln_drg_OFF, ln_lin, ln_non_lin, ln_loglayer, ln_drgimp 234 NAMELIST/namdrg/ ln_drg_OFF, ln_lin, ln_non_lin, ln_loglayer, ln_drgimp, ln_drgice_imp 234 235 !!---------------------------------------------------------------------- 235 236 ! … … 254 255 WRITE(numout,*) ' logarithmic drag: Cd = vkarmn/log(z/z0) ln_loglayer = ', ln_loglayer 255 256 WRITE(numout,*) ' implicit friction ln_drgimp = ', ln_drgimp 257 WRITE(numout,*) ' implicit ice-ocean drag ln_drgice_imp =', ln_drgice_imp 256 258 ENDIF 257 259 ! … … 264 266 IF( ioptio /= 1 ) CALL ctl_stop( 'zdf_drg_init: Choose ONE type of drag coef in namdrg' ) 265 267 ! 268 IF ( ln_drgice_imp.AND.(.NOT.ln_drgimp) ) & 269 & CALL ctl_stop( 'zdf_drg_init: ln_drgice_imp=T requires ln_drgimp=T' ) 270 ! 271 IF ( ln_drgice_imp.AND.( nn_ice /=2 ) ) & 272 & CALL ctl_stop( 'zdf_drg_init: ln_drgice_imp=T requires si3' ) 266 273 ! 267 274 ! !== BOTTOM drag setting ==! (applied at seafloor) … … 274 281 ! !== TOP drag setting ==! (applied at the top of ocean cavities) 275 282 ! 276 IF( ln_isfcav ) THEN ! Ocean cavities: top friction setting 277 ALLOCATE( rCd0_top(jpi,jpj), rCdU_top(jpi,jpj) ) 283 IF( ln_isfcav.OR.ln_drgice_imp ) THEN ! Ocean cavities: top friction setting 284 ALLOCATE( rCdU_top(jpi,jpj) ) 285 ENDIF 286 ! 287 IF( ln_isfcav ) THEN 288 ALLOCATE( rCd0_top(jpi,jpj)) 278 289 CALL drg_init( 'TOP ' , mikt , & ! <== in 279 290 & r_Cdmin_top, r_Cdmax_top, r_z0_top, r_ke0_top, rCd0_top, rCdU_top ) ! ==> out -
NEMO/releases/r4.0/r4.0-HEAD/src/OCE/ZDF/zdfgls.F90
r13268 r13284 54 54 INTEGER :: nn_bc_bot ! bottom boundary condition (=0/1) 55 55 INTEGER :: nn_z0_met ! Method for surface roughness computation 56 INTEGER :: nn_z0_ice ! Roughness accounting for sea ice 56 57 INTEGER :: nn_stab_func ! stability functions G88, KC or Canuto (=0/1/2) 57 58 INTEGER :: nn_clos ! closure 0/1/2/3 MY82/k-eps/k-w/gen … … 62 63 REAL(wp) :: rn_crban ! Craig and Banner constant for surface breaking waves mixing 63 64 REAL(wp) :: rn_hsro ! Minimum surface roughness 65 REAL(wp) :: rn_hsri ! Ice ocean roughness 64 66 REAL(wp) :: rn_frac_hs ! Fraction of wave height as surface roughness (if nn_z0_met > 1) 65 67 … … 151 153 REAL(wp), DIMENSION(jpi,jpj) :: zflxs ! Turbulence fluxed induced by internal waves 152 154 REAL(wp), DIMENSION(jpi,jpj) :: zhsro ! Surface roughness (surface waves) 155 REAL(wp), DIMENSION(jpi,jpj) :: zice_fra ! Tapering of wave breaking under sea ice 153 156 REAL(wp), DIMENSION(jpi,jpj,jpk) :: eb ! tke at time before 154 157 REAL(wp), DIMENSION(jpi,jpj,jpk) :: hmxl_b ! mixing length at time before … … 166 169 ustar2_bot (:,:) = 0._wp 167 170 171 SELECT CASE ( nn_z0_ice ) 172 CASE( 0 ) ; zice_fra(:,:) = 0._wp 173 CASE( 1 ) ; zice_fra(:,:) = TANH( fr_i(:,:) * 10._wp ) 174 CASE( 2 ) ; zice_fra(:,:) = fr_i(:,:) 175 CASE( 3 ) ; zice_fra(:,:) = MIN( 4._wp * fr_i(:,:) , 1._wp ) 176 END SELECT 177 168 178 ! Compute surface, top and bottom friction at T-points 169 179 DO jj = 2, jpjm1 !== surface ocean friction … … 211 221 END SELECT 212 222 ! 223 ! adapt roughness where there is sea ice 224 zhsro(:,:) = ( (1._wp-zice_fra(:,:)) * zhsro(:,:) + zice_fra(:,:) * rn_hsri )*tmask(:,:,1) + (1._wp - tmask(:,:,1))*rn_hsro 225 ! 213 226 DO jk = 2, jpkm1 !== Compute dissipation rate ==! 214 227 DO jj = 1, jpjm1 … … 305 318 CASE ( 0 ) ! Dirichlet boundary condition (set e at k=1 & 2) 306 319 ! First level 307 en (:,:,1) = MAX( rn_emin , rc02r * ustar2_surf(:,:) * (1._wp + rsbc_tke1)**r2_3 )320 en (:,:,1) = MAX( rn_emin , rc02r * ustar2_surf(:,:) * (1._wp + (1._wp-zice_fra(:,:))*rsbc_tke1)**r2_3 ) 308 321 zd_lw(:,:,1) = en(:,:,1) 309 322 zd_up(:,:,1) = 0._wp … … 311 324 ! 312 325 ! One level below 313 en (:,:,2) = MAX( rc02r * ustar2_surf(:,:) * ( 1._wp + rsbc_tke1 * ((zhsro(:,:)+gdepw_n(:,:,2))&314 & / zhsro(:,:) )**(1.5_wp*ra_sf) )**(2._wp/3._wp) 326 en (:,:,2) = MAX( rc02r * ustar2_surf(:,:) * ( 1._wp + (1._wp-zice_fra(:,:))*rsbc_tke1 * ((zhsro(:,:)+gdepw_n(:,:,2)) & 327 & / zhsro(:,:) )**(1.5_wp*ra_sf) )**(2._wp/3._wp) , rn_emin ) 315 328 zd_lw(:,:,2) = 0._wp 316 329 zd_up(:,:,2) = 0._wp … … 321 334 ! 322 335 ! Dirichlet conditions at k=1 323 en (:,:,1) = MAX( rc02r * ustar2_surf(:,:) * (1._wp + rsbc_tke1)**r2_3 , rn_emin )336 en (:,:,1) = MAX( rc02r * ustar2_surf(:,:) * (1._wp + (1._wp-zice_fra(:,:))*rsbc_tke1)**r2_3 , rn_emin ) 324 337 zd_lw(:,:,1) = en(:,:,1) 325 338 zd_up(:,:,1) = 0._wp … … 331 344 zd_lw(:,:,2) = 0._wp 332 345 zkar (:,:) = (rl_sf + (vkarmn-rl_sf)*(1.-EXP(-rtrans*gdept_n(:,:,1)/zhsro(:,:)) )) 333 zflxs(:,:) = rsbc_tke2 * ustar2_surf(:,:)**1.5_wp * zkar(:,:) &346 zflxs(:,:) = rsbc_tke2 * (1._wp-zice_fra(:,:)) * ustar2_surf(:,:)**1.5_wp * zkar(:,:) & 334 347 & * ( ( zhsro(:,:)+gdept_n(:,:,1) ) / zhsro(:,:) )**(1.5_wp*ra_sf) 335 348 !!gm why not : * ( 1._wp + gdept_n(:,:,1) / zhsro(:,:) )**(1.5_wp*ra_sf) … … 582 595 zkar (:,:) = rl_sf + (vkarmn-rl_sf)*(1._wp-EXP(-rtrans*gdept_n(:,:,1)/zhsro(:,:) )) ! Lengh scale slope 583 596 zdep (:,:) = ((zhsro(:,:) + gdept_n(:,:,1)) / zhsro(:,:))**(rmm*ra_sf) 584 zflxs(:,:) = (rnn + rsbc_tke1 * (rnn + rmm*ra_sf) * zdep(:,:))*(1._wp + rsbc_tke1*zdep(:,:))**(2._wp*rmm/3._wp-1_wp) 597 zflxs(:,:) = (rnn + (1._wp-zice_fra(:,:))*rsbc_tke1 * (rnn + rmm*ra_sf) * zdep(:,:)) & 598 & *(1._wp + (1._wp-zice_fra(:,:))*rsbc_tke1*zdep(:,:))**(2._wp*rmm/3._wp-1_wp) 585 599 zdep (:,:) = rsbc_psi1 * (zwall_psi(:,:,1)*p_avm(:,:,1)+zwall_psi(:,:,2)*p_avm(:,:,2)) * & 586 600 & ustar2_surf(:,:)**rmm * zkar(:,:)**rnn * (zhsro(:,:) + gdept_n(:,:,1))**(rnn-1.) … … 855 869 REAL(wp):: zcr ! local scalar 856 870 !! 857 NAMELIST/namzdf_gls/rn_emin, rn_epsmin, ln_length_lim, &858 & rn_clim_galp, ln_sigpsi, rn_hsro, 859 & rn_crban, rn_charn, rn_frac_hs, &860 & nn_bc_surf, nn_bc_bot, nn_z0_met, 871 NAMELIST/namzdf_gls/rn_emin, rn_epsmin, ln_length_lim, & 872 & rn_clim_galp, ln_sigpsi, rn_hsro, rn_hsri, & 873 & rn_crban, rn_charn, rn_frac_hs, & 874 & nn_bc_surf, nn_bc_bot, nn_z0_met, nn_z0_ice, & 861 875 & nn_stab_func, nn_clos 862 876 !!---------------------------------------------------------- … … 886 900 WRITE(numout,*) ' Charnock coefficient rn_charn = ', rn_charn 887 901 WRITE(numout,*) ' Surface roughness formula nn_z0_met = ', nn_z0_met 902 WRITE(numout,*) ' surface wave breaking under ice nn_z0_ice = ', nn_z0_ice 903 SELECT CASE( nn_z0_ice ) 904 CASE( 0 ) ; WRITE(numout,*) ' ==>>> no impact of ice cover on surface wave breaking' 905 CASE( 1 ) ; WRITE(numout,*) ' ==>>> roughness uses rn_hsri and is weigthed by 1-TANH( fr_i(:,:) * 10 )' 906 CASE( 2 ) ; WRITE(numout,*) ' ==>>> roughness uses rn_hsri and is weighted by 1-fr_i(:,:)' 907 CASE( 3 ) ; WRITE(numout,*) ' ==>>> roughness uses rn_hsri and is weighted by 1-MIN( 1, 4 * fr_i(:,:) )' 908 CASE DEFAULT 909 CALL ctl_stop( 'zdf_gls_init: wrong value for nn_z0_ice, should be 0,1,2, or 3') 910 END SELECT 888 911 WRITE(numout,*) ' Wave height frac. (used if nn_z0_met=2) rn_frac_hs = ', rn_frac_hs 889 912 WRITE(numout,*) ' Stability functions nn_stab_func = ', nn_stab_func 890 913 WRITE(numout,*) ' Type of closure nn_clos = ', nn_clos 891 914 WRITE(numout,*) ' Surface roughness (m) rn_hsro = ', rn_hsro 915 WRITE(numout,*) ' Ice-ocean roughness (used if nn_z0_ice/=0) rn_hsri = ', rn_hsri 892 916 WRITE(numout,*) 893 917 WRITE(numout,*) ' Namelist namdrg_top/_bot: used values:' -
NEMO/releases/r4.0/r4.0-HEAD/src/OCE/ZDF/zdfphy.F90
r11536 r13284 28 28 USE sbc_oce ! surface module (only for nn_isf in the option compatibility test) 29 29 USE sbcrnf ! surface boundary condition: runoff variables 30 USE sbc_ice ! sea ice drag 30 31 #if defined key_agrif 31 32 USE agrif_oce_interp ! interpavm … … 252 253 ENDIF 253 254 ! 255 #if defined key_si3 256 IF ( ln_drgice_imp) THEN 257 IF ( ln_isfcav ) THEN 258 rCdU_top(:,:) = rCdU_top(:,:) + ssmask(:,:) * tmask(:,:,1) * rCdU_ice(:,:) 259 ELSE 260 rCdU_top(:,:) = rCdU_ice(:,:) 261 ENDIF 262 ENDIF 263 #endif 264 ! 254 265 ! !== Kz from chosen turbulent closure ==! (avm_k, avt_k) 255 266 ! -
NEMO/releases/r4.0/r4.0-HEAD/src/OCE/ZDF/zdftke.F90
r13268 r13284 46 46 USE zdfmxl ! vertical physics: mixed layer 47 47 ! 48 #if defined key_si3 49 USE ice, ONLY: hm_i, h_i 50 #endif 51 #if defined key_cice 52 USE sbc_ice, ONLY: h_i 53 #endif 48 54 USE in_out_manager ! I/O manager 49 55 USE iom ! I/O manager library … … 62 68 ! !!** Namelist namzdf_tke ** 63 69 LOGICAL :: ln_mxl0 ! mixing length scale surface value as function of wind stress or not 70 INTEGER :: nn_mxlice ! type of scaling under sea-ice (=0/1/2/3) 71 REAL(wp) :: rn_mxlice ! ice thickness value when scaling under sea-ice 64 72 INTEGER :: nn_mxl ! type of mixing length (=0/1/2/3) 65 73 REAL(wp) :: rn_mxl0 ! surface min value of mixing length (kappa*z_o=0.4*0.1 m) [m] … … 74 82 INTEGER :: nn_htau ! type of tke profile of penetration (=0/1) 75 83 REAL(wp) :: rn_efr ! fraction of TKE surface value which penetrates in the ocean 76 REAL(wp) :: rn_eice ! =0 ON below sea-ice, =4 OFF when ice fraction > 1/477 84 LOGICAL :: ln_lc ! Langmuir cells (LC) as a source term of TKE or not 78 85 REAL(wp) :: rn_lc ! coef to compute vertical velocity of Langmuir cells 86 INTEGER :: nn_eice ! attenutaion of langmuir & surface wave breaking under ice (=0/1/2/3) 79 87 80 88 REAL(wp) :: ri_cri ! critic Richardson number (deduced from rn_ediff and rn_ediss values) … … 190 198 REAL(wp), DIMENSION(:,:,:) , INTENT(in ) :: p_avm, p_avt ! vertical eddy viscosity & diffusivity (w-points) 191 199 ! 192 INTEGER :: ji, jj, jk ! dummy loop arguments200 INTEGER :: ji, jj, jk ! dummy loop arguments 193 201 REAL(wp) :: zetop, zebot, zmsku, zmskv ! local scalars 194 202 REAL(wp) :: zrhoa = 1.22 ! Air density kg/m3 195 203 REAL(wp) :: zcdrag = 1.5e-3 ! drag coefficient 196 REAL(wp) :: zbbrau, z ri! local scalars197 REAL(wp) :: zfact1, zfact2, zfact3 ! - 198 REAL(wp) :: ztx2 , zty2 , zcof ! - 199 REAL(wp) :: ztau , zdif ! - 200 REAL(wp) :: zus , zwlc , zind ! - 201 REAL(wp) :: zzd_up, zzd_lw ! - 204 REAL(wp) :: zbbrau, zbbirau, zri ! local scalars 205 REAL(wp) :: zfact1, zfact2, zfact3 ! - - 206 REAL(wp) :: ztx2 , zty2 , zcof ! - - 207 REAL(wp) :: ztau , zdif ! - - 208 REAL(wp) :: zus , zwlc , zind ! - - 209 REAL(wp) :: zzd_up, zzd_lw ! - - 202 210 INTEGER , DIMENSION(jpi,jpj) :: imlc 203 REAL(wp), DIMENSION(jpi,jpj) :: z hlc, zfr_i211 REAL(wp), DIMENSION(jpi,jpj) :: zice_fra, zhlc, zus3 204 212 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zpelc, zdiag, zd_up, zd_lw 205 213 !!-------------------------------------------------------------------- 206 214 ! 207 zbbrau = rn_ebb / rau0 ! Local constant initialisation 208 zfact1 = -.5_wp * rdt 209 zfact2 = 1.5_wp * rdt * rn_ediss 210 zfact3 = 0.5_wp * rn_ediss 215 zbbrau = rn_ebb / rau0 ! Local constant initialisation 216 zbbirau = 3.75_wp / rau0 217 zfact1 = -0.5_wp * rdt 218 zfact2 = 1.5_wp * rdt * rn_ediss 219 zfact3 = 0.5_wp * rn_ediss 220 ! 221 ! ice fraction considered for attenuation of langmuir & wave breaking 222 SELECT CASE ( nn_eice ) 223 CASE( 0 ) ; zice_fra(:,:) = 0._wp 224 CASE( 1 ) ; zice_fra(:,:) = TANH( fr_i(:,:) * 10._wp ) 225 CASE( 2 ) ; zice_fra(:,:) = fr_i(:,:) 226 CASE( 3 ) ; zice_fra(:,:) = MIN( 4._wp * fr_i(:,:) , 1._wp ) 227 END SELECT 211 228 ! 212 229 ! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 213 230 ! ! Surface/top/bottom boundary condition on tke 214 231 ! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 215 232 ! 216 233 DO jj = 2, jpjm1 ! en(1) = rn_ebb taum / rau0 (min value rn_emin0) 217 234 DO ji = fs_2, fs_jpim1 ! vector opt. 218 en(ji,jj,1) = MAX( rn_emin0, zbbrau * taum(ji,jj) ) * tmask(ji,jj,1) 235 en(ji,jj,1) = MAX( rn_emin0, ( ( 1._wp - fr_i(ji,jj) ) * zbbrau + & 236 & fr_i(ji,jj) * zbbirau ) * taum(ji,jj) ) * tmask(ji,jj,1) 219 237 END DO 220 238 END DO … … 248 266 zetop = - 0.001875_wp * rCdU_top(ji,jj) * SQRT( ( zmsku*( ub(ji,jj,mikt(ji,jj))+ub(ji-1,jj,mikt(ji,jj)) ) )**2 & 249 267 & + ( zmskv*( vb(ji,jj,mikt(ji,jj))+vb(ji,jj-1,mikt(ji,jj)) ) )**2 ) 250 en(ji,jj,mikt(ji,jj)) = en(ji,jj,1) * tmask(ji,jj,1) & 268 en(ji,jj,mikt(ji,jj)) = en(ji,jj,1) * tmask(ji,jj,1) & 251 269 & + MAX( zetop, rn_emin ) * (1._wp - tmask(ji,jj,1)) * ssmask(ji,jj) 252 270 END DO … … 286 304 DO ji = fs_2, fs_jpim1 ! vector opt. 287 305 zus = zcof * SQRT( taum(ji,jj) ) ! Stokes drift 288 zfr_i(ji,jj) = ( 1._wp - 4._wp * fr_i(ji,jj) ) * zus * zus * zus * tmask(ji,jj,1) ! zus > 0. ok 289 IF (zfr_i(ji,jj) < 0. ) zfr_i(ji,jj) = 0. 306 zus3(ji,jj) = ( 1._wp - zice_fra(ji,jj) ) * zus * zus * zus * tmask(ji,jj,1) ! zus > 0. ok 290 307 END DO 291 308 END DO … … 293 310 DO jj = 2, jpjm1 294 311 DO ji = fs_2, fs_jpim1 ! vector opt. 295 IF ( z fr_i(ji,jj) /= 0. ) THEN312 IF ( zus3(ji,jj) /= 0. ) THEN 296 313 ! vertical velocity due to LC 297 314 IF ( pdepw(ji,jj,jk) - zhlc(ji,jj) < 0 .AND. wmask(ji,jj,jk) /= 0. ) THEN 298 315 ! ! vertical velocity due to LC 299 zwlc = rn_lc * SIN( rpi * pdepw(ji,jj,jk) / zhlc(ji,jj) ) ! warning: optimization: zus^3 is in zfr_i316 zwlc = rn_lc * SIN( rpi * pdepw(ji,jj,jk) / zhlc(ji,jj) ) 300 317 ! ! TKE Langmuir circulation source term 301 en(ji,jj,jk) = en(ji,jj,jk) + rdt * z fr_i(ji,jj) * ( zwlc * zwlc * zwlc ) / zhlc(ji,jj)318 en(ji,jj,jk) = en(ji,jj,jk) + rdt * zus3(ji,jj) * ( zwlc * zwlc * zwlc ) / zhlc(ji,jj) 302 319 ENDIF 303 320 ENDIF … … 399 416 400 417 IF( nn_etau == 1 ) THEN !* penetration below the mixed layer (rn_efr fraction) 401 DO jk = 2, jpkm1 ! rn_eice =0 ON below sea-ice, =4 OFF when ice fraction > 0.25418 DO jk = 2, jpkm1 ! nn_eice=0 : ON below sea-ice ; nn_eice>0 : partly OFF 402 419 DO jj = 2, jpjm1 403 420 DO ji = fs_2, fs_jpim1 ! vector opt. 404 421 en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -pdepw(ji,jj,jk) / htau(ji,jj) ) & 405 & * MAX(0.,1._wp - rn_eice *fr_i(ji,jj) )* wmask(ji,jj,jk) * tmask(ji,jj,1)422 & * ( 1._wp - zice_fra(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 406 423 END DO 407 424 END DO … … 412 429 jk = nmln(ji,jj) 413 430 en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -pdepw(ji,jj,jk) / htau(ji,jj) ) & 414 & * MAX(0.,1._wp - rn_eice *fr_i(ji,jj) )* wmask(ji,jj,jk) * tmask(ji,jj,1)431 & * ( 1._wp - zice_fra(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 415 432 END DO 416 433 END DO … … 425 442 zdif = rhftau_scl * MAX( 0._wp, zdif + rhftau_add ) ! apply some modifications... 426 443 en(ji,jj,jk) = en(ji,jj,jk) + zbbrau * zdif * EXP( -pdepw(ji,jj,jk) / htau(ji,jj) ) & 427 & * MAX(0.,1._wp - rn_eice *fr_i(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1)444 & * ( 1._wp - zice_fra(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 428 445 END DO 429 446 END DO … … 477 494 REAL(wp) :: zrn2, zraug, zcoef, zav ! local scalars 478 495 REAL(wp) :: zdku, zdkv, zsqen ! - - 479 REAL(wp) :: zemxl, zemlm, zemlp ! - -496 REAL(wp) :: zemxl, zemlm, zemlp, zmaxice ! - - 480 497 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zmxlm, zmxld ! 3D workspace 481 498 !!-------------------------------------------------------------------- … … 490 507 zmxlm(:,:,:) = rmxl_min 491 508 zmxld(:,:,:) = rmxl_min 492 ! 509 ! 493 510 IF( ln_mxl0 ) THEN ! surface mixing length = F(stress) : l=vkarmn*2.e5*taum/(rau0*g) 511 ! 494 512 zraug = vkarmn * 2.e5_wp / ( rau0 * grav ) 495 DO jj = 2, jpjm1 513 #if ! defined key_si3 && ! defined key_cice 514 DO jj = 2, jpjm1 ! No sea-ice 496 515 DO ji = fs_2, fs_jpim1 497 zmxlm(ji,jj,1) = MAX( rn_mxl0, zraug * taum(ji,jj) * tmask(ji,jj,1) ) 498 END DO 499 END DO 500 ELSE 516 zmxlm(ji,jj,1) = zraug * taum(ji,jj) * tmask(ji,jj,1) 517 END DO 518 END DO 519 #else 520 521 SELECT CASE( nn_mxlice ) ! Type of scaling under sea-ice 522 ! 523 CASE( 0 ) ! No scaling under sea-ice 524 DO jj = 2, jpjm1 525 DO ji = fs_2, fs_jpim1 526 zmxlm(ji,jj,1) = zraug * taum(ji,jj) * tmask(ji,jj,1) 527 END DO 528 END DO 529 ! 530 CASE( 1 ) ! scaling with constant sea-ice thickness 531 DO jj = 2, jpjm1 532 DO ji = fs_2, fs_jpim1 533 zmxlm(ji,jj,1) = ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + & 534 & fr_i(ji,jj) * rn_mxlice ) * tmask(ji,jj,1) 535 END DO 536 END DO 537 ! 538 CASE( 2 ) ! scaling with mean sea-ice thickness 539 DO jj = 2, jpjm1 540 DO ji = fs_2, fs_jpim1 541 #if defined key_si3 542 zmxlm(ji,jj,1) = ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + & 543 & fr_i(ji,jj) * hm_i(ji,jj) * 2._wp ) * tmask(ji,jj,1) 544 #elif defined key_cice 545 zmaxice = MAXVAL( h_i(ji,jj,:) ) 546 zmxlm(ji,jj,1) = ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + & 547 & fr_i(ji,jj) * zmaxice ) * tmask(ji,jj,1) 548 #endif 549 END DO 550 END DO 551 ! 552 CASE( 3 ) ! scaling with max sea-ice thickness 553 DO jj = 2, jpjm1 554 DO ji = fs_2, fs_jpim1 555 zmaxice = MAXVAL( h_i(ji,jj,:) ) 556 zmxlm(ji,jj,1) = ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + & 557 & fr_i(ji,jj) * zmaxice ) * tmask(ji,jj,1) 558 END DO 559 END DO 560 ! 561 END SELECT 562 #endif 563 ! 564 DO jj = 2, jpjm1 565 DO ji = fs_2, fs_jpim1 566 zmxlm(ji,jj,1) = MAX( rn_mxl0, zmxlm(ji,jj,1) ) 567 END DO 568 END DO 569 ! 570 ELSE 501 571 zmxlm(:,:,1) = rn_mxl0 502 572 ENDIF … … 643 713 INTEGER :: ios 644 714 !! 645 NAMELIST/namzdf_tke/ rn_ediff, rn_ediss , rn_ebb , rn_emin , & 646 & rn_emin0, rn_bshear, nn_mxl , ln_mxl0 , & 647 & rn_mxl0 , nn_pdl , ln_lc , rn_lc, & 648 & nn_etau , nn_htau , rn_efr , rn_eice 715 NAMELIST/namzdf_tke/ rn_ediff, rn_ediss , rn_ebb , rn_emin , & 716 & rn_emin0, rn_bshear, nn_mxl , ln_mxl0 , & 717 & rn_mxl0 , nn_mxlice, rn_mxlice, & 718 & nn_pdl , ln_lc , rn_lc, & 719 & nn_etau , nn_htau , rn_efr , nn_eice 649 720 !!---------------------------------------------------------------------- 650 721 ! … … 675 746 WRITE(numout,*) ' surface mixing length = F(stress) or not ln_mxl0 = ', ln_mxl0 676 747 WRITE(numout,*) ' surface mixing length minimum value rn_mxl0 = ', rn_mxl0 748 IF( ln_mxl0 ) THEN 749 WRITE(numout,*) ' type of scaling under sea-ice nn_mxlice = ', nn_mxlice 750 IF( nn_mxlice == 1 ) & 751 WRITE(numout,*) ' ice thickness when scaling under sea-ice rn_mxlice = ', rn_mxlice 752 SELECT CASE( nn_mxlice ) ! Type of scaling under sea-ice 753 CASE( 0 ) ; WRITE(numout,*) ' ==>>> No scaling under sea-ice' 754 CASE( 1 ) ; WRITE(numout,*) ' ==>>> scaling with constant sea-ice thickness' 755 CASE( 2 ) ; WRITE(numout,*) ' ==>>> scaling with mean sea-ice thickness' 756 CASE( 3 ) ; WRITE(numout,*) ' ==>>> scaling with max sea-ice thickness' 757 CASE DEFAULT 758 CALL ctl_stop( 'zdf_tke_init: wrong value for nn_mxlice, should be 0,1,2,3 or 4') 759 END SELECT 760 ENDIF 677 761 WRITE(numout,*) ' Langmuir cells parametrization ln_lc = ', ln_lc 678 762 WRITE(numout,*) ' coef to compute vertical velocity of LC rn_lc = ', rn_lc … … 680 764 WRITE(numout,*) ' type of tke penetration profile nn_htau = ', nn_htau 681 765 WRITE(numout,*) ' fraction of TKE that penetrates rn_efr = ', rn_efr 682 WRITE(numout,*) ' below sea-ice: =0 ON rn_eice = ', rn_eice 683 WRITE(numout,*) ' =4 OFF when ice fraction > 1/4 ' 766 WRITE(numout,*) ' langmuir & surface wave breaking under ice nn_eice = ', nn_eice 767 SELECT CASE( nn_eice ) 768 CASE( 0 ) ; WRITE(numout,*) ' ==>>> no impact of ice cover on langmuir & surface wave breaking' 769 CASE( 1 ) ; WRITE(numout,*) ' ==>>> weigthed by 1-TANH( fr_i(:,:) * 10 )' 770 CASE( 2 ) ; WRITE(numout,*) ' ==>>> weighted by 1-fr_i(:,:)' 771 CASE( 3 ) ; WRITE(numout,*) ' ==>>> weighted by 1-MIN( 1, 4 * fr_i(:,:) )' 772 CASE DEFAULT 773 CALL ctl_stop( 'zdf_tke_init: wrong value for nn_eice, should be 0,1,2, or 3') 774 END SELECT 684 775 IF( .NOT.ln_drg_OFF ) THEN 685 776 WRITE(numout,*)
Note: See TracChangeset
for help on using the changeset viewer.