- Timestamp:
- 2017-04-05T17:12:32+02:00 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/UKMO/r6232_HZG_WAVE-coupling/NEMOGCM/NEMO/OPA_SRC/SBC/sbcwave.F90
r7853 r7878 42 42 LOGICAL, PUBLIC :: cpl_sdrfty = .FALSE. 43 43 LOGICAL, PUBLIC :: cpl_wper = .FALSE. 44 LOGICAL, PUBLIC :: cpl_wfreq = .FALSE. 44 45 LOGICAL, PUBLIC :: cpl_wnum = .FALSE. 45 46 LOGICAL, PUBLIC :: cpl_tauoc = .FALSE. … … 51 52 INTEGER :: jp_hsw ! index of significant wave hight (m) at T-point 52 53 INTEGER :: jp_wmp ! index of mean wave period (s) at T-point 54 INTEGER :: jp_wfr ! index of wave peak frequency (s^-1) at T-point 53 55 54 56 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_cd ! structure of input fields (file informations, fields read) Drag Coefficient … … 59 61 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: cdn_wave !: 60 62 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: hsw, wmp, wnum !: 63 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: wfreq !: 61 64 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: rn_crban !: Craig and Banner constant for surface breaking waves mixing 62 65 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: tauoc_wave !: … … 99 102 CALL wrk_alloc( jpi,jpj, zk_t, zk_u, zk_v, zu0_sd, zv0_sd ) 100 103 ! 101 zfac = 2.0_wp * rpi / 16.0_wp 102 DO jj = 1, jpj ! exp. wave number at t-point (Eq. (19) in Breivick et al. (2014) ) 103 DO ji = 1, jpi 104 ! Stokes drift velocity estimated from Hs and Tmean 105 ztransp = zfac * hsw(ji,jj)*hsw(ji,jj) / MAX( wmp(ji,jj), 0.0000001_wp ) 106 ! Stokes surface speed 107 tsd2d(ji,jj) = SQRT( ut0sd(ji,jj)*ut0sd(ji,jj) + vt0sd(ji,jj)*vt0sd(ji,jj)) 108 ! Wavenumber scale 109 zk_t(ji,jj) = ABS( tsd2d(ji,jj) ) / MAX( ABS( 5.97_wp*ztransp ), 0.0000001_wp ) 110 END DO 111 END DO 112 DO jj = 1, jpjm1 ! exp. wave number & Stokes drift velocity at u- & v-points 113 DO ji = 1, jpim1 114 zk_u(ji,jj) = 0.5_wp * ( zk_t(ji,jj) + zk_t(ji+1,jj) ) 115 zk_v(ji,jj) = 0.5_wp * ( zk_t(ji,jj) + zk_t(ji,jj+1) ) 116 ! 117 zu0_sd(ji,jj) = 0.5_wp * ( ut0sd(ji,jj) + ut0sd(ji+1,jj) ) 118 zv0_sd(ji,jj) = 0.5_wp * ( vt0sd(ji,jj) + vt0sd(ji,jj+1) ) 119 END DO 120 END DO 121 ! 122 ! !== horizontal Stokes Drift 3D velocity ==! 123 DO jk = 1, jpkm1 124 DO jj = 2, jpjm1 125 DO ji = 2, jpim1 126 zdep_u = 0.5_wp * ( gdept_n(ji,jj,jk) + gdept_n(ji+1,jj,jk) ) 127 zdep_v = 0.5_wp * ( gdept_n(ji,jj,jk) + gdept_n(ji,jj+1,jk) ) 128 ! 129 zkh_u = zk_u(ji,jj) * zdep_u ! k * depth 130 zkh_v = zk_v(ji,jj) * zdep_v 131 ! ! Depth attenuation 132 zda_u = EXP( -2.0_wp*zkh_u ) / ( 1.0_wp + 8.0_wp*zkh_u ) 133 zda_v = EXP( -2.0_wp*zkh_v ) / ( 1.0_wp + 8.0_wp*zkh_v ) 104 ! select parameterization for the calculation of vertical Stokes drift 105 SELECT CASE ( nn_sdrift ) 106 ! 107 CASE ( jp_breivik ) 108 zfac = 2.0_wp * rpi / 16.0_wp 109 DO jj = 1, jpj ! exp. wave number at t-point (Eq. (19) in Breivick et al. (2014) ) 110 DO ji = 1, jpi 111 ! Stokes drift velocity estimated from Hs and Tmean 112 ztransp = zfac * hsw(ji,jj)*hsw(ji,jj) / MAX( wmp(ji,jj), 0.0000001_wp ) 113 ! Stokes surface speed 114 tsd2d(ji,jj) = SQRT( ut0sd(ji,jj)*ut0sd(ji,jj) + vt0sd(ji,jj)*vt0sd(ji,jj)) 115 ! Wavenumber scale 116 zk_t(ji,jj) = ABS( tsd2d(ji,jj) ) / MAX( ABS( 5.97_wp*ztransp ), 0.0000001_wp ) 117 END DO 118 END DO 119 DO jj = 1, jpjm1 ! exp. wave number & Stokes drift velocity at u- & v-points 120 DO ji = 1, jpim1 121 zk_u(ji,jj) = 0.5_wp * ( zk_t(ji,jj) + zk_t(ji+1,jj) ) 122 zk_v(ji,jj) = 0.5_wp * ( zk_t(ji,jj) + zk_t(ji,jj+1) ) 134 123 ! 135 usd(ji,jj,jk) = zda_u * zk_u(ji,jj) * umask(ji,jj,jk) 136 vsd(ji,jj,jk) = zda_v * zk_v(ji,jj) * vmask(ji,jj,jk) 137 END DO 138 END DO 139 END DO 124 zu0_sd(ji,jj) = 0.5_wp * ( ut0sd(ji,jj) + ut0sd(ji+1,jj) ) 125 zv0_sd(ji,jj) = 0.5_wp * ( vt0sd(ji,jj) + vt0sd(ji,jj+1) ) 126 END DO 127 END DO 128 ! 129 ! !== horizontal Stokes Drift 3D velocity ==! 130 DO jk = 1, jpkm1 131 DO jj = 2, jpjm1 132 DO ji = 2, jpim1 133 zdep_u = 0.5_wp * ( gdept_n(ji,jj,jk) + gdept_n(ji+1,jj,jk) ) 134 zdep_v = 0.5_wp * ( gdept_n(ji,jj,jk) + gdept_n(ji,jj+1,jk) ) 135 ! 136 zkh_u = zk_u(ji,jj) * zdep_u ! k * depth 137 zkh_v = zk_v(ji,jj) * zdep_v 138 ! ! Depth attenuation 139 zda_u = EXP( -2.0_wp*zkh_u ) / ( 1.0_wp + 8.0_wp*zkh_u ) 140 zda_v = EXP( -2.0_wp*zkh_v ) / ( 1.0_wp + 8.0_wp*zkh_v ) 141 ! 142 usd(ji,jj,jk) = zda_u * zu0_sd(ji,jj) * umask(ji,jj,jk) 143 vsd(ji,jj,jk) = zda_v * zv0_sd(ji,jj) * vmask(ji,jj,jk) 144 END DO 145 END DO 146 END DO 147 CASE ( jp_phillips ) 148 DO jj = 1, jpjm1 ! Peak wavenumber & Stokes drift velocity at u- & v-points 149 DO ji = 1, jpim1 150 zk_u(ji,jj) = 0.5_wp * ( wfreq(ji,jj)*wfreq(ji,jj) + wfreq(ji+1,jj)*wfreq(ji+1,jj) ) / grav 151 zk_v(ji,jj) = 0.5_wp * ( wfreq(ji,jj)*wfreq(ji,jj) + wfreq(ji,jj+1)*wfreq(ji,jj+1) ) / grav 152 ! 153 zu0_sd(ji,jj) = 0.5_wp * ( ut0sd(ji,jj) + ut0sd(ji+1,jj) ) 154 zv0_sd(ji,jj) = 0.5_wp * ( vt0sd(ji,jj) + vt0sd(ji,jj+1) ) 155 END DO 156 END DO 157 ! 158 ! !== horizontal Stokes Drift 3D velocity ==! 159 DO jk = 1, jpkm1 160 DO jj = 2, jpjm1 161 DO ji = 2, jpim1 162 zdep_u = 0.5_wp * ( gdept_n(ji,jj,jk) + gdept_n(ji+1,jj,jk) ) 163 zdep_v = 0.5_wp * ( gdept_n(ji,jj,jk) + gdept_n(ji,jj+1,jk) ) 164 ! 165 zkh_u = zk_u(ji,jj) * zdep_u ! k * depth 166 zkh_v = zk_v(ji,jj) * zdep_v 167 ! ! Depth attenuation: beta=1 for Phillips 168 zda_u = EXP( -2.0_wp*zkh_u ) - 1.0*SQRT(2.0*rpi*zkh_u) * ERFC(SQRT(2.0*zkh_u)) 169 zda_v = EXP( -2.0_wp*zkh_v ) - 1.0*SQRT(2.0*rpi*zkh_v) * ERFC(SQRT(2.0*zkh_v)) 170 ! 171 usd(ji,jj,jk) = zda_u * zu0_sd(ji,jj) * umask(ji,jj,jk) 172 vsd(ji,jj,jk) = zda_v * zv0_sd(ji,jj) * vmask(ji,jj,jk) 173 END DO 174 END DO 175 END DO 176 END SELECT 177 140 178 CALL lbc_lnk( usd(:,:,:), 'U', vsd(:,:,:), 'V', -1. ) 141 179 ! … … 227 265 CALL fld_read( kt, nn_fsbc, sf_phioc ) ! read wave to ocean energy from external forcing 228 266 rn_crban(:,:) = 29.0 * sf_phioc(1)%fnow(:,:,1) ! ! Alfa is phioc*sqrt(rau0/zrhoa) : rau0=water density, zhroa= air density 229 WHERE( rn_crban < 10.0 ) rn_crban = 10.0230 WHERE( rn_crban > 300.0 ) rn_crban = 300.0267 WHERE( rn_crban < -1000.0 ) rn_crban = 0.0 268 WHERE( rn_crban > 1000.0 ) rn_crban = 0.0 231 269 ENDIF 232 270 … … 245 283 WHERE( wmp < 0.0 ) wmp = 0.0 246 284 ENDIF 285 IF( jp_wfr > 0 ) THEN 286 wfreq(:,:) = sf_sd(jp_wfr)%fnow(:,:,1) ! Peak wave frequency 287 WHERE( wfreq < 0.0 ) wfreq = 0.001 288 WHERE( wfreq > 100.0 ) wfreq = 0.001 289 ENDIF 247 290 IF( jp_usd > 0 ) THEN 248 291 ut0sd(:,:) = sf_sd(jp_usd)%fnow(:,:,1) ! 2D zonal Stokes Drift at T point … … 265 308 ! !== Computation of the 3d Stokes Drift ==! 266 309 ! 267 IF( jpfld == 4 ) CALL sbc_stokes() ! Calculate only if required fields are read 268 ! ! In coupled wave model-NEMO case the call is done after coupling 310 IF( (nn_sdrift==jp_breivik .AND. jp_hsw>0 .AND. jp_wmp>0 .AND. jp_usd>0 .AND. jp_vsd>0) .OR. & 311 (nn_sdrift==jp_phillips .AND. jp_wfr>0 .AND. jp_usd>0 .AND. jp_vsd>0) ) & 312 CALL sbc_stokes() ! Calculate only if required fields are read 313 ! ! In coupled wave model-NEMO case the call is done after coupling 269 314 ! 270 315 ENDIF … … 292 337 CHARACTER(len=100) :: cn_dir ! Root directory for location of drag coefficient files 293 338 TYPE(FLD_N), ALLOCATABLE, DIMENSION(:) :: slf_i ! array of namelist informations on the fields to read 294 TYPE(FLD_N) :: sn_cdg, sn_usd, sn_vsd, sn_phioc, & 295 & sn_hsw, sn_wmp, sn_wnum, sn_tauoc ! informations about the fields to be read 296 ! 297 NAMELIST/namsbc_wave/ sn_cdg, cn_dir, sn_usd, sn_vsd, sn_hsw, sn_wmp, sn_wnum, sn_tauoc, sn_phioc 339 TYPE(FLD_N) :: sn_cdg, sn_usd, sn_vsd, sn_phioc, & 340 & sn_hsw, sn_wmp, sn_wfr, sn_wnum , & 341 & sn_tauoc ! informations about the fields to be read 342 ! 343 NAMELIST/namsbc_wave/ sn_cdg, cn_dir, sn_usd, sn_vsd, sn_hsw, sn_wmp, sn_wfr, sn_wnum, sn_tauoc, sn_phioc 298 344 !!--------------------------------------------------------------------- 299 345 ! … … 345 391 IF( ln_sdw ) THEN ! Find out how many fields have to be read from file if not coupled 346 392 jpfld=0 347 jp_usd=0 ; jp_vsd=0 ; jp_hsw=0 ; jp_wmp=0 393 jp_usd=0 ; jp_vsd=0 ; jp_hsw=0 ; jp_wmp=0 ; jp_wfr=0 348 394 IF( .NOT. cpl_sdrftx ) THEN 349 395 jpfld = jpfld + 1 … … 361 407 jpfld = jpfld + 1 362 408 jp_wmp = jpfld 409 ENDIF 410 IF( .NOT. cpl_wfreq ) THEN 411 jpfld = jpfld + 1 412 jp_wfr = jpfld 363 413 ENDIF 364 414 … … 370 420 IF( jp_hsw > 0 ) slf_i(jp_hsw) = sn_hsw 371 421 IF( jp_wmp > 0 ) slf_i(jp_wmp) = sn_wmp 422 IF( jp_wfr > 0 ) slf_i(jp_wfr) = sn_wfr 372 423 ALLOCATE( sf_sd(jpfld), STAT=ierror ) !* allocate and fill sf_sd with stokes drift 373 424 IF( ierror > 0 ) CALL ctl_stop( 'STOP', 'sbc_wave_init: unable to allocate sf_sd structure' ) … … 382 433 ALLOCATE( usd (jpi,jpj,jpk), vsd (jpi,jpj,jpk), wsd(jpi,jpj,jpk) ) 383 434 ALLOCATE( hsw (jpi,jpj) , wmp (jpi,jpj) ) 435 ALLOCATE( wfreq (jpi,jpj) ) 384 436 ALLOCATE( ut0sd(jpi,jpj) , vt0sd(jpi,jpj) ) 385 437 ALLOCATE( div_sd(jpi,jpj) )
Note: See TracChangeset
for help on using the changeset viewer.