Gaelle 18/01/2016 : correction ecoclimap 2
authorGaelle Tanguy <gaelle.tanguy@meteo.fr>
Mon, 18 Jan 2016 09:15:35 +0000 (09:15 +0000)
committerPhilippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Thu, 19 May 2016 14:44:49 +0000 (16:44 +0200)
src/MNH/drag_veg.f90
src/MNH/ini_modeln.f90
src/MNH/ini_radiations_ecmwf.f90
src/MNH/mnhget_surf_paramn.f90
src/SURFEX/get_surf_varn.F90
src/SURFEX/get_var_naturen.F90

index 7de0e66..3c08c38 100644 (file)
@@ -1,4 +1,3 @@
-
 !MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
@@ -55,6 +54,7 @@ END MODULE MODI_DRAG_VEG
 !!    -------------
 !!      Original    07/2009
 !!       C.Lac      07/2011 : Add budgets
+!!       S. Donier  06/2015 : bug surface aerosols
 !!---------------------------------------------------------------
 !
 !
@@ -124,7 +124,7 @@ ZDENSITY(:,:,:)=0.
 ALLOCATE(ZH_TREE_PGD(IIU,IJU))
 ALLOCATE(ZLAI_PGD(IIU,IJU))
 !
-CALL MNHGET_SURF_PARAM_n(PVH=ZH_TREE_PGD,PLAI=ZLAI_PGD)
+CALL MNHGET_SURF_PARAM_n(PH_TREE=ZH_TREE_PGD,PLAI_TREE=ZLAI_PGD)
 !
 ZVH(:,:)=ZH_TREE_PGD(:,:)
 ZLAI(:,:)=ZLAI_PGD(:,:)
index ebb581f..c6ab8f6 100644 (file)
@@ -263,6 +263,7 @@ END MODULE MODI_INI_MODEL_n
 !!                   JAn.  2015  (F. Brosse) bug in allocate XACPRAQ
 !!                   Dec 2014 (C.Lac) : For reproducibility START/RESTA
 !!                   J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 
+!!       V. Masson     Feb 2015 replaces, for aerosols, cover fractions by sea, town, bare soil fractions
 !---------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -460,8 +461,9 @@ INTEGER :: IIU_B,IJU_B
 INTEGER :: IIU_SXP2_YP1_Z_ll,IJU_SXP2_YP1_Z_ll,IKU_SXP2_YP1_Z_ll
 !
 REAL, DIMENSION(:,:),   ALLOCATABLE :: ZCO2   ! CO2 concentration near the surface
-REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZCOVER ! surface cover types
-INTEGER                             :: ICOVER ! number of cover types
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZSEA   ! sea fraction
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZTOWN  ! town fraction
+REAL, DIMENSION(:,:),   ALLOCATABLE :: ZBARE  ! bare soil fraction
 !
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZDIR_ALB ! direct albedo
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZSCA_ALB ! diffuse albedo
@@ -1960,23 +1962,24 @@ IF (CRAD   == 'ECMW') THEN
 !* get cover mask for aerosols
 !
   IF (CPROGRAM=='MESONH' .OR. CPROGRAM=='DIAG  ') THEN
+    ALLOCATE(ZSEA(IIU,IJU))
+    ALLOCATE(ZTOWN(IIU,IJU))
+    ALLOCATE(ZBARE(IIU,IJU))
     IF (CSURF=='EXTE') THEN
       CALL GOTO_SURFEX(KMI,.TRUE.)
-      CALL MNHGET_SURF_PARAM_n(KCOVER=ICOVER)
-      ALLOCATE(ZCOVER(IIU,IJU,ICOVER))
-      CALL MNHGET_SURF_PARAM_n(PCOVER=ZCOVER)
+      CALL MNHGET_SURF_PARAM_n(PSEA=ZSEA,PTOWN=ZTOWN,PBARE=ZBARE)
     ELSE
-      ALLOCATE(ZCOVER(IIU,IJU,255))
-      ZCOVER(:,:,:) = 0.
-      ZCOVER(:,:,1) = 1.
+      ZSEA (:,:) = 1.
+      ZTOWN(:,:) = 0.
+      ZBARE(:,:) = 0.
     END IF
 !
     CALL INI_RADIATIONS_ECMWF (HINIFILE,HLUOUT,                                           &
                                XZHAT,XPABST,XTHT,XTSRAD,XLAT,XLON,TDTCUR,TDTEXP,          &
                                CLW,NDLON,NFLEV,NFLUX,NRAD,NSWB,CAER,NAER,NSTATM,          &
-                               XSTATM,ZCOVER,XOZON, XAER,XDST_WL, LSUBG_COND              )
+                               XSTATM,ZSEA,ZTOWN,ZBARE,XOZON, XAER,XDST_WL, LSUBG_COND              )
 !
