Changeset 11785 for NEMO/branches/2019/dev_r11085_ASINTER-05_Brodeau_Advanced_Bulk/src/OCE/SBC/sbcblk_algo_coare3p0.F90
- Timestamp:
- 2019-10-24T12:38:43+02:00 (5 years ago)
- File:
-
- 1 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
Note: See TracChangeset
for help on using the changeset viewer.