Changeset 6042


Ignore:
Timestamp:
Jan 21, 2026, 1:20:47 PM (6 hours ago)
Author:
evignon
Message:

move diagnostics of relative humidity in call_lscp
loss of convergence in prod mode but not in debug

Location:
LMDZ6/trunk/libf/phylmd
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • LMDZ6/trunk/libf/phylmd/lmdz_call_lscp.f90

    r6028 r6042  
    99                        abortphy, flag_inhib_tend, itap, &
    1010                        nqo, dtime, missing_val, ok_new_lscp, &
    11                         paprs, pplay, omega, temp, qt, ql_seri, qi_seri, &
     11                        paprs, pplay, omega, temp, qt, &
    1212                        zmasse, ptconv, ratqsc, ratqs, ratqs_inter_, sigma_qtherm, &
    1313                        qtc_cv, sigt_cv, detrain_cv, fm_cv, fqd, fqcomp, &
     
    2929                        fm_therm, entr_therm, detr_therm, &
    3030                        cell_area, &
    31                         cf_seri, rvc_seri, u_seri, v_seri, &
     31                        cf, rvc, u, v, &
    3232                        qsub, qissr, qcld, subfra, issrfra, gamma_cond, &
    3333                        dcf_sub, dcf_con, dcf_mix, &
    3434                        dqi_adj, dqi_sub, dqi_con, dqi_mix, dqvc_adj, &
    35                         dqvc_sub, dqvc_con, dqvc_mix, qsatl, qsati, &
     35                        dqvc_sub, dqvc_con, dqvc_mix, qsatliq, qsatice, &
    3636                        Tcontr, qcontr, qcontr2, fcontrN, fcontrP, dcf_avi, &
    3737                        dqi_avi, dqvc_avi, flight_dist, flight_h2o, &
     
    3939                        qraindiag, qsnowdiag, dqreva, dqssub, dqrauto, &
    4040                        dqrcol, dqrmelt, dqrfreez, dqsauto, dqsagg, dqsrim, &
    41                         dqsmelt, dqsfreez)
     41                        dqsmelt, dqsfreez, rh, rhl, rhi)
    4242
    4343      USE lmdz_lscp_main, ONLY: lscp
    4444      USE lmdz_lscp_old, ONLY: fisrtilp, fisrtilp_first
    4545      USE lmdz_lscp_subgridvarq, ONLY: ratqs_main, ratqs_main_first
    46       USE lmdz_lscp_ini, ONLY: qlmax, qimax
     46      USE lmdz_lscp_ini, ONLY: qlmax, qimax, RTT
     47      USE lmdz_lscp_tools, ONLY: calc_qsat_ecmwf
    4748      USE add_phys_tend_mod, ONLY: add_phys_tend, prt_enerbil
     49      USE phys_local_var_mod, ONLY: t_seri, q_seri, ql_seri, qs_seri
    4850
    4951      IMPLICIT NONE
     
    5254! call_lscp in the main interface between the LMDZ physics monitor physiq_mod
    5355! and the large scale clouds and precipitation (lscp) parameterizations
     56!
     57! The aim of lscp routines is to compute the cloud fraction, cloud water
     58! contents, precipitation and temperature and water tendencies from the
     59! 'large scale' (i.e. not from deep convection)
    5460!
    5561! contact: Etienne Vignon etienne.vignon@lmd.ipsl.fr
     
    7884      REAL, DIMENSION(klon, klev), INTENT(IN)   :: omega           ! vertical velocity [Pa/s]
    7985      REAL, DIMENSION(klon, klev), INTENT(IN)   :: qt              ! total specific humidity (in vapor phase in input) [kg/kg]
    80       REAL, DIMENSION(klon, klev), INTENT(IN)   :: ql_seri         ! liquid specific content [kg/kg]
    81       REAL, DIMENSION(klon, klev), INTENT(IN)   :: qi_seri         ! ice specific content [kg/kg]
    82       REAL, DIMENSION(klon, klev), INTENT(IN)   :: qsat            ! saturation specific humidity [kg/kg] from the physics
    8386      REAL, DIMENSION(klon, klev), INTENT(IN)   :: ratio_ql_qtot   ! ratio ql/qt at the beginning of physics time step [-]
    8487      REAL, DIMENSION(klon, klev), INTENT(IN)   :: ratio_qi_qtot   ! ratio qi/qt at the beginning of physics time step [-]
     
    118121      ! INPUT/OUTPUT variables
    119122      !------------------------
    120 
     123      REAL, DIMENSION(klon, klev), INTENT(INOUT)   :: qsat            ! saturation specific humidity [kg/kg] from/to the physics
    121124      REAL, DIMENSION(klon, klev), INTENT(INOUT)   :: thl          ! liquid potential temperature [K]
    122125      REAL, DIMENSION(klon, klev), INTENT(INOUT)   :: pfrac_impa   ! product of impaction scavenging coeff.
     
    128131      ! INPUT/OUTPUT condensation and ice supersaturation
    129132      !--------------------------------------------------
    130       REAL, DIMENSION(klon, klev), INTENT(INOUT):: cf_seri          ! cloud fraction [-]
    131       REAL, DIMENSION(klon, klev), INTENT(INOUT):: rvc_seri         ! cloudy water vapor to total water vapor ratio [-]
    132       REAL, DIMENSION(klon, klev), INTENT(IN)   :: u_seri           ! eastward wind [m/s]
    133       REAL, DIMENSION(klon, klev), INTENT(IN)   :: v_seri           ! northward wind [m/s]
     133      REAL, DIMENSION(klon, klev), INTENT(INOUT):: cf          ! cloud fraction [-]
     134      REAL, DIMENSION(klon, klev), INTENT(INOUT):: rvc         ! cloudy water vapor to total water vapor ratio [-]
     135      REAL, DIMENSION(klon, klev), INTENT(IN)   :: u           ! eastward wind [m/s]
     136      REAL, DIMENSION(klon, klev), INTENT(IN)   :: v           ! northward wind [m/s]
    134137      REAL, DIMENSION(klon), INTENT(IN)   :: cell_area        ! area of each cell [m2]
    135138
     
    166169      REAL, DIMENSION(klon, klev), INTENT(OUT)  :: temp_cltop       ! temperature of cloud top [K]
    167170      REAL, DIMENSION(klon, klev), INTENT(OUT)  :: beta             ! conversion rate of condensed water
     171      REAL, DIMENSION(klon, klev), INTENT(OUT)  :: rh              ! relative humidity [0-1], wrt liq if T>0C, wrt ice if T<0C
     172      REAL, DIMENSION(klon, klev), INTENT(OUT)  :: rhl             ! relative humidity [0-1] wrt liq
     173      REAL, DIMENSION(klon, klev), INTENT(OUT)  :: rhi             ! relative humidity [0-1] wrt ice
    168174
    169175      ! for subgrid variability of water
     
    197203      REAL, DIMENSION(klon, klev), INTENT(OUT)  :: dqvc_con       !--specific cloud water vapor tendency because of condensation [kg/kg/s]
    198204      REAL, DIMENSION(klon, klev), INTENT(OUT)  :: dqvc_mix       !--specific cloud water vapor tendency because of cloud mixing [kg/kg/s]
    199       REAL, DIMENSION(klon, klev), INTENT(OUT)  :: qsatl          !--saturation specific humidity wrt liquid [kg/kg]
    200       REAL, DIMENSION(klon, klev), INTENT(OUT)  :: qsati          !--saturation specific humidity wrt ice [kg/kg]
     205      REAL, DIMENSION(klon, klev), INTENT(OUT)  :: qsatliq        !--saturation specific humidity wrt liquid [kg/kg]
     206      REAL, DIMENSION(klon, klev), INTENT(OUT)  :: qsatice        !--saturation specific humidity wrt ice [kg/kg]
    201207
    202208      ! for contrails and aviation
     
    228234
    229235      ! for thermals
    230 
    231236      REAL, DIMENSION(klon, klev), INTENT(OUT)  :: cloudth_sth      !--mean saturation deficit in thermals
    232237      REAL, DIMENSION(klon, klev), INTENT(OUT)  :: cloudth_senv     !--mean saturation deficit in environment
     
    239244      INTEGER                                      :: i, k
    240245      REAL, DIMENSION(klon)                        :: rain_num
    241       REAL, DIMENSION(klon, klev)                  :: ql_seri_lscp, qi_seri_lscp
    242       REAL, DIMENSION(klon, klev)                   :: du0, dv0, dqbs0
     246      REAL, DIMENSION(klon, klev)                  :: ql_estimate_lscp, qi_estimate_lscp
     247      REAL, DIMENSION(klon, klev)                  :: du0, dv0, dqbs0
     248
     249      REAL, DIMENSION(klon) :: z_q, z_t, z_p, z_qs
     250      REAL, DIMENSION(klon) ::  z_qsl, z_qsi, z_dqs, z_dqsl, z_dqsi
    243251
    244252!===============================================================================
     
    265273         DO k = 1, klev
    266274            DO i = 1, klon
    267                ql_seri_lscp(i, k) = ratio_ql_qtot(i, k)*qt(i, k)
    268                qi_seri_lscp(i, k) = ratio_qi_qtot(i, k)*qt(i, k)
     275               ql_estimate_lscp(i, k) = ratio_ql_qtot(i, k)*qt(i, k)
     276               qi_estimate_lscp(i, k) = ratio_qi_qtot(i, k)*qt(i, k)
    269277            END DO
    270278         END DO
    271279
    272280         CALL lscp(klon, klev, dtime, missing_val, paprs, pplay, omega, &
    273                    temp, qt, ql_seri_lscp, qi_seri_lscp, ptconv, ratqs, sigma_qtherm, &
     281                   temp, qt, ql_estimate_lscp, qi_estimate_lscp, ptconv, ratqs, sigma_qtherm, &
    274282                   d_t, d_q, d_ql, d_qi, rneb, rneblsvol, &
    275283                   pfraclr, pfracld, cldfraliq, cldfraliqth, &
     
    284292                   entr_therm, detr_therm, &
    285293                   cell_area, &
    286                    cf_seri, rvc_seri, u_seri, v_seri, &
     294                   cf, rvc, u, v, &
    287295                   qsub, qissr, qcld, subfra, issrfra, gamma_cond, &
    288296                   dcf_sub, dcf_con, dcf_mix, dqi_adj, dqi_sub, dqi_con, dqi_mix, &
    289                    dqvc_adj, dqvc_sub, dqvc_con, dqvc_mix, qsatl, qsati, &
     297                   dqvc_adj, dqvc_sub, dqvc_con, dqvc_mix, qsatliq, qsatice, &
    290298                   Tcontr, qcontr, qcontr2, fcontrN, fcontrP, &
    291299                   dcf_avi, dqi_avi, dqvc_avi, flight_dist, flight_h2o, &
     
    307315                       frac_impa, frac_nucl, beta, &
    308316                       prfl, psfl, rhcl, &
    309                        qta, fraca, tv, pspsk, tla, thl, & 
     317                       qta, fraca, tv, pspsk, tla, thl, &
    310318                       cloudth_sth, cloudth_senv, cloudth_sigmath, cloudth_sigmaenv)
    311319
    312320      END IF
    313 
    314 !===============================================================================
    315 ! Final computations
    316 !===============================================================================
    317 
    318       ! rain and snow are set to 0 when negative
    319       WHERE (rain_lsc < 0) rain_lsc = 0.
    320       WHERE (snow_lsc < 0) snow_lsc = 0.
    321 
    322       ! so-called 'numerical rain' is computed when qlnew=ql+dql>qlmax and qinew=qi+dqi>qimax
    323       ! i.e. when the condensed content is unrealistically large
    324       ! qlnew is set to qlmax and qinew to qimax
    325       ! equivalently, we set d_ql=qlmax-ql, d_ql=qimax-qi
    326       rain_num(:) = 0.
    327       DO k = 1, klev
    328          DO i = 1, klon
    329             IF (ql_seri(i, k) + d_ql(i, k) > qlmax) THEN
    330                rain_num(i) = rain_num(i) + (ql_seri(i, k) + d_ql(i, k) - qlmax)*zmasse(i, k)/dtime
    331                d_ql(i, k) = qlmax - ql_seri(i, k)
    332             END IF
    333          END DO
    334       END DO
    335 
    336       IF (nqo >= 3) THEN
    337          DO k = 1, klev
    338             DO i = 1, klon
    339                IF (qi_seri(i, k) + d_qi(i, k) > qimax) THEN
    340                   rain_num(i) = rain_num(i) + (qi_seri(i, k) - qimax)*zmasse(i, k)/dtime
    341                   d_qi(i, k) = qimax - qi_seri(i, k)
    342                END IF
    343             END DO
    344          END DO
    345       END IF
    346 
    347       ! Total precipitation
    348       DO i = 1, klon
    349          rain_fall(i) = rain_fall(i) + rain_lsc(i)
    350          snow_fall(i) = snow_fall(i) + snow_lsc(i)
    351       END DO
    352321
    353322!===============================================================================
     
    361330      CALL prt_enerbil('lsc', itap)
    362331
     332!===============================================================================
     333! Final computations
     334!===============================================================================
     335
     336      ! rain and snow are set to 0 when negative
     337      WHERE (rain_lsc < 0) rain_lsc = 0.
     338      WHERE (snow_lsc < 0) snow_lsc = 0.
     339
     340      ! so-called 'numerical rain' is computed when qlnew=ql+dql>qlmax and qinew=qi+dqi>qimax
     341      ! i.e. when the condensed content is unrealistically large
     342      ! qlnew is set to qlmax and qinew to qimax
     343
     344      rain_num(:) = 0.
     345      DO k = 1, klev
     346         DO i = 1, klon
     347            IF (ql_seri(i, k) > qlmax) THEN
     348               rain_num(i) = rain_num(i) + (ql_seri(i, k) - qlmax)*zmasse(i, k)/dtime
     349               ql_seri(i, k) = qlmax
     350            END IF
     351         END DO
     352      END DO
     353      IF (nqo >= 3) THEN
     354      DO k = 1, klev
     355         DO i = 1, klon
     356            IF (qs_seri(i, k) > qimax) THEN
     357               rain_num(i) = rain_num(i) + (qs_seri(i, k) - qimax)*zmasse(i, k)/dtime
     358               qs_seri(i, k) = qimax
     359            END IF
     360         END DO
     361      END DO
     362      END IF
     363
     364      ! total precipitation
     365      DO i = 1, klon
     366         rain_fall(i) = rain_fall(i) + rain_lsc(i)
     367         snow_fall(i) = snow_fall(i) + snow_lsc(i)
     368      END DO
     369
     370      ! relative humidity diagnostics
     371      DO k = 1, klev
     372
     373         DO i=1, klon
     374            z_q(i) = q_seri(i, k)
     375            z_t(i) = t_seri(i, k)
     376            z_p(i) = pplay(i, k)
     377         END DO
     378
     379         CALL CALC_QSAT_ECMWF(klon, z_t, z_q, z_p, RTT, 0, .false., z_qs, z_dqs)
     380         CALL CALC_QSAT_ECMWF(klon, z_t, z_q, z_p, RTT, 1, .false., z_qsl, z_dqsl)
     381         CALL CALC_QSAT_ECMWF(klon, z_t, z_q, z_p, RTT, 2, .false., z_qsi, z_dqsi)
     382
     383         DO i = 1, klon
     384            rhl(i, k) = z_q(i)/z_qsl(i)
     385            rhi(i, k) = z_q(i)/z_qsi(i)
     386            rh(i, k) = z_q(i)/z_qs(i)
     387            qsat(i, k) = z_qs(i)
     388         END DO
     389
     390      ENDDO
     391
     392
     393
    363394   END SUBROUTINE call_lscp
    364395
  • LMDZ6/trunk/libf/phylmd/physiq_mod.F90

    r6033 r6042  
    39593959     abortphy, flag_inhib_tend, itap,                             &
    39603960     nqo, pdtphys, missing_val, ok_new_lscp,                      &
    3961      paprs, pplay, omega, t_seri, q_seri, ql_seri, qs_seri,       &
     3961     paprs, pplay, omega, t_seri, q_seri,                         &
    39623962     zmasse, ptconv, ratqsc, ratqs, ratqs_inter_, sigma_qtherm,   &
    39633963     qtc_cv, sigt_cv,detrain_cv,fm_cv,fqd,fqcomp,       &
     
    39893989     qraindiag, qsnowdiag, dqreva, dqssub, dqrauto,     &
    39903990     dqrcol, dqrmelt, dqrfreez, dqsauto, dqsagg, dqsrim,&
    3991      dqsmelt, dqsfreez)
     3991     dqsmelt, dqsfreez, zx_rh, zx_rhl, zx_rhi)
    39923992
    39933993    !===============================================================================
     
    41694169       ENDDO
    41704170    ENDIF
    4171 
    4172     !
    4173     ! Calculer l'humidite relative pour diagnostique
    4174     !
    4175     ! A inclure dans lmdz_call_lscp via un appel à lmdz_lscp_tools
    4176     DO k = 1, klev
    4177        DO i = 1, klon
    4178           zx_t = t_seri(i,k)
    4179           IF (thermcep) THEN
    4180              zdelta = MAX(0.,SIGN(1.,rtt-zx_t))
    4181              zx_qs  = r2es * FOEEW(zx_t,zdelta)/pplay(i,k)
    4182              zx_qs  = MIN(0.5,zx_qs)
    4183              zcor   = 1./(1.-retv*zx_qs)
    4184              zx_qs  = zx_qs*zcor
    4185           ELSE
    4186              IF (zx_t.LT.rtt) THEN                 
    4187                 zx_qs = qsats(zx_t)/pplay(i,k)
    4188              ELSE
    4189                 zx_qs = qsatl(zx_t)/pplay(i,k)
    4190              ENDIF
    4191           ENDIF
    4192           zx_rh(i,k) = q_seri(i,k)/zx_qs
    4193           IF (iflag_ice_thermo .GT. 0) THEN
    4194              zx_rhl(i,k) = MIN(q_seri(i,k)/(qsatl(zx_t)/pplay(i,k)),1.)
    4195              zx_rhi(i,k) = zx_rhl(i,k)*qsatl(zx_t)/qsats(zx_t)
    4196           ENDIF
    4197           zqsat(i,k)=zx_qs
    4198        ENDDO
    4199     ENDDO
    42004171
    42014172    !===============================================================================
Note: See TracChangeset for help on using the changeset viewer.