-    DEALLOCATE(ZCOVER)
+    DEALLOCATE(ZSEA,ZTOWN,ZBARE)
     ALLOCATE (XAER_CLIM(SIZE(XAER,1),SIZE(XAER,2),SIZE(XAER,3),SIZE(XAER,4)))
     XAER_CLIM(:,:,:,:) =XAER(:,:,:,:)
 !
index 0d0a3db..72a746e 100644 (file)
@@ -17,7 +17,7 @@ INTERFACE
     SUBROUTINE INI_RADIATIONS_ECMWF(HINIFILE,HLUOUT,                      &
          PZHAT,PPABST,PTHT,PTSRAD,PLAT,PLON,TPDTCUR,TPDTEXP,              &
          HLW,KDLON,KFLEV,KFLUX,KRAD,KSWB,HAER,KAER,KSTATM,                &
-         PSTATM,PCOVER,POZON, PAER,PDST_WL, OSUBG_COND                    )
+         PSTATM,PSEA,PTOWN,PBARE,POZON, PAER,PDST_WL, OSUBG_COND                    )
 !
 USE MODD_TYPE_DATE
 !
@@ -31,7 +31,9 @@ REAL, DIMENSION(:),     INTENT(IN) :: PZHAT ! height level without orography
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST! pressure
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT  !Temperature
 REAL, DIMENSION(:,:),   INTENT(IN) :: PTSRAD ! surface radiative temperature
-REAL, DIMENSION (:,:,:),INTENT (IN):: PCOVER ! surface cover types
+REAL, DIMENSION (:,:),  INTENT(IN) :: PSEA   ! sea fraction
+REAL, DIMENSION (:,:),  INTENT(IN) :: PTOWN  ! town fraction
+REAL, DIMENSION (:,:),  INTENT(IN) :: PBARE  ! bare soil fraction
 REAL, DIMENSION(:,:),   INTENT(IN) :: PLAT, PLON ! arrays of latitude-longitude
 !
 TYPE (DATE_TIME),       INTENT(IN) :: TPDTCUR    ! Current date and time
@@ -67,7 +69,7 @@ END MODULE MODI_INI_RADIATIONS_ECMWF
     SUBROUTINE INI_RADIATIONS_ECMWF(HINIFILE,HLUOUT,                      &
          PZHAT,PPABST,PTHT,PTSRAD,PLAT,PLON,TPDTCUR,TPDTEXP,              &
          HLW,KDLON,KFLEV,KFLUX,KRAD,KSWB,HAER,KAER,KSTATM,                &
-         PSTATM,PCOVER,POZON, PAER, PDST_WL,OSUBG_COND                    )
+         PSTATM,PSEA,PTOWN,PBARE,POZON, PAER, PDST_WL,OSUBG_COND                    )
 !   #######################################################################
 !
 !!****  *INI_RADIATIONS * - initialisation for ECMWF radiation scheme in the MesoNH framework
@@ -173,6 +175,7 @@ END MODULE MODI_INI_RADIATIONS_ECMWF
 !!                           of the surface)
 !!      (A.Grini) 07/2005 add dust
 !!      (M.Tomasini P.Peyrille)  06/2012  to set date to a perpetual day if LFIX_DAT=T
+!!      (V. Masson)          replaces cover fractions by sea/town/bare soil fractions
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -225,7 +228,9 @@ REAL, DIMENSION(:),     INTENT(IN) :: PZHAT ! height level without orography
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST! pressure
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT  !Temperature
 REAL, DIMENSION(:,:),   INTENT(IN) :: PTSRAD ! surface radiative temperature
-REAL, DIMENSION (:,:,:),INTENT (IN):: PCOVER ! surface cover types
+REAL, DIMENSION (:,:),  INTENT(IN) :: PSEA   ! sea fraction
+REAL, DIMENSION (:,:),  INTENT(IN) :: PTOWN  ! town fraction
+REAL, DIMENSION (:,:),  INTENT(IN) :: PBARE  ! bare soil fraction
 REAL, DIMENSION(:,:),   INTENT(IN) :: PLAT, PLON ! arrays of latitude-longitude
 !
 TYPE (DATE_TIME),       INTENT(IN) :: TPDTCUR    ! Current date and time
