Changeset 8908
- Timestamp:
- 2017-12-06T10:36:02+01:00 (5 years ago)
- Location:
- branches/2017/dev_METO_2017/NEMOGCM
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2017/dev_METO_2017/NEMOGCM/CONFIG/SHARED/namelist_ref
r8868 r8908 216 216 ln_cdgw = .false. ! Neutral drag coefficient read from wave model (T => ln_wave=.true. & fill namsbc_wave) 217 217 ln_sdw = .false. ! Read 2D Surf Stokes Drift & Computation of 3D stokes drift (T => ln_wave=.true. & fill namsbc_wave) 218 nn_sdrift = 0 ! Parameterization for the calculation of 3D-Stokes drift from the surface Stokes drift 219 ! = 0 Breivik 2015 parameterization: v_z=v_0*[exp(2*k*z)/(1-8*k*z)] 220 ! = 1 Phillips: v_z=v_o*[exp(2*k*z)-beta*sqrt(-2*k*pi*z)*erfc(sqrt(-2*k*z))] 221 ! = 2 Phillips as (1) but using the wave frequency from a wave model 218 222 ln_tauoc = .false. ! Activate ocean stress modified by external wave induced stress (T => ln_wave=.true. & fill namsbc_wave) 223 ln_tauw = .false. ! Activate ocean stress components from wave model 219 224 ln_stcor = .false. ! Activate Stokes Coriolis term (T => ln_wave=.true. & ln_sdw=.true. & fill namsbc_wave) 220 225 nn_lsm = 0 ! =0 land/sea mask for input fields is not applied (keep empty land/sea mask filename field) , … … 298 303 sn_rcv_sdrfy = 'none' , 'no' , '' , '' , '' 299 304 sn_rcv_wper = 'none' , 'no' , '' , '' , '' 305 sn_rcv_wfreq = 'none' , 'no' , '' , '' , '' 300 306 sn_rcv_wnum = 'none' , 'no' , '' , '' , '' 301 sn_rcv_wstrf = 'none' , 'no' , '' , '' , '' 307 sn_rcv_tauoc = 'none' , 'no' , '' , '' , '' 308 sn_rcv_tauw = 'none' , 'no' , '' , '' , '' 302 309 sn_rcv_wdrag = 'none' , 'no' , '' , '' , '' 303 310 ! … … 456 463 sn_hsw = 'sdw_wave' , 1 , 'hs' , .true. , .false. , 'daily' , '' , '' , '' 457 464 sn_wmp = 'sdw_wave' , 1 , 'wmp' , .true. , .false. , 'daily' , '' , '' , '' 465 sn_wfr = 'sdw_wave' , 1 , 'wfr' , .true. , .false. , 'daily' , '' , '' , '' 458 466 sn_wnum = 'sdw_wave' , 1 , 'wave_num' , .true. , .false. , 'daily' , '' , '' , '' 459 467 sn_tauoc = 'sdw_wave' , 1 , 'wave_stress', .true. , .false. , 'daily' , '' , '' , '' 468 sn_tauwx = 'sdw_wave' , 1 , 'wave_stress', .true. , .false. , 'daily' , '' , '' , '' 469 sn_tauwy = 'sdw_wave' , 1 , 'wave_stress', .true. , .false. , 'daily' , '' , '' , '' 460 470 ! 461 471 cn_dir = './' ! root directory for the location of drag coefficient files -
branches/2017/dev_METO_2017/NEMOGCM/NEMO/OPA_SRC/SBC/cpl_oasis3.F90
r7851 r8908 66 66 INTEGER :: nsnd ! total number of fields sent 67 67 INTEGER :: ncplmodel ! Maximum number of models to/from which NEMO is potentialy sending/receiving data 68 INTEGER, PUBLIC, PARAMETER :: nmaxfld= 55! Maximum number of coupling fields68 INTEGER, PUBLIC, PARAMETER :: nmaxfld=60 ! Maximum number of coupling fields 69 69 INTEGER, PUBLIC, PARAMETER :: nmaxcat=5 ! Maximum number of coupling fields 70 70 INTEGER, PUBLIC, PARAMETER :: nmaxcpl=5 ! Maximum number of coupling fields -
branches/2017/dev_METO_2017/NEMOGCM/NEMO/OPA_SRC/SBC/sbc_oce.F90
r7788 r8908 65 65 LOGICAL , PUBLIC :: ln_sdw !: true if 3d stokes drift from wave model 66 66 LOGICAL , PUBLIC :: ln_tauoc !: true if normalized stress from wave is used 67 LOGICAL , PUBLIC :: ln_tauw !: true if ocean stress components from wave is used 67 68 LOGICAL , PUBLIC :: ln_stcor !: true if Stokes-Coriolis term is used 69 ! 70 INTEGER , PUBLIC :: nn_sdrift ! type of parameterization to calculate vertical Stokes drift 68 71 ! 69 72 LOGICAL , PUBLIC :: ln_icebergs !: Icebergs … … 79 82 INTEGER , PUBLIC, PARAMETER :: jp_none = 5 !: for OPA when doing coupling via SAS module 80 83 84 !!---------------------------------------------------------------------- 85 !! Stokes drift parametrization definition 86 !!---------------------------------------------------------------------- 87 INTEGER , PUBLIC, PARAMETER :: jp_breivik = 0 ! Breivik 2015: v_z=v_0*[exp(2*k*z)/(1-8*k*z)] 88 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))] 89 INTEGER , PUBLIC, PARAMETER :: jp_peakfr = 2 ! Phillips using the peak wave number read from wave model instead of the inverse depth scale 90 81 91 !!---------------------------------------------------------------------- 82 92 !! component definition -
branches/2017/dev_METO_2017/NEMOGCM/NEMO/OPA_SRC/SBC/sbccpl.F90
r8868 r8908 113 113 INTEGER, PARAMETER :: jpr_wper = 48 ! Mean wave period 114 114 INTEGER, PARAMETER :: jpr_wnum = 49 ! Mean wavenumber 115 INTEGER, PARAMETER :: jpr_ wstrf= 50 ! Stress fraction adsorbed by waves115 INTEGER, PARAMETER :: jpr_tauoc = 50 ! Stress fraction adsorbed by waves 116 116 INTEGER, PARAMETER :: jpr_wdrag = 51 ! Neutral surface drag coefficient 117 117 INTEGER, PARAMETER :: jpr_isf = 52 118 118 INTEGER, PARAMETER :: jpr_icb = 53 119 120 INTEGER, PARAMETER :: jprcv = 53 ! total number of fields received 119 INTEGER, PARAMETER :: jpr_wfreq = 54 ! Wave peak frequency 120 INTEGER, PARAMETER :: jpr_tauwx = 55 ! x component of the ocean stress from waves 121 INTEGER, PARAMETER :: jpr_tauwy = 56 ! y component of the ocean stress from waves 122 123 INTEGER, PARAMETER :: jprcv = 56 ! total number of fields received 121 124 122 125 INTEGER, PARAMETER :: jps_fice = 1 ! ice fraction sent to the atmosphere … … 165 168 TYPE(FLD_C) :: sn_snd_temp, sn_snd_alb, sn_snd_thick, sn_snd_crt, sn_snd_co2 166 169 ! ! Received from the atmosphere 167 TYPE(FLD_C) :: sn_rcv_w10m, sn_rcv_taumod, sn_rcv_tau, sn_rcv_dqnsdt, sn_rcv_qsr, sn_rcv_qns, sn_rcv_emp, sn_rcv_rnf 170 TYPE(FLD_C) :: sn_rcv_w10m, sn_rcv_taumod, sn_rcv_tau, sn_rcv_tauw, sn_rcv_dqnsdt, sn_rcv_qsr, & 171 sn_rcv_qns, sn_rcv_emp, sn_rcv_rnf 168 172 TYPE(FLD_C) :: sn_rcv_cal, sn_rcv_iceflx, sn_rcv_co2, sn_rcv_mslp, sn_rcv_icb, sn_rcv_isf 169 173 ! Send to waves 170 174 TYPE(FLD_C) :: sn_snd_ifrac, sn_snd_crtw, sn_snd_wlev 171 175 ! Received from waves 172 TYPE(FLD_C) :: sn_rcv_hsig,sn_rcv_phioc,sn_rcv_sdrfx,sn_rcv_sdrfy,sn_rcv_wper,sn_rcv_wnum,sn_rcv_wstrf,sn_rcv_wdrag 176 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, & 177 sn_rcv_wfreq 173 178 ! ! Other namelist parameters 174 179 INTEGER :: nn_cplmodel ! Maximum number of models to/from which NEMO is potentialy sending/receiving data … … 242 247 & sn_rcv_w10m, sn_rcv_taumod, sn_rcv_tau , sn_rcv_dqnsdt, sn_rcv_qsr, & 243 248 & 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_ wstrf, &249 & sn_rcv_sdrfx, sn_rcv_sdrfy, sn_rcv_wper , sn_rcv_wnum , sn_rcv_tauoc , & 245 250 & sn_rcv_wdrag, sn_rcv_qns , sn_rcv_emp , sn_rcv_rnf , sn_rcv_cal , & 246 251 & sn_rcv_iceflx,sn_rcv_co2 , nn_cplmodel , ln_usecplmask, sn_rcv_mslp , & 247 & sn_rcv_icb , sn_rcv_isf 252 & sn_rcv_icb , sn_rcv_isf , sn_rcv_wfreq , sn_rcv_tauw 248 253 249 254 !!--------------------------------------------------------------------- … … 295 300 WRITE(numout,*)' Mean wave period = ', TRIM(sn_rcv_wper%cldes ), ' (', TRIM(sn_rcv_wper%clcat ), ')' 296 301 WRITE(numout,*)' Mean wave number = ', TRIM(sn_rcv_wnum%cldes ), ' (', TRIM(sn_rcv_wnum%clcat ), ')' 297 WRITE(numout,*)' Stress frac adsorbed by waves = ', TRIM(sn_rcv_wstrf%cldes ), ' (', TRIM(sn_rcv_wstrf%clcat ), ')' 302 WRITE(numout,*)' Wave peak frequency = ', TRIM(sn_rcv_wfreq%cldes ), ' (', TRIM(sn_rcv_wfreq%clcat ), ')' 303 WRITE(numout,*)' Stress frac adsorbed by waves = ', TRIM(sn_rcv_tauoc%cldes ), ' (', TRIM(sn_rcv_tauoc%clcat ), ')' 304 WRITE(numout,*)' Stress components by waves = ', TRIM(sn_rcv_tauw%cldes ), ' (', TRIM(sn_rcv_tauw%clcat ), ')' 298 305 WRITE(numout,*)' Neutral surf drag coefficient = ', TRIM(sn_rcv_wdrag%cldes ), ' (', TRIM(sn_rcv_wdrag%clcat ), ')' 299 306 WRITE(numout,*)' sent fields (multiple ice categories)' … … 578 585 cpl_wper = .TRUE. 579 586 ENDIF 587 srcv(jpr_wfreq)%clname = 'O_WFreq' ! wave peak frequency 588 IF( TRIM(sn_rcv_wfreq%cldes ) == 'coupled' ) THEN 589 srcv(jpr_wfreq)%laction = .TRUE. 590 cpl_wfreq = .TRUE. 591 ENDIF 580 592 srcv(jpr_wnum)%clname = 'O_WNum' ! mean wave number 581 593 IF( TRIM(sn_rcv_wnum%cldes ) == 'coupled' ) THEN … … 583 595 cpl_wnum = .TRUE. 584 596 ENDIF 585 srcv(jpr_wstrf)%clname = 'O_WStrf' ! stress fraction adsorbed by the wave 586 IF( TRIM(sn_rcv_wstrf%cldes ) == 'coupled' ) THEN 587 srcv(jpr_wstrf)%laction = .TRUE. 588 cpl_wstrf = .TRUE. 597 srcv(jpr_tauoc)%clname = 'O_TauOce' ! stress fraction adsorbed by the wave 598 IF( TRIM(sn_rcv_tauoc%cldes ) == 'coupled' ) THEN 599 srcv(jpr_tauoc)%laction = .TRUE. 600 cpl_tauoc = .TRUE. 601 ENDIF 602 srcv(jpr_tauwx)%clname = 'O_Tauwx' ! ocean stress from wave in the x direction 603 srcv(jpr_tauwy)%clname = 'O_Tauwy' ! ocean stress from wave in the y direction 604 IF( TRIM(sn_rcv_tauw%cldes ) == 'coupled' ) THEN 605 srcv(jpr_tauwx)%laction = .TRUE. 606 srcv(jpr_tauwy)%laction = .TRUE. 607 cpl_tauw = .TRUE. 589 608 ENDIF 590 609 srcv(jpr_wdrag)%clname = 'O_WDrag' ! neutral surface drag coefficient … … 594 613 ENDIF 595 614 ! 615 IF( srcv(jpr_tauoc)%laction .AND. srcv(jpr_tauwx)%laction .AND. srcv(jpr_tauwy)%laction ) & 616 CALL ctl_stop( 'More than one method for modifying the ocean stress has been selected ', & 617 '(sn_rcv_tauoc=coupled and sn_rcv_tauw=coupled)' ) 618 ! 596 619 ! ! ------------------------------- ! 597 620 ! ! OPA-SAS coupling - rcv by opa ! … … 1165 1188 ! ! ========================= ! 1166 1189 IF( srcv(jpr_hsig)%laction ) hsw(:,:) = frcv(jpr_hsig)%z3(:,:,1) 1190 ! 1191 ! ! ========================= ! 1192 ! ! Wave peak frequency ! 1193 ! ! ========================= ! 1194 IF( srcv(jpr_wfreq)%laction ) wfreq(:,:) = frcv(jpr_wfreq)%z3(:,:,1) 1167 1195 ! 1168 1196 ! ! ========================= ! … … 1173 1201 ! Calculate the 3D Stokes drift both in coupled and not fully uncoupled mode 1174 1202 IF( srcv(jpr_sdrftx)%laction .OR. srcv(jpr_sdrfty)%laction .OR. srcv(jpr_wper)%laction & 1175 .OR. srcv(jpr_hsig)%laction ) THEN1203 .OR. srcv(jpr_hsig)%laction .OR. srcv(jpr_wfreq)%laction ) THEN 1176 1204 CALL sbc_stokes() 1177 1205 ENDIF … … 1180 1208 ! ! Stress adsorbed by waves ! 1181 1209 ! ! ========================= ! 1182 IF( srcv(jpr_wstrf)%laction .AND. ln_tauoc ) tauoc_wave(:,:) = frcv(jpr_wstrf)%z3(:,:,1) 1210 IF( srcv(jpr_tauoc)%laction .AND. ln_tauoc ) tauoc_wave(:,:) = frcv(jpr_tauoc)%z3(:,:,1) 1211 1212 ! ! ========================= ! 1213 ! ! Stress component by waves ! 1214 ! ! ========================= ! 1215 IF( srcv(jpr_tauwx)%laction .AND. srcv(jpr_tauwy)%laction .AND. ln_tauw ) THEN 1216 tauw_x(:,:) = frcv(jpr_tauwx)%z3(:,:,1) 1217 tauw_y(:,:) = frcv(jpr_tauwy)%z3(:,:,1) 1218 ENDIF 1183 1219 1184 1220 ! ! ========================= ! -
branches/2017/dev_METO_2017/NEMOGCM/NEMO/OPA_SRC/SBC/sbcmod.F90
r8868 r8908 96 96 & ln_rnf , nn_fwb , ln_ssr , ln_isf , ln_apr_dyn , & 97 97 & ln_wave , ln_cdgw , ln_sdw , ln_tauoc , ln_stcor , & 98 & nn_lsm98 & ln_tauw , nn_lsm, nn_sdrift 99 99 !!---------------------------------------------------------------------- 100 100 ! … … 157 157 WRITE(numout,*) ' surface wave ln_wave = ', ln_wave 158 158 WRITE(numout,*) ' Stokes drift corr. to vert. velocity ln_sdw = ', ln_sdw 159 WRITE(numout,*) ' vertical parametrization nn_sdrift = ', nn_sdrift 159 160 WRITE(numout,*) ' wave modified ocean stress ln_tauoc = ', ln_tauoc 161 WRITE(numout,*) ' wave modified ocean stress component ln_tauw = ', ln_tauw 160 162 WRITE(numout,*) ' Stokes coriolis term ln_stcor = ', ln_stcor 161 163 WRITE(numout,*) ' neutral drag coefficient (CORE, MFS) ln_cdgw = ', ln_cdgw 162 164 ENDIF 165 ! 166 IF( ln_sdw ) THEN 167 IF( .NOT.(nn_sdrift==jp_breivik .OR. nn_sdrift==jp_phillips .OR. nn_sdrift==jp_peakfr) ) & 168 CALL ctl_stop( 'The chosen nn_sdrift for Stokes drift vertical velocity must be 0, 1, or 2' ) 169 ENDIF 170 IF( ln_tauoc .AND. ln_tauw ) & 171 CALL ctl_stop( 'More than one method for modifying the ocean stress has been selected ', & 172 '(ln_tauoc=.true. and ln_tauw=.true.)' ) 173 IF( ln_tauoc ) & 174 CALL ctl_warn( 'You are subtracting the wave stress to the ocean (ln_tauoc=.true.)' ) 175 IF( ln_tauw ) & 176 CALL ctl_warn( 'The wave modified ocean stress components are used (ln_tauw=.true.) ', & 177 'This will override any other specification of the ocean stress' ) 163 178 ! 164 179 IF( .NOT.ln_usr ) THEN ! the model calendar needs some specificities (except in user defined case) … … 410 425 IF( ll_opa ) CALL sbc_cpl_rcv ( kt, nn_fsbc, nn_ice ) ! OPA-SAS coupling: OPA receiving fields from SAS 411 426 END SELECT 412 IF ( ln_wave .AND. ln_tauoc) THEN ! Wave stress subctracted 413 utau(:,:) = utau(:,:)*tauoc_wave(:,:) 414 vtau(:,:) = vtau(:,:)*tauoc_wave(:,:) 415 taum(:,:) = taum(:,:)*tauoc_wave(:,:) 416 ! 417 SELECT CASE( nsbc ) 418 CASE( 0,1,2,3,5,-1 ) ; 419 IF(lwp .AND. kt == nit000 ) WRITE(numout,*) 'WARNING: You are subtracting the wave stress to the ocean. & 420 & If not requested select ln_tauoc=.false' 421 END SELECT 422 ! 423 END IF 427 ! 424 428 IF( ln_mixcpl ) CALL sbc_cpl_rcv ( kt, nn_fsbc, nn_ice ) ! forced-coupled mixed formulation after forcing 425 429 ! 430 IF ( ln_wave .AND. (ln_tauoc .OR. ln_tauw) ) CALL sbc_wstress( ) ! Wind stress provided by waves 426 431 ! 427 432 ! !== Misc. Options ==! -
branches/2017/dev_METO_2017/NEMOGCM/NEMO/OPA_SRC/SBC/sbcwave.F90
r7864 r8908 33 33 34 34 PUBLIC sbc_stokes ! routine called in sbccpl 35 PUBLIC sbc_wstress ! routine called in sbcmod 35 36 PUBLIC sbc_wave ! routine called in sbcmod 36 37 PUBLIC sbc_wave_init ! routine called in sbcmod … … 42 43 LOGICAL, PUBLIC :: cpl_sdrfty = .FALSE. 43 44 LOGICAL, PUBLIC :: cpl_wper = .FALSE. 45 LOGICAL, PUBLIC :: cpl_wfreq = .FALSE. 44 46 LOGICAL, PUBLIC :: cpl_wnum = .FALSE. 45 LOGICAL, PUBLIC :: cpl_wstrf = .FALSE. 47 LOGICAL, PUBLIC :: cpl_tauoc = .FALSE. 48 LOGICAL, PUBLIC :: cpl_tauw = .FALSE. 46 49 LOGICAL, PUBLIC :: cpl_wdrag = .FALSE. 47 50 … … 51 54 INTEGER :: jp_hsw ! index of significant wave hight (m) at T-point 52 55 INTEGER :: jp_wmp ! index of mean wave period (s) at T-point 56 INTEGER :: jp_wfr ! index of wave peak frequency (1/s) at T-point 53 57 54 58 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_cd ! structure of input fields (file informations, fields read) Drag Coefficient … … 56 60 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_wn ! structure of input fields (file informations, fields read) wave number for Qiao 57 61 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_tauoc ! structure of input fields (file informations, fields read) normalized wave stress into the ocean 62 TYPE(FLD), ALLOCATABLE, DIMENSION(:) :: sf_tauw ! structure of input fields (file informations, fields read) ocean stress components from wave model 63 58 64 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: cdn_wave !: 59 65 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: hsw, wmp, wnum !: 66 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: wfreq !: 60 67 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: tauoc_wave !: 68 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: tauw_x, tauw_y !: 61 69 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: tsd2d !: 62 70 REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: div_sd !: barotropic stokes drift divergence … … 96 104 CALL wrk_alloc( jpi,jpj, zk_t, zk_u, zk_v, zu0_sd, zv0_sd ) 97 105 ! 98 ! 99 zfac = 2.0_wp * rpi / 16.0_wp 100 DO jj = 1, jpj ! exp. wave number at t-point (Eq. (19) in Breivick et al. (2014) ) 101 DO ji = 1, jpi 106 ! select parameterization for the calculation of vertical Stokes drift 107 ! exp. wave number at t-point 108 IF( nn_sdrift==jp_breivik .OR. nn_sdrift==jp_phillips ) THEN ! (Eq. (19) in Breivick et al. (2014) ) 109 zfac = 2.0_wp * rpi / 16.0_wp 110 DO jj = 1, jpj 111 DO ji = 1, jpi 102 112 ! Stokes drift velocity estimated from Hs and Tmean 103 ztransp = zfac * hsw(ji,jj)*hsw(ji,jj) / MAX( wmp(ji,jj) 113 ztransp = zfac * hsw(ji,jj)*hsw(ji,jj) / MAX( wmp(ji,jj), 0.0000001_wp ) 104 114 ! Stokes surface speed 105 zsp0 = SQRT( ut0sd(ji,jj)*ut0sd(ji,jj) + vt0sd(ji,jj)*vt0sd(ji,jj) ) 106 tsd2d(ji,jj) = zsp0 115 tsd2d(ji,jj) = SQRT( ut0sd(ji,jj)*ut0sd(ji,jj) + vt0sd(ji,jj)*vt0sd(ji,jj)) 107 116 ! Wavenumber scale 108 zk_t(ji,jj) = ABS( zsp0 ) / MAX( ABS( 5.97_wp*ztransp ) , 0.0000001_wp ) 109 END DO 110 END DO 111 DO jj = 1, jpjm1 ! exp. wave number & Stokes drift velocity at u- & v-points 112 DO ji = 1, jpim1 113 zk_u(ji,jj) = 0.5_wp * ( zk_t(ji,jj) + zk_t(ji+1,jj) ) 114 zk_v(ji,jj) = 0.5_wp * ( zk_t(ji,jj) + zk_t(ji,jj+1) ) 115 ! 116 zu0_sd(ji,jj) = 0.5_wp * ( ut0sd(ji,jj) + ut0sd(ji+1,jj) ) 117 zv0_sd(ji,jj) = 0.5_wp * ( vt0sd(ji,jj) + vt0sd(ji,jj+1) ) 118 END DO 119 END DO 117 zk_t(ji,jj) = ABS( tsd2d(ji,jj) ) / MAX( ABS( 5.97_wp*ztransp ), 0.0000001_wp ) 118 END DO 119 END DO 120 DO jj = 1, jpjm1 ! exp. wave number & Stokes drift velocity at u- & v-points 121 DO ji = 1, jpim1 122 zk_u(ji,jj) = 0.5_wp * ( zk_t(ji,jj) + zk_t(ji+1,jj) ) 123 zk_v(ji,jj) = 0.5_wp * ( zk_t(ji,jj) + zk_t(ji,jj+1) ) 124 ! 125 zu0_sd(ji,jj) = 0.5_wp * ( ut0sd(ji,jj) + ut0sd(ji+1,jj) ) 126 zv0_sd(ji,jj) = 0.5_wp * ( vt0sd(ji,jj) + vt0sd(ji,jj+1) ) 127 END DO 128 END DO 129 ELSE IF( nn_sdrift==jp_peakfr ) THEN ! peak wave number calculated from the peak frequency received by the wave model 130 DO jj = 1, jpjm1 131 DO ji = 1, jpim1 132 zk_u(ji,jj) = 0.5_wp * ( wfreq(ji,jj)*wfreq(ji,jj) + wfreq(ji+1,jj)*wfreq(ji+1,jj) ) / grav 133 zk_v(ji,jj) = 0.5_wp * ( wfreq(ji,jj)*wfreq(ji,jj) + wfreq(ji,jj+1)*wfreq(ji,jj+1) ) / grav 134 ! 135 zu0_sd(ji,jj) = 0.5_wp * ( ut0sd(ji,jj) + ut0sd(ji+1,jj) ) 136 zv0_sd(ji,jj) = 0.5_wp * ( vt0sd(ji,jj) + vt0sd(ji,jj+1) ) 137 END DO 138 END DO 139 ENDIF 120 140 ! 121 141 ! !== horizontal Stokes Drift 3D velocity ==! 122 DO jk = 1, jpkm1 123 DO jj = 2, jpjm1 124 DO ji = 2, jpim1 125 zdep_u = 0.5_wp * ( gdept_n(ji,jj,jk) + gdept_n(ji+1,jj,jk) ) 126 zdep_v = 0.5_wp * ( gdept_n(ji,jj,jk) + gdept_n(ji,jj+1,jk) ) 127 ! 128 zkh_u = zk_u(ji,jj) * zdep_u ! k * depth 129 zkh_v = zk_v(ji,jj) * zdep_v 130 ! ! Depth attenuation 131 zda_u = EXP( -2.0_wp*zkh_u ) / ( 1.0_wp + 8.0_wp*zkh_u ) 132 zda_v = EXP( -2.0_wp*zkh_v ) / ( 1.0_wp + 8.0_wp*zkh_v ) 133 ! 134 usd(ji,jj,jk) = zda_u * zu0_sd(ji,jj) * umask(ji,jj,jk) 135 vsd(ji,jj,jk) = zda_v * zv0_sd(ji,jj) * vmask(ji,jj,jk) 136 END DO 137 END DO 138 END DO 142 IF( nn_sdrift==jp_breivik ) THEN 143 DO jk = 1, jpkm1 144 DO jj = 2, jpjm1 145 DO ji = 2, jpim1 146 zdep_u = 0.5_wp * ( gdept_n(ji,jj,jk) + gdept_n(ji+1,jj,jk) ) 147 zdep_v = 0.5_wp * ( gdept_n(ji,jj,jk) + gdept_n(ji,jj+1,jk) ) 148 ! 149 zkh_u = zk_u(ji,jj) * zdep_u ! k * depth 150 zkh_v = zk_v(ji,jj) * zdep_v 151 ! ! Depth attenuation 152 zda_u = EXP( -2.0_wp*zkh_u ) / ( 1.0_wp + 8.0_wp*zkh_u ) 153 zda_v = EXP( -2.0_wp*zkh_v ) / ( 1.0_wp + 8.0_wp*zkh_v ) 154 ! 155 usd(ji,jj,jk) = zda_u * zu0_sd(ji,jj) * umask(ji,jj,jk) 156 vsd(ji,jj,jk) = zda_v * zv0_sd(ji,jj) * vmask(ji,jj,jk) 157 END DO 158 END DO 159 END DO 160 ELSE IF( nn_sdrift==jp_phillips .OR. nn_sdrift==jp_peakfr ) THEN 161 DO jk = 1, jpkm1 162 DO jj = 2, jpjm1 163 DO ji = 2, jpim1 164 zdep_u = 0.5_wp * ( gdept_n(ji,jj,jk) + gdept_n(ji+1,jj,jk) ) 165 zdep_v = 0.5_wp * ( gdept_n(ji,jj,jk) + gdept_n(ji,jj+1,jk) ) 166 ! 167 zkh_u = zk_u(ji,jj) * zdep_u ! k * depth 168 zkh_v = zk_v(ji,jj) * zdep_v 169 ! ! Depth attenuation 170 zda_u = EXP( -2.0_wp*zkh_u ) - SQRT(2.0_wp*rpi*zkh_u) * ERFC(SQRT(2.0_wp*zkh_u)) 171 zda_v = EXP( -2.0_wp*zkh_v ) - SQRT(2.0_wp*rpi*zkh_v) * ERFC(SQRT(2.0_wp*zkh_v)) 172 ! 173 usd(ji,jj,jk) = zda_u * zu0_sd(ji,jj) * umask(ji,jj,jk) 174 vsd(ji,jj,jk) = zda_v * zv0_sd(ji,jj) * vmask(ji,jj,jk) 175 END DO 176 END DO 177 END DO 178 ENDIF 179 139 180 CALL lbc_lnk( usd(:,:,:), 'U', vsd(:,:,:), 'V', -1. ) 140 181 ! … … 189 230 190 231 232 SUBROUTINE sbc_wstress( ) 233 !!--------------------------------------------------------------------- 234 !! *** ROUTINE sbc_wstress *** 235 !! 236 !! ** Purpose : Updates the ocean momentum modified by waves 237 !! 238 !! ** Method : - Calculate u,v components of stress depending on stress 239 !! model 240 !! - Calculate the stress module 241 !! - The wind module is not modified by waves 242 !! ** action 243 !!--------------------------------------------------------------------- 244 INTEGER :: jj, ji ! dummy loop argument 245 ! 246 IF( ln_tauoc ) THEN 247 utau(:,:) = utau(:,:)*tauoc_wave(:,:) 248 vtau(:,:) = vtau(:,:)*tauoc_wave(:,:) 249 taum(:,:) = taum(:,:)*tauoc_wave(:,:) 250 ENDIF 251 ! 252 IF( ln_tauw ) THEN 253 DO jj = 1, jpjm1 254 DO ji = 1, jpim1 255 ! Stress components at u- & v-points 256 utau(ji,jj) = 0.5_wp * ( tauw_x(ji,jj) + tauw_x(ji+1,jj) ) 257 vtau(ji,jj) = 0.5_wp * ( tauw_y(ji,jj) + tauw_y(ji,jj+1) ) 258 ! 259 ! Stress module at t points 260 taum(ji,jj) = SQRT( tauw_x(ji,jj)*tauw_x(ji,jj) + tauw_y(ji,jj)*tauw_y(ji,jj) ) 261 END DO 262 END DO 263 264 ENDIF 265 ! 266 END SUBROUTINE sbc_wstress 267 268 191 269 SUBROUTINE sbc_wave( kt ) 192 270 !!--------------------------------------------------------------------- … … 211 289 ENDIF 212 290 213 IF( ln_tauoc .AND. .NOT. cpl_ wstrf) THEN !== Wave induced stress ==!291 IF( ln_tauoc .AND. .NOT. cpl_tauoc ) THEN !== Wave induced stress ==! 214 292 CALL fld_read( kt, nn_fsbc, sf_tauoc ) ! read wave norm stress from external forcing 215 293 tauoc_wave(:,:) = sf_tauoc(1)%fnow(:,:,1) 294 ENDIF 295 296 IF( ln_tauw .AND. .NOT. cpl_tauw ) THEN !== Wave induced stress ==! 297 CALL fld_read( kt, nn_fsbc, sf_tauw ) ! read ocean stress components from external forcing (T grid) 298 tauw_x(:,:) = sf_tauw(1)%fnow(:,:,1) 299 tauw_y(:,:) = sf_tauw(2)%fnow(:,:,1) 216 300 ENDIF 217 301 … … 222 306 IF( jp_hsw > 0 ) hsw (:,:) = sf_sd(jp_hsw)%fnow(:,:,1) ! significant wave height 223 307 IF( jp_wmp > 0 ) wmp (:,:) = sf_sd(jp_wmp)%fnow(:,:,1) ! wave mean period 308 IF( jp_wfr > 0 ) wfreq(:,:) = sf_sd(jp_wfr)%fnow(:,:,1) ! Peak wave frequency 224 309 IF( jp_usd > 0 ) ut0sd(:,:) = sf_sd(jp_usd)%fnow(:,:,1) ! 2D zonal Stokes Drift at T point 225 310 IF( jp_vsd > 0 ) vt0sd(:,:) = sf_sd(jp_vsd)%fnow(:,:,1) ! 2D meridional Stokes Drift at T point … … 234 319 ! !== Computation of the 3d Stokes Drift ==! 235 320 ! 236 IF( jpfld == 4 ) CALL sbc_stokes() ! Calculate only if required fields are read 237 ! ! In coupled wave model-NEMO case the call is done after coupling 321 IF( ((nn_sdrift==jp_breivik .OR. nn_sdrift==jp_phillips) .AND. & 322 jp_hsw>0 .AND. jp_wmp>0 .AND. jp_usd>0 .AND. jp_vsd>0) .OR. & 323 (nn_sdrift==jp_peakfr .AND. jp_wfr>0 .AND. jp_usd>0 .AND. jp_vsd>0) ) & 324 CALL sbc_stokes() ! Calculate only if required fields are read 325 ! ! In coupled wave model-NEMO case the call is done after coupling 238 326 ! 239 327 ENDIF … … 260 348 !! 261 349 CHARACTER(len=100) :: cn_dir ! Root directory for location of drag coefficient files 262 TYPE(FLD_N), ALLOCATABLE, DIMENSION(:) :: slf_i ! array of namelist informations on the fields to read350 TYPE(FLD_N), ALLOCATABLE, DIMENSION(:) :: slf_i, slf_j ! array of namelist informations on the fields to read 263 351 TYPE(FLD_N) :: sn_cdg, sn_usd, sn_vsd, & 264 & sn_hsw, sn_wmp, sn_wnum, sn_tauoc ! informations about the fields to be read 265 ! 266 NAMELIST/namsbc_wave/ sn_cdg, cn_dir, sn_usd, sn_vsd, sn_hsw, sn_wmp, sn_wnum, sn_tauoc 352 & sn_hsw, sn_wmp, sn_wfr, sn_wnum, & 353 & sn_tauoc, sn_tauwx, sn_tauwy ! informations about the fields to be read 354 ! 355 NAMELIST/namsbc_wave/ sn_cdg, cn_dir, sn_usd, sn_vsd, sn_hsw, sn_wmp, sn_wfr, & 356 sn_wnum, sn_tauoc, sn_tauwx, sn_tauwy 267 357 !!--------------------------------------------------------------------- 268 358 ! … … 289 379 290 380 IF( ln_tauoc ) THEN 291 IF( .NOT. cpl_ wstrf) THEN381 IF( .NOT. cpl_tauoc ) THEN 292 382 ALLOCATE( sf_tauoc(1), STAT=ierror ) !* allocate and fill sf_wave with sn_tauoc 293 383 IF( ierror > 0 ) CALL ctl_stop( 'STOP', 'sbc_wave_init: unable to allocate sf_wave structure' ) … … 300 390 ENDIF 301 391 392 IF( ln_tauw ) THEN 393 IF( .NOT. cpl_tauw ) THEN 394 ALLOCATE( sf_tauw(2), STAT=ierror ) !* allocate and fill sf_wave with sn_tauwx/y 395 IF( ierror > 0 ) CALL ctl_stop( 'STOP', 'sbc_wave_init: unable to allocate sf_tauw structure' ) 396 ! 397 ALLOCATE( slf_j(2) ) 398 slf_j(1) = sn_tauwx 399 slf_j(2) = sn_tauwy 400 ALLOCATE( sf_tauw(1)%fnow(jpi,jpj,1) ) 401 ALLOCATE( sf_tauw(2)%fnow(jpi,jpj,1) ) 402 IF( slf_j(1)%ln_tint ) ALLOCATE( sf_tauw(1)%fdta(jpi,jpj,1,2) ) 403 IF( slf_j(2)%ln_tint ) ALLOCATE( sf_tauw(2)%fdta(jpi,jpj,1,2) ) 404 CALL fld_fill( sf_tauw, (/ slf_j /), cn_dir, 'sbc_wave_init', 'read wave input', 'namsbc_wave' ) 405 ENDIF 406 ALLOCATE( tauw_x(jpi,jpj) ) 407 ALLOCATE( tauw_y(jpi,jpj) ) 408 ENDIF 409 302 410 IF( ln_sdw ) THEN ! Find out how many fields have to be read from file if not coupled 303 411 jpfld=0 304 jp_usd=0 ; jp_vsd=0 ; jp_hsw=0 ; jp_wmp=0 412 jp_usd=0 ; jp_vsd=0 ; jp_hsw=0 ; jp_wmp=0 ; jp_wfr=0 305 413 IF( .NOT. cpl_sdrftx ) THEN 306 414 jpfld = jpfld + 1 … … 311 419 jp_vsd = jpfld 312 420 ENDIF 313 IF( .NOT. cpl_hsig ) THEN421 IF( .NOT. cpl_hsig .AND. (nn_sdrift==jp_breivik .OR. nn_sdrift==jp_phillips) ) THEN 314 422 jpfld = jpfld + 1 315 423 jp_hsw = jpfld 316 424 ENDIF 317 IF( .NOT. cpl_wper ) THEN425 IF( .NOT. cpl_wper .AND. (nn_sdrift==jp_breivik .OR. nn_sdrift==jp_phillips) ) THEN 318 426 jpfld = jpfld + 1 319 427 jp_wmp = jpfld 428 ENDIF 429 IF( .NOT. cpl_wfreq .AND. nn_sdrift==jp_peakfr ) THEN 430 jpfld = jpfld + 1 431 jp_wfr = jpfld 320 432 ENDIF 321 433 … … 327 439 IF( jp_hsw > 0 ) slf_i(jp_hsw) = sn_hsw 328 440 IF( jp_wmp > 0 ) slf_i(jp_wmp) = sn_wmp 441 IF( jp_wfr > 0 ) slf_i(jp_wfr) = sn_wfr 442 329 443 ALLOCATE( sf_sd(jpfld), STAT=ierror ) !* allocate and fill sf_sd with stokes drift 330 444 IF( ierror > 0 ) CALL ctl_stop( 'STOP', 'sbc_wave_init: unable to allocate sf_wave structure' ) … … 339 453 ALLOCATE( usd (jpi,jpj,jpk), vsd (jpi,jpj,jpk), wsd(jpi,jpj,jpk) ) 340 454 ALLOCATE( hsw (jpi,jpj) , wmp (jpi,jpj) ) 455 ALLOCATE( wfreq(jpi,jpj) ) 341 456 ALLOCATE( ut0sd(jpi,jpj) , vt0sd(jpi,jpj) ) 342 457 ALLOCATE( div_sd(jpi,jpj) )
Note: See TracChangeset
for help on using the changeset viewer.