Index: LMDZ6/trunk/libf/phylmd/lmdz_call_lscp.f90
===================================================================
--- LMDZ6/trunk/libf/phylmd/lmdz_call_lscp.f90	(revision 6041)
+++ LMDZ6/trunk/libf/phylmd/lmdz_call_lscp.f90	(revision 6042)
@@ -9,5 +9,5 @@
                         abortphy, flag_inhib_tend, itap, &
                         nqo, dtime, missing_val, ok_new_lscp, &
-                        paprs, pplay, omega, temp, qt, ql_seri, qi_seri, &
+                        paprs, pplay, omega, temp, qt, &
                         zmasse, ptconv, ratqsc, ratqs, ratqs_inter_, sigma_qtherm, &
                         qtc_cv, sigt_cv, detrain_cv, fm_cv, fqd, fqcomp, &
@@ -29,9 +29,9 @@
                         fm_therm, entr_therm, detr_therm, &
                         cell_area, &
-                        cf_seri, rvc_seri, u_seri, v_seri, &
+                        cf, rvc, u, v, &
                         qsub, qissr, qcld, subfra, issrfra, gamma_cond, &
                         dcf_sub, dcf_con, dcf_mix, &
                         dqi_adj, dqi_sub, dqi_con, dqi_mix, dqvc_adj, &
-                        dqvc_sub, dqvc_con, dqvc_mix, qsatl, qsati, &
+                        dqvc_sub, dqvc_con, dqvc_mix, qsatliq, qsatice, &
                         Tcontr, qcontr, qcontr2, fcontrN, fcontrP, dcf_avi, &
                         dqi_avi, dqvc_avi, flight_dist, flight_h2o, &
@@ -39,11 +39,13 @@
                         qraindiag, qsnowdiag, dqreva, dqssub, dqrauto, &
                         dqrcol, dqrmelt, dqrfreez, dqsauto, dqsagg, dqsrim, &
-                        dqsmelt, dqsfreez)
+                        dqsmelt, dqsfreez, rh, rhl, rhi)
 
       USE lmdz_lscp_main, ONLY: lscp
       USE lmdz_lscp_old, ONLY: fisrtilp, fisrtilp_first
       USE lmdz_lscp_subgridvarq, ONLY: ratqs_main, ratqs_main_first
-      USE lmdz_lscp_ini, ONLY: qlmax, qimax
+      USE lmdz_lscp_ini, ONLY: qlmax, qimax, RTT
+      USE lmdz_lscp_tools, ONLY: calc_qsat_ecmwf
       USE add_phys_tend_mod, ONLY: add_phys_tend, prt_enerbil
+      USE phys_local_var_mod, ONLY: t_seri, q_seri, ql_seri, qs_seri
 
       IMPLICIT NONE
@@ -52,4 +54,8 @@
 ! call_lscp in the main interface between the LMDZ physics monitor physiq_mod
 ! and the large scale clouds and precipitation (lscp) parameterizations
+!
+! The aim of lscp routines is to compute the cloud fraction, cloud water 
+! contents, precipitation and temperature and water tendencies from the
+! 'large scale' (i.e. not from deep convection)
 !
 ! contact: Etienne Vignon etienne.vignon@lmd.ipsl.fr
@@ -78,7 +84,4 @@
       REAL, DIMENSION(klon, klev), INTENT(IN)   :: omega           ! vertical velocity [Pa/s]
       REAL, DIMENSION(klon, klev), INTENT(IN)   :: qt              ! total specific humidity (in vapor phase in input) [kg/kg]
-      REAL, DIMENSION(klon, klev), INTENT(IN)   :: ql_seri         ! liquid specific content [kg/kg]
-      REAL, DIMENSION(klon, klev), INTENT(IN)   :: qi_seri         ! ice specific content [kg/kg]
-      REAL, DIMENSION(klon, klev), INTENT(IN)   :: qsat            ! saturation specific humidity [kg/kg] from the physics
       REAL, DIMENSION(klon, klev), INTENT(IN)   :: ratio_ql_qtot   ! ratio ql/qt at the beginning of physics time step [-]
       REAL, DIMENSION(klon, klev), INTENT(IN)   :: ratio_qi_qtot   ! ratio qi/qt at the beginning of physics time step [-]
@@ -118,5 +121,5 @@
       ! INPUT/OUTPUT variables
       !------------------------
-
+      REAL, DIMENSION(klon, klev), INTENT(INOUT)   :: qsat            ! saturation specific humidity [kg/kg] from/to the physics
       REAL, DIMENSION(klon, klev), INTENT(INOUT)   :: thl          ! liquid potential temperature [K]
       REAL, DIMENSION(klon, klev), INTENT(INOUT)   :: pfrac_impa   ! product of impaction scavenging coeff.
