Index: trunk/LMDZ.GENERIC/libf/phystd/callkeys_mod.F90
===================================================================
--- trunk/LMDZ.GENERIC/libf/phystd/callkeys_mod.F90	(revision 3235)
+++ trunk/LMDZ.GENERIC/libf/phystd/callkeys_mod.F90	(revision 3236)
@@ -48,5 +48,6 @@
       logical,save :: generic_condensation
       logical,save :: generic_rain
-!$OMP THREADPRIVATE(varactive,varfixed,sedimentation,generic_condensation,generic_rain)
+      logical,save :: virtual_correction
+!$OMP THREADPRIVATE(varactive,varfixed,sedimentation,generic_condensation,generic_rain,virtual_correction)
       logical,save :: water ,watercond, waterrain, moistadjustment
 !$OMP THREADPRIVATE(water, watercond, waterrain, moistadjustment)
Index: trunk/LMDZ.GENERIC/libf/phystd/convadj.F
===================================================================
--- trunk/LMDZ.GENERIC/libf/phystd/convadj.F	(revision 3235)
+++ trunk/LMDZ.GENERIC/libf/phystd/convadj.F	(revision 3236)
@@ -7,5 +7,8 @@
       USE tracer_h
       use comcstfi_mod, only: g
-      use callkeys_mod, only: tracer,water
+      use generic_cloud_common_h
+      use generic_tracer_index_mod, only: generic_tracer_index
+      use callkeys_mod, only: tracer,water,generic_condensation,
+     &                        virtual_correction
 
       implicit none
@@ -55,7 +58,7 @@
       REAL sig(nlay+1),sdsig(nlay),dsig(nlay)
       REAL zu(ngrid,nlay),zv(ngrid,nlay)
-      REAL zh(ngrid,nlay)
+      REAL zh(ngrid,nlay), zvh(ngrid,nlay)
       REAL zu2(ngrid,nlay),zv2(ngrid,nlay)
-      REAL zh2(ngrid,nlay), zhc(ngrid,nlay)
+      REAL zh2(ngrid,nlay),zvh2(ngrid,nlay),zhc(ngrid,nlay)
       REAL zhm,zsm,zdsm,zum,zvm,zalpha,zhmc
 
@@ -64,4 +67,7 @@
       REAL zq(ngrid,nlay,nq), zq2(ngrid,nlay,nq)
       REAL zqm(nq),zqco2m
+      
+      integer igcm_generic_vap, igcm_generic_ice
+      logical call_ice_vap_generic
 
       LOGICAL vtest(ngrid),down
@@ -75,21 +81,11 @@
 !     Initialisation
 !     --------------
-
-      DO l=1,nlay
-         DO ig=1,ngrid
-            zh(ig,l)=ph(ig,l)+pdhfi(ig,l)*ptimestep
-            zu(ig,l)=pu(ig,l)+pdufi(ig,l)*ptimestep
-            zv(ig,l)=pv(ig,l)+pdvfi(ig,l)*ptimestep
-         ENDDO
-      ENDDO
+      zh(:,:)=ph(:,:)+pdhfi(:,:)*ptimestep
+      zu(:,:)=pu(:,:)+pdufi(:,:)*ptimestep
+      zv(:,:)=pv(:,:)+pdvfi(:,:)*ptimestep
 
       if(tracer) then      
-        DO iq =1, nq
-         DO l=1,nlay
-           DO ig=1,ngrid
-              zq(ig,l,iq)=pq(ig,l,iq)+pdqfi(ig,l,iq)*ptimestep
-           ENDDO
-         ENDDO
-        ENDDO
+        zq(:,:,:)=pq(:,:,:)+pdqfi(:,:,:)*ptimestep
+        !zq(:,:,:)=0
       end if
 
@@ -99,4 +95,5 @@
       CALL scopy(ngrid*nlay*nq,zq,1,zq2,1)
 
+
 !     -----------------------------
 !     Detection of unstable columns
@@ -108,5 +105,19 @@
       ENDDO
 
-      CALL scopy(ngrid*nlay,zh2,1,zhc,1)
+      if((generic_condensation) .and. (virtual_correction)) THEN
+        DO iq=1,nq
+          call generic_tracer_index(nq,iq,igcm_generic_vap,
+     &         igcm_generic_ice,call_ice_vap_generic)
+          if(call_ice_vap_generic) then
+            zvh(:,:)=zh(:,:)*
+     &         (1.+zq(:,:,igcm_generic_vap)/epsi_generic)/
+     &         (1.+zq(:,:,igcm_generic_vap))
+          endif
+        ENDDO
+        CALL scopy(ngrid*nlay,zvh,1,zvh2,1)
+        CALL scopy(ngrid*nlay,zvh2,1,zhc,1)
+      else        
+        CALL scopy(ngrid*nlay,zh2,1,zhc,1)
+      endif
 
 !     Find out which grid points are convectively unstable
