diff --git a/src/MNH/bl89.f90 b/src/MNH/bl89.f90 index bb81821ef0dbb6c51471c03d40d0d55d6c4477bc..6835f449241cc58aed7328184012f2d70bd5036c 100644 --- a/src/MNH/bl89.f90 +++ b/src/MNH/bl89.f90 @@ -71,6 +71,7 @@ END MODULE MODI_BL89 !! 2012-02 (Y. Seity) add possibility to run with !! reversed vertical levels !! Philippe 13/02/2018: use ifdef MNH_REAL to prevent problems with intrinsics on Blue Gene/Q +!! 01/2019 (Q. Rodier) support for RM17 mixing length !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -223,12 +224,12 @@ ZHLVPT(:,KKA) = ZVPT(:,KKA) ! !* 3. loop on model levels ! -------------------- -! DO JK=IKTB,IKTE ! !------------------------------------------------------------------------------- ! ! + !* 4. mixing length for a downwards displacement ! ------------------------------------------ ZINTE(:)=ZTKEM(:,JK) diff --git a/src/MNH/compute_bl89_ml.f90 b/src/MNH/compute_bl89_ml.f90 index 4c5124602b87fefe4ceddf7175abe469eeef5647..ac8986c3df7b608442bd86a414a8496e3c99e9f1 100644 --- a/src/MNH/compute_bl89_ml.f90 +++ b/src/MNH/compute_bl89_ml.f90 @@ -10,7 +10,7 @@ INTERFACE ! ################################################################### SUBROUTINE COMPUTE_BL89_ML(KKA,KKB,KKE,KKU,KKL,PDZZ2D, & - PTKEM_DEP,PG_O_THVREF,PVPT,KK,OUPORDN,OFLUX,PLWORK) + PTKEM_DEP,PG_O_THVREF,PVPT,KK,OUPORDN,OFLUX,PSHEAR,PLWORK) ! ################################################################### !* 1.1 Declaration of Arguments @@ -29,6 +29,7 @@ LOGICAL, INTENT(IN) :: OUPORDN ! switch to compute upward ! downward (false) mixing length LOGICAL, INTENT(IN) :: OFLUX ! Computation must be done from flux level REAL, DIMENSION(:), INTENT(OUT) :: PLWORK ! Resulting mixing length +REAL, DIMENSION(:,:), INTENT(IN) :: PSHEAR ! vertical wind shear for RM17 mixing length END SUBROUTINE COMPUTE_BL89_ML @@ -37,7 +38,7 @@ END INTERFACE END MODULE MODI_COMPUTE_BL89_ML ! ######spl SUBROUTINE COMPUTE_BL89_ML(KKA,KKB,KKE,KKU,KKL,PDZZ2D, & - PTKEM_DEP,PG_O_THVREF,PVPT,KK,OUPORDN,OFLUX,PLWORK) + PTKEM_DEP,PG_O_THVREF,PVPT,KK,OUPORDN,OFLUX,PSHEAR,PLWORK) ! ################################################################### !! @@ -53,6 +54,7 @@ END MODULE MODI_COMPUTE_BL89_ML !! Original 19/01/06 !! S. Riette Jan 2012: support for both order of vertical levels and cleaning !! R.Honnert Oct 2016 : Update with AROME +!! Q.Rodier 01/2019 : support RM17 mixing length as in bl89.f90 !! !------------------------------------------------------------------------------- ! @@ -92,6 +94,7 @@ LOGICAL, INTENT(IN) :: OUPORDN ! switch to compute upward ! downward (false) mixing length LOGICAL, INTENT(IN) :: OFLUX ! Computation must be done from flux level REAL, DIMENSION(:), INTENT(OUT) :: PLWORK ! Resulting mixing length +REAL, DIMENSION(:,:), INTENT(IN) :: PSHEAR ! vertical wind shear for RM17 mixing length ! 0.2 Local variable ! @@ -144,21 +147,24 @@ IF (OUPORDN.EQV..TRUE.) THEN ZTEST0=0.5+SIGN(0.5,ZINTE(J1D)) ! test if there's energy to consume ! Energy consumed if parcel cross the entire layer ZPOTE(J1D) = ZTEST0*(PG_O_THVREF(J1D) * & - (0.5*(ZHLVPT(J1D,KK)+ PVPT(J1D,KK)) - ZVPT_DEP(J1D))) * & + (0.5*(ZHLVPT(J1D,KK)+ PVPT(J1D,KK)) - ZVPT_DEP(J1D)) + & + XRM17*PSHEAR(J1D,KK)*SQRT(ABS(PTKEM_DEP(J1D)))) * & PDZZ2D(J1D,KK)*0.5 ! Test if it rests some energy to consume ZTEST =0.5+SIGN(0.5,ZINTE(J1D)-ZPOTE(J1D)) ! Length travelled by parcel if it rests energy to consume ZLWORK1(J1D)=PDZZ2D(J1D,KK)*0.5 ! Lenght travelled by parcel to nullify energy - ZLWORK2(J1D)= ( - PG_O_THVREF(J1D) * & + ZLWORK2(J1D)= ( - PG_O_THVREF(J1D) * & ( ZHLVPT(J1D,KK) - ZVPT_DEP(J1D) ) & + - XRM17*PSHEAR(J1D,JKK)*sqrt(abs(PTKEM_DEP(J1D))) & + SQRT (ABS( & - ( PG_O_THVREF(J1D) * (ZHLVPT(J1D,KK) - ZVPT_DEP(J1D)) )**2 & + (XRM17*PSHEAR(J1D,JKK)*sqrt(abs(PTKEM_DEP(J1D))) + & + PG_O_THVREF(J1D) * (ZHLVPT(J1D,KK) - ZVPT_DEP(J1D)) )**2 & + 2. * ZINTE(J1D) * PG_O_THVREF(J1D) & * ZDELTVPT(J1D,KK) / PDZZ2D(J1D,KK) )) ) / & - ( PG_O_THVREF(J1D) * ZDELTVPT(J1D,KK) / PDZZ2D(J1D,KK) ) - ! Effective length travelled by parcel + ( PG_O_THVREF(J1D) * ZDELTVPT(J1D,KK) / PDZZ2D(J1D,KK) ) + ! Effective length travelled by parcel PLWORK(J1D)=PLWORK(J1D)+ZTEST0*(ZTEST*ZLWORK1(J1D)+ & (1-ZTEST)*ZLWORK2(J1D)) ! Rest of energy to consume @@ -174,19 +180,22 @@ IF (OUPORDN.EQV..TRUE.) THEN DO J1D=1,IIJU ZTEST0=0.5+SIGN(0.5,ZINTE(J1D)) ZPOTE(J1D) = ZTEST0*(PG_O_THVREF(J1D) * & - (ZHLVPT(J1D,JKK) - ZVPT_DEP(J1D))) * PDZZ2D(J1D,JKK) !particle keeps its temperature + (ZHLVPT(J1D,JKK) - ZVPT_DEP(J1D)) & + + XRM17*PSHEAR(J1D,JKK)*SQRT(ABS(PTKEM_DEP(J1D))))* PDZZ2D(J1D,JKK) ZTEST =0.5+SIGN(0.5,ZINTE(J1D)-ZPOTE(J1D)) ZTESTM=ZTESTM+ZTEST0 ZLWORK1(J1D)=PDZZ2D(J1D,JKK) !ZLWORK2 jump of the last reached level ZLWORK2(J1D)= ( - PG_O_THVREF(J1D) * & ( PVPT(J1D,JKK-KKL) - ZVPT_DEP(J1D) ) & - + SQRT (ABS( & - ( PG_O_THVREF(J1D) * (PVPT(J1D,JKK-KKL) - ZVPT_DEP(J1D)) )**2 & + - XRM17*PSHEAR(J1D,JKK)*sqrt(abs(PTKEM_DEP(J1D))) & + + SQRT (ABS( & + (XRM17*PSHEAR(J1D,JKK)*sqrt(abs(PTKEM_DEP(J1D))) + & + PG_O_THVREF(J1D) * (PVPT(J1D,JKK-KKL) - ZVPT_DEP(J1D)) )**2 & + 2. * ZINTE(J1D) * PG_O_THVREF(J1D) & * ZDELTVPT(J1D,JKK) / PDZZ2D(J1D,JKK) )) ) / & ( PG_O_THVREF(J1D) * ZDELTVPT(J1D,JKK) / PDZZ2D(J1D,JKK) ) - ! +! PLWORK(J1D)=PLWORK(J1D)+ZTEST0*(ZTEST*ZLWORK1(J1D)+ & (1-ZTEST)*ZLWORK2(J1D)) ZINTE(J1D) = ZINTE(J1D) - ZPOTE(J1D) @@ -214,19 +223,22 @@ IF (OUPORDN.EQV..FALSE.) THEN ZTESTM=0 DO J1D=1,IIJU ZTEST0=0.5+SIGN(0.5,ZINTE(J1D)) - ZPOTE(J1D) = -ZTEST0*(PG_O_THVREF(J1D) * & - (ZHLVPT(J1D,JKK) - PVPT(J1D,KK))) * PDZZ2D(J1D,JKK) !particle keeps its temperature + ZPOTE(J1D) = ZTEST0*(-PG_O_THVREF(J1D) * & + (ZHLVPT(J1D,JKK) - PVPT(J1D,KK)) & + + XRM17*PSHEAR(J1D,JKK)*SQRT(ABS(PTKEM_DEP(J1D))))* PDZZ2D(J1D,JKK) ZTEST =0.5+SIGN(0.5,ZINTE(J1D)-ZPOTE(J1D)) ZTESTM=ZTESTM+ZTEST0 ZLWORK1(J1D)=PDZZ2D(J1D,JKK) - ZLWORK2(J1D)= ( + PG_O_THVREF(J1D) * & + ZLWORK2(J1D)= ( + PG_O_THVREF(J1D) * & ( PVPT(J1D,JKK) - PVPT(J1D,KK) ) & + -XRM17*PSHEAR(J1D,JKK)*sqrt(abs(PTKEM_DEP(J1D))) & + SQRT (ABS( & - ( PG_O_THVREF(J1D) * (PVPT(J1D,JKK) - PVPT(J1D,KK)) )**2 & + (XRM17*PSHEAR(J1D,JKK)*sqrt(abs(PTKEM_DEP(J1D))) - & + PG_O_THVREF(J1D) * (PVPT(J1D,JKK) - PVPT(J1D,KK)) )**2 & + 2. * ZINTE(J1D) * PG_O_THVREF(J1D) & * ZDELTVPT(J1D,JKK) / PDZZ2D(J1D,JKK) )) ) / & ( PG_O_THVREF(J1D) * ZDELTVPT(J1D,JKK) / PDZZ2D(J1D,JKK) ) - ! +! PLWORK(J1D)=PLWORK(J1D)+ZTEST0*(ZTEST*ZLWORK1(J1D)+ & (1-ZTEST)*ZLWORK2(J1D)) ZINTE(J1D) = ZINTE(J1D) - ZPOTE(J1D) @@ -234,5 +246,5 @@ IF (OUPORDN.EQV..FALSE.) THEN ENDIF END DO ENDIF - + END SUBROUTINE COMPUTE_BL89_ML diff --git a/src/MNH/compute_updraft.f90 b/src/MNH/compute_updraft.f90 index e4165877555f575709ee19b94dc96dd1e43ee46a..ba78d05a1fdaec9883a5eb1685fcdd3935d4c3cd 100644 --- a/src/MNH/compute_updraft.f90 +++ b/src/MNH/compute_updraft.f90 @@ -134,6 +134,7 @@ END MODULE MODI_COMPUTE_UPDRAFT !! V.Masson, C.Lac : 02/2011 : SV_UP initialized by a non-zero value !! S. Riette Apr 2013: improvement of continuity at the condensation level !! R.Honnert Oct 2016 : Add ZSURF and Update with AROME +!! Q.Rodier 01/2019 : support RM17 mixing length !! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -141,6 +142,7 @@ END MODULE MODI_COMPUTE_UPDRAFT ! USE MODD_CST USE MODD_PARAM_MFSHALL_n +USE MODD_TURB_n, ONLY : CTURBLEN USE MODI_COMPUTE_ENTR_DETR USE MODI_TH_R_FROM_THL_RT_1D @@ -258,7 +260,7 @@ REAL :: ZDEPTH_MAX1, ZDEPTH_MAX2 ! control auto-extinction process REAL :: ZTMAX,ZRMAX ! control value REAL, DIMENSION(SIZE(PTHM,1)) :: ZSURF - +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZSHEAR,ZDUDZ,ZDVDZ ! vertical wind shear ! Thresholds for the perturbation of ! theta_l and r_t at the first level of the updraft ZTMAX=2.0 @@ -377,8 +379,16 @@ IF (OENTR_DETR) THEN ! compute L_up GLMIX=.TRUE. ZTKEM_F(:,KKB)=0. - - CALL COMPUTE_BL89_ML(KKA,KKB,KKE,KKU,KKL,PDZZ,ZTKEM_F(:,KKB),ZG_O_THVREF(:,KKB),ZTHVM,KKB,GLMIX,.FALSE.,ZLUP) + ! + IF(CTURBLEN=='RM17') THEN + ZDUDZ = MZF_MF(KKA,KKU,KKL,GZ_M_W_MF(KKA,KKU,KKL,PUM,PDZZ)) + ZDVDZ = MZF_MF(KKA,KKU,KKL,GZ_M_W_MF(KKA,KKU,KKL,PVM,PDZZ)) + ZSHEAR = SQRT(ZDUDZ*ZDUDZ + ZDVDZ*ZDVDZ) + ELSE + ZSHEAR = 0. !no shear in bl89 mixing length + END IF + ! + CALL COMPUTE_BL89_ML(KKA,KKB,KKE,KKU,KKL,PDZZ,ZTKEM_F(:,KKB),ZG_O_THVREF(:,KKB),ZTHVM,KKB,GLMIX,.FALSE.,ZSHEAR,ZLUP) ZLUP(:)=MAX(ZLUP(:),1.E-10) ! Compute Buoyancy flux at the ground diff --git a/src/MNH/compute_updraft_hrio.f90 b/src/MNH/compute_updraft_hrio.f90 index 3466441418fdbdd0b983c56abc4b5e807aba9549..6ec162b20d6bd4c14587325a2e5e4c266ca4dc19 100644 --- a/src/MNH/compute_updraft_hrio.f90 +++ b/src/MNH/compute_updraft_hrio.f90 @@ -134,6 +134,7 @@ END MODULE MODI_COMPUTE_UPDRAFT_HRIO! ######spl !! S. Riette may 2011: ice added, interface modified !! S. Riette Jan 2012: support for both order of vertical levels !! V.Masson, C.Lac : 02/2011 : SV_UP initialized by a non-zero value +!! Q.Rodier 01/2019 : support RM17 mixing length !! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -147,6 +148,7 @@ USE MODD_PARAM_MFSHALL_n, ONLY : XPRES_UV,XALP_PERT,XCMF,XFRAC_UP_MAX,XA1,XB,& ! XC,XBETA1 USE MODD_GRID_n, ONLY : XDXHAT, XDYHAT USE MODD_BLANK +USE MODD_TURB_n, ONLY :CTURBLEN !USE MODI_COMPUTE_ENTR_DETR USE MODI_TH_R_FROM_THL_RT_1D @@ -275,6 +277,7 @@ REAL :: XFRAC_LIM ! surface maximale du thermique REAL :: ZTMAX,ZRMAX, ZEPS ! control value +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZSHEAR,ZDUDZ,ZDVDZ ! vertical wind shear ! pour le calcul de la resolution normalisée REAL, DIMENSION(SIZE(PTHM,1)) :: ZA1, ZRESOL_NORM REAL :: ZRESOL_GRID @@ -446,9 +449,15 @@ IF (OENTR_DETR) THEN ! compute L_up GLMIX=.TRUE. ZTKEM_F(:,KKB)=0. - + IF(CTURBLEN=='RM17') THEN + ZDUDZ = MZF_MF(KKA,KKU,KKL,GZ_M_W_MF(KKA,KKU,KKL,PUM,PDZZ)) + ZDVDZ = MZF_MF(KKA,KKU,KKL,GZ_M_W_MF(KKA,KKU,KKL,PVM,PDZZ)) + ZSHEAR = SQRT(ZDUDZ*ZDUDZ + ZDVDZ*ZDVDZ) + ELSE + ZSHEAR = 0. !no shear in bl89 mixing length + END IF CALL COMPUTE_BL89_ML(KKA,KKB,KKE,KKU,KKL,PDZZ,ZTKEM_F(:,KKB),ZG_O_THVREF(:,KKB), & - ZTHVM_F,KKB,GLMIX,.TRUE.,ZLUP) + ZTHVM_F,KKB,GLMIX,.TRUE.,ZSHEAR,ZLUP) ZLUP(:)=MAX(ZLUP(:),1.E-10) ! Compute Buoyancy flux at the ground diff --git a/src/MNH/compute_updraft_rhcj10.f90 b/src/MNH/compute_updraft_rhcj10.f90 index f062dcf0ad9d0d6738b16c9fcf1364bb6d2165e1..554dc54f9d8f56fab536ff264a5a989b1d983f23 100644 --- a/src/MNH/compute_updraft_rhcj10.f90 +++ b/src/MNH/compute_updraft_rhcj10.f90 @@ -124,6 +124,7 @@ SUBROUTINE COMPUTE_UPDRAFT_RHCJ10(KKA,KKB,KKE,KKU,KKL,HFRAC_ICE, & !! ------ !! Y. Bouteloup (2012) !! R. Honert Janv 2013 ==> corection of some bugs +!! Q.Rodier 01/2019 : support RM17 mixing length !! -------------------------------------------------------------------------- ! WARNING ==> This updraft is not yet ready to use scalar variables @@ -133,7 +134,7 @@ SUBROUTINE COMPUTE_UPDRAFT_RHCJ10(KKA,KKB,KKE,KKU,KKL,HFRAC_ICE, & USE MODD_CST USE MODD_PARAM_MFSHALL_n - +USE MODD_TURB_n, ONLY : CTURBLEN USE MODI_COMPUTE_ENTR_DETR USE MODI_TH_R_FROM_THL_RT_1D USE MODI_SHUMAN_MF @@ -252,6 +253,7 @@ REAL :: ZDEPTH_MAX1, ZDEPTH_MAX2 ! control auto-extinction process REAL :: ZTMAX,ZRMAX, ZEPS ! control value +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZSHEAR,ZDUDZ,ZDVDZ ! vertical wind shear ! Thresholds for the perturbation of ! theta_l and r_t at the first level of the updraft @@ -389,9 +391,17 @@ ENDDO ! compute L_up GLMIX=.TRUE. ZTKEM_F(:,KKB)=0. - +! +IF(CTURBLEN=='RM17') THEN + ZDUDZ = MZF_MF(KKA,KKU,KKL,GZ_M_W_MF(KKA,KKU,KKL,PUM,PDZZ)) + ZDVDZ = MZF_MF(KKA,KKU,KKL,GZ_M_W_MF(KKA,KKU,KKL,PVM,PDZZ)) + ZSHEAR = SQRT(ZDUDZ*ZDUDZ + ZDVDZ*ZDVDZ) +ELSE + ZSHEAR = 0. !no shear in bl89 mixing length +END IF +! CALL COMPUTE_BL89_ML(KKA,KKB,KKE,KKU,KKL,PDZZ,ZTKEM_F(:,KKB),ZG_O_THVREF(:,KKB), & - ZTHVM_F,KKB,GLMIX,.TRUE.,ZLUP) + ZTHVM_F,KKB,GLMIX,.TRUE.,ZSHEAR,ZLUP) ZLUP(:)=MAX(ZLUP(:),1.E-10) ! Compute Buoyancy flux at the ground diff --git a/src/MNH/ini_cturb.f90 b/src/MNH/ini_cturb.f90 index 3e7bc3275572eb591a2459ed12471bffb4824d30..090f8ad30de5e7f751e058004b61a318196f9882 100644 --- a/src/MNH/ini_cturb.f90 +++ b/src/MNH/ini_cturb.f90 @@ -63,6 +63,7 @@ END MODULE MODI_INI_CTURB !! P.Jabouille 20/10/99 XCET=0.4 !! V.Masson 13/11/02 XALPSBL and XASBL !! 05/06 Remove KEPS +!! Q.Rodier 01/19 XCED replaced by XCEDIS in read_exsegn.f90 and ini_modeln.f90 !! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -80,8 +81,10 @@ IMPLICIT NONE ! ! 1.1 Constant for dissipation of Tke ! +!XCED is now replaced by XCEDIS !XCED = 0.70 -XCED = 0.84 +!XCED = 0.84 +! ! Redelsperger-Sommeria (1981) = 0.70 ! Schmidt-Schumann (1989) = 0.845 ! Cheng-Canuto-Howard (2002) = 0.845 diff --git a/src/MNH/prep_pgd.f90 b/src/MNH/prep_pgd.f90 index fefe3a572160f3fbd8d14f4b4791eb4a43ced4c8..d7b5899bc4db7c5bfbe2970a1531c02c9b30e40c 100644 --- a/src/MNH/prep_pgd.f90 +++ b/src/MNH/prep_pgd.f90 @@ -72,6 +72,8 @@ !! 10/2016 (S.Faroux S.Bielli) correction for NHALO=0 !! 01/2018 (G.Delautier) SURFEX 8.1 !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! Q. Rodier 01/2019 : add a new filtering for very high slopes in NAM_ZSFILTER +!! !---------------------------------------------------------------------------- ! !* 0. DECLARATION @@ -131,8 +133,9 @@ CHARACTER(LEN=28) :: YDAD =' ' ! name of dad of input FM file CHARACTER(LEN=28) :: CPGDFILE ='PGDFILE' ! name of the output file CHARACTER(LEN=100) :: YMSG INTEGER :: NZSFILTER=1 ! number of iteration for filter for fine orography -LOGICAL :: LHSLOP=.FALSE. ! filtering of slopes higher than XHSLOP -REAL :: XHSLOP=1.2 ! if LHSLOP filtering of slopes higher than XHSLOP +INTEGER :: NLOCZSFILTER=3 ! number of iteration for filter of local fine orography +LOGICAL :: LHSLOP=.FALSE. ! filtering of local slopes higher than XHSLOP +REAL :: XHSLOP=1.0 ! slopes where the local fine filtering is applied INTEGER :: NSLEVE =12 ! number of iteration for filter for smooth orography REAL :: XSMOOTH_ZS = XUNDEF ! optional uniform smooth orography for SLEVE coordinate REAL, DIMENSION(:,:),ALLOCATABLE :: ZWORK ! work array for lat and lon reshape @@ -144,7 +147,7 @@ TYPE(TFILEDATA),POINTER :: TZFILE => NULL() TYPE(TFILEDATA),POINTER :: TZNMLFILE => NULL() ! Namelist file ! NAMELIST/NAM_PGDFILE/CPGDFILE, NHALO -NAMELIST/NAM_ZSFILTER/NZSFILTER,LHSLOP,XHSLOP +NAMELIST/NAM_ZSFILTER/NZSFILTER,NLOCZSFILTER,LHSLOP,XHSLOP NAMELIST/NAM_SLEVE/NSLEVE, XSMOOTH_ZS NAMELIST/NAM_CONF_PGD/JPHEXT, NHALO_MNH !------------------------------------------------------------------------------ @@ -278,7 +281,7 @@ NULLIFY(TFILE_SURFEX) !Probably not necessary ! !* 4. Computes and writes smooth orography for SLEVE coordinate ! --------------------------------------------------------- -CALL ZSMT_PGD(TZFILE,NZSFILTER,NSLEVE,XSMOOTH_ZS) +CALL ZSMT_PGD(TZFILE,NZSFILTER,NSLEVE,NLOCZSFILTER,LHSLOP,XHSLOP,XSMOOTH_ZS) ! IF (.NOT.LCARTESIAN) THEN !!!! WRITE LAT and LON diff --git a/src/MNH/read_exsegn.f90 b/src/MNH/read_exsegn.f90 index 28c1e5457fce7826746d6649105bd9a79d5ed8d0..b3340610750f787598f88977e6bf9102d8d50935 100644 --- a/src/MNH/read_exsegn.f90 +++ b/src/MNH/read_exsegn.f90 @@ -288,6 +288,7 @@ END MODULE MODI_READ_EXSEG_n !! Q.Libois 02/2018 ECRAD !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O !! Modification 07/2017 (V. Vionnet) add blowing snow scheme +!! Modification 01/2019 (Q. Rodier) define XCEDIS depending on BL89 or RM17 mixing length !!------------------------------------------------------------------------------ ! !* 0. DECLARATIONS @@ -1414,7 +1415,12 @@ ELSE CGETCLDFR = 'SKIP' END IF END IF - +! +IF(CTURBLEN=='RM17') THEN + XCEDIS=0.34 +ELSE + XCEDIS=0.84 +END IF ! !* 3.3 Moist turbulence ! diff --git a/src/MNH/shallow_mf.f90 b/src/MNH/shallow_mf.f90 index 049954b62490fd8a03da54a5359775ba9bd1aa32..2a9e824398bd70a650f87ba4d41237ee0642ff54 100644 --- a/src/MNH/shallow_mf.f90 +++ b/src/MNH/shallow_mf.f90 @@ -165,6 +165,7 @@ END MODULE MODI_SHALLOW_MF !! R.Honnert 10/2016 : SURF=gray zone initilisation + EDKF !! R.Honnert 10/2016 : Update with Arome !! Philippe Wautelet 28/05/2018: corrected truncated integer division (2/3 -> 2./3.) +!! Q.Rodier 01/2019 : support RM17 mixing length !! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -173,6 +174,7 @@ END MODULE MODI_SHALLOW_MF USE MODD_CST USE MODD_PARAMETERS, ONLY: JPVEXT USE MODD_PARAM_MFSHALL_n +USE MODD_TURB_n, ONLY: CTURBLEN USE MODI_THL_RT_FROM_TH_R_MF USE MODI_COMPUTE_UPDRAFT @@ -184,7 +186,7 @@ USE MODI_MF_TURB_EXPL USE MODI_MF_TURB_GREYZONE USE MODI_COMPUTE_MF_CLOUD USE MODI_COMPUTE_FRAC_ICE -! +USE MODI_SHUMAN_MF ! USE MODI_COMPUTE_BL89_ML USE MODD_GRID_n, ONLY : XDXHAT, XDYHAT @@ -282,6 +284,7 @@ REAL, DIMENSION(SIZE(PSVM,1),SIZE(PSVM,2),SIZE(PSVM,3)) :: & REAL, DIMENSION(SIZE(PTHM,1)) :: ZDEPTH ! Deepness of cloud REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZFRAC_ICE_UP ! liquid/solid fraction in updraft REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZRSAT_UP ! Rsat in updraft +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZSHEAR,ZDUDZ,ZDVDZ !vertical wind shear LOGICAL :: GENTR_DETR ! flag to recompute entrainment, detrainment and mass flux INTEGER :: IKB ! near ground physical index @@ -460,7 +463,14 @@ ENDIF ENDDO ZG_O_THVREF=XG/PTHVREF GLMIX=.TRUE. - CALL COMPUTE_BL89_ML(KKA,IKB,IKE,KKU,KKL,PDZZ,PTKEM(:,IKB) ,ZG_O_THVREF(:,IKB),ZTHVM,IKB,GLMIX,.TRUE.,ZLUP) + IF(CTURBLEN=='RM17') THEN + ZDUDZ = MZF_MF(KKA,KKU,KKL,GZ_M_W_MF(KKA,KKU,KKL,PUM,PDZZ)) + ZDVDZ = MZF_MF(KKA,KKU,KKL,GZ_M_W_MF(KKA,KKU,KKL,PVM,PDZZ)) + ZSHEAR = SQRT(ZDUDZ*ZDUDZ + ZDVDZ*ZDVDZ) + ELSE + ZSHEAR = 0. !no shear in bl89 mixing length + END IF + CALL COMPUTE_BL89_ML(KKA,IKB,IKE,KKU,KKL,PDZZ,PTKEM(:,IKB) ,ZG_O_THVREF(:,IKB),ZTHVM,IKB,GLMIX,.TRUE.,ZSHEAR,ZLUP) !! calcul de Dx/(h+hc) DO JI=1,SIZE(XDXHAT) DO JJ=1,SIZE(XDYHAT) diff --git a/src/MNH/zsmt_pgd.f90 b/src/MNH/zsmt_pgd.f90 index 0de2cd8a28051af6f2cdf8b303df64aced7ddad8..14a4be23bbce0a159b70a471aad86fc578fcb36d 100644 --- a/src/MNH/zsmt_pgd.f90 +++ b/src/MNH/zsmt_pgd.f90 @@ -8,14 +8,17 @@ ! INTERFACE ! - SUBROUTINE ZSMT_PGD(TPFILE,KZSFILTER,KSLEVE,PSMOOTH_ZS) + SUBROUTINE ZSMT_PGD(TPFILE,KZSFILTER,KSLEVE,KLOCZSFILTER,OHSLOP,PHSLOP,PSMOOTH_ZS) ! USE MODD_IO_ll, ONLY : TFILEDATA ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! File characteristics -INTEGER, INTENT(IN) :: KZSFILTER ! number of iterations for fine orography -INTEGER, INTENT(IN) :: KSLEVE ! number of iterations -REAL, INTENT(IN) :: PSMOOTH_ZS ! optional uniform smooth orography for SLEVE coordinate +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! File characteristics +INTEGER, INTENT(IN) :: KZSFILTER ! number of iterations for fine orography +INTEGER, INTENT(IN) :: KSLEVE ! number of iterations +INTEGER, INTENT(IN) :: KLOCZSFILTER ! number of iteration for filter of local fine orography +LOGICAL, INTENT(IN) :: OHSLOP ! filtering of local slopes higher than XHSLOP +REAL, INTENT(IN) :: PHSLOP ! slopes where the local fine filtering is applied +REAL, INTENT(IN) :: PSMOOTH_ZS ! optional uniform smooth orography for SLEVE coordinate ! END SUBROUTINE ZSMT_PGD ! @@ -26,7 +29,7 @@ END MODULE MODI_ZSMT_PGD ! ! ! ############################# - SUBROUTINE ZSMT_PGD(TPFILE,KZSFILTER,KSLEVE,PSMOOTH_ZS) + SUBROUTINE ZSMT_PGD(TPFILE,KZSFILTER,KSLEVE,KLOCZSFILTER,OHSLOP,PHSLOP,PSMOOTH_ZS) ! ############################# ! !!**** *ZSMT_PGD* computes smoothed orography for SLEVE coordinate @@ -56,7 +59,8 @@ END MODULE MODI_ZSMT_PGD !! ------------- !! Original nov 2005 !! J.Escobar 23/06/2015 : correction for JPHEXT<>1 -!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O +!! Q. Rodier 01/2019 : add a new filtering for very high slopes (applied locally) !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -70,15 +74,20 @@ USE MODE_FMREAD USE MODE_FMWRIT USE MODE_ll , ONLY : GET_DIM_EXT_ll , ADD2DFIELD_ll , CLEANLIST_ll , UPDATE_HALO_ll USE MODD_ARGSLIST_ll, ONLY : LIST_ll +USE MODI_SUM_ll +USE MODE_FIELD, ONLY: TFIELDDATA, TYPEREAL ! IMPLICIT NONE ! !* 0.1 declarations of arguments ! -TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! File characteristics -INTEGER, INTENT(IN) :: KZSFILTER ! number of iterations for fine orography -INTEGER, INTENT(IN) :: KSLEVE ! number of iterations -REAL, INTENT(IN) :: PSMOOTH_ZS ! optional uniform smooth orography for SLEVE coordinate +TYPE(TFILEDATA), INTENT(IN) :: TPFILE ! File characteristics +INTEGER, INTENT(IN) :: KZSFILTER ! number of iterations for fine orography +INTEGER, INTENT(IN) :: KSLEVE ! number of iterations +INTEGER, INTENT(IN) :: KLOCZSFILTER ! number of iteration for filter of local fine orography +LOGICAL, INTENT(IN) :: OHSLOP ! filtering of local slopes higher than XHSLOP +REAL, INTENT(IN) :: PHSLOP ! slopes where the local fine filtering is applied +REAL, INTENT(IN) :: PSMOOTH_ZS ! optional uniform smooth orography for SLEVE coordinate ! ! !* 0.2 declarations of local variables @@ -88,8 +97,6 @@ INTEGER :: JN ! loop counter on iterations INTEGER :: JI ! loop counter on X coordinate INTEGER :: JJ ! loop counter on Y coordinate ! -INTEGER :: IIMAX ! number of physical points in X direction -INTEGER :: IJMAX ! number of physical points in Y direction INTEGER :: IIU ! number of points in X direction INTEGER :: IJU ! number of points in Y direction ! @@ -98,11 +105,22 @@ REAL, DIMENSION(:,:), ALLOCATABLE :: ZFINE_ZS ! smoothed fine orography REAL, DIMENSION(:,:), ALLOCATABLE :: ZSLEVE_ZS ! smooth orography for sleve coordinate REAL, DIMENSION(:,:), ALLOCATABLE :: ZZS ! orography at previous iteration REAL, DIMENSION(:,:), ALLOCATABLE :: ZMASK ! sea mask +! +REAL, DIMENSION(:,:), ALLOCATABLE :: ZSLOPEX ! terrain slope along x (flux pt) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZSLOPEY ! terrain slope along y (flux pt) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZSLOPEMX ! terrain slope along x (max. of flux, at mass pt) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZSLOPEMY ! terrain slope along y (max. of flux, at mass pt) +REAL, DIMENSION(:,:), ALLOCATABLE :: ZCOFIL ! coefficient for filtering high slopes +REAL, DIMENSION(:,:), ALLOCATABLE :: ZSMOOTH_ZSINI ! initial orography before slope filtering +! INTEGER :: JIM, JIP, JJM, JJP TYPE(LIST_ll) , POINTER :: THALO_ll => NULL() ! halo INTEGER :: INFO_ll ! error return code INTEGER :: IIB,IIE,IJB,IJE +REAL, DIMENSION(:), ALLOCATABLE :: ZXHAT +REAL, DIMENSION(:), ALLOCATABLE :: ZYHAT +TYPE(TFIELDDATA) :: TZFIELD !------------------------------------------------------------------------------- ! !* 1. Read orography in the file @@ -123,7 +141,18 @@ ALLOCATE(ZSMOOTH_ZS(IIU,IJU)) ALLOCATE(ZFINE_ZS(IIU,IJU)) ALLOCATE(ZSLEVE_ZS(IIU,IJU)) ALLOCATE(ZMASK(IIU,IJU)) -! +ALLOCATE(ZSLOPEX(IIU,IJU)) +ALLOCATE(ZSLOPEY(IIU,IJU)) +ALLOCATE(ZSLOPEMX(IIU,IJU)) +ALLOCATE(ZSLOPEMY(IIU,IJU)) +ALLOCATE(ZCOFIL(IIU,IJU)) +ALLOCATE(ZSMOOTH_ZSINI(IIU,IJU)) +ALLOCATE(ZXHAT(IIU)) +ALLOCATE(ZYHAT(IJU)) +! +CALL IO_READ_FIELD(TPFILE,'XHAT',ZXHAT) +CALL IO_READ_FIELD(TPFILE,'YHAT',ZYHAT) + !PW: bug/TODO: read a field in a file opened in WRITE mode !There is a test in IO_READ_FIELD_BYFIELD_X2 to allow this if TPFILE%CMODE='LFICDF4' CALL IO_READ_FIELD(TPFILE,'ZS',ZZS) @@ -162,6 +191,8 @@ ZSMOOTH_ZS = ZZS ! CALL ADD2DFIELD_ll(THALO_ll,ZZS) CALL ADD2DFIELD_ll(THALO_ll,ZSMOOTH_ZS) +CALL ADD2DFIELD_ll(THALO_ll,ZSLOPEX) +CALL ADD2DFIELD_ll(THALO_ll,ZSLOPEY) ! CALL UPDATE_HALO_ll(THALO_ll,INFO_ll) @@ -192,7 +223,6 @@ CALL UPDATE_HALO_ll(THALO_ll,INFO_ll) IF (JN==KSLEVE) ZSLEVE_ZS= ZSMOOTH_ZS ENDDO ! -CALL CLEANLIST_ll(THALO_ll) !------------------------------------------------------------------------------- ! !* 3. Case of uniform smooth orography prescribed @@ -205,7 +235,142 @@ IF (PSMOOTH_ZS /= XUNDEF) THEN END IF !------------------------------------------------------------------------------- ! -!* 4. writes smoothed orographies in the file +!* 4. Filtering very high slopes for steep orography +! ------------------------------------------- +! +IF(OHSLOP) THEN + ZSMOOTH_ZSINI=ZFINE_ZS + ZZS=ZFINE_ZS + ZSLOPEMX=0. + ZSLOPEMY=0. + ZSLOPEX=0. + ZSLOPEY=0. + ! + DO JN=1, KLOCZSFILTER + ZCOFIL=0. + ZSLOPEX=0. + ZSLOPEY=0. + ZSLOPEMX=0. + ZSLOPEMY=0. + ! + !Slope calculation along Y at flux and mass point + DO JI=1,IIU + DO JJ=2,IJU-1 + ZSLOPEY(JI,JJ) = (ZZS(JI,JJ)-ZZS(JI,JJ-1))/(0.5*(ZYHAT(JJ+1)-ZYHAT(JJ-1))) + END DO + END DO + ! + CALL UPDATE_HALO_ll(THALO_ll,INFO_ll) + ! + DO JI=1,IIU + DO JJ=1,IJU-1 + ZSLOPEMY(JI,JJ) = MAX(ABS(ZSLOPEY(JI,JJ)),ABS(ZSLOPEY(JI,JJ+1))) + END DO + END DO + ! + !Slope calculation along X at flux and mass point + DO JJ=1,IJU + DO JI=2,IIU-1 + ZSLOPEX(JI,JJ) = (ZZS(JI,JJ)-ZZS(JI-1,JJ))/(0.5*(ZXHAT(JI+1)-ZXHAT(JI-1))) + END DO + END DO + ! + CALL UPDATE_HALO_ll(THALO_ll,INFO_ll) + ! + DO JJ=1,IJU + DO JI=1,IIU-1 + ZSLOPEMX(JI,JJ) = MAX(ABS(ZSLOPEX(JI+1,JJ)),ABS(ZSLOPEX(JI,JJ))) + END DO + END DO + ! + !Filtering coefficient + DO JI=1,IIU + DO JJ=1,IJU + IF(ZSLOPEMX(JI,JJ)>=PHSLOP .OR. ZSLOPEMY(JI,JJ)>=PHSLOP) THEN + ZCOFIL(JI,JJ) = 0.25 !Fixed coefficient + END IF + END DO + END DO + ! + !Filtering + DO JJ = 1,IJU + DO JI = 1,IIU + JIP = MIN(JI+1,IIU) + JIM = MAX(JI-1,1 ) + JJP = MIN(JJ+1,IJU) + JJM = MAX(JJ-1,1 ) + ZSMOOTH_ZS(JI,JJ) = ZZS(JI,JJ) & + + ZCOFIL(JI,JJ)* ZMASK(JI,JJ) & + * ( ZMASK(JIM,JJ) * ZZS(JIM,JJ) & + + ZMASK(JIP,JJ) * ZZS(JIP,JJ) & + + ZMASK(JI,JJM) * ZZS(JI,JJM) & + + ZMASK(JI,JJP) * ZZS(JI,JJP) & + - ( ZMASK(JIM,JJ) & + +ZMASK(JIP,JJ) & + +ZMASK(JI,JJM) & + +ZMASK(JI,JJP) ) * ZZS(JI,JJ) ) + ENDDO + ENDDO + ! + CALL UPDATE_HALO_ll(THALO_ll,INFO_ll) + ZZS=ZSMOOTH_ZS + END DO + ! + ZFINE_ZS=ZSMOOTH_ZS + ! + !Filtered slopes computed again for output + DO JI=1,IIU + DO JJ=2,IJU-1 + ZSLOPEY(JI,JJ) = (ZZS(JI,JJ)-ZZS(JI,JJ-1))/(0.5*(ZYHAT(JJ+1)-ZYHAT(JJ-1))) + END DO + END DO + ! + DO JJ=1,IJU + DO JI=2,IIU-1 + ZSLOPEX(JI,JJ) = (ZZS(JI,JJ)-ZZS(JI-1,JJ))/(0.5*(ZXHAT(JI+1)-ZXHAT(JI-1))) + END DO + END DO + ! + ! Writes filtred orography and slopes along i and j + TZFIELD%CMNHNAME = 'ZSLOPEX' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'ZSLOPEX' + TZFIELD%CUNITS = '' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'orography slope along x' + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 2 + TZFIELD%LTIMEDEP = .FALSE. + CALL IO_WRITE_FIELD(TPFILE,TZFIELD,ZSLOPEX) + ! + TZFIELD%CMNHNAME = 'ZSLOPEY' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'ZSLOPEY' + TZFIELD%CUNITS = '' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'orography slope along y' + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 2 + TZFIELD%LTIMEDEP = .FALSE. + CALL IO_WRITE_FIELD(TPFILE,TZFIELD,ZSLOPEY) + ! + TZFIELD%CMNHNAME = 'ZS_FILTR' + TZFIELD%CSTDNAME = '' + TZFIELD%CLONGNAME = 'ZS_FILTR' + TZFIELD%CUNITS = 'm' + TZFIELD%CDIR = 'XY' + TZFIELD%CCOMMENT = 'filtred orography' + TZFIELD%NGRID = 4 + TZFIELD%NTYPE = TYPEREAL + TZFIELD%NDIMS = 2 + TZFIELD%LTIMEDEP = .FALSE. + CALL IO_WRITE_FIELD(TPFILE,TZFIELD,ZSMOOTH_ZSINI-ZFINE_ZS) +END IF +!------------------------------------------------------------------------------- +! +!* 5. writes smoothed orographies in the file ! --------------------------------------- ! ! @@ -217,6 +382,14 @@ DEALLOCATE(ZFINE_ZS) DEALLOCATE(ZSMOOTH_ZS) DEALLOCATE(ZSLEVE_ZS) DEALLOCATE(ZMASK) +DEALLOCATE(ZSLOPEX) +DEALLOCATE(ZSLOPEY) +DEALLOCATE(ZSLOPEMX) +DEALLOCATE(ZSLOPEMY) +DEALLOCATE(ZCOFIL) +DEALLOCATE(ZSMOOTH_ZSINI) +! +CALL CLEANLIST_ll(THALO_ll) ! !------------------------------------------------------------------------------- ! diff --git a/src/SURFEX/init_surf_atmn.F90 b/src/SURFEX/init_surf_atmn.F90 index 6e454467d9b2873f4ff877cc14a5906572cfb79f..2c6c776dc8c4efdcea39793fc739980dada1926e 100644 --- a/src/SURFEX/init_surf_atmn.F90 +++ b/src/SURFEX/init_surf_atmn.F90 @@ -55,6 +55,7 @@ SUBROUTINE INIT_SURF_ATM_n (YSC, HPROGRAM,HINIT, OLAND_USE, & !! R. Séférian 03/2014 Adding decoupling between CO2 seen by photosynthesis and radiative CO2 !! M.Leriche & V. Masson 05/16 bug in write emis fields for nest !! (P.Tulet & M.Leriche) 06/2016 add MEGAN coupling +!! J.Escoabr 01/2019 integrate bypass fo albedo pb > 1.0 from Florian Pantillon (Sep 2011) !------------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -219,6 +220,8 @@ REAL :: XTIME0 INTEGER :: ISIZE_FULL ! REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +INTEGER :: JJ !------------------------------------------------------------------------------- ! IF (LHOOK) CALL DR_HOOK('INIT_SURF_ATM_N',0,ZHOOK_HANDLE) @@ -663,6 +666,19 @@ IF (SIZE(PTSURF)>0) & ! DEALLOCATE(ZFRAC_TILE) ! +! MODIF FP SEP 2011 +DO JJ=1,KI + IF (PDIR_ALB(JJ,1)>1.) THEN + WRITE (*,*) 'JJ', JJ + WRITE (*,*) 'PDIR_ALB', PDIR_ALB(JJ,:) + WRITE (*,*) 'PSCA_ALB', PSCA_ALB(JJ,:) + WRITE (*,*) 'PEMIS', PEMIS(JJ) + WRITE (*,*) 'PTSRAD', PTSRAD(JJ) + PDIR_ALB(JJ,:) = 0.5 + PSCA_ALB(JJ,:) = 0.5 + END IF +END DO +! END MODIF FP SEP 2011 !------------------------------------------------------------------------------- !============================================================================== IF (LHOOK) CALL DR_HOOK('INIT_SURF_ATM_N',1,ZHOOK_HANDLE)