@@ -128,8 +131,8 @@
       ! INPUT/OUTPUT condensation and ice supersaturation
       !--------------------------------------------------
-      REAL, DIMENSION(klon, klev), INTENT(INOUT):: cf_seri          ! cloud fraction [-]
-      REAL, DIMENSION(klon, klev), INTENT(INOUT):: rvc_seri         ! cloudy water vapor to total water vapor ratio [-]
-      REAL, DIMENSION(klon, klev), INTENT(IN)   :: u_seri           ! eastward wind [m/s]
-      REAL, DIMENSION(klon, klev), INTENT(IN)   :: v_seri           ! northward wind [m/s]
+      REAL, DIMENSION(klon, klev), INTENT(INOUT):: cf          ! cloud fraction [-]
+      REAL, DIMENSION(klon, klev), INTENT(INOUT):: rvc         ! cloudy water vapor to total water vapor ratio [-]
+      REAL, DIMENSION(klon, klev), INTENT(IN)   :: u           ! eastward wind [m/s]
+      REAL, DIMENSION(klon, klev), INTENT(IN)   :: v           ! northward wind [m/s]
       REAL, DIMENSION(klon), INTENT(IN)   :: cell_area        ! area of each cell [m2]
 
@@ -166,4 +169,7 @@
       REAL, DIMENSION(klon, klev), INTENT(OUT)  :: temp_cltop       ! temperature of cloud top [K]
       REAL, DIMENSION(klon, klev), INTENT(OUT)  :: beta             ! conversion rate of condensed water
+      REAL, DIMENSION(klon, klev), INTENT(OUT)  :: rh              ! relative humidity [0-1], wrt liq if T>0C, wrt ice if T<0C
+      REAL, DIMENSION(klon, klev), INTENT(OUT)  :: rhl             ! relative humidity [0-1] wrt liq
+      REAL, DIMENSION(klon, klev), INTENT(OUT)  :: rhi             ! relative humidity [0-1] wrt ice
 
       ! for subgrid variability of water
@@ -197,6 +203,6 @@
       REAL, DIMENSION(klon, klev), INTENT(OUT)  :: dqvc_con       !--specific cloud water vapor tendency because of condensation [kg/kg/s]
       REAL, DIMENSION(klon, klev), INTENT(OUT)  :: dqvc_mix       !--specific cloud water vapor tendency because of cloud mixing [kg/kg/s]
-      REAL, DIMENSION(klon, klev), INTENT(OUT)  :: qsatl          !--saturation specific humidity wrt liquid [kg/kg]
-      REAL, DIMENSION(klon, klev), INTENT(OUT)  :: qsati          !--saturation specific humidity wrt ice [kg/kg]
+      REAL, DIMENSION(klon, klev), INTENT(OUT)  :: qsatliq        !--saturation specific humidity wrt liquid [kg/kg]
+      REAL, DIMENSION(klon, klev), INTENT(OUT)  :: qsatice        !--saturation specific humidity wrt ice [kg/kg]
 
       ! for contrails and aviation
@@ -228,5 +234,4 @@
 
       ! for thermals
-
       REAL, DIMENSION(klon, klev), INTENT(OUT)  :: cloudth_sth      !--mean saturation deficit in thermals
       REAL, DIMENSION(klon, klev), INTENT(OUT)  :: cloudth_senv     !--mean saturation deficit in environment
@@ -239,6 +244,9 @@
       INTEGER                                      :: i, k
       REAL, DIMENSION(klon)                        :: rain_num
-      REAL, DIMENSION(klon, klev)                  :: ql_seri_lscp, qi_seri_lscp
-      REAL, DIMENSION(klon, klev)                   :: du0, dv0, dqbs0
+      REAL, DIMENSION(klon, klev)                  :: ql_estimate_lscp, qi_estimate_lscp
+      REAL, DIMENSION(klon, klev)                  :: du0, dv0, dqbs0
+
+      REAL, DIMENSION(klon) :: z_q, z_t, z_p, z_qs
+      REAL, DIMENSION(klon) ::  z_qsl, z_qsi, z_dqs, z_dqsl, z_dqsi
 
 !===============================================================================
@@ -265,11 +273,11 @@
          DO k = 1, klev
             DO i = 1, klon
