Changeset 9115
- Timestamp:
- 2017-12-18T15:06:42+01:00 (7 years ago)
- Location:
- branches/2017/dev_merge_2017
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2017/dev_merge_2017/DOC/TexFiles/Bibliography/Biblio.bib
r9052 r9115 545 545 URL = {http://www.geosci-model-dev.net/8/1285/2015/}, 546 546 DOI = {10.5194/gmd-8-1285-2015} 547 } 548 549 @ARTICLE{Breivik_al_OM2016, 550 AUTHOR = {{\O}yvind Breivik and Jean-Raymond Bidlot and Peter A.E.M. Janssen}, 551 YEAR = {2016}, 552 TITLE = "{A Stokes drift approximation based on the Phillips spectrum}", 553 JOURNAL = {OM}, 554 VOLUME = {100}, 555 DOI = {10.1016/j.ocemod.2016.01.005}, 556 PAGES = {49--56, arXiv:1601.08092} 547 557 } 548 558 … … 2122 2132 author = {S Levitus }, 2123 2133 pages = {173 pp} 2134 } 2135 2136 @ARTICLE{Li_al_OM2017}, 2137 AUTHOR = {Q Li and B Fox-Kemper and {\O} Breivik and A Webb}, 2138 YEAR = {2017}, 2139 TITLE = {Statistical Models of Global Langmuir Mixing}, 2140 JOURNAL = {OM}, 2141 VOLUME = {113}, 2142 ISSUE = {May}, 2143 PAGES = {95--114}, 2144 DOI = {10.1016/j.ocemod.2017.03.016} 2124 2145 } 2125 2146 -
branches/2017/dev_merge_2017/NEMOGCM/NEMO/OPA_SRC/LBC/lbc_lnk_multi_generic.h90
r9093 r9115 1 #if defined DIM_2d 2 # define ARRAY_TYPE(i,j,k,l) REAL(wp), DIMENSION(i,j) 3 # define PTR_TYPE TYPE(PTR_2D) 4 # define PTR_ptab pt2d 1 #if defined DIM_2d 2 # define ARRAY_TYPE(i,j,k,l) REAL(wp), DIMENSION(i,j) 3 # define PTR_TYPE TYPE(PTR_2D) 4 # define PTR_ptab pt2d 5 5 #endif 6 6 #if defined DIM_3d -
branches/2017/dev_merge_2017/NEMOGCM/NEMO/OPA_SRC/SBC/sbc_oce.F90
r9033 r9115 83 83 !! Stokes drift parametrization definition 84 84 !!---------------------------------------------------------------------- 85 INTEGER , PUBLIC, PARAMETER :: jp_breivik = 0 ! Breivik 2015: v_z=v_0*[exp(2*k*z)/(1-8*k*z)] 86 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))] 87 INTEGER , PUBLIC, PARAMETER :: jp_peakfr = 2 ! Phillips using the peak wave number read from wave model instead of the inverse depth scale 85 INTEGER , PUBLIC, PARAMETER :: jp_breivik_2014 = 0 !: Breivik 2014: v_z=v_0*[exp(2*k*z)/(1-8*k*z)] 86 INTEGER , PUBLIC, PARAMETER :: jp_li_2017 = 1 !: Li et al 2017: Stokes drift based on Phillips spectrum (Breivik 2016) 87 ! with depth averaged profile 88 INTEGER , PUBLIC, PARAMETER :: jp_peakfr = 2 !: Li et al 2017: using the peak wave number read from wave model instead 89 ! of the inverse depth scale 90 LOGICAL , PUBLIC :: ll_st_bv2014 = .FALSE. ! logical indicator, .true. if Breivik 2014 parameterisation is active. 91 LOGICAL , PUBLIC :: ll_st_li2017 = .FALSE. ! logical indicator, .true. if Li 2017 parameterisation is active. 92 LOGICAL , PUBLIC :: ll_st_bv_li = .FALSE. ! logical indicator, .true. if either Breivik or Li parameterisation is active. 93 LOGICAL , PUBLIC :: ll_st_peakfr = .FALSE. ! logical indicator, .true. if using Li 2017 with peak wave number 88 94 89 95 !!---------------------------------------------------------------------- -
branches/2017/dev_merge_2017/NEMOGCM/NEMO/OPA_SRC/SBC/sbcmod.F90
r9033 r9115 163 163 ! 164 164 IF( ln_sdw ) THEN 165 IF( .NOT.(nn_sdrift==jp_breivik .OR. nn_sdrift==jp_phillips.OR. nn_sdrift==jp_peakfr) ) &165 IF( .NOT.(nn_sdrift==jp_breivik_2014 .OR. nn_sdrift==jp_li_2017 .OR. nn_sdrift==jp_peakfr) ) & 166 166 CALL ctl_stop( 'The chosen nn_sdrift for Stokes drift vertical velocity must be 0, 1, or 2' ) 167 167 ENDIF 168 ll_st_bv2014 = ( nn_sdrift==jp_breivik_2014 ) 169 ll_st_li2017 = ( nn_sdrift==jp_li_2017 ) 170 ll_st_bv_li = ( ll_st_bv2014 .OR. ll_st_li2017 ) 171 ll_st_peakfr = ( nn_sdrift==jp_peakfr ) 168 172 IF( ln_tauwoc .AND. ln_tauw ) & 169 173 CALL ctl_stop( 'More than one method for modifying the ocean stress has been selected ', & -
branches/2017/dev_merge_2017/NEMOGCM/NEMO/OPA_SRC/SBC/sbcwave.F90
r9098 r9115 45 45 LOGICAL, PUBLIC :: cpl_wfreq = .FALSE. 46 46 LOGICAL, PUBLIC :: cpl_wnum = .FALSE. 47 LOGICAL, PUBLIC :: cpl_tauwoc 47 LOGICAL, PUBLIC :: cpl_tauwoc = .FALSE. 48 48 LOGICAL, PUBLIC :: cpl_tauw = .FALSE. 49 49 LOGICAL, PUBLIC :: cpl_wdrag = .FALSE. … … 59 59 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_sd ! structure of input fields (file informations, fields read) Stokes Drift 60 60 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_wn ! structure of input fields (file informations, fields read) wave number for Qiao 61 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_tauwoc 61 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_tauwoc ! structure of input fields (file informations, fields read) normalized wave stress into the ocean 62 62 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_tauw ! structure of input fields (file informations, fields read) ocean stress components from wave model 63 63 … … 100 100 REAL(wp) :: zstokes_psi_u_bot, zstokes_psi_v_bot 101 101 REAL(wp) :: zdep_u, zdep_v, zkh_u, zkh_v 102 REAL(wp), DIMENSION(:,:) , POINTER :: zk_t, zk_u, zk_v, zu0_sd, zv0_sd ! 2D workspace 103 REAL(wp), DIMENSION(:,:) , POINTER :: zstokes_psi_u_top, zstokes_psi_v_top ! 2D workspace 104 REAL(wp), DIMENSION(:,:,:), POINTER :: ze3divh ! 3D workspace 105 !!--------------------------------------------------------------------- 106 ! 107 CALL wrk_alloc( jpi,jpj,jpk, ze3divh ) 108 CALL wrk_alloc( jpi,jpj, zk_t, zk_u, zk_v, zu0_sd, zv0_sd ) 109 CALL wrk_alloc( jpi,jpj, zstokes_psi_u_top, zstokes_psi_v_top) 102 REAL(wp), DIMENSION(:,:) , ALLOCATABLE :: zk_t, zk_u, zk_v, zu0_sd, zv0_sd ! 2D workspace 103 REAL(wp), DIMENSION(:,:) , ALLOCATABLE :: zstokes_psi_u_top, zstokes_psi_v_top ! 2D workspace 104 REAL(wp), DIMENSION(:,:,:), ALLOCATABLE :: ze3divh ! 3D workspace 105 !!--------------------------------------------------------------------- 106 ! 107 ALLOCATE( ze3divh(jpi,jpj,jpk) ) 108 ALLOCATE( zk_t(jpi,jpj), zk_u(jpi,jpj), zk_v(jpi,jpj), zu0_sd(jpi,jpj), zv0_sd(jpi,jpj) ) 110 109 ! 111 110 ! select parameterization for the calculation of vertical Stokes drift 112 111 ! exp. wave number at t-point 113 IF( nn_sdrift==jp_breivik .OR. nn_sdrift==jp_phillips ) THEN ! (Eq. (19) in Breivick et al. (2014) )112 IF( ll_st_bv_li ) THEN ! (Eq. (19) in Breivik et al. (2014) ) 114 113 zfac = 2.0_wp * rpi / 16.0_wp 115 114 DO jj = 1, jpj … … 132 131 END DO 133 132 END DO 134 ELSE IF( nn_sdrift==jp_peakfr ) THEN ! peak wave number calculated from the peak frequency received by the wave model133 ELSE IF( ll_st_peakfr ) THEN ! peak wave number calculated from the peak frequency received by the wave model 135 134 DO jj = 1, jpjm1 136 135 DO ji = 1, jpim1 … … 145 144 ! 146 145 ! !== horizontal Stokes Drift 3D velocity ==! 147 IF( nn_sdrift==jp_breivik) THEN146 IF( ll_st_bv2014 ) THEN 148 147 DO jk = 1, jpkm1 149 148 DO jj = 2, jpjm1 … … 163 162 END DO 164 163 END DO 165 ELSE IF( nn_sdrift==jp_phillips .OR. nn_sdrift==jp_peakfr ) THEN 164 ELSE IF( ll_st_li2017 .OR. ll_st_peakfr ) THEN 165 ALLOCATE( zstokes_psi_u_top(jpi,jpj), zstokes_psi_v_top(jpi,jpj) ) 166 DO jj = 1, jpjm1 ! exp. wave number & Stokes drift velocity at u- & v-points 167 DO ji = 1, jpim1 168 zstokes_psi_u_top(ji,jj) = 0._wp 169 zstokes_psi_v_top(ji,jj) = 0._wp 170 END DO 171 END DO 166 172 DO jk = 1, jpkm1 167 173 DO jj = 2, jpjm1 168 174 DO ji = 2, jpim1 169 zdep_u = 0.5_wp * ( gdept_n(ji,jj,jk) + gdept_n(ji+1,jj,jk) ) 170 zdep_v = 0.5_wp * ( gdept_n(ji,jj,jk) + gdept_n(ji,jj+1,jk) ) 171 ! 172 zkh_u = zk_u(ji,jj) * zdep_u ! k * depth 173 zkh_v = zk_v(ji,jj) * zdep_v 174 ! ! Depth attenuation 175 zda_u = EXP( -2.0_wp*zkh_u ) - SQRT(2.0_wp*rpi*zkh_u) * ERFC(SQRT(2.0_wp*zkh_u)) 176 zda_v = EXP( -2.0_wp*zkh_v ) - SQRT(2.0_wp*rpi*zkh_v) * ERFC(SQRT(2.0_wp*zkh_v)) 175 zbot_u = 0.5_wp * ( gdepw_n(ji,jj,jk+1) + gdepw_n(ji+1,jj,jk+1) ) 176 zbot_v = 0.5_wp * ( gdepw_n(ji,jj,jk+1) + gdepw_n(ji,jj+1,jk+1) ) 177 zkb_u = 2.0_wp * zk_u(ji,jj) * zbot_u ! 2k * bottom depth 178 zkb_v = 2.0_wp * zk_v(ji,jj) * zbot_v ! 2k * bottom depth 179 ! 180 zke3_u = MAX(1.e-8_wp, 2.0_wp * zk_u(ji,jj) * e3u_n(ji,jj,jk)) ! 2k * thickness 181 zke3_v = MAX(1.e-8_wp, 2.0_wp * zk_v(ji,jj) * e3v_n(ji,jj,jk)) ! 2k * thickness 182 183 ! Depth attenuation .... do u component first.. 184 zdepth = zkb_u 185 zsqrt_depth = SQRT(zdepth) 186 zexp_depth = EXP(-zdepth) 187 zstokes_psi_u_bot = 1.0_wp - zexp_depth & 188 & - z_two_thirds * ( zsqrtpi*zsqrt_depth*zdepth*ERFC(zsqrt_depth) & 189 & + 1.0_wp - (1.0_wp + zdepth)*zexp_depth ) 190 zda_u = ( zstokes_psi_u_bot - zstokes_psi_u_top(ji,jj) ) / zke3_u 191 zstokes_psi_u_top(ji,jj) = zstokes_psi_u_bot 192 193 ! ... and then v component 194 zdepth =zkb_v 195 zsqrt_depth = SQRT(zdepth) 196 zexp_depth = EXP(-zdepth) 197 zstokes_psi_v_bot = 1.0_wp - zexp_depth & 198 & - z_two_thirds * ( zsqrtpi*zsqrt_depth*zdepth*ERFC(zsqrt_depth) & 199 & + 1.0_wp - (1.0_wp + zdepth)*zexp_depth ) 200 zda_v = ( zstokes_psi_v_bot - zstokes_psi_v_top(ji,jj) ) / zke3_v 201 zstokes_psi_v_top(ji,jj) = zstokes_psi_v_bot 177 202 ! 178 203 usd(ji,jj,jk) = zda_u * zu0_sd(ji,jj) * umask(ji,jj,jk) … … 181 206 END DO 182 207 END DO 208 DEALLOCATE( zstokes_psi_u_top, zstokes_psi_v_top ) 183 209 ENDIF 184 210 … … 232 258 CALL iom_put( "wstokes", wsd ) 233 259 ! 234 CALL wrk_dealloc( jpi,jpj,jpk, ze3divh ) 235 CALL wrk_dealloc( jpi,jpj, zk_t, zk_u, zk_v, zu0_sd, zv0_sd ) 236 CALL wrk_dealloc( jpi,jpj, zstokes_psi_u_top, zstokes_psi_v_top) 260 DEALLOCATE( ze3divh ) 261 DEALLOCATE( zk_t, zk_u, zk_v, zu0_sd, zv0_sd ) 237 262 ! 238 263 END SUBROUTINE sbc_stokes … … 298 323 ENDIF 299 324 300 IF( ln_tauwoc .AND. .NOT. cpl_tauwoc ) THEN 301 CALL fld_read( kt, nn_fsbc, sf_tauwoc ) 325 IF( ln_tauwoc .AND. .NOT. cpl_tauwoc ) THEN !== Wave induced stress ==! 326 CALL fld_read( kt, nn_fsbc, sf_tauwoc ) ! read wave norm stress from external forcing 302 327 tauoc_wave(:,:) = sf_tauwoc(1)%fnow(:,:,1) 303 328 ENDIF … … 326 351 ENDIF 327 352 328 ! !== Computation of the 3d Stokes Drift ==! 353 ! Calculate only if required fields have been read 354 ! In coupled wave model-NEMO case the call is done after coupling 329 355 ! 330 IF( ((nn_sdrift==jp_breivik .OR. nn_sdrift==jp_phillips) .AND. & 331 jp_hsw>0 .AND. jp_wmp>0 .AND. jp_usd>0 .AND. jp_vsd>0) .OR. & 332 (nn_sdrift==jp_peakfr .AND. jp_wfr>0 .AND. jp_usd>0 .AND. jp_vsd>0) ) & 333 CALL sbc_stokes() ! Calculate only if required fields are read 334 ! ! In coupled wave model-NEMO case the call is done after coupling 356 IF( ( ll_st_bv_li .AND. jp_hsw>0 .AND. jp_wmp>0 .AND. jp_usd>0 .AND. jp_vsd>0 ) .OR. & 357 & ( ll_st_peakfr .AND. jp_wfr>0 .AND. jp_usd>0 .AND. jp_vsd>0 ) ) CALL sbc_stokes() 335 358 ! 336 359 ENDIF … … 356 379 INTEGER :: ifpr 357 380 !! 358 CHARACTER(len=100) :: cn_dir ! Root directory for location of drag coefficient files381 CHARACTER(len=100) :: cn_dir ! Root directory for location of drag coefficient files 359 382 TYPE(FLD_N), ALLOCATABLE, DIMENSION(:) :: slf_i, slf_j ! array of namelist informations on the fields to read 360 383 TYPE(FLD_N) :: sn_cdg, sn_usd, sn_vsd, & 361 384 & sn_hsw, sn_wmp, sn_wfr, sn_wnum, & 362 & sn_tauwoc, sn_tauwx, sn_tauwy 385 & sn_tauwoc, sn_tauwx, sn_tauwy ! informations about the fields to be read 363 386 ! 364 387 NAMELIST/namsbc_wave/ sn_cdg, cn_dir, sn_usd, sn_vsd, sn_hsw, sn_wmp, sn_wfr, & … … 377 400 IF( ln_cdgw ) THEN 378 401 IF( .NOT. cpl_wdrag ) THEN 379 ALLOCATE( sf_cd(1), STAT=ierror ) !* allocate and fill sf_wave with sn_cdg402 ALLOCATE( sf_cd(1), STAT=ierror ) !* allocate and fill sf_wave with sn_cdg 380 403 IF( ierror > 0 ) CALL ctl_stop( 'STOP', 'sbc_wave_init: unable to allocate sf_wave structure' ) 381 404 ! … … 392 415 IF( ierror > 0 ) CALL ctl_stop( 'STOP', 'sbc_wave_init: unable to allocate sf_wave structure' ) 393 416 ! 394 ALLOCATE( sf_tauwoc(1)%fnow(jpi,jpj,1) )417 ALLOCATE( sf_tauwoc(1)%fnow(jpi,jpj,1) ) 395 418 IF( sn_tauwoc%ln_tint ) ALLOCATE( sf_tauwoc(1)%fdta(jpi,jpj,1,2) ) 396 419 CALL fld_fill( sf_tauwoc, (/ sn_tauwoc /), cn_dir, 'sbc_wave_init', 'Wave module', 'namsbc_wave' ) … … 428 451 jp_vsd = jpfld 429 452 ENDIF 430 IF( .NOT. cpl_hsig .AND. (nn_sdrift==jp_breivik .OR. nn_sdrift==jp_phillips)) THEN453 IF( .NOT. cpl_hsig .AND. ll_st_bv_li ) THEN 431 454 jpfld = jpfld + 1 432 455 jp_hsw = jpfld 433 456 ENDIF 434 IF( .NOT. cpl_wper .AND. (nn_sdrift==jp_breivik .OR. nn_sdrift==jp_phillips)) THEN457 IF( .NOT. cpl_wper .AND. ll_st_bv_li ) THEN 435 458 jpfld = jpfld + 1 436 459 jp_wmp = jpfld 437 460 ENDIF 438 IF( .NOT. cpl_wfreq .AND. nn_sdrift==jp_peakfr ) THEN461 IF( .NOT. cpl_wfreq .AND. ll_st_peakfr ) THEN 439 462 jpfld = jpfld + 1 440 463 jp_wfr = jpfld
Note: See TracChangeset
for help on using the changeset viewer.