New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 11772 for NEMO/branches/2019/dev_r11085_ASINTER-05_Brodeau_Advanced_Bulk/src/OCE/SBC/sbcblk_algo_coare3p0.F90 – NEMO

Ignore:
Timestamp:
2019-10-23T16:04:12+02:00 (4 years ago)
Author:
laurent
Message:

LB: solid updates+improvements of cool-skin/warm-layer capabilty of COARE and ECMWF bulk algorithms!

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  
    4949   REAL(wp), PARAMETER ::   Beta0   =   1.25_wp   ! gustiness parameter 
    5050 
    51    INTEGER , PARAMETER ::   nb_itt = 5             ! number of itterations 
     51   INTEGER , PARAMETER ::   nb_itt = 10             ! number of itterations 
    5252 
    5353   !!---------------------------------------------------------------------- 
     
    7070      IF ( l_use_wl ) THEN 
    7171         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 ) 
    7373         !IF( ierr > 0 ) STOP ' COARE3P0_INIT => allocation of Tau_ac and Qnt_ac failed!' 
    7474         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 
    7778      END IF 
    7879      !! 
    7980      IF ( l_use_cs ) THEN 
    8081         ierr = 0 
    81          ALLOCATE ( delta_vl(jpi,jpj), STAT=ierr ) 
    82          !IF( ierr > 0 ) STOP ' COARE3P0_INIT => allocation of delta_vl and Qnt_ac failed!' 
    83          delta_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 
    8485      END IF 
    8586   END SUBROUTINE coare3p0_init 
     
    9192      &                      Cdn, Chn, Cen,                                              & 
    9293      &                      Qsw, rad_lw, slp, pdT_cs,                                   & ! optionals for cool-skin (and warm-layer) 
    93       &                      pdT_wl, Hwl )                                                 ! optionals for warm-layer only 
     94      &                      pdT_wl, pHz_wl )                                                 ! optionals for warm-layer only 
    9495      !!---------------------------------------------------------------------- 
    9596      !!                      ***  ROUTINE  turb_coare3p0  *** 
     
    133134      !!    * pdT_cs  : SST increment "dT" for cool-skin correction           [K] 
    134135      !!    * 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] 
    136137      !! 
    137138      !! OUTPUT : 
     
    171172      ! 
    172173      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] 
    174175      ! 
    175176      INTEGER :: j_itt 
     
    190191         &                pdTw,   &  ! SST increment "dT" for warm layer correction          [K] 
    191192         &                zHwl       ! depth of warm-layer [m] 
     193      CHARACTER(len=40), PARAMETER :: crtnm = 'turb_coare3p0@sbcblk_algo_coare3p0' 
    192194      !!---------------------------------------------------------------------------------- 
    193195 
    194       IF ( kt == 1 ) CALL COARE3P0_INIT(l_use_cs, l_use_wl) ! allocation of accumulation arrays 
     196      IF ( kt == nit000 ) CALL COARE3P0_INIT(l_use_cs, l_use_wl) 
    195197 
    196198      l_zt_equal_zu = .FALSE. 
     
    199201 
    200202      !! 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 
    201215      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' ) 
    204216         ALLOCATE ( zsst(jpi,jpj) ) 
    205217         zsst = T_s ! backing up the bulk SST 
    206          IF( l_use_cs ) T_s = T_s - 0.25   ! First guess of correction 
     218         IF( l_use_cs ) T_s = T_s - 0.25_wp   ! First guess of correction 
    207219         q_s    = rdct_qsat_salt*q_sat(MAX(T_s, 200._wp), slp) ! First guess of q_s !LOLO WL too!!! 
    208       END IF 
    209       IF ( l_use_cs ) THEN 
    210          ALLOCATE ( pdTc(jpi,jpj) ) 
    211          pdTc(:,:) = -0.25_wp  ! First guess of skin correction 
    212       END IF 
    213       IF ( l_use_wl ) THEN 
    214          ALLOCATE ( pdTw(jpi,jpj) ) 
    215          IF (PRESENT(Hwl)) ALLOCATE ( zHwl(jpi,jpj) ) 
    216220      END IF 
    217221 
     
    323327            !! Cool-skin contribution 
    324328 
    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, & 
    326330               &                   ztmp1, zeta_u,  Qlat=ztmp2)  ! Qnsol -> ztmp1 / Tau -> zeta_u 
    327331 
    328             CALL CS_COARE( Qsw, ztmp1, u_star, zsst, ztmp2,  pdTc )  ! ! Qnsol -> ztmp1 / Qlat -> ztmp2 
    329  
    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) 
    332336            q_s(:,:) = rdct_qsat_salt*q_sat(MAX(T_s(:,:), 200._wp), slp(:,:)) 
    333337 
     
    336340         IF( l_use_wl ) THEN 
    337341            !! 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, & 
    339343               &                   ztmp1, zeta_u)  ! Qnsol -> ztmp1 / Tau -> zeta_u 
    340344            !! 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 
    346347            !! 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) 
    349350            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 
    360352 
    361353         IF( l_use_cs .OR. l_use_wl .OR. (.NOT. l_zt_equal_zu) ) THEN 
     
    379371      IF( .NOT. l_zt_equal_zu ) DEALLOCATE( zeta_t ) 
    380372 
    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 
    383376 
    384377      IF ( l_use_cs .OR. l_use_wl ) DEALLOCATE ( zsst ) 
    385       IF (          l_use_cs      ) DEALLOCATE ( pdTc ) 
    386       IF (          l_use_wl      ) THEN 
    387          DEALLOCATE ( pdTw ) 
    388          IF (PRESENT(Hwl)) DEALLOCATE ( zHwl ) 
    389       END IF 
    390378 
    391379   END SUBROUTINE turb_coare3p0 
Note: See TracChangeset for help on using the changeset viewer.