-               ql_seri_lscp(i, k) = ratio_ql_qtot(i, k)*qt(i, k)
-               qi_seri_lscp(i, k) = ratio_qi_qtot(i, k)*qt(i, k)
+               ql_estimate_lscp(i, k) = ratio_ql_qtot(i, k)*qt(i, k)
+               qi_estimate_lscp(i, k) = ratio_qi_qtot(i, k)*qt(i, k)
             END DO
          END DO
 
          CALL lscp(klon, klev, dtime, missing_val, paprs, pplay, omega, &
-                   temp, qt, ql_seri_lscp, qi_seri_lscp, ptconv, ratqs, sigma_qtherm, &
+                   temp, qt, ql_estimate_lscp, qi_estimate_lscp, ptconv, ratqs, sigma_qtherm, &
                    d_t, d_q, d_ql, d_qi, rneb, rneblsvol, &
                    pfraclr, pfracld, cldfraliq, cldfraliqth, &
@@ -284,8 +292,8 @@
                    entr_therm, detr_therm, &
                    cell_area, &
-                   cf_seri, rvc_seri, u_seri, v_seri, &
+                   cf, rvc, u, v, &
                    qsub, qissr, qcld, subfra, issrfra, gamma_cond, &
                    dcf_sub, dcf_con, dcf_mix, dqi_adj, dqi_sub, dqi_con, dqi_mix, &
-                   dqvc_adj, dqvc_sub, dqvc_con, dqvc_mix, qsatl, qsati, &
+                   dqvc_adj, dqvc_sub, dqvc_con, dqvc_mix, qsatliq, qsatice, &
                    Tcontr, qcontr, qcontr2, fcontrN, fcontrP, &
                    dcf_avi, dqi_avi, dqvc_avi, flight_dist, flight_h2o, &
@@ -307,47 +315,8 @@
                        frac_impa, frac_nucl, beta, &
                        prfl, psfl, rhcl, &
-                       qta, fraca, tv, pspsk, tla, thl, & 
+                       qta, fraca, tv, pspsk, tla, thl, &
                        cloudth_sth, cloudth_senv, cloudth_sigmath, cloudth_sigmaenv)
 
       END IF
-
-!===============================================================================
-! Final computations
-!===============================================================================
-
-      ! rain and snow are set to 0 when negative
-      WHERE (rain_lsc < 0) rain_lsc = 0.
-      WHERE (snow_lsc < 0) snow_lsc = 0.
-
-      ! so-called 'numerical rain' is computed when qlnew=ql+dql>qlmax and qinew=qi+dqi>qimax
-      ! i.e. when the condensed content is unrealistically large
-      ! qlnew is set to qlmax and qinew to qimax
-      ! equivalently, we set d_ql=qlmax-ql, d_ql=qimax-qi
-      rain_num(:) = 0.
-      DO k = 1, klev
-         DO i = 1, klon
-            IF (ql_seri(i, k) + d_ql(i, k) > qlmax) THEN
-               rain_num(i) = rain_num(i) + (ql_seri(i, k) + d_ql(i, k) - qlmax)*zmasse(i, k)/dtime
-               d_ql(i, k) = qlmax - ql_seri(i, k)
-            END IF
-         END DO
-      END DO
-
-      IF (nqo >= 3) THEN
-         DO k = 1, klev
-            DO i = 1, klon
-               IF (qi_seri(i, k) + d_qi(i, k) > qimax) THEN
-                  rain_num(i) = rain_num(i) + (qi_seri(i, k) - qimax)*zmasse(i, k)/dtime
-                  d_qi(i, k) = qimax - qi_seri(i, k)
-               END IF
-            END DO
-         END DO
-      END IF
-
-      ! Total precipitation
-      DO i = 1, klon
-         rain_fall(i) = rain_fall(i) + rain_lsc(i)
-         snow_fall(i) = snow_fall(i) + snow_lsc(i)
-      END DO
 
 !===============================================================================
@@ -361,4 +330,66 @@
       CALL prt_enerbil('lsc', itap)
 
