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

Ignore:
Timestamp:
2019-10-24T12:38:43+02:00 (5 years ago)
Author:
laurent
Message:

Fixes to prevent FPE-related errors at runtime (masked regions).

File:
1 edited

Legend:

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

    r11772 r11785  
    4646   PUBLIC :: ECMWF_INIT, TURB_ECMWF 
    4747 
    48    !                   !! ECMWF own values for given constants, taken form IFS documentation... 
     48   !! ECMWF own values for given constants, taken form IFS documentation... 
    4949   REAL(wp), PARAMETER ::   charn0 = 0.018    ! Charnock constant (pretty high value here !!! 
    5050   !                                          !    =>  Usually 0.011 for moderate winds) 
     
    213213 
    214214      IF ( l_use_wl ) THEN 
    215          IF( .NOT.(PRESENT(Qsw) .AND. PRESENT(rad_lw) .AND. PRESENT(slp))) THEN 
     215         IF( .NOT.(PRESENT(Qsw) .AND. PRESENT(rad_lw) .AND. PRESENT(slp)) ) THEN 
    216216            PRINT *, ' * PROBLEM ('//TRIM(crtnm)//'): you need to provide Qsw, rad_lw & slp to use warm-layer param!'; STOP 
    217217         END IF 
     
    222222         zsst = T_s ! backing up the bulk SST 
    223223         IF( l_use_cs ) T_s = T_s - 0.25_wp   ! First guess of correction 
    224          q_s    = rdct_qsat_salt*q_sat(MAX(T_s, 200._wp), slp) ! First guess of q_s !LOLO WL too!!! 
     224         q_s    = rdct_qsat_salt*q_sat(MAX(T_s, 200._wp), slp) ! First guess of q_s 
    225225      END IF 
    226226 
     
    245245 
    246246      z0     = charn0*u_star*u_star/grav + 0.11_wp*znu_a/u_star 
    247       z0     = MIN(ABS(z0), 0.001_wp)  ! (prevent FPE from stupid values from masked region later on...) !#LOLO 
     247      z0     = MIN( MAX(ABS(z0), 1.E-9) , 1._wp )                      ! (prevents FPE from stupid values from masked region later on) 
     248 
    248249      z0t    = 1._wp / ( 0.1_wp*EXP(vkarmn/(0.00115/(vkarmn/ztmp1))) ) 
    249       z0t    = MIN(ABS(z0t), 0.001_wp)  ! (prevent FPE from stupid values from masked region later on...) !#LOLO 
     250      z0t    = MIN( MAX(ABS(z0t), 1.E-9) , 1._wp )                      ! (prevents FPE from stupid values from masked region later on) 
    250251 
    251252      Cd     = (vkarmn/ztmp0)**2    ! first guess of Cd 
     
    265266      ztmp0  = vkarmn/(LOG(zu/z0t) - psi_h_ecmwf(func_h)) 
    266267 
    267       u_star = U_blk*vkarmn/(LOG(zu) - LOG(z0)  - psi_m_ecmwf(func_h)) 
     268      u_star = MAX ( U_blk*vkarmn/(LOG(zu) - LOG(z0)  - psi_m_ecmwf(func_h)) , 1.E-9 )  !  (MAX => prevents FPE from stupid values from masked region later on) 
    268269      t_star = dt_zu*ztmp0 
    269270      q_star = dq_zu*ztmp0 
Note: See TracChangeset for help on using the changeset viewer.