@@ -257,7 +262,7 @@ LOGICAL :: GWINTER ! .T. when WINTERtime
 LOGICAL :: GSEASON ! .T. when SUMMERtime in the northern hemisphere or
                    !     when WINTERtime in the southern hemisphere
 !
-INTEGER :: JI, JJ, JK, JK1, JKRAD,IIJ,JL , JCOVER ! loop index
+INTEGER :: JI, JJ, JK, JK1, JKRAD,IIJ,JL  ! loop index
 !
 INTEGER :: IIB           ! I index value of the first inner mass point
 INTEGER :: IJB           ! J index value of the first inner mass point
@@ -274,6 +279,7 @@ REAL :: ZLATMEAN      ! MEAN LATitude in the domain
 REAL :: ZLAT_TROPICAL ! TROPIQUE LATitude
 REAL :: ZLAT_POLAR    ! POLAR circle LATitude
 !
+REAL, DIMENSION(:,:),ALLOCATABLE :: ZLON          ! longitude
 REAL, DIMENSION(SIZE(PSTATM,1)) :: ZZSTAT ! half level altitudes of standard atm.
 !
 INTEGER                :: IGRID,ILENCH,IRESP  !   File 
@@ -290,6 +296,8 @@ REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZEXNT ! Exner functio
 !
 ! Variables for aerosols and ozone climatologies set up
 REAL, DIMENSION (:),     ALLOCATABLE  :: ZAESEA, ZAELAN, ZAEURB, ZAEDES
+LOGICAL, DIMENSION (:,:),ALLOCATABLE  :: GAFRICA, GASIA, GAUSTRALIA
+REAL, DIMENSION (:,:),   ALLOCATABLE  :: ZDESERT ! desert fraction
 REAL, DIMENSION (:,:,:), ALLOCATABLE  :: ZAER
 REAL, DIMENSION (:,:),   ALLOCATABLE  :: ZPRES_HL,ZT_HL, ZPAVE, ZOZON, ZWORK_GRID
 REAL, DIMENSION (:,:),   ALLOCATABLE  :: ZCVDAES, ZCVDAEL, ZCVDAEU, ZCVDAED,ZETAH
@@ -556,50 +564,61 @@ IF(HAER /= 'NONE') THEN
                           PLAT,PLON,ZAESEA,ZAELAN,ZAEURB,ZAEDES )
   END IF
 !
-IF( HAER =='SURF') THEN
-! AEROSOLS from COVER data
+! AEROSOLS from SURFACE FRACTIONS
 !
-    ALLOCATE(ZAECOV_SEA(SIZE(PCOVER,3)))
-    ALLOCATE(ZAECOV_URB(SIZE(PCOVER,3)))
-    ALLOCATE(ZAECOV_DES(SIZE(PCOVER,3)))
-    ALLOCATE(ZAECOV_LAN(SIZE(PCOVER,3)))
-
-!sea aerosol for cover 1:
-    ZAECOV_SEA(:) = 0.
-    ZAECOV_SEA(1) = 1.
-!
-!urban aerosol for urban cover:
-    ZAECOV_URB(:) = 0.
-    ZAECOV_URB(7) = 1.
-    ZAECOV_URB(151:155) = 1.
-!desert cover for bare soil cover and partially for some open shrubland 
-!covers near Sahara and Australia
-    ZAECOV_DES(:) = 0.
-    ZAECOV_DES(4) = 1.
-    ZAECOV_DES(80:82) = 0.5
-    ZAECOV_DES(67:68) = 0.2
-!land cover 
-    ZAECOV_LAN(:) = 1.- ZAECOV_SEA(:) - ZAECOV_URB(:) - ZAECOV_DES(:)
+  IF( HAER =='SURF') THEN
 !
