Changeset 2558 for LMDZ5/trunk/libf


Ignore:
Timestamp:
Jun 10, 2016, 1:03:29 PM (8 years ago)
Author:
jyg
Message:

Introduction of the Effective Lifting Power (ELP),
which takes into account the area (cv_feed_area)
covered by thermals contributing to each
cumulonimbus.

The use of ELP prevents singularities when the

trigger probability tends to zero. It is
activated by iflag_clos_bl = 3.

The ELP values are stored in the ALP_bl variable.


File:
1 edited

Legend:

Unmodified
Added
Removed
  • LMDZ5/trunk/libf/phylmd/alpale_th.F90

    r2556 r2558  
    1 SUBROUTINE alpale_th ( dtime, lmax_th, t_seri, &
     1SUBROUTINE alpale_th ( dtime, lmax_th, t_seri, cell_area, &
    22                       cin, s2, n2,  &
    33                       ale_bl_trig, ale_bl_stat, ale_bl,  &
     
    2828!----------------
    2929  REAL, INTENT(IN)                                           :: dtime
     30  REAL, DIMENSION(klon), INTENT(IN)                          :: cell_area
    3031  INTEGER, DIMENSION(klon), INTENT(IN)                       :: lmax_th
    3132  REAL, DIMENSION(klon,klev), INTENT(IN)                     :: t_seri
     
    4748  LOGICAL, SAVE                                              :: first = .TRUE.
    4849  REAL, SAVE                                                 :: random_notrig_max=1.
     50  REAL, SAVE                                                 :: cv_feed_area
     51  REAL                                                       :: birth_number
     52  REAL, DIMENSION(klon)                                      :: ale_bl_ref
    4953  REAL, DIMENSION(klon)                                      :: tau_trig
     54  REAL, DIMENSION(klon)                                      :: birth_rate
    5055!
    5156    !$OMP THREADPRIVATE(random_notrig_max)
     57    !$OMP THREADPRIVATE(cv_feed_area)
    5258    !$OMP THREADPRIVATE(first)
    5359!
     60 REAL umexp  ! expression of (1.-exp(-x))/x valid for all x, especially when x->0
     61 REAL x
     62 umexp(x) = max(sign(1.,x-1.e-3),0.)*(1.-exp(-x))/max(x,1.e-3) + &
     63            (1.-max(sign(1.,x-1.e-3),0.))*(1.-0.5*x*(1.-x/3.*(1.-0.25*x)))
     64!
     65!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
     66!  JYG, 20160513 : Introduction of the Effective Lifting Power (ELP), which
     67! takes into account the area (cv_feed_area) covered by thermals contributing
     68! to each cumulonimbus.
     69!   The use of ELP prevents singularities when the trigger probability tends to
     70! zero. It is activated by iflag_clos_bl = 3.
     71!   The ELP values are stored in the ALP_bl variable.
     72!   
     73!+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
     74!
     75!---------------------------------------
     76  IF (iflag_clos_bl .LT. 3) THEN
     77!---------------------------------------
     78!
     79!      Original code (Nicolas Rochetin)
     80!     --------------------------------
     81
    5482    IF (first) THEN
     83       random_notrig_max=1.
    5584       CALL getin_p('random_notrig_max',random_notrig_max)
    5685       first=.FALSE.
     
    158187          endif !(iflag_clos_bl)
    159188
     189!
     190!---------------------------------------
     191  ELSEIF (iflag_clos_bl .EQ. 3) THEN  ! (iflag_clos_bl .LT. 3)
     192!---------------------------------------
     193!
     194!      New code with Effective Lifting Power
     195!     -------------------------------------
     196    IF (first) THEN
     197       cv_feed_area = 1.e10   ! m2
     198       CALL getin_p('cv_feed_area', cv_feed_area)
     199       first=.FALSE.
     200    ENDIF
     201
     202          !-----------Stochastic triggering-----------
     203     if (iflag_trig_bl.ge.1) then
     204        !
     205        IF (prt_level .GE. 10) THEN
     206           print *,'cin, ale_bl_stat, alp_bl_stat ', &
     207                cin, ale_bl_stat, alp_bl_stat
     208        ENDIF
     209
     210        ! Use ale_bl_stat (Rochetin's code) or ale_bl (old code) according to
     211        ! iflag_trig_bl value.
     212        IF (iflag_trig_bl.eq.1) then         ! use ale_bl_stat (Rochetin computation)
     213         do i=1,klon
     214              ale_bl_ref(i)=ale_bl_stat(i)
     215         enddo
     216        ELSE IF (iflag_trig_bl.ge.2) then    ! use ale_bl (old computation)
     217         do i=1,klon
     218              ale_bl_ref(i)=Ale_bl(i)
     219         enddo
     220        ENDIF ! (iflag_trig_bl.eq.1)
     221
     222
     223        !----Initializations and random number generation
     224        do i=1,klon
     225           proba_notrig(i)=1.
     226           random_notrig(i)=1e6*ale_bl_stat(i)-int(1e6*ale_bl_stat(i))
     227           if ( ale_bl_trig(i) .lt. abs(cin(i))+1.e-10 ) then
     228              tau_trig(i)=tau_trig_shallow
     229           else
     230              tau_trig(i)=tau_trig_deep
     231           endif
     232        enddo
     233        !
     234        IF (prt_level .GE. 10) THEN
     235           print *,'random_notrig, tau_trig ', &
     236                random_notrig, tau_trig
     237           print *,'s_trig,s2,n2 ', &
     238                s_trig,s2,n2
     239        ENDIF
     240
     241        !----alp_bl computation
     242        do i=1,klon
     243           if ( (ale_bl_ref(i) .gt. abs(cin(i))+1.e-10) )  then
     244              birth_number = n2(i)*exp(-s_trig/s2(i))
     245              birth_rate(i) = birth_number/(tau_trig(i)*cell_area(i))
     246              proba_notrig(i)=exp(-birth_number*dtime/tau_trig(i))
     247              Alp_bl(i) = Alp_bl(i)* &
     248                          umexp(-birth_number*cv_feed_area/cell_area(i))/ &
     249                          umexp(-birth_number*dtime/tau_trig(i))*  &
     250                          tau_trig(i)*cv_feed_area/(dtime*cell_area(i))
     251          else
     252              proba_notrig(i)=1.
     253              random_notrig(i)=0.
     254              alp_bl(i)=0.
     255           endif
     256        enddo
     257
     258        !----ale_bl_trig computation
     259         do i=1,klon
     260           if (random_notrig(i) .ge. proba_notrig(i)) then
     261              ale_bl_trig(i)=ale_bl_ref(i)
     262           else
     263              ale_bl_trig(i)=0.
     264           endif
     265         enddo
     266
     267        !
     268        IF (prt_level .GE. 10) THEN
     269           print *,'proba_notrig, ale_bl_trig ', &
     270                proba_notrig, ale_bl_trig
     271        ENDIF
     272
     273     endif !(iflag_trig_bl .ge. 1)
     274
     275!---------------------------------------
     276  ENDIF ! (iflag_clos_bl .LT. 3)
     277!---------------------------------------
     278
    160279          IF (prt_level .GE. 10) THEN
    161280             print *,'ale_bl_trig, alp_bl_stat ',ale_bl_trig, alp_bl_stat
Note: See TracChangeset for help on using the changeset viewer.