@@ -169,5 +180,12 @@
                 zdsm = zdsm + dsig(l)
                 zhm = zhm + sdsig(l) * (zh2(i, l) - zhm) / zsm
-                zhmc = zhm
+  
+                if (generic_condensation .and. virtual_correction) then
+                  zhmc = zhm*
+     &            (1.+zq(i,l,igcm_generic_vap)/epsi_generic)/
+     &            (1.+zq(i,l,igcm_generic_vap))
+                else
+                  zhmc = zhm
+                endif
  
 !     do we have to extend the column downwards?
@@ -327,20 +345,10 @@
       ENDDO
 
-      DO l=1,nlay
-        DO ig=1,ngrid
-          pdhadj(ig,l)=(zh2(ig,l)-zh(ig,l))/ptimestep
-          pduadj(ig,l)=(zu2(ig,l)-zu(ig,l))/ptimestep
-          pdvadj(ig,l)=(zv2(ig,l)-zv(ig,l))/ptimestep
-        ENDDO
-      ENDDO
+      pdhadj(:,:)=(zh2(:,:)-zh(:,:))/ptimestep
+      pduadj(:,:)=(zu2(:,:)-zu(:,:))/ptimestep
+      pdvadj(:,:)=(zv2(:,:)-zv(:,:))/ptimestep
 
       if(tracer) then 
-        do iq=1, nq
-          do  l=1,nlay
-            DO ig=1,ngrid
-              pdqadj(ig,l,iq)=(zq2(ig,l,iq)-zq(ig,l,iq))/ptimestep 
-            end do 
-          end do 
-        end do 
+        pdqadj(:,:,:)=(zq2(:,:,:)-zq(:,:,:))/ptimestep 
       end if
 
Index: trunk/LMDZ.GENERIC/libf/phystd/inifis_mod.F90
===================================================================
--- trunk/LMDZ.GENERIC/libf/phystd/inifis_mod.F90	(revision 3235)
+++ trunk/LMDZ.GENERIC/libf/phystd/inifis_mod.F90	(revision 3236)
@@ -1024,4 +1024,9 @@
      call getin_p("generic_rain",generic_rain)
      if (is_master) write(*,*)trim(rname)//": generic_rain = ",generic_rain
+     
+     if (is_master) write(*,*)trim(rname)//": Virtual correction ?"
+     virtual_correction=.false. !default value 
+     call getin_p("virtual_correction",virtual_correction)
+     if (is_master) write(*,*)trim(rname)//": virtual_correction = ",virtual_correction
 
      if (is_master) write(*,*)trim(rname)//": Compute water cycle ?"
Index: trunk/LMDZ.GENERIC/libf/phystd/physiq_mod.F90
===================================================================
--- trunk/LMDZ.GENERIC/libf/phystd/physiq_mod.F90	(revision 3235)
+++ trunk/LMDZ.GENERIC/libf/phystd/physiq_mod.F90	(revision 3236)
@@ -551,4 +551,8 @@
            endif
            close(33)
+         else
+           IF (.NOT.ALLOCATED(p_var))  ALLOCATE(p_var(nlayer))
+           IF (.NOT.ALLOCATED(mu_var))  ALLOCATE(mu_var(nlayer))
+           IF (.NOT.ALLOCATED(frac_var))  ALLOCATE(frac_var(nlayer,ngasmx))
          endif
 
Index: trunk/LMDZ.GENERIC/libf/phystd/turbdiff_mod.F90
===================================================================
--- trunk/LMDZ.GENERIC/libf/phystd/turbdiff_mod.F90	(revision 3235)
+++ trunk/LMDZ.GENERIC/libf/phystd/turbdiff_mod.F90	(revision 3236)
@@ -247,5 +247,5 @@
 !     ------------------------------------------------------ 
 
-      call vdif_kc(ngrid,nlay,ptimestep,g,pzlev,pzlay,pu,pv,zh,zcdv_true,pq2,zkv,zkh) !JL12 why not call vdif_kc with updated winds and temperature 
+      call vdif_kc(ngrid,nlay,nq,ptimestep,g,pzlev,pzlay,pu,pv,pq,zh,zcdv_true,pq2,zkv,zkh) !JL12 why not call vdif_kc with updated winds and temperature 
       
 !     Adding eddy mixing to mimic 3D general circulation in 1D
