Changeset 2066


Ignore:
Timestamp:
Jan 14, 2019, 4:34:23 PM (6 years ago)
Author:
aboissinot
Message:

Fix f0 saving
Restore d_temp functionality. d_temp is set in thermcell_mod and used in thermcell_alim.
d_temp is a virtual potential temperature offset applied only in layer linf.
Remove a potential division by zero in thermcell_plume with variable zw2m.

Location:
trunk/LMDZ.GENERIC/libf/phystd
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/LMDZ.GENERIC/libf/phystd/thermcell_alim.F90

    r2060 r2066  
    22!
    33!
    4       SUBROUTINE thermcell_alim(flag,ngrid,klev,ztv,d_temp,zlev,     &
    5       &                         alim_star,lalim,lmin)
     4      SUBROUTINE thermcell_alim(flag,ngrid,klev,ztv,zlev,alim_star,           &
     5                                lalim,lmin)
    66     
    77     
    8       USE thermcell_mod
     8      USE thermcell_mod, ONLY: linf, d_temp
    99     
    1010      IMPLICIT NONE
     
    2121!==============================================================================
    2222     
    23 !      fort(10) ptimestep,ztv,zthl,po,zl,rhobarz,zlev,pplev,pphi,zpspsk,f0
    24      
    2523!      inputs:
    2624!      -------
     
    3129      INTEGER, INTENT(IN) :: flag               ! useless here
    3230     
    33       REAL, INTENT(IN) :: ztv(ngrid,klev)       ! TRPV environment
    34       REAL, INTENT(IN) :: d_temp(ngrid)         ! useless here
     31      REAL, INTENT(IN) :: ztv(ngrid,klev)       ! Large scale virtual potential temperature
     32! Virtual potential temperature offset in linf layer
    3533      REAL, INTENT(IN) :: zlev(ngrid,klev+1)    ! levels altitude
    3634     
     
    4846     
    4947      REAL :: alim_star_tot(ngrid)              ! integrated alimentation
     48      REAL :: ztv2(ngrid,klev)                  ! ztv + d_temp
    5049     
    5150!==============================================================================
     
    5756      alim_star_tot(:) = 0.
    5857     
     58      ztv2(:,:) = ztv(:,:)
     59      ztv2(:,linf) = ztv2(:,linf) + d_temp
     60     
    5961!==============================================================================
    6062! Alimentation computation
    6163!==============================================================================
    6264     
    63 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    64 ! AB : is it necessary to get ztv(l)<ztv(lmin) to compute an alimentation ?
    65 !      maybe ztv(ig,lmin(ig)).ge.ztv(ig,l) is sufficient.
    66 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    67      
    6865      DO l=lmin(ig),klev-1
    6966         DO ig=1,ngrid
    70             IF ((ztv(ig,l)>ztv(ig,l+1)).and.(ztv(ig,lmin(ig))>=ztv(ig,l))) THEN
    71                alim_star(ig,l) = MAX( (ztv(ig,l) - ztv(ig,l+1)), 0.)          &
     67            IF ((ztv2(ig,l)>ztv2(ig,l+1)).and.(ztv2(ig,lmin(ig))>=ztv2(ig,l))) THEN
     68               alim_star(ig,l) = MAX( (ztv2(ig,l) - ztv2(ig,l+1)), 0.)  &
    7269               &               * sqrt(zlev(ig,l+1))
    7370               lalim(ig) = l + 1
  • trunk/LMDZ.GENERIC/libf/phystd/thermcell_mod.F90

    r2064 r2066  
    4747INTEGER,PARAMETER :: linf                       = 2
    4848
     49!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     50! AB : d_temp is an artificial virtual potential temperature added in layer
     51!      linf which can be used to force convection to begin in it.
     52!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     53REAL,PARAMETER :: d_temp                        = 10.       !     0.
     54
    4955! Parameters for diagnoses
    5056
  • trunk/LMDZ.GENERIC/libf/phystd/thermcell_plume.F90

    r2065 r2066  
    102102      REAL zw2m                                 !
    103103      REAL zdzbis                               !
    104       REAL d_temp(ngrid)                        !
    105104      REAL coefzlmel                            !
    106105      REAL zdz2                                 !
     
    126125      zbetalpha = betalpha / (1. + betalpha)
    127126     
    128       ztva(:,:)        = ztv(:,:)                                             ! ztva     is set to the virtual potential temperature withour latent heat release
    129       ztva_est(:,:)    = ztva(:,:)                                            ! ztva_est is set to the virtual potential temperature withour latent heat release
    130       ztla(:,:)        = zthl(:,:)                                            ! ztla     is set to the potential temperature
    131       zqta(:,:)        = po(:,:)                                              ! zqta     is set to qt
    132       zqla(:,:)        = 0.                                                   ! zqla     is set to ql
    133       zqla_est(:,:)    = 0.                                                   ! zqla_est is set to ql
    134       zha(:,:)         = ztva(:,:)                                            ! zha      is set to the plume virtual potential temperature withour latent heat release
     127      ztva(:,:)        = ztv(:,:)               ! ztva     is set to the virtual potential temperature withour latent heat release
     128      ztva_est(:,:)    = ztva(:,:)              ! ztva_est is set to the virtual potential temperature withour latent heat release
     129      ztla(:,:)        = zthl(:,:)              ! ztla     is set to the potential temperature
     130      zqta(:,:)        = po(:,:)                ! zqta     is set to qt
     131      zqla(:,:)        = 0.                     ! zqla     is set to ql
     132      zqla_est(:,:)    = 0.                     ! zqla_est is set to ql
     133      zha(:,:)         = ztva(:,:)              ! zha      is set to the plume virtual potential temperature withour latent heat release
    135134     
    136135      zqsat(:)         = 0.
     
    153152      lalim(:)         = 1
    154153      lmin(:)          = linf
    155      
    156 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    157 ! Pour activer un contraste de temperature a la base du panache
    158 ! AB : It is used only in the thermcell_alim_init subroutine.
    159 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    160       d_temp(:) = 0.
    161154     
    162155!==============================================================================
     
    187180! AB : On pourrait n'appeler thermcell_alim que si la plume est active
    188181!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    189       CALL thermcell_alim(iflag_thermals_alim,ngrid,klev,ztv,d_temp,  &
    190       &                   zlev,alim_star,lalim,lmin)
     182      CALL thermcell_alim(iflag_thermals_alim,ngrid,klev,ztv,zlev,alim_star,  &
     183      &                   lalim,lmin)
    191184     
    192185!==============================================================================
     
    323316               
    324317               zdz = zlev(ig,l+1) - zlev(ig,l)
    325                zalpha = f0(ig) * f_star(ig,l) / sqrt(w_est(ig,l+1)) / rhobarz(ig,l)
    326                
    327 !~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    328 ! AB : The next test is added to avoid a division by zero when w_est becomes
    329 !      negative.
     318               
     319!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     320! AB : The next test is added to avoid divisions by zero when w_est vanishes.
    330321!      Indeed, entr and detr computed here are of no importance because w_est
    331322!      <= 0 means it will be the last layer reached by the plume and then they
     
    334325               IF (w_est(ig,l+1).eq.0.) THEN
    335326                  zw2m = 1.
     327                  zalpha = 0.
    336328               ELSE
    337329                  zw2m = w_est(ig,l+1)
     330                  zalpha = f0(ig) * f_star(ig,l) / sqrt(w_est(ig,l+1)) / rhobarz(ig,l)
    338331               ENDIF
    339332               
Note: See TracChangeset for help on using the changeset viewer.