Changeset 11963 for NEMO/branches/2019/dev_r11085_ASINTER-05_Brodeau_Advanced_Bulk/src/OCE/SBC/sbcblk_algo_ecmwf.F90
- Timestamp:
- 2019-11-26T12:08:01+01:00 (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
NEMO/branches/2019/dev_r11085_ASINTER-05_Brodeau_Advanced_Bulk/src/OCE/SBC/sbcblk_algo_ecmwf.F90
r11962 r11963 74 74 INTEGER :: ierr 75 75 !!--------------------------------------------------------------------- 76 IF 76 IF( l_use_wl ) THEN 77 77 ierr = 0 78 78 ALLOCATE ( dT_wl(jpi,jpj), Hz_wl(jpi,jpj), STAT=ierr ) … … 80 80 dT_wl(:,:) = 0._wp 81 81 Hz_wl(:,:) = rd0 ! (rd0, constant, = 3m is default for Zeng & Beljaars) 82 END 83 IF 82 ENDIF 83 IF( l_use_cs ) THEN 84 84 ierr = 0 85 85 ALLOCATE ( dT_cs(jpi,jpj), STAT=ierr ) 86 86 IF( ierr > 0 ) CALL ctl_stop( ' SBCBLK_ALGO_ECMWF_INIT => allocation of dT_cs failed!' ) 87 87 dT_cs(:,:) = -0.25_wp ! First guess of skin correction 88 END 88 ENDIF 89 89 END SUBROUTINE sbcblk_algo_ecmwf_init 90 90 … … 195 195 !!---------------------------------------------------------------------------------- 196 196 197 IF 197 IF( kt == nit000 ) CALL SBCBLK_ALGO_ECMWF_INIT(l_use_cs, l_use_wl) 198 198 199 199 l_zt_equal_zu = .FALSE. … … 201 201 202 202 !! Initializations for cool skin and warm layer: 203 IF 203 IF( l_use_cs .AND. (.NOT.(PRESENT(Qsw) .AND. PRESENT(rad_lw) .AND. PRESENT(slp))) ) & 204 204 & CALL ctl_stop( '['//TRIM(crtnm)//'] => ' , 'you need to provide Qsw, rad_lw & slp to use cool-skin param!' ) 205 205 206 IF 206 IF( l_use_wl .AND. (.NOT.(PRESENT(Qsw) .AND. PRESENT(rad_lw) .AND. PRESENT(slp))) ) & 207 207 & CALL ctl_stop( '['//TRIM(crtnm)//'] => ' , 'you need to provide Qsw, rad_lw & slp to use warm-layer param!' ) 208 208 209 IF 209 IF( l_use_cs .OR. l_use_wl ) THEN 210 210 ALLOCATE ( zsst(jpi,jpj) ) 211 211 zsst = T_s ! backing up the bulk SST 212 212 IF( l_use_cs ) T_s = T_s - 0.25_wp ! First guess of correction 213 213 q_s = rdct_qsat_salt*q_sat(MAX(T_s, 200._wp), slp) ! First guess of q_s 214 END 214 ENDIF 215 215 216 216 … … 270 270 dt_zu = t_zu - T_s ; dt_zu = SIGN( MAX(ABS(dt_zu),1.E-6_wp), dt_zu ) 271 271 dq_zu = q_zu - q_s ; dq_zu = SIGN( MAX(ABS(dq_zu),1.E-9_wp), dq_zu ) 272 END 272 ENDIF 273 273 274 274 … … 293 293 Linv = ztmp0*func_m*func_m/func_h / zu ! From Eq. 3.23, Chap.3.2.3, IFS doc - Cy40r1 294 294 !! Note: it is slightly different that the L we would get with the usual 295 Linv = SIGN( MIN(ABS(Linv),200._wp), Linv ) ! (prevent FPE from stupid values from masked region later on...) !#LOLO295 Linv = SIGN( MIN(ABS(Linv),200._wp), Linv ) ! (prevent FPE from stupid values from masked region later on...) 296 296 297 297 !! Update func_m with new Linv: … … 335 335 ztmp1 = LOG(zt/zu) + ztmp2 336 336 q_zu = q_zt - q_star/vkarmn*ztmp1 337 END 337 ENDIF 338 338 339 339 !! Updating because of updated z0 and z0t and new Linv... … … 355 355 q_s(:,:) = rdct_qsat_salt*q_sat(MAX(T_s(:,:), 200._wp), slp(:,:)) 356 356 357 END 357 ENDIF 358 358 359 359 IF( l_use_wl ) THEN … … 366 366 IF( l_use_cs ) T_s(:,:) = T_s(:,:) + dT_cs(:,:)*tmask(:,:,1) 367 367 q_s(:,:) = rdct_qsat_salt*q_sat(MAX(T_s(:,:), 200._wp), slp(:,:)) 368 END 368 ENDIF 369 369 370 370 IF( l_use_cs .OR. l_use_wl .OR. (.NOT. l_zt_equal_zu) ) THEN 371 371 dt_zu = t_zu - T_s ; dt_zu = SIGN( MAX(ABS(dt_zu),1.E-6_wp), dt_zu ) 372 372 dq_zu = q_zu - q_s ; dq_zu = SIGN( MAX(ABS(dq_zu),1.E-9_wp), dq_zu ) 373 END 373 ENDIF 374 374 375 375 END DO !DO j_itt = 1, nb_itt … … 384 384 Cen = vkarmn*vkarmn / (log(zu/z0q)*log(zu/z0q)) 385 385 386 IF 387 IF 388 IF 389 390 IF 386 IF( l_use_cs .AND. PRESENT(pdT_cs) ) pdT_cs = dT_cs 387 IF( l_use_wl .AND. PRESENT(pdT_wl) ) pdT_wl = dT_wl 388 IF( l_use_wl .AND. PRESENT(pHz_wl) ) pHz_wl = Hz_wl 389 390 IF( l_use_cs .OR. l_use_wl ) DEALLOCATE ( zsst ) 391 391 392 392 END SUBROUTINE turb_ecmwf
Note: See TracChangeset
for help on using the changeset viewer.