+    !* deserts are only considered over Africa, southern Asia, Australia
+    !* longitude between -180 and 180 for geographical tests
+    !  Only bare soil fractions larger than 0.5 are supposed to contribute to
+    !  desert aerosols
+    !
+    ALLOCATE(ZDESERT   (IIU,IJU))
+    ZDESERT(:,:) = 0.
+
+    IF (.NOT.LCARTESIAN) THEN
+      !* deserts are only considered over Africa, southern Asia, Australia
+      ALLOCATE(ZLON      (IIU,IJU))
+      ALLOCATE(GAFRICA   (IIU,IJU))
+      ALLOCATE(GASIA     (IIU,IJU))
+      ALLOCATE(GAUSTRALIA(IIU,IJU))    
+      !* longitude between -180 and 180 for geographical tests
+      ZLON = PLON(:,:) - NINT(PLON/360.)*360.
+      GAFRICA   (:,:) = PLAT(:,:) > -36.086389  .AND. PLAT(:,:) < 36.010556 &
+                  .AND. ZLON(:,:) > -73.18      .AND. ZLON(:,:) < 34.158611
+      GASIA     (:,:) = PLAT(:,:) > 4.358056    .AND. PLAT(:,:) < 55.335278 &
+                  .AND. ZLON(:,:) > -123.157778 .AND. ZLON(:,:) <-34.285556
+      GAUSTRALIA(:,:) = PLAT(:,:) > -39.561389  .AND. PLAT(:,:) < -10.251667 &
+                  .AND. ZLON(:,:) > -155.041944 .AND. ZLON(:,:) < -111.405556
+      !
+      !  Only bare soil fractions larger than 0.5 are supposed to contribute to
+      !  desert aerosols
+      !
+      WHERE (GAFRICA(:,:) .OR. GASIA(:,:) .OR. GAUSTRALIA(:,:)) &
+      ZDESERT(:,:) = MAX( 2.*(PBARE(:,:)-0.5) , 0.)
+      !
+      !
+    ELSE
+      !
+      ZDESERT(:,:) = MAX( 2.*(PBARE(:,:)-0.5) , 0.)
+      !
+    ENDIF
+    !
+    !* fills sea, town, desert and land surface covers for aerosols distributions
     DO JJ=IJB,IJE
       DO JI=IIB,IIE
         IIJ = 1 + (JI-IIB) + (IIE-IIB+1)*(JJ-IJB)
-        ZAESEA(IIJ) = 0.
-        ZAEURB(IIJ) = 0.
-        ZAEDES(IIJ) = 0.
-        ZAELAN(IIJ) = 0.
-        DO JCOVER=1,SIZE(PCOVER,3)
-          ZAESEA(IIJ) = ZAESEA(IIJ) + ZAECOV_SEA(JCOVER) * PCOVER(JI,JJ,JCOVER)
-          ZAEURB(IIJ) = ZAEURB(IIJ) + ZAECOV_URB(JCOVER) * PCOVER(JI,JJ,JCOVER)
-          ZAEDES(IIJ) = ZAEDES(IIJ) + ZAECOV_DES(JCOVER) * PCOVER(JI,JJ,JCOVER)
-          ZAELAN(IIJ) = ZAELAN(IIJ) + ZAECOV_LAN(JCOVER) * PCOVER(JI,JJ,JCOVER)
-        END DO
+        ZAESEA(IIJ) = PSEA(JI,JJ)
+        ZAEURB(IIJ) = PTOWN(JI,JJ)
+        ZAEDES(IIJ) = ZDESERT(JI,JJ)
+        ZAELAN(IIJ) = MAX( 1.- ZAESEA(IIJ) - ZAEURB(IIJ) - ZAEDES(IIJ) , 0.)
       END DO
     END DO
-    DEALLOCATE(ZAECOV_SEA)
-    DEALLOCATE(ZAECOV_URB)
-    DEALLOCATE(ZAECOV_DES)
-    DEALLOCATE(ZAECOV_LAN)
+    IF (ALLOCATED(ZLON)) DEALLOCATE(ZLON)
+    IF (ALLOCATED(GAFRICA))     DEALLOCATE(GAFRICA)
+    IF (ALLOCATED(GASIA))     DEALLOCATE(GASIA)
+    IF (ALLOCATED(GAUSTRALIA))     DEALLOCATE(GAUSTRALIA)
+    IF (ALLOCATED(ZDESERT))     DEALLOCATE(ZDESERT)
 
   END IF
 !