+!===============================================================================
+! Final computations
+!===============================================================================
+
+      ! rain and snow are set to 0 when negative
+      WHERE (rain_lsc < 0) rain_lsc = 0.
+      WHERE (snow_lsc < 0) snow_lsc = 0.
+
+      ! so-called 'numerical rain' is computed when qlnew=ql+dql>qlmax and qinew=qi+dqi>qimax
+      ! i.e. when the condensed content is unrealistically large
+      ! qlnew is set to qlmax and qinew to qimax
+
+      rain_num(:) = 0.
+      DO k = 1, klev
+         DO i = 1, klon
+            IF (ql_seri(i, k) > qlmax) THEN
+               rain_num(i) = rain_num(i) + (ql_seri(i, k) - qlmax)*zmasse(i, k)/dtime
+               ql_seri(i, k) = qlmax
+            END IF
+         END DO
+      END DO
+      IF (nqo >= 3) THEN
+      DO k = 1, klev
+         DO i = 1, klon
+            IF (qs_seri(i, k) > qimax) THEN
+               rain_num(i) = rain_num(i) + (qs_seri(i, k) - qimax)*zmasse(i, k)/dtime
+               qs_seri(i, k) = qimax
+            END IF
+         END DO
+      END DO
+      END IF
+
+      ! total precipitation
+      DO i = 1, klon
+         rain_fall(i) = rain_fall(i) + rain_lsc(i)
+         snow_fall(i) = snow_fall(i) + snow_lsc(i)
+      END DO
+
+      ! relative humidity diagnostics
+      DO k = 1, klev
+
+         DO i=1, klon
+            z_q(i) = q_seri(i, k)
+            z_t(i) = t_seri(i, k)
+            z_p(i) = pplay(i, k)
+         END DO
+
+         CALL CALC_QSAT_ECMWF(klon, z_t, z_q, z_p, RTT, 0, .false., z_qs, z_dqs)
+         CALL CALC_QSAT_ECMWF(klon, z_t, z_q, z_p, RTT, 1, .false., z_qsl, z_dqsl)
+         CALL CALC_QSAT_ECMWF(klon, z_t, z_q, z_p, RTT, 2, .false., z_qsi, z_dqsi)
+
+         DO i = 1, klon
+            rhl(i, k) = z_q(i)/z_qsl(i)
+            rhi(i, k) = z_q(i)/z_qsi(i)
+            rh(i, k) = z_q(i)/z_qs(i)
+            qsat(i, k) = z_qs(i)
+         END DO
+
+      ENDDO
+
+
+
    END SUBROUTINE call_lscp
 
Index: LMDZ6/trunk/libf/phylmd/physiq_mod.F90
===================================================================
--- LMDZ6/trunk/libf/phylmd/physiq_mod.F90	(revision 6041)
+++ LMDZ6/trunk/libf/phylmd/physiq_mod.F90	(revision 6042)
@@ -3959,5 +3959,5 @@
      abortphy, flag_inhib_tend, itap,                             &
      nqo, pdtphys, missing_val, ok_new_lscp,                      &
-     paprs, pplay, omega, t_seri, q_seri, ql_seri, qs_seri,       &
+     paprs, pplay, omega, t_seri, q_seri,                         &
      zmasse, ptconv, ratqsc, ratqs, ratqs_inter_, sigma_qtherm,   &
      qtc_cv, sigt_cv,detrain_cv,fm_cv,fqd,fqcomp,       &
@@ -3989,5 +3989,5 @@
      qraindiag, qsnowdiag, dqreva, dqssub, dqrauto,     &
      dqrcol, dqrmelt, dqrfreez, dqsauto, dqsagg, dqsrim,&
-     dqsmelt, dqsfreez)
+     dqsmelt, dqsfreez, zx_rh, zx_rhl, zx_rhi)
 
     !===============================================================================
@@ -4169,33 +4169,4 @@
        ENDDO
     ENDIF
-
-    !
-    ! Calculer l'humidite relative pour diagnostique
-    !
-    ! A inclure dans lmdz_call_lscp via un appel à lmdz_lscp_tools
-    DO k = 1, klev
-       DO i = 1, klon
-          zx_t = t_seri(i,k)
-          IF (thermcep) THEN
-             zdelta = MAX(0.,SIGN(1.,rtt-zx_t))
-             zx_qs  = r2es * FOEEW(zx_t,zdelta)/pplay(i,k)
-             zx_qs  = MIN(0.5,zx_qs)
-             zcor   = 1./(1.-retv*zx_qs)
-             zx_qs  = zx_qs*zcor
-          ELSE
-             IF (zx_t.LT.rtt) THEN                  
-                zx_qs = qsats(zx_t)/pplay(i,k)
-             ELSE
-                zx_qs = qsatl(zx_t)/pplay(i,k)
-             ENDIF
-          ENDIF
-          zx_rh(i,k) = q_seri(i,k)/zx_qs
-          IF (iflag_ice_thermo .GT. 0) THEN
-             zx_rhl(i,k) = MIN(q_seri(i,k)/(qsatl(zx_t)/pplay(i,k)),1.)
-             zx_rhi(i,k) = zx_rhl(i,k)*qsatl(zx_t)/qsats(zx_t)
-          ENDIF
-          zqsat(i,k)=zx_qs
-       ENDDO
-    ENDDO
 
     !===============================================================================
