Changeset 11772 for NEMO/branches/2019/dev_r11085_ASINTER-05_Brodeau_Advanced_Bulk/src/OCE/SBC/sbcblk_algo_coare3p0.F90
- Timestamp:
- 2019-10-23T16:04:12+02: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_coare3p0.F90
r11672 r11772 49 49 REAL(wp), PARAMETER :: Beta0 = 1.25_wp ! gustiness parameter 50 50 51 INTEGER , PARAMETER :: nb_itt = 5! number of itterations51 INTEGER , PARAMETER :: nb_itt = 10 ! number of itterations 52 52 53 53 !!---------------------------------------------------------------------- … … 70 70 IF ( l_use_wl ) THEN 71 71 ierr = 0 72 ALLOCATE ( Tau_ac(jpi,jpj) , Qnt_ac(jpi,jpj), H _wl(jpi,jpj), STAT=ierr )72 ALLOCATE ( Tau_ac(jpi,jpj) , Qnt_ac(jpi,jpj), Hz_wl(jpi,jpj), dT_wl(jpi,jpj), STAT=ierr ) 73 73 !IF( ierr > 0 ) STOP ' COARE3P0_INIT => allocation of Tau_ac and Qnt_ac failed!' 74 74 Tau_ac(:,:) = 0._wp 75 Qnt_ac(:,:) = 0._wp 76 H_wl(:,:) = H_wl_max 75 Qnt_ac(:,:) = 0._wp 76 Hz_wl(:,:) = Hwl_max 77 dT_wl(:,:) = 0._wp 77 78 END IF 78 79 !! 79 80 IF ( l_use_cs ) THEN 80 81 ierr = 0 81 ALLOCATE ( d elta_vl(jpi,jpj), STAT=ierr )82 !IF( ierr > 0 ) STOP ' COARE3P0_INIT => allocation of d elta_vland Qnt_ac failed!'83 d elta_vl(:,:) = 0.001_wp ! First guess of zdelta [m]82 ALLOCATE ( dT_cs(jpi,jpj), STAT=ierr ) 83 !IF( ierr > 0 ) STOP ' COARE3P0_INIT => allocation of dT_cs and Qnt_ac failed!' 84 dT_cs(:,:) = -0.25_wp ! First guess of skin correction 84 85 END IF 85 86 END SUBROUTINE coare3p0_init … … 91 92 & Cdn, Chn, Cen, & 92 93 & Qsw, rad_lw, slp, pdT_cs, & ! optionals for cool-skin (and warm-layer) 93 & pdT_wl, Hwl ) ! optionals for warm-layer only94 & pdT_wl, pHz_wl ) ! optionals for warm-layer only 94 95 !!---------------------------------------------------------------------- 95 96 !! *** ROUTINE turb_coare3p0 *** … … 133 134 !! * pdT_cs : SST increment "dT" for cool-skin correction [K] 134 135 !! * pdT_wl : SST increment "dT" for warm-layer correction [K] 135 !! * Hwl : depth of warm layer[m]136 !! * pHz_wl : thickness of warm-layer [m] 136 137 !! 137 138 !! OUTPUT : … … 171 172 ! 172 173 REAL(wp), INTENT( out), OPTIONAL, DIMENSION(jpi,jpj) :: pdT_wl ! [K] 173 REAL(wp), INTENT( out), OPTIONAL, DIMENSION(jpi,jpj) :: Hwl! [m]174 REAL(wp), INTENT( out), OPTIONAL, DIMENSION(jpi,jpj) :: pHz_wl ! [m] 174 175 ! 175 176 INTEGER :: j_itt … … 190 191 & pdTw, & ! SST increment "dT" for warm layer correction [K] 191 192 & zHwl ! depth of warm-layer [m] 193 CHARACTER(len=40), PARAMETER :: crtnm = 'turb_coare3p0@sbcblk_algo_coare3p0' 192 194 !!---------------------------------------------------------------------------------- 193 195 194 IF ( kt == 1 ) CALL COARE3P0_INIT(l_use_cs, l_use_wl) ! allocation of accumulation arrays196 IF ( kt == nit000 ) CALL COARE3P0_INIT(l_use_cs, l_use_wl) 195 197 196 198 l_zt_equal_zu = .FALSE. … … 199 201 200 202 !! Initializations for cool skin and warm layer: 203 IF ( l_use_cs ) THEN 204 IF( .NOT.(PRESENT(Qsw) .AND. PRESENT(rad_lw) .AND. PRESENT(slp)) ) THEN 205 PRINT *, ' * PROBLEM ('//TRIM(crtnm)//'): you need to provide Qsw, rad_lw & slp to use cool-skin param!'; STOP 206 END IF 207 END IF 208 209 IF ( l_use_wl ) THEN 210 IF(.NOT.(PRESENT(Qsw) .AND. PRESENT(rad_lw) .AND. PRESENT(slp) )) THEN 211 PRINT *, ' * PROBLEM ('//TRIM(crtnm)//'): you need to provide Qsw, rad_lw & slp to use warm-layer param!'; STOP 212 END IF 213 END IF 214 201 215 IF ( l_use_cs .OR. l_use_wl ) THEN 202 IF( .NOT.(PRESENT(Qsw) .AND. PRESENT(rad_lw) .AND. PRESENT(slp)) ) &203 & CALL ctl_stop( 'turb_coare3p0 => provide Qsw, rad_lw & slp to ', 'use cool-skin and/or warm-layer param' )204 216 ALLOCATE ( zsst(jpi,jpj) ) 205 217 zsst = T_s ! backing up the bulk SST 206 IF( l_use_cs ) T_s = T_s - 0.25 ! First guess of correction218 IF( l_use_cs ) T_s = T_s - 0.25_wp ! First guess of correction 207 219 q_s = rdct_qsat_salt*q_sat(MAX(T_s, 200._wp), slp) ! First guess of q_s !LOLO WL too!!! 208 END IF209 IF ( l_use_cs ) THEN210 ALLOCATE ( pdTc(jpi,jpj) )211 pdTc(:,:) = -0.25_wp ! First guess of skin correction212 END IF213 IF ( l_use_wl ) THEN214 ALLOCATE ( pdTw(jpi,jpj) )215 IF (PRESENT(Hwl)) ALLOCATE ( zHwl(jpi,jpj) )216 220 END IF 217 221 … … 323 327 !! Cool-skin contribution 324 328 325 CALL UPDATE_QNSOL_TAU( T_s, q_s, t_zu, q_zu, u_star, t_star, q_star, U_blk, slp, rad_lw, &329 CALL UPDATE_QNSOL_TAU( zu, T_s, q_s, t_zu, q_zu, u_star, t_star, q_star, U_zu, U_blk, slp, rad_lw, & 326 330 & ztmp1, zeta_u, Qlat=ztmp2) ! Qnsol -> ztmp1 / Tau -> zeta_u 327 331 328 CALL CS_COARE( Qsw, ztmp1, u_star, zsst, ztmp2 , pdTc) ! ! Qnsol -> ztmp1 / Qlat -> ztmp2329 330 T_s(:,:) = zsst(:,:) + pdTc(:,:)*tmask(:,:,1)331 IF( l_use_wl ) T_s(:,:) = T_s(:,:) + pdTw(:,:)*tmask(:,:,1)332 CALL CS_COARE( Qsw, ztmp1, u_star, zsst, ztmp2 ) ! ! Qnsol -> ztmp1 / Qlat -> ztmp2 333 334 T_s(:,:) = zsst(:,:) + dT_cs(:,:)*tmask(:,:,1) 335 IF( l_use_wl ) T_s(:,:) = T_s(:,:) + dT_wl(:,:)*tmask(:,:,1) 332 336 q_s(:,:) = rdct_qsat_salt*q_sat(MAX(T_s(:,:), 200._wp), slp(:,:)) 333 337 … … 336 340 IF( l_use_wl ) THEN 337 341 !! Warm-layer contribution 338 CALL UPDATE_QNSOL_TAU( T_s, q_s, t_zu, q_zu, u_star, t_star, q_star, U_blk, slp, rad_lw, &342 CALL UPDATE_QNSOL_TAU( zu, T_s, q_s, t_zu, q_zu, u_star, t_star, q_star, U_zu, U_blk, slp, rad_lw, & 339 343 & ztmp1, zeta_u) ! Qnsol -> ztmp1 / Tau -> zeta_u 340 344 !! In WL_COARE or , Tau_ac and Qnt_ac must be updated at the final itteration step => add a flag to do this! 341 IF (PRESENT(Hwl)) THEN 342 CALL WL_COARE( Qsw, ztmp1, zeta_u, zsst, MOD(nb_itt,j_itt), pdTw, Hwl=zHwl ) 343 ELSE 344 CALL WL_COARE( Qsw, ztmp1, zeta_u, zsst, MOD(nb_itt,j_itt), pdTw ) 345 END IF 345 CALL WL_COARE( Qsw, ztmp1, zeta_u, zsst, MOD(nb_itt,j_itt) ) 346 346 347 !! Updating T_s and q_s !!! 347 T_s(:,:) = zsst(:,:) + pdTw(:,:)*tmask(:,:,1)348 IF( l_use_cs ) T_s(:,:) = T_s(:,:) + pdTc(:,:)*tmask(:,:,1)348 T_s(:,:) = zsst(:,:) + dT_wl(:,:)*tmask(:,:,1) 349 IF( l_use_cs ) T_s(:,:) = T_s(:,:) + dT_cs(:,:)*tmask(:,:,1) 349 350 q_s(:,:) = rdct_qsat_salt*q_sat(MAX(T_s(:,:), 200._wp), slp(:,:)) 350 !LOLO: 351 !IF ( j_itt == nb_itt) THEN 352 ! WRITE(cf_tmp,'("Qnt_ac_k",i5.5,"_p",i4.4,".nc")') kt, narea 353 ! CALL DUMP_FIELD(REAL( Qnt_ac*tmask(:,:,1) , 4), TRIM(cf_tmp), 'Qnt_ac') 354 ! WRITE(cf_tmp, '("pdTw_k",i5.5,"_p",i4.4,".nc")') kt, narea 355 ! CALL DUMP_FIELD(REAL( pdTw*tmask(:,:,1) , 4), TRIM(cf_tmp), 'pdTw') 356 !END IF 357 !LOLO. 358 END IF 359 351 END IF 360 352 361 353 IF( l_use_cs .OR. l_use_wl .OR. (.NOT. l_zt_equal_zu) ) THEN … … 379 371 IF( .NOT. l_zt_equal_zu ) DEALLOCATE( zeta_t ) 380 372 381 IF ( l_use_cs .AND. PRESENT(pdT_cs) ) pdT_cs = pdTc*tmask(:,:,1) 382 IF ( l_use_wl .AND. PRESENT(pdT_wl) ) pdT_wl = pdTw*tmask(:,:,1) 373 IF ( l_use_cs .AND. PRESENT(pdT_cs) ) pdT_cs = dT_cs 374 IF ( l_use_wl .AND. PRESENT(pdT_wl) ) pdT_wl = dT_wl 375 IF ( l_use_wl .AND. PRESENT(pHz_wl) ) pHz_wl = Hz_wl 383 376 384 377 IF ( l_use_cs .OR. l_use_wl ) DEALLOCATE ( zsst ) 385 IF ( l_use_cs ) DEALLOCATE ( pdTc )386 IF ( l_use_wl ) THEN387 DEALLOCATE ( pdTw )388 IF (PRESENT(Hwl)) DEALLOCATE ( zHwl )389 END IF390 378 391 379 END SUBROUTINE turb_coare3p0
Note: See TracChangeset
for help on using the changeset viewer.