index 1ac1053..2c11b82 100644 (file)
@@ -1,4 +1,3 @@
-
 !MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
 INTERFACE
       SUBROUTINE MNHGET_SURF_PARAM_n(PCOVER,PSEA,KCOVER,PRN,PH,PLE,PLEI,PGFLUX, &
                                      PT2M,PQ2M,PHU2M,PZON10M,PMER10M,PZS,PTOWN,&
-                                     PLAI, PVH )
+                                     PBARE, PLAI_TREE, PH_TREE )
 !
 REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PCOVER  ! cover types
 REAL, DIMENSION(:,:),   INTENT(OUT), OPTIONAL :: PSEA    ! sea fraction
 REAL, DIMENSION(:,:),   INTENT(OUT), OPTIONAL :: PTOWN   ! town fraction
 INTEGER,                INTENT(OUT), OPTIONAL :: KCOVER  ! number of cover types
-REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PVH     
-REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PLAI   
+REAL, DIMENSION(:,:),   INTENT(OUT), OPTIONAL :: PBARE           ! Bare soil fraction
+REAL, DIMENSION(:,:),   INTENT(OUT), OPTIONAL :: PLAI_TREE       ! 
+REAL, DIMENSION(:,:),   INTENT(OUT), OPTIONAL :: PH_TREE
 REAL, DIMENSION(:),     INTENT(INOUT), OPTIONAL :: PRN           ! Net radiation at surface    (W/m2)
 REAL, DIMENSION(:),     INTENT(INOUT), OPTIONAL :: PH            ! Sensible heat flux          (W/m2)
 REAL, DIMENSION(:),     INTENT(INOUT), OPTIONAL :: PLE           ! Total Latent heat flux      (W/m2)
@@ -43,7 +43,7 @@ END MODULE MODI_MNHGET_SURF_PARAM_n
 !     ########################################
       SUBROUTINE MNHGET_SURF_PARAM_n(PCOVER,PSEA,KCOVER,PRN,PH,PLE,PLEI,PGFLUX, &
                                      PT2M,PQ2M,PHU2M,PZON10M,PMER10M,PZS,PTOWN,&
-                                     PLAI, PVH )
+                                     PBARE, PLAI_TREE, PH_TREE )
 !     ########################################
 !
 !!****  *MNHGET_SURF_PARAM_n* - gets some surface fields on MESONH grid
@@ -76,6 +76,7 @@ END MODULE MODI_MNHGET_SURF_PARAM_n
 !!      Modif
 !!      J.Escobar 21/03/2013: for HALOK comment all NHALO=1 test 
 !!                            & correction of index linearisation for NHALO<>1 
+!!       S. Donier  06/2015 : bug surface aerosols
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -90,6 +91,7 @@ USE MODI_GET_FRAC_N
 USE MODI_GET_JCOVER_N
 USE MODI_GET_FLUX_N
 USE MODI_GET_ZS_N
+USE MODI_GET_SURF_VAR_n
 !
 IMPLICIT NONE
 !
@@ -100,8 +102,9 @@ REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PCOVER  ! cover types
 REAL, DIMENSION(:,:),   INTENT(OUT), OPTIONAL :: PSEA    ! sea fraction
 REAL, DIMENSION(:,:),   INTENT(OUT), OPTIONAL :: PTOWN   ! town fraction
 INTEGER,                INTENT(OUT), OPTIONAL :: KCOVER  ! number of cover types
-REAL, DIMENSION(:,:),   INTENT(OUT), OPTIONAL :: PVH     
-REAL, DIMENSION(:,:),   INTENT(OUT), OPTIONAL :: PLAI
+REAL, DIMENSION(:,:),   INTENT(OUT), OPTIONAL :: PBARE           ! Bare soil fraction
+REAL, DIMENSION(:,:),   INTENT(OUT), OPTIONAL :: PLAI_TREE       ! 
+REAL, DIMENSION(:,:),   INTENT(OUT), OPTIONAL :: PH_TREE         !
 REAL, DIMENSION(:),     INTENT(INOUT), OPTIONAL :: PRN           ! Net radiation at surface    (W/m2)
 REAL, DIMENSION(:),     INTENT(INOUT), OPTIONAL :: PH            ! Sensible heat flux          (W/m2)
 REAL, DIMENSION(:),     INTENT(INOUT), OPTIONAL :: PLE           ! Total Latent heat flux      (W/m2)
@@ -134,6 +137,7 @@ REAL, DIMENSION(:),   ALLOCATABLE :: ZNATURE! nature fraction
 REAL, DIMENSION(:),   ALLOCATABLE :: ZTOWN  ! town   fraction
 REAL, DIMENSION(:),   ALLOCATABLE :: ZVH     
 REAL, DIMENSION(:),   ALLOCATABLE :: ZLAI
