Changeset 11785 for NEMO/branches
- Timestamp:
- 2019-10-24T12:38:43+02:00 (5 years ago)
- Location:
- NEMO/branches/2019/dev_r11085_ASINTER-05_Brodeau_Advanced_Bulk/src/OCE/SBC
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2019/dev_r11085_ASINTER-05_Brodeau_Advanced_Bulk/src/OCE/SBC/sbcblk_algo_coare3p0.F90
r11772 r11785 45 45 PUBLIC :: COARE3P0_INIT, TURB_COARE3P0 46 46 47 ! !! COARE own values for given constants:48 REAL(wp), PARAMETER :: zi0= 600._wp ! scale height of the atmospheric boundary layer...49 REAL(wp), PARAMETER :: Beta0 = 1.25_wp! gustiness parameter47 !! COARE own values for given constants: 48 REAL(wp), PARAMETER :: zi0 = 600._wp ! scale height of the atmospheric boundary layer... 49 REAL(wp), PARAMETER :: Beta0 = 1.25_wp ! gustiness parameter 50 50 51 51 INTEGER , PARAMETER :: nb_itt = 10 ! number of itterations … … 71 71 ierr = 0 72 72 ALLOCATE ( Tau_ac(jpi,jpj) , Qnt_ac(jpi,jpj), Hz_wl(jpi,jpj), dT_wl(jpi,jpj), STAT=ierr ) 73 !IF( ierr > 0 ) STOP ' COARE3P0_INIT => allocation of Tau_ac and Qnt_acfailed!'73 !IF( ierr > 0 ) STOP ' COARE3P0_INIT => allocation of Tau_ac, Qnt_ac, dT_wl & Hz_wl failed!' 74 74 Tau_ac(:,:) = 0._wp 75 75 Qnt_ac(:,:) = 0._wp 76 dT_wl(:,:) = 0._wp 76 77 Hz_wl(:,:) = Hwl_max 77 dT_wl(:,:) = 0._wp78 78 END IF 79 79 !! … … 81 81 ierr = 0 82 82 ALLOCATE ( dT_cs(jpi,jpj), STAT=ierr ) 83 !IF( ierr > 0 ) STOP ' COARE3P0_INIT => allocation of dT_cs and Qnt_acfailed!'83 !IF( ierr > 0 ) STOP ' COARE3P0_INIT => allocation of dT_cs failed!' 84 84 dT_cs(:,:) = -0.25_wp ! First guess of skin correction 85 85 END IF … … 132 132 !! * rad_lw : downwelling longwave radiation at the surface (>0) [W/m^2] 133 133 !! * slp : sea-level pressure [Pa] 134 !! 135 !! OPTIONAL OUTPUT: 136 !! ---------------- 134 137 !! * pdT_cs : SST increment "dT" for cool-skin correction [K] 135 138 !! * pdT_wl : SST increment "dT" for warm-layer correction [K] … … 170 173 REAL(wp), INTENT(in ), OPTIONAL, DIMENSION(jpi,jpj) :: slp ! [Pa] 171 174 REAL(wp), INTENT( out), OPTIONAL, DIMENSION(jpi,jpj) :: pdT_cs 172 !173 175 REAL(wp), INTENT( out), OPTIONAL, DIMENSION(jpi,jpj) :: pdT_wl ! [K] 174 176 REAL(wp), INTENT( out), OPTIONAL, DIMENSION(jpi,jpj) :: pHz_wl ! [m] … … 193 195 CHARACTER(len=40), PARAMETER :: crtnm = 'turb_coare3p0@sbcblk_algo_coare3p0' 194 196 !!---------------------------------------------------------------------------------- 195 196 197 IF ( kt == nit000 ) CALL COARE3P0_INIT(l_use_cs, l_use_wl) 197 198 … … 208 209 209 210 IF ( l_use_wl ) THEN 210 IF( .NOT.(PRESENT(Qsw) .AND. PRESENT(rad_lw) .AND. PRESENT(slp) )) THEN211 IF( .NOT.(PRESENT(Qsw) .AND. PRESENT(rad_lw) .AND. PRESENT(slp)) ) THEN 211 212 PRINT *, ' * PROBLEM ('//TRIM(crtnm)//'): you need to provide Qsw, rad_lw & slp to use warm-layer param!'; STOP 212 213 END IF … … 217 218 zsst = T_s ! backing up the bulk SST 218 219 IF( l_use_cs ) T_s = T_s - 0.25_wp ! First guess of correction 219 q_s = rdct_qsat_salt*q_sat(MAX(T_s, 200._wp), slp) ! First guess of q_s !LOLO WL too!!!220 q_s = rdct_qsat_salt*q_sat(MAX(T_s, 200._wp), slp) ! First guess of q_s 220 221 END IF 221 222 … … 238 239 239 240 z0 = alfa_charn_3p0(U_zu)*u_star*u_star/grav + 0.11_wp*znu_a/u_star 240 z0 = MIN(ABS(z0), 0.001_wp) ! (prevent FPE from stupid values from masked region later on...) !#LOLO 241 z0 = MIN( MAX(ABS(z0), 1.E-9) , 1._wp ) ! (prevents FPE from stupid values from masked region later on) 242 241 243 z0t = 1._wp / ( 0.1_wp*EXP(vkarmn/(0.00115/(vkarmn/ztmp1))) ) 242 z0t = MIN( ABS(z0t), 0.001_wp) ! (prevent FPE from stupid values from masked region later on...) !#LOLO244 z0t = MIN( MAX(ABS(z0t), 1.E-9) , 1._wp ) ! (prevents FPE from stupid values from masked region later on) 243 245 244 246 Cd = (vkarmn/ztmp0)**2 ! first guess of Cd … … 258 260 ztmp0 = vkarmn/(LOG(zu/z0t) - psi_h_coare(zeta_u)) 259 261 260 u_star = U_blk*vkarmn/(LOG(zu) - LOG(z0) - psi_m_coare(zeta_u))262 u_star = MAX ( U_blk*vkarmn/(LOG(zu) - LOG(z0) - psi_m_coare(zeta_u)) , 1.E-9 ) ! (MAX => prevents FPE from stupid values from masked region later on) 261 263 t_star = dt_zu*ztmp0 262 264 q_star = dq_zu*ztmp0 … … 281 283 !!Inverse of Monin-Obukov length (1/L) : 282 284 ztmp0 = One_on_L(t_zu, q_zu, u_star, t_star, q_star) ! 1/L == 1/[Monin-Obukhov length] 283 ztmp0 = SIGN( MIN(ABS(ztmp0),200._wp), ztmp0 ) ! (prevents FPE from stupid values from masked region later on...) !#LOLO285 ztmp0 = SIGN( MIN(ABS(ztmp0),200._wp), ztmp0 ) ! (prevents FPE from stupid values from masked region later on...) 284 286 285 287 ztmp1 = u_star*u_star ! u*^2 … … 305 307 ztmp2 = u_star/vkarmn*LOG(10./z0) ! Neutral wind speed at 10m 306 308 z0 = alfa_charn_3p0(ztmp2)*ztmp1/grav + 0.11_wp*znu_a/u_star ! Roughness length (eq.6) 309 z0 = MIN( MAX(ABS(z0), 1.E-9) , 1._wp ) ! (prevents FPE from stupid values from masked region later on) 310 307 311 ztmp1 = ( znu_a / (z0*u_star) )**0.6_wp ! (1./Re_r)^0.72 (Re_r: roughness Reynolds number) COARE3.6-specific! 308 312 z0t = MIN( 1.1E-4_wp , 5.5E-5_wp*ztmp1 ) ! Scalar roughness for both theta and q (eq.28) #LOLO: some use 1.15 not 1.1 !!! 313 z0t = MIN( MAX(ABS(z0t), 1.E-9) , 1._wp ) ! (prevents FPE from stupid values from masked region later on) 309 314 310 315 !! Turbulent scales at zu : 311 316 ztmp0 = psi_h_coare(zeta_u) 312 ztmp1 = vkarmn/(LOG(zu) - LOG(z0t) - ztmp0) ! #L OLO: in ztmp0, some use psi_h_coare(zeta_t) rather than psi_h_coare(zeta_t) ???317 ztmp1 = vkarmn/(LOG(zu) - LOG(z0t) - ztmp0) ! #LB: in ztmp0, some use psi_h_coare(zeta_t) rather than psi_h_coare(zeta_t) ??? 313 318 314 319 t_star = dt_zu*ztmp1 315 320 q_star = dq_zu*ztmp1 316 u_star = U_blk*vkarmn/(LOG(zu) - LOG(z0) - psi_m_coare(zeta_u))321 u_star = MAX( U_blk*vkarmn/(LOG(zu) - LOG(z0) - psi_m_coare(zeta_u)) , 1.E-9 ) ! (MAX => prevents FPE from stupid values from masked region later on) 317 322 318 323 IF( .NOT. l_zt_equal_zu ) THEN -
NEMO/branches/2019/dev_r11085_ASINTER-05_Brodeau_Advanced_Bulk/src/OCE/SBC/sbcblk_algo_coare3p6.F90
r11772 r11785 195 195 CHARACTER(len=40), PARAMETER :: crtnm = 'turb_coare3p6@sbcblk_algo_coare3p6' 196 196 !!---------------------------------------------------------------------------------- 197 198 197 IF ( kt == nit000 ) CALL COARE3P6_INIT(l_use_cs, l_use_wl) 199 198 … … 219 218 zsst = T_s ! backing up the bulk SST 220 219 IF( l_use_cs ) T_s = T_s - 0.25_wp ! First guess of correction 221 q_s = rdct_qsat_salt*q_sat(MAX(T_s, 200._wp), slp) ! First guess of q_s !LOLO WL too!!!220 q_s = rdct_qsat_salt*q_sat(MAX(T_s, 200._wp), slp) ! First guess of q_s 222 221 END IF 223 222 … … 240 239 241 240 z0 = alfa_charn_3p6(U_zu)*u_star*u_star/grav + 0.11_wp*znu_a/u_star 242 z0 = MIN(ABS(z0), 0.001_wp) ! (prevent FPE from stupid values from masked region later on...) !#LOLO 241 z0 = MIN( MAX(ABS(z0), 1.E-9) , 1._wp ) ! (prevents FPE from stupid values from masked region later on) 242 243 243 z0t = 1._wp / ( 0.1_wp*EXP(vkarmn/(0.00115/(vkarmn/ztmp1))) ) 244 z0t = MIN( ABS(z0t), 0.001_wp) ! (prevent FPE from stupid values from masked region later on...) !#LOLO244 z0t = MIN( MAX(ABS(z0t), 1.E-9) , 1._wp ) ! (prevents FPE from stupid values from masked region later on) 245 245 246 246 Cd = (vkarmn/ztmp0)**2 ! first guess of Cd … … 260 260 ztmp0 = vkarmn/(LOG(zu/z0t) - psi_h_coare(zeta_u)) 261 261 262 u_star = U_blk*vkarmn/(LOG(zu) - LOG(z0) - psi_m_coare(zeta_u))262 u_star = MAX ( U_blk*vkarmn/(LOG(zu) - LOG(z0) - psi_m_coare(zeta_u)) , 1.E-9 ) ! (MAX => prevents FPE from stupid values from masked region later on) 263 263 t_star = dt_zu*ztmp0 264 264 q_star = dq_zu*ztmp0 … … 283 283 !!Inverse of Monin-Obukov length (1/L) : 284 284 ztmp0 = One_on_L(t_zu, q_zu, u_star, t_star, q_star) ! 1/L == 1/[Monin-Obukhov length] 285 ztmp0 = SIGN( MIN(ABS(ztmp0),200._wp), ztmp0 ) ! (prevents FPE from stupid values from masked region later on...) !#LOLO285 ztmp0 = SIGN( MIN(ABS(ztmp0),200._wp), ztmp0 ) ! (prevents FPE from stupid values from masked region later on...) 286 286 287 287 ztmp1 = u_star*u_star ! u*^2 … … 307 307 ztmp2 = u_star/vkarmn*LOG(10./z0) ! Neutral wind speed at 10m 308 308 z0 = alfa_charn_3p6(ztmp2)*ztmp1/grav + 0.11_wp*znu_a/u_star ! Roughness length (eq.6) [ ztmp1==u*^2 ] 309 z0 = MIN( MAX(ABS(z0), 1.E-9) , 1._wp ) ! (prevents FPE from stupid values from masked region later on) 310 309 311 ztmp1 = ( znu_a / (z0*u_star) )**0.72_wp ! COARE3.6-specific! (1./Re_r)^0.72 (Re_r: roughness Reynolds number) COARE3.6-specific! 310 312 z0t = MIN( 1.6E-4_wp , 5.8E-5_wp*ztmp1 ) ! COARE3.6-specific! 313 z0t = MIN( MAX(ABS(z0t), 1.E-9) , 1._wp ) ! (prevents FPE from stupid values from masked region later on) 311 314 312 315 !! Turbulent scales at zu : 313 316 ztmp0 = psi_h_coare(zeta_u) 314 ztmp1 = vkarmn/(LOG(zu) - LOG(z0t) - ztmp0) ! #L OLO: in ztmp0, some use psi_h_coare(zeta_t) rather than psi_h_coare(zeta_t) ???317 ztmp1 = vkarmn/(LOG(zu) - LOG(z0t) - ztmp0) ! #LB: in ztmp0, some use psi_h_coare(zeta_t) rather than psi_h_coare(zeta_t) ??? 315 318 316 319 t_star = dt_zu*ztmp1 317 320 q_star = dq_zu*ztmp1 318 u_star = U_blk*vkarmn/(LOG(zu) - LOG(z0) - psi_m_coare(zeta_u))321 u_star = MAX( U_blk*vkarmn/(LOG(zu) - LOG(z0) - psi_m_coare(zeta_u)) , 1.E-9 ) ! (MAX => prevents FPE from stupid values from masked region later on) 319 322 320 323 IF( .NOT. l_zt_equal_zu ) THEN -
NEMO/branches/2019/dev_r11085_ASINTER-05_Brodeau_Advanced_Bulk/src/OCE/SBC/sbcblk_algo_ecmwf.F90
r11772 r11785 46 46 PUBLIC :: ECMWF_INIT, TURB_ECMWF 47 47 48 ! !! ECMWF own values for given constants, taken form IFS documentation...48 !! ECMWF own values for given constants, taken form IFS documentation... 49 49 REAL(wp), PARAMETER :: charn0 = 0.018 ! Charnock constant (pretty high value here !!! 50 50 ! ! => Usually 0.011 for moderate winds) … … 213 213 214 214 IF ( l_use_wl ) THEN 215 IF( .NOT.(PRESENT(Qsw) .AND. PRESENT(rad_lw) .AND. PRESENT(slp)) ) THEN215 IF( .NOT.(PRESENT(Qsw) .AND. PRESENT(rad_lw) .AND. PRESENT(slp)) ) THEN 216 216 PRINT *, ' * PROBLEM ('//TRIM(crtnm)//'): you need to provide Qsw, rad_lw & slp to use warm-layer param!'; STOP 217 217 END IF … … 222 222 zsst = T_s ! backing up the bulk SST 223 223 IF( l_use_cs ) T_s = T_s - 0.25_wp ! First guess of correction 224 q_s = rdct_qsat_salt*q_sat(MAX(T_s, 200._wp), slp) ! First guess of q_s !LOLO WL too!!!224 q_s = rdct_qsat_salt*q_sat(MAX(T_s, 200._wp), slp) ! First guess of q_s 225 225 END IF 226 226 … … 245 245 246 246 z0 = charn0*u_star*u_star/grav + 0.11_wp*znu_a/u_star 247 z0 = MIN(ABS(z0), 0.001_wp) ! (prevent FPE from stupid values from masked region later on...) !#LOLO 247 z0 = MIN( MAX(ABS(z0), 1.E-9) , 1._wp ) ! (prevents FPE from stupid values from masked region later on) 248 248 249 z0t = 1._wp / ( 0.1_wp*EXP(vkarmn/(0.00115/(vkarmn/ztmp1))) ) 249 z0t = MIN( ABS(z0t), 0.001_wp) ! (prevent FPE from stupid values from masked region later on...) !#LOLO250 z0t = MIN( MAX(ABS(z0t), 1.E-9) , 1._wp ) ! (prevents FPE from stupid values from masked region later on) 250 251 251 252 Cd = (vkarmn/ztmp0)**2 ! first guess of Cd … … 265 266 ztmp0 = vkarmn/(LOG(zu/z0t) - psi_h_ecmwf(func_h)) 266 267 267 u_star = U_blk*vkarmn/(LOG(zu) - LOG(z0) - psi_m_ecmwf(func_h))268 u_star = MAX ( U_blk*vkarmn/(LOG(zu) - LOG(z0) - psi_m_ecmwf(func_h)) , 1.E-9 ) ! (MAX => prevents FPE from stupid values from masked region later on) 268 269 t_star = dt_zu*ztmp0 269 270 q_star = dq_zu*ztmp0
Note: See TracChangeset
for help on using the changeset viewer.