Changeset 13249
- Timestamp:
- 2020-07-04T10:22:08+02:00 (4 years ago)
- Location:
- NEMO/branches/2020/r4.0-HEAD_r12713_clem_dan_fixcpl
- Files:
-
- 17 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2020/r4.0-HEAD_r12713_clem_dan_fixcpl/cfgs/AGRIF_DEMO/EXPREF/namelist_cfg
r12206 r13249 353 353 &namzdf_tke ! turbulent eddy kinetic dependent vertical diffusion (ln_zdftke =T) 354 354 !----------------------------------------------------------------------- 355 rn_eice = 0 ! below sea ice: =0 ON ; =4 OFF when ice fraction > 1/4356 355 / 357 356 !!====================================================================== -
NEMO/branches/2020/r4.0-HEAD_r12713_clem_dan_fixcpl/cfgs/ORCA2_ICE_PISCES/EXPREF/namelist_cfg
r12206 r13249 374 374 ! = 2 add a tke source just at the base of the ML 375 375 ! = 3 as = 1 applied on HF part of the stress (ln_cpl=T) 376 rn_eice = 0 ! below sea ice: =0 ON ; =4 OFF when ice fraction > 1/4377 376 / 378 377 !----------------------------------------------------------------------- -
NEMO/branches/2020/r4.0-HEAD_r12713_clem_dan_fixcpl/cfgs/SHARED/namelist_ref
r13006 r13249 681 681 ! 682 682 ln_drgimp = .true. ! implicit top/bottom friction flag 683 ln_drgice_imp = .false. ! implicit ice-ocean drag 683 684 / 684 685 !----------------------------------------------------------------------- … … 1059 1060 ! = 0 no scaling under sea-ice 1060 1061 ! = 1 scaling with constant sea-ice thickness 1061 ! = 2 1062 ! = 3 1062 ! = 2 scaling with mean sea-ice thickness ( only with SI3 sea-ice model ) 1063 ! = 3 scaling with maximum sea-ice thickness 1063 1064 rn_mxlice = 10. ! max constant ice thickness value when scaling under sea-ice ( nn_mxlice=1) 1064 1065 rn_mxl0 = 0.04 ! surface buoyancy lenght scale minimum value … … 1074 1075 ! = 0 constant 10 m length scale 1075 1076 ! = 1 0.5m at the equator to 30m poleward of 40 degrees 1076 rn_eice = 4 ! below sea ice: =0 ON ; =4 OFF when ice fraction > 1/4 1077 nn_eice = 1 ! attenutaion of langmuir & surface wave breaking under ice 1078 ! ! = 0 no impact of ice cover on langmuir & surface wave breaking 1079 ! ! = 1 weigthed by 1-TANH(10*fr_i) 1080 ! ! = 2 weighted by 1-fr_i 1081 ! ! = 3 weighted by 1-MIN(1,4*fr_i) 1077 1082 / 1078 1083 !----------------------------------------------------------------------- … … 1087 1092 rn_charn = 70000. ! Charnock constant for wb induced roughness length 1088 1093 rn_hsro = 0.02 ! Minimum surface roughness 1094 rn_hsri = 0.03 ! Ice-ocean roughness 1089 1095 rn_frac_hs = 1.3 ! Fraction of wave height as roughness (if nn_z0_met>1) 1090 1096 nn_z0_met = 2 ! Method for surface roughness computation (0/1/2/3) 1091 ! ! =3 requires ln_wave=T 1097 ! ! = 3 requires ln_wave=T 1098 nn_z0_ice = 1 ! attenutaion of surface wave breaking under ice 1099 ! ! = 0 no impact of ice cover 1100 ! ! = 1 roughness uses rn_hsri and is weigthed by 1-TANH(10*fr_i) 1101 ! ! = 2 roughness uses rn_hsri and is weighted by 1-fr_i 1102 ! ! = 3 roughness uses rn_hsri and is weighted by 1-MIN(1,4*fr_i) 1092 1103 nn_bc_surf = 1 ! surface condition (0/1=Dir/Neum) 1093 1104 nn_bc_bot = 1 ! bottom condition (0/1=Dir/Neum) -
NEMO/branches/2020/r4.0-HEAD_r12713_clem_dan_fixcpl/cfgs/SPITZ12/EXPREF/namelist_cfg
r12206 r13249 217 217 ln_loglayer = .true. ! logarithmic drag: Cd = vkarmn/log(z/z0) |U| 218 218 ln_drgimp = .true. ! implicit top/bottom friction flag 219 ln_drgice_imp = .true. ! implicit ice-ocean drag 219 220 / 220 221 !----------------------------------------------------------------------- … … 340 341 nn_havtb = 1 ! horizontal shape for avtb (=1) or not (=0) 341 342 / 343 !----------------------------------------------------------------------- 344 &namzdf_tke ! turbulent eddy kinetic dependent vertical diffusion (ln_zdftke =T) 345 !----------------------------------------------------------------------- 346 ln_mxl0 = .true. ! surface mixing length scale = F(wind stress) (T) or not (F) 347 nn_mxlice = 2 ! type of scaling under sea-ice 348 ! = 0 no scaling under sea-ice 349 ! = 1 scaling with constant sea-ice thickness 350 ! = 2 scaling with mean sea-ice thickness ( only with SI3 sea-ice model ) 351 ! = 3 scaling with maximum sea-ice thickness 352 nn_eice = 1 ! attenutaion of langmuir & surface wave breaking under ice 353 ! ! = 0 no impact of ice cover on langmuir & surface wave breaking 354 ! ! = 1 weigthed by 1-TANH(10*fr_i) 355 ! ! = 2 weighted by 1-fr_i 356 ! ! = 3 weighted by 1-MIN(1,4*fr_i) 357 / 342 358 !!====================================================================== 343 359 !! *** Diagnostics namelists *** !! -
NEMO/branches/2020/r4.0-HEAD_r12713_clem_dan_fixcpl/doc/namelists/namdrg
r10075 r13249 8 8 ! 9 9 ln_drgimp = .true. ! implicit top/bottom friction flag 10 ln_drgice_imp = .false. ! implicit ice-ocean drag 10 11 / -
NEMO/branches/2020/r4.0-HEAD_r12713_clem_dan_fixcpl/doc/namelists/namzdf_gls
r9355 r13249 13 13 nn_z0_met = 2 ! Method for surface roughness computation (0/1/2/3) 14 14 ! ! =3 requires ln_wave=T 15 nn_z0_ice = 1 ! attenutaion of surface wave breaking under ice 16 ! ! = 0 no impact of ice cover 17 ! ! = 1 roughness uses rn_hsri and is weigthed by 1-TANH(10*fr_i) 18 ! ! = 2 roughness uses rn_hsri and is weighted by 1-fr_i 19 ! ! = 3 roughness uses rn_hsri and is weighted by 1-MIN(1,4*fr_i) 15 20 nn_bc_surf = 1 ! surface condition (0/1=Dir/Neum) 16 21 nn_bc_bot = 1 ! bottom condition (0/1=Dir/Neum) -
NEMO/branches/2020/r4.0-HEAD_r12713_clem_dan_fixcpl/doc/namelists/namzdf_tke
r10075 r13249 26 26 ! = 0 constant 10 m length scale 27 27 ! = 1 0.5m at the equator to 30m poleward of 40 degrees 28 rn_eice = 4 ! below sea ice: =0 ON ; =4 OFF when ice fraction > 1/4 28 nn_eice = 1 ! attenutaion of langmuir & surface wave breaking under ice 29 ! ! = 0 no impact of ice cover on langmuir & surface wave breaking 30 ! ! = 1 weigthed by 1-TANH(10*fr_i) 31 ! ! = 2 weighted by 1-fr_i 32 ! ! = 3 weighted by 1-MIN(1,4*fr_i) 29 33 / -
NEMO/branches/2020/r4.0-HEAD_r12713_clem_dan_fixcpl/src/ICE/iceupdate.F90
r12785 r13249 26 26 USE icectl ! sea-ice: control prints 27 27 USE bdy_oce , ONLY : ln_bdy 28 USE zdfdrg , ONLY : ln_drgice_imp 28 29 ! 29 30 USE in_out_manager ! I/O manager … … 321 322 REAL(wp) :: zat_u, zutau_ice, zu_t, zmodt ! local scalar 322 323 REAL(wp) :: zat_v, zvtau_ice, zv_t, zrhoco ! - - 324 REAL(wp) :: zflagi ! - - 323 325 !!--------------------------------------------------------------------- 324 326 IF( ln_timing ) CALL timing_start('ice_update_tau') … … 353 355 ! 354 356 ! !== every ocean time-step ==! 357 IF ( ln_drgice_imp ) THEN 358 ! Save drag with right sign to update top drag in the ocean implicit friction 359 rCdU_ice(:,:) = -r1_rau0 * tmod_io(:,:) * at_i(:,:) * tmask(:,:,1) 360 zflagi = 0._wp 361 ELSE 362 zflagi = 1._wp 363 ENDIF 355 364 ! 356 365 DO jj = 2, jpjm1 !* update the stress WITHOUT an ice-ocean rotation angle … … 362 371 & / MAX( 1.0_wp , tmask(ji,jj,1) + tmask(ji ,jj+1,1) ) 363 372 ! ! linearized quadratic drag formulation 364 zutau_ice = 0.5_wp * ( tmod_io(ji,jj) + tmod_io(ji+1,jj) ) * ( u_ice(ji,jj) - pu_oce(ji,jj) )365 zvtau_ice = 0.5_wp * ( tmod_io(ji,jj) + tmod_io(ji,jj+1) ) * ( v_ice(ji,jj) - pv_oce(ji,jj) )373 zutau_ice = 0.5_wp * ( tmod_io(ji,jj) + tmod_io(ji+1,jj) ) * ( u_ice(ji,jj) - zflagi * pu_oce(ji,jj) ) 374 zvtau_ice = 0.5_wp * ( tmod_io(ji,jj) + tmod_io(ji,jj+1) ) * ( v_ice(ji,jj) - zflagi * pv_oce(ji,jj) ) 366 375 ! ! stresses at the ocean surface 367 376 utau(ji,jj) = ( 1._wp - zat_u ) * utau_oce(ji,jj) + zat_u * zutau_ice -
NEMO/branches/2020/r4.0-HEAD_r12713_clem_dan_fixcpl/src/OCE/DYN/dynnxt.F90
r12366 r13249 34 34 USE dynspg_ts ! surface pressure gradient: split-explicit scheme 35 35 USE domvvl ! variable volume 36 USE bdy_oce , ONLY: ln_bdy36 USE bdy_oce , ONLY : ln_bdy 37 37 USE bdydta ! ocean open boundary conditions 38 38 USE bdydyn ! ocean open boundary conditions … … 48 48 USE prtctl ! Print control 49 49 USE timing ! Timing 50 USE zdfdrg , ONLY : ln_drgice_imp, rCdU_top 50 51 #if defined key_agrif 51 52 USE agrif_oce_interp … … 99 100 REAL(wp) :: zve3a, zve3n, zve3b, zvf, z1_2dt ! - - 100 101 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zue, zve 102 REAL(wp), ALLOCATABLE, DIMENSION(:,:) :: zutau, zvtau 101 103 REAL(wp), ALLOCATABLE, DIMENSION(:,:,:) :: ze3u_f, ze3v_f, zua, zva 102 104 !!---------------------------------------------------------------------- … … 354 356 ENDIF 355 357 ! 358 IF ( iom_use("utau") ) THEN 359 IF ( ln_drgice_imp.OR.ln_isfcav ) THEN 360 ALLOCATE(zutau(jpi,jpj)) 361 DO jj = 2, jpjm1 362 DO ji = 2, jpim1 363 jk = miku(ji,jj) 364 zutau(ji,jj) = utau(ji,jj) & 365 & + 0.5_wp * rau0 * (rCdU_top(ji+1,jj)+rCdU_top(ji,jj)) * ua(ji,jj,jk) 366 END DO 367 END DO 368 CALL lbc_lnk( 'dynnxt' , zutau, 'U', -1.) 369 CALL iom_put( "utau", zutau(:,:) ) 370 DEALLOCATE(zutau) 371 ELSE 372 CALL iom_put( "utau", utau(:,:) ) 373 ENDIF 374 ENDIF 375 ! 376 IF ( iom_use("vtau") ) THEN 377 IF ( ln_drgice_imp.OR.ln_isfcav ) THEN 378 ALLOCATE(zvtau(jpi,jpj)) 379 DO jj = 2, jpjm1 380 DO ji = 2, jpim1 381 jk = mikv(ji,jj) 382 zvtau(ji,jj) = vtau(ji,jj) & 383 & + 0.5_wp * rau0 * (rCdU_top(ji,jj+1)+rCdU_top(ji,jj)) * va(ji,jj,jk) 384 END DO 385 END DO 386 CALL lbc_lnk( 'dynnxt' , zvtau, 'V', -1.) 387 CALL iom_put( "vtau", zvtau(:,:) ) 388 DEALLOCATE(zvtau) 389 ELSE 390 CALL iom_put( "vtau", vtau(:,:) ) 391 ENDIF 392 ENDIF 393 ! 356 394 IF(ln_ctl) CALL prt_ctl( tab3d_1=un, clinfo1=' nxt - Un: ', mask1=umask, & 357 395 & tab3d_2=vn, clinfo2=' Vn: ' , mask2=vmask ) -
NEMO/branches/2020/r4.0-HEAD_r12713_clem_dan_fixcpl/src/OCE/DYN/dynspg_ts.F90
r12816 r13249 1465 1465 ! !== Set the barotropic drag coef. ==! 1466 1466 ! 1467 IF( ln_isfcav ) THEN ! top+bottom friction (ocean cavities)1467 IF( ln_isfcav.OR.ln_drgice_imp ) THEN ! top+bottom friction (ocean cavities) 1468 1468 1469 1469 DO jj = 2, jpjm1 … … 1528 1528 ! !== TOP stress contribution from baroclinic velocities ==! (no W/D case) 1529 1529 ! 1530 IF( ln_isfcav ) THEN1530 IF( ln_isfcav.OR.ln_drgice_imp ) THEN 1531 1531 ! 1532 1532 IF( ln_bt_fw ) THEN ! FORWARD integration: use NOW top baroclinic velocity -
NEMO/branches/2020/r4.0-HEAD_r12713_clem_dan_fixcpl/src/OCE/DYN/dynzdf.F90
r12292 r13249 141 141 END DO 142 142 END DO 143 IF( ln_isfcav ) THEN ! Ocean cavities (ISF)143 IF( ln_isfcav.OR.ln_drgice_imp ) THEN ! Ocean cavities (ISF) 144 144 DO jj = 2, jpjm1 145 145 DO ji = fs_2, fs_jpim1 ! vector opt. … … 258 258 END DO 259 259 END DO 260 IF ( ln_isfcav ) THEN ! top friction (always implicit)260 IF ( ln_isfcav.OR.ln_drgice_imp ) THEN ! top friction (always implicit) 261 261 DO jj = 2, jpjm1 262 262 DO ji = 2, jpim1 … … 423 423 END DO 424 424 END DO 425 IF ( ln_isfcav ) THEN425 IF ( ln_isfcav.OR.ln_drgice_imp ) THEN 426 426 DO jj = 2, jpjm1 427 427 DO ji = 2, jpim1 -
NEMO/branches/2020/r4.0-HEAD_r12713_clem_dan_fixcpl/src/OCE/SBC/sbc_ice.F90
r12811 r13249 70 70 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: wndm_ice !: wind speed module at T-point [m/s] 71 71 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: sstfrz !: sea surface freezing temperature [degC] 72 REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: rCdU_ice !: ice-ocean drag at T-point (<0) [m/s] 72 73 #endif 73 74 … … 132 133 & qemp_ice(jpi,jpj) , qevap_ice(jpi,jpj,jpl) , qemp_oce (jpi,jpj) , & 133 134 & qns_oce (jpi,jpj) , qsr_oce (jpi,jpj) , emp_oce (jpi,jpj) , & 134 & emp_ice (jpi,jpj) , sstfrz (jpi,jpj) , STAT= ierr(2) )135 & emp_ice (jpi,jpj) , sstfrz (jpi,jpj) , rCdU_ice (jpi,jpj) , STAT= ierr(2) ) 135 136 #endif 136 137 -
NEMO/branches/2020/r4.0-HEAD_r12713_clem_dan_fixcpl/src/OCE/SBC/sbcmod.F90
r12276 r13249 564 564 ENDIF 565 565 ! 566 CALL iom_put( "utau", utau ) ! i-wind stress (stress can be updated at each time step in sea-ice)567 CALL iom_put( "vtau", vtau ) ! j-wind stress568 !569 566 IF(ln_ctl) THEN ! print mean trends (used for debugging) 570 567 CALL prt_ctl(tab2d_1=fr_i , clinfo1=' fr_i - : ', mask1=tmask ) -
NEMO/branches/2020/r4.0-HEAD_r12713_clem_dan_fixcpl/src/OCE/ZDF/zdfdrg.F90
r11536 r13249 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_OFF, ln_lin, ln_non_lin, ln_loglayer, ln_drgimp 234 NAMELIST/namdrg/ ln_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/branches/2020/r4.0-HEAD_r12713_clem_dan_fixcpl/src/OCE/ZDF/zdfgls.F90
r11536 r13249 53 53 INTEGER :: nn_bc_bot ! bottom boundary condition (=0/1) 54 54 INTEGER :: nn_z0_met ! Method for surface roughness computation 55 INTEGER :: nn_z0_ice ! Roughness accounting for sea ice 55 56 INTEGER :: nn_stab_func ! stability functions G88, KC or Canuto (=0/1/2) 56 57 INTEGER :: nn_clos ! closure 0/1/2/3 MY82/k-eps/k-w/gen … … 61 62 REAL(wp) :: rn_crban ! Craig and Banner constant for surface breaking waves mixing 62 63 REAL(wp) :: rn_hsro ! Minimum surface roughness 64 REAL(wp) :: rn_hsri ! Ice ocean roughness 63 65 REAL(wp) :: rn_frac_hs ! Fraction of wave height as surface roughness (if nn_z0_met > 1) 64 66 … … 150 152 REAL(wp), DIMENSION(jpi,jpj) :: zflxs ! Turbulence fluxed induced by internal waves 151 153 REAL(wp), DIMENSION(jpi,jpj) :: zhsro ! Surface roughness (surface waves) 154 REAL(wp), DIMENSION(jpi,jpj) :: zice_fra ! Tapering of wave breaking under sea ice 152 155 REAL(wp), DIMENSION(jpi,jpj,jpk) :: eb ! tke at time before 153 156 REAL(wp), DIMENSION(jpi,jpj,jpk) :: hmxl_b ! mixing length at time before … … 165 168 ustar2_bot (:,:) = 0._wp 166 169 170 SELECT CASE ( nn_z0_ice ) 171 CASE( 0 ) ; zice_fra(:,:) = 0._wp 172 CASE( 1 ) ; zice_fra(:,:) = TANH( fr_i(:,:) * 10._wp ) 173 CASE( 2 ) ; zice_fra(:,:) = fr_i(:,:) 174 CASE( 3 ) ; zice_fra(:,:) = MIN( 4._wp * fr_i(:,:) , 1._wp ) 175 END SELECT 176 167 177 ! Compute surface, top and bottom friction at T-points 168 178 DO jj = 2, jpjm1 … … 206 216 END SELECT 207 217 ! 218 ! adapt roughness where there is sea ice 219 zhsro(:,:) = ( (1._wp-zice_fra(:,:)) * zhsro(:,:) + zice_fra(:,:) * rn_hsri )*tmask(:,:,1) + (1._wp - tmask(:,:,1))*rn_hsro 220 ! 208 221 DO jk = 2, jpkm1 !== Compute dissipation rate ==! 209 222 DO jj = 1, jpjm1 … … 300 313 CASE ( 0 ) ! Dirichlet boundary condition (set e at k=1 & 2) 301 314 ! First level 302 en (:,:,1) = MAX( rn_emin , rc02r * ustar2_surf(:,:) * (1._wp + rsbc_tke1)**r2_3 )315 en (:,:,1) = MAX( rn_emin , rc02r * ustar2_surf(:,:) * (1._wp + (1._wp-zice_fra(:,:))*rsbc_tke1)**r2_3 ) 303 316 zd_lw(:,:,1) = en(:,:,1) 304 317 zd_up(:,:,1) = 0._wp … … 306 319 ! 307 320 ! One level below 308 en (:,:,2) = MAX( rc02r * ustar2_surf(:,:) * ( 1._wp + rsbc_tke1 * ((zhsro(:,:)+gdepw_n(:,:,2))&309 & / zhsro(:,:) )**(1.5_wp*ra_sf) )**(2._wp/3._wp) 321 en (:,:,2) = MAX( rc02r * ustar2_surf(:,:) * ( 1._wp + (1._wp-zice_fra(:,:))*rsbc_tke1 * ((zhsro(:,:)+gdepw_n(:,:,2)) & 322 & / zhsro(:,:) )**(1.5_wp*ra_sf) )**(2._wp/3._wp) , rn_emin ) 310 323 zd_lw(:,:,2) = 0._wp 311 324 zd_up(:,:,2) = 0._wp … … 316 329 ! 317 330 ! Dirichlet conditions at k=1 318 en (:,:,1) = MAX( rc02r * ustar2_surf(:,:) * (1._wp + rsbc_tke1)**r2_3 , rn_emin )331 en (:,:,1) = MAX( rc02r * ustar2_surf(:,:) * (1._wp + (1._wp-zice_fra(:,:))*rsbc_tke1)**r2_3 , rn_emin ) 319 332 zd_lw(:,:,1) = en(:,:,1) 320 333 zd_up(:,:,1) = 0._wp … … 326 339 zd_lw(:,:,2) = 0._wp 327 340 zkar (:,:) = (rl_sf + (vkarmn-rl_sf)*(1.-EXP(-rtrans*gdept_n(:,:,1)/zhsro(:,:)) )) 328 zflxs(:,:) = rsbc_tke2 * ustar2_surf(:,:)**1.5_wp * zkar(:,:) &341 zflxs(:,:) = rsbc_tke2 * (1._wp-zice_fra(:,:)) * ustar2_surf(:,:)**1.5_wp * zkar(:,:) & 329 342 & * ( ( zhsro(:,:)+gdept_n(:,:,1) ) / zhsro(:,:) )**(1.5_wp*ra_sf) 330 343 !!gm why not : * ( 1._wp + gdept_n(:,:,1) / zhsro(:,:) )**(1.5_wp*ra_sf) … … 577 590 zkar (:,:) = rl_sf + (vkarmn-rl_sf)*(1._wp-EXP(-rtrans*gdept_n(:,:,1)/zhsro(:,:) )) ! Lengh scale slope 578 591 zdep (:,:) = ((zhsro(:,:) + gdept_n(:,:,1)) / zhsro(:,:))**(rmm*ra_sf) 579 zflxs(:,:) = (rnn + rsbc_tke1 * (rnn + rmm*ra_sf) * zdep(:,:))*(1._wp + rsbc_tke1*zdep(:,:))**(2._wp*rmm/3._wp-1_wp) 592 zflxs(:,:) = (rnn + (1._wp-zice_fra(:,:))*rsbc_tke1 * (rnn + rmm*ra_sf) * zdep(:,:)) & 593 & *(1._wp + (1._wp-zice_fra(:,:))*rsbc_tke1*zdep(:,:))**(2._wp*rmm/3._wp-1_wp) 580 594 zdep (:,:) = rsbc_psi1 * (zwall_psi(:,:,1)*p_avm(:,:,1)+zwall_psi(:,:,2)*p_avm(:,:,2)) * & 581 595 & ustar2_surf(:,:)**rmm * zkar(:,:)**rnn * (zhsro(:,:) + gdept_n(:,:,1))**(rnn-1.) … … 850 864 REAL(wp):: zcr ! local scalar 851 865 !! 852 NAMELIST/namzdf_gls/rn_emin, rn_epsmin, ln_length_lim, &853 & rn_clim_galp, ln_sigpsi, rn_hsro, 854 & rn_crban, rn_charn, rn_frac_hs, &855 & nn_bc_surf, nn_bc_bot, nn_z0_met, 866 NAMELIST/namzdf_gls/rn_emin, rn_epsmin, ln_length_lim, & 867 & rn_clim_galp, ln_sigpsi, rn_hsro, rn_hsri, & 868 & rn_crban, rn_charn, rn_frac_hs, & 869 & nn_bc_surf, nn_bc_bot, nn_z0_met, nn_z0_ice, & 856 870 & nn_stab_func, nn_clos 857 871 !!---------------------------------------------------------- … … 881 895 WRITE(numout,*) ' Charnock coefficient rn_charn = ', rn_charn 882 896 WRITE(numout,*) ' Surface roughness formula nn_z0_met = ', nn_z0_met 897 WRITE(numout,*) ' surface wave breaking under ice nn_z0_ice = ', nn_z0_ice 898 SELECT CASE( nn_z0_ice ) 899 CASE( 0 ) ; WRITE(numout,*) ' ==>>> no impact of ice cover on surface wave breaking' 900 CASE( 1 ) ; WRITE(numout,*) ' ==>>> roughness uses rn_hsri and is weigthed by 1-TANH( fr_i(:,:) * 10 )' 901 CASE( 2 ) ; WRITE(numout,*) ' ==>>> roughness uses rn_hsri and is weighted by 1-fr_i(:,:)' 902 CASE( 3 ) ; WRITE(numout,*) ' ==>>> roughness uses rn_hsri and is weighted by 1-MIN( 1, 4 * fr_i(:,:) )' 903 CASE DEFAULT 904 CALL ctl_stop( 'zdf_gls_init: wrong value for nn_z0_ice, should be 0,1,2, or 3') 905 END SELECT 883 906 WRITE(numout,*) ' Wave height frac. (used if nn_z0_met=2) rn_frac_hs = ', rn_frac_hs 884 907 WRITE(numout,*) ' Stability functions nn_stab_func = ', nn_stab_func 885 908 WRITE(numout,*) ' Type of closure nn_clos = ', nn_clos 886 909 WRITE(numout,*) ' Surface roughness (m) rn_hsro = ', rn_hsro 910 WRITE(numout,*) ' Ice-ocean roughness (used if nn_z0_ice/=0) rn_hsri = ', rn_hsri 887 911 WRITE(numout,*) 888 912 WRITE(numout,*) ' Namelist namdrg_top/_bot: used values:' -
NEMO/branches/2020/r4.0-HEAD_r12713_clem_dan_fixcpl/src/OCE/ZDF/zdfphy.F90
r11536 r13249 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/branches/2020/r4.0-HEAD_r12713_clem_dan_fixcpl/src/OCE/ZDF/zdftke.F90
r13006 r13249 83 83 INTEGER :: nn_htau ! type of tke profile of penetration (=0/1) 84 84 REAL(wp) :: rn_efr ! fraction of TKE surface value which penetrates in the ocean 85 REAL(wp) :: rn_eice ! =0 ON below sea-ice, =4 OFF when ice fraction > 1/486 85 LOGICAL :: ln_lc ! Langmuir cells (LC) as a source term of TKE or not 87 86 REAL(wp) :: rn_lc ! coef to compute vertical velocity of Langmuir cells 87 INTEGER :: nn_eice ! attenutaion of langmuir & surface wave breaking under ice (=0/1/2/3) 88 88 89 89 REAL(wp) :: ri_cri ! critic Richardson number (deduced from rn_ediff and rn_ediss values) … … 199 199 REAL(wp), DIMENSION(:,:,:) , INTENT(in ) :: p_avm, p_avt ! vertical eddy viscosity & diffusivity (w-points) 200 200 ! 201 INTEGER :: ji, jj, jk ! dummy loop arguments201 INTEGER :: ji, jj, jk ! dummy loop arguments 202 202 REAL(wp) :: zetop, zebot, zmsku, zmskv ! local scalars 203 203 REAL(wp) :: zrhoa = 1.22 ! Air density kg/m3 204 204 REAL(wp) :: zcdrag = 1.5e-3 ! drag coefficient 205 REAL(wp) :: zbbrau, z ri! local scalars206 REAL(wp) :: zfact1, zfact2, zfact3 ! - 207 REAL(wp) :: ztx2 , zty2 , zcof ! - 208 REAL(wp) :: ztau , zdif ! - 209 REAL(wp) :: zus , zwlc , zind ! - 210 REAL(wp) :: zzd_up, zzd_lw ! - 205 REAL(wp) :: zbbrau, zbbirau, zri ! local scalars 206 REAL(wp) :: zfact1, zfact2, zfact3 ! - - 207 REAL(wp) :: ztx2 , zty2 , zcof ! - - 208 REAL(wp) :: ztau , zdif ! - - 209 REAL(wp) :: zus , zwlc , zind ! - - 210 REAL(wp) :: zzd_up, zzd_lw ! - - 211 211 INTEGER , DIMENSION(jpi,jpj) :: imlc 212 REAL(wp), DIMENSION(jpi,jpj) :: z hlc, zfr_i212 REAL(wp), DIMENSION(jpi,jpj) :: zice_fra, zhlc, zus3 213 213 REAL(wp), DIMENSION(jpi,jpj,jpk) :: zpelc, zdiag, zd_up, zd_lw 214 214 !!-------------------------------------------------------------------- 215 215 ! 216 zbbrau = rn_ebb / rau0 ! Local constant initialisation 217 zfact1 = -.5_wp * rdt 218 zfact2 = 1.5_wp * rdt * rn_ediss 219 zfact3 = 0.5_wp * rn_ediss 216 zbbrau = rn_ebb / rau0 ! Local constant initialisation 217 zbbirau = 3.75_wp / rau0 218 zfact1 = -0.5_wp * rdt 219 zfact2 = 1.5_wp * rdt * rn_ediss 220 zfact3 = 0.5_wp * rn_ediss 221 ! 222 ! ice fraction considered for attenuation of langmuir & wave breaking 223 SELECT CASE ( nn_eice ) 224 CASE( 0 ) ; zice_fra(:,:) = 0._wp 225 CASE( 1 ) ; zice_fra(:,:) = TANH( fr_i(:,:) * 10._wp ) 226 CASE( 2 ) ; zice_fra(:,:) = fr_i(:,:) 227 CASE( 3 ) ; zice_fra(:,:) = MIN( 4._wp * fr_i(:,:) , 1._wp ) 228 END SELECT 220 229 ! 221 230 ! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 222 231 ! ! Surface/top/bottom boundary condition on tke 223 232 ! !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 224 233 ! 225 234 DO jj = 2, jpjm1 ! en(1) = rn_ebb taum / rau0 (min value rn_emin0) 226 235 DO ji = fs_2, fs_jpim1 ! vector opt. 227 en(ji,jj,1) = MAX( rn_emin0, zbbrau * taum(ji,jj) ) * tmask(ji,jj,1) 236 en(ji,jj,1) = MAX( rn_emin0, ( ( 1._wp - fr_i(ji,jj) ) * zbbrau + & 237 & fr_i(ji,jj) * zbbirau ) * taum(ji,jj) ) * tmask(ji,jj,1) 228 238 END DO 229 239 END DO … … 257 267 zetop = - 0.001875_wp * rCdU_top(ji,jj) * SQRT( ( zmsku*( ub(ji,jj,mikt(ji,jj))+ub(ji-1,jj,mikt(ji,jj)) ) )**2 & 258 268 & + ( zmskv*( vb(ji,jj,mikt(ji,jj))+vb(ji,jj-1,mikt(ji,jj)) ) )**2 ) 259 en(ji,jj,mikt(ji,jj)) = en(ji,jj,1) * tmask(ji,jj,1) & 269 en(ji,jj,mikt(ji,jj)) = en(ji,jj,1) * tmask(ji,jj,1) & 260 270 & + MAX( zetop, rn_emin ) * (1._wp - tmask(ji,jj,1)) * ssmask(ji,jj) 261 271 END DO … … 295 305 DO ji = fs_2, fs_jpim1 ! vector opt. 296 306 zus = zcof * SQRT( taum(ji,jj) ) ! Stokes drift 297 zfr_i(ji,jj) = ( 1._wp - 4._wp * fr_i(ji,jj) ) * zus * zus * zus * tmask(ji,jj,1) ! zus > 0. ok 298 IF (zfr_i(ji,jj) < 0. ) zfr_i(ji,jj) = 0. 307 zus3(ji,jj) = ( 1._wp - zice_fra(ji,jj) ) * zus * zus * zus * tmask(ji,jj,1) ! zus > 0. ok 299 308 END DO 300 309 END DO … … 302 311 DO jj = 2, jpjm1 303 312 DO ji = fs_2, fs_jpim1 ! vector opt. 304 IF ( z fr_i(ji,jj) /= 0. ) THEN313 IF ( zus3(ji,jj) /= 0. ) THEN 305 314 ! vertical velocity due to LC 306 315 IF ( pdepw(ji,jj,jk) - zhlc(ji,jj) < 0 .AND. wmask(ji,jj,jk) /= 0. ) THEN 307 316 ! ! vertical velocity due to LC 308 zwlc = rn_lc * SIN( rpi * pdepw(ji,jj,jk) / zhlc(ji,jj) ) ! warning: optimization: zus^3 is in zfr_i317 zwlc = rn_lc * SIN( rpi * pdepw(ji,jj,jk) / zhlc(ji,jj) ) 309 318 ! ! TKE Langmuir circulation source term 310 en(ji,jj,jk) = en(ji,jj,jk) + rdt * z fr_i(ji,jj) * ( zwlc * zwlc * zwlc ) / zhlc(ji,jj)319 en(ji,jj,jk) = en(ji,jj,jk) + rdt * zus3(ji,jj) * ( zwlc * zwlc * zwlc ) / zhlc(ji,jj) 311 320 ENDIF 312 321 ENDIF … … 408 417 409 418 IF( nn_etau == 1 ) THEN !* penetration below the mixed layer (rn_efr fraction) 410 DO jk = 2, jpkm1 ! rn_eice =0 ON below sea-ice, =4 OFF when ice fraction > 0.25419 DO jk = 2, jpkm1 ! nn_eice=0 : ON below sea-ice ; nn_eice>0 : partly OFF 411 420 DO jj = 2, jpjm1 412 421 DO ji = fs_2, fs_jpim1 ! vector opt. 413 422 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)423 & * ( 1._wp - zice_fra(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 415 424 END DO 416 425 END DO … … 421 430 jk = nmln(ji,jj) 422 431 en(ji,jj,jk) = en(ji,jj,jk) + rn_efr * en(ji,jj,1) * EXP( -pdepw(ji,jj,jk) / htau(ji,jj) ) & 423 & * MAX(0.,1._wp - rn_eice *fr_i(ji,jj) )* wmask(ji,jj,jk) * tmask(ji,jj,1)432 & * ( 1._wp - zice_fra(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 424 433 END DO 425 434 END DO … … 434 443 zdif = rhftau_scl * MAX( 0._wp, zdif + rhftau_add ) ! apply some modifications... 435 444 en(ji,jj,jk) = en(ji,jj,jk) + zbbrau * zdif * EXP( -pdepw(ji,jj,jk) / htau(ji,jj) ) & 436 & * MAX(0.,1._wp - rn_eice *fr_i(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1)445 & * ( 1._wp - zice_fra(ji,jj) ) * wmask(ji,jj,jk) * tmask(ji,jj,1) 437 446 END DO 438 447 END DO … … 499 508 zmxlm(:,:,:) = rmxl_min 500 509 zmxld(:,:,:) = rmxl_min 501 ! 502 IF( ln_mxl0 ) THEN ! surface mixing length = F(stress) : l=vkarmn*2.e5*taum/(rau0*g)510 ! 511 IF( ln_mxl0 ) THEN ! surface mixing length = F(stress) : l=vkarmn*2.e5*taum/(rau0*g) 503 512 ! 504 513 zraug = vkarmn * 2.e5_wp / ( rau0 * grav ) 505 514 #if ! defined key_si3 && ! defined key_cice 506 DO jj = 2, jpjm1 515 DO jj = 2, jpjm1 ! No sea-ice 507 516 DO ji = fs_2, fs_jpim1 508 517 zmxlm(ji,jj,1) = zraug * taum(ji,jj) * tmask(ji,jj,1) … … 510 519 END DO 511 520 #else 521 512 522 SELECT CASE( nn_mxlice ) ! Type of scaling under sea-ice 513 523 ! … … 519 529 END DO 520 530 ! 521 CASE( 1 ) 531 CASE( 1 ) ! scaling with constant sea-ice thickness 522 532 DO jj = 2, jpjm1 523 533 DO ji = fs_2, fs_jpim1 524 zmxlm(ji,jj,1) = ( ( 1. - fr_i(ji,jj) ) * zraug * taum(ji,jj) + fr_i(ji,jj) * rn_mxlice ) * tmask(ji,jj,1) 534 zmxlm(ji,jj,1) = ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + & 535 & fr_i(ji,jj) * rn_mxlice ) * tmask(ji,jj,1) 525 536 END DO 526 537 END DO 527 538 ! 528 CASE( 2 ) 539 CASE( 2 ) ! scaling with mean sea-ice thickness 529 540 DO jj = 2, jpjm1 530 541 DO ji = fs_2, fs_jpim1 531 542 #if defined key_si3 532 zmxlm(ji,jj,1) = ( ( 1. - fr_i(ji,jj) ) * zraug * taum(ji,jj) + fr_i(ji,jj) * hm_i(ji,jj) * 2. ) * tmask(ji,jj,1) 543 zmxlm(ji,jj,1) = ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + & 544 & fr_i(ji,jj) * hm_i(ji,jj) * 2._wp ) * tmask(ji,jj,1) 533 545 #elif defined key_cice 534 546 zmaxice = MAXVAL( h_i(ji,jj,:) ) 535 zmxlm(ji,jj,1) = ( ( 1. - fr_i(ji,jj) ) * zraug * taum(ji,jj) + fr_i(ji,jj) * zmaxice ) * tmask(ji,jj,1) 547 zmxlm(ji,jj,1) = ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + & 548 & fr_i(ji,jj) * zmaxice ) * tmask(ji,jj,1) 536 549 #endif 537 550 END DO 538 551 END DO 539 552 ! 540 CASE( 3 ) 553 CASE( 3 ) ! scaling with max sea-ice thickness 541 554 DO jj = 2, jpjm1 542 555 DO ji = fs_2, fs_jpim1 543 556 zmaxice = MAXVAL( h_i(ji,jj,:) ) 544 zmxlm(ji,jj,1) = ( ( 1. - fr_i(ji,jj) ) * zraug * taum(ji,jj) + fr_i(ji,jj) * zmaxice ) * tmask(ji,jj,1) 557 zmxlm(ji,jj,1) = ( ( 1._wp - fr_i(ji,jj) ) * zraug * taum(ji,jj) + & 558 & fr_i(ji,jj) * zmaxice ) * tmask(ji,jj,1) 545 559 END DO 546 560 END DO … … 704 718 & rn_mxl0 , nn_mxlice, rn_mxlice, & 705 719 & nn_pdl , ln_drg , ln_lc , rn_lc, & 706 & nn_etau , nn_htau , rn_efr , rn_eice720 & nn_etau , nn_htau , rn_efr , nn_eice 707 721 !!---------------------------------------------------------------------- 708 722 ! … … 737 751 IF( nn_mxlice == 1 ) & 738 752 WRITE(numout,*) ' ice thickness when scaling under sea-ice rn_mxlice = ', rn_mxlice 753 SELECT CASE( nn_mxlice ) ! Type of scaling under sea-ice 754 CASE( 0 ) ; WRITE(numout,*) ' ==>>> No scaling under sea-ice' 755 CASE( 1 ) ; WRITE(numout,*) ' ==>>> scaling with constant sea-ice thickness' 756 CASE( 2 ) ; WRITE(numout,*) ' ==>>> scaling with mean sea-ice thickness' 757 CASE( 3 ) ; WRITE(numout,*) ' ==>>> scaling with max sea-ice thickness' 758 CASE DEFAULT 759 CALL ctl_stop( 'zdf_tke_init: wrong value for nn_mxlice, should be 0,1,2,3 or 4') 760 END SELECT 739 761 ENDIF 740 762 WRITE(numout,*) ' top/bottom friction forcing flag ln_drg = ', ln_drg … … 744 766 WRITE(numout,*) ' type of tke penetration profile nn_htau = ', nn_htau 745 767 WRITE(numout,*) ' fraction of TKE that penetrates rn_efr = ', rn_efr 746 WRITE(numout,*) ' below sea-ice: =0 ON rn_eice = ', rn_eice 747 WRITE(numout,*) ' =4 OFF when ice fraction > 1/4 ' 768 WRITE(numout,*) ' langmuir & surface wave breaking under ice nn_eice = ', nn_eice 769 SELECT CASE( nn_eice ) 770 CASE( 0 ) ; WRITE(numout,*) ' ==>>> no impact of ice cover on langmuir & surface wave breaking' 771 CASE( 1 ) ; WRITE(numout,*) ' ==>>> weigthed by 1-TANH( fr_i(:,:) * 10 )' 772 CASE( 2 ) ; WRITE(numout,*) ' ==>>> weighted by 1-fr_i(:,:)' 773 CASE( 3 ) ; WRITE(numout,*) ' ==>>> weighted by 1-MIN( 1, 4 * fr_i(:,:) )' 774 CASE DEFAULT 775 CALL ctl_stop( 'zdf_tke_init: wrong value for nn_eice, should be 0,1,2, or 3') 776 END SELECT 748 777 IF( ln_drg ) THEN 749 778 WRITE(numout,*)
Note: See TracChangeset
for help on using the changeset viewer.