+REAL, DIMENSION(:),   ALLOCATABLE :: ZBARE  ! bare soil fraction
 REAL, DIMENSION(:),   ALLOCATABLE :: ZZS    ! orography
 REAL, DIMENSION(:),   ALLOCATABLE :: ZRN    ! net radiation at surface    (W/m2)
 REAL, DIMENSION(:),   ALLOCATABLE :: ZH     ! Sensible heat flux          (W/m2)
@@ -165,7 +169,8 @@ IF (PRESENT(PCOVER)) THEN
   DEALLOCATE(ZCOVER)
 END IF
 !
-IF (PRESENT(PSEA) .OR. PRESENT(PTOWN)) THEN
+IF (PRESENT(PSEA) .OR. PRESENT(PTOWN) .OR. &
+    PRESENT(PBARE) .OR. PRESENT(PLAI_TREE) .OR. PRESENT(PH_TREE)) THEN
   ALLOCATE(ZSEA   ( ILU ))
   ALLOCATE(ZWATER ( ILU ))
   ALLOCATE(ZNATURE( ILU ))
@@ -177,10 +182,13 @@ IF (PRESENT(PSEA) .OR. PRESENT(PTOWN)) THEN
   IF (PRESENT(PTOWN)) THEN
     CALL REMOVE_HALO(ZTOWN,PTOWN)
   END IF
-  DEALLOCATE(ZSEA   )
-  DEALLOCATE(ZWATER )
-  DEALLOCATE(ZNATURE)
-  DEALLOCATE(ZTOWN  )
+END IF
+!
+IF (PRESENT(PBARE)) THEN
+  ALLOCATE(ZBARE  ( ILU ))
+  CALL GET_SURF_VAR_n('MESONH', ILU, 1, PNATURE=ZNATURE, PBARE=ZBARE)
+  CALL REMOVE_HALO(ZBARE,PBARE)
+  DEALLOCATE(ZBARE)
 END IF
 !
 IF (PRESENT(KCOVER)) THEN
@@ -218,18 +226,24 @@ IF (PRESENT(PZS)) THEN
   DEALLOCATE(ZZS)
 END IF
 !
-IF (PRESENT(PVH)  .OR.PRESENT(PLAI)) THEN
-  PVH(:,:) = XUNDEF
-  PLAI(:,:) = XUNDEF
+IF (PRESENT(PH_TREE)  .OR.PRESENT(PLAI_TREE)) THEN
+  PH_TREE(:,:) = XUNDEF
+  PLAI_TREE(:,:) = XUNDEF
   ALLOCATE(ZVH  ( ILU ))
   ALLOCATE(ZLAI  ( ILU ))
-  CALL GET_VEG_n('MESONH',ILU,ZLAI,ZVH)
-  CALL REMOVE_HALO(ZLAI,PLAI)
-  CALL REMOVE_HALO(ZVH,PVH)
+  CALL GET_SURF_VAR_n('MESONH',ILU,1,PLAI_TREE=ZLAI,PH_TREE=ZVH)
+  CALL REMOVE_HALO(ZLAI,PLAI_TREE)
+  CALL REMOVE_HALO(ZVH,PH_TREE)
   DEALLOCATE(ZVH)
   DEALLOCATE(ZLAI)
 END IF
 !
+IF (ALLOCATED(ZSEA)) THEN
+  DEALLOCATE(ZSEA   )
+  DEALLOCATE(ZWATER )
+  DEALLOCATE(ZNATURE)
+  DEALLOCATE(ZTOWN  )
+END IF
 !==============================================================================
 !
 CONTAINS
index 6cbc6f7..0fab88e 100644 (file)
@@ -10,7 +10,7 @@
                                   PZ0H_SEA, PZ0H_WATER, PZ0H_NATURE, PZ0H_TOWN,&
                                   PQS_SEA, PQS_WATER, PQS_NATURE, PQS_TOWN,    &
                                   PPSNG, PPSNV, PZS, PSERIES, PTWSNOW,         &
-                                  PSSO_STDEV                     )  
+                                  PSSO_STDEV,PBARE, PLAI_TREE, PH_TREE         )  
 !     #######################################################################
 !
 !!****  *GET_SURF_VAR_n* - gets some surface fields on atmospheric grid
 !!      Original    02/2006
 !       S. Riette   06/2010 PSSO_STDEV and PTWSNOW added
 !       B. Decharme 09/2012 Argument added in GET_FLUX_n
