From e4fe8d1723fea43c758ebc3cd237058046d35155 Mon Sep 17 00:00:00 2001 From: Gaelle Tanguy <gaelle.tanguy@meteo.fr> Date: Mon, 18 Jan 2016 09:15:35 +0000 Subject: [PATCH] Gaelle 18/01/2016 : correction ecoclimap 2 --- src/MNH/drag_veg.f90 | 4 +- src/MNH/ini_modeln.f90 | 23 ++++--- src/MNH/ini_radiations_ecmwf.f90 | 103 ++++++++++++++++++------------- src/MNH/mnhget_surf_paramn.f90 | 50 +++++++++------ src/SURFEX/get_surf_varn.F90 | 51 +++++++++++++-- src/SURFEX/get_var_naturen.F90 | 12 +++- 6 files changed, 164 insertions(+), 79 deletions(-) diff --git a/src/MNH/drag_veg.f90 b/src/MNH/drag_veg.f90 index 7de0e669b..3c08c3822 100644 --- a/src/MNH/drag_veg.f90 +++ b/src/MNH/drag_veg.f90 @@ -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(:,:) diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90 index ebb581f09..c6ab8f6ab 100644 --- a/src/MNH/ini_modeln.f90 +++ b/src/MNH/ini_modeln.f90 @@ -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(:,:,:,:) ! diff --git a/src/MNH/ini_radiations_ecmwf.f90 b/src/MNH/ini_radiations_ecmwf.f90 index 0d0a3db54..72a746e3f 100644 --- a/src/MNH/ini_radiations_ecmwf.f90 +++ b/src/MNH/ini_radiations_ecmwf.f90 @@ -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 ! diff --git a/src/MNH/mnhget_surf_paramn.f90 b/src/MNH/mnhget_surf_paramn.f90 index 1ac10532d..2c11b827c 100644 --- a/src/MNH/mnhget_surf_paramn.f90 +++ b/src/MNH/mnhget_surf_paramn.f90 @@ -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 @@ -15,14 +14,15 @@ 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 diff --git a/src/SURFEX/get_surf_varn.F90 b/src/SURFEX/get_surf_varn.F90 index 6cbc6f7b9..0fab88eb0 100644 --- a/src/SURFEX/get_surf_varn.F90 +++ b/src/SURFEX/get_surf_varn.F90 @@ -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 @@ -46,18 +46,20 @@ !! 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 ! !------------------------------------------------------------------------------- diff --git a/src/SURFEX/get_var_naturen.F90 b/src/SURFEX/get_var_naturen.F90 index 608c0ae12..e11be0a7f 100644 --- a/src/SURFEX/get_var_naturen.F90 +++ b/src/SURFEX/get_var_naturen.F90 @@ -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) ! !============================================================================== -- GitLab