Changeset 12377 for NEMO/trunk/src/OCE/SBC/sbcwave.F90
- Timestamp:
- 2020-02-12T15:39:06+01:00 (3 years ago)
- Location:
- NEMO/trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/trunk
- Property svn:externals
-
old new 3 3 ^/utils/build/mk@HEAD mk 4 4 ^/utils/tools@HEAD tools 5 ^/vendors/AGRIF/dev @HEAD ext/AGRIF5 ^/vendors/AGRIF/dev_r11615_ENHANCE-04_namelists_as_internalfiles_agrif@HEAD ext/AGRIF 6 6 ^/vendors/FCM@HEAD ext/FCM 7 7 ^/vendors/IOIPSL@HEAD ext/IOIPSL
-
- Property svn:externals
-
NEMO/trunk/src/OCE/SBC/sbcwave.F90
r11536 r12377 72 72 73 73 !! * Substitutions 74 # include " vectopt_loop_substitute.h90"74 # include "do_loop_substitute.h90" 75 75 !!---------------------------------------------------------------------- 76 76 !! NEMO/OCE 4.0 , NEMO Consortium (2018) … … 80 80 CONTAINS 81 81 82 SUBROUTINE sbc_stokes( )82 SUBROUTINE sbc_stokes( Kmm ) 83 83 !!--------------------------------------------------------------------- 84 84 !! *** ROUTINE sbc_stokes *** … … 92 92 !! ** action 93 93 !!--------------------------------------------------------------------- 94 INTEGER, INTENT(in) :: Kmm ! ocean time level index 94 95 INTEGER :: jj, ji, jk ! dummy loop argument 95 96 INTEGER :: ik ! local integer … … 111 112 IF( ll_st_bv_li ) THEN ! (Eq. (19) in Breivik et al. (2014) ) 112 113 zfac = 2.0_wp * rpi / 16.0_wp 113 DO jj = 1, jpj 114 DO ji = 1, jpi 115 ! Stokes drift velocity estimated from Hs and Tmean 116 ztransp = zfac * hsw(ji,jj)*hsw(ji,jj) / MAX( wmp(ji,jj), 0.0000001_wp ) 117 ! Stokes surface speed 118 tsd2d(ji,jj) = SQRT( ut0sd(ji,jj)*ut0sd(ji,jj) + vt0sd(ji,jj)*vt0sd(ji,jj)) 119 ! Wavenumber scale 120 zk_t(ji,jj) = ABS( tsd2d(ji,jj) ) / MAX( ABS( 5.97_wp*ztransp ), 0.0000001_wp ) 121 END DO 122 END DO 123 DO jj = 1, jpjm1 ! exp. wave number & Stokes drift velocity at u- & v-points 124 DO ji = 1, jpim1 125 zk_u(ji,jj) = 0.5_wp * ( zk_t(ji,jj) + zk_t(ji+1,jj) ) 126 zk_v(ji,jj) = 0.5_wp * ( zk_t(ji,jj) + zk_t(ji,jj+1) ) 127 ! 128 zu0_sd(ji,jj) = 0.5_wp * ( ut0sd(ji,jj) + ut0sd(ji+1,jj) ) 129 zv0_sd(ji,jj) = 0.5_wp * ( vt0sd(ji,jj) + vt0sd(ji,jj+1) ) 130 END DO 131 END DO 114 DO_2D_11_11 115 ! Stokes drift velocity estimated from Hs and Tmean 116 ztransp = zfac * hsw(ji,jj)*hsw(ji,jj) / MAX( wmp(ji,jj), 0.0000001_wp ) 117 ! Stokes surface speed 118 tsd2d(ji,jj) = SQRT( ut0sd(ji,jj)*ut0sd(ji,jj) + vt0sd(ji,jj)*vt0sd(ji,jj)) 119 ! Wavenumber scale 120 zk_t(ji,jj) = ABS( tsd2d(ji,jj) ) / MAX( ABS( 5.97_wp*ztransp ), 0.0000001_wp ) 121 END_2D 122 DO_2D_10_10 123 zk_u(ji,jj) = 0.5_wp * ( zk_t(ji,jj) + zk_t(ji+1,jj) ) 124 zk_v(ji,jj) = 0.5_wp * ( zk_t(ji,jj) + zk_t(ji,jj+1) ) 125 ! 126 zu0_sd(ji,jj) = 0.5_wp * ( ut0sd(ji,jj) + ut0sd(ji+1,jj) ) 127 zv0_sd(ji,jj) = 0.5_wp * ( vt0sd(ji,jj) + vt0sd(ji,jj+1) ) 128 END_2D 132 129 ELSE IF( ll_st_peakfr ) THEN ! peak wave number calculated from the peak frequency received by the wave model 133 DO jj = 1, jpj 134 DO ji = 1, jpi 135 zk_t(ji,jj) = ( 2.0_wp * rpi * wfreq(ji,jj) ) * ( 2.0_wp * rpi * wfreq(ji,jj) ) / grav 136 END DO 137 END DO 138 DO jj = 1, jpjm1 139 DO ji = 1, jpim1 140 zk_u(ji,jj) = 0.5_wp * ( zk_t(ji,jj) + zk_t(ji+1,jj) ) 141 zk_v(ji,jj) = 0.5_wp * ( zk_t(ji,jj) + zk_t(ji,jj+1) ) 142 ! 143 zu0_sd(ji,jj) = 0.5_wp * ( ut0sd(ji,jj) + ut0sd(ji+1,jj) ) 144 zv0_sd(ji,jj) = 0.5_wp * ( vt0sd(ji,jj) + vt0sd(ji,jj+1) ) 145 END DO 146 END DO 130 DO_2D_11_11 131 zk_t(ji,jj) = ( 2.0_wp * rpi * wfreq(ji,jj) ) * ( 2.0_wp * rpi * wfreq(ji,jj) ) / grav 132 END_2D 133 DO_2D_10_10 134 zk_u(ji,jj) = 0.5_wp * ( zk_t(ji,jj) + zk_t(ji+1,jj) ) 135 zk_v(ji,jj) = 0.5_wp * ( zk_t(ji,jj) + zk_t(ji,jj+1) ) 136 ! 137 zu0_sd(ji,jj) = 0.5_wp * ( ut0sd(ji,jj) + ut0sd(ji+1,jj) ) 138 zv0_sd(ji,jj) = 0.5_wp * ( vt0sd(ji,jj) + vt0sd(ji,jj+1) ) 139 END_2D 147 140 ENDIF 148 141 ! 149 142 ! !== horizontal Stokes Drift 3D velocity ==! 150 143 IF( ll_st_bv2014 ) THEN 151 DO jk = 1, jpkm1 152 DO jj = 2, jpjm1 153 DO ji = 2, jpim1 154 zdep_u = 0.5_wp * ( gdept_n(ji,jj,jk) + gdept_n(ji+1,jj,jk) ) 155 zdep_v = 0.5_wp * ( gdept_n(ji,jj,jk) + gdept_n(ji,jj+1,jk) ) 156 ! 157 zkh_u = zk_u(ji,jj) * zdep_u ! k * depth 158 zkh_v = zk_v(ji,jj) * zdep_v 159 ! ! Depth attenuation 160 zda_u = EXP( -2.0_wp*zkh_u ) / ( 1.0_wp + 8.0_wp*zkh_u ) 161 zda_v = EXP( -2.0_wp*zkh_v ) / ( 1.0_wp + 8.0_wp*zkh_v ) 162 ! 163 usd(ji,jj,jk) = zda_u * zu0_sd(ji,jj) * umask(ji,jj,jk) 164 vsd(ji,jj,jk) = zda_v * zv0_sd(ji,jj) * vmask(ji,jj,jk) 165 END DO 166 END DO 167 END DO 144 DO_3D_00_00( 1, jpkm1 ) 145 zdep_u = 0.5_wp * ( gdept(ji,jj,jk,Kmm) + gdept(ji+1,jj,jk,Kmm) ) 146 zdep_v = 0.5_wp * ( gdept(ji,jj,jk,Kmm) + gdept(ji,jj+1,jk,Kmm) ) 147 ! 148 zkh_u = zk_u(ji,jj) * zdep_u ! k * depth 149 zkh_v = zk_v(ji,jj) * zdep_v 150 ! ! Depth attenuation 151 zda_u = EXP( -2.0_wp*zkh_u ) / ( 1.0_wp + 8.0_wp*zkh_u ) 152 zda_v = EXP( -2.0_wp*zkh_v ) / ( 1.0_wp + 8.0_wp*zkh_v ) 153 ! 154 usd(ji,jj,jk) = zda_u * zu0_sd(ji,jj) * umask(ji,jj,jk) 155 vsd(ji,jj,jk) = zda_v * zv0_sd(ji,jj) * vmask(ji,jj,jk) 156 END_3D 168 157 ELSE IF( ll_st_li2017 .OR. ll_st_peakfr ) THEN 169 158 ALLOCATE( zstokes_psi_u_top(jpi,jpj), zstokes_psi_v_top(jpi,jpj) ) 170 DO jj = 1, jpjm1 ! exp. wave number & Stokes drift velocity at u- & v-points 171 DO ji = 1, jpim1 172 zstokes_psi_u_top(ji,jj) = 0._wp 173 zstokes_psi_v_top(ji,jj) = 0._wp 174 END DO 175 END DO 159 DO_2D_10_10 160 zstokes_psi_u_top(ji,jj) = 0._wp 161 zstokes_psi_v_top(ji,jj) = 0._wp 162 END_2D 176 163 zsqrtpi = SQRT(rpi) 177 164 z_two_thirds = 2.0_wp / 3.0_wp 178 DO jk = 1, jpkm1 179 DO jj = 2, jpjm1 180 DO ji = 2, jpim1 181 zbot_u = ( gdepw_n(ji,jj,jk+1) + gdepw_n(ji+1,jj,jk+1) ) ! 2 * bottom depth 182 zbot_v = ( gdepw_n(ji,jj,jk+1) + gdepw_n(ji,jj+1,jk+1) ) ! 2 * bottom depth 183 zkb_u = zk_u(ji,jj) * zbot_u ! 2 * k * bottom depth 184 zkb_v = zk_v(ji,jj) * zbot_v ! 2 * k * bottom depth 185 ! 186 zke3_u = MAX(1.e-8_wp, 2.0_wp * zk_u(ji,jj) * e3u_n(ji,jj,jk)) ! 2k * thickness 187 zke3_v = MAX(1.e-8_wp, 2.0_wp * zk_v(ji,jj) * e3v_n(ji,jj,jk)) ! 2k * thickness 188 189 ! Depth attenuation .... do u component first.. 190 zdepth = zkb_u 191 zsqrt_depth = SQRT(zdepth) 192 zexp_depth = EXP(-zdepth) 193 zstokes_psi_u_bot = 1.0_wp - zexp_depth & 194 & - z_two_thirds * ( zsqrtpi*zsqrt_depth*zdepth*ERFC(zsqrt_depth) & 195 & + 1.0_wp - (1.0_wp + zdepth)*zexp_depth ) 196 zda_u = ( zstokes_psi_u_bot - zstokes_psi_u_top(ji,jj) ) / zke3_u 197 zstokes_psi_u_top(ji,jj) = zstokes_psi_u_bot 198 199 ! ... and then v component 200 zdepth =zkb_v 201 zsqrt_depth = SQRT(zdepth) 202 zexp_depth = EXP(-zdepth) 203 zstokes_psi_v_bot = 1.0_wp - zexp_depth & 204 & - z_two_thirds * ( zsqrtpi*zsqrt_depth*zdepth*ERFC(zsqrt_depth) & 205 & + 1.0_wp - (1.0_wp + zdepth)*zexp_depth ) 206 zda_v = ( zstokes_psi_v_bot - zstokes_psi_v_top(ji,jj) ) / zke3_v 207 zstokes_psi_v_top(ji,jj) = zstokes_psi_v_bot 208 ! 209 usd(ji,jj,jk) = zda_u * zu0_sd(ji,jj) * umask(ji,jj,jk) 210 vsd(ji,jj,jk) = zda_v * zv0_sd(ji,jj) * vmask(ji,jj,jk) 211 END DO 212 END DO 213 END DO 165 DO_3D_00_00( 1, jpkm1 ) 166 zbot_u = ( gdepw(ji,jj,jk+1,Kmm) + gdepw(ji+1,jj,jk+1,Kmm) ) ! 2 * bottom depth 167 zbot_v = ( gdepw(ji,jj,jk+1,Kmm) + gdepw(ji,jj+1,jk+1,Kmm) ) ! 2 * bottom depth 168 zkb_u = zk_u(ji,jj) * zbot_u ! 2 * k * bottom depth 169 zkb_v = zk_v(ji,jj) * zbot_v ! 2 * k * bottom depth 170 ! 171 zke3_u = MAX(1.e-8_wp, 2.0_wp * zk_u(ji,jj) * e3u(ji,jj,jk,Kmm)) ! 2k * thickness 172 zke3_v = MAX(1.e-8_wp, 2.0_wp * zk_v(ji,jj) * e3v(ji,jj,jk,Kmm)) ! 2k * thickness 173 174 ! Depth attenuation .... do u component first.. 175 zdepth = zkb_u 176 zsqrt_depth = SQRT(zdepth) 177 zexp_depth = EXP(-zdepth) 178 zstokes_psi_u_bot = 1.0_wp - zexp_depth & 179 & - z_two_thirds * ( zsqrtpi*zsqrt_depth*zdepth*ERFC(zsqrt_depth) & 180 & + 1.0_wp - (1.0_wp + zdepth)*zexp_depth ) 181 zda_u = ( zstokes_psi_u_bot - zstokes_psi_u_top(ji,jj) ) / zke3_u 182 zstokes_psi_u_top(ji,jj) = zstokes_psi_u_bot 183 184 ! ... and then v component 185 zdepth =zkb_v 186 zsqrt_depth = SQRT(zdepth) 187 zexp_depth = EXP(-zdepth) 188 zstokes_psi_v_bot = 1.0_wp - zexp_depth & 189 & - z_two_thirds * ( zsqrtpi*zsqrt_depth*zdepth*ERFC(zsqrt_depth) & 190 & + 1.0_wp - (1.0_wp + zdepth)*zexp_depth ) 191 zda_v = ( zstokes_psi_v_bot - zstokes_psi_v_top(ji,jj) ) / zke3_v 192 zstokes_psi_v_top(ji,jj) = zstokes_psi_v_bot 193 ! 194 usd(ji,jj,jk) = zda_u * zu0_sd(ji,jj) * umask(ji,jj,jk) 195 vsd(ji,jj,jk) = zda_v * zv0_sd(ji,jj) * vmask(ji,jj,jk) 196 END_3D 214 197 DEALLOCATE( zstokes_psi_u_top, zstokes_psi_v_top ) 215 198 ENDIF … … 220 203 ! !== vertical Stokes Drift 3D velocity ==! 221 204 ! 222 DO jk = 1, jpkm1 ! Horizontal e3*divergence 223 DO jj = 2, jpj 224 DO ji = fs_2, jpi 225 ze3divh(ji,jj,jk) = ( e2u(ji ,jj) * e3u_n(ji ,jj,jk) * usd(ji ,jj,jk) & 226 & - e2u(ji-1,jj) * e3u_n(ji-1,jj,jk) * usd(ji-1,jj,jk) & 227 & + e1v(ji,jj ) * e3v_n(ji,jj ,jk) * vsd(ji,jj ,jk) & 228 & - e1v(ji,jj-1) * e3v_n(ji,jj-1,jk) * vsd(ji,jj-1,jk) ) * r1_e1e2t(ji,jj) 229 END DO 230 END DO 231 END DO 205 DO_3D_01_01( 1, jpkm1 ) 206 ze3divh(ji,jj,jk) = ( e2u(ji ,jj) * e3u(ji ,jj,jk,Kmm) * usd(ji ,jj,jk) & 207 & - e2u(ji-1,jj) * e3u(ji-1,jj,jk,Kmm) * usd(ji-1,jj,jk) & 208 & + e1v(ji,jj ) * e3v(ji,jj ,jk,Kmm) * vsd(ji,jj ,jk) & 209 & - e1v(ji,jj-1) * e3v(ji,jj-1,jk,Kmm) * vsd(ji,jj-1,jk) ) * r1_e1e2t(ji,jj) 210 END_3D 232 211 ! 233 212 #if defined key_agrif … … 291 270 ! 292 271 IF( ln_tauw ) THEN 293 DO jj = 1, jpjm1 294 DO ji = 1, jpim1 295 ! Stress components at u- & v-points 296 utau(ji,jj) = 0.5_wp * ( tauw_x(ji,jj) + tauw_x(ji+1,jj) ) 297 vtau(ji,jj) = 0.5_wp * ( tauw_y(ji,jj) + tauw_y(ji,jj+1) ) 298 ! 299 ! Stress module at t points 300 taum(ji,jj) = SQRT( tauw_x(ji,jj)*tauw_x(ji,jj) + tauw_y(ji,jj)*tauw_y(ji,jj) ) 301 END DO 302 END DO 272 DO_2D_10_10 273 ! Stress components at u- & v-points 274 utau(ji,jj) = 0.5_wp * ( tauw_x(ji,jj) + tauw_x(ji+1,jj) ) 275 vtau(ji,jj) = 0.5_wp * ( tauw_y(ji,jj) + tauw_y(ji,jj+1) ) 276 ! 277 ! Stress module at t points 278 taum(ji,jj) = SQRT( tauw_x(ji,jj)*tauw_x(ji,jj) + tauw_y(ji,jj)*tauw_y(ji,jj) ) 279 END_2D 303 280 CALL lbc_lnk_multi( 'sbcwave', utau(:,:), 'U', -1. , vtau(:,:), 'V', -1. , taum(:,:) , 'T', -1. ) 304 281 ENDIF … … 307 284 308 285 309 SUBROUTINE sbc_wave( kt )286 SUBROUTINE sbc_wave( kt, Kmm ) 310 287 !!--------------------------------------------------------------------- 311 288 !! *** ROUTINE sbc_wave *** … … 322 299 !!--------------------------------------------------------------------- 323 300 INTEGER, INTENT(in ) :: kt ! ocean time step 301 INTEGER, INTENT(in ) :: Kmm ! ocean time index 324 302 !!--------------------------------------------------------------------- 325 303 ! … … 361 339 ! 362 340 IF( ( ll_st_bv_li .AND. jp_hsw>0 .AND. jp_wmp>0 .AND. jp_usd>0 .AND. jp_vsd>0 ) .OR. & 363 & ( ll_st_peakfr .AND. jp_wfr>0 .AND. jp_usd>0 .AND. jp_vsd>0 ) ) CALL sbc_stokes( )341 & ( ll_st_peakfr .AND. jp_wfr>0 .AND. jp_usd>0 .AND. jp_vsd>0 ) ) CALL sbc_stokes( Kmm ) 364 342 ! 365 343 ENDIF … … 395 373 !!--------------------------------------------------------------------- 396 374 ! 397 REWIND( numnam_ref ) ! Namelist namsbc_wave in reference namelist : File for drag coeff. from wave model398 375 READ ( numnam_ref, namsbc_wave, IOSTAT = ios, ERR = 901) 399 376 901 IF( ios /= 0 ) CALL ctl_nam ( ios , 'namsbc_wave in reference namelist' ) 400 377 401 REWIND( numnam_cfg ) ! Namelist namsbc_wave in configuration namelist : File for drag coeff. from wave model402 378 READ ( numnam_cfg, namsbc_wave, IOSTAT = ios, ERR = 902 ) 403 379 902 IF( ios > 0 ) CALL ctl_nam ( ios , 'namsbc_wave in configuration namelist' )
Note: See TracChangeset
for help on using the changeset viewer.