diff --git a/docs/TODO b/docs/TODO index e849c953adf25cfa78a33393e65644a9e60cc38d..2904850445616917db387ca0428dc3299ea2ef05 100644 --- a/docs/TODO +++ b/docs/TODO @@ -22,12 +22,14 @@ Merge pb: Ryad a fait des tests pour regarder impact des allocatable sur CPU => temps * 2 Code à nettoyer quelque soit l'option retenue Dernier code de Ryad: /home/gmap/mrpm/khatib/public/modset/mods_ice4_nucleation_wrapper.tgz et/ou /home/gmap/mrpm/khatib/public/modset/ice4_nucleation_wrapper.f90 -- shallow_mf: - Dans Méso-NH: shallow_mf doit être appelé avec PDX=XDXHAT(1) et PDY=XDYHAT(1) - Dans AROME: où trouver la taille de maille? - rain_ice_red: le cas test MesoNH n'est pas bit repro (diffs > 1% sur rapports de melange) sur la modif src/mesonh/rain_ice_red au commit bdd10dd (First rain_ice new/red merge) +- shallow_mf (appels dans aro_shallow et arp_shallow): + Dans Méso-NH: shallow_mf doit être appelé avec PDX=XDXHAT(1) et PDY=XDYHAT(1) + Dans AROME/ARP: où trouver la taille de maille? + Pour l'instant 2 versions à cause de l'interface à compute_uprfat_rhcj10 +- compute_updraft_rhcj10: en attente retour de Rachel et/ou Yves pour faire le merge Etape 2: array syntax -> loop - en profiter pour supprimer args PA/PB des routines appelées depuis ice4_tendencies, comme pour nucleation diff --git a/src/arome/ext/aro_shallow_mf.F90 b/src/arome/ext/aro_shallow_mf.F90 index 2a6a3bf6548bc35254837c64c934037147d2b3c9..4a59175ab8c1a3ebdb725629820e8a1f87b6e109 100644 --- a/src/arome/ext/aro_shallow_mf.F90 +++ b/src/arome/ext/aro_shallow_mf.F90 @@ -222,7 +222,7 @@ ZIMPL=1. CALL SHALLOW_MF(KKA=IKA,KKU=IKU,KKL=KKL,KRR=KRR,KRRL=KRRL,KRRI=KRRI, & &HMF_UPDRAFT=HMF_UPDRAFT, HMF_CLOUD=HMF_CLOUD,HFRAC_ICE=HFRAC_ICE,OMIXUV=OMIXUV, & &ONOMIXLG=ONOMIXLG,KSV_LGBEG=KSV_LGBEG,KSV_LGEND=KSV_LGEND, & - &PIMPL_MF=ZIMPL, PTSTEP=PTSTEP, PTSTEP_MET=PTSTEP, PTSTEP_SV=PTSTEP, & + &PIMPL_MF=ZIMPL, PTSTEP=PTSTEP, & &PDZZ=PDZZF,PZZ=PZZ, & &PRHODJ=PRHODJ,PRHODREF=PRHODREF, & &PPABSM=PPABSM,PEXNM=PEXNM, & @@ -235,7 +235,7 @@ ZIMPL=1. &PTHL_UP=PTHL_UP,PRT_UP=PRT_UP,PRV_UP=PRV_UP,PRC_UP=PRC_UP,PRI_UP=PRI_UP, & &PU_UP=PU_UP, PV_UP=PV_UP, PTHV_UP=PTHV_UP, PW_UP=PW_UP, & &PFRAC_UP=PFRAC_UP,PEMF=PEMF,PDETR=ZDETR,PENTR=ZENTR, & - &KKLCL=IKLCL,KKETL=IKETL,KKCTL=IKCTL ) + &KKLCL=IKLCL,KKETL=IKETL,KKCTL=IKCTL,PDX=0.,PDY=0. ) ! ! !------------------------------------------------------------------------------ diff --git a/src/arome/ext/arp_shallow_mf.F90 b/src/arome/ext/arp_shallow_mf.F90 new file mode 100644 index 0000000000000000000000000000000000000000..f79aee52db64c9364b9ea455f4407b35b9982604 --- /dev/null +++ b/src/arome/ext/arp_shallow_mf.F90 @@ -0,0 +1,455 @@ +! ######spl + SUBROUTINE ARP_SHALLOW_MF(KIDIA,KFDIA,KLON,KTDIA,KLEV,PIMPL,TSPHY,PZZ,PZZF,PR,PCP, & + & CMF_UPDRAFT,CMF_CLOUD,LMIXUV, & + & PU, PV, PT,PQV,PQL,PQI,PQR,PQS,PTKE,PAPRSF, & + & PDELP,PDIFTQ,PDIFTS,PSTRTU,PSTRTV,PSFTH,PSFRV,& + & PRODTH_CVPP,PQLI,PNEB,KNLAB,PMF_UP) + + +! ########################################################################## +! +!!**** * - interface to call SHALLOW_MF : +!! computation of turbulence "mass flux" fluxes and their divergence +!! +!! +!! +!! PURPOSE +!! ------- +!! +!! +!! +!! +!!** METHOD +!! ------ +!! +!! +!! +!! EXTERNAL +!! -------- +!! Subroutine SHALLOW_MF (routine de MesoNH) +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! REFERENCE +!! --------- +!! +!! Documentation ARPEGE +!! +!! AUTHOR +!! ------ +!! Y.Bouteloup from aro_shallow_mf +!! +!! MODIFICATIONS +!! ------------- +!! Original 11/2010 +!! S. Riette shallow_mf now outputs ice cloud +!! S. Riette Jan 2012: support for both order of vertical levels +!! +!------------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ + +USE YOMCST , ONLY : RG, RATM, RKAPPA, RD, RCPD, RCPV + +!USE MODD_PARAMETERS +! +USE MODI_SHALLOW_MF +USE MODD_CST +USE YOMCT3 +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +! +! + +INTEGER, INTENT(IN) :: KIDIA +INTEGER, INTENT(IN) :: KFDIA +INTEGER, INTENT(IN) :: KLON !NPROMA under CPG +INTEGER, INTENT(IN) :: KLEV !Number of vertical levels (bottom of atmosphere in ARP) +INTEGER, INTENT(IN) :: KTDIA !Top of atmosphere in ARPEGE +REAL, INTENT(IN) :: TSPHY ! Time step +REAL, INTENT(IN) :: PIMPL + +CHARACTER (LEN=4), INTENT(IN) :: CMF_UPDRAFT ! Type of Mass Flux Scheme +CHARACTER (LEN=4), INTENT(IN) :: CMF_CLOUD ! Type of statistical cloud scheme +LOGICAL, INTENT(IN) :: LMIXUV ! True if mixing of momentum + +!REAL, DIMENSION(KLON,KLEV+2), INTENT(IN) :: PZZ ! Height of layer boundaries +REAL, DIMENSION(KLON,0:KLEV), INTENT(IN) :: PZZ ! Height of layer boundaries +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PZZF ! Height of level +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PR ! Air gaz constant +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PCP ! Cp +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PU +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PV +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PT +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PQV +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PQL +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PQI +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PQR +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PQS +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PTKE +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PAPRSF +REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PDELP + +REAL, DIMENSION(KLON,0:KLEV), INTENT(INOUT) :: PDIFTQ +REAL, DIMENSION(KLON,0:KLEV), INTENT(INOUT) :: PDIFTS +REAL, DIMENSION(KLON,0:KLEV), INTENT(INOUT) :: PSTRTU +REAL, DIMENSION(KLON,0:KLEV), INTENT(INOUT) :: PSTRTV + +REAL, DIMENSION(KLON,0:KLEV), INTENT(INOUT) :: PRODTH_CVPP +REAL, DIMENSION(KLON,KLEV) , INTENT(INOUT) :: PQLI +REAL, DIMENSION(KLON,KLEV) , INTENT(INOUT) :: PNEB +INTEGER, DIMENSION(KLON,KLEV), INTENT(INOUT) :: KNLAB + +REAL, DIMENSION(KLON,0:KLEV), INTENT(OUT) :: PMF_UP + +! +! normal surface fluxes of theta and Rv +REAL, DIMENSION(KLON), INTENT(IN) :: PSFTH,PSFRV +! prognostic variables at t- deltat +! +!CHARACTER (LEN=14), INTENT(IN) :: CPNAME +! +! +!* 0.2 Declarations of local variables : +! +INTEGER :: JRR ! Loop index for the moist +INTEGER :: IIB ! Define the physical domain +INTEGER :: IIE ! +INTEGER :: IJB ! +INTEGER :: IJE ! +INTEGER :: IKA +INTEGER :: IKB ! +INTEGER :: IKE ! +INTEGER :: IKU +INTEGER :: IKL ! +INTEGER :: IKR ! +INTEGER :: IKRL ! +INTEGER :: IKRI ! +INTEGER :: JI, JJ, JL, JK, JLON, JLEV ! +INTEGER ::II, IUSCM, IKK, ILEV +INTEGER :: ISV_LGBEG, ISV_LGEND, ITCOUNT +INTEGER, DIMENSION(KIDIA:KFDIA) :: IKLCL,IKETL,IKCTL +REAL,DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZFLXZTHMF,ZFLXZRMF,ZFLXZUMF,ZFLXZVMF +REAL,DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZEMF,ZDETR,ZENTR + + +REAL, DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZDZZ,ZZZ,ZTHETA,ZEXNER,ZHRO,ZHRODJ,ZHRODREF +REAL, DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZDUDT_TURB,ZDVDT_TURB,ZDRTDT_TURB,ZDTHLDT_TURB +REAL, DIMENSION(KIDIA:KFDIA,KLEV+2,5) :: ZRM +REAL, DIMENSION(KIDIA:KFDIA) :: ZSFTH,ZSFRV + +REAL :: ZINVG, ZDT, ZEMF_MAX, ZTDCP, ZVMD + +REAL, DIMENSION(KIDIA:KFDIA,KLEV+2,1) :: ZSVM, ZDSVDT_TURB, ZSVDT_MF + +CHARACTER (LEN=4) :: HMF_UPDRAFT, HMF_CLOUD + + +LOGICAL LLOMIXUV, LLONOMIXLG +! +REAL, DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZDUDT_MF ! tendency of U by massflux scheme +REAL, DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZDVDT_MF ! tendency of V by massflux scheme +REAL, DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZDTHLDT_MF ! tendency of thl by massflux scheme +REAL, DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZDRTDT_MF ! tendency of rt by massflux scheme + +REAL, DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZSIGMF,ZRC_MF,ZRI_MF,ZCF_MF ! cloud info for the cloud scheme +REAL, DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZFLXZTHVMF ! Thermal production for TKE scheme +REAL, DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZTHL_UP ! Thl updraft characteristics +REAL, DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZRT_UP ! Rt updraft characteristics +REAL, DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZRV_UP ! Vapor updraft characteristics +REAL, DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZU_UP ! U wind updraft characteristics +REAL, DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZV_UP ! V wind updraft characteristics +REAL, DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZRC_UP ! cloud content updraft characteristics +REAL, DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZRI_UP ! ice content updraft characteristics +REAL, DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZTHV_UP ! Thv updraft characteristics +REAL, DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZW_UP ! vertical speed updraft characteristics +REAL, DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZFRAC_UP ! updraft fraction +REAL, DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZDPSG ! Delta P / g +REAL, DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZFQ_MF ! Flux de qv by massflux scheme +REAL, DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZFH_MF ! Flux d'hentalpy by massflux scheme +REAL, DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZFU_MF +REAL, DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZFV_MF +REAL, DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZQDM + +REAL, DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZAPRSF +REAL, DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZTKE +REAL, DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZU +REAL, DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZV +REAL, DIMENSION(KIDIA:KFDIA,KLEV+2) :: ZZZF + +!------------------------------------------------------------------------------ + +!* 1. PRELIMINARY COMPUTATIONS +! ------------------------ + + +! Controle : + + +! Avec inversion des boucles +IKA=1 ! <== Bottom index of array +IKB=2 ! <== Physical bottom +IKE=KLEV+1 ! <== Physical top +IKU=KLEV+2 ! <== Top index of array +IKL=1 ! <== Loop increment to go from top to bottom + +IIB=KIDIA +IIE=KFDIA +IKR=5 ! <== Number of water species +IKRL=2 +IKRI=2 +ZINVG = 1./RG + +!------------------------------------------------------------------------------ + +!* 2. INITIALISATION + +! --------------- + +! tableau a recalculer a chaque pas de temps +! attention, ZDZZ est l'altitude entre deux niveaux (et pas l'�paisseur de la couche) + +! Inversion des niveaux + +DO JK = IKB , IKE, IKL + DO JL = IIB,IIE + IKK = IKE + 1 - JK + ZAPRSF(JL,JK) = PAPRSF(JL,IKK) + ZTKE (JL,JK) = PTKE (JL,IKK) + ZU (JL,JK) = PU (JL,IKK) + ZV (JL,JK) = PV (JL,IKK) + ENDDO +ENDDO + + +! AROME type initialisation + !initialisation de ZZZ +DO JK = IKB , IKE+1 + DO JL = IIB,IIE + IKK = IKE + 1 - JK + ZZZ(JL,JK) = PZZ(JL,IKK)*ZINVG + ENDDO +ENDDO + + +DO JL = IIB,IIE + ZZZ(JL,1) = 2*ZZZ(JL,2)-ZZZ(JL,3) +ENDDO +!initialisation de ZZZF +DO JK = IKB , IKE + DO JL = IIB,IIE + IKK = IKE + 1 - JK + ZZZF(JL,JK) = PZZF(JL,IKK)*ZINVG + ENDDO +ENDDO +DO JL = IIB,IIE + ZZZF(JL,1)=1.5*ZZZ(JL,2)-0.5*ZZZ(JL,3) + ZZZF(JL,IKE+1)=ZZZF(JL,IKE)+ (ZZZ(JL,IKE+1)-ZZZ(JL,IKE)) + ZDZZ(JL,1)=-999. +ENDDO + +DO JK = IKB , IKE+1 + DO JL = IIB,IIE + ZDZZ(JL,JK)=ZZZF(JL,JK)-ZZZF(JL,JK-1) + ENDDO +ENDDO + +! Inversion des niveaux +DO JL = IIB,IIE + DO JK = IKB , IKE, IKL + IKK = IKE + 1 - JK + ZEXNER(JL,JK)=(ZAPRSF(JL,JK)/RATM)**RKAPPA + ZTHETA(JL,JK)=PT(JL,IKK)/ZEXNER(JL,JK) + ZHRO(JL,JK)=ZAPRSF(JL,JK)/(PT(JL,IKK)*PR(JL,IKK)) + ZQDM(JL,JK)=(1.-PQV(JL,IKK)-PQL(JL,IKK)-PQI(JL,IKK)-PQR(JL,IKK)-PQS(JL,IKK)) + + ZHRODREF(JL,JK)=ZHRO(JL,JK)*ZQDM(JL,JK) + ZHRODJ(JL,JK)=PDELP(JL,IKK)*ZINVG + ZRM(JL,JK,1)=PQV(JL,IKK)/ZQDM(JL,JK) + ZRM(JL,JK,2)=PQL(JL,IKK)/ZQDM(JL,JK) + ZRM(JL,JK,3)=PQR(JL,IKK)/ZQDM(JL,JK) + ZRM(JL,JK,4)=PQI(JL,IKK)/ZQDM(JL,JK) + ZRM(JL,JK,5)=PQS(JL,IKK)/ZQDM(JL,JK) + + ZDPSG(JL,JK) = MAX(1.E-15,PDELP(JL,IKK)/RG) + +! Copy KLEV array into KLEV+2 array, or how to spend cpu time unnecessarily but that's the arome physics rule ! + ENDDO +ENDDO + +ZDUDT_TURB(KIDIA:KFDIA,:) = 0. +ZDVDT_TURB(KIDIA:KFDIA,:) = 0. +ZDRTDT_TURB(KIDIA:KFDIA,:) = 0. +ZDTHLDT_TURB(KIDIA:KFDIA,:) = 0. +ZDSVDT_TURB(KIDIA:KFDIA,:,:)= 0. + +ZSVM(:,:,:)=0. + + ZAPRSF (KIDIA:KFDIA,IKB-IKL) = ZAPRSF (KIDIA:KFDIA,IKB) + ZAPRSF (KIDIA:KFDIA,IKE+IKL) = ZAPRSF (KIDIA:KFDIA,IKE) + ZTKE (KIDIA:KFDIA,IKB-IKL) = ZTKE (KIDIA:KFDIA,IKB) + ZTKE (KIDIA:KFDIA,IKE+IKL) = ZTKE (KIDIA:KFDIA,IKE) + ZU (KIDIA:KFDIA,IKB-IKL) = ZU (KIDIA:KFDIA,IKB) + ZU (KIDIA:KFDIA,IKE+IKL) = ZU (KIDIA:KFDIA,IKE) + ZV (KIDIA:KFDIA,IKB-IKL) = ZV (KIDIA:KFDIA,IKB) + ZV (KIDIA:KFDIA,IKE+IKL) = ZV (KIDIA:KFDIA,IKE) + ZEXNER (KIDIA:KFDIA,IKB-IKL) = ZEXNER (KIDIA:KFDIA,IKB) + ZEXNER (KIDIA:KFDIA,IKE+IKL) = ZEXNER (KIDIA:KFDIA,IKE) + ZTHETA (KIDIA:KFDIA,IKB-IKL) = ZTHETA (KIDIA:KFDIA,IKB) + ZTHETA (KIDIA:KFDIA,IKE+IKL) = ZTHETA (KIDIA:KFDIA,IKE) + ZHRO (KIDIA:KFDIA,IKB-IKL) = ZHRO (KIDIA:KFDIA,IKB) + ZHRO (KIDIA:KFDIA,IKE+IKL) = ZHRO (KIDIA:KFDIA,IKE) + ZQDM (KIDIA:KFDIA,IKB-IKL) = ZQDM (KIDIA:KFDIA,IKB) + ZQDM (KIDIA:KFDIA,IKE+IKL) = ZQDM (KIDIA:KFDIA,IKE) + ZHRODREF(KIDIA:KFDIA,IKB-IKL) = ZHRODREF(KIDIA:KFDIA,IKB) + ZHRODREF(KIDIA:KFDIA,IKE+IKL) = ZHRODREF(KIDIA:KFDIA,IKE) + ZHRODJ (KIDIA:KFDIA,IKB-IKL) = ZHRODJ (KIDIA:KFDIA,IKB) + ZHRODJ (KIDIA:KFDIA,IKE+IKL) = ZHRODJ (KIDIA:KFDIA,IKE) + ZRM (KIDIA:KFDIA,IKB-IKL,1) = ZRM (KIDIA:KFDIA,IKB,1) + ZRM (KIDIA:KFDIA,IKE+IKL,1) = ZRM (KIDIA:KFDIA,IKE,1) + ZRM (KIDIA:KFDIA,IKB-IKL,2) = ZRM (KIDIA:KFDIA,IKB,2) + ZRM (KIDIA:KFDIA,IKE+IKL,2) = ZRM (KIDIA:KFDIA,IKE,2) + ZRM (KIDIA:KFDIA,IKB-IKL,3) = ZRM (KIDIA:KFDIA,IKB,3) + ZRM (KIDIA:KFDIA,IKE+IKL,3) = ZRM (KIDIA:KFDIA,IKE,3) + ZRM (KIDIA:KFDIA,IKB-IKL,4) = ZRM (KIDIA:KFDIA,IKB,4) + ZRM (KIDIA:KFDIA,IKE+IKL,4) = ZRM (KIDIA:KFDIA,IKE,4) + ZRM (KIDIA:KFDIA,IKB-IKL,5) = ZRM (KIDIA:KFDIA,IKB,5) + ZRM (KIDIA:KFDIA,IKE+IKL,5) = ZRM (KIDIA:KFDIA,IKE,5) + ZSVM (KIDIA:KFDIA,IKB-IKL,:) = ZSVM (KIDIA:KFDIA,IKB,:) + ZSVM (KIDIA:KFDIA,IKE+IKL,:) = ZSVM (KIDIA:KFDIA,IKE,:) + ZDUDT_TURB(KIDIA:KFDIA,IKB-IKL) = ZDUDT_TURB(KIDIA:KFDIA,IKB) + ZDUDT_TURB(KIDIA:KFDIA,IKE+IKL) = ZDUDT_TURB(KIDIA:KFDIA,IKE) + ZDVDT_TURB(KIDIA:KFDIA,IKB-IKL) = ZDVDT_TURB(KIDIA:KFDIA,IKB) + ZDVDT_TURB(KIDIA:KFDIA,IKE+IKL) = ZDVDT_TURB(KIDIA:KFDIA,IKE) + ZDTHLDT_TURB(KIDIA:KFDIA,IKB-IKL) = ZDTHLDT_TURB(KIDIA:KFDIA,IKB) + ZDTHLDT_TURB(KIDIA:KFDIA,IKE+IKL) = ZDTHLDT_TURB(KIDIA:KFDIA,IKE) + ZDRTDT_TURB(KIDIA:KFDIA,IKB-IKL) = ZDRTDT_TURB(KIDIA:KFDIA,IKB) + ZDRTDT_TURB(KIDIA:KFDIA,IKE+IKL) = ZDRTDT_TURB(KIDIA:KFDIA,IKE) + ZDSVDT_TURB(KIDIA:KFDIA,IKB-IKL,:)= ZDSVDT_TURB(KIDIA:KFDIA,IKB,:) + ZDSVDT_TURB(KIDIA:KFDIA,IKE+IKL,:)= ZDSVDT_TURB(KIDIA:KFDIA,IKE,:) + +DO JL = IIB,IIE + ZSFTH(JL) = -PSFTH(JL)/ZHRO(JL,IKB)/RCPD + ZSFRV(JL) = -PSFRV(JL)/ZHRO(JL,IKB) +ENDDO + +LLOMIXUV = .TRUE. +HMF_UPDRAFT = CMF_UPDRAFT +HMF_CLOUD = CMF_CLOUD +LLOMIXUV = LMIXUV +LLONOMIXLG = .FALSE. +ISV_LGBEG = 0 +ISV_LGEND = 0 +ITCOUNT = 1 +ZDT = TSPHY + + +! Mise � 0 des tendances + +ZDUDT_MF(:,:) = 0. +ZDVDT_MF(:,:) = 0. +ZDTHLDT_MF(:,:) = 0. +ZDRTDT_MF(:,:) = 0. + +!------------------------------------------------------------------------------ +! +! +!* 3. MULTIPLICATION PAR RHODJ +! POUR OBTENIR LES TERMES SOURCES DE MESONH +! +! ----------------------------------------------- + +! +!------------------------------------------------------------------------------ +! +! +!* 4. APPEL DE LA TURBULENCE MESONH +! +! --------------------------------- + + CALL SHALLOW_MF(KKA=IKA,KKU=IKU,KKL=IKL,KRR=IKR,KRRL=IKRL,KRRI=IKRI, & + HMF_UPDRAFT=HMF_UPDRAFT, HMF_CLOUD=HMF_CLOUD,HFRAC_ICE='N',OMIXUV=LLOMIXUV, & + ONOMIXLG=LLONOMIXLG,KSV_LGBEG=ISV_LGBEG,KSV_LGEND=ISV_LGEND, & + PIMPL_MF=PIMPL, PTSTEP=ZDT, & + PDZZ=ZDZZ,PZZ=ZZZ, & + PRHODJ=ZHRODJ,PRHODREF=ZHRODREF, & + PPABSM=ZAPRSF,PEXNM=ZEXNER, & + PSFTH=ZSFTH,PSFRV=ZSFRV, & + PTHM=ZTHETA,PRM=ZRM,PUM=ZU,PVM=ZV,PTKEM=ZTKE,PSVM=ZSVM, & +! Output + PDUDT_MF=ZDUDT_MF,PDVDT_MF=ZDVDT_MF, & + PDTHLDT_MF=ZDTHLDT_MF,PDRTDT_MF=ZDRTDT_MF,PDSVDT_MF=ZSVDT_MF, & + PSIGMF=ZSIGMF,PRC_MF=ZRC_MF,PRI_MF=ZRI_MF,PCF_MF=ZCF_MF,PFLXZTHVMF=ZFLXZTHVMF, & + PFLXZTHMF=ZFLXZTHMF,PFLXZRMF=ZFLXZRMF,PFLXZUMF=ZFLXZUMF,PFLXZVMF=ZFLXZVMF,& + PTHL_UP=ZTHL_UP,PRT_UP=ZRT_UP,PRV_UP=ZRV_UP,PRC_UP=ZRC_UP,PRI_UP=ZRI_UP, & + PU_UP=ZU_UP, PV_UP=ZV_UP, PTHV_UP=ZTHV_UP, PW_UP=ZW_UP, & + PFRAC_UP=ZFRAC_UP,PEMF=ZEMF,PDETR=ZDETR,PENTR=ZENTR, & + KKLCL=IKLCL,KKETL=IKETL,KKCTL=IKCTL, & +! + PDX=0., PDY=0.) + + +! Conversion des tendances de theta en tendance de cpT +! et conversion en qi en multipliant par qd +! Puis calcul des flux + +ZFQ_MF(:,:) = 0. +ZFH_MF(:,:) = 0. +ZFU_MF(:,:) = 0. +ZFV_MF(:,:) = 0. + + +ZVMD=RCPV-RCPD + +DO JL = IIB,IIE + DO JK = IKE , IKB, -IKL ! Loop from top to bottom + + IKK = IKE + 1 - JK + + ZFQ_MF(JL,JK) = ZFQ_MF(JL,JK+IKL) - ZDPSG(JL,JK)*ZDRTDT_MF(JL,JK)*ZQDM(JL,JK) + ZTDCP=ZVMD*ZDRTDT_MF(JL,JK) + + + + ZFH_MF(JL,JK) = ZFH_MF(JL,JK+IKL) - ZDPSG(JL,JK) & + & * (ZDTHLDT_MF(JL,JK)*ZEXNER(JL,JK)*(PCP(JL,IKK)+TSPHY*ZTDCP)+PT(JL,IKK)*ZTDCP) + +! ZFH_MF(JL,JK) = ZFH_MF(JL,JK+IKL) - ZDPSG(JL,JK) & +! & * (ZDTHLDT_MF(JL,JK)*ZEXNER(JL,JK)*PCP(JL,IKK)+PT(JL,IKK)*ZTDCP) + + ZFU_MF(JL,JK) = ZFU_MF(JL,JK+IKL) - ZDPSG(JL,JK)*ZDUDT_MF(JL,JK) + ZFV_MF(JL,JK) = ZFV_MF(JL,JK+IKL) - ZDPSG(JL,JK)*ZDVDT_MF(JL,JK) + ENDDO +ENDDO + +ZRC_UP(:,:) = ZRC_UP(:,:)*ZFRAC_UP(:,:) +ZRI_UP(:,:) = ZRI_UP(:,:)*ZFRAC_UP(:,:) +PRODTH_CVPP(:,:) = 0. + + +! stockage dans les flux turbulents (Inversion des niveaux !) + +DO JL = IIB,IIE + DO JK = IKE , IKB, -IKL ! Loop from top to bottom + IKK = IKE + 1 - JK + PDIFTQ(JL,IKK) = PDIFTQ(JL,IKK) + ZFQ_MF(JL,JK) + PDIFTS(JL,IKK) = PDIFTS(JL,IKK) + ZFH_MF(JL,JK) + PSTRTU(JL,IKK) = PSTRTU(JL,IKK) + ZFU_MF(JL,JK) + PSTRTV(JL,IKK) = PSTRTV(JL,IKK) + ZFV_MF(JL,JK) + PRODTH_CVPP(JL,IKK) = RG/ZTHETA(JL,JK)*ZFLXZTHVMF(JL,JK) + +! Shallow cloud information + PQLI (JL,IKK) = (ZRC_MF(JL,JK)+ZRI_MF(JL,JK))/(1.+ZRT_UP(JL,JK)) ! with HFRAC_ICE='N', ZRI_MF=0 + KNLAB (JL,IKK) = INT(MAX(0.,SIGN(1.,PQLI(JL,IKK)-1.E-8))) + PNEB (JL,IKK) = ZCF_MF(JL,JK) + PMF_UP(JL,IKK) = -ZEMF(JL,JK)/ZHRODREF(JL,JK) ! <== On ne sort pas le flux de masse mais +! ! ce dont on aura besoin dans ACDIFV1 !!!!!!! + ENDDO +ENDDO + +END SUBROUTINE ARP_SHALLOW_MF diff --git a/src/common/turb/mode_mf_turb.F90 b/src/common/turb/mode_mf_turb.F90 index 3dc558e35e70494711e15e886faace1cbe413e08..7f9e698ce2f108aa9b5fc33d8a6ccbfdaa2f0d40 100644 --- a/src/common/turb/mode_mf_turb.F90 +++ b/src/common/turb/mode_mf_turb.F90 @@ -68,6 +68,9 @@ USE MODE_TRIDIAG_MASSFLUX, ONLY: TRIDIAG_MASSFLUX USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK +! IMPLICIT NONE ! ! diff --git a/src/arome/turb/modi_shallow_mf.F90 b/src/common/turb/modi_shallow_mf.F90 similarity index 93% rename from src/arome/turb/modi_shallow_mf.F90 rename to src/common/turb/modi_shallow_mf.F90 index 944ea3450dd6d66fb0098706e2742e812525863c..23559eeec6a0afd8573c7c913de4933267eb154b 100644 --- a/src/arome/turb/modi_shallow_mf.F90 +++ b/src/common/turb/modi_shallow_mf.F90 @@ -7,7 +7,7 @@ INTERFACE SUBROUTINE SHALLOW_MF(KKA,KKU,KKL,KRR,KRRL,KRRI, & HMF_UPDRAFT, HMF_CLOUD, HFRAC_ICE, OMIXUV, & ONOMIXLG,KSV_LGBEG,KSV_LGEND, & - PIMPL_MF, PTSTEP, PTSTEP_MET, PTSTEP_SV, & + PIMPL_MF, PTSTEP, & PDZZ, PZZ, & PRHODJ, PRHODREF, & PPABSM, PEXNM, & @@ -20,7 +20,7 @@ INTERFACE PTHL_UP,PRT_UP,PRV_UP,PRC_UP,PRI_UP, & PU_UP, PV_UP, PTHV_UP, PW_UP, & PFRAC_UP,PEMF,PDETR,PENTR, & - KKLCL,KKETL,KKCTL ) + KKLCL,KKETL,KKCTL,PDX,PDY ) ! ################################################################# !! ! @@ -43,9 +43,7 @@ LOGICAL, INTENT(IN) :: ONOMIXLG ! False if mixing of lagrangia INTEGER, INTENT(IN) :: KSV_LGBEG ! first index of lag. tracer INTEGER, INTENT(IN) :: KSV_LGEND ! last index of lag. tracer REAL, INTENT(IN) :: PIMPL_MF ! degre of implicitness -REAL, INTENT(IN) :: PTSTEP ! Dynamical timestep -REAL, INTENT(IN) :: PTSTEP_MET! Timestep for meteorological variables -REAL, INTENT(IN) :: PTSTEP_SV! Timestep for tracer variables +REAL, INTENT(IN) :: PTSTEP ! Dynamical timestep REAL, DIMENSION(:,:), INTENT(IN) :: PZZ ! Height of flux point REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! Metric coefficients @@ -89,6 +87,7 @@ REAL, DIMENSION(:,:), INTENT(INOUT) :: PEMF ! updraft mass flux REAL, DIMENSION(:,:), INTENT(OUT) :: PDETR ! updraft detrainment REAL, DIMENSION(:,:), INTENT(OUT) :: PENTR ! updraft entrainment INTEGER,DIMENSION(:), INTENT(OUT) :: KKLCL,KKETL,KKCTL ! level of LCL,ETL and CTL +REAL, INTENT(IN) :: PDX, PDY END SUBROUTINE SHALLOW_MF diff --git a/src/arome/turb/shallow_mf.F90 b/src/common/turb/shallow_mf.F90 similarity index 78% rename from src/arome/turb/shallow_mf.F90 rename to src/common/turb/shallow_mf.F90 index e5c5c59b075bc132cea1eacedf172110933a0d06..b042f80a0670bdd5e045fa09af8f8a856450ec4a 100644 --- a/src/arome/turb/shallow_mf.F90 +++ b/src/common/turb/shallow_mf.F90 @@ -1,8 +1,13 @@ -! ######spl +!MNH_LIC Copyright 1994-2021 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. +!----------------------------------------------------------------- +! ################################################################ SUBROUTINE SHALLOW_MF(KKA,KKU,KKL,KRR,KRRL,KRRI, & HMF_UPDRAFT, HMF_CLOUD, HFRAC_ICE, OMIXUV, & ONOMIXLG,KSV_LGBEG,KSV_LGEND, & - PIMPL_MF, PTSTEP, PTSTEP_MET, PTSTEP_SV, & + PIMPL_MF, PTSTEP, & PDZZ, PZZ, & PRHODJ, PRHODREF, & PPABSM, PEXNM, & @@ -15,10 +20,8 @@ PTHL_UP,PRT_UP,PRV_UP,PRC_UP,PRI_UP, & PU_UP, PV_UP, PTHV_UP, PW_UP, & PFRAC_UP,PEMF,PDETR,PENTR, & - KKLCL,KKETL,KKCTL ) + KKLCL,KKETL,KKCTL,PDX,PDY ) - USE PARKIND1, ONLY : JPRB - USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! ################################################################# !! !!**** *SHALLOW_MF* - @@ -53,7 +56,16 @@ !! S. Riette 18 May 2010 interface changed due to ice correction !! S.Riette DUAL case !! S. Riette Jan 2012: support for both order of vertical levels +!! R.Honnert 07/2012 : elemnts of Rio according to Bouteloup +!! R.Honnert 07/2012 : MF gray zone +!! R.Honnert 10/2016 : SURF=gray zone initilisation + EDKF +!! R.Honnert 10/2016 : Update with Arome !! S. Riette Nov 2016: HFRAC_ICE support +!! Philippe Wautelet 28/05/2018: corrected truncated integer division (2/3 -> 2./3.) +!! Q.Rodier 01/2019 : support RM17 mixing length +!! R.Honnert 1/2019 : remove SURF +! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg +! R. Honnert 04/2021: remove HRIO and BOUT schemes !! -------------------------------------------------------------------------- ! !* 0. DECLARATIONS @@ -70,6 +82,9 @@ USE MODE_COMPUTE_UPDRAFT_RAHA, ONLY: COMPUTE_UPDRAFT_RAHA USE MODE_MF_TURB, ONLY: MF_TURB USE MODE_MF_TURB_EXPL, ONLY: MF_TURB_EXPL USE MODE_COMPUTE_MF_CLOUD, ONLY: COMPUTE_MF_CLOUD +USE MODE_MSG, ONLY: PRINT_MSG, NVERB_FATAL +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! IMPLICIT NONE @@ -83,19 +98,17 @@ INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from grou INTEGER, INTENT(IN) :: KRR ! number of moist var. INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. INTEGER, INTENT(IN) :: KRRI ! number of ice water var. -CHARACTER (LEN=4), INTENT(IN) :: HMF_UPDRAFT ! Type of Mass Flux Scheme +CHARACTER(LEN=4), INTENT(IN) :: HMF_UPDRAFT ! Type of Mass Flux Scheme ! 'NONE' if no parameterization -CHARACTER (LEN=4), INTENT(IN) :: HMF_CLOUD ! Type of statistical cloud +CHARACTER(LEN=4), INTENT(IN) :: HMF_CLOUD ! Type of statistical cloud ! scheme -CHARACTER*1, INTENT(IN) :: HFRAC_ICE ! partition liquid/ice scheme +CHARACTER(LEN=1), INTENT(IN) :: HFRAC_ICE ! partition liquid/ice scheme LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum LOGICAL, INTENT(IN) :: ONOMIXLG ! False if mixing of lagrangian tracer INTEGER, INTENT(IN) :: KSV_LGBEG ! first index of lag. tracer INTEGER, INTENT(IN) :: KSV_LGEND ! last index of lag. tracer REAL, INTENT(IN) :: PIMPL_MF ! degre of implicitness -REAL, INTENT(IN) :: PTSTEP ! Dynamical timestep -REAL, INTENT(IN) :: PTSTEP_MET! Timestep for meteorological variables -REAL, INTENT(IN) :: PTSTEP_SV! Timestep for tracer variables +REAL, INTENT(IN) :: PTSTEP ! Dynamical timestep REAL, DIMENSION(:,:), INTENT(IN) :: PZZ ! Height of flux point REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! Metric coefficients @@ -127,7 +140,7 @@ REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZUMF REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZVMF REAL, DIMENSION(:,:), INTENT(INOUT) :: PTHL_UP ! Thl updraft characteristics REAL, DIMENSION(:,:), INTENT(INOUT) :: PRT_UP ! Rt updraft characteristics -REAL, DIMENSION(:,:), INTENT(OUT) :: PRV_UP ! Vapor updraft characteristics +REAL, DIMENSION(:,:), INTENT(INOUT) :: PRV_UP ! Vapor updraft characteristics REAL, DIMENSION(:,:), INTENT(INOUT) :: PU_UP ! U wind updraft characteristics REAL, DIMENSION(:,:), INTENT(INOUT) :: PV_UP ! V wind updraft characteristics REAL, DIMENSION(:,:), INTENT(INOUT) :: PRC_UP ! cloud content updraft characteristics @@ -139,6 +152,7 @@ REAL, DIMENSION(:,:), INTENT(INOUT) :: PEMF ! updraft mass flux REAL, DIMENSION(:,:), INTENT(OUT) :: PDETR ! updraft detrainment REAL, DIMENSION(:,:), INTENT(OUT) :: PENTR ! updraft entrainment INTEGER,DIMENSION(:), INTENT(OUT) :: KKLCL,KKETL,KKCTL ! level of LCL,ETL and CTL +REAL, INTENT(IN) :: PDX, PDY ! ! 0.2 Declaration of local variables ! @@ -147,7 +161,6 @@ REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: & ZRTM, & ! ZTHVM, & ! ZEMF_O_RHODREF, & ! entrainment/detrainment - ZTHVDT,ZTHDT,ZRVDT, & ! tendencies ZBUO_INTEG ! integrated buoyancy REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZFRAC_ICE @@ -162,15 +175,11 @@ LOGICAL :: GENTR_DETR ! flag to recompute entrainment, detrainment and mass flu INTEGER :: IKB ! near ground physical index INTEGER :: IKE ! uppest atmosphere physical index INTEGER, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: IERR +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE !------------------------------------------------------------------------ !!! 1. Initialisation - -REAL(KIND=JPRB) :: ZHOOK_HANDLE - -REAL :: PDX=0., PDY=0. - - IF (LHOOK) CALL DR_HOOK('SHALLOW_MF',0,ZHOOK_HANDLE) ! vertical boundaries @@ -178,7 +187,7 @@ IKB=KKA+KKL*JPVEXT IKE=KKU-KKL*JPVEXT ! updraft governing variables -IF (HMF_UPDRAFT == 'EDKF') THEN +IF (HMF_UPDRAFT == 'EDKF' .OR. HMF_UPDRAFT == 'RHCJ') THEN PENTR = 1.E20 PDETR = 1.E20 PEMF = 1.E20 @@ -187,9 +196,11 @@ ENDIF ! Thermodynamics functions ZFRAC_ICE(:,:) = 0. -WHERE(PRM(:,:,2)+PRM(:,:,4) > 1.E-20) - ZFRAC_ICE(:,:) = PRM(:,:,4) / (PRM(:,:,2)+PRM(:,:,4)) -ENDWHERE +IF (SIZE(PRM,3).GE.4) THEN + WHERE(PRM(:,:,2)+PRM(:,:,4) > 1.E-20) + ZFRAC_ICE(:,:) = PRM(:,:,4) / (PRM(:,:,2)+PRM(:,:,4)) + ENDWHERE +ENDIF CALL COMPUTE_FRAC_ICE(HFRAC_ICE,ZFRAC_ICE(:,:),PTHM(:,:)*PEXNM(:,:), IERR(:,:)) ! Conservative variables at t-dt @@ -218,7 +229,8 @@ IF (HMF_UPDRAFT == 'EDKF') THEN PENTR,ZBUO_INTEG,KKLCL,KKETL,KKCTL,ZDEPTH,& PDX,PDY) ELSEIF (HMF_UPDRAFT == 'RHCJ') THEN - CALL COMPUTE_UPDRAFT_RHCJ10(KKA,IKB,IKE,KKU,KKL,HFRAC_ICE,GENTR_DETR,OMIXUV,& + GENTR_DETR = .TRUE. + CALL COMPUTE_UPDRAFT_RHCJ10(KKA,IKB,IKE,KKU,KKL,HFRAC_ICE,GENTR_DETR,OMIXUV,& ONOMIXLG,KSV_LGBEG,KSV_LGEND, & PZZ,PDZZ, & PSFTH,PSFRV,PPABSM,PRHODREF, & @@ -229,23 +241,24 @@ ELSEIF (HMF_UPDRAFT == 'RHCJ') THEN PFRAC_UP,ZFRAC_ICE_UP,ZRSAT_UP,PEMF,PDETR,& PENTR,ZBUO_INTEG,KKLCL,KKETL,KKCTL,ZDEPTH ) ELSEIF (HMF_UPDRAFT == 'RAHA') THEN - CALL COMPUTE_UPDRAFT_RAHA(KKA,IKB,IKE,KKU,KKL,HFRAC_ICE,GENTR_DETR,OMIXUV,& + CALL COMPUTE_UPDRAFT_RAHA(KKA,IKB,IKE,KKU,KKL,HFRAC_ICE, & + GENTR_DETR,OMIXUV, & ONOMIXLG,KSV_LGBEG,KSV_LGEND, & PZZ,PDZZ, & - PSFTH,PSFRV,PPABSM,PRHODREF, & - PUM,PVM,PTKEM, & - PEXNM,PTHM,PRM(:,:,1),ZTHLM,ZRTM,PSVM, & - PTHL_UP,PRT_UP,PRV_UP,PRC_UP,PRI_UP, & - PTHV_UP, PW_UP, PU_UP, PV_UP, ZSV_UP, & - PFRAC_UP,ZFRAC_ICE_UP,ZRSAT_UP,PEMF,PDETR,& - PENTR,ZBUO_INTEG,KKLCL,KKETL,KKCTL,ZDEPTH ) + PSFTH,PSFRV, & + PPABSM,PRHODREF,PUM,PVM,PTKEM, & + PEXNM,PTHM,PRM(:,:,1),ZTHLM,ZRTM, & + PSVM,PTHL_UP,PRT_UP, & + PRV_UP,PRC_UP,PRI_UP, PTHV_UP, & + PW_UP, PU_UP, PV_UP, ZSV_UP, & + PFRAC_UP,ZFRAC_ICE_UP,ZRSAT_UP, & + PEMF,PDETR,PENTR, & + ZBUO_INTEG,KKLCL,KKETL,KKCTL, & + ZDEPTH ) ELSEIF (HMF_UPDRAFT == 'DUAL') THEN !Updraft characteristics are already computed and received by interface ELSE - WRITE(*,*) ' STOP' - WRITE(*,*) ' NO UPDRAFT MODEL FOR EDKF : CMF_UPDRAFT =',HMF_UPDRAFT - CALL ABORT - STOP + CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'SHALLOW_MF', 'no updraft model for EDKF: CMF_UPDRAFT='//TRIM(HMF_UPDRAFT) ) ENDIF !!! 5. Compute diagnostic convective cloud fraction and content @@ -269,7 +282,7 @@ CALL COMPUTE_MF_CLOUD(KKA,IKB,IKE,KKU,KKL,KRR,KRRL,KRRI,& ZEMF_O_RHODREF=PEMF/PRHODREF IF ( PIMPL_MF > 1.E-10 ) THEN - CALL MF_TURB(KKA, IKB, IKE, KKU, KKL, OMIXUV, & + CALL MF_TURB(KKA, IKB, IKE, KKU, KKL, OMIXUV, & ONOMIXLG,KSV_LGBEG,KSV_LGEND, & PIMPL_MF, PTSTEP, & PDZZ, & @@ -280,12 +293,12 @@ IF ( PIMPL_MF > 1.E-10 ) THEN PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF, & ZFLXZSVMF ) ELSE - CALL MF_TURB_EXPL(KKA, IKB, IKE, KKU, KKL, OMIXUV, & - PRHODJ, & - ZTHLM,ZTHVM,ZRTM,PUM,PVM, & - PDTHLDT_MF,PDRTDT_MF,PDUDT_MF,PDVDT_MF, & - ZEMF_O_RHODREF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP, & - PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF) + CALL MF_TURB_EXPL(KKA, IKB, IKE, KKU, KKL, OMIXUV, & + PRHODJ, & + ZTHLM,ZTHVM,ZRTM,PUM,PVM, & + PDTHLDT_MF,PDRTDT_MF,PDUDT_MF,PDVDT_MF, & + ZEMF_O_RHODREF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP, & + PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF) ENDIF ! security in the case HMF_UPDRAFT = 'DUAL' diff --git a/src/mesonh/turb/shallow_mf.f90 b/src/mesonh/turb/shallow_mf.f90 index 7f3c32b646fc86f0d6d534465f3a290062578473..63baa06c7e5eb79b6dee4ef0c08b1b3b5b988d04 100644 --- a/src/mesonh/turb/shallow_mf.f90 +++ b/src/mesonh/turb/shallow_mf.f90 @@ -3,103 +3,6 @@ !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt !MNH_LIC for details. version 1. !----------------------------------------------------------------- -! ######spl - MODULE MODI_SHALLOW_MF -! ###################### -! -INTERFACE -! ################################################################# - SUBROUTINE SHALLOW_MF(KKA,KKU,KKL,KRR,KRRL,KRRI, & - HMF_UPDRAFT, HMF_CLOUD, HFRAC_ICE, OMIXUV, & - ONOMIXLG,KSV_LGBEG,KSV_LGEND, & - PIMPL_MF, PTSTEP, & - PDZZ, PZZ, & - PRHODJ, PRHODREF, & - PPABSM, PEXNM, & - PSFTH,PSFRV, & - PTHM,PRM,PUM,PVM,PTKEM,PSVM, & - PDUDT_MF,PDVDT_MF, & - PDTHLDT_MF,PDRTDT_MF,PDSVDT_MF, & - PSIGMF,PRC_MF,PRI_MF,PCF_MF,PFLXZTHVMF, & - PFLXZTHMF,PFLXZRMF,PFLXZUMF,PFLXZVMF, & - PTHL_UP,PRT_UP,PRV_UP,PRC_UP,PRI_UP, & - PU_UP, PV_UP, PTHV_UP, PW_UP, & - PFRAC_UP,PEMF,PDETR,PENTR, & - KKLCL,KKETL,KKCTL,PDX,PDY ) -! ################################################################# -!! -! -!* 1.1 Declaration of Arguments -! -! -INTEGER, INTENT(IN) :: KKA ! near ground array index -INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -INTEGER, INTENT(IN) :: KRR ! number of moist var. -INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. -INTEGER, INTENT(IN) :: KRRI ! number of ice water var. -CHARACTER (LEN=4), INTENT(IN) :: HMF_UPDRAFT ! Type of Mass Flux Scheme - ! 'NONE' if no parameterization -CHARACTER (LEN=4), INTENT(IN) :: HMF_CLOUD ! Type of statistical cloud - ! scheme -CHARACTER(len=1), INTENT(IN) :: HFRAC_ICE ! partition liquid/ice scheme -LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum -LOGICAL, INTENT(IN) :: ONOMIXLG ! False if mixing of lagrangian tracer -INTEGER, INTENT(IN) :: KSV_LGBEG ! first index of lag. tracer -INTEGER, INTENT(IN) :: KSV_LGEND ! last index of lag. tracer -REAL, INTENT(IN) :: PIMPL_MF ! degre of implicitness -REAL, INTENT(IN) :: PTSTEP ! Dynamical timestep - -REAL, DIMENSION(:,:), INTENT(IN) :: PZZ ! Height of flux point -REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! Metric coefficients -REAL, DIMENSION(:,:), INTENT(IN) :: PRHODJ ! dry density * Grid size -REAL, DIMENSION(:,:), INTENT(IN) :: PRHODREF ! dry density of the - ! reference state -REAL, DIMENSION(:,:), INTENT(IN) :: PPABSM ! Pressure at time t-1 -REAL, DIMENSION(:,:), INTENT(IN) :: PEXNM ! Exner function at t-dt - -REAL, DIMENSION(:), INTENT(IN) :: PSFTH,PSFRV ! normal surface fluxes of theta and Rv -REAL, DIMENSION(:,:), INTENT(IN) :: PTHM ! Theta at t-dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PRM ! water var. at t-dt -REAL, DIMENSION(:,:), INTENT(IN) :: PUM,PVM ! wind components at t-dt -REAL, DIMENSION(:,:), INTENT(IN) :: PTKEM ! tke at t-dt - -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSVM ! scalar variable a t-dt - -REAL, DIMENSION(:,:), INTENT(OUT):: PDUDT_MF ! tendency of U by massflux scheme -REAL, DIMENSION(:,:), INTENT(OUT):: PDVDT_MF ! tendency of V by massflux scheme -REAL, DIMENSION(:,:), INTENT(OUT):: PDTHLDT_MF ! tendency of thl by massflux scheme -REAL, DIMENSION(:,:), INTENT(OUT):: PDRTDT_MF ! tendency of rt by massflux scheme -REAL, DIMENSION(:,:,:), INTENT(OUT):: PDSVDT_MF ! tendency of Sv by massflux scheme - -REAL, DIMENSION(:,:), INTENT(OUT) :: PSIGMF,PRC_MF,PRI_MF,PCF_MF ! cloud info for the cloud scheme -REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZTHVMF ! Thermal production for TKE scheme -REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZTHMF -REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZRMF -REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZUMF -REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZVMF -REAL, DIMENSION(:,:), INTENT(INOUT) :: PTHL_UP ! Thl updraft characteristics -REAL, DIMENSION(:,:), INTENT(INOUT) :: PRT_UP ! Rt updraft characteristics -REAL, DIMENSION(:,:), INTENT(INOUT) :: PRV_UP ! Vapor updraft characteristics -REAL, DIMENSION(:,:), INTENT(INOUT) :: PU_UP ! U wind updraft characteristics -REAL, DIMENSION(:,:), INTENT(INOUT) :: PV_UP ! V wind updraft characteristics - -REAL, DIMENSION(:,:), INTENT(INOUT) :: PRC_UP ! cloud content updraft characteristics -REAL, DIMENSION(:,:), INTENT(INOUT) :: PRI_UP ! ice content updraft characteristics -REAL, DIMENSION(:,:), INTENT(INOUT) :: PTHV_UP ! Thv updraft characteristics -REAL, DIMENSION(:,:), INTENT(INOUT) :: PW_UP ! vertical speed updraft characteristics -REAL, DIMENSION(:,:), INTENT(INOUT) :: PFRAC_UP ! updraft fraction -REAL, DIMENSION(:,:), INTENT(INOUT) :: PEMF ! updraft mass flux -REAL, DIMENSION(:,:), INTENT(OUT) :: PDETR ! updraft detrainment -REAL, DIMENSION(:,:), INTENT(OUT) :: PENTR ! updraft entrainment -INTEGER,DIMENSION(:), INTENT(OUT) :: KKLCL,KKETL,KKCTL ! level of LCL,ETL and CTL - -REAL, INTENT(IN) :: PDX, PDY -END SUBROUTINE SHALLOW_MF - -END INTERFACE -! -END MODULE MODI_SHALLOW_MF ! ################################################################ SUBROUTINE SHALLOW_MF(KKA,KKU,KKL,KRR,KRRL,KRRI, & HMF_UPDRAFT, HMF_CLOUD, HFRAC_ICE, OMIXUV, & @@ -157,6 +60,7 @@ END MODULE MODI_SHALLOW_MF !! R.Honnert 07/2012 : MF gray zone !! R.Honnert 10/2016 : SURF=gray zone initilisation + EDKF !! R.Honnert 10/2016 : Update with Arome +!! S. Riette Nov 2016: HFRAC_ICE support !! Philippe Wautelet 28/05/2018: corrected truncated integer division (2/3 -> 2./3.) !! Q.Rodier 01/2019 : support RM17 mixing length !! R.Honnert 1/2019 : remove SURF @@ -170,22 +74,17 @@ 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 MODE_THL_RT_FROM_TH_R_MF -USE MODE_COMPUTE_UPDRAFT -USE MODE_COMPUTE_UPDRAFT_RHCJ10 +USE MODE_COMPUTE_UPDRAFT, ONLY: COMPUTE_UPDRAFT +USE MODE_COMPUTE_UPDRAFT_RHCJ10, ONLY: COMPUTE_UPDRAFT_RHCJ10 USE MODE_COMPUTE_UPDRAFT_RAHA, ONLY: COMPUTE_UPDRAFT_RAHA USE MODE_MF_TURB, ONLY: MF_TURB USE MODE_MF_TURB_EXPL, ONLY: MF_TURB_EXPL -USE MODI_MF_TURB_GREYZONE USE MODE_COMPUTE_MF_CLOUD, ONLY: COMPUTE_MF_CLOUD -USE MODI_SHUMAN_MF -! -USE MODE_COMPUTE_BL89_ML -USE MODD_GRID_n, ONLY : XDXHAT, XDYHAT -USE MODD_REF_n, ONLY : XTHVREF -USE MODE_MSG +USE MODE_MSG, ONLY: PRINT_MSG, NVERB_FATAL +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! IMPLICIT NONE @@ -199,11 +98,11 @@ INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from grou INTEGER, INTENT(IN) :: KRR ! number of moist var. INTEGER, INTENT(IN) :: KRRL ! number of liquid water var. INTEGER, INTENT(IN) :: KRRI ! number of ice water var. -CHARACTER (LEN=4), INTENT(IN) :: HMF_UPDRAFT ! Type of Mass Flux Scheme +CHARACTER(LEN=4), INTENT(IN) :: HMF_UPDRAFT ! Type of Mass Flux Scheme ! 'NONE' if no parameterization -CHARACTER (LEN=4), INTENT(IN) :: HMF_CLOUD ! Type of statistical cloud +CHARACTER(LEN=4), INTENT(IN) :: HMF_CLOUD ! Type of statistical cloud ! scheme -CHARACTER(len=1), INTENT(IN) :: HFRAC_ICE ! partition liquid/ice scheme +CHARACTER(LEN=1), INTENT(IN) :: HFRAC_ICE ! partition liquid/ice scheme LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum LOGICAL, INTENT(IN) :: ONOMIXLG ! False if mixing of lagrangian tracer INTEGER, INTENT(IN) :: KSV_LGBEG ! first index of lag. tracer @@ -267,27 +166,21 @@ REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZFRAC_ICE REAL, DIMENSION(SIZE(PSVM,1),SIZE(PSVM,2),SIZE(PSVM,3)) :: & ZSV_UP,& ! updraft scalar var. - ZSV_DO,& ! updraft scalar var. ZFLXZSVMF ! Flux 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 INTEGER :: IKE ! uppest atmosphere physical index -! pour bouttle et al. -REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZG_O_THVREF,PTHVREF -REAL, DIMENSION(SIZE(PTHM,1)) :: ZRESOL_NORM, ZRESOL_GRID,& ! normalized grid - ZLUP, ZPLAW -! Test if the ascent continue, if LCL or ETL is reached -LOGICAL :: GLMIX -INTEGER :: JI,JJ,JK ! loop counter INTEGER, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: IERR +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE !------------------------------------------------------------------------ !!! 1. Initialisation +IF (LHOOK) CALL DR_HOOK('SHALLOW_MF',0,ZHOOK_HANDLE) ! vertical boundaries IKB=KKA+KKL*JPVEXT @@ -365,7 +258,7 @@ ELSEIF (HMF_UPDRAFT == 'RAHA') THEN ELSEIF (HMF_UPDRAFT == 'DUAL') THEN !Updraft characteristics are already computed and received by interface ELSE - call Print_msg( NVERB_FATAL, 'GEN', 'SHALLOW_MF', 'no updraft model for EDKF: CMF_UPDRAFT='//trim(HMF_UPDRAFT) ) + CALL PRINT_MSG( NVERB_FATAL, 'GEN', 'SHALLOW_MF', 'no updraft model for EDKF: CMF_UPDRAFT='//TRIM(HMF_UPDRAFT) ) ENDIF !!! 5. Compute diagnostic convective cloud fraction and content @@ -387,30 +280,27 @@ CALL COMPUTE_MF_CLOUD(KKA,IKB,IKE,KKU,KKL,KRR,KRRL,KRRI,& !!! ------------------------------------------------------------------------ ! ZEMF_O_RHODREF=PEMF/PRHODREF -IF(HMF_UPDRAFT == 'EDKF' .OR. HMF_UPDRAFT == 'RHCJ') THEN - IF ( PIMPL_MF > 1.E-10 ) THEN - CALL MF_TURB(KKA, IKB, IKE, KKU, KKL, OMIXUV, & - ONOMIXLG,KSV_LGBEG,KSV_LGEND, & - PIMPL_MF, PTSTEP, & - PDZZ, & - PRHODJ, & - ZTHLM,ZTHVM,ZRTM,PUM,PVM,PSVM, & - PDTHLDT_MF,PDRTDT_MF,PDUDT_MF,PDVDT_MF,PDSVDT_MF, & - ZEMF_O_RHODREF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP,ZSV_UP,& - PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF, & - ZFLXZSVMF ) - ELSE - CALL MF_TURB_EXPL(KKA, IKB, IKE, KKU, KKL, OMIXUV, & - PRHODJ, & - ZTHLM,ZTHVM,ZRTM,PUM,PVM, & - PDTHLDT_MF,PDRTDT_MF,PDUDT_MF,PDVDT_MF, & - ZEMF_O_RHODREF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP, & - PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF) - ENDIF + +IF ( PIMPL_MF > 1.E-10 ) THEN + CALL MF_TURB(KKA, IKB, IKE, KKU, KKL, OMIXUV, & + ONOMIXLG,KSV_LGBEG,KSV_LGEND, & + PIMPL_MF, PTSTEP, & + PDZZ, & + PRHODJ, & + ZTHLM,ZTHVM,ZRTM,PUM,PVM,PSVM, & + PDTHLDT_MF,PDRTDT_MF,PDUDT_MF,PDVDT_MF,PDSVDT_MF, & + ZEMF_O_RHODREF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP,ZSV_UP,& + PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF, & + ZFLXZSVMF ) ELSE - call Print_msg( NVERB_FATAL, 'GEN', 'SHALLOW_MF', 'no updraft model for EDKF: CMF_UPDRAFT='//trim(HMF_UPDRAFT) ) -END IF - + CALL MF_TURB_EXPL(KKA, IKB, IKE, KKU, KKL, OMIXUV, & + PRHODJ, & + ZTHLM,ZTHVM,ZRTM,PUM,PVM, & + PDTHLDT_MF,PDRTDT_MF,PDUDT_MF,PDVDT_MF, & + ZEMF_O_RHODREF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP, & + PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF) +ENDIF + ! security in the case HMF_UPDRAFT = 'DUAL' ! to be modified if 'DUAL' is evolving (momentum mixing for example) IF( HMF_UPDRAFT == 'DUAL') THEN @@ -421,6 +311,7 @@ IF( HMF_UPDRAFT == 'DUAL') THEN ! PDVDT_MF=0. ENDIF ! +IF (LHOOK) CALL DR_HOOK('SHALLOW_MF',1,ZHOOK_HANDLE) CONTAINS INCLUDE "compute_frac_ice.func.h" !