From 139eb28569b5367d00262a8d39e8a29f023987bf Mon Sep 17 00:00:00 2001 From: Quentin Rodier <quentin.rodier@meteo.fr> Date: Wed, 27 Nov 2019 18:44:18 +0100 Subject: [PATCH] Christine 27/11/2019: correction in the drag formula and application to building in addition to tree --- src/MNH/default_desfmn.f90 | 10 +- src/MNH/drag_bld.f90 | 235 ++++++++++++ src/MNH/drag_veg.f90 | 578 +++++++++++++++--------------- src/MNH/goto_model_wrapper.f90 | 5 + src/MNH/ini_modeln.f90 | 3 +- src/MNH/mnhget_surf_paramn.f90 | 43 ++- src/MNH/modd_dragbldgn.f90 | 53 +++ src/MNH/modd_dragtreen.f90 | 64 ++++ src/MNH/modn_dragbldgn.f90 | 51 +++ src/MNH/modn_dragtreen.f90 | 61 ++++ src/MNH/phys_paramn.f90 | 34 +- src/MNH/read_exsegn.f90 | 14 +- src/SURFEX/allocate_physio.F90 | 7 +- src/SURFEX/convert_patch_isba.F90 | 3 +- src/SURFEX/get_surf_varn.F90 | 33 +- src/SURFEX/get_var_townn.F90 | 42 ++- src/SURFEX/get_vegn.F90 | 9 +- 17 files changed, 916 insertions(+), 329 deletions(-) create mode 100644 src/MNH/drag_bld.f90 create mode 100644 src/MNH/modd_dragbldgn.f90 create mode 100644 src/MNH/modd_dragtreen.f90 create mode 100644 src/MNH/modn_dragbldgn.f90 create mode 100644 src/MNH/modn_dragtreen.f90 diff --git a/src/MNH/default_desfmn.f90 b/src/MNH/default_desfmn.f90 index 38c7bba55..934b3447a 100644 --- a/src/MNH/default_desfmn.f90 +++ b/src/MNH/default_desfmn.f90 @@ -229,6 +229,7 @@ END MODULE MODI_DEFAULT_DESFM_n !! 01/2019 (R. Honnert) add reduction of the mass-flux surface closure with the resolution !! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes !! 05/2019 F.Brient add tracer emission from the top of the boundary-layer +!! 11/2019 C.Lac correction in the drag formula and application to building in addition to tree !! !------------------------------------------------------------------------------- ! @@ -272,7 +273,8 @@ USE MODD_SALT USE MODD_PASPOL USE MODD_CONDSAMP USE MODD_MEAN_FIELD -USE MODD_DRAGTREE +USE MODD_DRAGTREE_n +USE MODD_DRAGBLDG_n ! ! USE MODD_PARAM_LIMA, ONLY : LCOLD, LNUCL, LSEDI, LHHONI, LSNOW, LHAIL, LMEYERS,& @@ -544,6 +546,12 @@ VSIGQSAT = 0.02 LDRAGTREE = .FALSE. LDEPOTREE = .FALSE. XVDEPOTREE = 0.02 ! 2 cm/s +!------------------------------------------------------------------------------ +! +!* 10c. SET DEFAULT VALUES FOR MODD_DRAGB +! ---------------------------------- +! +LDRAGBLDG = .FALSE. ! !------------------------------------------------------------------------------- ! diff --git a/src/MNH/drag_bld.f90 b/src/MNH/drag_bld.f90 new file mode 100644 index 000000000..3d3e4cd3e --- /dev/null +++ b/src/MNH/drag_bld.f90 @@ -0,0 +1,235 @@ +!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 +!MNH_LIC for details. version 1. +! ####################### +MODULE MODI_DRAG_BLD + ! ####################### + ! + INTERFACE + ! + SUBROUTINE DRAG_BLD(PTSTEP, PUT, PVT, PTKET, PRHODJ, PZZ, PRUS, PRVS, PRTKES ) + ! + REAL, INTENT(IN) :: PTSTEP ! Time step + REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT, PVT ! variables + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKET ! at t + ! + REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry Density * Jacobian + REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) + ! + REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS ! Sources of Momentum + REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTKES ! Sources of Tke + ! + END SUBROUTINE DRAG_BLD + + END INTERFACE + +END MODULE MODI_DRAG_BLD +! +! ################################################################### +SUBROUTINE DRAG_BLD(PTSTEP, PUT, PVT, PTKET, PRHODJ, PZZ, PRUS, PRVS, PRTKES ) + ! ################################################################### + ! + !!**** *DRAG_BLD_n * - + !! + !! PURPOSE + !! ------- + ! + ! Drag force due to buildings + ! + !!** METHOD + !! ------ + !! + !! REFERENCE + !! --------- + !! + !! AUTHOR + !! ------ + !! R. Schoetter + !! + !! MODIFICATIONS + !! ------------- + !! Original 09/2019 + !!--------------------------------------------------------------- + ! + !* 0. DECLARATIONS + ! ------------ + ! + USE MODD_CONF + USE MODD_CST + USE MODD_DRAGBLDG_n + USE MODD_DYN + USE MODD_DYN_n + USE MODD_GROUND_PAR + USE MODD_PGDFIELDS + USE MODD_NSV + USE MODI_MNHGET_SURF_PARAM_n + USE MODI_SHUMAN + ! + IMPLICIT NONE + ! + !* 0.1 Declarations of dummy arguments : + ! + REAL, INTENT(IN) :: PTSTEP ! Time step + REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT, PVT ! variables + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKET ! at t + ! + REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry Density * Jacobian + REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) + ! + REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS ! Sources of Momentum + REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTKES ! Sources of Tke + ! + !* 0.2 Declarations of local variables : + ! + INTEGER :: IIU,IJU,IKU,IKV ! array size along the k direction + INTEGER :: JI, JJ, JK ! loop index + INTEGER :: INFO_ll + ! + REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: & + ZWORK1, ZWORK2, ZWORK3, ZUT_SCAL, ZVT_SCAL, & + ZUS, ZVS, ZTKES, ZTKET + REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: & + ZCDRAG, ZDENSITY + ! + REAL, DIMENSION(:,:), ALLOCATABLE :: ZH_BUILD_PGD + REAL, DIMENSION(:,:), ALLOCATABLE :: ZWALL_O_HOR_PGD + REAL, DIMENSION(:,:), ALLOCATABLE :: ZFRAC_TOWN_PGD + ! + REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2)) :: & + ZH_BLD,ZF_BLD ! Building height, frontal density + REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZT,ZEXN,ZLV,ZCPH + ! + !* 0.3 Initialization + ! + IIU = SIZE(PUT,1) + IJU = SIZE(PUT,2) + IKU = SIZE(PUT,3) + ! + ZUS (:,:,:) = 0.0 + ZVS (:,:,:) = 0.0 + ZTKES (:,:,:) = 0.0 + ! + ZH_BLD (:,:) = 0. + ZF_BLD (:,:) = 0. + ! + ZCDRAG (:,:,:) = 0. + ZDENSITY (:,:,:) = 0. + ! + ALLOCATE(ZFRAC_TOWN_PGD(IIU,IJU)) + ALLOCATE(ZH_BUILD_PGD(IIU,IJU)) + ALLOCATE(ZWALL_O_HOR_PGD(IIU,IJU)) + ! + ZFRAC_TOWN_PGD (:,:) = XUNDEF + ZH_BUILD_PGD (:,:) = XUNDEF + ZWALL_O_HOR_PGD (:,:) = XUNDEF + ! + CALL MNHGET_SURF_PARAM_n( PTOWN=ZFRAC_TOWN_PGD, & + PBUILD_HEIGHT=ZH_BUILD_PGD, & + PWALL_O_HOR=ZWALL_O_HOR_PGD ) + ! + ! FIXME: Some values of ZFRAC_TOWN_PGD are 999. This is a bit strange since the + ! TOWN fraction should be defined everywhere. + ! It is set to 0.0 provisionally + ! + WHERE(ZFRAC_TOWN_PGD(:,:).GT.1.0) ZFRAC_TOWN_PGD(:,:)=0.0 + ! + ! The values for wall density and building height are set to 0.0 where the Town fraction is 0.0 + ! For the wall density this would not be necessary since it will be multiplied by the town + ! fraction anyway. + ! + WHERE(ZFRAC_TOWN_PGD(:,:).EQ.0.0) + ZWALL_O_HOR_PGD(:,:) = 0.0 + ZH_BUILD_PGD(:,:) = 0.0 + ENDWHERE + ! + ! For buildings, the frontal wall area density is calculated [m^2(walls facing the wind)/m^2] + ! The division by PI means that cylindrical buildings are assumed (circle perimeter = PI*D, circle frontal area = D) + ! [m^2(walls facing the wind)/m^2]=[m^2(wall)/m^2(town)*m^2(town)/m^2/PI] + ! It will be assumed that the frontal wall area is equally distributed with height (all buildings same height) + ! + ZH_BLD(:,:) = ZH_BUILD_PGD(:,:) + ZF_BLD(:,:) = ZFRAC_TOWN_PGD(:,:)*ZWALL_O_HOR_PGD(:,:)/XPI + ! + DEALLOCATE(ZFRAC_TOWN_PGD) + DEALLOCATE(ZH_BUILD_PGD) + DEALLOCATE(ZWALL_O_HOR_PGD) + ! + !------------------------------------------------------------------------------- + ! + ! + !* 1. COMPUTES THE TRUE VELOCITY COMPONENTS + ! ------------------------------------- + ! + ZUT_SCAL(:,:,:) = MXF(PUT(:,:,:)) + ZVT_SCAL(:,:,:) = MYF(PVT(:,:,:)) + ZTKET(:,:,:) = PTKET(:,:,:) + !------------------------------------------------------------------------------- + ! + !* 1. Computations of wind tendency due to canopy drag + ! ------------------------------------------------ + ! + ! Ext = - Cdrag * u- * u- * Sv tree canopy drag + ! - u'w'(ground) * Sh horizontal surfaces (ground) + ! ------------------------------ + ! + DO JJ=2,(IJU-1) + DO JI=2,(IIU-1) + ! + ! Set density and drag coefficient for buildings + ! + IF (ZH_BLD(JI,JJ) /= 0) THEN + ! + DO JK=2,(IKU-1) + ! + IF ( (PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)) .LT. ZH_BLD(JI,JJ) ) THEN + ! + ! FIXME: Check literature values for the drag coefficient here + ! + ZCDRAG(JI,JJ,JK) = 0.2 + ! + ! A uniform distribution of building heights is assumed + ! + ZDENSITY(JI,JJ,JK) = ZF_BLD(JI,JJ) / ZH_BLD(JI,JJ) + ! + ENDIF + ! + ENDDO + ENDIF + ! + ENDDO + ENDDO + ! + !* 1.2 Drag force by wall surfaces + ! --------------------------- + ! + !* drag force by vertical surfaces + ! + ZUS(:,:,:) = PUT(:,:,:)/( 1.0 + MXM ( ZCDRAG(:,:,:) * ZDENSITY(:,:,:) & + * PTSTEP * SQRT(ZUT_SCAL(:,:,:)**2+ZVT_SCAL(:,:,:)**2) ) ) + ! + ZVS(:,:,:) = PVT(:,:,:)/( 1.0 + MYM ( ZCDRAG(:,:,:) * ZDENSITY(:,:,:) & + * PTSTEP * SQRT(ZUT_SCAL(:,:,:)**2+ZVT_SCAL(:,:,:)**2) ) ) + ! + PRUS(:,:,:) = PRUS(:,:,:) + (ZUS(:,:,:)-PUT(:,:,:)) * MXM(PRHODJ(:,:,:)) / PTSTEP + ! + PRVS(:,:,:) = PRVS(:,:,:) + (ZVS(:,:,:)-PVT(:,:,:)) * MYM(PRHODJ(:,:,:)) / PTSTEP + ! + !* 3. Computations of TKE tendency due to canopy drag + ! ------------------------------------------------ + !* 3.1 Creation of TKE by wake + ! ----------------------- + ! + ! from Kanda and Hino (1994) + ! + ! Ext = + Cd * u+^3 * Sv/Vair vertical surfaces or trees + ! + ! with Vair = Vair/Vtot * Vtot = (Vair/Vtot) * Stot * Dz + ! and Sv/Vair = (Sv/Stot) * Stot/Vair = (Sv/Stot) / (Vair/Vtot) / Dz + ! + ZTKES(:,:,:) = ZTKET(:,:,:) + & + PTSTEP * ZCDRAG(:,:,:) * ZDENSITY(:,:,:) * (SQRT( ZUT_SCAL(:,:,:)**2 + ZVT_SCAL(:,:,:)**2 ))**3 + ! + PRTKES(:,:,:) = PRTKES(:,:,:) + (ZTKES(:,:,:)-ZTKET(:,:,:))*PRHODJ(:,:,:)/PTSTEP + ! +END SUBROUTINE DRAG_BLD diff --git a/src/MNH/drag_veg.f90 b/src/MNH/drag_veg.f90 index ce157a154..ec75de6d9 100644 --- a/src/MNH/drag_veg.f90 +++ b/src/MNH/drag_veg.f90 @@ -3,303 +3,311 @@ !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. ! ####################### - MODULE MODI_DRAG_VEG + MODULE MODI_DRAG_VEG ! ####################### ! INTERFACE -SUBROUTINE DRAG_VEG(PTSTEP,PUT,PVT,PTKET,ODEPOTREE, PVDEPOTREE, & - HCLOUD,PPABST,PTHT,PRT,PSVT, & - PRHODJ,PZZ,PRUS, PRVS, PRTKES, & - PTHS,PRRS,PSVS) -! -REAL, INTENT(IN) :: PTSTEP ! Time step -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT, PVT ! variables -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKET ! at t -LOGICAL, INTENT(IN) :: ODEPOTREE ! Droplet deposition on tree -REAL, INTENT(IN) :: PVDEPOTREE! Velocity deposition on tree -CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Kind of microphysical scheme -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! at t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! at t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! at t -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry Density * Jacobian -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) -! - -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS ! Sources of Momentum -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTKES ! Sources of Tke -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS -! -! - -END SUBROUTINE DRAG_VEG + SUBROUTINE DRAG_VEG(PTSTEP,PUT,PVT,PTKET,ODEPOTREE, PVDEPOTREE, & + HCLOUD,PPABST,PTHT,PRT,PSVT, & + PRHODJ,PZZ,PRUS, PRVS, PRTKES, & + PTHS,PRRS,PSVS) +! + REAL, INTENT(IN) :: PTSTEP ! Time step + REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT, PVT ! variables + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKET ! at t + LOGICAL, INTENT(IN) :: ODEPOTREE ! Droplet deposition on tree + REAL, INTENT(IN) :: PVDEPOTREE! Velocity deposition on tree + CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Kind of microphysical scheme + REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! at t + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! at t + REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! at t + REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! at t + ! + REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry Density * Jacobian + REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) + ! + REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS ! Sources of Momentum + REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTKES ! Sources of Tke + REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS + REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS + REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS + ! + END SUBROUTINE DRAG_VEG -END INTERFACE + END INTERFACE END MODULE MODI_DRAG_VEG ! ! ################################################################### SUBROUTINE DRAG_VEG(PTSTEP,PUT,PVT,PTKET,ODEPOTREE, PVDEPOTREE, & - HCLOUD,PPABST,PTHT,PRT,PSVT, & - PRHODJ,PZZ,PRUS, PRVS, PRTKES, & - PTHS,PRRS,PSVS) -! ################################################################### -! -!!**** *DRAG_VEG_n * - -!! -!! PURPOSE -!! ------- -! -!!** METHOD -!! ------ -!! -!! REFERENCE -!! --------- -!! -!! -!! AUTHOR -!! ------ -!! P. Aumond -!! -!! MODIFICATIONS -!! ------------- -!! Original 07/2009 -!! C.Lac 07/2011 : Add budgets -!! S. Donier 06/2015 : bug surface aerosols -!! C.Lac 07/2016 : Add droplet deposition -!! C.Lac 10/2017 : Correction on deposition -!!--------------------------------------------------------------- -! -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CONF -USE MODD_CST -USE MODD_DYN -USE MODD_DYN_n -USE MODD_VEG_n -USE MODD_BUDGET -USE MODD_PARAM_C2R2 -USE MODD_NSV + HCLOUD,PPABST,PTHT,PRT,PSVT, & + PRHODJ,PZZ,PRUS, PRVS, PRTKES, & + PTHS,PRRS,PSVS) + ! ################################################################### + ! + !!**** *DRAG_VEG_n * - + !! + !! PURPOSE + !! ------- + ! + !!** METHOD + !! ------ + !! + !! REFERENCE + !! --------- + !! + !! + !! AUTHOR + !! ------ + !! P. Aumond + !! + !! MODIFICATIONS + !! ------------- + !! Original 07/2009 + !! C.Lac 07/2011 : Add budgets + !! S. Donier 06/2015 : bug surface aerosols + !! C.Lac 07/2016 : Add droplet deposition + !! C.Lac 10/2017 : Correction on deposition + !! C.Lac 11/2019 : Correction in the drag formula and application to building in addition to tree + !!--------------------------------------------------------------- + ! + ! + !* 0. DECLARATIONS + ! ------------ + ! + USE MODD_CONF + USE MODD_CST + USE MODD_DYN + USE MODD_DYN_n + USE MODD_VEG_n + USE MODD_BUDGET + USE MODD_PARAM_C2R2 + USE MODD_NSV -! -USE MODI_SHUMAN -USE MODD_PGDFIELDS -USE MODD_GROUND_PAR -USE MODI_MNHGET_SURF_PARAM_n -USE MODI_BUDGET + ! + USE MODI_SHUMAN + USE MODD_PGDFIELDS + USE MODD_GROUND_PAR + USE MODI_MNHGET_SURF_PARAM_n + USE MODI_BUDGET -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -REAL, INTENT(IN) :: PTSTEP ! Time step -REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT, PVT ! variables -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKET ! at t -LOGICAL, INTENT(IN) :: ODEPOTREE ! Droplet deposition on tree -REAL, INTENT(IN) :: PVDEPOTREE! Velocity deposition on tree -CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Kind of microphysical scheme -REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! at t -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! at t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! at t -REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! at t -! -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry Density * Jacobian -REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) -! - -! -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS ! Sources of Momentum -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTKES ! Sources of Tke -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS -REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS -! -! -!* 0.2 Declarations of local variables : -! -INTEGER :: IIU,IJU,IKU,IKV ! array size along the k direction -INTEGER :: JI, JJ, JK ! loop index -! -! -REAL, DIMENSION(:,:), ALLOCATABLE :: ZH_TREE_PGD ! surface cover types -REAL, DIMENSION(:,:), ALLOCATABLE :: ZLAI_PGD ! surface cover types -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: & - ZWORK1, ZWORK2, ZWORK3, ZUT, ZVT, & - ZUS, ZVS, ZTKES, ZTKET -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: & - ZCDRAG, ZDENSITY -REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2)) :: & - ZVH,ZLAI ! LAI, Vegetation height -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZT,ZEXN,ZLV,ZCPH -LOGICAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) & - :: GDEP -REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZWDEPR,ZWDEPS - -! -! -IIU = SIZE(PUT,1) -IJU = SIZE(PUT,2) -IKU = SIZE(PUT,3) -! -!* 0.3 Initialisation de kelkes variables -! -ZVH(:,:)=0. -ZLAI(:,:)=0. -ZCDRAG(:,:,:)=0. -ZDENSITY(:,:,:)=0. -! -ALLOCATE(ZH_TREE_PGD(IIU,IJU)) -ALLOCATE(ZLAI_PGD(IIU,IJU)) -! -CALL MNHGET_SURF_PARAM_n(PH_TREE=ZH_TREE_PGD,PLAI_TREE=ZLAI_PGD) -! -ZVH(:,:)=ZH_TREE_PGD(:,:) -ZLAI(:,:)=ZLAI_PGD(:,:) -! -DEALLOCATE(ZH_TREE_PGD) -DEALLOCATE(ZLAI_PGD) -! -!------------------------------------------------------------------------------- -! -! -!* 1. COMPUTES THE TRUE VELOCITY COMPONENTS -! ------------------------------------- -! -ZUT(:,:,:) = PUT(:,:,:) -ZVT(:,:,:) = PVT(:,:,:) -ZTKET(:,:,:) = PTKET(:,:,:) -!------------------------------------------------------------------------------- -! -!* 1. Computations of wind tendency due to canopy drag -! ------------------------------------------------ -! -! -! -! Ext = - Cdrag * u- * u- * Sv tree canopy drag -! - u'w'(ground) * Sh horizontal surfaces (ground) -! -!* 1.1 Drag coefficient by vegetation (Patton et al 2001) -! ------------------------------ -! -GDEP(:,:,:) = .FALSE. -DO JJ=2,(IJU-1) - DO JI=2,(IIU-1) - IF (ZVH(JI,JJ) /= 0) THEN - DO JK=2,(IKU-1) - IF ((ZVH(JI,JJ)+PZZ(JI,JJ,2))<PZZ(JI,JJ,JK)) EXIT - IF ((HCLOUD=='C2R2') .OR. (HCLOUD=='KHKO')) THEN - IF ((PRRS(JI,JJ,JK,2) >0.) .AND. (PSVS(JI,JJ,JK,NSV_C2R2BEG+1) >0.)) & - GDEP(JI,JJ,JK) = .TRUE. - ELSE IF (HCLOUD /= 'NONE' .AND. HCLOUD /= 'REVE') THEN - IF (PRRS(JI,JJ,JK,2) >0.) GDEP(JI,JJ,JK) = .TRUE. - END IF - ZCDRAG(JI,JJ,JK) = 0.2 !0.075 - ZDENSITY(JI,JJ,JK) = MAX((4 * (ZLAI(JI,JJ) *& - (PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)) *& - (PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)) *& - (ZVH(JI,JJ)-(PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)))/& - ZVH(JI,JJ)**3)-& - (0.30*((ZLAI(JI,JJ) *& - (PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)) *& - (PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)) *& - (PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)) /& - (ZVH(JI,JJ)**3))-ZLAI(JI,JJ))))/& - ZVH(JI,JJ), 0.) - - - END DO - END IF - END DO -END DO -! To exclude the first vertical level already dealt in rain_ice or rain_c2r2_khko -GDEP(:,:,2) = .FALSE. -! -!* 1.2 Drag force by wall surfaces -! --------------------------- -! -!* drag force by vertical surfaces -! -ZUS(:,:,:)= ZUT(:,:,:)/(1 + ZCDRAG(:,:,:)* ZDENSITY(:,:,:)*PTSTEP & - *SQRT(ZUT(:,:,:)**2+ZVT(:,:,:)**2)) -! -ZVS(:,:,:)= ZVT(:,:,:)/(1 + ZCDRAG(:,:,:)* ZDENSITY(:,:,:)*PTSTEP & - *SQRT(ZUT(:,:,:)**2+ZVT(:,:,:)**2)) -! -PRUS(:,:,:)=PRUS(:,:,:)+((ZUS(:,:,:)-ZUT(:,:,:))*PRHODJ(:,:,:))/PTSTEP -! -PRVS(:,:,:)=PRVS(:,:,:)+((ZVS(:,:,:)-ZVT(:,:,:))*PRHODJ(:,:,:))/PTSTEP -! -IF (ODEPOTREE) THEN - ZEXN(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) - ZT(:,:,:)= PTHT(:,:,:)*ZEXN(:,:,:) - ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZT(:,:,:)-XTT) - ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1) - ZWDEPR(:,:,:)= 0. - ZWDEPS(:,:,:)= 0. - WHERE (GDEP) - ZWDEPR(:,:,:)= PVDEPOTREE * PRT(:,:,:,2) * PRHODJ(:,:,:) - END WHERE - IF ((HCLOUD=='C2R2') .OR. (HCLOUD=='KHKO') .OR. (HCLOUD=='LIMA')) THEN - WHERE (GDEP) - ZWDEPS(:,:,:)= PVDEPOTREE * PSVT(:,:,:,NSV_C2R2BEG+1) * PRHODJ(:,:,:) - END WHERE - END IF + ! + IMPLICIT NONE + ! + !* 0.1 Declarations of dummy arguments : + ! + REAL, INTENT(IN) :: PTSTEP ! Time step + REAL, DIMENSION(:,:,:), INTENT(IN) :: PUT, PVT ! variables + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKET ! at t + LOGICAL, INTENT(IN) :: ODEPOTREE ! Droplet deposition on tree + REAL, INTENT(IN) :: PVDEPOTREE! Velocity deposition on tree + CHARACTER (LEN=4), INTENT(IN) :: HCLOUD ! Kind of microphysical scheme + REAL, DIMENSION(:,:,:), INTENT(IN) :: PPABST ! at t + REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHT ! at t + REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRT ! at t + REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT ! at t + ! + REAL, DIMENSION(:,:,:), INTENT(IN) :: PRHODJ ! dry Density * Jacobian + REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ ! Height (z) + ! + REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRUS, PRVS ! Sources of Momentum + REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PRTKES ! Sources of Tke + REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PRRS + REAL, DIMENSION(:,:,:,:), INTENT(INOUT) :: PSVS + REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PTHS + ! + !* 0.2 Declarations of local variables : + ! + INTEGER :: IIU,IJU,IKU,IKV ! array size along the k direction + INTEGER :: JI, JJ, JK ! loop index + ! + REAL, DIMENSION(:,:), ALLOCATABLE :: ZH_TREE_PGD ! surface cover types + REAL, DIMENSION(:,:), ALLOCATABLE :: ZLAI_PGD ! surface cover types + REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: & + ZWORK1, ZWORK2, ZWORK3, ZUT_SCAL, ZVT_SCAL, & + ZUS, ZVS, ZTKES, ZTKET + REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) :: & + ZCDRAG, ZDENSITY + ! + REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2)) :: & + ZH,ZLAI ! LAI, Vegetation height + REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZT,ZEXN,ZLV,ZCPH + LOGICAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)) & + :: GDEP + REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZWDEPR,ZWDEPS + ! + !* 0.3 Initialisation de kelkes variables + ! + IIU = SIZE(PUT,1) + IJU = SIZE(PUT,2) + IKU = SIZE(PUT,3) + ! + ZUS (:,:,:) = 0.0 + ZVS (:,:,:) = 0.0 + ZTKES (:,:,:) = 0.0 + ! + ZH (:,:) = 0. + ZLAI (:,:) = 0. + ! + ZCDRAG (:,:,:) = 0. + ZDENSITY (:,:,:) = 0. + ! + ALLOCATE(ZH_TREE_PGD(IIU,IJU)) + ALLOCATE(ZLAI_PGD(IIU,IJU)) + ! + ZH_TREE_PGD (:,:) = XUNDEF + ZLAI_PGD (:,:) = XUNDEF + ! + CALL MNHGET_SURF_PARAM_n( PH_TREE = ZH_TREE_PGD, PLAI_TREE = ZLAI_PGD ) + ! + ZH (:,:) = ZH_TREE_PGD(:,:) + ZLAI(:,:) = ZLAI_PGD(:,:) + ! + WHERE ( ZH (:,:).GT.998.0 ) ZH (:,:) = 0.0 + WHERE ( ZLAI (:,:).GT.998.0 ) ZLAI (:,:) = 0.0 + ! + DEALLOCATE(ZH_TREE_PGD) + DEALLOCATE(ZLAI_PGD) + ! + !------------------------------------------------------------------------------- + ! + ! + !* 1. COMPUTES THE TRUE VELOCITY COMPONENTS + ! ------------------------------------- + ! + ZUT_SCAL(:,:,:) = MXF(PUT(:,:,:)) + ZVT_SCAL(:,:,:) = MYF(PVT(:,:,:)) + ZTKET(:,:,:) = PTKET(:,:,:) + !------------------------------------------------------------------------------- + ! + !* 1. Computations of wind tendency due to canopy drag + ! ------------------------------------------------ + ! + ! + ! + ! Ext = - Cdrag * u- * u- * Sv tree canopy drag + ! - u'w'(ground) * Sh horizontal surfaces (ground) + ! + !* 1.1 Drag coefficient by vegetation (Patton et al 2001) + ! ------------------------------ + ! + GDEP(:,:,:) = .FALSE. + ! DO JJ=2,(IJU-1) - DO JI=2,(IIU-1) - DO JK=2,(IKU-2) - IF (GDEP(JI,JJ,JK)) THEN - PRRS(JI,JJ,JK,2) = PRRS(JI,JJ,JK,2) + (ZWDEPR(JI,JJ,JK+1)-ZWDEPR(JI,JJ,JK))/ & - (PZZ(JI,JJ,JK+1)-PZZ(JI,JJ,JK)) - IF ((HCLOUD=='C2R2') .OR. (HCLOUD=='KHKO').OR. (HCLOUD=='LIMA')) THEN - PSVS(JI,JJ,JK,NSV_C2R2BEG+1) = PSVS(JI,JJ,JK,NSV_C2R2BEG+1) + & - (ZWDEPS(JI,JJ,JK+1)-ZWDEPS(JI,JJ,JK))/(PZZ(JI,JJ,JK+1)-PZZ(JI,JJ,JK)) - END IF - END IF + DO JI=2,(IIU-1) + ! + ! Set density and drag coefficient for vegetation + ! + IF (ZH(JI,JJ) /= 0) THEN + ! + DO JK=2,(IKU-1) + ! + IF ( (PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)) .LT. ZH(JI,JJ) ) THEN + ! + IF ((HCLOUD=='C2R2') .OR. (HCLOUD=='KHKO')) THEN + IF ((PRRS(JI,JJ,JK,2) >0.) .AND. (PSVS(JI,JJ,JK,NSV_C2R2BEG+1) >0.)) & + GDEP(JI,JJ,JK) = .TRUE. + ELSE IF (HCLOUD /= 'NONE' .AND. HCLOUD /= 'REVE') THEN + IF (PRRS(JI,JJ,JK,2) >0.) GDEP(JI,JJ,JK) = .TRUE. + ENDIF + ! + ZCDRAG(JI,JJ,JK) = 0.2 !0.075 + ZDENSITY(JI,JJ,JK) = MAX((4 * (ZLAI(JI,JJ) *& + (PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)) *& + (PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)) *& + (ZH(JI,JJ)-(PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)))/& + ZH(JI,JJ)**3)-& + (0.30*((ZLAI(JI,JJ) *& + (PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)) *& + (PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)) *& + (PZZ(JI,JJ,JK)-PZZ(JI,JJ,2)) /& + (ZH(JI,JJ)**3))-ZLAI(JI,JJ))))/& + ZH(JI,JJ), 0.) + ! + ENDIF + ! + ENDDO + ENDIF + ! + ENDDO + ENDDO + ! + ! To exclude the first vertical level already dealt in rain_ice or rain_c2r2_khko + GDEP(:,:,2) = .FALSE. + ! + !* 1.2 Drag force by wall surfaces + ! --------------------------- + ! + !* drag force by vertical surfaces + ! + ZUS(:,:,:) = PUT(:,:,:)/( 1.0 + MXM ( ZCDRAG(:,:,:) * ZDENSITY(:,:,:) & + * PTSTEP * SQRT(ZUT_SCAL(:,:,:)**2+ZVT_SCAL(:,:,:)**2) ) ) + ! + ZVS(:,:,:) = PVT(:,:,:)/( 1.0 + MYM ( ZCDRAG(:,:,:) * ZDENSITY(:,:,:) & + * PTSTEP * SQRT(ZUT_SCAL(:,:,:)**2+ZVT_SCAL(:,:,:)**2) ) ) + ! + PRUS(:,:,:) = PRUS(:,:,:) + (ZUS(:,:,:)-PUT(:,:,:)) * MXM(PRHODJ(:,:,:)) / PTSTEP + ! + PRVS(:,:,:) = PRVS(:,:,:) + (ZVS(:,:,:)-PVT(:,:,:)) * MYM(PRHODJ(:,:,:)) / PTSTEP + ! + IF (ODEPOTREE) THEN + ZEXN(:,:,:)= (PPABST(:,:,:)/XP00)**(XRD/XCPD) + ZT(:,:,:)= PTHT(:,:,:)*ZEXN(:,:,:) + ZLV(:,:,:)=XLVTT +(XCPV-XCL) *(ZT(:,:,:)-XTT) + ZCPH(:,:,:)=XCPD +XCPV*PRT(:,:,:,1) + ZWDEPR(:,:,:)= 0. + ZWDEPS(:,:,:)= 0. + WHERE (GDEP) + ZWDEPR(:,:,:)= PVDEPOTREE * PRT(:,:,:,2) * PRHODJ(:,:,:) + END WHERE + IF ((HCLOUD=='C2R2') .OR. (HCLOUD=='KHKO') .OR. (HCLOUD=='LIMA')) THEN + WHERE (GDEP) + ZWDEPS(:,:,:)= PVDEPOTREE * PSVT(:,:,:,NSV_C2R2BEG+1) * PRHODJ(:,:,:) + END WHERE + END IF + DO JJ=2,(IJU-1) + DO JI=2,(IIU-1) + DO JK=2,(IKU-2) + IF (GDEP(JI,JJ,JK)) THEN + PRRS(JI,JJ,JK,2) = PRRS(JI,JJ,JK,2) + (ZWDEPR(JI,JJ,JK+1)-ZWDEPR(JI,JJ,JK))/ & + (PZZ(JI,JJ,JK+1)-PZZ(JI,JJ,JK)) + IF ((HCLOUD=='C2R2') .OR. (HCLOUD=='KHKO').OR. (HCLOUD=='LIMA')) THEN + PSVS(JI,JJ,JK,NSV_C2R2BEG+1) = PSVS(JI,JJ,JK,NSV_C2R2BEG+1) + & + (ZWDEPS(JI,JJ,JK+1)-ZWDEPS(JI,JJ,JK))/(PZZ(JI,JJ,JK+1)-PZZ(JI,JJ,JK)) + END IF + END IF + END DO + END DO END DO - END DO - END DO -! -! -END IF -! -IF (LBUDGET_U) CALL BUDGET (PRUS,1,'DRAG_BU_RU') -IF (LBUDGET_V) CALL BUDGET (PRVS,2,'DRAG_BU_RV') -IF (LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2),7,'DEPOTR_BU_RRC') -IF (LBUDGET_SV) CALL BUDGET (PSVS(:,:,:,NSV_C2R2BEG+1),14+(NSV_C2R2BEG-1),'DEPOTR_BU_RSV') -! -! -!* 3. Computations of TKE tendency due to canopy drag -! ------------------------------------------------ - -!* 3.1 Creation of TKE by wake -! ----------------------- -! -! from Kanda and Hino (1994) -! -! Ext = + Cd * u+^3 * Sv/Vair vertical surfaces or trees -! Ext = - Cd * e * u * Sv trees Destruction of TKE due to -! small-scale motions forced by leaves from Kanda and Hino (1994) -! -! with Vair = Vair/Vtot * Vtot = (Vair/Vtot) * Stot * Dz -! and Sv/Vair = (Sv/Stot) * Stot/Vair = (Sv/Stot) / (Vair/Vtot) / Dz -! -!ZTKES(:,:,:)= (ZTKET(:,:,:) + (ZCDRAG(:,:,:)* ZDENSITY(:,:,:) & -! *(SQRT(ZUT(:,:,:)**2+ZVT(:,:,:)**2))**3)) /& -! (1.+(2.*ZCDRAG(:,:,:)* ZDENSITY(:,:,:)*SQRT(ZUT(:,:,:)**2+ZVT(:,:,:)**2))) -ZTKES(:,:,:)= (ZTKET(:,:,:) + (ZCDRAG(:,:,:)* ZDENSITY(:,:,:) & - *(SQRT(ZUT(:,:,:)**2+ZVT(:,:,:)**2))**3))*PTSTEP /& - (1.+PTSTEP*ZCDRAG(:,:,:)* ZDENSITY(:,:,:)*SQRT(ZUT(:,:,:)**2+ZVT(:,:,:)**2)) -! -PRTKES(:,:,:)=PRTKES(:,:,:)+((ZTKES(:,:,:)-ZTKET(:,:,:))*PRHODJ(:,:,:)/PTSTEP) -! -IF (LBUDGET_TKE) CALL BUDGET (PRTKES(:,:,:),5,'DRAG_BU_RTKE') -! + ! + END IF + ! + IF (LBUDGET_U) CALL BUDGET (PRUS,1,'DRAG_BU_RU') + IF (LBUDGET_V) CALL BUDGET (PRVS,2,'DRAG_BU_RV') + IF (LBUDGET_RC) CALL BUDGET (PRRS(:,:,:,2),7,'DEPOTR_BU_RRC') + IF (LBUDGET_SV) CALL BUDGET (PSVS(:,:,:,NSV_C2R2BEG+1),14+(NSV_C2R2BEG-1),'DEPOTR_BU_RSV') + ! + !* 3. Computations of TKE tendency due to canopy drag + ! ------------------------------------------------ + !* 3.1 Creation of TKE by wake + ! ----------------------- + ! + ! from Kanda and Hino (1994) + ! + ! Ext = + Cd * u+^3 * Sv/Vair vertical surfaces or trees + ! Ext = - Cd * e * u * Sv trees Destruction of TKE due to + ! small-scale motions forced by leaves from Kanda and Hino (1994) + ! + ! with Vair = Vair/Vtot * Vtot = (Vair/Vtot) * Stot * Dz + ! and Sv/Vair = (Sv/Stot) * Stot/Vair = (Sv/Stot) / (Vair/Vtot) / Dz + ! + ZTKES(:,:,:)= ( ZTKET(:,:,:) + PTSTEP * ZCDRAG(:,:,:) * ZDENSITY(:,:,:) & + * (SQRT( ZUT_SCAL(:,:,:)**2 + ZVT_SCAL(:,:,:)**2 ))**3 ) / & + ( 1. + PTSTEP * ZCDRAG(:,:,:) * ZDENSITY(:,:,:) * SQRT(ZUT_SCAL(:,:,:)**2+ZVT_SCAL(:,:,:)**2)) + ! + PRTKES(:,:,:) = PRTKES(:,:,:) + (ZTKES(:,:,:)-ZTKET(:,:,:))*PRHODJ(:,:,:)/PTSTEP + ! + IF (LBUDGET_TKE) CALL BUDGET (PRTKES(:,:,:),5,'DRAG_BU_RTKE') + ! END SUBROUTINE DRAG_VEG diff --git a/src/MNH/goto_model_wrapper.f90 b/src/MNH/goto_model_wrapper.f90 index 1d3e057e3..e58e193dc 100644 --- a/src/MNH/goto_model_wrapper.f90 +++ b/src/MNH/goto_model_wrapper.f90 @@ -15,6 +15,7 @@ ! 02/2018 Q.Libois ECRAD !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O ! 2017 V.Vionnet blow snow +! 11/2019 C.Lac correction in the drag formula and application to building in addition to tree !----------------------------------------------------------------- MODULE MODI_GOTO_MODEL_WRAPPER @@ -42,6 +43,8 @@ USE MODD_CONF_n USE MODD_CURVCOR_n !USE MODD_DEEP_CONVECTION_n USE MODD_DIM_n +USE MODD_DRAGTREE_n +USE MODD_DRAGBLDG_n USE MODD_DUMMY_GR_FIELD_n USE MODD_DYN_n USE MODD_DYNZD_n @@ -151,6 +154,8 @@ CALL CONF_GOTO_MODEL(KFROM, KTO) CALL CURVCOR_GOTO_MODEL(KFROM, KTO) !CALL DEEP_CONVECTION_GOTO_MODEL(KFROM, KTO) CALL DIM_GOTO_MODEL(KFROM, KTO) +CALL DRAGTREE_GOTO_MODEL(KFROM, KTO) +CALL DRAGBLDG_GOTO_MODEL(KFROM, KTO) CALL DUMMY_GR_FIELD_GOTO_MODEL(KFROM, KTO) CALL DYN_GOTO_MODEL(KFROM, KTO) CALL DYNZD_GOTO_MODEL(KFROM,KTO) diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90 index 74312b192..63ef283bf 100644 --- a/src/MNH/ini_modeln.f90 +++ b/src/MNH/ini_modeln.f90 @@ -284,6 +284,7 @@ END MODULE MODI_INI_MODEL_n !! 02/2019 C.Lac add rain fraction as an output field !! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes ! P. Wautelet 14/03/2019: correct ZWS when variable not present in file (set to XZWS_DEFAULT) +! 11/2019 C.Lac correction in the drag formula and application to building in addition to tree !--------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -317,7 +318,7 @@ USE MODD_TIME USE MODD_TURB_CLOUD, ONLY: NMODEL_CLOUD, CTURBLEN_CLOUD,XCEI USE MODD_NESTING USE MODD_PASPOL -USE MODD_DRAGTREE +USE MODD_DRAGTREE_n USE MODD_METRICS_n USE MODD_DYN_n USE MODD_DYNZD_n diff --git a/src/MNH/mnhget_surf_paramn.f90 b/src/MNH/mnhget_surf_paramn.f90 index 238c9d4ae..dbe76b4f3 100644 --- a/src/MNH/mnhget_surf_paramn.f90 +++ b/src/MNH/mnhget_surf_paramn.f90 @@ -14,15 +14,19 @@ INTERFACE SUBROUTINE MNHGET_SURF_PARAM_n(PCOVER,PSEA,KCOVER,PRN,PH,PLE,PLEI,PGFLUX, & PT2M,PQ2M,PHU2M,PZON10M,PMER10M,PZS,PTOWN,& - PBARE, PLAI_TREE, PH_TREE ) + PBARE, PLAI_TREE, PH_TREE, PWALL_O_HOR, & + PBUILD_HEIGHT,PNATURE ) ! REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PCOVER ! cover types REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PSEA ! sea fraction REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PTOWN ! town fraction +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PNATURE ! nature fraction INTEGER, INTENT(OUT), OPTIONAL :: KCOVER ! number of cover types 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(OUT), OPTIONAL :: PLAI_TREE ! Tree leaf area index [m^2(leaf)/m^2(nature)] +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PH_TREE ! Tree height [m] +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PWALL_O_HOR ! Facade area density [m^2(fac.)/m^2(town)] +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PBUILD_HEIGHT ! Building height [m] 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 +47,8 @@ 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,& - PBARE, PLAI_TREE, PH_TREE ) + PBARE, PLAI_TREE, PH_TREE, PWALL_O_HOR, & + PBUILD_HEIGHT,PNATURE ) ! ######################################## ! !!**** *MNHGET_SURF_PARAM_n* - gets some surface fields on MESONH grid @@ -79,6 +84,7 @@ END MODULE MODI_MNHGET_SURF_PARAM_n !! S. Donier 06/2015 : bug surface aerosols !! 06/2016 (G.Delautier) phasage surfex 8 !! 01/2018 (G.Delautier) SURFEX 8.1 +!! 11/2019 C.Lac correction in the drag formula and application to building in addition to tree !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -104,10 +110,13 @@ IMPLICIT NONE REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL :: PCOVER ! cover types REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PSEA ! sea fraction REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PTOWN ! town fraction +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PNATURE ! nature fraction INTEGER, INTENT(OUT), OPTIONAL :: KCOVER ! number of cover types 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(OUT), OPTIONAL :: PWALL_O_HOR ! Facade area density [m^2(fac.)/m^2(town)] +REAL, DIMENSION(:,:), INTENT(OUT), OPTIONAL :: PBUILD_HEIGHT ! Building height [m] 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) @@ -140,6 +149,8 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZNATURE! nature fraction REAL, DIMENSION(:), ALLOCATABLE :: ZTOWN ! town fraction REAL, DIMENSION(:), ALLOCATABLE :: ZVH REAL, DIMENSION(:), ALLOCATABLE :: ZLAI +REAL, DIMENSION(:), ALLOCATABLE :: ZWALL_O_HOR ! Facade surface density [m^2(fac.)/m^2(town)] +REAL, DIMENSION(:), ALLOCATABLE :: ZBUILD_HEIGHT ! Building height [m] REAL, DIMENSION(:), ALLOCATABLE :: ZBARE ! bare soil fraction REAL, DIMENSION(:), ALLOCATABLE :: ZZS ! orography REAL, DIMENSION(:), ALLOCATABLE :: ZRN ! net radiation at surface (W/m2) @@ -173,8 +184,9 @@ IF (PRESENT(PCOVER)) THEN DEALLOCATE(ZCOVER) END IF ! -IF (PRESENT(PSEA) .OR. PRESENT(PTOWN) .OR. & - PRESENT(PBARE) .OR. PRESENT(PLAI_TREE) .OR. PRESENT(PH_TREE)) THEN +IF (PRESENT(PSEA) .OR. PRESENT(PTOWN) .OR. PRESENT(PNATURE) .OR. & + PRESENT(PBARE) .OR. PRESENT(PLAI_TREE) .OR. PRESENT(PH_TREE) .OR. & + PRESENT(PWALL_O_HOR) .OR. PRESENT(PBUILD_HEIGHT) ) THEN ALLOCATE(ZSEA ( ILU )) ALLOCATE(ZWATER ( ILU )) ALLOCATE(ZNATURE( ILU )) @@ -186,6 +198,9 @@ IF (PRESENT(PSEA) .OR. PRESENT(PTOWN) .OR. & IF (PRESENT(PTOWN)) THEN CALL REMOVE_HALO(ZTOWN,PTOWN) END IF + IF (PRESENT(PNATURE)) THEN + CALL REMOVE_HALO(ZNATURE,PNATURE) + END IF END IF ! IF (PRESENT(PBARE)) THEN @@ -251,6 +266,22 @@ IF (PRESENT(PH_TREE) .OR.PRESENT(PLAI_TREE)) THEN DEALLOCATE(ZLAI) END IF ! +IF (PRESENT(PWALL_O_HOR) .OR. PRESENT(PBUILD_HEIGHT)) THEN + PBUILD_HEIGHT(:,:) = XUNDEF + PWALL_O_HOR(:,:) = XUNDEF + ALLOCATE(ZBUILD_HEIGHT ( ILU )) + ALLOCATE(ZWALL_O_HOR ( ILU )) + CALL GET_SURF_VAR_n(YSURF_CUR%FM,YSURF_CUR%IM,YSURF_CUR%SM,YSURF_CUR%TM, & + YSURF_CUR%WM,YSURF_CUR%DUO,YSURF_CUR%DU,YSURF_CUR%UG,& + YSURF_CUR%U,YSURF_CUR%USS,& + 'MESONH',ILU,1,PTOWN=ZTOWN, & + PWALL_O_HOR=ZWALL_O_HOR,PBUILD_HEIGHT=ZBUILD_HEIGHT ) + CALL REMOVE_HALO(ZBUILD_HEIGHT,PBUILD_HEIGHT) + CALL REMOVE_HALO(ZWALL_O_HOR,PWALL_O_HOR) + DEALLOCATE(ZBUILD_HEIGHT) + DEALLOCATE(ZWALL_O_HOR) +END IF +! IF (ALLOCATED(ZSEA)) THEN DEALLOCATE(ZSEA ) DEALLOCATE(ZWATER ) diff --git a/src/MNH/modd_dragbldgn.f90 b/src/MNH/modd_dragbldgn.f90 new file mode 100644 index 000000000..3bcd2e590 --- /dev/null +++ b/src/MNH/modd_dragbldgn.f90 @@ -0,0 +1,53 @@ +!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 +!MNH_LIC for details. version 1. +!! +!! ##################### + MODULE MODD_DRAGBLDG_n +!! ##################### +!! +!!*** *MODD_DRAGBLDG* +!! +!! PURPOSE +!! ------- +! Declaration to take into account building drag in Meso-NH instead of SURFEX. +!! +!!** AUTHOR +!! ------ +!! R.Schoetter *CNRM* +! +!! MODIFICATIONS +!! ------------- +!! Original 09/2019 +!----------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ----------------- +! +USE MODD_PARAMETERS, ONLY: JPMODELMAX +! +IMPLICIT NONE +! +TYPE DRAGBLDG_t + ! + LOGICAL :: LDRAGBLDG ! flag used to take into account building drag in + ! ! the atmospheric model instead of SURFEX. + ! +END TYPE DRAGBLDG_t +! +TYPE(DRAGBLDG_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: DRAGBLDG_MODEL +! +LOGICAL, POINTER :: LDRAGBLDG=>NULL() +! +CONTAINS +! +SUBROUTINE DRAGBLDG_GOTO_MODEL(KFROM, KTO) + ! + INTEGER, INTENT(IN) :: KFROM, KTO + ! + LDRAGBLDG=>DRAGBLDG_MODEL(KTO)%LDRAGBLDG + ! +END SUBROUTINE DRAGBLDG_GOTO_MODEL +! +END MODULE MODD_DRAGBLDG_n diff --git a/src/MNH/modd_dragtreen.f90 b/src/MNH/modd_dragtreen.f90 new file mode 100644 index 000000000..6f957b4a0 --- /dev/null +++ b/src/MNH/modd_dragtreen.f90 @@ -0,0 +1,64 @@ +!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 +!MNH_LIC for details. version 1. +!! +!! ##################### + MODULE MODD_DRAGTREE_n +!! ##################### +!! +!!*** *MODD_DRAGTREE* +!! +!! PURPOSE +!! ------- +! Declaration to take into account tree drag in Meso-NH +! instead of SURFEX. +!! +!!** AUTHOR +!! ------ +!! C.Lac *CNRM* +! +!! MODIFICATIONS +!! ------------- +!! Original 30/06/11 +!! 06/16 (C.Lac) Add droplet deposition +!! 11/2019 C.Lac correction in the drag formula and application to building in addition to tree + +!----------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ----------------- +! +USE MODD_PARAMETERS, ONLY: JPMODELMAX +! +IMPLICIT NONE +! +TYPE DRAGTREE_t + ! + LOGICAL :: LDRAGTREE ! flag used to take into account tree drag in + ! ! the atmospheric model instead of SURFEX. + LOGICAL :: LDEPOTREE ! flag for droplet deposition on trees + ! + REAL :: XVDEPOTREE ! Droplet deposition velocity + ! +END TYPE DRAGTREE_t +! +TYPE(DRAGTREE_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: DRAGTREE_MODEL +! +LOGICAL,POINTER :: LDRAGTREE=>NULL() +LOGICAL,POINTER :: LDEPOTREE=>NULL() +REAL ,POINTER :: XVDEPOTREE=>NULL() +! +CONTAINS +! +SUBROUTINE DRAGTREE_GOTO_MODEL(KFROM, KTO) + ! + INTEGER, INTENT(IN) :: KFROM, KTO + ! + LDRAGTREE=>DRAGTREE_MODEL(KTO)%LDRAGTREE + LDEPOTREE=>DRAGTREE_MODEL(KTO)%LDEPOTREE + XVDEPOTREE=>DRAGTREE_MODEL(KTO)%XVDEPOTREE + ! +END SUBROUTINE DRAGTREE_GOTO_MODEL +! +END MODULE MODD_DRAGTREE_n diff --git a/src/MNH/modn_dragbldgn.f90 b/src/MNH/modn_dragbldgn.f90 new file mode 100644 index 000000000..d60daa31e --- /dev/null +++ b/src/MNH/modn_dragbldgn.f90 @@ -0,0 +1,51 @@ +!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 +!MNH_LIC for details. version 1. +!! +!! ##################### + MODULE MODN_DRAGBLDG_n +!! ##################### +!! +!!*** *MODN_DRAGBLDG* +!! +!! PURPOSE +!! ------- +! Namelist to take into account building drag in the atmospheric model +! instead of SURFEX. +!! +!!** AUTHOR +!! ------ +!! R.Schoetter *CNRM* +! +!! MODIFICATIONS +!! ------------- +!! Original 09/2019 +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +! +USE MODD_DRAGBLDG_n, ONLY : & + LDRAGBLDG_n => LDRAGBLDG +! +!----------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ----------------- +IMPLICIT NONE +! +LOGICAL, SAVE :: LDRAGBLDG +! +NAMELIST /NAM_DRAGBLDGn/LDRAGBLDG +! +CONTAINS +! +SUBROUTINE INIT_NAM_DRAGBLDGn + LDRAGBLDG = LDRAGBLDG_n +END SUBROUTINE INIT_NAM_DRAGBLDGn +! +SUBROUTINE UPDATE_NAM_DRAGBLDGn + LDRAGBLDG_n = LDRAGBLDG +END SUBROUTINE UPDATE_NAM_DRAGBLDGn +! +END MODULE MODN_DRAGBLDG_n diff --git a/src/MNH/modn_dragtreen.f90 b/src/MNH/modn_dragtreen.f90 new file mode 100644 index 000000000..b0654cc6f --- /dev/null +++ b/src/MNH/modn_dragtreen.f90 @@ -0,0 +1,61 @@ +!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 +!MNH_LIC for details. version 1. +!! +!! ##################### + MODULE MODN_DRAGTREE_n +!! ##################### +!! +!!*** *MODN_DRAGTREE* +!! +!! PURPOSE +!! ------- +! Namelist to take into account tree drag in the atmospheric model +! instead of SURFEX. +!! +!!** AUTHOR +!! ------ +!! C.Lac *CNRM* +! +!! MODIFICATIONS +!! ------------- +!! Original 30/06/11 +!! +!! 10/2016 : (C.Lac) Add droplet deposition on trees +!! 11/2019 C.Lac correction in the drag formula and application to building in addition to tree +!! IMPLICIT ARGUMENTS +!! ------------------ +! +USE MODD_DRAGTREE_n, ONLY : & + LDRAGTREE_n => LDRAGTREE, & + LDEPOTREE_n => LDEPOTREE, & + XVDEPOTREE_n => XVDEPOTREE +! +!----------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ----------------- +IMPLICIT NONE +! +LOGICAL, SAVE :: LDRAGTREE +LOGICAL, SAVE :: LDEPOTREE +REAL, SAVE :: XVDEPOTREE +! +NAMELIST /NAM_DRAGTREEn/LDRAGTREE,LDEPOTREE,XVDEPOTREE +! +CONTAINS +! +SUBROUTINE INIT_NAM_DRAGTREEn + LDRAGTREE = LDRAGTREE_n + LDEPOTREE = LDEPOTREE_n + XVDEPOTREE = XVDEPOTREE_n +END SUBROUTINE INIT_NAM_DRAGTREEn +! +SUBROUTINE UPDATE_NAM_DRAGTREEn + LDRAGTREE_n = LDRAGTREE + LDEPOTREE_n = LDEPOTREE + XVDEPOTREE_n = XVDEPOTREE +END SUBROUTINE UPDATE_NAM_DRAGTREEn +! +END MODULE MODN_DRAGTREE_n diff --git a/src/MNH/phys_paramn.f90 b/src/MNH/phys_paramn.f90 index 6cea6a86e..9854052e4 100644 --- a/src/MNH/phys_paramn.f90 +++ b/src/MNH/phys_paramn.f90 @@ -233,6 +233,7 @@ END MODULE MODI_PHYS_PARAM_n ! P. Wautelet 28/03/2018: replace TEMPORAL_DIST by DATETIME_DISTANCE ! P. Wautelet 05/2016-04/2018: new data structures and calls for I/O ! P. Wautelet 21/11/2019: ZRG_HOUR and ZRAT_HOUR are now parameter arrays +!! 11/2019 C.Lac correction in the drag formula and application to building in addition to tree !!------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -311,6 +312,7 @@ USE MODI_SEDIM_SALT USE MODI_DUST_FILTER USE MODI_SALT_FILTER USE MODI_DRAG_VEG +USE MODI_DRAG_BLD USE MODD_DUST USE MODD_SALT USE MODD_PASPOL @@ -321,7 +323,8 @@ USE MODE_SALT_PSD USE MODE_AERO_PSD USE MODE_MNH_TIMING USE MODD_TURB_FLUX_AIRCRAFT_BALLOON, ONLY : XTHW_FLUX, XRCW_FLUX, XSVW_FLUX -USE MODD_DRAGTREE +USE MODD_DRAGTREE_n +USE MODD_DRAGBLDG_n ! USE MODD_TIME, ONLY : TDTEXP ! Ajout PP USE MODI_AEROZON ! Ajout PP @@ -737,6 +740,23 @@ CALL SUNPOS_n ( XZENITH, ZCOSZEN, ZSINZEN, ZAZIMSOL ) WRITE(UNIT=ILUOUT,FMT='(" RADIATIONS called for KTCOUNT=",I6, & & "with the CLOUD_ONLY option set ",L2)') KTCOUNT,OCLOUD_ONLY ! + ! + WHERE (XDIRFLASWD.LT.0.0) + XDIRFLASWD=0.0 + ENDWHERE + ! + WHERE (XDIRFLASWD.GT.1500.0) + XDIRFLASWD=1500.0 + ENDWHERE + ! + WHERE (XSCAFLASWD.LT.0.0) + XSCAFLASWD=0.0 + ENDWHERE + ! + WHERE (XSCAFLASWD.GT.1500.0) + XSCAFLASWD=1500.0 + ENDWHERE + ! WHERE( XDIRFLASWD(:,:,1) + XSCAFLASWD(:,:,1) >0. ) XALBUV(:,:) = ( XDIR_ALB(:,:,1) * XDIRFLASWD(:,:,1) & + XSCA_ALB(:,:,1) * XSCAFLASWD(:,:,1) ) & @@ -1234,10 +1254,11 @@ ZTIME1 = ZTIME2 XTIME_BU_PROCESS = 0. XTIME_LES_BU_PROCESS = 0. ! -IF (LDRAGTREE) CALL DRAG_VEG(XTSTEP,XUT,XVT,XTKET,LDEPOTREE,XVDEPOTREE, & - CCLOUD, XPABST,XTHT,XRT,XSVT, & - XRHODJ,XZZ,XRUS, XRVS, & - XRTKES,XRTHS, XRRS,XRSVS) +IF (LDRAGTREE) CALL DRAG_VEG( XTSTEP, XUT, XVT, XTKET, LDEPOTREE, XVDEPOTREE, & + CCLOUD, XPABST, XTHT, XRT, XSVT, XRHODJ, XZZ, & + XRUS, XRVS, XRTKES, XRTHS, XRRS, XRSVS ) +! +IF (LDRAGBLDG) CALL DRAG_BLD ( XTSTEP, XUT, XVT, XTKET, XRHODJ, XZZ, XRUS, XRVS, XRTKES ) ! CALL SECOND_MNH2(ZTIME2) ! @@ -1299,6 +1320,7 @@ IF ( CTURB == 'TKEL' ) THEN ENDIF ZSFCO2(IIB-1,:)=ZSFCO2(IIB,:) END IF + ! IF ( CLBCX(2) /= "CYCL" .AND. LEAST_ll()) THEN ZSFTH(IIE+1,:)=ZSFTH(IIE,:) ZSFRV(IIE+1,:)=ZSFRV(IIE,:) @@ -1312,6 +1334,7 @@ IF ( CTURB == 'TKEL' ) THEN ENDIF ZSFCO2(IIE+1,:)=ZSFCO2(IIE,:) END IF + ! IF ( CLBCY(1) /= "CYCL" .AND. LSOUTH_ll()) THEN ZSFTH(:,IJB-1)=ZSFTH(:,IJB) ZSFRV(:,IJB-1)=ZSFRV(:,IJB) @@ -1325,6 +1348,7 @@ IF ( CTURB == 'TKEL' ) THEN ENDIF ZSFCO2(:,IJB-1)=ZSFCO2(:,IJB) END IF + ! IF ( CLBCY(2) /= "CYCL" .AND. LNORTH_ll()) THEN ZSFTH(:,IJE+1)=ZSFTH(:,IJE) ZSFRV(:,IJE+1)=ZSFRV(:,IJE) diff --git a/src/MNH/read_exsegn.f90 b/src/MNH/read_exsegn.f90 index d09c3323b..dbff7eddb 100644 --- a/src/MNH/read_exsegn.f90 +++ b/src/MNH/read_exsegn.f90 @@ -292,6 +292,7 @@ END MODULE MODI_READ_EXSEG_n !! Modification 01/2019 (P. Wautelet) bugs correction: incorrect writes !! Modification 01/2019 (R. Honnert) remove SURF in CMF_UPDRAFT !! Bielli S. 02/2019 Sea salt : significant sea wave height influences salt emission; 5 salt modes +!! C.Lac 11/2019 correction in the drag formula and application to building in addition to tree !!------------------------------------------------------------------------------ ! !* 0. DECLARATIONS @@ -343,7 +344,8 @@ USE MODN_SERIES_n USE MODN_TURB_CLOUD USE MODN_TURB USE MODN_MEAN -USE MODN_DRAGTREE +USE MODN_DRAGTREE_n +USE MODN_DRAGBLDG_n USE MODN_LATZ_EDFLX ! USE MODD_NSV,NSV_USER_n=>NSV_USER @@ -461,6 +463,8 @@ CCPLFILE(:)=" " CALL INIT_NAM_CONFN CALL INIT_NAM_DYNN CALL INIT_NAM_ADVN +CALL INIT_NAM_DRAGTREEN +CALL INIT_NAM_DRAGBLDGN CALL INIT_NAM_PARAMN CALL INIT_NAM_PARAM_RADN #ifdef MNH_ECRAD @@ -514,6 +518,10 @@ CALL POSNAM(ILUSEG,'NAM_SERIESN',GFOUND,ILUOUT) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_SERIESn) CALL POSNAM(ILUSEG,'NAM_BLOWSNOWN',GFOUND,ILUOUT) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BLOWSNOWn) +CALL POSNAM(ILUSEG,'NAM_DRAGTREEN',GFOUND,ILUOUT) +IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_DRAGTREEn) +CALL POSNAM(ILUSEG,'NAM_DRAGBLDGN',GFOUND,ILUOUT) +IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_DRAGBLDGn) ! IF (KMI == 1) THEN WRITE(UNIT=ILUOUT,FMT="(' namelists common to all the models ')") @@ -650,8 +658,6 @@ IF (KMI == 1) THEN #endif CALL POSNAM(ILUSEG,'NAM_CONDSAMP',GFOUND,ILUOUT) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CONDSAMP) - CALL POSNAM(ILUSEG,'NAM_DRAGTREE',GFOUND,ILUOUT) - IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_DRAGTREE) CALL POSNAM(ILUSEG,'NAM_2D_FRC',GFOUND,ILUOUT) IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_2D_FRC) CALL POSNAM(ILUSEG,'NAM_LATZ_EDFLX',GFOUND) @@ -2815,6 +2821,8 @@ END IF ! CALL UPDATE_NAM_LUNITN CALL UPDATE_NAM_CONFN +CALL UPDATE_NAM_DRAGTREEN +CALL UPDATE_NAM_DRAGBLDGN CALL UPDATE_NAM_DYNN CALL UPDATE_NAM_ADVN CALL UPDATE_NAM_PARAMN diff --git a/src/SURFEX/allocate_physio.F90 b/src/SURFEX/allocate_physio.F90 index 1028fa249..745a7d007 100644 --- a/src/SURFEX/allocate_physio.F90 +++ b/src/SURFEX/allocate_physio.F90 @@ -33,6 +33,7 @@ !! ------------- !! Original xx/xxxx !! Modified 10/2014 P. Samuelsson MEB +!! 11/2019 C.Lac correction in the drag formula and application to building in addition to tree ! ! USE MODD_ISBA_OPTIONS_n, ONLY : ISBA_OPTIONS_t @@ -99,11 +100,7 @@ ELSE ENDIF ! - vegetation: Ags parameters ('AGS', 'LAI', 'AST', 'LST', 'NIT' options) ! -IF (IO%CPHOTO/='NON'.OR.LTREEDRAG) THEN - ALLOCATE(PK%XH_TREE (ISIZE )) -ELSE - ALLOCATE(PK%XH_TREE (0 )) -ENDIF +ALLOCATE(PK%XH_TREE (ISIZE )) ! IF (IO%CPHOTO/='NON') THEN ALLOCATE(PK%XRE25 (ISIZE )) diff --git a/src/SURFEX/convert_patch_isba.F90 b/src/SURFEX/convert_patch_isba.F90 index cad666663..b04278c20 100644 --- a/src/SURFEX/convert_patch_isba.F90 +++ b/src/SURFEX/convert_patch_isba.F90 @@ -46,6 +46,7 @@ !! coupled to atmosphere) !! P Samuelsson 10/2014 MEB ! P. Wautelet 15/02/2019: bugfix: allocate ZSTRESS only when its size has a meaning +!! 11/2019 C.Lac correction in the drag formula and application to building in addition to tree ! !---------------------------------------------------------------------------- ! @@ -215,7 +216,6 @@ IF (OFIX) THEN PK%NR_P,IO%NPATCH,KPATCH,KDECADE=KDEC) ENDIF ! - IF (IO%CPHOTO/='NON'.OR.LTREEDRAG) THEN IF (GDATA .AND. ANY(DTV%LDATA_H_TREE)) THEN CALL AV_PGD_PARAM(DTV%XPAR_LAI, DTV%XPAR_VEG, & PK%XH_TREE,DTV%XPAR_VEGTYPE,DTV%XPAR_H_TREE,YTREE,'ARI',PK%NR_P,IO%NPATCH,KPATCH) @@ -223,7 +223,6 @@ IF (OFIX) THEN CALL AV_PGD_1P(DTCO, PK%XH_TREE,PCOVER,XDATA_H_TREE(:,:),YTREE,'ARI',OCOVER,& PK%NR_P,IO%NPATCH,KPATCH,KDECADE=KDEC) ENDIF - ENDIF ! IF (IO%CPHOTO/='NON') THEN ! diff --git a/src/SURFEX/get_surf_varn.F90 b/src/SURFEX/get_surf_varn.F90 index f732f0316..de14d16e0 100644 --- a/src/SURFEX/get_surf_varn.F90 +++ b/src/SURFEX/get_surf_varn.F90 @@ -10,7 +10,8 @@ PZ0H_WATER, PZ0H_NATURE, PZ0H_TOWN, PQS_SEA, & PQS_WATER, PQS_NATURE, PQS_TOWN, PPSNG, PPSNV, & PZS, PSERIES, PTWSNOW, PSSO_STDEV, PLON, PLAT, & - PBARE, PLAI_TREE, PH_TREE ) + PBARE, PLAI_TREE, PH_TREE, & + PWALL_O_HOR, PBUILD_HEIGHT ) ! ####################################################################### ! !!**** *GET_SURF_VAR_n* - gets some surface fields on atmospheric grid @@ -47,6 +48,7 @@ ! S. Riette 06/2010 PSSO_STDEV and PTWSNOW added ! B. Decharme 09/2012 Argument added in GET_FLUX_n ! B. Decharme 05/2013 Argument added in GET_FLUX_n for debug in ARP/AL/AR +!! C. Lac 11/2019 correction in the drag formula and application to building in addition to tree !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -144,8 +146,11 @@ REAL, DIMENSION(:), INTENT(OUT), OPTIONAL :: PLON ! longitude REAL, DIMENSION(:), INTENT(OUT), OPTIONAL :: PLAT ! latitude ! 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 (-) +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 (-) +! +REAL, DIMENSION(:), INTENT(OUT), OPTIONAL :: PWALL_O_HOR ! Facade area density on grid mesh [m^2(fac.)/m^2(town)] +REAL, DIMENSION(:), INTENT(OUT), OPTIONAL :: PBUILD_HEIGHT ! Building height on grid mesh [m] ! !------------------------------------------------------------------------------- ! @@ -425,7 +430,8 @@ ENDIF ! !------------------------------------------------------------------------------- ! -IF ( PRESENT(PQS_TOWN) .OR. PRESENT(PZ0_TOWN) .OR. PRESENT(PZ0H_TOWN) ) THEN +IF ( PRESENT(PQS_TOWN) .OR. PRESENT(PZ0_TOWN) .OR. PRESENT(PZ0H_TOWN) .OR. & + PRESENT(PWALL_O_HOR) .OR. PRESENT (PBUILD_HEIGHT) ) THEN ! ! Get parameters over town tile ! @@ -440,8 +446,9 @@ IF ( PRESENT(PQS_TOWN) .OR. PRESENT(PZ0_TOWN) .OR. PRESENT(PZ0H_TOWN) ) THEN IMASK(:)=0 CALL GET_1D_MASK(KI_TOWN, KI, PTOWN, IMASK(1:KI_TOWN)) ! - CALL GET_VAR_TOWN_n(TM%TD%O, TM%TD%D, HPROGRAM, KI_TOWN, & - ZFIELD1(1:KI_TOWN), ZFIELD2(1:KI_TOWN), ZFIELD3(1:KI_TOWN)) + CALL GET_VAR_TOWN_n(TM%TOP, TM%TD%O, TM%TD%D, TM%NT,HPROGRAM, KI_TOWN, & + ZFIELD1(1:KI_TOWN), ZFIELD2(1:KI_TOWN), ZFIELD3(1:KI_TOWN),& + ZFIELD4(1:KI_TOWN), ZFIELD5(1:KI_TOWN) ) ! IF(PRESENT(PQS_TOWN))THEN PQS_TOWN (:) = XUNDEF @@ -464,6 +471,20 @@ IF ( PRESENT(PQS_TOWN) .OR. PRESENT(PZ0_TOWN) .OR. PRESENT(PZ0H_TOWN) ) THEN END DO ENDIF ! + IF(PRESENT(PWALL_O_HOR))THEN + PWALL_O_HOR (:) = XUNDEF + DO JI = 1, KI_TOWN + PWALL_O_HOR(IMASK(JI)) = ZFIELD4(JI) + END DO + ENDIF + ! + IF(PRESENT(PBUILD_HEIGHT))THEN + PBUILD_HEIGHT (:) = XUNDEF + DO JI = 1, KI_TOWN + PBUILD_HEIGHT(IMASK(JI)) = ZFIELD5(JI) + END DO + ENDIF + ! END IF ! !* 5. Orography diff --git a/src/SURFEX/get_var_townn.F90 b/src/SURFEX/get_var_townn.F90 index 0f2e9c9d7..382f32216 100644 --- a/src/SURFEX/get_var_townn.F90 +++ b/src/SURFEX/get_var_townn.F90 @@ -3,7 +3,8 @@ !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !SFX_LIC for details. version 1. ! ######### - SUBROUTINE GET_VAR_TOWN_n (DGO, D, HPROGRAM,KI,PQS,PZ0,PZ0H) + SUBROUTINE GET_VAR_TOWN_n (TOP, DGO, D, NT, HPROGRAM,KI,PQS,PZ0,PZ0H, & + PWALL_O_HOR,PBUILD_HEIGHT ) ! ################################################### ! !!**** *GET_VAR_TOWN_n* - routine to get variables defined only over town @@ -33,6 +34,7 @@ !! ------------- !! Original 02/2006 ! M. Jidane 08/2008 Z0 and Z0H recovery from town tiles +!! C.Lac 11/2019 correction in the drag formula and application to building in addition to tree !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -40,6 +42,8 @@ ! ! USE MODD_DIAG_n, ONLY : DIAG_t, DIAG_OPTIONS_t +USE MODD_TEB_n, ONLY : TEB_NP_t +USE MODD_TEB_OPTION_n, ONLY : TEB_OPTIONS_t ! USE MODI_GET_LUOUT USE MODD_SURF_PAR, ONLY : XUNDEF @@ -54,19 +58,24 @@ IMPLICIT NONE !* 0.1 Declarations of arguments ! ------------------------- ! +TYPE(TEB_OPTIONS_t), INTENT(IN) :: TOP TYPE(DIAG_OPTIONS_t), INTENT(IN) :: DGO -TYPE(DIAG_t), INTENT(IN) :: D +TYPE(DIAG_t), INTENT(IN) :: D +TYPE(TEB_NP_t), INTENT(IN) :: NT ! CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM INTEGER, INTENT(IN) :: KI ! Number of points REAL, DIMENSION(KI), INTENT(OUT) :: PQS ! surface humidity 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) :: PWALL_O_HOR ! Facade surface density [m^2(fac.)/m^2(town)] +REAL, DIMENSION(KI), INTENT(OUT) :: PBUILD_HEIGHT ! Building height [m] ! ! !* 0.2 Declarations of local variables ! ------------------------------- ! +INTEGER :: JP ! loop counter on TEB patches INTEGER :: ILUOUT REAL(KIND=JPRB) :: ZHOOK_HANDLE ! @@ -76,17 +85,28 @@ IF (LHOOK) CALL DR_HOOK('GET_VAR_TOWN_N',0,ZHOOK_HANDLE) !------------------------------------------------------------------------------- ! IF (DGO%LSURF_VARS) THEN - PQS = D%XQS - ELSE - PQS = XUNDEF + PQS = D%XQS +ELSE + PQS = XUNDEF ENDIF IF (DGO%LCOEF) THEN - PZ0 = D%XZ0 - PZ0H = D%XZ0H - ELSE - PZ0 = XUNDEF - PZ0H = XUNDEF -ENDIF + PZ0 = D%XZ0 + PZ0H = D%XZ0H +ELSE + PZ0 = XUNDEF + PZ0H = XUNDEF +ENDIF +! +!* building height and external wall coverage fraction +! +PWALL_O_HOR = 0. +PBUILD_HEIGHT = 0. + +DO JP=1,TOP%NTEB_PATCH + PWALL_O_HOR (:) = PWALL_O_HOR (:) + TOP%XTEB_PATCH(:,JP) * NT%AL(JP)%XWALL_O_HOR(:) + PBUILD_HEIGHT(:) = PBUILD_HEIGHT(:) + TOP%XTEB_PATCH(:,JP) * NT%AL(JP)%XBLD_HEIGHT(:) +END DO + IF (LHOOK) CALL DR_HOOK('GET_VAR_TOWN_N',1,ZHOOK_HANDLE) ! !============================================================================== diff --git a/src/SURFEX/get_vegn.F90 b/src/SURFEX/get_vegn.F90 index a41238194..d1e9c583d 100644 --- a/src/SURFEX/get_vegn.F90 +++ b/src/SURFEX/get_vegn.F90 @@ -29,6 +29,7 @@ !! MODIFICATIONS !! ------------- !! Original 07/2009 +!! 11/2019 C.Lac correction in the drag formula and application to building in addition to tree !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -100,16 +101,16 @@ IPATCH_BONE = VEGTYPE_TO_PATCH(NVT_BONE, IO%NPATCH) IPATCH_BOND = VEGTYPE_TO_PATCH(NVT_BOND, IO%NPATCH) -!ZWORK(:) = S%XVEGTYPE(:,NVT_TRBE) + S%XVEGTYPE(:,NVT_TRBD) + S%XVEGTYPE(:,NVT_TEBE) + & -! S%XVEGTYPE(:,NVT_TEBD) + S%XVEGTYPE(:,NVT_TENE) + S%XVEGTYPE(:,NVT_BOBD) + & -! S%XVEGTYPE(:,NVT_BONE) + S%XVEGTYPE(:,NVT_BOND) - ZH_TREE(:) = 0. ZLAI(:) = 0. ZWORK(:) = 0. ! DO JP = 1,IO%NPATCH + PK => NP%AL(JP) + PEK => NPE%AL(JP) +END DO ! +DO JP = 1,IO%NPATCH IF (JP==IPATCH_TRBE .OR. JP==IPATCH_TRBD .OR. JP==IPATCH_TEBE .OR. JP==IPATCH_TEBD .OR. & JP==IPATCH_TENE .OR. JP==IPATCH_BOBD .OR. JP==IPATCH_BONE .OR. JP==IPATCH_BOND) THEN ! -- GitLab