Index: trunk/LMDZ.GENERIC/libf/phystd/vdif_kc.F
===================================================================
--- trunk/LMDZ.GENERIC/libf/phystd/vdif_kc.F	(revision 3235)
+++ trunk/LMDZ.GENERIC/libf/phystd/vdif_kc.F	(revision 3236)
@@ -1,3 +1,7 @@
-      SUBROUTINE vdif_kc(ngrid,nlay,dt,g,zlev,zlay,u,v,teta,cd,q2,km,kn)
+      SUBROUTINE vdif_kc(ngrid,nlay,nq,dt,g,zlev,zlay,u,v,
+     &                       zq,teta,cd,q2,km,kn)
+      use generic_cloud_common_h, only: epsi_generic
+      use generic_tracer_index_mod, only: generic_tracer_index
+      use callkeys_mod, only: generic_condensation, virtual_correction
       IMPLICIT NONE
 c.......................................................................
@@ -26,4 +30,5 @@
       INTEGER,INTENT(IN) :: ngrid
       INTEGER,INTENT(IN) :: nlay
+      INTEGER,INTENT(IN) :: nq
       REAL,INTENT(IN) :: dt,g
       REAL,INTENT(IN) :: zlev(ngrid,nlay+1)
@@ -31,4 +36,5 @@
       REAL,INTENT(IN) :: u(ngrid,nlay)
       REAL,INTENT(IN) :: v(ngrid,nlay)
+      REAL,INTENT(IN) :: zq(ngrid,nlay,nq)
       REAL,INTENT(IN) :: teta(ngrid,nlay)
       REAL,INTENT(IN) :: cd(ngrid)
@@ -52,4 +58,7 @@
       REAL unsdzdec(ngrid,nlay+1)
       REAL q(ngrid,nlay+1)
+      REAL tetav(ngrid,nlay)
+      integer iq,igcm_generic_vap, igcm_generic_ice
+      logical call_ice_vap_generic
 c.......................................................................
 c
@@ -250,4 +259,27 @@
         mpre(igrid,1)=m(igrid,1)
       ENDDO
+
+c
+c.......................................................................
+c  Virtual correction
+c.......................................................................
+c
+
+      if((generic_condensation) .and. (virtual_correction)) THEN
+        DO ilev=1,nlay
+         DO igrid=1,ngrid
+          DO iq=1,nq
+            call generic_tracer_index(nq,iq,igcm_generic_vap,
+     &         igcm_generic_ice,call_ice_vap_generic)
+            if(call_ice_vap_generic) then
+               tetav(igrid,ilev) = teta(igrid,ilev)*
+     &              (1.+zq(igrid,ilev,igcm_generic_vap)/epsi_generic)/
+     &              (1.+zq(igrid,ilev,igcm_generic_vap))
+            endif
+          ENDDO
+         ENDDO
+        ENDDO
+      endif 
+
 c
 c-----------------------------------------------------------------------
@@ -256,7 +288,13 @@
 c-----------------------------------------------------------------------
 c
+      if((generic_condensation) .and. (virtual_correction)) THEN
         n2(igrid,ilev)=g*unsdzdec(igrid,ilev)
-     &                   *(teta(igrid,ilev)-teta(igrid,ilev-1))
-     &                   /(teta(igrid,ilev)+teta(igrid,ilev-1)) *2.E+0
+     &                 *(tetav(igrid,ilev)-tetav(igrid,ilev-1))
+     &                 /(tetav(igrid,ilev)+tetav(igrid,ilev-1))*2.E+0
+      else
+        n2(igrid,ilev)=g*unsdzdec(igrid,ilev)
+     &                 *(teta(igrid,ilev)-teta(igrid,ilev-1))
+     &                 /(teta(igrid,ilev)+teta(igrid,ilev-1)) *2.E+0
+      endif
 c
 c --->
Index: trunk/LMDZ.GENERIC/libf/phystd/vdifc_mod.F
===================================================================
--- trunk/LMDZ.GENERIC/libf/phystd/vdifc_mod.F	(revision 3235)
+++ trunk/LMDZ.GENERIC/libf/phystd/vdifc_mod.F	(revision 3236)
@@ -246,6 +246,6 @@
 !     ------------------------------------------------------ 
 
-      call vdif_kc(ngrid,nlay,ptimestep,g,pzlev,pzlay
-     &     ,pu,pv,ph,zcdv_true
+      call vdif_kc(ngrid,nlay,nq,ptimestep,g,pzlev,pzlay
+     &     ,pu,pv,pq,ph,zcdv_true
      &     ,pq2,zkv,zkh)
 
