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 11804 for NEMO/branches/2019/dev_r11085_ASINTER-05_Brodeau_Advanced_Bulk/src/OCE/SBC/sbcblk_skin_coare.F90 – NEMO

Ignore:
Timestamp:
2019-10-25T17:25:19+02:00 (5 years ago)
Author:
laurent
Message:

Use of "TURB_FLUXES@…" inside sbcblk.F90, positive latent HF & positive cool-skin temperature now allowed!

File:
1 edited

Legend:

Unmodified
Added
Removed
  • NEMO/branches/2019/dev_r11085_ASINTER-05_Brodeau_Advanced_Bulk/src/OCE/SBC/sbcblk_skin_coare.F90

    r11775 r11804  
    6363      !!--------------------------------------------------------------------- 
    6464      !! 
    65       !!  Cool-Skin scheme according to Fairall et al. 1996, revisited for COARE 3.6 (Fairall et al., 2019) 
     65      !! Cool-skin parameterization, based on Fairall et al., 1996, revisited for COARE 3.6 (Fairall et al., 2019) 
    6666      !! 
    6767      !! Fairall, C. W., Bradley, E. F., Godfrey, J. S., Wick, G. A., 
     
    7878      !!     *pSST*       bulk SST (taken at depth gdept_1d(1))          [K] 
    7979      !!     *pQlat*      surface latent heat flux                       [K] 
    80       !! 
    8180      !!------------------------------------------------------------------ 
    82       REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: pQsw   ! net solar a.k.a shortwave radiation into the ocean (after albedo) [W/m^2] 
    83       REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: pQnsol ! non-solar heat flux to the ocean [W/m^2] 
    84       REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: pustar  ! friction velocity, temperature and humidity (u*,t*,q*) 
    85       REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: pSST ! bulk SST [K] 
    86       REAL(wp), DIMENSION(jpi,jpj), INTENT(in)  :: pQlat  ! latent heat flux [W/m^2] 
     81      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pQsw   ! net solar a.k.a shortwave radiation into the ocean (after albedo) [W/m^2] 
     82      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pQnsol ! non-solar heat flux to the ocean [W/m^2] 
     83      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pustar  ! friction velocity, temperature and humidity (u*,t*,q*) 
     84      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pSST ! bulk SST [K] 
     85      REAL(wp), DIMENSION(jpi,jpj), INTENT(in) :: pQlat  ! latent heat flux [W/m^2] 
    8786      !!--------------------------------------------------------------------- 
    8887      INTEGER  :: ji, jj, jc 
     
    9291         DO ji = 1, jpi 
    9392 
    94             zQabs  = MIN( -0.1_wp , pQnsol(ji,jj) ) ! first guess, we do not miss a lot assuming 0 solar flux absorbed in the tiny layer of thicknes$ 
    95             !                                       ! also, we ONLY consider when the viscous layer is loosing heat to the atmosphere, we only deal with cool-skin! => hence the "MIN( -0$ 
     93            zQabs = pQnsol(ji,jj) ! first guess of heat flux absorbed within the viscous sublayer of thicknes delta, 
     94            !                     !   => we DO not miss a lot assuming 0 solar flux absorbed in the tiny layer of thicknes zdelta... 
    9695 
    9796            zdelta = delta_skin_layer( alpha_sw(pSST(ji,jj)), zQabs, pQlat(ji,jj), pustar(ji,jj) ) 
    9897 
    9998            DO jc = 1, 4 ! because implicit in terms of zdelta... 
    100                zfr    = MAX( 0.137_wp + 11._wp*zdelta - 6.6E-5_wp/zdelta*(1._wp - EXP(-zdelta/8.E-4_wp)) , 0.01_wp ) ! Solar absorption, Eq.16 (Fairall al. 1996b) /  !LB: why 0.065 and not 0.137 like in the paper??? Beljaars & Zeng use 0.065, not 0.137 ! 
    101                zQabs  = MIN( -0.1_wp , pQnsol(ji,jj) + zfr*pQsw(ji,jj) ) ! Total cooling at the interface 
     99               zfr = MAX( 0.137_wp + 11._wp*zdelta - 6.6E-5_wp/zdelta*(1._wp - EXP(-zdelta/8.E-4_wp)) , 0.01_wp ) ! Solar absorption, Eq.16 (Fairall al. 1996b) /  !LB: why 0.065 and not 0.137 like in the paper??? Beljaars & Zeng use 0.065, not 0.137 ! 
     100               zQabs = pQnsol(ji,jj) + zfr*pQsw(ji,jj) 
    102101               zdelta = delta_skin_layer( alpha_sw(pSST(ji,jj)), zQabs, pQlat(ji,jj), pustar(ji,jj) ) 
    103102            END DO 
    104103 
    105             dT_cs(ji,jj) = MIN( zQabs*zdelta/rk0_w , 0._wp )   ! temperature increment 
     104            dT_cs(ji,jj) = zQabs*zdelta/rk0_w   ! temperature increment, yes dT_cs can actually > 0, if Qabs > 0 (rare but possible!) 
    106105 
    107106         END DO 
     
    189188                  &        + 0.45*12.82*(1-EXP(-zHwl/12.82)) ) / zHwl 
    190189               zQabs = zfr*pQsw(ji,jj) + pQnsol(ji,jj) ! first guess of tot. heat flux absorbed in warm layer !LOLO: depends of zfr, which is wild guess... Wrong!!! 
    191                !PRINT *, '#LBD:  Initial Qsw & Qnsol:', NINT(pQsw(ji,jj)), NINT(pQnsol(ji,jj)) 
    192                !PRINT *, '#LBD:       =>Qabs:', zQabs,' zfr=', zfr 
    193190 
    194191               IF ( (ABS(zdTwl) < 1.E-6_wp) .AND. (zQabs <= 0._wp) ) THEN 
     
    196193                  ! since zQabs <= 0._wp 
    197194                  ! => no need to go further 
    198                   !PRINT *, '#LBD: we have not started to to build a WL yet (dT==0)' 
    199                   !PRINT *, '#LBD: and theres no way it can occur now since zQabs=', zQabs 
    200                   !PRINT *, '#LBD: => leaving without changing anything...' 
    201195                  l_exit = .TRUE. 
    202196               END IF 
     
    207201            !LOLO: remove??? has a strong influence !!! 
    208202            IF ( (.NOT.(l_exit)) .AND. (Qnt_ac(ji,jj) + zQabs*rdt <= 0._wp) ) THEN 
    209                !PRINT *, '#LBD: Oh boy! Next Qnt_ac looking weak! =>', Qnt_ac(ji,jj) + zQabs*rdt 
    210                !PRINT *, '#LBD:  => time to destroy the warm-layer!' 
    211203               l_exit       = .TRUE. 
    212204               l_destroy_wl = .TRUE. 
     
    219211               ! 1/ A warm layer already exists (dT>0) but it is cooling down because Qabs<0 
    220212               ! 2/ Regardless of WL formed (dT==0 or dT>0), we are in the process to initiate one or warm further it ! 
    221  
    222                !PRINT *, '#LBD:======================================================' 
    223                !PRINT *, '#LBD: WL action makes sense now! => zQabs,dT_wl=', REAL(zQabs,4), REAL(zdTwl,4) 
    224                !PRINT *, '#LBD:======================================================' 
    225                !PRINT *, '#LBD: current values for Qac and Tac=', REAL(Qnt_ac(ji,jj),4), REAL(Tau_ac(ji,jj),4) 
    226213 
    227214               ztac = Tau_ac(ji,jj) + MAX(.002_wp , pTau(ji,jj))*rdt      ! updated momentum integral 
     
    238225                  zHwl = MAX( MIN( Hwl_max , zcd1*ztac/SQRT(zqac)) , 0.1_wp ) ! Warm-layer depth 
    239226               END DO 
    240                !PRINT *, '#LBD: updated absorption and WL depth=',  REAL(zfr,4), REAL(zHwl,4) 
    241                !PRINT *, '#LBD: updated value for Qabs=',  REAL(zQabs,4), 'W/m2' 
    242                !PRINT *, '#LBD: updated value for Qac =',  REAL(zqac,4), 'J' 
    243227 
    244228               IF ( zqac <= 0._wp ) THEN 
     
    263247            END IF 
    264248 
    265             !PRINT *, '#LBD: exit values for Qac & Tac:', REAL(zqac,4), REAL(ztac,4) 
    266  
    267249            IF ( iwait == 0 ) THEN 
    268250               !! Iteration loop within bulk algo is over, time to update what needs to be updated: 
    269251               dT_wl(ji,jj)  = zdTwl 
    270252               Hz_wl(ji,jj)  = zHwl 
    271                !PRINT *, '#LBD: FINAL EXIT values for dT_wl & Hz_wl:', REAL(dT_wl(ji,jj),4), REAL(Hz_wl(ji,jj),4) 
    272253               Qnt_ac(ji,jj) = zqac ! Updating Qnt_ac, heat integral 
    273254               Tau_ac(ji,jj) = ztac 
    274                !PRINT *, '#LBD: FINAL EXIT values for Qac & Tac:', REAL(Qnt_ac(ji,jj),4), REAL(Tau_ac(ji,jj),4) 
    275                !PRINT *, '#LBD' 
    276255            END IF 
    277256 
     
    284263 
    285264 
    286    FUNCTION delta_skin_layer( palpha, pQabs, pQlat, pustar_a ) 
     265   FUNCTION delta_skin_layer( palpha, pQd, pQlat, pustar_a ) 
    287266      !!--------------------------------------------------------------------- 
    288267      !! Computes the thickness (m) of the viscous skin layer. 
     
    298277      REAL(wp)                :: delta_skin_layer 
    299278      REAL(wp), INTENT(in)    :: palpha   ! thermal expansion coefficient of sea-water (SST accurate enough!) 
    300       REAL(wp), INTENT(in)    :: pQabs    ! < 0 !!! part of the net heat flux actually absorbed in the WL [W/m^2] => term "Q + Rs*fs" in eq.6 of Fairall et al. 1996 
     279      REAL(wp), INTENT(in)    :: pQd    ! < 0 !!! part of the net heat flux actually absorbed in the WL [W/m^2] => term "Q + Rs*fs" in eq.6 of Fairall et al. 1996 
    301280      REAL(wp), INTENT(in)    :: pQlat    ! latent heat flux [W/m^2] 
    302281      REAL(wp), INTENT(in)    :: pustar_a ! friction velocity in the air (u*) [m/s] 
    303282      !!--------------------------------------------------------------------- 
    304       REAL(wp) :: zusw, zusw2, zlamb, zQb 
    305       !!--------------------------------------------------------------------- 
    306  
    307       zQb = pQabs + 0.026*MIN(pQlat,0._wp)*rCp0_w/rLevap/palpha   ! LOLO: Double check sign + division by palpha !!! units are okay! 
    308  
     283      REAL(wp) :: zusw, zusw2, zlamb, zQd, ztf, ztmp 
     284      !!--------------------------------------------------------------------- 
     285       
     286      zQd = pQd + 0.026*MIN(pQlat,0._wp)*rCp0_w/rLevap/palpha   ! LOLO: Double check sign + division by palpha !!! units are okay! 
     287 
     288      ztf = 0.5_wp + SIGN(0.5_wp, zQd)  ! Qabs < 0 => cooling of the viscous layer => ztf = 0 (regular case) 
     289      !                                 ! Qabs > 0 => warming of the viscous layer => ztf = 1 (ex: weak evaporation and strong positive sensible heat flux) 
     290      ! 
    309291      zusw  = MAX(pustar_a, 1.E-4_wp) * sq_radrw    ! u* in the water 
    310292      zusw2 = zusw*zusw 
    311  
    312       zlamb = 6._wp*( 1._wp + (palpha*zcon0/(zusw2*zusw2)*zQb)**0.75 )**(-1./3.) ! see eq.(14) in Fairall et al., 1996 
    313  
    314       delta_skin_layer = zlamb*rnu0_w/zusw 
    315  
     293      ! 
     294      zlamb = 6._wp*( 1._wp + MAX(palpha*zcon0/(zusw2*zusw2)*zQd, 0._wp)**0.75 )**(-1./3.) ! see Eq.(14) in Fairall et al., 1996 
     295      !  => zlamb is not used when Qd > 0, and since zcon0 < 0, we just use this "MAX" to prevent FPE errors (something_negative)**0.75 
     296      ! 
     297      ztmp = rnu0_w/zusw 
     298      delta_skin_layer = (1._wp-ztf) *     zlamb*ztmp           &  ! regular case, Qd < 0, see Eq.(12) in Fairall et al., 1996 
     299         &               +   ztf     * MIN(6._wp*ztmp , 0.007_wp)  ! when Qd > 0 
    316300   END FUNCTION delta_skin_layer 
    317301 
Note: See TracChangeset for help on using the changeset viewer.