diff --git a/docs/Interfaces b/docs/Interfaces index 52762422500f377f3ca809e617f8b91b642f53a3..a233c0e9d195229feaf8887c232326d1b096a995 100644 --- a/docs/Interfaces +++ b/docs/Interfaces @@ -18,5 +18,8 @@ Dependencies: - budget - mode_msg, modd_io - modd_precision +- modd_cst +- yomhook, parkind1 + diff --git a/docs/TODO b/docs/TODO index aaa81626da190c008c80017a801b134c4ba00b5d..eb46ff8bb1c42921906761f37106db3184de1c94 100644 --- a/docs/TODO +++ b/docs/TODO @@ -9,3 +9,8 @@ Dependencies: - créer des codes pour le driver - liste dans document Interfaces - pour AROME placés, en attendant, dans phyex/externals + +Clé de compilation REPRO48 ajoutée pour permettre de reproduire le cycle 48, elle: +- contourne des corrections de bug +- modifie l'organisation de calculs +Cette clé devra être supprimée diff --git a/src/arome/turb/compute_updraft.F90 b/src/arome/turb/compute_updraft.F90 index 3480e0d50915cbd66658b2db79520cca366f670b..8ba4d1c567308de0dde16fbc00d96e017c4c4a4a 100644 --- a/src/arome/turb/compute_updraft.F90 +++ b/src/arome/turb/compute_updraft.F90 @@ -49,6 +49,7 @@ !! 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 !! S. Riette Apr 2013: improvement of continuity at the condensation level +!! Q.Rodier 01/2019 : support RM17 mixing length !! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -56,6 +57,7 @@ ! USE MODD_CST USE MODD_CMFSHALL +USE MODD_TURB_n, ONLY : CTURBLEN USE MODI_COMPUTE_ENTR_DETR USE MODI_TH_R_FROM_THL_RT_1D @@ -170,6 +172,7 @@ REAL, DIMENSION(SIZE(PTHM,1)) :: ZRC_UP, ZRI_UP, ZRV_UP,& REAL :: ZDEPTH_MAX1, ZDEPTH_MAX2 ! control auto-extinction process REAL :: ZTMAX,ZRMAX ! control value +REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZSHEAR,ZDUDZ,ZDVDZ ! vertical wind shear REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('COMPUTE_UPDRAFT',0,ZHOOK_HANDLE) @@ -291,8 +294,19 @@ 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,.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) + PRINT*, 'phasage bete sans controle' + CALL ABORT + STOP + 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,.TRUE.,ZSHEAR,ZLUP) ZLUP(:)=MAX(ZLUP(:),1.E-10) ! Compute Buoyancy flux at the ground diff --git a/src/arome/turb/compute_updraft_rhcj10.F90 b/src/arome/turb/compute_updraft_rhcj10.F90 index e28b53ad9a2fa9b4083fed7da802a1315c729962..14f0b6ae68f2f53203e9096e4cdb74f6bae6fc48 100644 --- a/src/arome/turb/compute_updraft_rhcj10.F90 +++ b/src/arome/turb/compute_updraft_rhcj10.F90 @@ -44,6 +44,7 @@ !! Y. Bouteloup (2012) !! R. Honert Janv 2013 ==> corection of some coding bugs !! R. El Khatib 15-Oct-2014 Optimization +!! Q.Rodier 01/2019 : support RM17 mixing length !! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -51,7 +52,7 @@ ! USE MODD_CST USE MODD_CMFSHALL - +USE MODD_TURB_n, ONLY : CTURBLEN USE MODI_TH_R_FROM_THL_RT_1D USE MODI_SHUMAN_MF @@ -177,6 +178,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 REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('COMPUTE_UPDRAFT_RHCJ10',0,ZHOOK_HANDLE) @@ -322,9 +324,20 @@ ENDDO ! 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_F,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) + PRINT*, 'phasage bete sans controle' + CALL ABORT + STOP +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,.FALSE.,ZSHEAR,ZLUP) ZLUP(:)=MAX(ZLUP(:),1.E-10) DO JI=1,IIJU diff --git a/src/arome/turb/modd_turbn.F90 b/src/arome/turb/modd_turbn.F90 new file mode 100644 index 0000000000000000000000000000000000000000..3d11a7b591941538033c61d4e9fa3e1f71b1d8d1 --- /dev/null +++ b/src/arome/turb/modd_turbn.F90 @@ -0,0 +1,3 @@ +MODULE MODD_TURB_n + CHARACTER (LEN=4), SAVE :: CTURBLEN='BL89' +ENDMODULE MODD_TURB_n diff --git a/src/arome/turb/modi_bl89.F90 b/src/arome/turb/modi_bl89.F90 index cc334a48540f6cb76f9d2c35a3c9b203dbc87fd6..e451772994675a8640f6cce983666f77da09a8aa 100644 --- a/src/arome/turb/modi_bl89.F90 +++ b/src/arome/turb/modi_bl89.F90 @@ -2,7 +2,7 @@ MODULE MODI_BL89 ! ################ INTERFACE - SUBROUTINE BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,PTHLM,KRR,PRM,PTKEM,PLM) + SUBROUTINE BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,PTHLM,KRR,PRM,PTKEM,PSHEAR,PLM) ! INTEGER, INTENT(IN) :: KKA INTEGER, INTENT(IN) :: KKU @@ -14,6 +14,7 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHLM INTEGER, INTENT(IN) :: KRR REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PRM REAL, DIMENSION(:,:,:), INTENT(IN) :: PTKEM +REAL, DIMENSION(:,:,:), INTENT(IN) :: PSHEAR REAL, DIMENSION(:,:,:), INTENT(OUT) :: PLM END SUBROUTINE BL89 diff --git a/src/arome/turb/modi_compute_bl89_ml.F90 b/src/arome/turb/modi_compute_bl89_ml.F90 index 7d9c50e82b2076526ba33a1e2677c4e83d5d57d8..c42759094d59acf316dad60bd0f7ae0b13fa7a31 100644 --- a/src/arome/turb/modi_compute_bl89_ml.F90 +++ b/src/arome/turb/modi_compute_bl89_ml.F90 @@ -6,7 +6,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 @@ -16,14 +16,16 @@ INTEGER, INTENT(IN) :: KKB ! near ground physical inde INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ2D -REAL, DIMENSION(:), INTENT(IN) :: PTKEM_DEP -REAL, DIMENSION(:), INTENT(IN) :: PG_O_THVREF -REAL, DIMENSION(:,:), INTENT(IN) :: PVPT -INTEGER, INTENT(IN) :: KK -LOGICAL, INTENT(IN) :: OUPORDN +REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ2D ! height difference between two mass levels +REAL, DIMENSION(:), INTENT(IN) :: PTKEM_DEP ! TKE to consume +REAL, DIMENSION(:), INTENT(IN) :: PG_O_THVREF ! g/ThetaVRef at the departure point +REAL, DIMENSION(:,:), INTENT(IN) :: PVPT ! ThetaV on mass levels +INTEGER, INTENT(IN) :: KK ! index of departure level +LOGICAL, INTENT(IN) :: OUPORDN ! switch to compute upward (true) or + ! downward (false) mixing length LOGICAL, INTENT(IN) :: OFLUX ! Computation must be done from flux level -REAL, DIMENSION(:), INTENT(OUT) :: PLWORK +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 diff --git a/src/arome/turb/turb.F90 b/src/arome/turb/turb.F90 index 3e52f07833d187f8b94318ebd68269f9b2c15d2a..6b219e33fd20d346984e1538fedd9f8f3df925d5 100644 --- a/src/arome/turb/turb.F90 +++ b/src/arome/turb/turb.F90 @@ -446,6 +446,7 @@ REAL :: ZALPHA ! proportionnality constant between Dz/2 and ! ! BL89 mixing length near the surface ! REAL :: ZTIME1, ZTIME2 +REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3)):: ZSHEAR, ZDUDZ, ZDVDZ ! !* 1.PRELIMINARIES ! ------------- @@ -607,7 +608,8 @@ SELECT CASE (HTURBLEN) ! ------------------ CASE ('BL89') - CALL BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKEM,ZLM) + ZSHEAR=0. + CALL BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKEM,ZSHEAR,ZLM) ! !* 3.2 Delta mixing length ! ------------------- @@ -1516,7 +1518,8 @@ ELSE !* 3.1 BL89 mixing length ! ------------------ CASE ('BL89') - CALL BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKEM,ZLM_CLOUD) + ZSHEAR=0. + CALL BL89(KKA,KKU,KKL,PZZ,PDZZ,PTHVREF,ZTHLM,KRR,ZRM,PTKEM,ZSHEAR,ZLM_CLOUD) ! !* 3.2 Delta mixing length ! ------------------- diff --git a/src/common/turb/bl89.f90 b/src/common/turb/bl89.F90 similarity index 96% rename from src/common/turb/bl89.f90 rename to src/common/turb/bl89.F90 index 303d92d262407a571fbe894e1da0274d1626abf3..57056e4815f6fb65ae1ff202472d58ed1f7810c6 100644 --- a/src/common/turb/bl89.f90 +++ b/src/common/turb/bl89.F90 @@ -136,6 +136,7 @@ IF (CPROGRAM=='AROME ') THEN ZZZ (:,JK) = PZZ (:,1,JK) ZDZZ (:,JK) = PDZZ (:,1,JK) ZTHM (:,JK) = PTHLM (:,1,JK) + ZSHEAR (:,JK) = PSHEAR (:,1,JK) ZTKEM (:,JK) = PTKEM (:,1,JK) ZG_O_THVREF(:,JK) = XG/PTHVREF(:,1,JK) END DO @@ -236,7 +237,11 @@ DO JK=IKTB,IKTE + sqrt(abs( (XRM17*ZSHEAR(J1D,JKK)*ZSQRT_TKE(J1D,JK) & + ( -ZG_O_THVREF(J1D,JK) * (ZVPT(J1D,JKK) - ZVPT(J1D,JK)) ))**2.0 + & 2. * ZINTE(J1D) * & +#ifdef REPRO48 + ZG_O_THVREF(J1D,JK) * ZDELTVPT(J1D,JKK)/ ZDZZ(J1D,JKK)))) / & +#else (ZG_O_THVREF(J1D,JK) * ZDELTVPT(J1D,JKK)/ ZDZZ(J1D,JKK))))) / & +#endif (ZG_O_THVREF(J1D,JK) * ZDELTVPT(J1D,JKK) / ZDZZ(J1D,JKK)) ZLWORK(J1D)=ZLWORK(J1D)+ZTEST0*(ZTEST*ZLWORK1+(1-ZTEST)*ZLWORK2) ZINTE(J1D) = ZINTE(J1D) - ZPOTE @@ -263,6 +268,7 @@ DO JK=IKTB,IKTE IF(ZTESTM > 0.) THEN ZTESTM=0. DO J1D=1,IIU*IJU + ZTEST0=0.5+SIGN(0.5,ZINTE(J1D)) !--------- SHEAR + STABILITY ----------- ZPOTE = ZTEST0* & (ZG_O_THVREF(J1D,JK)*(ZHLVPT(J1D,JKK)-ZVPT(J1D,JK)) & @@ -278,7 +284,11 @@ DO JK=IKTB,IKTE (XRM17*ZSHEAR(J1D,JKK)*ZSQRT_TKE(J1D,JK) & + ( ZG_O_THVREF(J1D,JK) * (ZVPT(J1D,JKK-KKL) - ZVPT(J1D,JK))) )**2 & + 2. * ZINTE(J1D) * & - ( ZG_O_THVREF(J1D,JK)* ZDELTVPT(J1D,JKK)/ZDZZ(J1D,JKK))))) / & +#ifdef REPRO48 + ZG_O_THVREF(J1D,JK)* ZDELTVPT(J1D,JKK)/ZDZZ(J1D,JKK)))) / & +#else + (ZG_O_THVREF(J1D,JK)* ZDELTVPT(J1D,JKK)/ZDZZ(J1D,JKK))))) / & +#endif (ZG_O_THVREF(J1D,JK) * ZDELTVPT(J1D,JKK) / ZDZZ(J1D,JKK)) ZLWORK(J1D)=ZLWORK(J1D)+ZTEST0*(ZTEST*ZLWORK1+(1-ZTEST)*ZLWORK2) ZINTE(J1D) = ZINTE(J1D) - ZPOTE @@ -294,8 +304,13 @@ DO JK=IKTB,IKTE ZLWORK1=MAX(ZLMDN(J1D,JK),1.E-10_MNHREAL) ZLWORK2=MAX(ZLWORK(J1D),1.E-10_MNHREAL) ZPOTE = ZLWORK1 / ZLWORK2 +#ifdef REPRO48 + ZLWORK2=1.d0 + ZPOTE**(2./3.) + ZLM(J1D,JK) = Z2SQRT2*ZLWORK1/(ZLWORK2*SQRT(ZLWORK2)) +#else ZLWORK2=1.d0 + ZPOTE**ZBL89EXP ZLM(J1D,JK) = ZLWORK1*(2./ZLWORK2)**ZUSRBL89 +#endif END DO ZLM(:,JK)=MAX(ZLM(:,JK),XLINI) diff --git a/src/common/turb/compute_bl89_ml.f90 b/src/common/turb/compute_bl89_ml.F90 similarity index 97% rename from src/common/turb/compute_bl89_ml.f90 rename to src/common/turb/compute_bl89_ml.F90 index 5a75011c8ed80ee7d7a3b364136a9ecff36168ea..897bfc12fab3710b1e672d573cc197fa7d24007e 100644 --- a/src/common/turb/compute_bl89_ml.f90 +++ b/src/common/turb/compute_bl89_ml.F90 @@ -127,9 +127,9 @@ IF (OUPORDN.EQV..TRUE.) THEN ! Lenght travelled by parcel to nullify energy ZLWORK2(J1D)= ( - PG_O_THVREF(J1D) * & ( ZHLVPT(J1D,KK) - ZVPT_DEP(J1D) ) & - - XRM17*PSHEAR(J1D,JKK)*SQRT(ABS(PTKEM_DEP(J1D))) & + - XRM17*PSHEAR(J1D,KK)*SQRT(ABS(PTKEM_DEP(J1D))) & + SQRT (ABS( & - (XRM17*PSHEAR(J1D,JKK)*SQRT(ABS(PTKEM_DEP(J1D))) + & + (XRM17*PSHEAR(J1D,KK)*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) )) ) / & @@ -194,7 +194,7 @@ IF (OUPORDN.EQV..FALSE.) THEN 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( & diff --git a/src/common/turb/sbl_depth.f90 b/src/common/turb/sbl_depth.F90 similarity index 100% rename from src/common/turb/sbl_depth.f90 rename to src/common/turb/sbl_depth.F90