Changeset 7878 for branches/UKMO/r6232_HZG_WAVE-coupling/NEMOGCM/NEMO
- Timestamp:
- 2017-04-05T17:12:32+02:00 (7 years ago)
- Location:
- branches/UKMO/r6232_HZG_WAVE-coupling/NEMOGCM/NEMO/OPA_SRC/SBC
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/UKMO/r6232_HZG_WAVE-coupling/NEMOGCM/NEMO/OPA_SRC/SBC/sbc_oce.F90
r7854 r7878 71 71 LOGICAL , PUBLIC :: ln_stcor !: true if Stokes-Coriolis term is used 72 72 INTEGER , PUBLIC :: nn_drag ! type of formula to calculate wind stress from wind components 73 INTEGER , PUBLIC :: nn_sdrift ! type of parameterization to calculate vertical Stokes drift 73 74 ! 74 75 LOGICAL , PUBLIC :: ln_icebergs !: Icebergs … … 104 105 INTEGER, PUBLIC, PARAMETER :: jp_const = 2 ! standard formulation with constant drag coefficient 105 106 INTEGER, PUBLIC, PARAMETER :: jp_mcore = 3 ! momentum calculated from core forcing fields 107 108 !!---------------------------------------------------------------------- 109 !! Stokes drift parameterization 110 !!---------------------------------------------------------------------- 111 INTEGER, PUBLIC, PARAMETER :: jp_breivik = 0 ! Breivik 2015: v_z=v_0*[exp(2*k*z)/(1-8*k*z)] 112 INTEGER, PUBLIC, PARAMETER :: jp_phillips = 1 ! Phillips: v_z=v_o*[exp(2*k*z)-beta*sqrt(-2*k*pi*z)*erfc(sqrt(-2*k*z))] 106 113 107 114 !!---------------------------------------------------------------------- -
branches/UKMO/r6232_HZG_WAVE-coupling/NEMOGCM/NEMO/OPA_SRC/SBC/sbccpl.F90
r7854 r7878 115 115 INTEGER, PARAMETER :: jpr_tauoc = 50 ! Stress fraction adsorbed by waves 116 116 INTEGER, PARAMETER :: jpr_wdrag = 51 ! Neutral surface drag coefficient 117 INTEGER, PARAMETER :: jprcv = 51 ! total number of fields received 117 INTEGER, PARAMETER :: jpr_wfreq = 52 ! Wave peak frequency 118 INTEGER, PARAMETER :: jprcv = 52 ! total number of fields received 118 119 119 120 INTEGER, PARAMETER :: jps_fice = 1 ! ice fraction sent to the atmosphere … … 167 168 TYPE(FLD_C) :: sn_snd_ifrac, sn_snd_crtw, sn_snd_wlev 168 169 ! Received from waves 169 TYPE(FLD_C) :: sn_rcv_hsig,sn_rcv_phioc,sn_rcv_sdrfx,sn_rcv_sdrfy,sn_rcv_wper,sn_rcv_wnum,sn_rcv_tauoc,sn_rcv_wdrag 170 TYPE(FLD_C) :: sn_rcv_hsig,sn_rcv_phioc,sn_rcv_sdrfx,sn_rcv_sdrfy,sn_rcv_wper, & 171 sn_rcv_wfreq,sn_rcv_wnum,sn_rcv_tauoc,sn_rcv_wdrag 170 172 ! Other namelist parameters ! 171 173 INTEGER :: nn_cplmodel ! Maximum number of models to/from which NEMO is potentialy sending/receiving data … … 242 244 & sn_rcv_w10m, sn_rcv_taumod, sn_rcv_tau , sn_rcv_dqnsdt, sn_rcv_qsr, & 243 245 & sn_snd_ifrac, sn_snd_crtw , sn_snd_wlev , sn_rcv_hsig , sn_rcv_phioc , & 244 & sn_rcv_sdrfx, sn_rcv_sdrfy, sn_rcv_wper , sn_rcv_wnum , sn_rcv_tauoc , & 245 & sn_rcv_wdrag, sn_rcv_qns , sn_rcv_emp , sn_rcv_rnf , sn_rcv_cal , & 246 & sn_rcv_iceflx,sn_rcv_co2 , nn_cplmodel , ln_usecplmask, sn_rcv_mslp 246 & sn_rcv_sdrfx, sn_rcv_sdrfy, sn_rcv_wper , sn_rcv_wnum , sn_rcv_wfreq, & 247 & sn_rcv_tauoc, sn_rcv_wdrag, sn_rcv_qns , sn_rcv_emp , sn_rcv_rnf, & 248 & sn_rcv_cal , sn_rcv_iceflx, sn_rcv_co2 , sn_rcv_mslp , nn_cplmodel, & 249 & ln_usecplmask 247 250 !!--------------------------------------------------------------------- 248 251 ! … … 291 294 WRITE(numout,*)' Mean wave period = ', TRIM(sn_rcv_wper%cldes ), ' (', TRIM(sn_rcv_wper%clcat ), ')' 292 295 WRITE(numout,*)' Mean wave number = ', TRIM(sn_rcv_wnum%cldes ), ' (', TRIM(sn_rcv_wnum%clcat ), ')' 296 WRITE(numout,*)' Wave peak frequency = ', TRIM(sn_rcv_wfreq%cldes ), ' (', TRIM(sn_rcv_wfreq%clcat ), ')' 293 297 WRITE(numout,*)' Stress frac adsorbed by waves = ', TRIM(sn_rcv_tauoc%cldes ), ' (', TRIM(sn_rcv_tauoc%clcat ), ')' 294 298 WRITE(numout,*)' Neutral surf drag coefficient = ', TRIM(sn_rcv_wdrag%cldes ), ' (', TRIM(sn_rcv_wdrag%clcat ), ')' … … 559 563 cpl_wper = .TRUE. 560 564 ENDIF 565 srcv(jpr_wfreq)%clname = 'O_WFreq' ! wave peak frequency 566 IF( TRIM(sn_rcv_wfreq%cldes ) == 'coupled' ) THEN 567 srcv(jpr_wfreq)%laction = .TRUE. 568 cpl_wfreq = .TRUE. 569 ENDIF 561 570 srcv(jpr_wnum)%clname = 'O_WNum' ! mean wave number 562 571 IF( TRIM(sn_rcv_wnum%cldes ) == 'coupled' ) THEN … … 1182 1191 ! 1183 1192 ! ! ========================= ! 1193 ! ! Wave peak frequency ! 1194 ! ! ========================= ! 1195 IF( srcv(jpr_wfreq)%laction ) wfreq(:,:) = frcv(jpr_wfreq)%z3(:,:,1) 1196 ! 1197 ! ! ========================= ! 1184 1198 ! ! Vertical mixing Qiao ! 1185 1199 ! ! ========================= ! … … 1188 1202 ! Calculate the 3D Stokes drift both in coupled and not fully uncoupled mode 1189 1203 IF( srcv(jpr_sdrftx)%laction .OR. srcv(jpr_sdrfty)%laction .OR. srcv(jpr_wper)%laction & 1190 .OR. srcv(jpr_hsig)%laction) &1204 .OR. srcv(jpr_hsig)%laction .OR. srcv(jpr_wfreq)%laction) & 1191 1205 CALL sbc_stokes() 1192 1206 ENDIF -
branches/UKMO/r6232_HZG_WAVE-coupling/NEMOGCM/NEMO/OPA_SRC/SBC/sbcmod.F90
r7854 r7878 90 90 & ln_ssr , nn_isf , nn_fwb, ln_cdgw , ln_wave , ln_sdw , & 91 91 & ln_tauoc , ln_stcor , nn_lsm, nn_limflx , nn_components, ln_cpl , & 92 & ln_phioc , ln_wavcpl , nn_drag 92 & ln_phioc , ln_wavcpl , nn_drag, nn_sdrift 93 93 INTEGER :: ios 94 94 INTEGER :: ierr, ierr0, ierr1, ierr2, ierr3, jpm … … 236 236 IF ( ln_cdgw .AND. ln_flx .AND. nn_drag==3 ) & 237 237 CALL ctl_stop( 'The chosen nn_drag for momentum calculation in direct forcing must be 0, 1, or 2') 238 IF ( ln_sdw .AND. .NOT.(nn_sdrift==jp_breivik .OR. nn_sdrift==jp_phillips) ) & 239 CALL ctl_stop( 'The chosen nn_sdrift for vertical Stokes drift must be 0, or 1') 238 240 ELSE 239 241 IF ( ln_cdgw .OR. ln_sdw .OR. ln_tauoc .OR. ln_stcor .OR. ln_phioc ) & -
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.