+!       S. Donier  06/2015 : bug surface aerosols
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
 !              ------------
 !
 USE MODD_SURF_PAR,     ONLY : XUNDEF
-USE MODD_SURF_ATM_n,   ONLY : CWATER
+USE MODD_SURF_ATM_n,   ONLY : CWATER, XNATURE
 USE MODI_GET_LUOUT
 USE MODI_GET_FLUX_n
 USE MODI_GET_FRAC_n
 USE MODI_GET_Z0_n
 USE MODI_GET_QS_n
+USE MODI_GET_VEG_n
 USE MODI_GET_VAR_SEA_n
 USE MODI_GET_VAR_WATER_n
 USE MODI_GET_VAR_NATURE_n
@@ -118,6 +120,9 @@ REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PSERIES   ! any surface field for
 !                                                        ! mesoNH series are required
 REAL, DIMENSION(:), INTENT(OUT), OPTIONAL :: PTWSNOW    ! Snow total reservoir
 REAL, DIMENSION(:), INTENT(OUT), OPTIONAL :: PSSO_STDEV ! S.S.O. standard deviation           (m)
+REAL, DIMENSION(:), INTENT(OUT), OPTIONAL :: PBARE      ! bare soil fraction on grid mesh     (-)
+REAL, DIMENSION(:), INTENT(OUT), OPTIONAL :: PLAI_TREE       ! Leaf Area Index    on grid mesh     (-)
+REAL, DIMENSION(:), INTENT(OUT), OPTIONAL :: PH_TREE        ! Height of trees    on grid mesh     (-)
 !
 !-------------------------------------------------------------------------------
 !
@@ -126,7 +131,7 @@ REAL, DIMENSION(:), INTENT(OUT), OPTIONAL :: PSSO_STDEV ! S.S.O. standard deviat
 !              -------------------------------
 !
 REAL, DIMENSION(KI)    :: ZFIELD1, ZFIELD2, ZFIELD3, ZFIELD4, ZFIELD5, ZFIELD6
-REAL, DIMENSION(KI)    :: ZFIELD7
+REAL, DIMENSION(KI)    :: ZFIELD7, ZFIELD8
 REAL, DIMENSION(KI,KS) :: ZSERIES
 INTEGER, DIMENSION(KI) :: IMASK
 !
@@ -284,7 +289,7 @@ ENDIF
    !-------------------------------------------------------------------------------
    !
 IF ( PRESENT(PQS_NATURE) .OR. PRESENT(PPSNG) .OR. PRESENT(PPSNV) .OR.  PRESENT(PZ0EFF).OR. &
-     PRESENT(PTWSNOW) ) THEN
+     PRESENT(PTWSNOW) .OR. PRESENT(PBARE) .OR. PRESENT(PLAI_TREE) .OR. PRESENT(PH_TREE)  ) THEN
    !
    ! Get parameters over nature tile
    !
@@ -300,9 +305,12 @@ IF ( PRESENT(PQS_NATURE) .OR. PRESENT(PPSNG) .OR. PRESENT(PPSNV) .OR.  PRESENT(P
    IMASK(:)=0
    CALL GET_1D_MASK(KI_NATURE, KI, PNATURE, IMASK(1:KI_NATURE))
    !
-   CALL GET_VAR_NATURE_n(HPROGRAM, KI_NATURE, ZFIELD1(1:KI_NATURE), ZFIELD2(1:KI_NATURE), &
+   IF (KI_NATURE>0) THEN
+     CALL GET_VAR_NATURE_n(HPROGRAM, KI_NATURE, ZFIELD1(1:KI_NATURE), ZFIELD2(1:KI_NATURE), &
                                               ZFIELD3(1:KI_NATURE), ZFIELD4(1:KI_NATURE), &
-                        ZFIELD5(1:KI_NATURE), ZFIELD6(1:KI_NATURE), ZFIELD7(1:KI_NATURE))
+                        ZFIELD5(1:KI_NATURE), ZFIELD6(1:KI_NATURE), ZFIELD7(1:KI_NATURE), &
+                        ZFIELD8(1:KI_NATURE))
+   ENDIF
    !
    IF(PRESENT(PQS_NATURE))THEN
      PQS_NATURE    (:) = XUNDEF
@@ -353,6 +361,37 @@ IF ( PRESENT(PQS_NATURE) .OR. PRESENT(PPSNG) .OR. PRESENT(PPSNV) .OR.  PRESENT(P
      ENDDO
    ENDIF
    !
+   !* bare soil fraction
+   !
+   IF(PRESENT(PBARE)) THEN
+     PBARE    (:) = XUNDEF
+     DO JI = 1, KI_NATURE
+       PBARE   (IMASK(JI)) = ZFIELD8(JI)
+     ENDDO
+     PBARE(:) = PBARE(:) * XNATURE(:) ! averages bare soil fraction on whole grid mesh
+   ENDIF
+   !
+   !*   LAI and height of trees
+   !
+   IF (PRESENT(PLAI_TREE) .OR. PRESENT(PH_TREE) ) THEN
+     CALL GET_VEG_n(HPROGRAM, KI, ZFIELD1(1:KI_NATURE), ZFIELD2(1:KI_NATURE))
+     !
+     IF (PRESENT(PLAI_TREE)) THEN
+       PLAI_TREE(:) = XUNDEF
+       DO JI = 1, KI_NATURE
+         PLAI_TREE   (IMASK(JI)) = ZFIELD1(JI)
+       ENDDO
+       PLAI_TREE(:) = PLAI_TREE(:) * XNATURE(:) ! averages tree LAI on whole grid mesh
+     END IF
+     !
+     IF (PRESENT(PH_TREE)) THEN
+       PH_TREE(:) = 0.
+       DO JI = 1, KI_NATURE
+         PH_TREE   (IMASK(JI)) = ZFIELD2(JI)
+       ENDDO
+     END IF
+     !
+   END IF
 ENDIF
    !
    !-------------------------------------------------------------------------------
index 608c0ae..e11be0a 100644 (file)
@@ -3,7 +3,7 @@
 !SURFEX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !SURFEX_LIC for details. version 1.
 !     #########
-      SUBROUTINE GET_VAR_NATURE_n(HPROGRAM,KI,PQS,PSNG,PSNV,PZ0EFF,PZ0,PZ0H,PTWSNOW)
+      SUBROUTINE GET_VAR_NATURE_n(HPROGRAM,KI,PQS,PSNG,PSNV,PZ0EFF,PZ0,PZ0H,PTWSNOW,PBARE)
 !     ######################################################################
 !
 !!****  *GET_VAR_NATURE_n* - routine to get variables defined only over nature
@@ -34,6 +34,7 @@
 !!      Original    02/2006
 !       M. Jidane   08/2008 Z0 and Z0H recovery from nature tiles
 !       S. Riette   06/2010 TWSNOW added
+!       V. Masson   02/2015 adds LAI, height of trees, fraction of bare soil
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -41,6 +42,8 @@
 !
 USE MODI_GET_LUOUT
 USE MODD_SURF_PAR,    ONLY   : XUNDEF
+USE MODD_DATA_COVER_PAR,   ONLY   : NVT_NO
+USE MODD_ISBA_n,           ONLY   : XVEGTYPE
 !
 USE MODD_DIAG_ISBA_n,      ONLY   : XAVG_QS, LSURF_VARS, XAVG_Z0EFF, LCOEF, XAVG_Z0, XAVG_Z0H
 USE MODD_DIAG_MISC_ISBA_n, ONLY   : XAVG_PSNG, XAVG_PSNV, XAVG_TWSNOW,LSURF_MISC_BUDGET
@@ -63,6 +66,7 @@ REAL, DIMENSION(KI),  INTENT(OUT)    :: PZ0EFF  ! effective roughness length (z0
 REAL, DIMENSION(KI),  INTENT(OUT)    :: PZ0     ! surface roughness length
 REAL, DIMENSION(KI),  INTENT(OUT)    :: PZ0H    ! surface roughness length for heat
 REAL, DIMENSION(KI),  INTENT(OUT)    :: PTWSNOW ! Snow total reservoir
+REAL, DIMENSION(KI),  INTENT(OUT)    :: PBARE   ! bare soil fraction on grid mesh     (-)
 !
 !
 !*       0.2   Declarations of local variables
@@ -101,6 +105,12 @@ ELSE
    PZ0      = XUNDEF      
    PZ0H     = XUNDEF
 ENDIF
+IF (SIZE(PBARE) > 0) THEN
+  PBARE = XVEGTYPE(:,NVT_NO)
+ELSE
+  PBARE = XUNDEF         
+ENDIF
+!
 IF (LHOOK) CALL DR_HOOK('GET_VAR_NATURE_N',1,ZHOOK_HANDLE)
 !
 !==============================================================================