diff --git a/docs/TODO b/docs/TODO index 3a497a2c80faa9eca027e5bafb50b398f14e7d41..a0fc5122a0890ef580290cadf4c11a12d98a1d72 100644 --- a/docs/TODO +++ b/docs/TODO @@ -89,4 +89,4 @@ rain_ice: - séparer l'avance temporelle du découpage en sous-blocs en créant une couche driver supplémentaire. Cette couche pourrait avoir différentes implémentations (filtre LLMICRO seul, filtre LLMICRO + découpage en sous-blocs, filtre LLMICRO + découpage en sous-blocs en respectant les colonnes, en passant tous les points) - mettre le code des interpolations linéaires et bi-linéaires dans des routines avec deux implémentations: avec et sans packing -Dans shallow_mf (et toutes les routines appelées en-dessous) il faut remplacer l'utilisation des D%NIB, D%NIE, D%NIT par ce qui sera utilisé dans la turbulence +shallow_mf_pack devrait être récrit pour appeler directement shallow_mf sans recopier les tableaux pour les changer de forme diff --git a/src/arome/aux/mode_fill_dimphyexn.F90 b/src/arome/aux/mode_fill_dimphyexn.F90 index 433d98a0b3ea7bc00e75b1874c119619074ed546..713626623be77fd4c66933c2acb987075744999c 100644 --- a/src/arome/aux/mode_fill_dimphyexn.F90 +++ b/src/arome/aux/mode_fill_dimphyexn.F90 @@ -64,6 +64,10 @@ YDDIMPHYEX%NJT=KJT YDDIMPHYEX%NJB=1 YDDIMPHYEX%NJE=KJT ! +YDDIMPHYEX%NIJT=KIT*KJT +YDDIMPHYEX%NIJB=1 +YDDIMPHYEX%NIJE=KIE +! YDDIMPHYEX%NKL=-1 YDDIMPHYEX%NKT=KKT YDDIMPHYEX%NKA=KKT diff --git a/src/common/aux/modd_dimphyexn.F90 b/src/common/aux/modd_dimphyexn.F90 index d7493616a103843aaa48c917a9abab65b8d2f587..ecdcdc9853eb08f74b92e313313176dfd1d826d4 100644 --- a/src/common/aux/modd_dimphyexn.F90 +++ b/src/common/aux/modd_dimphyexn.F90 @@ -70,6 +70,10 @@ TYPE DIMPHYEX_t INTEGER :: NJBC ! = NIB/NJC/NIE/NJE in all schemes INTEGER :: NIEC ! except in turbulence where external HALO points must be INTEGER :: NJEC ! included so NIBC=NJBC=1 and NIEC/NJEC=NIT/NJT + ! + INTEGER :: NIJT ! NIT*NJT for horizontal packing + INTEGER :: NIJB ! First horizontal inner mass point index + INTEGER :: NIJE ! Last horizontal inner mass point index ! END TYPE DIMPHYEX_t ! diff --git a/src/common/turb/mode_compute_bl89_ml.F90 b/src/common/turb/mode_compute_bl89_ml.F90 index 8a8449608426da7b4f40f19053268cde75d8d0f6..78fce621f169d4d6d32bbf976d28c99f346232fb 100644 --- a/src/common/turb/mode_compute_bl89_ml.F90 +++ b/src/common/turb/mode_compute_bl89_ml.F90 @@ -55,25 +55,25 @@ IMPLICIT NONE TYPE(DIMPHYEX_t), INTENT(IN) :: D TYPE(CST_t), INTENT(IN) :: CST TYPE(CSTURB_t), INTENT(IN) :: CSTURB -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PDZZ2D ! height difference between two mass levels -REAL, DIMENSION(D%NIT), INTENT(IN) :: PTKEM_DEP ! TKE to consume -REAL, DIMENSION(D%NIT), INTENT(IN) :: PG_O_THVREF ! g/ThetaVRef at the departure point -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PVPT ! ThetaV on mass levels +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDZZ2D ! height difference between two mass levels +REAL, DIMENSION(D%NIJT), INTENT(IN) :: PTKEM_DEP ! TKE to consume +REAL, DIMENSION(D%NIJT), INTENT(IN) :: PG_O_THVREF ! g/ThetaVRef at the departure point +REAL, DIMENSION(D%NIJT,D%NKT), 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(D%NIT), INTENT(OUT) :: PLWORK ! Resulting mixing length -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PSHEAR ! vertical wind shear for RM17 mixing length +REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PLWORK ! Resulting mixing length +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PSHEAR ! vertical wind shear for RM17 mixing length ! 0.2 Local variable ! -REAL, DIMENSION(D%NIT) :: ZLWORK1,ZLWORK2 ! Temporary mixing length -REAL, DIMENSION(D%NIT) :: ZINTE,ZPOTE ! TKE and potential energy +REAL, DIMENSION(D%NIJT) :: ZLWORK1,ZLWORK2 ! Temporary mixing length +REAL, DIMENSION(D%NIJT) :: ZINTE,ZPOTE ! TKE and potential energy ! between 2 levels -REAL, DIMENSION(D%NIT) :: ZVPT_DEP ! Thetav on departure point +REAL, DIMENSION(D%NIJT) :: ZVPT_DEP ! Thetav on departure point ! -REAL, DIMENSION(D%NIT,D%NKT) :: ZDELTVPT,ZHLVPT +REAL, DIMENSION(D%NIJT,D%NKT) :: ZDELTVPT,ZHLVPT !Virtual Potential Temp at Half level and DeltaThv between !2 mass levels @@ -113,7 +113,7 @@ IF (OUPORDN.EQV..TRUE.) THEN IF(OFLUX)THEN ZVPT_DEP(:)=ZHLVPT(:,KK) ! departure point is on flux level !We must compute what happens between flux level KK and mass level KK - DO J1D=1,D%NIT + DO J1D=D%NIJB,D%NIJE 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) * & @@ -147,7 +147,7 @@ IF (OUPORDN.EQV..TRUE.) THEN DO JKK=KK+D%NKL,D%NKE,D%NKL IF(ZTESTM > 0.) THEN ZTESTM=0 - DO J1D=1,D%NIT + DO J1D=D%NIJB,D%NIJE ZTEST0=0.5+SIGN(0.5,ZINTE(J1D)) ZPOTE(J1D) = ZTEST0*(PG_O_THVREF(J1D) * & (ZHLVPT(J1D,JKK) - ZVPT_DEP(J1D)) & @@ -186,7 +186,7 @@ IF (OUPORDN.EQV..FALSE.) THEN DO JKK=KK,D%NKB,-D%NKL IF(ZTESTM > 0.) THEN ZTESTM=0 - DO J1D=1,D%NIT + DO J1D=D%NIJB,D%NIJE ZTEST0=0.5+SIGN(0.5,ZINTE(J1D)) ZPOTE(J1D) = ZTEST0*(-PG_O_THVREF(J1D) * & (ZHLVPT(J1D,JKK) - PVPT(J1D,KK)) & diff --git a/src/common/turb/mode_compute_function_thermo_mf.F90 b/src/common/turb/mode_compute_function_thermo_mf.F90 index 265a8c5cd77fd8425d3b17ce6dd0ac3b3b077120..4538f7191f2c275db007112529df99210e72498a 100644 --- a/src/common/turb/mode_compute_function_thermo_mf.F90 +++ b/src/common/turb/mode_compute_function_thermo_mf.F90 @@ -66,21 +66,21 @@ 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. -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PTH ! theta -REAL, DIMENSION(D%NIT,D%NKT,KRR), INTENT(IN) :: PR ! water species -REAL, DIMENSION(D%NIT,D%NKT) , INTENT(IN) :: PPABS,PEXN ! pressure, Exner funct. -REAL, DIMENSION(D%NIT,D%NKT) , INTENT(IN) :: PFRAC_ICE ! ice fraction +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTH ! theta +REAL, DIMENSION(D%NIJT,D%NKT,KRR), INTENT(IN) :: PR ! water species +REAL, DIMENSION(D%NIJT,D%NKT) , INTENT(IN) :: PPABS,PEXN ! pressure, Exner funct. +REAL, DIMENSION(D%NIJT,D%NKT) , INTENT(IN) :: PFRAC_ICE ! ice fraction -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PT ! temperature +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PT ! temperature -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PAMOIST,PATHETA +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PAMOIST,PATHETA ! !------------------------------------------------------------------------------- ! !* 0.2 Declarations of local variables ! REAL :: ZEPS ! XMV / XMD -REAL, DIMENSION(D%NIT,D%NKT) :: & +REAL, DIMENSION(D%NIJT,D%NKT) :: & ZCP, & ! Cp ZE, & ! Saturation mixing ratio ZDEDT, & ! Saturation mixing ratio derivative @@ -90,7 +90,7 @@ REAL, DIMENSION(D%NIT,D%NKT) :: & ZATHETA_I, & ! ZLVOCP,ZLSOCP -INTEGER :: JRR +INTEGER :: JRR, JI, JK REAL(KIND=JPRB) :: ZHOOK_HANDLE ! !------------------------------------------------------------------------------- @@ -104,115 +104,133 @@ IF (LHOOK) CALL DR_HOOK('COMPUTE_FUNCTION_THERMO_MF',0,ZHOOK_HANDLE) ! ZCP=CST%XCPD -IF (KRR > 0) ZCP(:,:) = ZCP(:,:) + CST%XCPV * PR(:,:,1) +IF (KRR > 0) THEN + !$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) + ZCP(D%NIJB:D%NIJE,D%NKTB:D%NKTE) = ZCP(D%NIJB:D%NIJE,D%NKTB:D%NKTE) + CST%XCPV * PR(D%NIJB:D%NIJE,D%NKTB:D%NKTE,1) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) +ENDIF DO JRR = 2,1+KRRL ! loop on the liquid components - ZCP(:,:) = ZCP(:,:) + CST%XCL * PR(:,:,JRR) + !$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) + ZCP(D%NIJB:D%NIJE,D%NKTB:D%NKTE) = ZCP(D%NIJB:D%NIJE,D%NKTB:D%NKTE) + CST%XCL * PR(D%NIJB:D%NIJE,D%NKTB:D%NKTE,JRR) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) END DO -DO JRR = 2+KRRL,1+KRRL+KRRI ! loop on the solid components - ZCP(:,:) = ZCP(:,:) + CST%XCI * PR(:,:,JRR) +DO JRR = 2+KRRL,1+KRRL+KRRI ! loop on the solid components + !$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) + ZCP(D%NIJB:D%NIJE,D%NKTB:D%NKTE) = ZCP(D%NIJB:D%NIJE,D%NKTB:D%NKTE) + CST%XCI * PR(D%NIJB:D%NIJE,D%NKTB:D%NKTE,JRR) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) END DO !* Temperature ! -PT(:,:) = PTH(:,:) * PEXN(:,:) +!$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) +PT(D%NIJB:D%NIJE,D%NKTB:D%NKTE) = PTH(D%NIJB:D%NIJE,D%NKTB:D%NKTE) * PEXN(D%NIJB:D%NIJE,D%NKTB:D%NKTE) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) ! ! !! Liquid water ! IF ( KRRL >= 1 ) THEN -! -!* Lv/Cph -! - ZLVOCP(:,:) = (CST%XLVTT + (CST%XCPV-CST%XCL) * (PT(:,:)-CST%XTT) ) / ZCP(:,:) -! -!* Saturation vapor pressure with respect to water -! - ZE(:,:) = EXP( CST%XALPW - CST%XBETAW/PT(:,:) - CST%XGAMW*ALOG( PT(:,:) ) ) -! -!* Saturation mixing ratio with respect to water -! - ZE(:,:) = ZE(:,:) * ZEPS / ( PPABS(:,:) - ZE(:,:) ) -! -!* Compute the saturation mixing ratio derivative (rvs') -! - ZDEDT(:,:) = ( CST%XBETAW / PT(:,:) - CST%XGAMW ) / PT(:,:) & - * ZE(:,:) * ( 1. + ZE(:,:) / ZEPS ) -! -!* Compute Amoist -! - ZAMOIST_W(:,:)= 0.5 / ( 1.0 + ZDEDT(:,:) * ZLVOCP(:,:) ) -! -!* Compute Atheta -! - ZATHETA_W(:,:)= ZAMOIST_W(:,:) * PEXN(:,:) * & - ( ( ZE(:,:) - PR(:,:,1) ) * ZLVOCP(:,:) / & - ( 1. + ZDEDT(:,:) * ZLVOCP(:,:) ) * & + !$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) + ! + !* Lv/Cph + ! + ZLVOCP(D%NIJB:D%NIJE,D%NKTB:D%NKTE) = (CST%XLVTT + (CST%XCPV-CST%XCL) * (PT(D%NIJB:D%NIJE,D%NKTB:D%NKTE)-CST%XTT) ) / & + & ZCP(D%NIJB:D%NIJE,D%NKTB:D%NKTE) + ! + !* Saturation vapor pressure with respect to water + ! + ZE(D%NIJB:D%NIJE,D%NKTB:D%NKTE) = EXP(CST%XALPW - CST%XBETAW/PT(D%NIJB:D%NIJE,D%NKTB:D%NKTE) - & + &CST%XGAMW*ALOG( PT(D%NIJB:D%NIJE,D%NKTB:D%NKTE) ) ) + ! + !* Saturation mixing ratio with respect to water + ! + ZE(D%NIJB:D%NIJE,D%NKTB:D%NKTE) = ZE(D%NIJB:D%NIJE,D%NKTB:D%NKTE) * ZEPS / & + & ( PPABS(D%NIJB:D%NIJE,D%NKTB:D%NKTE) - ZE(D%NIJB:D%NIJE,D%NKTB:D%NKTE) ) + ! + !* Compute the saturation mixing ratio derivative (rvs') + ! + ZDEDT(D%NIJB:D%NIJE,D%NKTB:D%NKTE) = (CST%XBETAW/PT(D%NIJB:D%NIJE,D%NKTB:D%NKTE) - CST%XGAMW) / PT(D%NIJB:D%NIJE,D%NKTB:D%NKTE)& + * ZE(D%NIJB:D%NIJE,D%NKTB:D%NKTE) * ( 1. + ZE(D%NIJB:D%NIJE,D%NKTB:D%NKTE) / ZEPS ) + ! + !* Compute Amoist + ! + ZAMOIST_W(D%NIJB:D%NIJE,D%NKTB:D%NKTE)= 0.5 / ( 1.0 + ZDEDT(D%NIJB:D%NIJE,D%NKTB:D%NKTE) * ZLVOCP(D%NIJB:D%NIJE,D%NKTB:D%NKTE) ) + ! + !* Compute Atheta + ! + ZATHETA_W(D%NIJB:D%NIJE,D%NKTB:D%NKTE)= ZAMOIST_W(D%NIJB:D%NIJE,D%NKTB:D%NKTE) * PEXN(D%NIJB:D%NIJE,D%NKTB:D%NKTE) * & + ( ( ZE(D%NIJB:D%NIJE,D%NKTB:D%NKTE) - PR(D%NIJB:D%NIJE,D%NKTB:D%NKTE,1) ) * ZLVOCP(D%NIJB:D%NIJE,D%NKTB:D%NKTE) / & + ( 1. + ZDEDT(D%NIJB:D%NIJE,D%NKTB:D%NKTE) * ZLVOCP(D%NIJB:D%NIJE,D%NKTB:D%NKTE) ) * & ( & - ZE(:,:) * (1. + ZE(:,:)/ZEPS) & - * ( -2.*CST%XBETAW/PT(:,:) + CST%XGAMW ) / PT(:,:)**2 & - +ZDEDT(:,:) * (1. + 2. * ZE(:,:)/ZEPS) & - * ( CST%XBETAW/PT(:,:) - CST%XGAMW ) / PT(:,:) & + ZE(D%NIJB:D%NIJE,D%NKTB:D%NKTE) * (1. + ZE(D%NIJB:D%NIJE,D%NKTB:D%NKTE)/ZEPS) & + * ( -2.*CST%XBETAW/PT(D%NIJB:D%NIJE,D%NKTB:D%NKTE) + CST%XGAMW ) / PT(D%NIJB:D%NIJE,D%NKTB:D%NKTE)**2 & + +ZDEDT(D%NIJB:D%NIJE,D%NKTB:D%NKTE) * (1. + 2. * ZE(D%NIJB:D%NIJE,D%NKTB:D%NKTE)/ZEPS) & + * ( CST%XBETAW/PT(D%NIJB:D%NIJE,D%NKTB:D%NKTE) - CST%XGAMW ) / PT(D%NIJB:D%NIJE,D%NKTB:D%NKTE) & ) & - - ZDEDT(:,:) & + - ZDEDT(D%NIJB:D%NIJE,D%NKTB:D%NKTE) & ) - -! -!! Solid water -! + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) + ! + !! Solid water + ! IF ( KRRI >= 1 ) THEN - -! -!* Ls/Cph -! - ZLSOCP(:,:) = (CST%XLSTT + (CST%XCPV-CST%XCI) * (PT(:,:)-CST%XTT) ) / ZCP(:,:) -! -!* Saturation vapor pressure with respect to ice -! - ZE(:,:) = EXP( CST%XALPI - CST%XBETAI/PT(:,:) - CST%XGAMI*ALOG( PT(:,:) ) ) -! -!* Saturation mixing ratio with respect to ice -! - ZE(:,:) = ZE(:,:) * ZEPS / ( PPABS(:,:) - ZE(:,:) ) -! -!* Compute the saturation mixing ratio derivative (rvs') -! - ZDEDT(:,:) = ( CST%XBETAI / PT(:,:) - CST%XGAMI ) / PT(:,:) & - * ZE(:,:) * ( 1. + ZE(:,:) / ZEPS ) -! -!* Compute Amoist -! - ZAMOIST_I(:,:)= 0.5 / ( 1.0 + ZDEDT(:,:) * ZLSOCP(:,:) ) -! -!* Compute Atheta -! - ZATHETA_I(:,:)= ZAMOIST_I(:,:) * PEXN(:,:) * & - ( ( ZE(:,:) - PR(:,:,1) ) * ZLSOCP(:,:) / & - ( 1. + ZDEDT(:,:) * ZLSOCP(:,:) ) * & + !$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) + ! + !* Ls/Cph + ! + ZLSOCP(D%NIJB:D%NIJE,D%NKTB:D%NKTE) = (CST%XLSTT + (CST%XCPV-CST%XCI) * (PT(D%NIJB:D%NIJE,D%NKTB:D%NKTE)-CST%XTT) ) / & + & ZCP(D%NIJB:D%NIJE,D%NKTB:D%NKTE) + ! + !* Saturation vapor pressure with respect to ice + ! + ZE(D%NIJB:D%NIJE,D%NKTB:D%NKTE) = EXP(CST%XALPI - CST%XBETAI/PT(D%NIJB:D%NIJE,D%NKTB:D%NKTE) - & + &CST%XGAMI*ALOG( PT(D%NIJB:D%NIJE,D%NKTB:D%NKTE) ) ) + ! + !* Saturation mixing ratio with respect to ice + ! + ZE(D%NIJB:D%NIJE,D%NKTB:D%NKTE) = ZE(D%NIJB:D%NIJE,D%NKTB:D%NKTE) * ZEPS / & + & ( PPABS(D%NIJB:D%NIJE,D%NKTB:D%NKTE) - ZE(D%NIJB:D%NIJE,D%NKTB:D%NKTE) ) + ! + !* Compute the saturation mixing ratio derivative (rvs') + ! + ZDEDT(D%NIJB:D%NIJE,D%NKTB:D%NKTE) = (CST%XBETAI/PT(D%NIJB:D%NIJE,D%NKTB:D%NKTE) - CST%XGAMI) /PT(D%NIJB:D%NIJE,D%NKTB:D%NKTE)& + * ZE(D%NIJB:D%NIJE,D%NKTB:D%NKTE) * ( 1. + ZE(D%NIJB:D%NIJE,D%NKTB:D%NKTE) / ZEPS ) + ! + !* Compute Amoist + ! + ZAMOIST_I(D%NIJB:D%NIJE,D%NKTB:D%NKTE)= 0.5/(1.0 + ZDEDT(D%NIJB:D%NIJE,D%NKTB:D%NKTE) * ZLSOCP(D%NIJB:D%NIJE,D%NKTB:D%NKTE)) + ! + !* Compute Atheta + ! + ZATHETA_I(D%NIJB:D%NIJE,D%NKTB:D%NKTE)= ZAMOIST_I(D%NIJB:D%NIJE,D%NKTB:D%NKTE) * PEXN(D%NIJB:D%NIJE,D%NKTB:D%NKTE) * & + ( ( ZE(D%NIJB:D%NIJE,D%NKTB:D%NKTE) - PR(D%NIJB:D%NIJE,D%NKTB:D%NKTE,1) ) * ZLSOCP(D%NIJB:D%NIJE,D%NKTB:D%NKTE) / & + ( 1. + ZDEDT(D%NIJB:D%NIJE,D%NKTB:D%NKTE) * ZLSOCP(D%NIJB:D%NIJE,D%NKTB:D%NKTE) ) * & ( & - ZE(:,:) * (1. + ZE(:,:)/ZEPS) & - * ( -2.*CST%XBETAI/PT(:,:) + CST%XGAMI ) / PT(:,:)**2 & - +ZDEDT(:,:) * (1. + 2. * ZE(:,:)/ZEPS) & - * ( CST%XBETAI/PT(:,:) - CST%XGAMI ) / PT(:,:) & + ZE(D%NIJB:D%NIJE,D%NKTB:D%NKTE) * (1. + ZE(D%NIJB:D%NIJE,D%NKTB:D%NKTE)/ZEPS) & + * ( -2.*CST%XBETAI/PT(D%NIJB:D%NIJE,D%NKTB:D%NKTE) + CST%XGAMI ) / PT(D%NIJB:D%NIJE,D%NKTB:D%NKTE)**2 & + +ZDEDT(D%NIJB:D%NIJE,D%NKTB:D%NKTE) * (1. + 2. * ZE(D%NIJB:D%NIJE,D%NKTB:D%NKTE)/ZEPS) & + * ( CST%XBETAI/PT(D%NIJB:D%NIJE,D%NKTB:D%NKTE) - CST%XGAMI ) / PT(D%NIJB:D%NIJE,D%NKTB:D%NKTE) & ) & - - ZDEDT(:,:) & + - ZDEDT(D%NIJB:D%NIJE,D%NKTB:D%NKTE) & ) - + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) ELSE - ZAMOIST_I(:,:)=0. - ZATHETA_I(:,:)=0. + ZAMOIST_I(D%NIJB:D%NIJE,D%NKTB:D%NKTE)=0. + ZATHETA_I(D%NIJB:D%NIJE,D%NKTB:D%NKTE)=0. ENDIF - PAMOIST(:,:) = (1.0-PFRAC_ICE(:,:))*ZAMOIST_W(:,:) & - +PFRAC_ICE(:,:) *ZAMOIST_I(:,:) - PATHETA(:,:) = (1.0-PFRAC_ICE(:,:))*ZATHETA_W(:,:) & - +PFRAC_ICE(:,:) *ZATHETA_I(:,:) - -! + !$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) + PAMOIST(D%NIJB:D%NIJE,D%NKTB:D%NKTE) = (1.0-PFRAC_ICE(D%NIJB:D%NIJE,D%NKTB:D%NKTE))*ZAMOIST_W(D%NIJB:D%NIJE,D%NKTB:D%NKTE) & + +PFRAC_ICE(D%NIJB:D%NIJE,D%NKTB:D%NKTE) *ZAMOIST_I(D%NIJB:D%NIJE,D%NKTB:D%NKTE) + PATHETA(D%NIJB:D%NIJE,D%NKTB:D%NKTE) = (1.0-PFRAC_ICE(D%NIJB:D%NIJE,D%NKTB:D%NKTE))*ZATHETA_W(D%NIJB:D%NIJE,D%NKTB:D%NKTE) & + +PFRAC_ICE(D%NIJB:D%NIJE,D%NKTB:D%NKTE) *ZATHETA_I(D%NIJB:D%NIJE,D%NKTB:D%NKTE) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) + ! ELSE - PAMOIST(:,:) = 0. - PATHETA(:,:) = 0. + PAMOIST(D%NIJB:D%NIJE,D%NKTB:D%NKTE) = 0. + PATHETA(D%NIJB:D%NIJE,D%NKTB:D%NKTE) = 0. ENDIF IF (LHOOK) CALL DR_HOOK('COMPUTE_FUNCTION_THERMO_MF',1,ZHOOK_HANDLE) END SUBROUTINE COMPUTE_FUNCTION_THERMO_MF diff --git a/src/common/turb/mode_compute_mf_cloud.F90 b/src/common/turb/mode_compute_mf_cloud.F90 index 5ed752cb5bec17b56f9e98c53f5b2e785e346c50..926d415523c54fb2bc08b1b080c8a46b1e8d4b8d 100644 --- a/src/common/turb/mode_compute_mf_cloud.F90 +++ b/src/common/turb/mode_compute_mf_cloud.F90 @@ -86,24 +86,24 @@ 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_CLOUD ! Type of statistical cloud scheme -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PFRAC_ICE ! liquid/ice fraction -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PRC_UP,PRI_UP,PEMF! updraft characteritics -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PTHL_UP, PRT_UP ! rc,w,Mass Flux,Thetal,rt -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PFRAC_UP ! Updraft Fraction -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PTHV_UP ! updraft thetaV -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PFRAC_ICE_UP ! liquid/solid fraction in updraft -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PRSAT_UP ! Rsat in updraft -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PEXNM ! exner function -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PTHLM, PRTM ! cons. var. at t-dt -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PTHM, PTHVM ! theta and thetaV -REAL, DIMENSION(D%NIT,D%NKT,KRR), INTENT(IN) :: PRM ! water var. at t-dt -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PDZZ, PZZ -INTEGER, DIMENSION(D%NIT), INTENT(IN) :: KKLCL ! index of updraft condensation level -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PPABSM, PRHODREF ! environement -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PRC_MF, PRI_MF ! cloud content (INPUT=environment, OUTPUT=conv. cloud) -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PCF_MF ! and cloud fraction for MF scheme -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PSIGMF ! SQRT(variance) for statistical cloud scheme -REAL, DIMENSION(D%NIT), INTENT(IN) :: PDEPTH ! Deepness of cloud +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PFRAC_ICE ! liquid/ice fraction +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRC_UP,PRI_UP,PEMF! updraft characteritics +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHL_UP, PRT_UP ! rc,w,Mass Flux,Thetal,rt +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PFRAC_UP ! Updraft Fraction +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHV_UP ! updraft thetaV +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PFRAC_ICE_UP ! liquid/solid fraction in updraft +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRSAT_UP ! Rsat in updraft +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PEXNM ! exner function +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHLM, PRTM ! cons. var. at t-dt +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHM, PTHVM ! theta and thetaV +REAL, DIMENSION(D%NIJT,D%NKT,KRR), INTENT(IN) :: PRM ! water var. at t-dt +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDZZ, PZZ +INTEGER, DIMENSION(D%NIJT), INTENT(IN) :: KKLCL ! index of updraft condensation level +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PPABSM, PRHODREF ! environement +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PRC_MF, PRI_MF ! cloud content (INPUT=environment, OUTPUT=conv. cloud) +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PCF_MF ! and cloud fraction for MF scheme +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PSIGMF ! SQRT(variance) for statistical cloud scheme +REAL, DIMENSION(D%NIJT), INTENT(IN) :: PDEPTH ! Deepness of cloud ! ! 1.2 Declaration of local variables diff --git a/src/common/turb/mode_compute_mf_cloud_bigaus.F90 b/src/common/turb/mode_compute_mf_cloud_bigaus.F90 index 180532c20cab2bf81bc79b47634932894c890f6f..b4153303b6e97173d96266d934d47dcacc7389b1 100644 --- a/src/common/turb/mode_compute_mf_cloud_bigaus.F90 +++ b/src/common/turb/mode_compute_mf_cloud_bigaus.F90 @@ -73,30 +73,30 @@ IMPLICIT NONE TYPE(DIMPHYEX_t), INTENT(IN) :: D TYPE(CST_t), INTENT(IN) :: CST TYPE(PARAM_MFSHALL_t), INTENT(IN) :: PARAMMF -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PEMF ! updraft characteritics -REAL, DIMENSION(D%NIT), INTENT(IN) :: PDEPTH ! Deepness of cloud -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PTHV_UP, PRSAT_UP, PRT_UP ! updraft characteritics -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PFRAC_ICE_UP ! liquid/ice fraction in updraft -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PTHM, PRTM, PTHVM ! env. var. at t-dt -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PDZZ, PZZ -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PRHODREF -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PRC_MF, PRI_MF ! cloud content -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PCF_MF ! and cloud fraction for MF scheme +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PEMF ! updraft characteritics +REAL, DIMENSION(D%NIJT), INTENT(IN) :: PDEPTH ! Deepness of cloud +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHV_UP, PRSAT_UP, PRT_UP ! updraft characteritics +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PFRAC_ICE_UP ! liquid/ice fraction in updraft +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHM, PRTM, PTHVM ! env. var. at t-dt +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDZZ, PZZ +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODREF +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PRC_MF, PRI_MF ! cloud content +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PCF_MF ! and cloud fraction for MF scheme ! !* 0.1 Declaration of local variables ! ! -REAL, DIMENSION(D%NIT,D%NKT) :: ZGRAD_Z_RT, & ! +REAL, DIMENSION(D%NIJT,D%NKT) :: ZGRAD_Z_RT, & ! & ZALPHA_UP_M, & ! Variables used to compute variance & ZSIGMF ! and sqrt(variance) -REAL, DIMENSION(D%NIT) :: ZOMEGA_UP_M ! -REAL, DIMENSION(D%NIT,D%NKT) :: ZW1 ! working array +REAL, DIMENSION(D%NIJT) :: ZOMEGA_UP_M ! +REAL, DIMENSION(D%NIJT,D%NKT) :: ZW1 ! working array INTEGER :: JI, JK ! loop control -REAL, DIMENSION(D%NIT,D%NKT) :: ZEMF_M, ZTHV_UP_M, & ! +REAL, DIMENSION(D%NIJT,D%NKT) :: ZEMF_M, ZTHV_UP_M, & ! & ZRSAT_UP_M, ZRT_UP_M,& ! Interpolation on mass points & ZFRAC_ICE_UP_M ! -REAL, DIMENSION(D%NIT,D%NKT) :: ZCOND ! condensate -REAL, DIMENSION(D%NIT,D%NKT) :: ZA, ZGAM ! used for integration +REAL, DIMENSION(D%NIJT,D%NKT) :: ZCOND ! condensate +REAL, DIMENSION(D%NIJT,D%NKT) :: ZA, ZGAM ! used for integration REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('COMPUTE_MF_CLOUD_BIGAUS',0,ZHOOK_HANDLE) @@ -122,69 +122,69 @@ CALL MZF_MF(D, PFRAC_ICE_UP(:,:), ZFRAC_ICE_UP_M(:,:)) !computation of omega star up ZOMEGA_UP_M(:)=0. DO JK=D%NKB,D%NKE-D%NKL,D%NKL - !$mnh_expand_array(JI=D%NIB:D%NIE) + !$mnh_expand_array(JI=D%NIJB:D%NIJE) !Vertical integration over the entire column but only buoyant points are used - !ZOMEGA_UP_M(D%NIB:D%NIE)=ZOMEGA_UP_M(D%NIB:D%NIE) + & - ! ZEMF_M(D%NIB:D%NIE,JK) * & - ! MAX(0.,(ZTHV_UP_M(D%NIB:D%NIE,JK)-PTHVM(D%NIB:D%NIE,JK))) * & - ! (PZZ(D%NIB:D%NIE,JK+KKL)-PZZ(D%NIB:D%NIE,JK)) / & - ! (PTHM(D%NIB:D%NIE,JK) * PRHODREF(D%NIB:D%NIE,JK)) + !ZOMEGA_UP_M(D%NIJB:D%NIJE)=ZOMEGA_UP_M(D%NIJB:D%NIJE) + & + ! ZEMF_M(D%NIJB:D%NIJE,JK) * & + ! MAX(0.,(ZTHV_UP_M(D%NIJB:D%NIJE,JK)-PTHVM(D%NIJB:D%NIJE,JK))) * & + ! (PZZ(D%NIJB:D%NIJE,JK+KKL)-PZZ(D%NIJB:D%NIJE,JK)) / & + ! (PTHM(D%NIJB:D%NIJE,JK) * PRHODREF(D%NIJB:D%NIJE,JK)) !Vertical integration over the entire column - ZOMEGA_UP_M(D%NIB:D%NIE)=ZOMEGA_UP_M(D%NIB:D%NIE) + & - ZEMF_M(D%NIB:D%NIE,JK) * & - (ZTHV_UP_M(D%NIB:D%NIE,JK)-PTHVM(D%NIB:D%NIE,JK)) * & - (PZZ(D%NIB:D%NIE,JK+D%NKL)-PZZ(D%NIB:D%NIE,JK)) / & - (PTHM(D%NIB:D%NIE,JK) * PRHODREF(D%NIB:D%NIE,JK)) - !$mnh_end_expand_array(JI=D%NIB:D%NIE) + ZOMEGA_UP_M(D%NIJB:D%NIJE)=ZOMEGA_UP_M(D%NIJB:D%NIJE) + & + ZEMF_M(D%NIJB:D%NIJE,JK) * & + (ZTHV_UP_M(D%NIJB:D%NIJE,JK)-PTHVM(D%NIJB:D%NIJE,JK)) * & + (PZZ(D%NIJB:D%NIJE,JK+D%NKL)-PZZ(D%NIJB:D%NIJE,JK)) / & + (PTHM(D%NIJB:D%NIJE,JK) * PRHODREF(D%NIJB:D%NIJE,JK)) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE) ENDDO -!$mnh_expand_array(JI=D%NIB:D%NIE) -ZOMEGA_UP_M(D%NIB:D%NIE)=MAX(ZOMEGA_UP_M(D%NIB:D%NIE), 1.E-20) -ZOMEGA_UP_M(D%NIB:D%NIE)=(CST%XG*ZOMEGA_UP_M(D%NIB:D%NIE))**(1./3.) -!$mnh_end_expand_array(JI=D%NIB:D%NIE) +!$mnh_expand_array(JI=D%NIJB:D%NIJE) +ZOMEGA_UP_M(D%NIJB:D%NIJE)=MAX(ZOMEGA_UP_M(D%NIJB:D%NIJE), 1.E-20) +ZOMEGA_UP_M(D%NIJB:D%NIJE)=(CST%XG*ZOMEGA_UP_M(D%NIJB:D%NIJE))**(1./3.) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE) !computation of alpha up DO JK=D%NKA,D%NKU,D%NKL - !$mnh_expand_array(JI=D%NIB:D%NIE) - ZALPHA_UP_M(D%NIB:D%NIE,JK)=ZEMF_M(D%NIB:D%NIE,JK)/(PARAMMF%XALPHA_MF*PRHODREF(D%NIB:D%NIE,JK)*ZOMEGA_UP_M(D%NIB:D%NIE)) - ZALPHA_UP_M(D%NIB:D%NIE,JK)=MAX(0., MIN(ZALPHA_UP_M(D%NIB:D%NIE,JK), 1.)) - !$mnh_end_expand_array(JI=D%NIB:D%NIE) + !$mnh_expand_array(JI=D%NIJB:D%NIJE) + ZALPHA_UP_M(D%NIJB:D%NIJE,JK)=ZEMF_M(D%NIJB:D%NIJE,JK)/(PARAMMF%XALPHA_MF*PRHODREF(D%NIJB:D%NIJE,JK)*ZOMEGA_UP_M(D%NIJB:D%NIJE)) + ZALPHA_UP_M(D%NIJB:D%NIJE,JK)=MAX(0., MIN(ZALPHA_UP_M(D%NIJB:D%NIJE,JK), 1.)) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE) ENDDO !computation of sigma of the distribution DO JK=D%NKA,D%NKU,D%NKL - !$mnh_expand_array(JI=D%NIB:D%NIE) - ZSIGMF(D%NIB:D%NIE,JK)=ZEMF_M(D%NIB:D%NIE,JK) * & - (ZRT_UP_M(D%NIB:D%NIE,JK) - PRTM(D%NIB:D%NIE,JK)) * & - PDEPTH(D%NIB:D%NIE) * ZGRAD_Z_RT(D%NIB:D%NIE,JK) / & - (PARAMMF%XSIGMA_MF * ZOMEGA_UP_M(D%NIB:D%NIE) * PRHODREF(D%NIB:D%NIE,JK)) - !$mnh_end_expand_array(JI=D%NIB:D%NIE) + !$mnh_expand_array(JI=D%NIJB:D%NIJE) + ZSIGMF(D%NIJB:D%NIJE,JK)=ZEMF_M(D%NIJB:D%NIJE,JK) * & + (ZRT_UP_M(D%NIJB:D%NIJE,JK) - PRTM(D%NIJB:D%NIJE,JK)) * & + PDEPTH(D%NIJB:D%NIJE) * ZGRAD_Z_RT(D%NIJB:D%NIJE,JK) / & + (PARAMMF%XSIGMA_MF * ZOMEGA_UP_M(D%NIJB:D%NIJE) * PRHODREF(D%NIJB:D%NIJE,JK)) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE) ENDDO -!$mnh_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) -ZSIGMF(D%NIB:D%NIE,:)=SQRT(MAX(ABS(ZSIGMF(D%NIB:D%NIE,:)), 1.E-40)) -!$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) +!$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) +ZSIGMF(D%NIJB:D%NIJE,:)=SQRT(MAX(ABS(ZSIGMF(D%NIJB:D%NIJE,:)), 1.E-40)) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) ! !* 2. PDF integration ! ------------------------------------------------ ! -!$mnh_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) +!$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) !The mean of the distribution is ZRT_UP !Computation of ZA and ZGAM (=efrc(ZA)) coefficient -ZA(D%NIB:D%NIE,:)=(ZRSAT_UP_M(D%NIB:D%NIE,:)-ZRT_UP_M(D%NIB:D%NIE,:))/(sqrt(2.)*ZSIGMF(D%NIB:D%NIE,:)) +ZA(D%NIJB:D%NIJE,:)=(ZRSAT_UP_M(D%NIJB:D%NIJE,:)-ZRT_UP_M(D%NIJB:D%NIJE,:))/(sqrt(2.)*ZSIGMF(D%NIJB:D%NIJE,:)) !Approximation of erf function -ZGAM(D%NIB:D%NIE,:)=1-SIGN(1., ZA(D%NIB:D%NIE,:))*SQRT(1-EXP(-4*ZA(D%NIB:D%NIE,:)**2/CST%XPI)) +ZGAM(D%NIJB:D%NIJE,:)=1-SIGN(1., ZA(D%NIJB:D%NIJE,:))*SQRT(1-EXP(-4*ZA(D%NIJB:D%NIJE,:)**2/CST%XPI)) !computation of cloud fraction -PCF_MF(D%NIB:D%NIE,:)=MAX( 0., MIN(1.,0.5*ZGAM(D%NIB:D%NIE,:) * ZALPHA_UP_M(D%NIB:D%NIE,:))) +PCF_MF(D%NIJB:D%NIJE,:)=MAX( 0., MIN(1.,0.5*ZGAM(D%NIJB:D%NIJE,:) * ZALPHA_UP_M(D%NIJB:D%NIJE,:))) !computation of condensate, then PRC and PRI -ZCOND(D%NIB:D%NIE,:)=(EXP(-ZA(D%NIB:D%NIE,:)**2)-ZA(D%NIB:D%NIE,:)*SQRT(CST%XPI)*ZGAM(D%NIB:D%NIE,:))* & - &ZSIGMF(D%NIB:D%NIE,:)/SQRT(2.*CST%XPI) * ZALPHA_UP_M(D%NIB:D%NIE,:) -ZCOND(D%NIB:D%NIE,:)=MAX(ZCOND(D%NIB:D%NIE,:), 0.) !due to approximation of ZGAM value, ZCOND could be slightly negative -PRC_MF(D%NIB:D%NIE,:)=(1.-ZFRAC_ICE_UP_M(D%NIB:D%NIE,:)) * ZCOND(D%NIB:D%NIE,:) -PRI_MF(D%NIB:D%NIE,:)=( ZFRAC_ICE_UP_M(D%NIB:D%NIE,:)) * ZCOND(D%NIB:D%NIE,:) -!$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) +ZCOND(D%NIJB:D%NIJE,:)=(EXP(-ZA(D%NIJB:D%NIJE,:)**2)-ZA(D%NIJB:D%NIJE,:)*SQRT(CST%XPI)*ZGAM(D%NIJB:D%NIJE,:))* & + &ZSIGMF(D%NIJB:D%NIJE,:)/SQRT(2.*CST%XPI) * ZALPHA_UP_M(D%NIJB:D%NIJE,:) +ZCOND(D%NIJB:D%NIJE,:)=MAX(ZCOND(D%NIJB:D%NIJE,:), 0.) !due to approximation of ZGAM value, ZCOND could be slightly negative +PRC_MF(D%NIJB:D%NIJE,:)=(1.-ZFRAC_ICE_UP_M(D%NIJB:D%NIJE,:)) * ZCOND(D%NIJB:D%NIJE,:) +PRI_MF(D%NIJB:D%NIJE,:)=( ZFRAC_ICE_UP_M(D%NIJB:D%NIJE,:)) * ZCOND(D%NIJB:D%NIJE,:) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) ! IF (LHOOK) CALL DR_HOOK('COMPUTE_MF_CLOUD_BIGAUS',1,ZHOOK_HANDLE) diff --git a/src/common/turb/mode_compute_mf_cloud_direct.F90 b/src/common/turb/mode_compute_mf_cloud_direct.F90 index ba6f5dde3957ff7dcdde8d794747fd231b36dac5..b7c86d94cdad5651d66381085baa6316ca15b1b7 100644 --- a/src/common/turb/mode_compute_mf_cloud_direct.F90 +++ b/src/common/turb/mode_compute_mf_cloud_direct.F90 @@ -64,11 +64,11 @@ IMPLICIT NONE ! TYPE(DIMPHYEX_t), INTENT(IN) :: D TYPE(PARAM_MFSHALL_t), INTENT(IN) :: PARAMMF -INTEGER, DIMENSION(D%NIT), INTENT(IN) :: KKLCL ! index of updraft condensation level -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PFRAC_UP ! Updraft Fraction -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PRC_UP,PRI_UP ! updraft characteritics -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PRC_MF, PRI_MF ! cloud content -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PCF_MF ! and cloud fraction for MF scheme +INTEGER, DIMENSION(D%NIJT), INTENT(IN) :: KKLCL ! index of updraft condensation level +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PFRAC_UP ! Updraft Fraction +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRC_UP,PRI_UP ! updraft characteritics +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PRC_MF, PRI_MF ! cloud content +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PCF_MF ! and cloud fraction for MF scheme ! !* 0.1 Declaration of local variables ! @@ -89,7 +89,7 @@ PRC_MF(:,:)=0. PRI_MF(:,:)=0. PCF_MF(:,:)=0. -DO JI=D%NIB,D%NIE +DO JI=D%NIJB,D%NIJE #ifdef REPRO48 JK0=KKLCL(JI)-D%NKL ! first mass level with cloud JK0=MAX(JK0, MIN(D%NKB,D%NKE)) !protection if KKL=1 diff --git a/src/common/turb/mode_compute_mf_cloud_stat.F90 b/src/common/turb/mode_compute_mf_cloud_stat.F90 index 28032ab6218ed7a02c471b81b9c68bf7034e9698..64adf965de044c436946760036c6b301be9679ec 100644 --- a/src/common/turb/mode_compute_mf_cloud_stat.F90 +++ b/src/common/turb/mode_compute_mf_cloud_stat.F90 @@ -72,24 +72,24 @@ TYPE(PARAM_MFSHALL_t), INTENT(IN) :: PARAMMF 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. -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PFRAC_ICE ! liquid/ice fraction -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PTHLM, PRTM ! cons. var. at t-dt -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PPABSM ! Pressure at time t-1 -REAL, DIMENSION(D%NIT,D%NKT,KRR), INTENT(IN) :: PRM ! water var. at t-dt -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PDZZ -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PTHM ! environement -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PEXNM -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PEMF ! updraft characteritics -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PTHL_UP, PRT_UP ! rc,w,Mass Flux,Thetal,rt -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PSIGMF ! SQRT(variance) for statistical cloud scheme +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PFRAC_ICE ! liquid/ice fraction +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHLM, PRTM ! cons. var. at t-dt +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PPABSM ! Pressure at time t-1 +REAL, DIMENSION(D%NIJT,D%NKT,KRR), INTENT(IN) :: PRM ! water var. at t-dt +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDZZ +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHM ! environement +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PEXNM +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PEMF ! updraft characteritics +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHL_UP, PRT_UP ! rc,w,Mass Flux,Thetal,rt +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PSIGMF ! SQRT(variance) for statistical cloud scheme ! !* 0.1 Declaration of local variables ! ! -REAL, DIMENSION(D%NIT,D%NKT) :: ZFLXZ -REAL, DIMENSION(D%NIT,D%NKT) :: ZT -REAL, DIMENSION(D%NIT,D%NKT) :: ZAMOIST, ZATHETA -REAL, DIMENSION(D%NIT,D%NKT) :: ZWK +REAL, DIMENSION(D%NIJT,D%NKT) :: ZFLXZ +REAL, DIMENSION(D%NIJT,D%NKT) :: ZT +REAL, DIMENSION(D%NIJT,D%NKT) :: ZAMOIST, ZATHETA +REAL, DIMENSION(D%NIJT,D%NKT) :: ZWK INTEGER :: JI, JK REAL(KIND=JPRB) :: ZHOOK_HANDLE ! @@ -116,18 +116,18 @@ IF (KRRL > 0) THEN ! CALL MZM_MF(D, PTHLM(:,:), ZFLXZ(:,:)) CALL GZ_M_W_MF(D, PTHLM(:,:), PDZZ(:,:), ZWK(:,:)) - !$mnh_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) - ZFLXZ(D%NIB:D%NIE,:) = -2 * PARAMMF%XTAUSIGMF * PEMF(D%NIB:D%NIE,:)* & - & (PTHL_UP(D%NIB:D%NIE,:)-ZFLXZ(D%NIB:D%NIE,:)) * ZWK(D%NIB:D%NIE,:) + !$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) + ZFLXZ(D%NIJB:D%NIJE,:) = -2 * PARAMMF%XTAUSIGMF * PEMF(D%NIJB:D%NIJE,:)* & + & (PTHL_UP(D%NIJB:D%NIJE,:)-ZFLXZ(D%NIJB:D%NIJE,:)) * ZWK(D%NIJB:D%NIJE,:) ! ! Avoid negative values - ZFLXZ(D%NIB:D%NIE,:) = MAX(0.,ZFLXZ(D%NIB:D%NIE,:)) - !$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) + ZFLXZ(D%NIJB:D%NIJE,:) = MAX(0.,ZFLXZ(D%NIJB:D%NIJE,:)) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) CALL MZF_MF(D, ZFLXZ(:,:), PSIGMF(:,:)) - !$mnh_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) - PSIGMF(D%NIB:D%NIE,:) = PSIGMF(D%NIB:D%NIE,:) * ZATHETA(D%NIB:D%NIE,:)**2 - !$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) + !$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) + PSIGMF(D%NIJB:D%NIJE,:) = PSIGMF(D%NIJB:D%NIJE,:) * ZATHETA(D%NIJB:D%NIJE,:)**2 + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) ! ! @@ -138,24 +138,24 @@ IF (KRRL > 0) THEN ! CALL MZM_MF(D, PRTM(:,:), ZFLXZ(:,:)) CALL GZ_M_W_MF(D, PRTM(:,:), PDZZ(:,:), ZWK(:,:)) - !$mnh_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) - ZFLXZ(D%NIB:D%NIE,:) = -2 * PARAMMF%XTAUSIGMF * PEMF(D%NIB:D%NIE,:)* & - & (PRT_UP(D%NIB:D%NIE,:)-ZFLXZ(D%NIB:D%NIE,:)) * ZWK(D%NIB:D%NIE,:) + !$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) + ZFLXZ(D%NIJB:D%NIJE,:) = -2 * PARAMMF%XTAUSIGMF * PEMF(D%NIJB:D%NIJE,:)* & + & (PRT_UP(D%NIJB:D%NIJE,:)-ZFLXZ(D%NIJB:D%NIJE,:)) * ZWK(D%NIJB:D%NIJE,:) ! ! Avoid negative values - ZFLXZ(D%NIB:D%NIE,:) = MAX(0.,ZFLXZ(D%NIB:D%NIE,:)) - !$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) + ZFLXZ(D%NIJB:D%NIJE,:) = MAX(0.,ZFLXZ(D%NIJB:D%NIJE,:)) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) CALL MZF_MF(D, ZFLXZ(:,:), ZWK(:,:)) - !$mnh_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) - PSIGMF(D%NIB:D%NIE,:) = PSIGMF(D%NIB:D%NIE,:) + ZAMOIST(D%NIB:D%NIE,:) **2 * ZWK(D%NIB:D%NIE,:) - !$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) + !$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) + PSIGMF(D%NIJB:D%NIJE,:) = PSIGMF(D%NIJB:D%NIJE,:) + ZAMOIST(D%NIJB:D%NIJE,:) **2 * ZWK(D%NIJB:D%NIJE,:) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) ! ! 1.3 Vertical part of Sigma_s ! - !$mnh_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) - PSIGMF(D%NIB:D%NIE,:) = SQRT( MAX (PSIGMF(D%NIB:D%NIE,:) , 0.) ) - !$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) + !$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) + PSIGMF(D%NIJB:D%NIJE,:) = SQRT( MAX (PSIGMF(D%NIJB:D%NIJE,:) , 0.) ) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) ELSE PSIGMF(:,:) = 0. END IF diff --git a/src/common/turb/mode_compute_updraft.F90 b/src/common/turb/mode_compute_updraft.F90 index 6e3a533dc072a25b2bf35e0e91a744e24d64e745..535cce82ec7491904eeb326e257d65ac4120cbe2 100644 --- a/src/common/turb/mode_compute_updraft.F90 +++ b/src/common/turb/mode_compute_updraft.F90 @@ -99,49 +99,49 @@ 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, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PZZ ! Height at the flux point -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PDZZ ! Metrics coefficient +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PZZ ! Height at the flux point +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDZZ ! Metrics coefficient -REAL, DIMENSION(D%NIT), INTENT(IN) :: PSFTH,PSFRV +REAL, DIMENSION(D%NIJT), INTENT(IN) :: PSFTH,PSFRV ! normal surface fluxes of theta,rv,(u,v) parallel to the orography ! -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PPABSM ! Pressure at t-dt -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PRHODREF ! dry density of the +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PPABSM ! Pressure at t-dt +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODREF ! dry density of the ! reference state -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PUM ! u mean wind -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PVM ! v mean wind -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PTKEM ! TKE at t-dt +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PUM ! u mean wind +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PVM ! v mean wind +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTKEM ! TKE at t-dt ! -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PTHM ! liquid pot. temp. at t-dt -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PRVM ! vapor mixing ratio at t-dt -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PTHLM,PRTM ! cons. var. at t-dt +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHM ! liquid pot. temp. at t-dt +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRVM ! vapor mixing ratio at t-dt +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHLM,PRTM ! cons. var. at t-dt -REAL, DIMENSION(D%NIT,D%NKT,KSV), INTENT(IN) :: PSVM ! scalar var. at t-dt +REAL, DIMENSION(D%NIJT,D%NKT,KSV), INTENT(IN) :: PSVM ! scalar var. at t-dt -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PTHL_UP,PRT_UP ! updraft properties -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PU_UP, PV_UP ! updraft wind components -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT):: PRV_UP,PRC_UP, & ! updraft rv, rc +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PTHL_UP,PRT_UP ! updraft properties +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PU_UP, PV_UP ! updraft wind components +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT):: PRV_UP,PRC_UP, & ! updraft rv, rc PRI_UP,PTHV_UP,& ! updraft ri, THv PW_UP,PFRAC_UP,& ! updraft w, fraction PFRAC_ICE_UP,& ! liquid/solid fraction in updraft PRSAT_UP ! Rsat -REAL, DIMENSION(D%NIT,D%NKT,KSV), INTENT(OUT) :: PSV_UP ! updraft scalar var. +REAL, DIMENSION(D%NIJT,D%NKT,KSV), INTENT(OUT) :: PSV_UP ! updraft scalar var. -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT):: PEMF,PDETR,PENTR ! Mass_flux, +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT):: PEMF,PDETR,PENTR ! Mass_flux, ! detrainment,entrainment -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT) :: PBUO_INTEG ! Integrated Buoyancy -INTEGER, DIMENSION(D%NIT), INTENT(INOUT) :: KKLCL,KKETL,KKCTL! LCL, ETL, CTL -REAL, DIMENSION(D%NIT), INTENT(OUT) :: PDEPTH ! Deepness of cloud +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PBUO_INTEG ! Integrated Buoyancy +INTEGER, DIMENSION(D%NIJT), INTENT(INOUT) :: KKLCL,KKETL,KKCTL! LCL, ETL, CTL +REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PDEPTH ! Deepness of cloud REAL, INTENT(IN) :: PDX, PDY ! 1.2 Declaration of local variables ! ! ! Mean environment variables at t-dt at flux point -REAL, DIMENSION(D%NIT,D%NKT) :: & +REAL, DIMENSION(D%NIJT,D%NKT) :: & ZTHM_F,ZRVM_F ! Theta,rv of ! updraft environnement -REAL, DIMENSION(D%NIT,D%NKT) :: & +REAL, DIMENSION(D%NIJT,D%NKT) :: & ZRTM_F, ZTHLM_F, ZTKEM_F,& ! rt, thetal,TKE,pressure, ZUM_F,ZVM_F,ZRHO_F, & ! density,momentum ZPRES_F,ZTHVM_F,ZTHVM, & ! interpolated at the flux point @@ -150,38 +150,38 @@ REAL, DIMENSION(D%NIT,D%NKT) :: & ZBUO_INTEG_DRY, ZBUO_INTEG_CLD,&! Integrated Buoyancy ZENTR_CLD,ZDETR_CLD ! wet entrainment and detrainment -REAL, DIMENSION(D%NIT,D%NKT,KSV) :: & +REAL, DIMENSION(D%NIJT,D%NKT,KSV) :: & ZSVM_F ! scalar variables -REAL, DIMENSION(D%NIT,D%NKT) :: & +REAL, DIMENSION(D%NIJT,D%NKT) :: & ZTH_UP, & ! updraft THETA ZRC_MIX, ZRI_MIX ! guess of Rc and Ri for KF mixture -REAL, DIMENSION(D%NIT,D%NKT) :: ZCOEF ! diminution coefficient for too high clouds +REAL, DIMENSION(D%NIJT,D%NKT) :: ZCOEF ! diminution coefficient for too high clouds -REAL, DIMENSION(D%NIT) :: ZWTHVSURF ! Surface w'thetav' +REAL, DIMENSION(D%NIJT) :: ZWTHVSURF ! Surface w'thetav' REAL :: ZRDORV ! RD/RV REAL :: ZRVORD ! RV/RD -REAL, DIMENSION(D%NIT) :: ZMIX1,ZMIX2,ZMIX3_CLD,ZMIX2_CLD +REAL, DIMENSION(D%NIJT) :: ZMIX1,ZMIX2,ZMIX3_CLD,ZMIX2_CLD -REAL, DIMENSION(D%NIT) :: ZLUP ! Upward Mixing length from the ground +REAL, DIMENSION(D%NIJT) :: ZLUP ! Upward Mixing length from the ground INTEGER :: JK,JI,JSV ! loop counters -LOGICAL, DIMENSION(D%NIT) :: GTEST,GTESTLCL,GTESTETL +LOGICAL, DIMENSION(D%NIJT) :: GTEST,GTESTLCL,GTESTETL ! Test if the ascent continue, if LCL or ETL is reached LOGICAL :: GLMIX ! To choose upward or downward mixing length -LOGICAL, DIMENSION(D%NIT) :: GWORK1 -LOGICAL, DIMENSION(D%NIT,D%NKT) :: GWORK2 +LOGICAL, DIMENSION(D%NIJT) :: GWORK1 +LOGICAL, DIMENSION(D%NIJT,D%NKT) :: GWORK2 INTEGER :: ITEST -REAL, DIMENSION(D%NIT) :: ZRC_UP, ZRI_UP, ZRV_UP,& +REAL, DIMENSION(D%NIJT) :: ZRC_UP, ZRI_UP, ZRV_UP,& ZRSATW, ZRSATI,& ZPART_DRY @@ -189,28 +189,28 @@ REAL :: ZDEPTH_MAX1, ZDEPTH_MAX2 ! control auto-extinction process REAL :: ZTMAX,ZRMAX ! control value -REAL, DIMENSION(D%NIT) :: ZSURF -REAL, DIMENSION(D%NIT,D%NKT) :: ZSHEAR,ZDUDZ,ZDVDZ ! vertical wind shear +REAL, DIMENSION(D%NIJT) :: ZSURF +REAL, DIMENSION(D%NIJT,D%NKT) :: ZSHEAR,ZDUDZ,ZDVDZ ! vertical wind shear ! -REAL, DIMENSION(D%NIT,D%NKT) :: ZWK -REAL, DIMENSION(D%NIT,16) :: ZBUF +REAL, DIMENSION(D%NIJT,D%NKT) :: ZWK +REAL, DIMENSION(D%NIJT,16) :: ZBUF ! REAL(KIND=JPRB) :: ZHOOK_HANDLE ! ! 1.3 Declaration of additional local variables for compute_entr_detr ! ! Variables for cloudy part -REAL, DIMENSION(D%NIT) :: ZKIC, ZKIC_F2 ! fraction of env. mass in the muxtures -REAL, DIMENSION(D%NIT) :: ZEPSI,ZDELTA ! factor entrainment detrainment +REAL, DIMENSION(D%NIJT) :: ZKIC, ZKIC_F2 ! fraction of env. mass in the muxtures +REAL, DIMENSION(D%NIJT) :: ZEPSI,ZDELTA ! factor entrainment detrainment REAL :: ZEPSI_CLOUD ! factor entrainment detrainment REAL :: ZCOEFFMF_CLOUD ! factor for compputing entr. detr. -REAL, DIMENSION(D%NIT) :: ZMIXTHL,ZMIXRT ! Thetal and rt in the mixtures -REAL, DIMENSION(D%NIT) :: ZTHMIX ! Theta and Thetav of mixtures -REAL, DIMENSION(D%NIT) :: ZRVMIX,ZRCMIX,ZRIMIX ! mixing ratios in mixtures -REAL, DIMENSION(D%NIT) :: ZTHVMIX, ZTHVMIX_F2 ! Theta and Thetav of mixtures -REAL, DIMENSION(D%NIT) :: ZTHV_UP_F2 ! thv_up at flux point kk+kkl -REAL, DIMENSION(D%NIT) :: ZRSATW_ED, ZRSATI_ED ! working arrays (mixing ratio at saturation) -REAL, DIMENSION(D%NIT) :: ZTHV ! theta V of environment at the bottom of cloudy part +REAL, DIMENSION(D%NIJT) :: ZMIXTHL,ZMIXRT ! Thetal and rt in the mixtures +REAL, DIMENSION(D%NIJT) :: ZTHMIX ! Theta and Thetav of mixtures +REAL, DIMENSION(D%NIJT) :: ZRVMIX,ZRCMIX,ZRIMIX ! mixing ratios in mixtures +REAL, DIMENSION(D%NIJT) :: ZTHVMIX, ZTHVMIX_F2 ! Theta and Thetav of mixtures +REAL, DIMENSION(D%NIJT) :: ZTHV_UP_F2 ! thv_up at flux point kk+kkl +REAL, DIMENSION(D%NIJT) :: ZRSATW_ED, ZRSATI_ED ! working arrays (mixing ratio at saturation) +REAL, DIMENSION(D%NIJT) :: ZTHV ! theta V of environment at the bottom of cloudy part REAL :: ZKIC_INIT !Initial value of ZKIC REAL :: ZCOTHVU ! Variation of Thvup between bottom and top of cloudy part @@ -221,12 +221,12 @@ REAL :: ZT ! Temperature REAL :: ZWK0D ! Work array ! Variables for dry and cloudy parts -REAL, DIMENSION(D%NIT) :: ZCOEFF_MINUS_HALF,& ! Variation of Thv between mass points kk-kkl and kk +REAL, DIMENSION(D%NIJT) :: ZCOEFF_MINUS_HALF,& ! Variation of Thv between mass points kk-kkl and kk ZCOEFF_PLUS_HALF ! Variation of Thv between mass points kk and kk+kkl -REAL, DIMENSION(D%NIT) :: ZPRE ! pressure at the bottom of the cloudy part -REAL, DIMENSION(D%NIT) :: ZG_O_THVREF_ED -REAL, DIMENSION(D%NIT) :: ZFRAC_ICE ! fraction of ice -REAL, DIMENSION(D%NIT) :: ZDZ_STOP,& ! Exact Height of the LCL above flux level KK +REAL, DIMENSION(D%NIJT) :: ZPRE ! pressure at the bottom of the cloudy part +REAL, DIMENSION(D%NIJT) :: ZG_O_THVREF_ED +REAL, DIMENSION(D%NIJT) :: ZFRAC_ICE ! fraction of ice +REAL, DIMENSION(D%NIJT) :: ZDZ_STOP,& ! Exact Height of the LCL above flux level KK ZTHV_MINUS_HALF,& ! Thv at flux point(kk) ZTHV_PLUS_HALF ! Thv at flux point(kk+kkl) REAL :: ZDZ ! Delta Z used in computations @@ -278,9 +278,9 @@ IF (OENTR_DETR) THEN PBUO_INTEG=0. PFRAC_ICE_UP(:,:)=0. - !$mnh_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) - PRSAT_UP(D%NIB:D%NIE,:)=PRVM(D%NIB:D%NIE,:) ! should be initialised correctly but is (normaly) not used - !$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) + !$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) + PRSAT_UP(D%NIJB:D%NIJE,:)=PRVM(D%NIJB:D%NIJE,:) ! should be initialised correctly but is (normaly) not used + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) !cloud/dry air mixture cloud content ZRC_MIX = 0. @@ -302,24 +302,24 @@ DO JSV=1,KSV END DO ! ! Initialisation of updraft characteristics -!$mnh_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) -PTHL_UP(D%NIB:D%NIE,:)=ZTHLM_F(D%NIB:D%NIE,:) -PRT_UP(D%NIB:D%NIE,:)=ZRTM_F(D%NIB:D%NIE,:) -PU_UP(D%NIB:D%NIE,:)=ZUM_F(D%NIB:D%NIE,:) -PV_UP(D%NIB:D%NIE,:)=ZVM_F(D%NIB:D%NIE,:) -!$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) -!$mnh_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT,JSV=1:KSV) -PSV_UP(D%NIB:D%NIE,:,:)=ZSVM_F(D%NIB:D%NIE,:,:) -!$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT,JSV=1:KSV) +!$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) +PTHL_UP(D%NIJB:D%NIJE,:)=ZTHLM_F(D%NIJB:D%NIJE,:) +PRT_UP(D%NIJB:D%NIJE,:)=ZRTM_F(D%NIJB:D%NIJE,:) +PU_UP(D%NIJB:D%NIJE,:)=ZUM_F(D%NIJB:D%NIJE,:) +PV_UP(D%NIJB:D%NIJE,:)=ZVM_F(D%NIJB:D%NIJE,:) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) +!$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT,JSV=1:KSV) +PSV_UP(D%NIJB:D%NIJE,:,:)=ZSVM_F(D%NIJB:D%NIJE,:,:) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT,JSV=1:KSV) ! Computation or initialisation of updraft characteristics at the KKB level ! thetal_up,rt_up,thetaV_up, w2,Buoyancy term and mass flux (PEMF) -!$mnh_expand_array(JI=D%NIB:D%NIE) -PTHL_UP(D%NIB:D%NIE,D%NKB)= ZTHLM_F(D%NIB:D%NIE,D%NKB)+MAX(0.,MIN(ZTMAX,(PSFTH(D%NIB:D%NIE)/SQRT(ZTKEM_F(D%NIB:D%NIE,D%NKB)))* & - &PARAMMF%XALP_PERT)) -PRT_UP(D%NIB:D%NIE,D%NKB) = ZRTM_F(D%NIB:D%NIE,D%NKB)+MAX(0.,MIN(ZRMAX,(PSFRV(D%NIB:D%NIE)/SQRT(ZTKEM_F(D%NIB:D%NIE,D%NKB)))* & - &PARAMMF%XALP_PERT)) -!$mnh_end_expand_array(JI=D%NIB:D%NIE) +!$mnh_expand_array(JI=D%NIJB:D%NIJE) +PTHL_UP(D%NIJB:D%NIJE,D%NKB)= ZTHLM_F(D%NIJB:D%NIJE,D%NKB)+ & + & MAX(0.,MIN(ZTMAX,(PSFTH(D%NIJB:D%NIJE)/SQRT(ZTKEM_F(D%NIJB:D%NIJE,D%NKB)))* PARAMMF%XALP_PERT)) +PRT_UP(D%NIJB:D%NIJE,D%NKB) = ZRTM_F(D%NIJB:D%NIJE,D%NKB)+ & + & MAX(0.,MIN(ZRMAX,(PSFRV(D%NIJB:D%NIJE)/SQRT(ZTKEM_F(D%NIJB:D%NIJE,D%NKB)))* PARAMMF%XALP_PERT)) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE) IF (OENTR_DETR) THEN CALL MZM_MF(D, PTHM (:,:), ZTHM_F (:,:)) @@ -327,58 +327,59 @@ IF (OENTR_DETR) THEN CALL MZM_MF(D, PRHODREF(:,:), ZRHO_F (:,:)) CALL MZM_MF(D, PRVM(:,:), ZRVM_F (:,:)) - !$mnh_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) + !$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) ! thetav at mass and flux levels - ZTHVM_F(D%NIB:D%NIE,:)=ZTHM_F(D%NIB:D%NIE,:)* & - &((1.+ZRVORD*ZRVM_F(D%NIB:D%NIE,:))/(1.+ZRTM_F(D%NIB:D%NIE,:))) - ZTHVM(D%NIB:D%NIE,:)=PTHM(D%NIB:D%NIE,:)* & - &((1.+ZRVORD*PRVM(D%NIB:D%NIE,:))/(1.+PRTM(D%NIB:D%NIE,:))) + ZTHVM_F(D%NIJB:D%NIJE,:)=ZTHM_F(D%NIJB:D%NIJE,:)* & + &((1.+ZRVORD*ZRVM_F(D%NIJB:D%NIJE,:))/(1.+ZRTM_F(D%NIJB:D%NIJE,:))) + ZTHVM(D%NIJB:D%NIJE,:)=PTHM(D%NIJB:D%NIJE,:)* & + &((1.+ZRVORD*PRVM(D%NIJB:D%NIJE,:))/(1.+PRTM(D%NIJB:D%NIJE,:))) - PTHV_UP(D%NIB:D%NIE,:)=ZTHVM_F(D%NIB:D%NIE,:) - !$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) + PTHV_UP(D%NIJB:D%NIJE,:)=ZTHVM_F(D%NIJB:D%NIJE,:) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) ZW_UP2(:,:)=0. - !$mnh_expand_array(JI=D%NIB:D%NIE) - ZW_UP2(D%NIB:D%NIE,D%NKB) = MAX(0.0001,(2./3.)*ZTKEM_F(D%NIB:D%NIE,D%NKB)) + !$mnh_expand_array(JI=D%NIJB:D%NIJE) + ZW_UP2(D%NIJB:D%NIJE,D%NKB) = MAX(0.0001,(2./3.)*ZTKEM_F(D%NIJB:D%NIJE,D%NKB)) ! Computation of non conservative variable for the KKB level of the updraft ! (all or nothing ajustement) PRC_UP(:,D%NKB)=0. PRI_UP(:,D%NKB)=0. - !$mnh_end_expand_array(JI=D%NIB:D%NIE) - CALL TH_R_FROM_THL_RT(CST, NEB, D%NIT, HFRAC_ICE,PFRAC_ICE_UP(:,D%NKB),ZPRES_F(:,D%NKB), & + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE) + CALL TH_R_FROM_THL_RT(CST, NEB, D%NIJT, HFRAC_ICE,PFRAC_ICE_UP(:,D%NKB),ZPRES_F(:,D%NKB), & PTHL_UP(:,D%NKB),PRT_UP(:,D%NKB),ZTH_UP(:,D%NKB), & PRV_UP(:,D%NKB),PRC_UP(:,D%NKB),PRI_UP(:,D%NKB),ZRSATW(:),ZRSATI(:), OOCEAN=.FALSE., & - PBUF=ZBUF(:,:), KB=D%NIB, KE=D%NIE) + PBUF=ZBUF(:,:), KB=D%NIJB, KE=D%NIJE) - !$mnh_expand_array(JI=D%NIB:D%NIE) + !$mnh_expand_array(JI=D%NIJB:D%NIJE) ! compute updraft thevav and buoyancy term at KKB level - PTHV_UP(D%NIB:D%NIE,D%NKB) = ZTH_UP(D%NIB:D%NIE,D%NKB)*((1+ZRVORD*PRV_UP(D%NIB:D%NIE,D%NKB))/(1+PRT_UP(D%NIB:D%NIE,D%NKB))) + PTHV_UP(D%NIJB:D%NIJE,D%NKB) = ZTH_UP(D%NIJB:D%NIJE,D%NKB)*& + & ((1+ZRVORD*PRV_UP(D%NIJB:D%NIJE,D%NKB))/(1+PRT_UP(D%NIJB:D%NIJE,D%NKB))) ! compute mean rsat in updraft - PRSAT_UP(D%NIB:D%NIE,D%NKB) = ZRSATW(D%NIB:D%NIE)*(1-PFRAC_ICE_UP(D%NIB:D%NIE,D%NKB)) + & - & ZRSATI(D%NIB:D%NIE)*PFRAC_ICE_UP(D%NIB:D%NIE,D%NKB) - !$mnh_end_expand_array(JI=D%NIB:D%NIE) + PRSAT_UP(D%NIJB:D%NIJE,D%NKB) = ZRSATW(D%NIJB:D%NIJE)*(1-PFRAC_ICE_UP(D%NIJB:D%NIJE,D%NKB)) + & + & ZRSATI(D%NIJB:D%NIJE)*PFRAC_ICE_UP(D%NIJB:D%NIJE,D%NKB) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE) ! Closure assumption for mass flux at KKB level ! - !$mnh_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) - ZG_O_THVREF(D%NIB:D%NIE,:)=CST%XG/ZTHVM_F(D%NIB:D%NIE,:) - !$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) + !$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) + ZG_O_THVREF(D%NIJB:D%NIJE,:)=CST%XG/ZTHVM_F(D%NIJB:D%NIJE,:) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) ! compute L_up GLMIX=.TRUE. - !$mnh_expand_array(JI=D%NIB:D%NIE) - ZTKEM_F(D%NIB:D%NIE,D%NKB)=0. - !$mnh_end_expand_array(JI=D%NIB:D%NIE) + !$mnh_expand_array(JI=D%NIJB:D%NIJE) + ZTKEM_F(D%NIJB:D%NIJE,D%NKB)=0. + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE) ! IF(TURB%CTURBLEN=='RM17') THEN CALL GZ_M_W_MF(D, PUM, PDZZ, ZWK) CALL MZF_MF(D, ZWK, ZDUDZ) CALL GZ_M_W_MF(D, PVM, PDZZ, ZWK) CALL MZF_MF(D, ZWK, ZDVDZ) - !$mnh_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) - ZSHEAR(D%NIB:D%NIE,:) = SQRT(ZDUDZ(D%NIB:D%NIE,:)**2 + ZDVDZ(D%NIB:D%NIE,:)**2) - !$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) + !$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) + ZSHEAR(D%NIJB:D%NIJE,:) = SQRT(ZDUDZ(D%NIJB:D%NIJE,:)**2 + ZDVDZ(D%NIJB:D%NIJE,:)**2) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) ELSE ZSHEAR = 0. !no shear in bl89 mixing length END IF @@ -390,35 +391,35 @@ IF (OENTR_DETR) THEN CALL COMPUTE_BL89_ML(D, CST, CSTURB, PDZZ,ZTKEM_F(:,D%NKB),& &ZG_O_THVREF(:,D%NKB),ZTHVM,D%NKB,GLMIX,.FALSE.,ZSHEAR,ZLUP) #endif - !$mnh_expand_where(JI=D%NIB:D%NIE) - ZLUP(D%NIB:D%NIE)=MAX(ZLUP(D%NIB:D%NIE),1.E-10) + !$mnh_expand_where(JI=D%NIJB:D%NIJE) + ZLUP(D%NIJB:D%NIJE)=MAX(ZLUP(D%NIJB:D%NIJE),1.E-10) ! Compute Buoyancy flux at the ground - ZWTHVSURF(D%NIB:D%NIE) = (ZTHVM_F(D%NIB:D%NIE,D%NKB)/ZTHM_F(D%NIB:D%NIE,D%NKB))*PSFTH(D%NIB:D%NIE)+ & - (0.61*ZTHM_F(D%NIB:D%NIE,D%NKB))*PSFRV(D%NIB:D%NIE) + ZWTHVSURF(D%NIJB:D%NIJE) = (ZTHVM_F(D%NIJB:D%NIJE,D%NKB)/ZTHM_F(D%NIJB:D%NIJE,D%NKB))*PSFTH(D%NIJB:D%NIJE)+ & + (0.61*ZTHM_F(D%NIJB:D%NIJE,D%NKB))*PSFRV(D%NIJB:D%NIJE) ! Mass flux at KKB level (updraft triggered if PSFTH>0.) IF (PARAMMF%LGZ) THEN - ZSURF(D%NIB:D%NIE)=TANH(PARAMMF%XGZ*SQRT(PDX*PDY)/ZLUP(D%NIB:D%NIE)) + ZSURF(D%NIJB:D%NIJE)=TANH(PARAMMF%XGZ*SQRT(PDX*PDY)/ZLUP(D%NIJB:D%NIJE)) ELSE - ZSURF(D%NIB:D%NIE)=1. + ZSURF(D%NIJB:D%NIJE)=1. END IF - WHERE (ZWTHVSURF(D%NIB:D%NIE)>0.) - PEMF(D%NIB:D%NIE,D%NKB) = PARAMMF%XCMF * ZSURF(D%NIB:D%NIE) * ZRHO_F(D%NIB:D%NIE,D%NKB) * & - ((ZG_O_THVREF(D%NIB:D%NIE,D%NKB))*ZWTHVSURF(D%NIB:D%NIE)*ZLUP(D%NIB:D%NIE))**(1./3.) - PFRAC_UP(D%NIB:D%NIE,D%NKB)=MIN(PEMF(D%NIB:D%NIE,D%NKB)/(SQRT(ZW_UP2(D%NIB:D%NIE,D%NKB))*ZRHO_F(D%NIB:D%NIE,D%NKB)), & + WHERE (ZWTHVSURF(D%NIJB:D%NIJE)>0.) + PEMF(D%NIJB:D%NIJE,D%NKB) = PARAMMF%XCMF * ZSURF(D%NIJB:D%NIJE) * ZRHO_F(D%NIJB:D%NIJE,D%NKB) * & + ((ZG_O_THVREF(D%NIJB:D%NIJE,D%NKB))*ZWTHVSURF(D%NIJB:D%NIJE)*ZLUP(D%NIJB:D%NIJE))**(1./3.) + PFRAC_UP(D%NIJB:D%NIJE,D%NKB)=MIN(PEMF(D%NIJB:D%NIJE,D%NKB)/(SQRT(ZW_UP2(D%NIJB:D%NIJE,D%NKB))*ZRHO_F(D%NIJB:D%NIJE,D%NKB)), & &PARAMMF%XFRAC_UP_MAX) - ZW_UP2(D%NIB:D%NIE,D%NKB)=(PEMF(D%NIB:D%NIE,D%NKB)/(PFRAC_UP(D%NIB:D%NIE,D%NKB)*ZRHO_F(D%NIB:D%NIE,D%NKB)))**2 - GTEST(D%NIB:D%NIE)=.TRUE. + ZW_UP2(D%NIJB:D%NIJE,D%NKB)=(PEMF(D%NIJB:D%NIJE,D%NKB)/(PFRAC_UP(D%NIJB:D%NIJE,D%NKB)*ZRHO_F(D%NIJB:D%NIJE,D%NKB)))**2 + GTEST(D%NIJB:D%NIJE)=.TRUE. ELSEWHERE - PEMF(D%NIB:D%NIE,D%NKB) =0. - GTEST(D%NIB:D%NIE)=.FALSE. + PEMF(D%NIJB:D%NIJE,D%NKB) =0. + GTEST(D%NIJB:D%NIJE)=.FALSE. ENDWHERE - !$mnh_end_expand_where(JI=D%NIB:D%NIE) + !$mnh_end_expand_where(JI=D%NIJB:D%NIJE) ELSE - !$mnh_expand_array(JI=D%NIB:D%NIE) - GTEST(D%NIB:D%NIE)=PEMF(D%NIB:D%NIE,D%NKB+D%NKL)>0. - !$mnh_end_expand_array(JI=D%NIB:D%NIE) + !$mnh_expand_array(JI=D%NIJB:D%NIJE) + GTEST(D%NIJB:D%NIJE)=PEMF(D%NIJB:D%NIJE,D%NKB+D%NKL)>0. + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE) END IF !-------------------------------------------------------------------------- @@ -437,7 +438,7 @@ GTESTETL(:)=.FALSE. DO JK=D%NKB,D%NKE-D%NKL,D%NKL ! IF the updraft top is reached for all column, stop the loop on levels - ITEST=COUNT(GTEST(D%NIB:D%NIE)) + ITEST=COUNT(GTEST(D%NIJB:D%NIJE)) IF (ITEST==0) CYCLE ! Computation of entrainment and detrainment with KF90 @@ -445,20 +446,20 @@ DO JK=D%NKB,D%NKE-D%NKL,D%NKL ! to find the LCL (check if JK is LCL or not) - !$mnh_expand_where(JI=D%NIB:D%NIE) - WHERE ((PRC_UP(D%NIB:D%NIE,JK)+PRI_UP(D%NIB:D%NIE,JK)>0.).AND.(.NOT.(GTESTLCL(D%NIB:D%NIE)))) - KKLCL(D%NIB:D%NIE) = JK - GTESTLCL(D%NIB:D%NIE)=.TRUE. + !$mnh_expand_where(JI=D%NIJB:D%NIJE) + WHERE ((PRC_UP(D%NIJB:D%NIJE,JK)+PRI_UP(D%NIJB:D%NIJE,JK)>0.).AND.(.NOT.(GTESTLCL(D%NIJB:D%NIJE)))) + KKLCL(D%NIJB:D%NIJE) = JK + GTESTLCL(D%NIJB:D%NIJE)=.TRUE. ENDWHERE - !$mnh_end_expand_where(JI=D%NIB:D%NIE) + !$mnh_end_expand_where(JI=D%NIJB:D%NIJE) ! COMPUTE PENTR and PDETR at mass level JK IF (OENTR_DETR) THEN IF(JK/=D%NKB) THEN - !$mnh_expand_array(JI=D%NIB:D%NIE) - ZRC_MIX(D%NIB:D%NIE,JK) = ZRC_MIX(D%NIB:D%NIE,JK-D%NKL) ! guess of Rc of mixture - ZRI_MIX(D%NIB:D%NIE,JK) = ZRI_MIX(D%NIB:D%NIE,JK-D%NKL) ! guess of Ri of mixture - !$mnh_end_expand_array(JI=D%NIB:D%NIE) + !$mnh_expand_array(JI=D%NIJB:D%NIJE) + ZRC_MIX(D%NIJB:D%NIJE,JK) = ZRC_MIX(D%NIJB:D%NIJE,JK-D%NKL) ! guess of Rc of mixture + ZRI_MIX(D%NIJB:D%NIJE,JK) = ZRI_MIX(D%NIJB:D%NIJE,JK-D%NKL) ! guess of Ri of mixture + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE) ENDIF CALL COMPUTE_ENTR_DETR(D, CST, NEB, PARAMMF, JK,D%NKB,D%NKE,D%NKL,GTEST,GTESTLCL,HFRAC_ICE,PFRAC_ICE_UP(:,JK),& PRHODREF(:,JK),ZPRES_F(:,JK),ZPRES_F(:,JK+D%NKL),& @@ -470,39 +471,40 @@ DO JK=D%NKB,D%NKE-D%NKL,D%NKL PENTR(:,JK),PDETR(:,JK),ZENTR_CLD(:,JK),ZDETR_CLD(:,JK),& ZBUO_INTEG_DRY(:,JK), ZBUO_INTEG_CLD(:,JK), & ZPART_DRY(:) ) - !$mnh_expand_where(JI=D%NIB:D%NIE) - PBUO_INTEG(D%NIB:D%NIE,JK)=ZBUO_INTEG_DRY(D%NIB:D%NIE,JK)+ZBUO_INTEG_CLD(D%NIB:D%NIE,JK) + !$mnh_expand_where(JI=D%NIJB:D%NIJE) + PBUO_INTEG(D%NIJB:D%NIJE,JK)=ZBUO_INTEG_DRY(D%NIJB:D%NIJE,JK)+ZBUO_INTEG_CLD(D%NIJB:D%NIJE,JK) IF (JK==D%NKB) THEN - PDETR(D%NIB:D%NIE,JK)=0. - ZDETR_CLD(D%NIB:D%NIE,JK)=0. + PDETR(D%NIJB:D%NIJE,JK)=0. + ZDETR_CLD(D%NIJB:D%NIJE,JK)=0. ENDIF ! Computation of updraft characteristics at level JK+KKL - WHERE(GTEST(D%NIB:D%NIE)) - ZMIX1(D%NIB:D%NIE)=0.5*(PZZ(D%NIB:D%NIE,JK+D%NKL)-PZZ(D%NIB:D%NIE,JK))*(PENTR(D%NIB:D%NIE,JK)-PDETR(D%NIB:D%NIE,JK)) - PEMF(D%NIB:D%NIE,JK+D%NKL)=PEMF(D%NIB:D%NIE,JK)*EXP(2*ZMIX1(D%NIB:D%NIE)) + WHERE(GTEST(D%NIJB:D%NIJE)) + ZMIX1(D%NIJB:D%NIJE)=0.5*(PZZ(D%NIJB:D%NIJE,JK+D%NKL)-PZZ(D%NIJB:D%NIJE,JK))*& + &(PENTR(D%NIJB:D%NIJE,JK)-PDETR(D%NIJB:D%NIJE,JK)) + PEMF(D%NIJB:D%NIJE,JK+D%NKL)=PEMF(D%NIJB:D%NIJE,JK)*EXP(2*ZMIX1(D%NIJB:D%NIJE)) ENDWHERE - !$mnh_end_expand_where(JI=D%NIB:D%NIE) + !$mnh_end_expand_where(JI=D%NIJB:D%NIJE) ELSE !OENTR_DETR - !$mnh_expand_array(JI=D%NIB:D%NIE) - GTEST(D%NIB:D%NIE) = (PEMF(D%NIB:D%NIE,JK+D%NKL)>0.) - !$mnh_end_expand_array(JI=D%NIB:D%NIE) + !$mnh_expand_array(JI=D%NIJB:D%NIJE) + GTEST(D%NIJB:D%NIJE) = (PEMF(D%NIJB:D%NIJE,JK+D%NKL)>0.) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE) END IF !OENTR_DETR ! stop the updraft if MF becomes negative - !$mnh_expand_where(JI=D%NIB:D%NIE) - WHERE (GTEST(D%NIB:D%NIE).AND.(PEMF(D%NIB:D%NIE,JK+D%NKL)<=0.)) - PEMF(D%NIB:D%NIE,JK+D%NKL)=0. - KKCTL(D%NIB:D%NIE) = JK+D%NKL - GTEST(D%NIB:D%NIE)=.FALSE. - PFRAC_ICE_UP(D%NIB:D%NIE,JK+D%NKL)=PFRAC_ICE_UP(D%NIB:D%NIE,JK) - PRSAT_UP(D%NIB:D%NIE,JK+D%NKL)=PRSAT_UP(D%NIB:D%NIE,JK) + !$mnh_expand_where(JI=D%NIJB:D%NIJE) + WHERE (GTEST(D%NIJB:D%NIJE).AND.(PEMF(D%NIJB:D%NIJE,JK+D%NKL)<=0.)) + PEMF(D%NIJB:D%NIJE,JK+D%NKL)=0. + KKCTL(D%NIJB:D%NIJE) = JK+D%NKL + GTEST(D%NIJB:D%NIJE)=.FALSE. + PFRAC_ICE_UP(D%NIJB:D%NIJE,JK+D%NKL)=PFRAC_ICE_UP(D%NIJB:D%NIJE,JK) + PRSAT_UP(D%NIJB:D%NIJE,JK+D%NKL)=PRSAT_UP(D%NIJB:D%NIJE,JK) ENDWHERE - !$mnh_end_expand_where(JI=D%NIB:D%NIE) + !$mnh_end_expand_where(JI=D%NIJB:D%NIJE) ! If the updraft did not stop, compute cons updraft characteritics at jk+KKL - DO JI=D%NIB,D%NIE + DO JI=D%NIJB,D%NIJE IF(GTEST(JI)) THEN ZMIX2(JI) = (PZZ(JI,JK+D%NKL)-PZZ(JI,JK))*PENTR(JI,JK) !& ZMIX3_CLD(JI) = (PZZ(JI,JK+D%NKL)-PZZ(JI,JK))*(1.-ZPART_DRY(JI))*ZDETR_CLD(JI,JK) !& @@ -521,137 +523,142 @@ DO JK=D%NKB,D%NKE-D%NKL,D%NKL IF(OMIXUV) THEN IF(JK/=D%NKB) THEN - !$mnh_expand_where(JI=D%NIB:D%NIE) - WHERE(GTEST(D%NIB:D%NIE)) - PU_UP(D%NIB:D%NIE,JK+D%NKL) = (PU_UP(D%NIB:D%NIE,JK)*(1-0.5*ZMIX2(D%NIB:D%NIE)) + PUM(D%NIB:D%NIE,JK)*ZMIX2(D%NIB:D%NIE)+ & - 0.5*PARAMMF%XPRES_UV*(PZZ(D%NIB:D%NIE,JK+D%NKL)-PZZ(D%NIB:D%NIE,JK))*& - ((PUM(D%NIB:D%NIE,JK+D%NKL)-PUM(D%NIB:D%NIE,JK))/PDZZ(D%NIB:D%NIE,JK+D%NKL)+& - (PUM(D%NIB:D%NIE,JK)-PUM(D%NIB:D%NIE,JK-D%NKL))/PDZZ(D%NIB:D%NIE,JK)) ) & - /(1+0.5*ZMIX2(D%NIB:D%NIE)) - PV_UP(D%NIB:D%NIE,JK+D%NKL) = (PV_UP(D%NIB:D%NIE,JK)*(1-0.5*ZMIX2(D%NIB:D%NIE)) + PVM(D%NIB:D%NIE,JK)*ZMIX2(D%NIB:D%NIE)+ & - 0.5*PARAMMF%XPRES_UV*(PZZ(D%NIB:D%NIE,JK+D%NKL)-PZZ(D%NIB:D%NIE,JK))*& - ((PVM(D%NIB:D%NIE,JK+D%NKL)-PVM(D%NIB:D%NIE,JK))/PDZZ(D%NIB:D%NIE,JK+D%NKL)+& - (PVM(D%NIB:D%NIE,JK)-PVM(D%NIB:D%NIE,JK-D%NKL))/PDZZ(D%NIB:D%NIE,JK)) ) & - /(1+0.5*ZMIX2(D%NIB:D%NIE)) + !$mnh_expand_where(JI=D%NIJB:D%NIJE) + WHERE(GTEST(D%NIJB:D%NIJE)) + PU_UP(D%NIJB:D%NIJE,JK+D%NKL) = (PU_UP(D%NIJB:D%NIJE,JK)*(1-0.5*ZMIX2(D%NIJB:D%NIJE)) + & + &PUM(D%NIJB:D%NIJE,JK)*ZMIX2(D%NIJB:D%NIJE)+ & + 0.5*PARAMMF%XPRES_UV*(PZZ(D%NIJB:D%NIJE,JK+D%NKL)-PZZ(D%NIJB:D%NIJE,JK))*& + ((PUM(D%NIJB:D%NIJE,JK+D%NKL)-PUM(D%NIJB:D%NIJE,JK))/PDZZ(D%NIJB:D%NIJE,JK+D%NKL)+& + (PUM(D%NIJB:D%NIJE,JK)-PUM(D%NIJB:D%NIJE,JK-D%NKL))/PDZZ(D%NIJB:D%NIJE,JK)) ) & + /(1+0.5*ZMIX2(D%NIJB:D%NIJE)) + PV_UP(D%NIJB:D%NIJE,JK+D%NKL) = (PV_UP(D%NIJB:D%NIJE,JK)*(1-0.5*ZMIX2(D%NIJB:D%NIJE)) + & + &PVM(D%NIJB:D%NIJE,JK)*ZMIX2(D%NIJB:D%NIJE)+ & + 0.5*PARAMMF%XPRES_UV*(PZZ(D%NIJB:D%NIJE,JK+D%NKL)-PZZ(D%NIJB:D%NIJE,JK))*& + ((PVM(D%NIJB:D%NIJE,JK+D%NKL)-PVM(D%NIJB:D%NIJE,JK))/PDZZ(D%NIJB:D%NIJE,JK+D%NKL)+& + (PVM(D%NIJB:D%NIJE,JK)-PVM(D%NIJB:D%NIJE,JK-D%NKL))/PDZZ(D%NIJB:D%NIJE,JK)) ) & + /(1+0.5*ZMIX2(D%NIJB:D%NIJE)) ENDWHERE - !$mnh_end_expand_where(JI=D%NIB:D%NIE) + !$mnh_end_expand_where(JI=D%NIJB:D%NIJE) ELSE - !$mnh_expand_where(JI=D%NIB:D%NIE) - WHERE(GTEST(D%NIB:D%NIE)) - PU_UP(D%NIB:D%NIE,JK+D%NKL) = (PU_UP(D%NIB:D%NIE,JK)*(1-0.5*ZMIX2(D%NIB:D%NIE)) + PUM(D%NIB:D%NIE,JK)*ZMIX2(D%NIB:D%NIE)+ & - 0.5*PARAMMF%XPRES_UV*(PZZ(D%NIB:D%NIE,JK+D%NKL)-PZZ(D%NIB:D%NIE,JK))*& - ((PUM(D%NIB:D%NIE,JK+D%NKL)-PUM(D%NIB:D%NIE,JK))/PDZZ(D%NIB:D%NIE,JK+D%NKL)) ) & - /(1+0.5*ZMIX2(D%NIB:D%NIE)) - PV_UP(D%NIB:D%NIE,JK+D%NKL) = (PV_UP(D%NIB:D%NIE,JK)*(1-0.5*ZMIX2(D%NIB:D%NIE)) + PVM(D%NIB:D%NIE,JK)*ZMIX2(D%NIB:D%NIE)+ & - 0.5*PARAMMF%XPRES_UV*(PZZ(D%NIB:D%NIE,JK+D%NKL)-PZZ(D%NIB:D%NIE,JK))*& - ((PVM(D%NIB:D%NIE,JK+D%NKL)-PVM(D%NIB:D%NIE,JK))/PDZZ(D%NIB:D%NIE,JK+D%NKL)) ) & - /(1+0.5*ZMIX2(D%NIB:D%NIE)) + !$mnh_expand_where(JI=D%NIJB:D%NIJE) + WHERE(GTEST(D%NIJB:D%NIJE)) + PU_UP(D%NIJB:D%NIJE,JK+D%NKL) = (PU_UP(D%NIJB:D%NIJE,JK)*(1-0.5*ZMIX2(D%NIJB:D%NIJE)) + & + &PUM(D%NIJB:D%NIJE,JK)*ZMIX2(D%NIJB:D%NIJE)+ & + 0.5*PARAMMF%XPRES_UV*(PZZ(D%NIJB:D%NIJE,JK+D%NKL)-PZZ(D%NIJB:D%NIJE,JK))*& + ((PUM(D%NIJB:D%NIJE,JK+D%NKL)-PUM(D%NIJB:D%NIJE,JK))/PDZZ(D%NIJB:D%NIJE,JK+D%NKL)) ) & + /(1+0.5*ZMIX2(D%NIJB:D%NIJE)) + PV_UP(D%NIJB:D%NIJE,JK+D%NKL) = (PV_UP(D%NIJB:D%NIJE,JK)*(1-0.5*ZMIX2(D%NIJB:D%NIJE)) + & + &PVM(D%NIJB:D%NIJE,JK)*ZMIX2(D%NIJB:D%NIJE)+ & + 0.5*PARAMMF%XPRES_UV*(PZZ(D%NIJB:D%NIJE,JK+D%NKL)-PZZ(D%NIJB:D%NIJE,JK))*& + ((PVM(D%NIJB:D%NIJE,JK+D%NKL)-PVM(D%NIJB:D%NIJE,JK))/PDZZ(D%NIJB:D%NIJE,JK+D%NKL)) ) & + /(1+0.5*ZMIX2(D%NIJB:D%NIJE)) ENDWHERE - !$mnh_end_expand_where(JI=D%NIB:D%NIE) + !$mnh_end_expand_where(JI=D%NIJB:D%NIJE) ENDIF ENDIF !OMIXUV DO JSV=1,KSV IF (ONOMIXLG .AND. JSV >= KSV_LGBEG .AND. JSV<= KSV_LGEND) CYCLE - !$mnh_expand_where(JI=D%NIB:D%NIE) - WHERE(GTEST(D%NIB:D%NIE)) - PSV_UP(D%NIB:D%NIE,JK+D%NKL,JSV) = (PSV_UP(D%NIB:D%NIE,JK,JSV)*(1-0.5*ZMIX2(D%NIB:D%NIE)) + & - PSVM(D%NIB:D%NIE,JK,JSV)*ZMIX2(D%NIB:D%NIE)) /(1+0.5*ZMIX2(D%NIB:D%NIE)) + !$mnh_expand_where(JI=D%NIJB:D%NIJE) + WHERE(GTEST(D%NIJB:D%NIJE)) + PSV_UP(D%NIJB:D%NIJE,JK+D%NKL,JSV) = (PSV_UP(D%NIJB:D%NIJE,JK,JSV)*(1-0.5*ZMIX2(D%NIJB:D%NIJE)) + & + PSVM(D%NIJB:D%NIJE,JK,JSV)*ZMIX2(D%NIJB:D%NIJE)) /(1+0.5*ZMIX2(D%NIJB:D%NIJE)) ENDWHERE - !$mnh_end_expand_where(JI=D%NIB:D%NIE) + !$mnh_end_expand_where(JI=D%NIJB:D%NIJE) END DO IF (OENTR_DETR) THEN ! Compute non cons. var. at level JK+KKL - !$mnh_expand_array(JI=D%NIB:D%NIE) - ZRC_UP(D%NIB:D%NIE)=PRC_UP(D%NIB:D%NIE,JK) ! guess = level just below - ZRI_UP(D%NIB:D%NIE)=PRI_UP(D%NIB:D%NIE,JK) ! guess = level just below - !$mnh_end_expand_array(JI=D%NIB:D%NIE) - CALL TH_R_FROM_THL_RT(CST, NEB, D%NIT, HFRAC_ICE,PFRAC_ICE_UP(:,JK+D%NKL),ZPRES_F(:,JK+D%NKL), & + !$mnh_expand_array(JI=D%NIJB:D%NIJE) + ZRC_UP(D%NIJB:D%NIJE)=PRC_UP(D%NIJB:D%NIJE,JK) ! guess = level just below + ZRI_UP(D%NIJB:D%NIJE)=PRI_UP(D%NIJB:D%NIJE,JK) ! guess = level just below + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE) + CALL TH_R_FROM_THL_RT(CST, NEB, D%NIJT, HFRAC_ICE,PFRAC_ICE_UP(:,JK+D%NKL),ZPRES_F(:,JK+D%NKL), & PTHL_UP(:,JK+D%NKL),PRT_UP(:,JK+D%NKL),ZTH_UP(:,JK+D%NKL), & ZRV_UP(:),ZRC_UP(:),ZRI_UP(:),ZRSATW(:),ZRSATI(:), OOCEAN=.FALSE., & - PBUF=ZBUF(:,:), KB=D%NIB, KE=D%NIE) - !$mnh_expand_where(JI=D%NIB:D%NIE) - WHERE(GTEST(D%NIB:D%NIE)) - PRC_UP(D%NIB:D%NIE,JK+D%NKL)=ZRC_UP(D%NIB:D%NIE) - PRV_UP(D%NIB:D%NIE,JK+D%NKL)=ZRV_UP(D%NIB:D%NIE) - PRI_UP(D%NIB:D%NIE,JK+D%NKL)=ZRI_UP(D%NIB:D%NIE) - PRSAT_UP(D%NIB:D%NIE,JK+D%NKL) = ZRSATW(D%NIB:D%NIE)*(1-PFRAC_ICE_UP(D%NIB:D%NIE,JK+D%NKL)) + & - & ZRSATI(D%NIB:D%NIE)*PFRAC_ICE_UP(D%NIB:D%NIE,JK+D%NKL) + PBUF=ZBUF(:,:), KB=D%NIJB, KE=D%NIJE) + !$mnh_expand_where(JI=D%NIJB:D%NIJE) + WHERE(GTEST(D%NIJB:D%NIJE)) + PRC_UP(D%NIJB:D%NIJE,JK+D%NKL)=ZRC_UP(D%NIJB:D%NIJE) + PRV_UP(D%NIJB:D%NIJE,JK+D%NKL)=ZRV_UP(D%NIJB:D%NIJE) + PRI_UP(D%NIJB:D%NIJE,JK+D%NKL)=ZRI_UP(D%NIJB:D%NIJE) + PRSAT_UP(D%NIJB:D%NIJE,JK+D%NKL) = ZRSATW(D%NIJB:D%NIJE)*(1-PFRAC_ICE_UP(D%NIJB:D%NIJE,JK+D%NKL)) + & + & ZRSATI(D%NIJB:D%NIJE)*PFRAC_ICE_UP(D%NIJB:D%NIJE,JK+D%NKL) ENDWHERE ! Compute the updraft theta_v, buoyancy and w**2 for level JK+KKL - WHERE(GTEST(D%NIB:D%NIE)) - PTHV_UP(D%NIB:D%NIE,JK+D%NKL) = ZTH_UP(D%NIB:D%NIE,JK+D%NKL)* & - & ((1+ZRVORD*PRV_UP(D%NIB:D%NIE,JK+D%NKL))/(1+PRT_UP(D%NIB:D%NIE,JK+D%NKL))) - WHERE (ZBUO_INTEG_DRY(D%NIB:D%NIE,JK)>0.) - ZW_UP2(D%NIB:D%NIE,JK+D%NKL) = ZW_UP2(D%NIB:D%NIE,JK) + 2.*(PARAMMF%XABUO-PARAMMF%XBENTR*PARAMMF%XENTR_DRY)* & - &ZBUO_INTEG_DRY(D%NIB:D%NIE,JK) + WHERE(GTEST(D%NIJB:D%NIJE)) + PTHV_UP(D%NIJB:D%NIJE,JK+D%NKL) = ZTH_UP(D%NIJB:D%NIJE,JK+D%NKL)* & + & ((1+ZRVORD*PRV_UP(D%NIJB:D%NIJE,JK+D%NKL))/(1+PRT_UP(D%NIJB:D%NIJE,JK+D%NKL))) + WHERE (ZBUO_INTEG_DRY(D%NIJB:D%NIJE,JK)>0.) + ZW_UP2(D%NIJB:D%NIJE,JK+D%NKL) = ZW_UP2(D%NIJB:D%NIJE,JK) + 2.*(PARAMMF%XABUO-PARAMMF%XBENTR*PARAMMF%XENTR_DRY)* & + &ZBUO_INTEG_DRY(D%NIJB:D%NIJE,JK) ELSEWHERE - ZW_UP2(D%NIB:D%NIE,JK+D%NKL) = ZW_UP2(D%NIB:D%NIE,JK) + 2.*PARAMMF%XABUO* ZBUO_INTEG_DRY(D%NIB:D%NIE,JK) + ZW_UP2(D%NIJB:D%NIJE,JK+D%NKL) = ZW_UP2(D%NIJB:D%NIJE,JK) + 2.*PARAMMF%XABUO* ZBUO_INTEG_DRY(D%NIJB:D%NIJE,JK) ENDWHERE - ZW_UP2(D%NIB:D%NIE,JK+D%NKL) = ZW_UP2(D%NIB:D%NIE,JK+D%NKL)*(1.-(PARAMMF%XBDETR*ZMIX3_CLD(D%NIB:D%NIE)+ & - &PARAMMF%XBENTR*ZMIX2_CLD(D%NIB:D%NIE)))& - /(1.+(PARAMMF%XBDETR*ZMIX3_CLD(D%NIB:D%NIE)+PARAMMF%XBENTR*ZMIX2_CLD(D%NIB:D%NIE))) & - +2.*(PARAMMF%XABUO)*ZBUO_INTEG_CLD(D%NIB:D%NIE,JK)/ & - &(1.+(PARAMMF%XBDETR*ZMIX3_CLD(D%NIB:D%NIE)+PARAMMF%XBENTR*ZMIX2_CLD(D%NIB:D%NIE))) + ZW_UP2(D%NIJB:D%NIJE,JK+D%NKL) = ZW_UP2(D%NIJB:D%NIJE,JK+D%NKL)*(1.-(PARAMMF%XBDETR*ZMIX3_CLD(D%NIJB:D%NIJE)+ & + &PARAMMF%XBENTR*ZMIX2_CLD(D%NIJB:D%NIJE)))& + /(1.+(PARAMMF%XBDETR*ZMIX3_CLD(D%NIJB:D%NIJE)+PARAMMF%XBENTR*ZMIX2_CLD(D%NIJB:D%NIJE))) & + +2.*(PARAMMF%XABUO)*ZBUO_INTEG_CLD(D%NIJB:D%NIJE,JK)/ & + &(1.+(PARAMMF%XBDETR*ZMIX3_CLD(D%NIJB:D%NIJE)+PARAMMF%XBENTR*ZMIX2_CLD(D%NIJB:D%NIJE))) ENDWHERE ! Test if the updraft has reach the ETL - WHERE (GTEST(D%NIB:D%NIE).AND.(PBUO_INTEG(D%NIB:D%NIE,JK)<=0.)) - KKETL(D%NIB:D%NIE) = JK+D%NKL - GTESTETL(D%NIB:D%NIE)=.TRUE. + WHERE (GTEST(D%NIJB:D%NIJE).AND.(PBUO_INTEG(D%NIJB:D%NIJE,JK)<=0.)) + KKETL(D%NIJB:D%NIJE) = JK+D%NKL + GTESTETL(D%NIJB:D%NIJE)=.TRUE. ELSEWHERE - GTESTETL(D%NIB:D%NIE)=.FALSE. + GTESTETL(D%NIJB:D%NIJE)=.FALSE. ENDWHERE ! Test is we have reached the top of the updraft - WHERE (GTEST(D%NIB:D%NIE).AND.((ZW_UP2(D%NIB:D%NIE,JK+D%NKL)<=0.).OR.(PEMF(D%NIB:D%NIE,JK+D%NKL)<=0.))) - ZW_UP2(D%NIB:D%NIE,JK+D%NKL)=0. - PEMF(D%NIB:D%NIE,JK+D%NKL)=0. - GTEST(D%NIB:D%NIE)=.FALSE. - PTHL_UP(D%NIB:D%NIE,JK+D%NKL)=ZTHLM_F(D%NIB:D%NIE,JK+D%NKL) - PRT_UP(D%NIB:D%NIE,JK+D%NKL)=ZRTM_F(D%NIB:D%NIE,JK+D%NKL) - PRC_UP(D%NIB:D%NIE,JK+D%NKL)=0. - PRI_UP(D%NIB:D%NIE,JK+D%NKL)=0. - PRV_UP(D%NIB:D%NIE,JK+D%NKL)=0. - PTHV_UP(D%NIB:D%NIE,JK+D%NKL)=ZTHVM_F(D%NIB:D%NIE,JK+D%NKL) - PFRAC_UP(D%NIB:D%NIE,JK+D%NKL)=0. - KKCTL(D%NIB:D%NIE)=JK+D%NKL + WHERE (GTEST(D%NIJB:D%NIJE).AND.((ZW_UP2(D%NIJB:D%NIJE,JK+D%NKL)<=0.).OR.(PEMF(D%NIJB:D%NIJE,JK+D%NKL)<=0.))) + ZW_UP2(D%NIJB:D%NIJE,JK+D%NKL)=0. + PEMF(D%NIJB:D%NIJE,JK+D%NKL)=0. + GTEST(D%NIJB:D%NIJE)=.FALSE. + PTHL_UP(D%NIJB:D%NIJE,JK+D%NKL)=ZTHLM_F(D%NIJB:D%NIJE,JK+D%NKL) + PRT_UP(D%NIJB:D%NIJE,JK+D%NKL)=ZRTM_F(D%NIJB:D%NIJE,JK+D%NKL) + PRC_UP(D%NIJB:D%NIJE,JK+D%NKL)=0. + PRI_UP(D%NIJB:D%NIJE,JK+D%NKL)=0. + PRV_UP(D%NIJB:D%NIJE,JK+D%NKL)=0. + PTHV_UP(D%NIJB:D%NIJE,JK+D%NKL)=ZTHVM_F(D%NIJB:D%NIJE,JK+D%NKL) + PFRAC_UP(D%NIJB:D%NIJE,JK+D%NKL)=0. + KKCTL(D%NIJB:D%NIJE)=JK+D%NKL ENDWHERE ! compute frac_up at JK+KKL - WHERE (GTEST(D%NIB:D%NIE)) - PFRAC_UP(D%NIB:D%NIE,JK+D%NKL)=PEMF(D%NIB:D%NIE,JK+D%NKL)/(SQRT(ZW_UP2(D%NIB:D%NIE,JK+D%NKL))*ZRHO_F(D%NIB:D%NIE,JK+D%NKL)) + WHERE (GTEST(D%NIJB:D%NIJE)) + PFRAC_UP(D%NIJB:D%NIJE,JK+D%NKL)=PEMF(D%NIJB:D%NIJE,JK+D%NKL)/& + &(SQRT(ZW_UP2(D%NIJB:D%NIJE,JK+D%NKL))*ZRHO_F(D%NIJB:D%NIJE,JK+D%NKL)) ENDWHERE ! Updraft fraction must be smaller than XFRAC_UP_MAX - WHERE (GTEST(D%NIB:D%NIE)) - PFRAC_UP(D%NIB:D%NIE,JK+D%NKL)=MIN(PARAMMF%XFRAC_UP_MAX,PFRAC_UP(D%NIB:D%NIE,JK+D%NKL)) + WHERE (GTEST(D%NIJB:D%NIJE)) + PFRAC_UP(D%NIJB:D%NIJE,JK+D%NKL)=MIN(PARAMMF%XFRAC_UP_MAX,PFRAC_UP(D%NIJB:D%NIJE,JK+D%NKL)) ENDWHERE ! When cloudy and non-buoyant, updraft fraction must decrease - WHERE ((GTEST(D%NIB:D%NIE).AND.GTESTETL(D%NIB:D%NIE)).AND.GTESTLCL(D%NIB:D%NIE)) - PFRAC_UP(D%NIB:D%NIE,JK+D%NKL)=MIN(PFRAC_UP(D%NIB:D%NIE,JK+D%NKL),PFRAC_UP(D%NIB:D%NIE,JK)) + WHERE ((GTEST(D%NIJB:D%NIJE).AND.GTESTETL(D%NIJB:D%NIJE)).AND.GTESTLCL(D%NIJB:D%NIJE)) + PFRAC_UP(D%NIJB:D%NIJE,JK+D%NKL)=MIN(PFRAC_UP(D%NIJB:D%NIJE,JK+D%NKL),PFRAC_UP(D%NIJB:D%NIJE,JK)) ENDWHERE ! Mass flux is updated with the new updraft fraction - IF (OENTR_DETR) PEMF(D%NIB:D%NIE,JK+D%NKL)=PFRAC_UP(D%NIB:D%NIE,JK+D%NKL)*SQRT(ZW_UP2(D%NIB:D%NIE,JK+D%NKL))* & - &ZRHO_F(D%NIB:D%NIE,JK+D%NKL) - !$mnh_end_expand_where(JI=D%NIB:D%NIE) + IF (OENTR_DETR) PEMF(D%NIJB:D%NIJE,JK+D%NKL)=PFRAC_UP(D%NIJB:D%NIJE,JK+D%NKL)*SQRT(ZW_UP2(D%NIJB:D%NIJE,JK+D%NKL))* & + &ZRHO_F(D%NIJB:D%NIJE,JK+D%NKL) + !$mnh_end_expand_where(JI=D%NIJB:D%NIJE) END IF !OENTR_DETR ENDDO IF(OENTR_DETR) THEN - !$mnh_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) - PW_UP(D%NIB:D%NIE,:)=SQRT(ZW_UP2(D%NIB:D%NIE,:)) - !$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) + !$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) + PW_UP(D%NIJB:D%NIJE,:)=SQRT(ZW_UP2(D%NIJB:D%NIJE,:)) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) - !$mnh_expand_array(JI=D%NIB:D%NIE) - PEMF(D%NIB:D%NIE,D%NKB) =0. - !$mnh_end_expand_array(JI=D%NIB:D%NIE) + !$mnh_expand_array(JI=D%NIJB:D%NIJE) + PEMF(D%NIJB:D%NIJE,D%NKB) =0. + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE) ! Limits the shallow convection scheme when cloud heigth is higher than 3000m. ! To do this, mass flux is multiplied by a coefficient decreasing linearly @@ -659,26 +666,26 @@ IF(OENTR_DETR) THEN ! This way, all MF fluxes are diminished by this amount. ! Diagnosed cloud fraction is also multiplied by the same coefficient. ! - DO JI=D%NIB,D%NIE + DO JI=D%NIJB,D%NIJE PDEPTH(JI) = MAX(0., PZZ(JI,KKCTL(JI)) - PZZ(JI,KKLCL(JI)) ) END DO - !$mnh_expand_array(JI=D%NIB:D%NIE) - GWORK1(D%NIB:D%NIE)= (GTESTLCL(D%NIB:D%NIE) .AND. (PDEPTH(D%NIB:D%NIE) > ZDEPTH_MAX1) ) - !$mnh_end_expand_array(JI=D%NIB:D%NIE) + !$mnh_expand_array(JI=D%NIJB:D%NIJE) + GWORK1(D%NIJB:D%NIJE)= (GTESTLCL(D%NIJB:D%NIJE) .AND. (PDEPTH(D%NIJB:D%NIJE) > ZDEPTH_MAX1) ) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE) DO JK=1, D%NKT - !$mnh_expand_array(JI=D%NIB:D%NIE) - GWORK2(D%NIB:D%NIE,JK) = GWORK1(D%NIB:D%NIE) - ZCOEF(D%NIB:D%NIE,JK) = (1.-(PDEPTH(D%NIB:D%NIE)-ZDEPTH_MAX1)/(ZDEPTH_MAX2-ZDEPTH_MAX1)) - ZCOEF(D%NIB:D%NIE,JK)=MIN(MAX(ZCOEF(D%NIB:D%NIE,JK),0.),1.) - !$mnh_end_expand_array(JI=D%NIB:D%NIE) + !$mnh_expand_array(JI=D%NIJB:D%NIJE) + GWORK2(D%NIJB:D%NIJE,JK) = GWORK1(D%NIJB:D%NIJE) + ZCOEF(D%NIJB:D%NIJE,JK) = (1.-(PDEPTH(D%NIJB:D%NIJE)-ZDEPTH_MAX1)/(ZDEPTH_MAX2-ZDEPTH_MAX1)) + ZCOEF(D%NIJB:D%NIJE,JK)=MIN(MAX(ZCOEF(D%NIJB:D%NIJE,JK),0.),1.) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE) ENDDO - !$mnh_expand_where(JI=D%NIB:D%NIE,JK=1:D%NKT) - WHERE (GWORK2(D%NIB:D%NIE,:)) - PEMF(D%NIB:D%NIE,:) = PEMF(D%NIB:D%NIE,:) * ZCOEF(D%NIB:D%NIE,:) - PFRAC_UP(D%NIB:D%NIE,:) = PFRAC_UP(D%NIB:D%NIE,:) * ZCOEF(D%NIB:D%NIE,:) + !$mnh_expand_where(JI=D%NIJB:D%NIJE,JK=1:D%NKT) + WHERE (GWORK2(D%NIJB:D%NIJE,:)) + PEMF(D%NIJB:D%NIJE,:) = PEMF(D%NIJB:D%NIJE,:) * ZCOEF(D%NIJB:D%NIJE,:) + PFRAC_UP(D%NIJB:D%NIJE,:) = PFRAC_UP(D%NIJB:D%NIJE,:) * ZCOEF(D%NIJB:D%NIJE,:) ENDWHERE - !$mnh_end_expand_where(JI=D%NIB:D%NIE,JK=1:D%NKT) + !$mnh_end_expand_where(JI=D%NIJB:D%NIJE,JK=1:D%NKT) ENDIF IF (LHOOK) CALL DR_HOOK('COMPUTE_UPDRAFT',1,ZHOOK_HANDLE) @@ -770,40 +777,40 @@ INTEGER, INTENT(IN) :: KK INTEGER, INTENT(IN) :: KKB ! near ground physical index INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -LOGICAL,DIMENSION(D%NIT), INTENT(IN) :: OTEST ! test to see if updraft is running -LOGICAL,DIMENSION(D%NIT), INTENT(IN) :: OTESTLCL !test of condensation +LOGICAL,DIMENSION(D%NIJT), INTENT(IN) :: OTEST ! test to see if updraft is running +LOGICAL,DIMENSION(D%NIJT), INTENT(IN) :: OTESTLCL !test of condensation CHARACTER(LEN=1), INTENT(IN) :: HFRAC_ICE ! frac_ice can be compute using ! Temperature (T) or prescribed ! (Y) -REAL, DIMENSION(D%NIT), INTENT(IN) :: PFRAC_ICE ! fraction of ice +REAL, DIMENSION(D%NIJT), INTENT(IN) :: PFRAC_ICE ! fraction of ice ! ! prognostic variables at t- deltat ! -REAL, DIMENSION(D%NIT), INTENT(IN) :: PRHODREF !rhodref -REAL, DIMENSION(D%NIT), INTENT(IN) :: PPRE_MINUS_HALF ! Pressure at flux level KK -REAL, DIMENSION(D%NIT), INTENT(IN) :: PPRE_PLUS_HALF ! Pressure at flux level KK+KKL -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PZZ ! Height at the flux point -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PDZZ ! metrics coefficient -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PTHVM ! ThetaV environment +REAL, DIMENSION(D%NIJT), INTENT(IN) :: PRHODREF !rhodref +REAL, DIMENSION(D%NIJT), INTENT(IN) :: PPRE_MINUS_HALF ! Pressure at flux level KK +REAL, DIMENSION(D%NIJT), INTENT(IN) :: PPRE_PLUS_HALF ! Pressure at flux level KK+KKL +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PZZ ! Height at the flux point +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDZZ ! metrics coefficient +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHVM ! ThetaV environment ! ! thermodynamical variables which are transformed in conservative var. ! -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PTHLM ! Thetal -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PRTM ! total mixing ratio -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PW_UP2 ! Vertical velocity^2 -REAL, DIMENSION(D%NIT), INTENT(IN) :: PTH_UP,PTHL_UP,PRT_UP ! updraft properties -REAL, DIMENSION(D%NIT), INTENT(IN) :: PLUP ! LUP compute from the ground -REAL, DIMENSION(D%NIT), INTENT(IN) :: PRC_UP,PRI_UP ! Updraft cloud content -REAL, DIMENSION(D%NIT), INTENT(IN) :: PTHV_UP ! Thetav of updraft -REAL, DIMENSION(D%NIT), INTENT(IN) :: PRSAT_UP ! Mixing ratio at saturation in updraft -REAL, DIMENSION(D%NIT), INTENT(INOUT) :: PRC_MIX, PRI_MIX ! Mixture cloud content -REAL, DIMENSION(D%NIT), INTENT(OUT) :: PENTR ! Mass flux entrainment of the updraft -REAL, DIMENSION(D%NIT), INTENT(OUT) :: PDETR ! Mass flux detrainment of the updraft -REAL, DIMENSION(D%NIT), INTENT(OUT) :: PENTR_CLD ! Mass flux entrainment of the updraft in cloudy part -REAL, DIMENSION(D%NIT), INTENT(OUT) :: PDETR_CLD ! Mass flux detrainment of the updraft in cloudy part -REAL, DIMENSION(D%NIT), INTENT(OUT) :: PBUO_INTEG_DRY, PBUO_INTEG_CLD! Integral Buoyancy -REAL, DIMENSION(D%NIT), INTENT(OUT) :: PPART_DRY ! ratio of dry part at the transition level +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHLM ! Thetal +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRTM ! total mixing ratio +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PW_UP2 ! Vertical velocity^2 +REAL, DIMENSION(D%NIJT), INTENT(IN) :: PTH_UP,PTHL_UP,PRT_UP ! updraft properties +REAL, DIMENSION(D%NIJT), INTENT(IN) :: PLUP ! LUP compute from the ground +REAL, DIMENSION(D%NIJT), INTENT(IN) :: PRC_UP,PRI_UP ! Updraft cloud content +REAL, DIMENSION(D%NIJT), INTENT(IN) :: PTHV_UP ! Thetav of updraft +REAL, DIMENSION(D%NIJT), INTENT(IN) :: PRSAT_UP ! Mixing ratio at saturation in updraft +REAL, DIMENSION(D%NIJT), INTENT(INOUT) :: PRC_MIX, PRI_MIX ! Mixture cloud content +REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PENTR ! Mass flux entrainment of the updraft +REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PDETR ! Mass flux detrainment of the updraft +REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PENTR_CLD ! Mass flux entrainment of the updraft in cloudy part +REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PDETR_CLD ! Mass flux detrainment of the updraft in cloudy part +REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PBUO_INTEG_DRY, PBUO_INTEG_CLD! Integral Buoyancy +REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PPART_DRY ! ratio of dry part at the transition level ! ! ! 1.2 Declaration of local variables @@ -818,16 +825,16 @@ REAL, DIMENSION(D%NIT), INTENT(OUT) :: PPART_DRY ! ratio of dry part at th ! ------------------ ZCOEFFMF_CLOUD=PARAMMF%XENTR_MF * CST%XG / PARAMMF%XCRAD_MF -!$mnh_expand_array(JI=D%NIB:D%NIE) -ZG_O_THVREF_ED(D%NIB:D%NIE)=CST%XG/PTHVM(D%NIB:D%NIE,KK) +!$mnh_expand_array(JI=D%NIJB:D%NIJE) +ZG_O_THVREF_ED(D%NIJB:D%NIJE)=CST%XG/PTHVM(D%NIJB:D%NIJE,KK) -ZFRAC_ICE(D%NIB:D%NIE)=PFRAC_ICE(D%NIB:D%NIE) ! to not modify fraction of ice +ZFRAC_ICE(D%NIJB:D%NIJE)=PFRAC_ICE(D%NIJB:D%NIJE) ! to not modify fraction of ice -ZPRE(D%NIB:D%NIE)=PPRE_MINUS_HALF(D%NIB:D%NIE) -!$mnh_end_expand_array(JI=D%NIB:D%NIE) +ZPRE(D%NIJB:D%NIJE)=PPRE_MINUS_HALF(D%NIJB:D%NIJE) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE) ! 1.4 Estimation of PPART_DRY -DO JI=D%NIB,D%NIE +DO JI=D%NIJB,D%NIJE IF(OTEST(JI) .AND. OTESTLCL(JI)) THEN !No dry part when condensation level is reached PPART_DRY(JI)=0. @@ -860,25 +867,25 @@ DO JI=D%NIB,D%NIE END DO ! 1.5 Gradient and flux values of thetav -!$mnh_expand_array(JI=D%NIB:D%NIE) +!$mnh_expand_array(JI=D%NIJB:D%NIJE) IF(KK/=KKB)THEN - ZCOEFF_MINUS_HALF(D%NIB:D%NIE)=((PTHVM(D%NIB:D%NIE,KK)-PTHVM(D%NIB:D%NIE,KK-KKL))/PDZZ(D%NIB:D%NIE,KK)) - ZTHV_MINUS_HALF(D%NIB:D%NIE) = PTHVM(D%NIB:D%NIE,KK) - & - & ZCOEFF_MINUS_HALF(D%NIB:D%NIE)*0.5*(PZZ(D%NIB:D%NIE,KK+KKL)-PZZ(D%NIB:D%NIE,KK)) + ZCOEFF_MINUS_HALF(D%NIJB:D%NIJE)=((PTHVM(D%NIJB:D%NIJE,KK)-PTHVM(D%NIJB:D%NIJE,KK-KKL))/PDZZ(D%NIJB:D%NIJE,KK)) + ZTHV_MINUS_HALF(D%NIJB:D%NIJE) = PTHVM(D%NIJB:D%NIJE,KK) - & + & ZCOEFF_MINUS_HALF(D%NIJB:D%NIJE)*0.5*(PZZ(D%NIJB:D%NIJE,KK+KKL)-PZZ(D%NIJB:D%NIJE,KK)) ELSE - ZCOEFF_MINUS_HALF(D%NIB:D%NIE)=0. - ZTHV_MINUS_HALF(D%NIB:D%NIE) = PTHVM(D%NIB:D%NIE,KK) + ZCOEFF_MINUS_HALF(D%NIJB:D%NIJE)=0. + ZTHV_MINUS_HALF(D%NIJB:D%NIJE) = PTHVM(D%NIJB:D%NIJE,KK) ENDIF -ZCOEFF_PLUS_HALF(D%NIB:D%NIE) = ((PTHVM(D%NIB:D%NIE,KK+KKL)-PTHVM(D%NIB:D%NIE,KK))/PDZZ(D%NIB:D%NIE,KK+KKL)) -ZTHV_PLUS_HALF(D%NIB:D%NIE) = PTHVM(D%NIB:D%NIE,KK) + & - & ZCOEFF_PLUS_HALF(D%NIB:D%NIE)*0.5*(PZZ(D%NIB:D%NIE,KK+KKL)-PZZ(D%NIB:D%NIE,KK)) -!$mnh_end_expand_array(JI=D%NIB:D%NIE) +ZCOEFF_PLUS_HALF(D%NIJB:D%NIJE) = ((PTHVM(D%NIJB:D%NIJE,KK+KKL)-PTHVM(D%NIJB:D%NIJE,KK))/PDZZ(D%NIJB:D%NIJE,KK+KKL)) +ZTHV_PLUS_HALF(D%NIJB:D%NIJE) = PTHVM(D%NIJB:D%NIJE,KK) + & + & ZCOEFF_PLUS_HALF(D%NIJB:D%NIJE)*0.5*(PZZ(D%NIJB:D%NIJE,KK+KKL)-PZZ(D%NIJB:D%NIJE,KK)) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE) ! 2 Dry part computation: ! Integral buoyancy and computation of PENTR and PDETR for dry part ! -------------------------------------------------------------------- -DO JI=D%NIB,D%NIE +DO JI=D%NIJB,D%NIJE IF (OTEST(JI) .AND. PPART_DRY(JI)>0.) THEN !Buoyancy computation in two parts to use change of gradient of theta v of environment !Between flux level KK and min(mass level, bottom of cloudy part) @@ -927,21 +934,21 @@ ENDDO ! Compute theta_v of updraft at flux level KK+KKL !MIX variables are used to avoid declaring new variables !but we are dealing with updraft and not mixture -!$mnh_expand_array(JI=D%NIB:D%NIE) -ZRCMIX(D%NIB:D%NIE)=PRC_UP(D%NIB:D%NIE) -ZRIMIX(D%NIB:D%NIE)=PRI_UP(D%NIB:D%NIE) -!$mnh_end_expand_array(JI=D%NIB:D%NIE) -CALL TH_R_FROM_THL_RT(CST,NEB,D%NIT,HFRAC_ICE,ZFRAC_ICE,& +!$mnh_expand_array(JI=D%NIJB:D%NIJE) +ZRCMIX(D%NIJB:D%NIJE)=PRC_UP(D%NIJB:D%NIJE) +ZRIMIX(D%NIJB:D%NIJE)=PRI_UP(D%NIJB:D%NIJE) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE) +CALL TH_R_FROM_THL_RT(CST,NEB,D%NIJT,HFRAC_ICE,ZFRAC_ICE,& PPRE_PLUS_HALF,PTHL_UP,PRT_UP,& ZTHMIX,ZRVMIX,ZRCMIX,ZRIMIX,& ZRSATW_ED, ZRSATI_ED,OOCEAN=.FALSE.,& - PBUF=ZBUF, KB=D%NIB, KE=D%NIE) -!$mnh_expand_array(JI=D%NIB:D%NIE) -ZTHV_UP_F2(D%NIB:D%NIE) = ZTHMIX(D%NIB:D%NIE)*(1.+ZRVORD*ZRVMIX(D%NIB:D%NIE))/(1.+PRT_UP(D%NIB:D%NIE)) -!$mnh_end_expand_array(JI=D%NIB:D%NIE) + PBUF=ZBUF, KB=D%NIJB, KE=D%NIJE) +!$mnh_expand_array(JI=D%NIJB:D%NIJE) +ZTHV_UP_F2(D%NIJB:D%NIJE) = ZTHMIX(D%NIJB:D%NIJE)*(1.+ZRVORD*ZRVMIX(D%NIJB:D%NIJE))/(1.+PRT_UP(D%NIJB:D%NIJE)) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE) ! Integral buoyancy for cloudy part -DO JI=D%NIB,D%NIE +DO JI=D%NIJB,D%NIJE IF(OTEST(JI) .AND. PPART_DRY(JI)<1.) THEN !Gradient of Theta V updraft over the cloudy part, assuming that thetaV updraft don't change !between flux level KK and bottom of cloudy part @@ -983,7 +990,7 @@ ZKIC_INIT=0.1 ! starting value for critical mixed fraction for CLoudy Part ! JKLIM computed to avoid KKL(KK-KKL) being < KKL*KKB JKLIM=KKL*MAX(KKL*(KK-KKL),KKL*KKB) -DO JI=D%NIB,D%NIE +DO JI=D%NIJB,D%NIJE IF(OTEST(JI) .AND. PPART_DRY(JI)>0.5) THEN ZDZ=ZDZ_STOP(JI)-0.5*(PZZ(JI,KK+KKL)-PZZ(JI,KK)) ZTHV(JI)= PTHVM(JI,KK)+ZCOEFF_PLUS_HALF(JI)*ZDZ @@ -1011,29 +1018,31 @@ DO JI=D%NIB,D%NIE ZMIXRT(JI) = 0.1 ENDIF ENDDO -CALL TH_R_FROM_THL_RT(CST,NEB,D%NIT,HFRAC_ICE,ZFRAC_ICE,& +CALL TH_R_FROM_THL_RT(CST,NEB,D%NIJT,HFRAC_ICE,ZFRAC_ICE,& ZPRE,ZMIXTHL,ZMIXRT,& ZTHMIX,ZRVMIX,PRC_MIX,PRI_MIX,& ZRSATW_ED, ZRSATI_ED,OOCEAN=.FALSE.,& - PBUF=ZBUF, KB=D%NIB, KE=D%NIE) -!$mnh_expand_array(JI=D%NIB:D%NIE) -ZTHVMIX(D%NIB:D%NIE) = ZTHMIX(D%NIB:D%NIE)*(1.+ZRVORD*ZRVMIX(D%NIB:D%NIE))/(1.+ZMIXRT(D%NIB:D%NIE)) + PBUF=ZBUF, KB=D%NIJB, KE=D%NIJE) +!$mnh_expand_array(JI=D%NIJB:D%NIJE) +ZTHVMIX(D%NIJB:D%NIJE) = ZTHMIX(D%NIJB:D%NIJE)*(1.+ZRVORD*ZRVMIX(D%NIJB:D%NIJE))/(1.+ZMIXRT(D%NIJB:D%NIJE)) ! Compute cons then non cons. var. of mixture at the flux level KK+KKL with initial ZKIC -ZMIXTHL(D%NIB:D%NIE) = ZKIC_INIT * 0.5*(PTHLM(D%NIB:D%NIE,KK)+PTHLM(D%NIB:D%NIE,KK+KKL))+(1. - ZKIC_INIT)*PTHL_UP(D%NIB:D%NIE) -ZMIXRT(D%NIB:D%NIE) = ZKIC_INIT * 0.5*(PRTM(D%NIB:D%NIE,KK)+PRTM(D%NIB:D%NIE,KK+KKL))+(1. - ZKIC_INIT)*PRT_UP(D%NIB:D%NIE) -!$mnh_end_expand_array(JI=D%NIB:D%NIE) -CALL TH_R_FROM_THL_RT(CST,NEB,D%NIT,HFRAC_ICE,ZFRAC_ICE,& +ZMIXTHL(D%NIJB:D%NIJE) = ZKIC_INIT * 0.5*(PTHLM(D%NIJB:D%NIJE,KK)+PTHLM(D%NIJB:D%NIJE,KK+KKL))+& + & (1. - ZKIC_INIT)*PTHL_UP(D%NIJB:D%NIJE) +ZMIXRT(D%NIJB:D%NIJE) = ZKIC_INIT * 0.5*(PRTM(D%NIJB:D%NIJE,KK)+PRTM(D%NIJB:D%NIJE,KK+KKL))+& + & (1. - ZKIC_INIT)*PRT_UP(D%NIJB:D%NIJE) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE) +CALL TH_R_FROM_THL_RT(CST,NEB,D%NIJT,HFRAC_ICE,ZFRAC_ICE,& PPRE_PLUS_HALF,ZMIXTHL,ZMIXRT,& ZTHMIX,ZRVMIX,PRC_MIX,PRI_MIX,& ZRSATW_ED, ZRSATI_ED,OOCEAN=.FALSE.,& - PBUF=ZBUF, KB=D%NIB, KE=D%NIE) -!$mnh_expand_array(JI=D%NIB:D%NIE) -ZTHVMIX_F2(D%NIB:D%NIE) = ZTHMIX(D%NIB:D%NIE)*(1.+ZRVORD*ZRVMIX(D%NIB:D%NIE))/(1.+ZMIXRT(D%NIB:D%NIE)) -!$mnh_end_expand_array(JI=D%NIB:D%NIE) + PBUF=ZBUF, KB=D%NIJB, KE=D%NIJE) +!$mnh_expand_array(JI=D%NIJB:D%NIJE) +ZTHVMIX_F2(D%NIJB:D%NIJE) = ZTHMIX(D%NIJB:D%NIJE)*(1.+ZRVORD*ZRVMIX(D%NIJB:D%NIJE))/(1.+ZMIXRT(D%NIJB:D%NIJE)) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE) !Computation of mean ZKIC over the cloudy part -DO JI=D%NIB,D%NIE +DO JI=D%NIJB,D%NIJE IF (OTEST(JI)) THEN ! Compute ZKIC at the bottom of cloudy part ! Thetav_up at bottom is equal to Thetav_up at flux level KK @@ -1062,7 +1071,7 @@ END DO !Constant PDF !For this PDF, eq. (5) is delta Me=0.5*delta Mt -DO JI=D%NIB,D%NIE +DO JI=D%NIJB,D%NIJE IF(OTEST(JI)) THEN ZEPSI(JI) = ZKIC(JI)**2. !integration multiplied by 2 ZDELTA(JI) = (1.-ZKIC(JI))**2. !idem @@ -1073,19 +1082,19 @@ ENDDO !Calculus must be verified before activating this part, but in this state, !results on ARM case are almost identical !For this PDF, eq. (5) is also delta Me=0.5*delta Mt -!WHERE(OTEST(D%NIB:D%NIE)) +!WHERE(OTEST(D%NIJB:D%NIJE)) ! !Integration multiplied by 2 ! WHERE(ZKIC<0.5) -! ZEPSI(D%NIB:D%NIE)=8.*ZKIC(D%NIB:D%NIE)**3/3. -! ZDELTA(D%NIB:D%NIE)=1.-4.*ZKIC(D%NIB:D%NIE)**2+8.*ZKIC(D%NIB:D%NIE)**3/3. +! ZEPSI(D%NIJB:D%NIJE)=8.*ZKIC(D%NIJB:D%NIJE)**3/3. +! ZDELTA(D%NIJB:D%NIJE)=1.-4.*ZKIC(D%NIJB:D%NIJE)**2+8.*ZKIC(D%NIJB:D%NIJE)**3/3. ! ELSEWHERE -! ZEPSI(D%NIB:D%NIE)=5./3.-4*ZKIC(D%NIB:D%NIE)**2+8.*ZKIC(D%NIB:D%NIE)**3/3. -! ZDELTA(D%NIB:D%NIE)=8.*(1.-ZKIC(D%NIB:D%NIE))**3/3. +! ZEPSI(D%NIJB:D%NIJE)=5./3.-4*ZKIC(D%NIJB:D%NIJE)**2+8.*ZKIC(D%NIJB:D%NIJE)**3/3. +! ZDELTA(D%NIJB:D%NIJE)=8.*(1.-ZKIC(D%NIJB:D%NIJE))**3/3. ! ENDWHERE !ENDWHERE ! 3.4 Computation of PENTR and PDETR -DO JI=D%NIB,D%NIE +DO JI=D%NIJB,D%NIJE IF(OTEST(JI)) THEN ZEPSI_CLOUD=MIN(ZDELTA(JI), ZEPSI(JI)) PENTR_CLD(JI) = (1.-PPART_DRY(JI))*ZCOEFFMF_CLOUD*PRHODREF(JI)*ZEPSI_CLOUD diff --git a/src/common/turb/mode_compute_updraft_raha.F90 b/src/common/turb/mode_compute_updraft_raha.F90 index bb1dc222569a9a1e3d2c3154c15ee5f00c17ea88..8a4705cb429aa690964be656eabca7ceb36ae678 100644 --- a/src/common/turb/mode_compute_updraft_raha.F90 +++ b/src/common/turb/mode_compute_updraft_raha.F90 @@ -85,108 +85,108 @@ 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, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PZZ ! Height at the flux point -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PDZZ ! Metrics coefficient +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PZZ ! Height at the flux point +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDZZ ! Metrics coefficient -REAL, DIMENSION(D%NIT), INTENT(IN) :: PSFTH,PSFRV +REAL, DIMENSION(D%NIJT), INTENT(IN) :: PSFTH,PSFRV ! normal surface fluxes of theta,rv,(u,v) parallel to the orography ! -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PPABSM ! Pressure at t-dt -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PRHODREF ! dry density of the +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PPABSM ! Pressure at t-dt +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODREF ! dry density of the ! reference state -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PUM ! u mean wind -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PVM ! v mean wind -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PTKEM ! TKE at t-dt - -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PEXNM ! Exner function at t-dt -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PTHM ! liquid pot. temp. at t-dt -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PRVM ! vapor mixing ratio at t-dt -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PTHLM,PRTM ! cons. var. at t-dt - -REAL, DIMENSION(D%NIT,D%NKT,KSV), INTENT(IN) :: PSVM ! scalar var. at t-dt - -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PTHL_UP,PRT_UP ! updraft properties -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PU_UP, PV_UP ! updraft wind components -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT):: PRV_UP,PRC_UP ! updraft rv, rc -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT):: PRI_UP,PTHV_UP ! updraft ri, THv -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT):: PW_UP,PFRAC_UP ! updraft w, fraction -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT):: PFRAC_ICE_UP ! liquid/solid fraction in updraft -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT):: PRSAT_UP ! Rsat - -REAL, DIMENSION(D%NIT,D%NKT,KSV), INTENT(OUT) :: PSV_UP ! updraft scalar var. +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PUM ! u mean wind +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PVM ! v mean wind +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTKEM ! TKE at t-dt + +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PEXNM ! Exner function at t-dt +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHM ! liquid pot. temp. at t-dt +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRVM ! vapor mixing ratio at t-dt +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHLM,PRTM ! cons. var. at t-dt + +REAL, DIMENSION(D%NIJT,D%NKT,KSV), INTENT(IN) :: PSVM ! scalar var. at t-dt + +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PTHL_UP,PRT_UP ! updraft properties +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PU_UP, PV_UP ! updraft wind components +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT):: PRV_UP,PRC_UP ! updraft rv, rc +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT):: PRI_UP,PTHV_UP ! updraft ri, THv +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT):: PW_UP,PFRAC_UP ! updraft w, fraction +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT):: PFRAC_ICE_UP ! liquid/solid fraction in updraft +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT):: PRSAT_UP ! Rsat + +REAL, DIMENSION(D%NIJT,D%NKT,KSV), INTENT(OUT) :: PSV_UP ! updraft scalar var. -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT):: PEMF,PDETR,PENTR ! Mass_flux, +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT):: PEMF,PDETR,PENTR ! Mass_flux, ! detrainment,entrainment -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT) :: PBUO_INTEG ! Integrated Buoyancy -INTEGER, DIMENSION(D%NIT), INTENT(INOUT):: KKLCL,KKETL,KKCTL! LCL, ETL, CTL -REAL, DIMENSION(D%NIT), INTENT(OUT) :: PDEPTH ! Deepness of cloud +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PBUO_INTEG ! Integrated Buoyancy +INTEGER, DIMENSION(D%NIJT), INTENT(INOUT):: KKLCL,KKETL,KKCTL! LCL, ETL, CTL +REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PDEPTH ! Deepness of cloud ! 1.2 Declaration of local variables ! ! ! Mean environment variables at t-dt at flux point -REAL, DIMENSION(D%NIT,D%NKT) :: ZTHM_F,ZRVM_F,ZRCM_F ! Theta,rv of +REAL, DIMENSION(D%NIJT,D%NKT) :: ZTHM_F,ZRVM_F,ZRCM_F ! Theta,rv of ! updraft environnement -REAL, DIMENSION(D%NIT,D%NKT) :: ZRTM_F, ZTHLM_F, ZTKEM_F ! rt, thetal,TKE,pressure, -REAL, DIMENSION(D%NIT,D%NKT) :: ZUM_F,ZVM_F,ZRHO_F ! density,momentum -REAL, DIMENSION(D%NIT,D%NKT) :: ZPRES_F,ZTHVM_F,ZTHVM ! interpolated at the flux point -REAL, DIMENSION(D%NIT,D%NKT) :: ZG_O_THVREF ! g*ThetaV ref -REAL, DIMENSION(D%NIT,D%NKT) :: ZW_UP2 ! w**2 of the updraft +REAL, DIMENSION(D%NIJT,D%NKT) :: ZRTM_F, ZTHLM_F, ZTKEM_F ! rt, thetal,TKE,pressure, +REAL, DIMENSION(D%NIJT,D%NKT) :: ZUM_F,ZVM_F,ZRHO_F ! density,momentum +REAL, DIMENSION(D%NIJT,D%NKT) :: ZPRES_F,ZTHVM_F,ZTHVM ! interpolated at the flux point +REAL, DIMENSION(D%NIJT,D%NKT) :: ZG_O_THVREF ! g*ThetaV ref +REAL, DIMENSION(D%NIJT,D%NKT) :: ZW_UP2 ! w**2 of the updraft -REAL, DIMENSION(D%NIT,D%NKT,KSV) :: ZSVM_F ! scalar variables +REAL, DIMENSION(D%NIJT,D%NKT,KSV) :: ZSVM_F ! scalar variables -REAL, DIMENSION(D%NIT,D%NKT) :: ZTH_UP ! updraft THETA -REAL, DIMENSION(D%NIT) :: ZT_UP ! updraft T -REAL, DIMENSION(D%NIT) :: ZLVOCPEXN ! updraft L -REAL, DIMENSION(D%NIT) :: ZCP ! updraft cp -REAL, DIMENSION(D%NIT,D%NKT) :: ZBUO ! Buoyancy -REAL, DIMENSION(D%NIT,D%NKT) :: ZTHS_UP,ZTHSM - -REAL, DIMENSION(D%NIT,D%NKT) :: ZCOEF ! diminution coefficient for too high clouds +REAL, DIMENSION(D%NIJT,D%NKT) :: ZTH_UP ! updraft THETA +REAL, DIMENSION(D%NIJT) :: ZT_UP ! updraft T +REAL, DIMENSION(D%NIJT) :: ZLVOCPEXN ! updraft L +REAL, DIMENSION(D%NIJT) :: ZCP ! updraft cp +REAL, DIMENSION(D%NIJT,D%NKT) :: ZBUO ! Buoyancy +REAL, DIMENSION(D%NIJT,D%NKT) :: ZTHS_UP,ZTHSM + +REAL, DIMENSION(D%NIJT,D%NKT) :: ZCOEF ! diminution coefficient for too high clouds -REAL, DIMENSION(D%NIT) :: ZWTHVSURF ! Surface w'thetav' +REAL, DIMENSION(D%NIJT) :: ZWTHVSURF ! Surface w'thetav' REAL :: ZRDORV ! RD/RV REAL :: ZRVORD ! RV/RD -REAL, DIMENSION(D%NIT) :: ZMIX1,ZMIX2,ZMIX3 +REAL, DIMENSION(D%NIJT) :: ZMIX1,ZMIX2,ZMIX3 -REAL, DIMENSION(D%NIT) :: ZLUP ! Upward Mixing length from the ground +REAL, DIMENSION(D%NIJT) :: ZLUP ! Upward Mixing length from the ground -REAL, DIMENSION(D%NIT) :: ZDEPTH ! Deepness limit for cloud +REAL, DIMENSION(D%NIJT) :: ZDEPTH ! Deepness limit for cloud INTEGER :: JK,JI,JJ,JSV ! loop counters -LOGICAL, DIMENSION(D%NIT) :: GTEST,GTESTLCL,GTESTETL +LOGICAL, DIMENSION(D%NIJT) :: GTEST,GTESTLCL,GTESTETL ! Test if the ascent continue, if LCL or ETL is reached LOGICAL :: GLMIX ! To choose upward or downward mixing length -LOGICAL, DIMENSION(D%NIT) :: GWORK1 -LOGICAL, DIMENSION(D%NIT,D%NKT) :: GWORK2 +LOGICAL, DIMENSION(D%NIJT) :: GWORK1 +LOGICAL, DIMENSION(D%NIJT,D%NKT) :: GWORK2 INTEGER :: ITEST -REAL, DIMENSION(D%NIT) :: ZRC_UP, ZRI_UP, ZRV_UP, ZWP2, ZRSATW, ZRSATI +REAL, DIMENSION(D%NIJT) :: ZRC_UP, ZRI_UP, ZRV_UP, ZWP2, ZRSATW, ZRSATI -LOGICAL, DIMENSION(D%NIT) :: GTEST_FER -REAL, DIMENSION(D%NIT) :: ZPHI,ZALIM_STAR_TOT -REAL, DIMENSION(D%NIT,D%NKT) :: ZDTHETASDZ,ZALIM_STAR,ZZDZ,ZZZ -INTEGER, DIMENSION(D%NIT) :: IALIM +LOGICAL, DIMENSION(D%NIJT) :: GTEST_FER +REAL, DIMENSION(D%NIJT) :: ZPHI,ZALIM_STAR_TOT +REAL, DIMENSION(D%NIJT,D%NKT) :: ZDTHETASDZ,ZALIM_STAR,ZZDZ,ZZZ +INTEGER, DIMENSION(D%NIJT) :: IALIM -REAL, DIMENSION(D%NIT) :: ZTEST,ZDZ,ZWUP_MEAN ! -REAL, DIMENSION(D%NIT) :: ZCOE,ZWCOE,ZBUCOE -REAL, DIMENSION(D%NIT) :: ZDETR_BUO, ZDETR_RT -REAL, DIMENSION(D%NIT) :: ZW_MAX ! w**2 max of the updraft -REAL, DIMENSION(D%NIT) :: ZZTOP ! Top of the updraft -REAL, DIMENSION(D%NIT) :: ZA,ZB,ZQTM,ZQT_UP +REAL, DIMENSION(D%NIJT) :: ZTEST,ZDZ,ZWUP_MEAN ! +REAL, DIMENSION(D%NIJT) :: ZCOE,ZWCOE,ZBUCOE +REAL, DIMENSION(D%NIJT) :: ZDETR_BUO, ZDETR_RT +REAL, DIMENSION(D%NIJT) :: ZW_MAX ! w**2 max of the updraft +REAL, DIMENSION(D%NIJT) :: ZZTOP ! Top of the updraft +REAL, DIMENSION(D%NIJT) :: ZA,ZB,ZQTM,ZQT_UP REAL :: ZDEPTH_MAX1, ZDEPTH_MAX2 ! control auto-extinction process REAL :: ZTMAX,ZRMAX, ZEPS ! control value -REAL, DIMENSION(D%NIT,16) :: ZBUF +REAL, DIMENSION(D%NIJT,16) :: ZBUF REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('COMPUTE_UPDRAF_RAHA',0,ZHOOK_HANDLE) @@ -236,9 +236,9 @@ ZBUO(:,:) =0. !no ice cloud coded yet PRI_UP(:,:)=0. PFRAC_ICE_UP(:,:)=0. -!$mnh_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) -PRSAT_UP(D%NIB:D%NIE,:)=PRVM(D%NIB:D%NIE,:) ! should be initialised correctly but is (normaly) not used -!$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) +!$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) +PRSAT_UP(D%NIJB:D%NIJE,:)=PRVM(D%NIJB:D%NIJE,:) ! should be initialised correctly but is (normaly) not used +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) ! Initialisation of environment variables at t-dt @@ -251,80 +251,80 @@ CALL MZM_MF(D, PTKEM(:,:), ZTKEM_F(:,:)) !DO JSV=1,ISV ! IF (ONOMIXLG .AND. JSV >= KSV_LGBEG .AND. JSV<= KSV_LGEND) CYCLE -! ZSVM_F(D%NIB:D%NIE,KKB:IKU,JSV) = 0.5*(PSVM(D%NIB:D%NIE,KKB:IKU,JSV)+PSVM(D%NIB:D%NIE,1:IKU-1,JSV)) -! ZSVM_F(D%NIB:D%NIE,1,JSV) = ZSVM_F(D%NIB:D%NIE,KKB,JSV) +! ZSVM_F(D%NIJB:D%NIJE,KKB:IKU,JSV) = 0.5*(PSVM(D%NIJB:D%NIJE,KKB:IKU,JSV)+PSVM(D%NIJB:D%NIJE,1:IKU-1,JSV)) +! ZSVM_F(D%NIJB:D%NIJE,1,JSV) = ZSVM_F(D%NIJB:D%NIJE,KKB,JSV) !END DO ! Initialisation of updraft characteristics -!$mnh_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) -PTHL_UP(D%NIB:D%NIE,:)=ZTHLM_F(D%NIB:D%NIE,:) -PRT_UP(D%NIB:D%NIE,:)=ZRTM_F(D%NIB:D%NIE,:) -PU_UP(D%NIB:D%NIE,:)=ZUM_F(D%NIB:D%NIE,:) -PV_UP(D%NIB:D%NIE,:)=ZVM_F(D%NIB:D%NIE,:) -!$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) +!$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) +PTHL_UP(D%NIJB:D%NIJE,:)=ZTHLM_F(D%NIJB:D%NIJE,:) +PRT_UP(D%NIJB:D%NIJE,:)=ZRTM_F(D%NIJB:D%NIJE,:) +PU_UP(D%NIJB:D%NIJE,:)=ZUM_F(D%NIJB:D%NIJE,:) +PV_UP(D%NIJB:D%NIJE,:)=ZVM_F(D%NIJB:D%NIJE,:) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) PSV_UP(:,:,:)=0. !IF (ONOMIXLG .AND. JSV >= KSV_LGBEG .AND. JSV<= KSV_LGEND) then -! PSV_UP(D%NIB:D%NIE,:,:)=ZSVM_F(D%NIB:D%NIE,:,:) +! PSV_UP(D%NIJB:D%NIJE,:,:)=ZSVM_F(D%NIJB:D%NIJE,:,:) !ENDIF ! Computation or initialisation of updraft characteristics at the KKB level ! thetal_up,rt_up,thetaV_up, w�,Buoyancy term and mass flux (PEMF) -!$mnh_expand_array(JI=D%NIB:D%NIE) -PTHL_UP(D%NIB:D%NIE,D%NKB)= ZTHLM_F(D%NIB:D%NIE,D%NKB)+ & - & MAX(0.,MIN(ZTMAX,(PSFTH(D%NIB:D%NIE)/SQRT(ZTKEM_F(D%NIB:D%NIE,D%NKB)))*PARAMMF%XALP_PERT)) -PRT_UP(D%NIB:D%NIE,D%NKB) = ZRTM_F(D%NIB:D%NIE,D%NKB)+ & - & MAX(0.,MIN(ZRMAX,(PSFRV(D%NIB:D%NIE)/SQRT(ZTKEM_F(D%NIB:D%NIE,D%NKB)))*PARAMMF%XALP_PERT)) +!$mnh_expand_array(JI=D%NIJB:D%NIJE) +PTHL_UP(D%NIJB:D%NIJE,D%NKB)= ZTHLM_F(D%NIJB:D%NIJE,D%NKB)+ & + & MAX(0.,MIN(ZTMAX,(PSFTH(D%NIJB:D%NIJE)/SQRT(ZTKEM_F(D%NIJB:D%NIJE,D%NKB)))*PARAMMF%XALP_PERT)) +PRT_UP(D%NIJB:D%NIJE,D%NKB) = ZRTM_F(D%NIJB:D%NIJE,D%NKB)+ & + & MAX(0.,MIN(ZRMAX,(PSFRV(D%NIJB:D%NIJE)/SQRT(ZTKEM_F(D%NIJB:D%NIJE,D%NKB)))*PARAMMF%XALP_PERT)) -ZQT_UP(D%NIB:D%NIE) = PRT_UP(D%NIB:D%NIE,D%NKB)/(1.+PRT_UP(D%NIB:D%NIE,D%NKB)) -ZTHS_UP(D%NIB:D%NIE,D%NKB)=PTHL_UP(D%NIB:D%NIE,D%NKB)*(1.+PARAMMF%XLAMBDA_MF*ZQT_UP(D%NIB:D%NIE)) -!$mnh_end_expand_array(JI=D%NIB:D%NIE) +ZQT_UP(D%NIJB:D%NIJE) = PRT_UP(D%NIJB:D%NIJE,D%NKB)/(1.+PRT_UP(D%NIJB:D%NIJE,D%NKB)) +ZTHS_UP(D%NIJB:D%NIJE,D%NKB)=PTHL_UP(D%NIJB:D%NIJE,D%NKB)*(1.+PARAMMF%XLAMBDA_MF*ZQT_UP(D%NIJB:D%NIJE)) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE) CALL MZM_MF(D, PTHM (:,:), ZTHM_F(:,:)) CALL MZM_MF(D, PPABSM(:,:), ZPRES_F(:,:)) CALL MZM_MF(D, PRHODREF(:,:), ZRHO_F(:,:)) CALL MZM_MF(D, PRVM(:,:), ZRVM_F(:,:)) -!$mnh_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) +!$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) ! thetav at mass and flux levels -ZTHVM_F(D%NIB:D%NIE,:)=ZTHM_F(D%NIB:D%NIE,:)*((1.+ZRVORD*ZRVM_F(D%NIB:D%NIE,:))/(1.+ZRTM_F(D%NIB:D%NIE,:))) -ZTHVM(D%NIB:D%NIE,:)=PTHM(D%NIB:D%NIE,:)*((1.+ZRVORD*PRVM(D%NIB:D%NIE,:))/(1.+PRTM(D%NIB:D%NIE,:))) +ZTHVM_F(D%NIJB:D%NIJE,:)=ZTHM_F(D%NIJB:D%NIJE,:)*((1.+ZRVORD*ZRVM_F(D%NIJB:D%NIJE,:))/(1.+ZRTM_F(D%NIJB:D%NIJE,:))) +ZTHVM(D%NIJB:D%NIJE,:)=PTHM(D%NIJB:D%NIJE,:)*((1.+ZRVORD*PRVM(D%NIJB:D%NIJE,:))/(1.+PRTM(D%NIJB:D%NIJE,:))) -PTHV_UP(D%NIB:D%NIE,:)= ZTHVM_F(D%NIB:D%NIE,:) -PRV_UP(D%NIB:D%NIE,:) = ZRVM_F(D%NIB:D%NIE,:) -!$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) +PTHV_UP(D%NIJB:D%NIJE,:)= ZTHVM_F(D%NIJB:D%NIJE,:) +PRV_UP(D%NIJB:D%NIJE,:) = ZRVM_F(D%NIJB:D%NIJE,:) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) ZW_UP2(:,:)=ZEPS -!$mnh_expand_array(JI=D%NIB:D%NIE) -ZW_UP2(D%NIB:D%NIE,D%NKB) = MAX(0.0001,(1./6.)*ZTKEM_F(D%NIB:D%NIE,D%NKB)) -GTEST(D%NIB:D%NIE) = (ZW_UP2(D%NIB:D%NIE,D%NKB) > ZEPS) -!$mnh_end_expand_array(JI=D%NIB:D%NIE) +!$mnh_expand_array(JI=D%NIJB:D%NIJE) +ZW_UP2(D%NIJB:D%NIJE,D%NKB) = MAX(0.0001,(1./6.)*ZTKEM_F(D%NIJB:D%NIJE,D%NKB)) +GTEST(D%NIJB:D%NIJE) = (ZW_UP2(D%NIJB:D%NIJE,D%NKB) > ZEPS) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE) ! Computation of non conservative variable for the KKB level of the updraft ! (all or nothing ajustement) -!$mnh_expand_array(JI=D%NIB:D%NIE) -PRC_UP(D%NIB:D%NIE,D%NKB)=0. -PRI_UP(D%NIB:D%NIE,D%NKB)=0. -!$mnh_end_expand_array(JI=D%NIB:D%NIE) +!$mnh_expand_array(JI=D%NIJB:D%NIJE) +PRC_UP(D%NIJB:D%NIJE,D%NKB)=0. +PRI_UP(D%NIJB:D%NIJE,D%NKB)=0. +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE) -CALL TH_R_FROM_THL_RT(CST, NEB, D%NIT, HFRAC_ICE,PFRAC_ICE_UP(:,D%NKB),ZPRES_F(:,D%NKB), & +CALL TH_R_FROM_THL_RT(CST, NEB, D%NIJT, HFRAC_ICE,PFRAC_ICE_UP(:,D%NKB),ZPRES_F(:,D%NKB), & PTHL_UP(:,D%NKB),PRT_UP(:,D%NKB),ZTH_UP(:,D%NKB), & PRV_UP(:,D%NKB),PRC_UP(:,D%NKB),PRI_UP(:,D%NKB),ZRSATW(:),ZRSATI(:),OOCEAN=.FALSE.,& - PBUF=ZBUF, KB=D%NIB, KE=D%NIE) + PBUF=ZBUF, KB=D%NIJB, KE=D%NIJE) -!$mnh_expand_array(JI=D%NIB:D%NIE) +!$mnh_expand_array(JI=D%NIJB:D%NIJE) ! compute updraft thevav and buoyancy term at KKB level -PTHV_UP(D%NIB:D%NIE,D%NKB) = ZTH_UP(D%NIB:D%NIE,D%NKB)*((1+ZRVORD*PRV_UP(D%NIB:D%NIE,D%NKB))/(1+PRT_UP(D%NIB:D%NIE,D%NKB))) +PTHV_UP(D%NIJB:D%NIJE,D%NKB) = ZTH_UP(D%NIJB:D%NIJE,D%NKB)*((1+ZRVORD*PRV_UP(D%NIJB:D%NIJE,D%NKB))/(1+PRT_UP(D%NIJB:D%NIJE,D%NKB))) ! compute mean rsat in updraft -PRSAT_UP(D%NIB:D%NIE,D%NKB) = ZRSATW(D%NIB:D%NIE)*(1-PFRAC_ICE_UP(D%NIB:D%NIE,D%NKB)) + & - & ZRSATI(D%NIB:D%NIE)*PFRAC_ICE_UP(D%NIB:D%NIE,D%NKB) -!$mnh_end_expand_array(JI=D%NIB:D%NIE) +PRSAT_UP(D%NIJB:D%NIJE,D%NKB) = ZRSATW(D%NIJB:D%NIJE)*(1-PFRAC_ICE_UP(D%NIJB:D%NIJE,D%NKB)) + & + & ZRSATI(D%NIJB:D%NIJE)*PFRAC_ICE_UP(D%NIJB:D%NIJE,D%NKB) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE) !Tout est commente pour tester dans un premier temps la s�paration en deux de la ! boucle verticale, une pour w et une pour PEMF -!$mnh_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) -ZG_O_THVREF(D%NIB:D%NIE,:)=CST%XG/ZTHVM_F(D%NIB:D%NIE,:) -!$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) +!$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) +ZG_O_THVREF(D%NIJB:D%NIJE,:)=CST%XG/ZTHVM_F(D%NIJB:D%NIJE,:) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) ! Definition de l'alimentation au sens de la fermeture de Hourdin et al @@ -333,26 +333,27 @@ ZALIM_STAR_TOT(:) = 0. ! <== Normalization of ZALIM_STAR IALIM(:) = D%NKB ! <== Top level of the alimentation layer DO JK=D%NKB,D%NKE-D%NKL,D%NKL ! Vertical loop - !$mnh_expand_where(JI=D%NIB:D%NIE) - ZZDZ(D%NIB:D%NIE,JK) = MAX(ZEPS,PZZ(D%NIB:D%NIE,JK+D%NKL)-PZZ(D%NIB:D%NIE,JK)) ! <== Delta Z between two flux level - ZZZ(D%NIB:D%NIE,JK) = MAX(0.,0.5*(PZZ(D%NIB:D%NIE,JK+D%NKL)+PZZ(D%NIB:D%NIE,JK)) ) ! <== Hight of mass levels - ZDTHETASDZ(D%NIB:D%NIE,JK) = (ZTHVM_F(D%NIB:D%NIE,JK)-ZTHVM_F(D%NIB:D%NIE,JK+D%NKL)) ! <== Delta theta_v + !$mnh_expand_where(JI=D%NIJB:D%NIJE) + ZZDZ(D%NIJB:D%NIJE,JK) = MAX(ZEPS,PZZ(D%NIJB:D%NIJE,JK+D%NKL)-PZZ(D%NIJB:D%NIJE,JK)) ! <== Delta Z between two flux level + ZZZ(D%NIJB:D%NIJE,JK) = MAX(0.,0.5*(PZZ(D%NIJB:D%NIJE,JK+D%NKL)+PZZ(D%NIJB:D%NIJE,JK)) ) ! <== Hight of mass levels + ZDTHETASDZ(D%NIJB:D%NIJE,JK) = (ZTHVM_F(D%NIJB:D%NIJE,JK)-ZTHVM_F(D%NIJB:D%NIJE,JK+D%NKL)) ! <== Delta theta_v - WHERE ((ZTHVM_F(D%NIB:D%NIE,JK+D%NKL)<ZTHVM_F(D%NIB:D%NIE,JK)) .AND. (ZTHVM_F(D%NIB:D%NIE,D%NKB)>=ZTHVM_F(D%NIB:D%NIE,JK))) - ZALIM_STAR(D%NIB:D%NIE,JK) = SQRT(ZZZ(D%NIB:D%NIE,JK))*ZDTHETASDZ(D%NIB:D%NIE,JK)/ZZDZ(D%NIB:D%NIE,JK) - ZALIM_STAR_TOT(D%NIB:D%NIE) = ZALIM_STAR_TOT(D%NIB:D%NIE)+ZALIM_STAR(D%NIB:D%NIE,JK)*ZZDZ(D%NIB:D%NIE,JK) - IALIM(D%NIB:D%NIE) = JK + WHERE ((ZTHVM_F(D%NIJB:D%NIJE,JK+D%NKL)<ZTHVM_F(D%NIJB:D%NIJE,JK)) .AND. & + &(ZTHVM_F(D%NIJB:D%NIJE,D%NKB)>=ZTHVM_F(D%NIJB:D%NIJE,JK))) + ZALIM_STAR(D%NIJB:D%NIJE,JK) = SQRT(ZZZ(D%NIJB:D%NIJE,JK))*ZDTHETASDZ(D%NIJB:D%NIJE,JK)/ZZDZ(D%NIJB:D%NIJE,JK) + ZALIM_STAR_TOT(D%NIJB:D%NIJE) = ZALIM_STAR_TOT(D%NIJB:D%NIJE)+ZALIM_STAR(D%NIJB:D%NIJE,JK)*ZZDZ(D%NIJB:D%NIJE,JK) + IALIM(D%NIJB:D%NIJE) = JK ENDWHERE - !$mnh_end_expand_where(JI=D%NIB:D%NIE) + !$mnh_end_expand_where(JI=D%NIJB:D%NIJE) ENDDO ! Normalization of ZALIM_STAR DO JK=D%NKB,D%NKE-D%NKL,D%NKL ! Vertical loop - !$mnh_expand_where(JI=D%NIB:D%NIE) - WHERE (ZALIM_STAR_TOT(D%NIB:D%NIE) > ZEPS) - ZALIM_STAR(D%NIB:D%NIE,JK) = ZALIM_STAR(D%NIB:D%NIE,JK)/ZALIM_STAR_TOT(D%NIB:D%NIE) + !$mnh_expand_where(JI=D%NIJB:D%NIJE) + WHERE (ZALIM_STAR_TOT(D%NIJB:D%NIJE) > ZEPS) + ZALIM_STAR(D%NIJB:D%NIJE,JK) = ZALIM_STAR(D%NIJB:D%NIJE,JK)/ZALIM_STAR_TOT(D%NIJB:D%NIJE) ENDWHERE - !$mnh_end_expand_where(JI=D%NIB:D%NIE) + !$mnh_end_expand_where(JI=D%NIJB:D%NIJE) ENDDO ZALIM_STAR_TOT(:) = 0. @@ -379,19 +380,19 @@ ZPHI(:) = 0. DO JK=D%NKB,D%NKE-D%NKL,D%NKL - !$mnh_expand_where(JI=D%NIB:D%NIE) + !$mnh_expand_where(JI=D%NIJB:D%NIJE) ! IF the updraft top is reached for all column, stop the loop on levels - !ITEST=COUNT(GTEST(D%NIB:D%NIE)) + !ITEST=COUNT(GTEST(D%NIJB:D%NIJE)) !IF (ITEST==0) CYCLE ! Computation of entrainment and detrainment with KF90 ! parameterization in clouds and LR01 in subcloud layer ! to find the LCL (check if JK is LCL or not) - WHERE ((PRC_UP(D%NIB:D%NIE,JK)+PRI_UP(D%NIB:D%NIE,JK)>0.).AND.(.NOT.(GTESTLCL(D%NIB:D%NIE)))) - KKLCL(D%NIB:D%NIE) = JK - GTESTLCL(D%NIB:D%NIE)=.TRUE. + WHERE ((PRC_UP(D%NIJB:D%NIJE,JK)+PRI_UP(D%NIJB:D%NIJE,JK)>0.).AND.(.NOT.(GTESTLCL(D%NIJB:D%NIJE)))) + KKLCL(D%NIJB:D%NIJE) = JK + GTESTLCL(D%NIJB:D%NIJE)=.TRUE. ENDWHERE ! COMPUTE PENTR and PDETR at mass level JK @@ -401,213 +402,221 @@ DO JK=D%NKB,D%NKE-D%NKL,D%NKL ! Compute theta_v of updraft at flux level JK - ZRC_UP(D%NIB:D%NIE) = PRC_UP(D%NIB:D%NIE,JK) - ZRI_UP(D%NIB:D%NIE) = PRI_UP(D%NIB:D%NIE,JK) ! guess - ZRV_UP(D%NIB:D%NIE) = PRV_UP(D%NIB:D%NIE,JK) - ZBUO(D%NIB:D%NIE,JK) = ZG_O_THVREF(D%NIB:D%NIE,JK)*(PTHV_UP(D%NIB:D%NIE,JK) - ZTHVM_F(D%NIB:D%NIE,JK)) - PBUO_INTEG(D%NIB:D%NIE,JK) = ZBUO(D%NIB:D%NIE,JK)*(PZZ(D%NIB:D%NIE,JK+D%NKL)-PZZ(D%NIB:D%NIE,JK)) + ZRC_UP(D%NIJB:D%NIJE) = PRC_UP(D%NIJB:D%NIJE,JK) + ZRI_UP(D%NIJB:D%NIJE) = PRI_UP(D%NIJB:D%NIJE,JK) ! guess + ZRV_UP(D%NIJB:D%NIJE) = PRV_UP(D%NIJB:D%NIJE,JK) + ZBUO(D%NIJB:D%NIJE,JK) = ZG_O_THVREF(D%NIJB:D%NIJE,JK)*(PTHV_UP(D%NIJB:D%NIJE,JK) - ZTHVM_F(D%NIJB:D%NIJE,JK)) + PBUO_INTEG(D%NIJB:D%NIJE,JK) = ZBUO(D%NIJB:D%NIJE,JK)*(PZZ(D%NIJB:D%NIJE,JK+D%NKL)-PZZ(D%NIJB:D%NIJE,JK)) - ZDZ(D%NIB:D%NIE) = MAX(ZEPS,PZZ(D%NIB:D%NIE,JK+D%NKL)-PZZ(D%NIB:D%NIE,JK)) - ZTEST(D%NIB:D%NIE) = PARAMMF%XA1*ZBUO(D%NIB:D%NIE,JK) - PARAMMF%XB*ZW_UP2(D%NIB:D%NIE,JK) + ZDZ(D%NIJB:D%NIJE) = MAX(ZEPS,PZZ(D%NIJB:D%NIJE,JK+D%NKL)-PZZ(D%NIJB:D%NIJE,JK)) + ZTEST(D%NIJB:D%NIJE) = PARAMMF%XA1*ZBUO(D%NIJB:D%NIJE,JK) - PARAMMF%XB*ZW_UP2(D%NIJB:D%NIJE,JK) - ZCOE(D%NIB:D%NIE) = ZDZ(D%NIB:D%NIE) - WHERE (ZTEST(D%NIB:D%NIE)>0.) - ZCOE(D%NIB:D%NIE) = ZDZ(D%NIB:D%NIE)/(1.+ PARAMMF%XBETA1) + ZCOE(D%NIJB:D%NIJE) = ZDZ(D%NIJB:D%NIJE) + WHERE (ZTEST(D%NIJB:D%NIJE)>0.) + ZCOE(D%NIJB:D%NIJE) = ZDZ(D%NIJB:D%NIJE)/(1.+ PARAMMF%XBETA1) ENDWHERE ! Calcul de la vitesse - ZWCOE(D%NIB:D%NIE) = (1.-PARAMMF%XB*ZCOE(D%NIB:D%NIE))/(1.+PARAMMF%XB*ZCOE(D%NIB:D%NIE)) - ZBUCOE(D%NIB:D%NIE) = 2.*ZCOE(D%NIB:D%NIE)/(1.+PARAMMF%XB*ZCOE(D%NIB:D%NIE)) + ZWCOE(D%NIJB:D%NIJE) = (1.-PARAMMF%XB*ZCOE(D%NIJB:D%NIJE))/(1.+PARAMMF%XB*ZCOE(D%NIJB:D%NIJE)) + ZBUCOE(D%NIJB:D%NIJE) = 2.*ZCOE(D%NIJB:D%NIJE)/(1.+PARAMMF%XB*ZCOE(D%NIJB:D%NIJE)) - ZW_UP2(D%NIB:D%NIE,JK+D%NKL) = MAX(ZEPS,ZW_UP2(D%NIB:D%NIE,JK)*ZWCOE(D%NIB:D%NIE) + & - &PARAMMF%XA1*ZBUO(D%NIB:D%NIE,JK)*ZBUCOE(D%NIB:D%NIE)) - ZW_MAX(D%NIB:D%NIE) = MAX(ZW_MAX(D%NIB:D%NIE), SQRT(ZW_UP2(D%NIB:D%NIE,JK+D%NKL))) - ZWUP_MEAN(D%NIB:D%NIE) = MAX(ZEPS,0.5*(ZW_UP2(D%NIB:D%NIE,JK+D%NKL)+ZW_UP2(D%NIB:D%NIE,JK))) + ZW_UP2(D%NIJB:D%NIJE,JK+D%NKL) = MAX(ZEPS,ZW_UP2(D%NIJB:D%NIJE,JK)*ZWCOE(D%NIJB:D%NIJE) + & + &PARAMMF%XA1*ZBUO(D%NIJB:D%NIJE,JK)*ZBUCOE(D%NIJB:D%NIJE)) + ZW_MAX(D%NIJB:D%NIJE) = MAX(ZW_MAX(D%NIJB:D%NIJE), SQRT(ZW_UP2(D%NIJB:D%NIJE,JK+D%NKL))) + ZWUP_MEAN(D%NIJB:D%NIJE) = MAX(ZEPS,0.5*(ZW_UP2(D%NIJB:D%NIJE,JK+D%NKL)+ZW_UP2(D%NIJB:D%NIJE,JK))) ! Entrainement et detrainement - PENTR(D%NIB:D%NIE,JK) = MAX(0.,(PARAMMF%XBETA1/(1.+PARAMMF%XBETA1))* & - &(PARAMMF%XA1*ZBUO(D%NIB:D%NIE,JK)/ZWUP_MEAN(D%NIB:D%NIE)-PARAMMF%XB)) + PENTR(D%NIJB:D%NIJE,JK) = MAX(0.,(PARAMMF%XBETA1/(1.+PARAMMF%XBETA1))* & + &(PARAMMF%XA1*ZBUO(D%NIJB:D%NIJE,JK)/ZWUP_MEAN(D%NIJB:D%NIJE)-PARAMMF%XB)) - ZDETR_BUO(D%NIB:D%NIE) = MAX(0., -(PARAMMF%XBETA1/(1.+PARAMMF%XBETA1))*PARAMMF%XA1*ZBUO(D%NIB:D%NIE,JK)/ & - &ZWUP_MEAN(D%NIB:D%NIE)) - ZDETR_RT(D%NIB:D%NIE) = PARAMMF%XC*SQRT(MAX(0.,(PRT_UP(D%NIB:D%NIE,JK) - ZRTM_F(D%NIB:D%NIE,JK))) / & - &MAX(ZEPS,ZRTM_F(D%NIB:D%NIE,JK)) / ZWUP_MEAN(D%NIB:D%NIE)) - PDETR(D%NIB:D%NIE,JK) = ZDETR_RT(D%NIB:D%NIE)+ZDETR_BUO(D%NIB:D%NIE) + ZDETR_BUO(D%NIJB:D%NIJE) = MAX(0., -(PARAMMF%XBETA1/(1.+PARAMMF%XBETA1))*PARAMMF%XA1*ZBUO(D%NIJB:D%NIJE,JK)/ & + &ZWUP_MEAN(D%NIJB:D%NIJE)) + ZDETR_RT(D%NIJB:D%NIJE) = PARAMMF%XC*SQRT(MAX(0.,(PRT_UP(D%NIJB:D%NIJE,JK) - ZRTM_F(D%NIJB:D%NIJE,JK))) / & + &MAX(ZEPS,ZRTM_F(D%NIJB:D%NIJE,JK)) / ZWUP_MEAN(D%NIJB:D%NIJE)) + PDETR(D%NIJB:D%NIJE,JK) = ZDETR_RT(D%NIJB:D%NIJE)+ZDETR_BUO(D%NIJB:D%NIJE) ! If the updraft did not stop, compute cons updraft characteritics at jk+1 - WHERE(GTEST(D%NIB:D%NIE)) - ZZTOP(D%NIB:D%NIE) = MAX(ZZTOP(D%NIB:D%NIE),PZZ(D%NIB:D%NIE,JK+D%NKL)) - ZMIX2(D%NIB:D%NIE) = (PZZ(D%NIB:D%NIE,JK+D%NKL)-PZZ(D%NIB:D%NIE,JK))*PENTR(D%NIB:D%NIE,JK) !& - ZMIX3(D%NIB:D%NIE) = (PZZ(D%NIB:D%NIE,JK+D%NKL)-PZZ(D%NIB:D%NIE,JK))*PDETR(D%NIB:D%NIE,JK) !& + WHERE(GTEST(D%NIJB:D%NIJE)) + ZZTOP(D%NIJB:D%NIJE) = MAX(ZZTOP(D%NIJB:D%NIJE),PZZ(D%NIJB:D%NIJE,JK+D%NKL)) + ZMIX2(D%NIJB:D%NIJE) = (PZZ(D%NIJB:D%NIJE,JK+D%NKL)-PZZ(D%NIJB:D%NIJE,JK))*PENTR(D%NIJB:D%NIJE,JK) !& + ZMIX3(D%NIJB:D%NIJE) = (PZZ(D%NIJB:D%NIJE,JK+D%NKL)-PZZ(D%NIJB:D%NIJE,JK))*PDETR(D%NIJB:D%NIJE,JK) !& - ZQTM(D%NIB:D%NIE) = PRTM(D%NIB:D%NIE,JK)/(1.+PRTM(D%NIB:D%NIE,JK)) - ZTHSM(D%NIB:D%NIE,JK) = PTHLM(D%NIB:D%NIE,JK)*(1.+PARAMMF%XLAMBDA_MF*ZQTM(D%NIB:D%NIE)) - ZTHS_UP(D%NIB:D%NIE,JK+D%NKL)=(ZTHS_UP(D%NIB:D%NIE,JK)*(1.-0.5*ZMIX2(D%NIB:D%NIE)) + ZTHSM(D%NIB:D%NIE,JK)*ZMIX2(D%NIB:D%NIE))& - /(1.+0.5*ZMIX2(D%NIB:D%NIE)) - PRT_UP(D%NIB:D%NIE,JK+D%NKL)=(PRT_UP(D%NIB:D%NIE,JK)*(1.-0.5*ZMIX2(D%NIB:D%NIE)) + PRTM(D%NIB:D%NIE,JK)*ZMIX2(D%NIB:D%NIE)) & - /(1.+0.5*ZMIX2(D%NIB:D%NIE)) - ZQT_UP(D%NIB:D%NIE) = PRT_UP(D%NIB:D%NIE,JK+D%NKL)/(1.+PRT_UP(D%NIB:D%NIE,JK+D%NKL)) - PTHL_UP(D%NIB:D%NIE,JK+D%NKL)=ZTHS_UP(D%NIB:D%NIE,JK+D%NKL)/(1.+PARAMMF%XLAMBDA_MF*ZQT_UP(D%NIB:D%NIE)) + ZQTM(D%NIJB:D%NIJE) = PRTM(D%NIJB:D%NIJE,JK)/(1.+PRTM(D%NIJB:D%NIJE,JK)) + ZTHSM(D%NIJB:D%NIJE,JK) = PTHLM(D%NIJB:D%NIJE,JK)*(1.+PARAMMF%XLAMBDA_MF*ZQTM(D%NIJB:D%NIJE)) + ZTHS_UP(D%NIJB:D%NIJE,JK+D%NKL)=(ZTHS_UP(D%NIJB:D%NIJE,JK)*(1.-0.5*ZMIX2(D%NIJB:D%NIJE)) + & + &ZTHSM(D%NIJB:D%NIJE,JK)*ZMIX2(D%NIJB:D%NIJE))& + /(1.+0.5*ZMIX2(D%NIJB:D%NIJE)) + PRT_UP(D%NIJB:D%NIJE,JK+D%NKL)=(PRT_UP(D%NIJB:D%NIJE,JK)*(1.-0.5*ZMIX2(D%NIJB:D%NIJE)) + & + &PRTM(D%NIJB:D%NIJE,JK)*ZMIX2(D%NIJB:D%NIJE)) & + /(1.+0.5*ZMIX2(D%NIJB:D%NIJE)) + ZQT_UP(D%NIJB:D%NIJE) = PRT_UP(D%NIJB:D%NIJE,JK+D%NKL)/(1.+PRT_UP(D%NIJB:D%NIJE,JK+D%NKL)) + PTHL_UP(D%NIJB:D%NIJE,JK+D%NKL)=ZTHS_UP(D%NIJB:D%NIJE,JK+D%NKL)/(1.+PARAMMF%XLAMBDA_MF*ZQT_UP(D%NIJB:D%NIJE)) ENDWHERE IF(OMIXUV) THEN IF(JK/=D%NKB) THEN - WHERE(GTEST(D%NIB:D%NIE)) - PU_UP(D%NIB:D%NIE,JK+D%NKL) = (PU_UP(D%NIB:D%NIE,JK)*(1-0.5*ZMIX2(D%NIB:D%NIE)) + PUM(D%NIB:D%NIE,JK)*ZMIX2(D%NIB:D%NIE)+ & - 0.5*PARAMMF%XPRES_UV*(PZZ(D%NIB:D%NIE,JK+D%NKL)-PZZ(D%NIB:D%NIE,JK))*& - ((PUM(D%NIB:D%NIE,JK+D%NKL)-PUM(D%NIB:D%NIE,JK))/PDZZ(D%NIB:D%NIE,JK+D%NKL)+& - (PUM(D%NIB:D%NIE,JK)-PUM(D%NIB:D%NIE,JK-D%NKL))/PDZZ(D%NIB:D%NIE,JK)) ) & - /(1+0.5*ZMIX2(D%NIB:D%NIE)) - PV_UP(D%NIB:D%NIE,JK+D%NKL) = (PV_UP(D%NIB:D%NIE,JK)*(1-0.5*ZMIX2(D%NIB:D%NIE)) + PVM(D%NIB:D%NIE,JK)*ZMIX2(D%NIB:D%NIE)+ & - 0.5*PARAMMF%XPRES_UV*(PZZ(D%NIB:D%NIE,JK+D%NKL)-PZZ(D%NIB:D%NIE,JK))*& - ((PVM(D%NIB:D%NIE,JK+D%NKL)-PVM(D%NIB:D%NIE,JK))/PDZZ(D%NIB:D%NIE,JK+D%NKL)+& - (PVM(D%NIB:D%NIE,JK)-PVM(D%NIB:D%NIE,JK-D%NKL))/PDZZ(D%NIB:D%NIE,JK)) ) & - /(1+0.5*ZMIX2(D%NIB:D%NIE)) + WHERE(GTEST(D%NIJB:D%NIJE)) + PU_UP(D%NIJB:D%NIJE,JK+D%NKL) = (PU_UP(D%NIJB:D%NIJE,JK)*(1-0.5*ZMIX2(D%NIJB:D%NIJE)) + & + &PUM(D%NIJB:D%NIJE,JK)*ZMIX2(D%NIJB:D%NIJE)+ & + 0.5*PARAMMF%XPRES_UV*(PZZ(D%NIJB:D%NIJE,JK+D%NKL)-PZZ(D%NIJB:D%NIJE,JK))*& + ((PUM(D%NIJB:D%NIJE,JK+D%NKL)-PUM(D%NIJB:D%NIJE,JK))/PDZZ(D%NIJB:D%NIJE,JK+D%NKL)+& + (PUM(D%NIJB:D%NIJE,JK)-PUM(D%NIJB:D%NIJE,JK-D%NKL))/PDZZ(D%NIJB:D%NIJE,JK)) ) & + /(1+0.5*ZMIX2(D%NIJB:D%NIJE)) + PV_UP(D%NIJB:D%NIJE,JK+D%NKL) = (PV_UP(D%NIJB:D%NIJE,JK)*(1-0.5*ZMIX2(D%NIJB:D%NIJE)) + & + &PVM(D%NIJB:D%NIJE,JK)*ZMIX2(D%NIJB:D%NIJE)+ & + 0.5*PARAMMF%XPRES_UV*(PZZ(D%NIJB:D%NIJE,JK+D%NKL)-PZZ(D%NIJB:D%NIJE,JK))*& + ((PVM(D%NIJB:D%NIJE,JK+D%NKL)-PVM(D%NIJB:D%NIJE,JK))/PDZZ(D%NIJB:D%NIJE,JK+D%NKL)+& + (PVM(D%NIJB:D%NIJE,JK)-PVM(D%NIJB:D%NIJE,JK-D%NKL))/PDZZ(D%NIJB:D%NIJE,JK)) ) & + /(1+0.5*ZMIX2(D%NIJB:D%NIJE)) ENDWHERE ELSE - WHERE(GTEST(D%NIB:D%NIE)) - PU_UP(D%NIB:D%NIE,JK+D%NKL) = (PU_UP(D%NIB:D%NIE,JK)*(1-0.5*ZMIX2(D%NIB:D%NIE)) + PUM(D%NIB:D%NIE,JK)*ZMIX2(D%NIB:D%NIE)+ & - 0.5*PARAMMF%XPRES_UV*(PZZ(D%NIB:D%NIE,JK+D%NKL)-PZZ(D%NIB:D%NIE,JK))*& - ((PUM(D%NIB:D%NIE,JK+D%NKL)-PUM(D%NIB:D%NIE,JK))/PDZZ(D%NIB:D%NIE,JK+D%NKL)) ) & - /(1+0.5*ZMIX2(D%NIB:D%NIE)) - PV_UP(D%NIB:D%NIE,JK+D%NKL) = (PV_UP(D%NIB:D%NIE,JK)*(1-0.5*ZMIX2(D%NIB:D%NIE)) + PVM(D%NIB:D%NIE,JK)*ZMIX2(D%NIB:D%NIE)+ & - 0.5*PARAMMF%XPRES_UV*(PZZ(D%NIB:D%NIE,JK+D%NKL)-PZZ(D%NIB:D%NIE,JK))*& - ((PVM(D%NIB:D%NIE,JK+D%NKL)-PVM(D%NIB:D%NIE,JK))/PDZZ(D%NIB:D%NIE,JK+D%NKL)) ) & - /(1+0.5*ZMIX2(D%NIB:D%NIE)) + WHERE(GTEST(D%NIJB:D%NIJE)) + PU_UP(D%NIJB:D%NIJE,JK+D%NKL) = (PU_UP(D%NIJB:D%NIJE,JK)*(1-0.5*ZMIX2(D%NIJB:D%NIJE)) + & + &PUM(D%NIJB:D%NIJE,JK)*ZMIX2(D%NIJB:D%NIJE)+ & + 0.5*PARAMMF%XPRES_UV*(PZZ(D%NIJB:D%NIJE,JK+D%NKL)-PZZ(D%NIJB:D%NIJE,JK))*& + ((PUM(D%NIJB:D%NIJE,JK+D%NKL)-PUM(D%NIJB:D%NIJE,JK))/PDZZ(D%NIJB:D%NIJE,JK+D%NKL)) ) & + /(1+0.5*ZMIX2(D%NIJB:D%NIJE)) + PV_UP(D%NIJB:D%NIJE,JK+D%NKL) = (PV_UP(D%NIJB:D%NIJE,JK)*(1-0.5*ZMIX2(D%NIJB:D%NIJE)) + & + &PVM(D%NIJB:D%NIJE,JK)*ZMIX2(D%NIJB:D%NIJE)+ & + 0.5*PARAMMF%XPRES_UV*(PZZ(D%NIJB:D%NIJE,JK+D%NKL)-PZZ(D%NIJB:D%NIJE,JK))*& + ((PVM(D%NIJB:D%NIJE,JK+D%NKL)-PVM(D%NIJB:D%NIJE,JK))/PDZZ(D%NIJB:D%NIJE,JK+D%NKL)) ) & + /(1+0.5*ZMIX2(D%NIJB:D%NIJE)) ENDWHERE ENDIF ENDIF !DO JSV=1,ISV ! IF (ONOMIXLG .AND. JSV >= KSV_LGBEG .AND. JSV<= KSV_LGEND) CYCLE - ! WHERE(GTEST(D%NIB:D%NIE)) - ! PSV_UP(D%NIB:D%NIE,JK+KKL,JSV) = (PSV_UP(D%NIB:D%NIE,JK,JSV)*(1-0.5*ZMIX2(D%NIB:D%NIE)) + & - ! PSVM(D%NIB:D%NIE,JK,JSV)*ZMIX2(D%NIB:D%NIE)) /(1+0.5*ZMIX2(D%NIB:D%NIE)) + ! WHERE(GTEST(D%NIJB:D%NIJE)) + ! PSV_UP(D%NIJB:D%NIJE,JK+KKL,JSV) = (PSV_UP(D%NIJB:D%NIJE,JK,JSV)*(1-0.5*ZMIX2(D%NIJB:D%NIJE)) + & + ! PSVM(D%NIJB:D%NIJE,JK,JSV)*ZMIX2(D%NIJB:D%NIJE)) /(1+0.5*ZMIX2(D%NIJB:D%NIJE)) ! ENDWHERE !ENDDO ! Compute non cons. var. at level JK+KKL - ZRC_UP(D%NIB:D%NIE)=PRC_UP(D%NIB:D%NIE,JK) ! guess = level just below - ZRI_UP(D%NIB:D%NIE)=PRI_UP(D%NIB:D%NIE,JK) ! guess = level just below - ZRV_UP(D%NIB:D%NIE)=PRV_UP(D%NIB:D%NIE,JK) - !$mnh_end_expand_where(JI=D%NIB:D%NIE) - CALL TH_R_FROM_THL_RT(CST,NEB, D%NIT, HFRAC_ICE,PFRAC_ICE_UP(:,JK+D%NKL),ZPRES_F(:,JK+D%NKL), & + ZRC_UP(D%NIJB:D%NIJE)=PRC_UP(D%NIJB:D%NIJE,JK) ! guess = level just below + ZRI_UP(D%NIJB:D%NIJE)=PRI_UP(D%NIJB:D%NIJE,JK) ! guess = level just below + ZRV_UP(D%NIJB:D%NIJE)=PRV_UP(D%NIJB:D%NIJE,JK) + !$mnh_end_expand_where(JI=D%NIJB:D%NIJE) + CALL TH_R_FROM_THL_RT(CST,NEB, D%NIJT, HFRAC_ICE,PFRAC_ICE_UP(:,JK+D%NKL),ZPRES_F(:,JK+D%NKL), & PTHL_UP(:,JK+D%NKL),PRT_UP(:,JK+D%NKL),ZTH_UP(:,JK+D%NKL), & ZRV_UP(:),ZRC_UP(:),ZRI_UP(:),ZRSATW(:),ZRSATI(:),OOCEAN=.FALSE.,& - PBUF=ZBUF, KB=D%NIB, KE=D%NIE) - !$mnh_expand_where(JI=D%NIB:D%NIE) - WHERE(GTEST(D%NIB:D%NIE)) - ZT_UP(D%NIB:D%NIE) = ZTH_UP(D%NIB:D%NIE,JK+D%NKL)*PEXNM(D%NIB:D%NIE,JK+D%NKL) - ZCP(D%NIB:D%NIE) = CST%XCPD + CST%XCL * ZRC_UP(D%NIB:D%NIE) - ZLVOCPEXN(D%NIB:D%NIE)=(CST%XLVTT + (CST%XCPV-CST%XCL) * (ZT_UP(D%NIB:D%NIE)-CST%XTT) ) / & - &ZCP(D%NIB:D%NIE) / PEXNM(D%NIB:D%NIE,JK+D%NKL) - PRC_UP(D%NIB:D%NIE,JK+D%NKL)=MIN(0.5E-3,ZRC_UP(D%NIB:D%NIE)) ! On ne peut depasser 0.5 g/kg (autoconversion donc elimination !) - PTHL_UP(D%NIB:D%NIE,JK+D%NKL) = PTHL_UP(D%NIB:D%NIE,JK+D%NKL)+ & - & ZLVOCPEXN(D%NIB:D%NIE)*(ZRC_UP(D%NIB:D%NIE)-PRC_UP(D%NIB:D%NIE,JK+D%NKL)) - PRV_UP(D%NIB:D%NIE,JK+D%NKL)=ZRV_UP(D%NIB:D%NIE) - PRI_UP(D%NIB:D%NIE,JK+D%NKL)=ZRI_UP(D%NIB:D%NIE) - PRT_UP(D%NIB:D%NIE,JK+D%NKL) = PRC_UP(D%NIB:D%NIE,JK+D%NKL) + PRV_UP(D%NIB:D%NIE,JK+D%NKL) - PRSAT_UP(D%NIB:D%NIE,JK+D%NKL) = ZRSATW(D%NIB:D%NIE)*(1-PFRAC_ICE_UP(D%NIB:D%NIE,JK+D%NKL)) + & - & ZRSATI(D%NIB:D%NIE)*PFRAC_ICE_UP(D%NIB:D%NIE,JK+D%NKL) + PBUF=ZBUF, KB=D%NIJB, KE=D%NIJE) + !$mnh_expand_where(JI=D%NIJB:D%NIJE) + WHERE(GTEST(D%NIJB:D%NIJE)) + ZT_UP(D%NIJB:D%NIJE) = ZTH_UP(D%NIJB:D%NIJE,JK+D%NKL)*PEXNM(D%NIJB:D%NIJE,JK+D%NKL) + ZCP(D%NIJB:D%NIJE) = CST%XCPD + CST%XCL * ZRC_UP(D%NIJB:D%NIJE) + ZLVOCPEXN(D%NIJB:D%NIJE)=(CST%XLVTT + (CST%XCPV-CST%XCL) * (ZT_UP(D%NIJB:D%NIJE)-CST%XTT) ) / & + &ZCP(D%NIJB:D%NIJE) / PEXNM(D%NIJB:D%NIJE,JK+D%NKL) + PRC_UP(D%NIJB:D%NIJE,JK+D%NKL)=MIN(0.5E-3,ZRC_UP(D%NIJB:D%NIJE)) ! On ne peut depasser 0.5 g/kg (autoconversion donc elimination !) + PTHL_UP(D%NIJB:D%NIJE,JK+D%NKL) = PTHL_UP(D%NIJB:D%NIJE,JK+D%NKL)+ & + & ZLVOCPEXN(D%NIJB:D%NIJE)*(ZRC_UP(D%NIJB:D%NIJE)-PRC_UP(D%NIJB:D%NIJE,JK+D%NKL)) + PRV_UP(D%NIJB:D%NIJE,JK+D%NKL)=ZRV_UP(D%NIJB:D%NIJE) + PRI_UP(D%NIJB:D%NIJE,JK+D%NKL)=ZRI_UP(D%NIJB:D%NIJE) + PRT_UP(D%NIJB:D%NIJE,JK+D%NKL) = PRC_UP(D%NIJB:D%NIJE,JK+D%NKL) + PRV_UP(D%NIJB:D%NIJE,JK+D%NKL) + PRSAT_UP(D%NIJB:D%NIJE,JK+D%NKL) = ZRSATW(D%NIJB:D%NIJE)*(1-PFRAC_ICE_UP(D%NIJB:D%NIJE,JK+D%NKL)) + & + & ZRSATI(D%NIJB:D%NIJE)*PFRAC_ICE_UP(D%NIJB:D%NIJE,JK+D%NKL) ENDWHERE ! Compute the updraft theta_v, buoyancy and w**2 for level JK+1 - WHERE(GTEST(D%NIB:D%NIE)) - !PTHV_UP(D%NIB:D%NIE,JK+KKL) = ZTH_UP(D%NIB:D%NIE,JK+KKL)*((1+ZRVORD*PRV_UP(D%NIB:D%NIE,JK+KKL))/(1+PRT_UP(D%NIB:D%NIE,JK+KKL))) - PTHV_UP(D%NIB:D%NIE,JK+D%NKL) = ZTH_UP(D%NIB:D%NIE,JK+D%NKL)* & - & (1.+0.608*PRV_UP(D%NIB:D%NIE,JK+D%NKL) - PRC_UP(D%NIB:D%NIE,JK+D%NKL)) + WHERE(GTEST(D%NIJB:D%NIJE)) + !PTHV_UP(D%NIJB:D%NIJE,JK+KKL) = ZTH_UP(D%NIJB:D%NIJE,JK+KKL)*((1+ZRVORD*PRV_UP(D%NIJB:D%NIJE,JK+KKL))/(1+PRT_UP(D%NIJB:D%NIJE,JK+KKL))) + PTHV_UP(D%NIJB:D%NIJE,JK+D%NKL) = ZTH_UP(D%NIJB:D%NIJE,JK+D%NKL)* & + & (1.+0.608*PRV_UP(D%NIJB:D%NIJE,JK+D%NKL) - PRC_UP(D%NIJB:D%NIJE,JK+D%NKL)) ENDWHERE ! Test if the updraft has reach the ETL - GTESTETL(D%NIB:D%NIE)=.FALSE. - WHERE (GTEST(D%NIB:D%NIE).AND.(PBUO_INTEG(D%NIB:D%NIE,JK)<=0.)) - KKETL(D%NIB:D%NIE) = JK+D%NKL - GTESTETL(D%NIB:D%NIE)=.TRUE. + GTESTETL(D%NIJB:D%NIJE)=.FALSE. + WHERE (GTEST(D%NIJB:D%NIJE).AND.(PBUO_INTEG(D%NIJB:D%NIJE,JK)<=0.)) + KKETL(D%NIJB:D%NIJE) = JK+D%NKL + GTESTETL(D%NIJB:D%NIJE)=.TRUE. ENDWHERE ! Test is we have reached the top of the updraft - WHERE (GTEST(D%NIB:D%NIE).AND.((ZW_UP2(D%NIB:D%NIE,JK+D%NKL)<=ZEPS))) - ZW_UP2(D%NIB:D%NIE,JK+D%NKL)=ZEPS - GTEST(D%NIB:D%NIE)=.FALSE. - PTHL_UP(D%NIB:D%NIE,JK+D%NKL)=ZTHLM_F(D%NIB:D%NIE,JK+D%NKL) - PRT_UP(D%NIB:D%NIE,JK+D%NKL)=ZRTM_F(D%NIB:D%NIE,JK+D%NKL) - PRC_UP(D%NIB:D%NIE,JK+D%NKL)=0. - PRI_UP(D%NIB:D%NIE,JK+D%NKL)=0. - PRV_UP(D%NIB:D%NIE,JK+D%NKL)=0. - PTHV_UP(D%NIB:D%NIE,JK+D%NKL)=ZTHVM_F(D%NIB:D%NIE,JK+D%NKL) - PFRAC_UP(D%NIB:D%NIE,JK+D%NKL)=0. - KKCTL(D%NIB:D%NIE)=JK+D%NKL + WHERE (GTEST(D%NIJB:D%NIJE).AND.((ZW_UP2(D%NIJB:D%NIJE,JK+D%NKL)<=ZEPS))) + ZW_UP2(D%NIJB:D%NIJE,JK+D%NKL)=ZEPS + GTEST(D%NIJB:D%NIJE)=.FALSE. + PTHL_UP(D%NIJB:D%NIJE,JK+D%NKL)=ZTHLM_F(D%NIJB:D%NIJE,JK+D%NKL) + PRT_UP(D%NIJB:D%NIJE,JK+D%NKL)=ZRTM_F(D%NIJB:D%NIJE,JK+D%NKL) + PRC_UP(D%NIJB:D%NIJE,JK+D%NKL)=0. + PRI_UP(D%NIJB:D%NIJE,JK+D%NKL)=0. + PRV_UP(D%NIJB:D%NIJE,JK+D%NKL)=0. + PTHV_UP(D%NIJB:D%NIJE,JK+D%NKL)=ZTHVM_F(D%NIJB:D%NIJE,JK+D%NKL) + PFRAC_UP(D%NIJB:D%NIJE,JK+D%NKL)=0. + KKCTL(D%NIJB:D%NIJE)=JK+D%NKL ENDWHERE - !$mnh_end_expand_where(JI=D%NIB:D%NIE) + !$mnh_end_expand_where(JI=D%NIJB:D%NIJE) ENDDO -! Closure assumption for mass flux at KKB+1 level (Mass flux is supposed to be 0 at KKB level !) +! Closure assumption for mass flux at KKB+1 level (Mass flux is supposed to be 0 at KKB level !) ! Hourdin et al 2002 formulation -!$mnh_expand_array(JI=D%NIB:D%NIE) -ZZTOP(D%NIB:D%NIE) = MAX(ZZTOP(D%NIB:D%NIE),ZEPS) -!$mnh_end_expand_array(JI=D%NIB:D%NIE) +!$mnh_expand_array(JI=D%NIJB:D%NIJE) +ZZTOP(D%NIJB:D%NIJE) = MAX(ZZTOP(D%NIJB:D%NIJE),ZEPS) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE) DO JK=D%NKB+D%NKL,D%NKE-D%NKL,D%NKL ! Vertical loop - !$mnh_expand_where(JI=D%NIB:D%NIE) - WHERE(JK<=IALIM(D%NIB:D%NIE)) - ZALIM_STAR_TOT(D%NIB:D%NIE) = ZALIM_STAR_TOT(D%NIB:D%NIE) + ZALIM_STAR(D%NIB:D%NIE,JK)**2* & - & ZZDZ(D%NIB:D%NIE,JK)/PRHODREF(D%NIB:D%NIE,JK) + !$mnh_expand_where(JI=D%NIJB:D%NIJE) + WHERE(JK<=IALIM(D%NIJB:D%NIJE)) + ZALIM_STAR_TOT(D%NIJB:D%NIJE) = ZALIM_STAR_TOT(D%NIJB:D%NIJE) + ZALIM_STAR(D%NIJB:D%NIJE,JK)**2* & + & ZZDZ(D%NIJB:D%NIJE,JK)/PRHODREF(D%NIJB:D%NIJE,JK) ENDWHERE - !$mnh_end_expand_where(JI=D%NIB:D%NIE) + !$mnh_end_expand_where(JI=D%NIJB:D%NIJE) ENDDO -!$mnh_expand_where(JI=D%NIB:D%NIE) -WHERE (ZALIM_STAR_TOT(D%NIB:D%NIE)*ZZTOP(D%NIB:D%NIE) > ZEPS) - ZPHI(D%NIB:D%NIE) = ZW_MAX(D%NIB:D%NIE)/(PARAMMF%XR*ZZTOP(D%NIB:D%NIE)*ZALIM_STAR_TOT(D%NIB:D%NIE)) +!$mnh_expand_where(JI=D%NIJB:D%NIJE) +WHERE (ZALIM_STAR_TOT(D%NIJB:D%NIJE)*ZZTOP(D%NIJB:D%NIJE) > ZEPS) + ZPHI(D%NIJB:D%NIJE) = ZW_MAX(D%NIJB:D%NIJE)/(PARAMMF%XR*ZZTOP(D%NIJB:D%NIJE)*ZALIM_STAR_TOT(D%NIJB:D%NIJE)) ENDWHERE -GTEST(D%NIB:D%NIE) = .TRUE. -PEMF(D%NIB:D%NIE,D%NKB+D%NKL) = ZPHI(D%NIB:D%NIE)*ZZDZ(D%NIB:D%NIE,D%NKB)*ZALIM_STAR(D%NIB:D%NIE,D%NKB) +GTEST(D%NIJB:D%NIJE) = .TRUE. +PEMF(D%NIJB:D%NIJE,D%NKB+D%NKL) = ZPHI(D%NIJB:D%NIJE)*ZZDZ(D%NIJB:D%NIJE,D%NKB)*ZALIM_STAR(D%NIJB:D%NIJE,D%NKB) ! Updraft fraction must be smaller than XFRAC_UP_MAX -PFRAC_UP(D%NIB:D%NIE,D%NKB+D%NKL)=PEMF(D%NIB:D%NIE,D%NKB+D%NKL)/ & - &(SQRT(ZW_UP2(D%NIB:D%NIE,D%NKB+D%NKL))*ZRHO_F(D%NIB:D%NIE,D%NKB+D%NKL)) -PFRAC_UP(D%NIB:D%NIE,D%NKB+D%NKL)=MIN(PARAMMF%XFRAC_UP_MAX,PFRAC_UP(D%NIB:D%NIE,D%NKB+D%NKL)) -PEMF(D%NIB:D%NIE,D%NKB+D%NKL) = ZRHO_F(D%NIB:D%NIE,D%NKB+D%NKL)*PFRAC_UP(D%NIB:D%NIE,D%NKB+D%NKL)* & - & SQRT(ZW_UP2(D%NIB:D%NIE,D%NKB+D%NKL)) -!$mnh_end_expand_where(JI=D%NIB:D%NIE) +PFRAC_UP(D%NIJB:D%NIJE,D%NKB+D%NKL)=PEMF(D%NIJB:D%NIJE,D%NKB+D%NKL)/ & + &(SQRT(ZW_UP2(D%NIJB:D%NIJE,D%NKB+D%NKL))*ZRHO_F(D%NIJB:D%NIJE,D%NKB+D%NKL)) +PFRAC_UP(D%NIJB:D%NIJE,D%NKB+D%NKL)=MIN(PARAMMF%XFRAC_UP_MAX,PFRAC_UP(D%NIJB:D%NIJE,D%NKB+D%NKL)) +PEMF(D%NIJB:D%NIJE,D%NKB+D%NKL) = ZRHO_F(D%NIJB:D%NIJE,D%NKB+D%NKL)*PFRAC_UP(D%NIJB:D%NIJE,D%NKB+D%NKL)* & + & SQRT(ZW_UP2(D%NIJB:D%NIJE,D%NKB+D%NKL)) +!$mnh_end_expand_where(JI=D%NIJB:D%NIJE) DO JK=D%NKB+D%NKL,D%NKE-D%NKL,D%NKL ! Vertical loop - !$mnh_expand_where(JI=D%NIB:D%NIE) + !$mnh_expand_where(JI=D%NIJB:D%NIJE) - GTEST(D%NIB:D%NIE) = (ZW_UP2(D%NIB:D%NIE,JK) > ZEPS) + GTEST(D%NIJB:D%NIJE) = (ZW_UP2(D%NIJB:D%NIJE,JK) > ZEPS) - WHERE (GTEST(D%NIB:D%NIE)) - WHERE(JK<IALIM(D%NIB:D%NIE)) - PEMF(D%NIB:D%NIE,JK+D%NKL) = MAX(0.,PEMF(D%NIB:D%NIE,JK) + ZPHI(D%NIB:D%NIE)*ZZDZ(D%NIB:D%NIE,JK)* & - & (PENTR(D%NIB:D%NIE,JK) - PDETR(D%NIB:D%NIE,JK))) + WHERE (GTEST(D%NIJB:D%NIJE)) + WHERE(JK<IALIM(D%NIJB:D%NIJE)) + PEMF(D%NIJB:D%NIJE,JK+D%NKL) = MAX(0.,PEMF(D%NIJB:D%NIJE,JK) + ZPHI(D%NIJB:D%NIJE)*ZZDZ(D%NIJB:D%NIJE,JK)* & + & (PENTR(D%NIJB:D%NIJE,JK) - PDETR(D%NIJB:D%NIJE,JK))) ELSEWHERE - ZMIX1(D%NIB:D%NIE)=ZZDZ(D%NIB:D%NIE,JK)*(PENTR(D%NIB:D%NIE,JK)-PDETR(D%NIB:D%NIE,JK)) - PEMF(D%NIB:D%NIE,JK+D%NKL)=PEMF(D%NIB:D%NIE,JK)*EXP(ZMIX1(D%NIB:D%NIE)) + ZMIX1(D%NIJB:D%NIJE)=ZZDZ(D%NIJB:D%NIJE,JK)*(PENTR(D%NIJB:D%NIJE,JK)-PDETR(D%NIJB:D%NIJE,JK)) + PEMF(D%NIJB:D%NIJE,JK+D%NKL)=PEMF(D%NIJB:D%NIJE,JK)*EXP(ZMIX1(D%NIJB:D%NIJE)) ENDWHERE ! Updraft fraction must be smaller than XFRAC_UP_MAX - PFRAC_UP(D%NIB:D%NIE,JK+D%NKL)=PEMF(D%NIB:D%NIE,JK+D%NKL)/(SQRT(ZW_UP2(D%NIB:D%NIE,JK+D%NKL))*ZRHO_F(D%NIB:D%NIE,JK+D%NKL)) - PFRAC_UP(D%NIB:D%NIE,JK+D%NKL)=MIN(PARAMMF%XFRAC_UP_MAX,PFRAC_UP(D%NIB:D%NIE,JK+D%NKL)) - PEMF(D%NIB:D%NIE,JK+D%NKL) = ZRHO_F(D%NIB:D%NIE,JK+D%NKL)*PFRAC_UP(D%NIB:D%NIE,JK+D%NKL)*SQRT(ZW_UP2(D%NIB:D%NIE,JK+D%NKL)) + PFRAC_UP(D%NIJB:D%NIJE,JK+D%NKL)=PEMF(D%NIJB:D%NIJE,JK+D%NKL)/& + &(SQRT(ZW_UP2(D%NIJB:D%NIJE,JK+D%NKL))*ZRHO_F(D%NIJB:D%NIJE,JK+D%NKL)) + PFRAC_UP(D%NIJB:D%NIJE,JK+D%NKL)=MIN(PARAMMF%XFRAC_UP_MAX,PFRAC_UP(D%NIJB:D%NIJE,JK+D%NKL)) + PEMF(D%NIJB:D%NIJE,JK+D%NKL) = ZRHO_F(D%NIJB:D%NIJE,JK+D%NKL)*PFRAC_UP(D%NIJB:D%NIJE,JK+D%NKL)*& + & SQRT(ZW_UP2(D%NIJB:D%NIJE,JK+D%NKL)) ENDWHERE - !$mnh_end_expand_where(JI=D%NIB:D%NIE) + !$mnh_end_expand_where(JI=D%NIJB:D%NIJE) ENDDO -!$mnh_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) -PW_UP(D%NIB:D%NIE,:)=SQRT(ZW_UP2(D%NIB:D%NIE,:)) -!$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) -!$mnh_expand_array(JI=D%NIB:D%NIE) -PEMF(D%NIB:D%NIE,D%NKB) =0. -!$mnh_end_expand_array(JI=D%NIB:D%NIE) +!$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) +PW_UP(D%NIJB:D%NIJE,:)=SQRT(ZW_UP2(D%NIJB:D%NIJE,:)) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) +!$mnh_expand_array(JI=D%NIJB:D%NIJE) +PEMF(D%NIJB:D%NIJE,D%NKB) =0. +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE) ! Limits the shallow convection scheme when cloud heigth is higher than 3000m. ! To do this, mass flux is multiplied by a coefficient decreasing linearly @@ -615,26 +624,26 @@ PEMF(D%NIB:D%NIE,D%NKB) =0. ! This way, all MF fluxes are diminished by this amount. ! Diagnosed cloud fraction is also multiplied by the same coefficient. ! -DO JI=D%NIB,D%NIE +DO JI=D%NIJB,D%NIJE PDEPTH(JI) = MAX(0., PZZ(JI,KKCTL(JI)) - PZZ(JI,KKLCL(JI)) ) END DO -!$mnh_expand_array(JI=D%NIB:D%NIE) -GWORK1(D%NIB:D%NIE)= (GTESTLCL(D%NIB:D%NIE) .AND. (PDEPTH(D%NIB:D%NIE) > ZDEPTH_MAX1) ) -!$mnh_end_expand_array(JI=D%NIB:D%NIE) +!$mnh_expand_array(JI=D%NIJB:D%NIJE) +GWORK1(D%NIJB:D%NIJE)= (GTESTLCL(D%NIJB:D%NIJE) .AND. (PDEPTH(D%NIJB:D%NIJE) > ZDEPTH_MAX1) ) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE) DO JK=1,D%NKT - !$mnh_expand_array(JI=D%NIB:D%NIE) - GWORK2(D%NIB:D%NIE,JK) = GWORK1(D%NIB:D%NIE) - ZCOEF(D%NIB:D%NIE,JK) = (1.-(PDEPTH(D%NIB:D%NIE)-ZDEPTH_MAX1)/(ZDEPTH_MAX2-ZDEPTH_MAX1)) - ZCOEF(D%NIB:D%NIE,JK)=MIN(MAX(ZCOEF(D%NIB:D%NIE,JK),0.),1.) - !$mnh_end_expand_array(JI=D%NIB:D%NIE) + !$mnh_expand_array(JI=D%NIJB:D%NIJE) + GWORK2(D%NIJB:D%NIJE,JK) = GWORK1(D%NIJB:D%NIJE) + ZCOEF(D%NIJB:D%NIJE,JK) = (1.-(PDEPTH(D%NIJB:D%NIJE)-ZDEPTH_MAX1)/(ZDEPTH_MAX2-ZDEPTH_MAX1)) + ZCOEF(D%NIJB:D%NIJE,JK)=MIN(MAX(ZCOEF(D%NIJB:D%NIJE,JK),0.),1.) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE) ENDDO -!$mnh_expand_where(JI=D%NIB:D%NIE,JK=1:D%NKT) -WHERE (GWORK2(D%NIB:D%NIE,:)) - PEMF(D%NIB:D%NIE,:) = PEMF(D%NIB:D%NIE,:) * ZCOEF(D%NIB:D%NIE,:) - PFRAC_UP(D%NIB:D%NIE,:) = PFRAC_UP(D%NIB:D%NIE,:) * ZCOEF(D%NIB:D%NIE,:) +!$mnh_expand_where(JI=D%NIJB:D%NIJE,JK=1:D%NKT) +WHERE (GWORK2(D%NIJB:D%NIJE,:)) + PEMF(D%NIJB:D%NIJE,:) = PEMF(D%NIJB:D%NIJE,:) * ZCOEF(D%NIJB:D%NIJE,:) + PFRAC_UP(D%NIJB:D%NIJE,:) = PFRAC_UP(D%NIJB:D%NIJE,:) * ZCOEF(D%NIJB:D%NIJE,:) ENDWHERE -!$mnh_end_expand_where(JI=D%NIB:D%NIE,JK=1:D%NKT) +!$mnh_end_expand_where(JI=D%NIJB:D%NIJE,JK=1:D%NKT) IF (LHOOK) CALL DR_HOOK('COMPUTE_UPDRAF_RAHA',1,ZHOOK_HANDLE) ! diff --git a/src/common/turb/mode_compute_updraft_rhcj10.F90 b/src/common/turb/mode_compute_updraft_rhcj10.F90 index c3fcc7fc5a5ae05b519be3ec2b443de64c3c28ab..84cf4e7ebc17e54c00bb7be618b6b46bf9ed6ef1 100644 --- a/src/common/turb/mode_compute_updraft_rhcj10.F90 +++ b/src/common/turb/mode_compute_updraft_rhcj10.F90 @@ -93,105 +93,105 @@ 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, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PZZ ! Height at the flux point -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PDZZ ! Metrics coefficient +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PZZ ! Height at the flux point +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDZZ ! Metrics coefficient -REAL, DIMENSION(D%NIT), INTENT(IN) :: PSFTH,PSFRV +REAL, DIMENSION(D%NIJT), INTENT(IN) :: PSFTH,PSFRV ! normal surface fluxes of theta,rv,(u,v) parallel to the orography -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PPABSM ! Pressure at t-dt -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PRHODREF ! dry density of the +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PPABSM ! Pressure at t-dt +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODREF ! dry density of the ! reference state -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PUM ! u mean wind -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PVM ! v mean wind -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PTKEM ! TKE at t-dt +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PUM ! u mean wind +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PVM ! v mean wind +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTKEM ! TKE at t-dt ! !REAL, DIMENSION(:,:), INTENT(IN) :: PEXNM ! Exner function at t-dt -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PTHM ! pot. temp. at t-dt -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PRVM ! vapor mixing ratio at t-dt -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PTHLM,PRTM ! cons. var. at t-dt - -REAL, DIMENSION(D%NIT,D%NKT,KSV), INTENT(IN) :: PSVM ! scalar var. at t-dt - -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PTHL_UP,PRT_UP ! updraft properties -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PU_UP, PV_UP ! updraft wind components -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT):: PRV_UP,PRC_UP ! updraft rv, rc -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT):: PRI_UP ! updraft ri -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT):: PTHV_UP ! updraft THv -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT):: PW_UP,PFRAC_UP ! updraft w, fraction -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT):: PFRAC_ICE_UP ! liquid/solid fraction in updraft -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT):: PRSAT_UP ! Rsat - -REAL, DIMENSION(D%NIT,D%NKT,KSV), INTENT(OUT) :: PSV_UP ! updraft scalar var. +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHM ! pot. temp. at t-dt +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRVM ! vapor mixing ratio at t-dt +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHLM,PRTM ! cons. var. at t-dt + +REAL, DIMENSION(D%NIJT,D%NKT,KSV), INTENT(IN) :: PSVM ! scalar var. at t-dt + +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PTHL_UP,PRT_UP ! updraft properties +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PU_UP, PV_UP ! updraft wind components +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT):: PRV_UP,PRC_UP ! updraft rv, rc +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT):: PRI_UP ! updraft ri +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT):: PTHV_UP ! updraft THv +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT):: PW_UP,PFRAC_UP ! updraft w, fraction +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT):: PFRAC_ICE_UP ! liquid/solid fraction in updraft +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT):: PRSAT_UP ! Rsat + +REAL, DIMENSION(D%NIJT,D%NKT,KSV), INTENT(OUT) :: PSV_UP ! updraft scalar var. -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT):: PEMF,PDETR,PENTR ! Mass_flux, +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT):: PEMF,PDETR,PENTR ! Mass_flux, ! detrainment,entrainment -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT) :: PBUO_INTEG ! Integrated Buoyancy -INTEGER, DIMENSION(D%NIT), INTENT(INOUT):: KKLCL,KKETL,KKCTL! LCL, ETL, CTL -REAL, DIMENSION(D%NIT), INTENT(OUT) :: PDEPTH ! Deepness of cloud +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PBUO_INTEG ! Integrated Buoyancy +INTEGER, DIMENSION(D%NIJT), INTENT(INOUT):: KKLCL,KKETL,KKCTL! LCL, ETL, CTL +REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PDEPTH ! Deepness of cloud ! 1.2 Declaration of local variables ! ! Mean environment variables at t-dt at flux point -REAL, DIMENSION(D%NIT,D%NKT) :: ZTHM_F,ZRVM_F ! Theta,rv of +REAL, DIMENSION(D%NIJT,D%NKT) :: ZTHM_F,ZRVM_F ! Theta,rv of ! updraft environnement -REAL, DIMENSION(D%NIT,D%NKT) :: ZRTM_F, ZTHLM_F, ZTKEM_F ! rt, thetal,TKE,pressure, -REAL, DIMENSION(D%NIT,D%NKT) :: ZUM_F,ZVM_F,ZRHO_F ! density,momentum -REAL, DIMENSION(D%NIT,D%NKT) :: ZPRES_F,ZTHVM_F ! interpolated at the flux point -REAL, DIMENSION(D%NIT,D%NKT) :: ZG_O_THVREF ! g*ThetaV ref -REAL, DIMENSION(D%NIT,D%NKT) :: ZW_UP2 ! w**2 of the updraft +REAL, DIMENSION(D%NIJT,D%NKT) :: ZRTM_F, ZTHLM_F, ZTKEM_F ! rt, thetal,TKE,pressure, +REAL, DIMENSION(D%NIJT,D%NKT) :: ZUM_F,ZVM_F,ZRHO_F ! density,momentum +REAL, DIMENSION(D%NIJT,D%NKT) :: ZPRES_F,ZTHVM_F ! interpolated at the flux point +REAL, DIMENSION(D%NIJT,D%NKT) :: ZG_O_THVREF ! g*ThetaV ref +REAL, DIMENSION(D%NIJT,D%NKT) :: ZW_UP2 ! w**2 of the updraft -REAL, DIMENSION(D%NIT,D%NKT,KSV) :: ZSVM_F ! scalar variables +REAL, DIMENSION(D%NIJT,D%NKT,KSV) :: ZSVM_F ! scalar variables -REAL, DIMENSION(D%NIT,D%NKT) :: ZTH_UP ! updraft THETA +REAL, DIMENSION(D%NIJT,D%NKT) :: ZTH_UP ! updraft THETA !REAL, DIMENSION(SIZE(PTHM,1)) :: ZT_UP ! updraft T !REAL, DIMENSION(SIZE(PTHM,1)) :: ZLVOCPEXN ! updraft L !REAL, DIMENSION(SIZE(PTHM,1)) :: ZCP ! updraft cp -REAL, DIMENSION(D%NIT,D%NKT) :: ZBUO ! Buoyancy +REAL, DIMENSION(D%NIJT,D%NKT) :: ZBUO ! Buoyancy !REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2)) :: ZTHS_UP,ZTHSM -REAL, DIMENSION(D%NIT,D%NKT) :: ZCOEF ! diminution coefficient for too high clouds +REAL, DIMENSION(D%NIJT,D%NKT) :: ZCOEF ! diminution coefficient for too high clouds REAL :: ZWTHVSURF ! Surface w'thetav' REAL :: ZRVORD ! RV/RD -REAL, DIMENSION(D%NIT) :: ZMIX1,ZMIX2 +REAL, DIMENSION(D%NIJT) :: ZMIX1,ZMIX2 -REAL, DIMENSION(D%NIT) :: ZLUP ! Upward Mixing length from the ground +REAL, DIMENSION(D%NIJT) :: ZLUP ! Upward Mixing length from the ground INTEGER :: JK,JI,JSV ! loop counters -LOGICAL, DIMENSION(D%NIT) :: GTEST,GTESTLCL +LOGICAL, DIMENSION(D%NIJT) :: GTEST,GTESTLCL ! Test if the ascent continue, if LCL or ETL is reached LOGICAL :: GLMIX ! To choose upward or downward mixing length -LOGICAL, DIMENSION(D%NIT) :: GWORK1 -LOGICAL, DIMENSION(D%NIT,D%NKT) :: GWORK2 +LOGICAL, DIMENSION(D%NIJT) :: GWORK1 +LOGICAL, DIMENSION(D%NIJT,D%NKT) :: GWORK2 INTEGER :: ITEST -REAL, DIMENSION(D%NIT) :: ZRC_UP, ZRI_UP, ZRV_UP, ZRSATW, ZRSATI +REAL, DIMENSION(D%NIJT) :: ZRC_UP, ZRI_UP, ZRV_UP, ZRSATW, ZRSATI -REAL, DIMENSION(D%NIT,D%NKT) :: ZZDZ +REAL, DIMENSION(D%NIJT,D%NKT) :: ZZDZ -REAL, DIMENSION(D%NIT) :: ZTEST,ZDZ,ZWUP_MEAN ! -REAL, DIMENSION(D%NIT) :: ZCOE,ZWCOE,ZBUCOE -REAL, DIMENSION(D%NIT) :: ZDETR_BUO, ZDETR_RT -REAL, DIMENSION(D%NIT) :: ZW_MAX ! w**2 max of the updraft -REAL, DIMENSION(D%NIT) :: ZZTOP ! Top of the updraft +REAL, DIMENSION(D%NIJT) :: ZTEST,ZDZ,ZWUP_MEAN ! +REAL, DIMENSION(D%NIJT) :: ZCOE,ZWCOE,ZBUCOE +REAL, DIMENSION(D%NIJT) :: ZDETR_BUO, ZDETR_RT +REAL, DIMENSION(D%NIJT) :: ZW_MAX ! w**2 max of the updraft +REAL, DIMENSION(D%NIJT) :: ZZTOP ! Top of the updraft !REAL, DIMENSION(SIZE(PTHM,1)) :: ZQTM,ZQT_UP REAL :: ZDEPTH_MAX1, ZDEPTH_MAX2 ! control auto-extinction process REAL :: ZTMAX,ZRMAX, ZEPS ! control value -REAL, DIMENSION(D%NIT,D%NKT) :: ZSHEAR,ZDUDZ,ZDVDZ ! vertical wind shear +REAL, DIMENSION(D%NIJT,D%NKT) :: ZSHEAR,ZDUDZ,ZDVDZ ! vertical wind shear ! -REAL, DIMENSION(D%NIT,D%NKT) :: ZWK -REAL, DIMENSION(D%NIT,16) :: ZBUF +REAL, DIMENSION(D%NIJT,D%NKT) :: ZWK +REAL, DIMENSION(D%NIJT,16) :: ZBUF ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('COMPUTE_UPDRAFT_RHCJ10',0,ZHOOK_HANDLE) @@ -242,9 +242,9 @@ ZBUO =0. !no ice cloud coded yet PRI_UP(:,:)=0. PFRAC_ICE_UP(:,:)=0. -!$mnh_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) -PRSAT_UP(D%NIB:D%NIE,:)=PRVM(D%NIB:D%NIE,:) ! should be initialised correctly but is (normaly) not used -!$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) +!$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) +PRSAT_UP(D%NIJB:D%NIJE,:)=PRVM(D%NIJB:D%NIJE,:) ! should be initialised correctly but is (normaly) not used +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) ! Initialisation of environment variables at t-dt @@ -259,29 +259,29 @@ CALL MZM_MF(D, PTKEM(:,:), ZTKEM_F(:,:)) !DO JSV=1,ISV ! IF (ONOMIXLG .AND. JSV >= KSV_LGBEG .AND. JSV<= KSV_LGEND) CYCLE ! *** SR merge AROME/Meso-nh: following two lines come from the AROME version -! ZSVM_F(D%NIB:D%NIE,KKB:IKU,JSV) = 0.5*(PSVM(D%NIB:D%NIE,KKB:IKU,JSV)+PSVM(D%NIB:D%NIE,1:IKU-1,JSV)) -! ZSVM_F(D%NIB:D%NIE,1,JSV) = ZSVM_F(D%NIB:D%NIE,KKB,JSV) +! ZSVM_F(D%NIJB:D%NIJE,KKB:IKU,JSV) = 0.5*(PSVM(D%NIJB:D%NIJE,KKB:IKU,JSV)+PSVM(D%NIJB:D%NIJE,1:IKU-1,JSV)) +! ZSVM_F(D%NIJB:D%NIJE,1,JSV) = ZSVM_F(D%NIJB:D%NIJE,KKB,JSV) ! *** the following single line comes from the Meso-NH version -! ZSVM_F(D%NIB:D%NIE,:,JSV) = MZM_MF(KKA,KKU,KKL,PSVM(D%NIB:D%NIE,:,JSV)) +! ZSVM_F(D%NIJB:D%NIJE,:,JSV) = MZM_MF(KKA,KKU,KKL,PSVM(D%NIJB:D%NIJE,:,JSV)) !END DO ! Initialisation of updraft characteristics -!$mnh_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) -PTHL_UP(D%NIB:D%NIE,:)=ZTHLM_F(D%NIB:D%NIE,:) -PRT_UP(D%NIB:D%NIE,:)=ZRTM_F(D%NIB:D%NIE,:) -PU_UP(D%NIB:D%NIE,:)=ZUM_F(D%NIB:D%NIE,:) -PV_UP(D%NIB:D%NIE,:)=ZVM_F(D%NIB:D%NIE,:) -!$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) -PSV_UP(D%NIB:D%NIE,:,:)=0. +!$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) +PTHL_UP(D%NIJB:D%NIJE,:)=ZTHLM_F(D%NIJB:D%NIJE,:) +PRT_UP(D%NIJB:D%NIJE,:)=ZRTM_F(D%NIJB:D%NIJE,:) +PU_UP(D%NIJB:D%NIJE,:)=ZUM_F(D%NIJB:D%NIJE,:) +PV_UP(D%NIJB:D%NIJE,:)=ZVM_F(D%NIJB:D%NIJE,:) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) +PSV_UP(D%NIJB:D%NIJE,:,:)=0. ! This updraft is not yet ready to use scalar variables !IF (ONOMIXLG .AND. JSV >= KSV_LGBEG .AND. JSV<= KSV_LGEND) then -! PSV_UP(D%NIB:D%NIE,:,:)=ZSVM_F(D%NIB:D%NIE,:,:) +! PSV_UP(D%NIJB:D%NIJE,:,:)=ZSVM_F(D%NIJB:D%NIJE,:,:) !ENDIF ! Computation or initialisation of updraft characteristics at the KKB level ! thetal_up,rt_up,thetaV_up, w,Buoyancy term and mass flux (PEMF) -DO JI=D%NIB,D%NIE +DO JI=D%NIJB,D%NIJE !PTHL_UP(JI,KKB)= ZTHLM_F(JI,KKB)+MAX(0.,MIN(ZTMAX,(PSFTH(JI)/SQRT(ZTKEM_F(JI,KKB)))*XALP_PERT)) !PRT_UP(JI,KKB) = ZRTM_F(JI,KKB)+MAX(0.,MIN(ZRMAX,(PSFRV(JI)/SQRT(ZTKEM_F(JI,KKB)))*XALP_PERT)) PTHL_UP(JI,D%NKB)= ZTHLM_F(JI,D%NKB) @@ -297,35 +297,35 @@ CALL MZM_MF(D, PRVM(:,:), ZRVM_F(:,:)) ! thetav at mass and flux levels DO JK=1,D%NKT - DO JI=d%NIB,D%NIE + DO JI=d%NIB,D%NIJE ZTHVM_F(JI,JK)=ZTHM_F(JI,JK)*((1.+ZRVORD*ZRVM_F(JI,JK))/(1.+ZRTM_F(JI,JK))) ENDDO ENDDO -!$mnh_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) -PTHV_UP(D%NIB:D%NIE,:)= ZTHVM_F(D%NIB:D%NIE,:) -PRV_UP(D%NIB:D%NIE,:)= ZRVM_F(D%NIB:D%NIE,:) -!$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) +!$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) +PTHV_UP(D%NIJB:D%NIJE,:)= ZTHVM_F(D%NIJB:D%NIJE,:) +PRV_UP(D%NIJB:D%NIJE,:)= ZRVM_F(D%NIJB:D%NIJE,:) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) ZW_UP2(:,:)=ZEPS -!$mnh_expand_array(JI=D%NIB:D%NIE) -!ZW_UP2(D%NIB:D%NIE,KKB) = MAX(0.0001,(3./6.)*ZTKEM_F(D%NIB:D%NIE,KKB)) -ZW_UP2(D%NIB:D%NIE,D%NKB) = MAX(0.0001,(2./3.)*ZTKEM_F(D%NIB:D%NIE,D%NKB)) -!$mnh_end_expand_array(JI=D%NIB:D%NIE) +!$mnh_expand_array(JI=D%NIJB:D%NIJE) +!ZW_UP2(D%NIJB:D%NIJE,KKB) = MAX(0.0001,(3./6.)*ZTKEM_F(D%NIJB:D%NIJE,KKB)) +ZW_UP2(D%NIJB:D%NIJE,D%NKB) = MAX(0.0001,(2./3.)*ZTKEM_F(D%NIJB:D%NIJE,D%NKB)) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE) ! Computation of non conservative variable for the KKB level of the updraft ! (all or nothing ajustement) -!$mnh_expand_array(JI=D%NIB:D%NIE) -PRC_UP(D%NIB:D%NIE,D%NKB)=0. -PRI_UP(D%NIB:D%NIE,D%NKB)=0. -!$mnh_end_expand_array(JI=D%NIB:D%NIE) -CALL TH_R_FROM_THL_RT(CST,NEB,D%NIT,HFRAC_ICE,PFRAC_ICE_UP(:,D%NKB),ZPRES_F(:,D%NKB), & +!$mnh_expand_array(JI=D%NIJB:D%NIJE) +PRC_UP(D%NIJB:D%NIJE,D%NKB)=0. +PRI_UP(D%NIJB:D%NIJE,D%NKB)=0. +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE) +CALL TH_R_FROM_THL_RT(CST,NEB,D%NIJT,HFRAC_ICE,PFRAC_ICE_UP(:,D%NKB),ZPRES_F(:,D%NKB), & PTHL_UP(:,D%NKB),PRT_UP(:,D%NKB),ZTH_UP(:,D%NKB), & PRV_UP(:,D%NKB),PRC_UP(:,D%NKB),PRI_UP(:,D%NKB),ZRSATW(:),ZRSATI(:),OOCEAN=.FALSE.,& - PBUF=ZBUF, KB=D%NIB, KE=D%NIE) + PBUF=ZBUF, KB=D%NIJB, KE=D%NIJE) -DO JI=D%NIB,D%NIE +DO JI=D%NIJB,D%NIJE ! compute updraft thevav and buoyancy term at KKB level PTHV_UP(JI,D%NKB) = ZTH_UP(JI,D%NKB)*((1+ZRVORD*PRV_UP(JI,D%NKB))/(1+PRT_UP(JI,D%NKB))) ! compute mean rsat in updraft @@ -335,43 +335,43 @@ ENDDO !Tout est commente pour tester dans un premier temps la separation en deux de la ! boucle verticale, une pour w et une pour PEMF -!$mnh_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) -ZG_O_THVREF(D%NIB:D%NIE,:)=CST%XG/ZTHVM_F(D%NIB:D%NIE,:) -!$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) +!$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) +ZG_O_THVREF(D%NIJB:D%NIJE,:)=CST%XG/ZTHVM_F(D%NIJB:D%NIJE,:) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) ! Calcul de la fermeture de Julien Pergaut comme limite max de PHY DO JK=D%NKB,D%NKE-D%NKL,D%NKL ! Vertical loop - DO JI=D%NIB,D%NIE + DO JI=D%NIJB,D%NIJE ZZDZ(JI,JK) = MAX(ZEPS,PZZ(JI,JK+D%NKL)-PZZ(JI,JK)) ! <== Delta Z between two flux level ENDDO ENDDO ! compute L_up GLMIX=.TRUE. -!$mnh_expand_array(JI=D%NIB:D%NIE) -ZTKEM_F(D%NIB:D%NIE,D%NKB)=0. -!$mnh_end_expand_array(JI=D%NIB:D%NIE) +!$mnh_expand_array(JI=D%NIJB:D%NIJE) +ZTKEM_F(D%NIJB:D%NIJE,D%NKB)=0. +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE) ! IF(TURB%CTURBLEN=='RM17') THEN CALL GZ_M_W_MF(D, PUM, PDZZ, ZWK) CALL MZF_MF(D, ZWK, ZDUDZ) CALL GZ_M_W_MF(D, PVM, PDZZ, ZWK) CALL MZF_MF(D, ZWK, ZDVDZ) - !$mnh_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) - ZSHEAR(D%NIB:D%NIE,:) = SQRT(ZDUDZ(D%NIB:D%NIE,:)**2 + ZDVDZ(D%NIB:D%NIE,:)**2) - !$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) + !$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) + ZSHEAR(D%NIJB:D%NIJE,:) = SQRT(ZDUDZ(D%NIJB:D%NIJE,:)**2 + ZDVDZ(D%NIJB:D%NIJE,:)**2) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) ELSE - ZSHEAR(D%NIB:D%NIE,:) = 0. !no shear in bl89 mixing length + ZSHEAR(D%NIJB:D%NIJE,:) = 0. !no shear in bl89 mixing length END IF ! CALL COMPUTE_BL89_ML(D, CST, CSTURB, PDZZ,ZTKEM_F(:,D%NKB),ZG_O_THVREF(:,D%NKB), & ZTHVM_F,D%NKB,GLMIX,.TRUE.,ZSHEAR,ZLUP) -!$mnh_expand_array(JI=D%NIB:D%NIE) -ZLUP(D%NIB:D%NIE)=MAX(ZLUP(D%NIB:D%NIE),1.E-10) -!$mnh_end_expand_array(JI=D%NIB:D%NIE) +!$mnh_expand_array(JI=D%NIJB:D%NIJE) +ZLUP(D%NIJB:D%NIJE)=MAX(ZLUP(D%NIJB:D%NIJE),1.E-10) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE) -DO JI=D%NIB,D%NIE +DO JI=D%NIJB,D%NIJE ! Compute Buoyancy flux at the ground ZWTHVSURF = (ZTHVM_F(JI,D%NKB)/ZTHM_F(JI,D%NKB))*PSFTH(JI)+ & (0.61*ZTHM_F(JI,D%NKB))*PSFRV(JI) @@ -419,7 +419,7 @@ DO JK=D%NKB,D%NKE-D%NKL,D%NKL ! to find the LCL (check if JK is LCL or not) - DO JI=D%NIB,D%NIE + DO JI=D%NIJB,D%NIJE IF ((PRC_UP(JI,JK)+PRI_UP(JI,JK)>0.).AND.(.NOT.(GTESTLCL(JI)))) THEN KKLCL(JI) = JK GTESTLCL(JI)=.TRUE. @@ -434,17 +434,17 @@ DO JK=D%NKB,D%NKE-D%NKL,D%NKL ! Compute theta_v of updraft at flux level JK - !$mnh_expand_array(JI=D%NIB:D%NIE) - ZRC_UP(D%NIB:D%NIE) =PRC_UP(D%NIB:D%NIE,JK) ! guess - ZRI_UP(D%NIB:D%NIE) =PRI_UP(D%NIB:D%NIE,JK) ! guess - ZRV_UP(D%NIB:D%NIE) =PRV_UP(D%NIB:D%NIE,JK) - !$mnh_end_expand_array(JI=D%NIB:D%NIE) - CALL TH_R_FROM_THL_RT(CST,NEB, D%NIT, HFRAC_ICE,PFRAC_ICE_UP(:,JK),& + !$mnh_expand_array(JI=D%NIJB:D%NIJE) + ZRC_UP(D%NIJB:D%NIJE) =PRC_UP(D%NIJB:D%NIJE,JK) ! guess + ZRI_UP(D%NIJB:D%NIJE) =PRI_UP(D%NIJB:D%NIJE,JK) ! guess + ZRV_UP(D%NIJB:D%NIJE) =PRV_UP(D%NIJB:D%NIJE,JK) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE) + CALL TH_R_FROM_THL_RT(CST,NEB, D%NIJT, HFRAC_ICE,PFRAC_ICE_UP(:,JK),& PPABSM(:,JK),PTHL_UP(:,JK),PRT_UP(:,JK),& ZTH_UP(:,JK),ZRV_UP,ZRC_UP,ZRI_UP,ZRSATW(:),ZRSATI(:),OOCEAN=.FALSE.,& - PBUF=ZBUF, KB=D%NIB, KE=D%NIE) + PBUF=ZBUF, KB=D%NIJB, KE=D%NIJE) - DO JI=D%NIB,D%NIE + DO JI=D%NIJB,D%NIJE IF (GTEST(JI)) THEN PTHV_UP(JI,JK) = ZTH_UP(JI,JK)*(1.+ZRVORD*ZRV_UP(JI))/(1.+PRT_UP(JI,JK)) ZBUO(JI,JK) = ZG_O_THVREF(JI,JK)*(PTHV_UP(JI,JK) - ZTHVM_F(JI,JK)) @@ -496,7 +496,7 @@ DO JK=D%NKB,D%NKE-D%NKL,D%NKL IF(OMIXUV) THEN IF(JK/=D%NKB) THEN - DO JI=D%NIB,D%NIE + DO JI=D%NIJB,D%NIJE IF(GTEST(JI)) THEN PU_UP(JI,JK+D%NKL) = (PU_UP (JI,JK)*(1-0.5*ZMIX2(JI)) + PUM(JI,JK)*ZMIX2(JI)+ & 0.5*PARAMMF%XPRES_UV*(PZZ(JI,JK+D%NKL)-PZZ(JI,JK))*& @@ -511,7 +511,7 @@ DO JK=D%NKB,D%NKE-D%NKL,D%NKL ENDIF ENDDO ELSE - DO JI=D%NIB,D%NIE + DO JI=D%NIJB,D%NIJE IF(GTEST(JI)) THEN PU_UP(JI,JK+D%NKL) = (PU_UP (JI,JK)*(1-0.5*ZMIX2(JI)) + PUM(JI,JK)*ZMIX2(JI)+ & 0.5*PARAMMF%XPRES_UV*(PZZ(JI,JK+D%NKL)-PZZ(JI,JK))*& @@ -530,24 +530,24 @@ DO JK=D%NKB,D%NKE-D%NKL,D%NKL ! DO JSV=1,ISV ! IF (ONOMIXLG .AND. JSV >= KSV_LGBEG .AND. JSV<= KSV_LGEND) CYCLE ! WHERE(GTEST) -! PSV_UP(D%NIB:D%NIE,JK+KKL,JSV) = (PSV_UP (D%NIB:D%NIE,JK,JSV)*(1-0.5*ZMIX2(D%NIB:D%NIE)) + & -! PSVM(D%NIB:D%NIE,JK,JSV)*ZMIX2(D%NIB:D%NIE)) /(1+0.5*ZMIX2(D%NIB:D%NIE)) +! PSV_UP(D%NIJB:D%NIJE,JK+KKL,JSV) = (PSV_UP (D%NIJB:D%NIJE,JK,JSV)*(1-0.5*ZMIX2(D%NIJB:D%NIJE)) + & +! PSVM(D%NIJB:D%NIJE,JK,JSV)*ZMIX2(D%NIJB:D%NIJE)) /(1+0.5*ZMIX2(D%NIJB:D%NIJE)) ! ENDWHERE ! ENDDO ! Compute non cons. var. at level JK+KKL - !$mnh_expand_array(JI=D%NIB:D%NIE) - ZRC_UP(D%NIB:D%NIE)=PRC_UP(D%NIB:D%NIE,JK) ! guess = level just below - ZRI_UP(D%NIB:D%NIE)=PRI_UP(D%NIB:D%NIE,JK) ! guess = level just below - ZRV_UP(D%NIB:D%NIE)=PRV_UP(D%NIB:D%NIE,JK) - !$mnh_end_expand_array(JI=D%NIB:D%NIE) - CALL TH_R_FROM_THL_RT(CST,NEB, D%NIT, HFRAC_ICE,PFRAC_ICE_UP(:,JK+D%NKL),ZPRES_F(:,JK+D%NKL), & + !$mnh_expand_array(JI=D%NIJB:D%NIJE) + ZRC_UP(D%NIJB:D%NIJE)=PRC_UP(D%NIJB:D%NIJE,JK) ! guess = level just below + ZRI_UP(D%NIJB:D%NIJE)=PRI_UP(D%NIJB:D%NIJE,JK) ! guess = level just below + ZRV_UP(D%NIJB:D%NIJE)=PRV_UP(D%NIJB:D%NIJE,JK) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE) + CALL TH_R_FROM_THL_RT(CST,NEB, D%NIJT, HFRAC_ICE,PFRAC_ICE_UP(:,JK+D%NKL),ZPRES_F(:,JK+D%NKL), & PTHL_UP(:,JK+D%NKL),PRT_UP(:,JK+D%NKL),ZTH_UP(:,JK+D%NKL), & ZRV_UP(:),ZRC_UP(:),ZRI_UP(:),ZRSATW(:),ZRSATI(:),OOCEAN=.FALSE.,& - PBUF=ZBUF, KB=D%NIB, KE=D%NIE) + PBUF=ZBUF, KB=D%NIJB, KE=D%NIJE) - DO JI=D%NIB,D%NIE + DO JI=D%NIJB,D%NIJE IF(GTEST(JI)) THEN !ZT_UP(JI) = ZTH_UP(JI,JK+KKL)*PEXNM(JI,JK+KKL) !ZCP(JI) = XCPD + XCL * ZRC_UP(JI) @@ -561,7 +561,7 @@ DO JK=D%NKB,D%NKE-D%NKL,D%NKL PRSAT_UP(JI,JK+D%NKL) = ZRSATW(JI)*(1-PFRAC_ICE_UP(JI,JK+D%NKL)) + ZRSATI(JI)*PFRAC_ICE_UP(JI,JK+D%NKL) ! Compute the updraft theta_v, buoyancy and w**2 for level JK+1 - !PTHV_UP(D%NIB:D%NIE,JK+KKL) = PTH_UP(D%NIB:D%NIE,JK+KKL)*((1+ZRVORD*PRV_UP(D%NIB:D%NIE,JK+KKL))/(1+PRT_UP(D%NIB:D%NIE,JK+KKL))) + !PTHV_UP(D%NIJB:D%NIJE,JK+KKL) = PTH_UP(D%NIJB:D%NIJE,JK+KKL)*((1+ZRVORD*PRV_UP(D%NIJB:D%NIJE,JK+KKL))/(1+PRT_UP(D%NIJB:D%NIJE,JK+KKL))) !PTHV_UP(JI,JK+KKL) = ZTH_UP(JI,JK+KKL)*(1.+0.608*PRV_UP(JI,JK+KKL) - PRC_UP(JI,JK+KKL)) !! A corriger pour utiliser q et non r !!!! !ZMIX1(JI)=ZZDZ(JI,JK)*(PENTR(JI,JK)-PDETR(JI,JK)) @@ -570,13 +570,13 @@ DO JK=D%NKB,D%NKE-D%NKL,D%NKL ENDIF ENDDO - DO JI=D%NIB,D%NIB + DO JI=D%NIJB,D%NIJB IF(GTEST(JI)) THEN PEMF(JI,JK+D%NKL)=PEMF(JI,JK)*EXP(ZMIX1(JI)) ENDIF ENDDO - DO JI=D%NIB,D%NIE + DO JI=D%NIJB,D%NIJE IF(GTEST(JI)) THEN ! Updraft fraction must be smaller than XFRAC_UP_MAX PFRAC_UP(JI,JK+D%NKL)=MIN(PARAMMF%XFRAC_UP_MAX, & @@ -586,7 +586,7 @@ DO JK=D%NKB,D%NKE-D%NKL,D%NKL ENDDO ! Test if the updraft has reach the ETL - DO JI=D%NIB,D%NIE + DO JI=D%NIJB,D%NIJE IF (GTEST(JI) .AND. (PBUO_INTEG(JI,JK)<=0.)) THEN KKETL(JI) = JK+D%NKL ENDIF @@ -594,7 +594,7 @@ DO JK=D%NKB,D%NKE-D%NKL,D%NKL ! Test is we have reached the top of the updraft - DO JI=D%NIB,D%NIB + DO JI=D%NIJB,D%NIJB IF (GTEST(JI) .AND. ((ZW_UP2(JI,JK+D%NKL)<=ZEPS).OR.(PEMF(JI,JK+D%NKL)<=ZEPS))) THEN ZW_UP2 (JI,JK+D%NKL)=ZEPS PEMF (JI,JK+D%NKL)=0. @@ -612,12 +612,12 @@ DO JK=D%NKB,D%NKE-D%NKL,D%NKL ENDDO ! Fin de la boucle verticale -!$mnh_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) -PW_UP(D%NIB:D%NIE,:)=SQRT(ZW_UP2(D%NIB:D%NIE,:)) -!$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) -!$mnh_expand_array(JI=D%NIB:D%NIE) -PEMF(D%NIB:D%NIE,D%NKB) =0. -!$mnh_end_expand_array(JI=D%NIB:D%NIE) +!$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) +PW_UP(D%NIJB:D%NIJE,:)=SQRT(ZW_UP2(D%NIJB:D%NIJE,:)) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) +!$mnh_expand_array(JI=D%NIJB:D%NIJE) +PEMF(D%NIJB:D%NIJE,D%NKB) =0. +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE) ! Limits the shallow convection scheme when cloud heigth is higher than 3000m. ! To do this, mass flux is multiplied by a coefficient decreasing linearly @@ -625,22 +625,22 @@ PEMF(D%NIB:D%NIE,D%NKB) =0. ! This way, all MF fluxes are diminished by this amount. ! Diagnosed cloud fraction is also multiplied by the same coefficient. ! -DO JI=D%NIB,D%NIE +DO JI=D%NIJB,D%NIJE PDEPTH(JI) = MAX(0., PZZ(JI,KKCTL(JI)) - PZZ(JI,KKLCL(JI)) ) ENDDO -!$mnh_expand_array(JI=D%NIB:D%NIE) -GWORK1(D%NIB:D%NIE)= (GTESTLCL(D%NIB:D%NIE) .AND. (PDEPTH(D%NIB:D%NIE) > ZDEPTH_MAX1) ) -!$mnh_end_expand_array(JI=D%NIB:D%NIE) +!$mnh_expand_array(JI=D%NIJB:D%NIJE) +GWORK1(D%NIJB:D%NIJE)= (GTESTLCL(D%NIJB:D%NIJE) .AND. (PDEPTH(D%NIJB:D%NIJE) > ZDEPTH_MAX1) ) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE) DO JK=1,D%NKT - !$mnh_expand_array(JI=D%NIB:D%NIE) - GWORK2(D%NIB:D%NIE,JK) = GWORK1(D%NIB:D%NIE) - ZCOEF(D%NIB:D%NIE,JK) = (1.-(PDEPTH(D%NIB:D%NIE)-ZDEPTH_MAX1)/(ZDEPTH_MAX2-ZDEPTH_MAX1)) - ZCOEF(D%NIB:D%NIE,JK)=MIN(MAX(ZCOEF(D%NIB:D%NIE,JK),0.),1.) - !$mnh_end_expand_array(JI=D%NIB:D%NIE) + !$mnh_expand_array(JI=D%NIJB:D%NIJE) + GWORK2(D%NIJB:D%NIJE,JK) = GWORK1(D%NIJB:D%NIJE) + ZCOEF(D%NIJB:D%NIJE,JK) = (1.-(PDEPTH(D%NIJB:D%NIJE)-ZDEPTH_MAX1)/(ZDEPTH_MAX2-ZDEPTH_MAX1)) + ZCOEF(D%NIJB:D%NIJE,JK)=MIN(MAX(ZCOEF(D%NIJB:D%NIJE,JK),0.),1.) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE) ENDDO DO JK=1, D%NKT - DO JI=D%NIB,D%NIE + DO JI=D%NIJB,D%NIJE IF (GWORK2(JI,JK)) THEN PEMF(JI,JK) = PEMF(JI,JK) * ZCOEF(JI,JK) PFRAC_UP(JI,JK) = PFRAC_UP(JI,JK) * ZCOEF(JI,JK) diff --git a/src/common/turb/mode_mf_turb.F90 b/src/common/turb/mode_mf_turb.F90 index 537e16c14db54119da557d425da69494ccd0b387..3c13c549c7911116b8adfcd53727b3930d60f4a3 100644 --- a/src/common/turb/mode_mf_turb.F90 +++ b/src/common/turb/mode_mf_turb.F90 @@ -85,39 +85,39 @@ INTEGER, INTENT(IN) :: KSV_LGEND ! last index of lag. tracer REAL, INTENT(IN) :: PIMPL ! degree of implicitness REAL, INTENT(IN) :: PTSTEP ! Dynamical timestep ! -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PDZZ ! metric coefficients +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDZZ ! metric coefficients -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PRHODJ ! dry density * Grid size +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODJ ! dry density * Grid size ! Conservative var. at t-dt -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PTHLM ! conservative pot. temp. -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PRTM ! water var. where +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHLM ! conservative pot. temp. +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRTM ! water var. where ! Virtual potential temperature at t-dt -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PTHVM +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHVM ! Momentum at t-dt -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PUM -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PVM +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PUM +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PVM ! scalar variables at t-dt -REAL, DIMENSION(D%NIT,D%NKT,KSV), INTENT(IN) :: PSVM +REAL, DIMENSION(D%NIJT,D%NKT,KSV), INTENT(IN) :: PSVM ! ! Tendencies of conservative variables -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PTHLDT +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PTHLDT -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PRTDT +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PRTDT ! Tendencies of momentum -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PUDT -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PVDT +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PUDT +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PVDT ! Tendencies of scalar variables -REAL, DIMENSION(D%NIT,D%NKT,KSV), INTENT(OUT) :: PSVDT +REAL, DIMENSION(D%NIJT,D%NKT,KSV), INTENT(OUT) :: PSVDT ! Updraft characteritics -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PEMF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP -REAL, DIMENSION(D%NIT,D%NKT,KSV), INTENT(IN) :: PSV_UP +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PEMF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP +REAL, DIMENSION(D%NIJT,D%NKT,KSV), INTENT(IN) :: PSV_UP ! Fluxes -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF -REAL, DIMENSION(D%NIT,D%NKT,KSV), INTENT(OUT):: PFLXZSVMF +REAL, DIMENSION(D%NIJT,D%NKT,KSV), INTENT(OUT):: PFLXZSVMF ! ! ! @@ -126,7 +126,7 @@ REAL, DIMENSION(D%NIT,D%NKT,KSV), INTENT(OUT):: PFLXZSVMF ! 0.2 declaration of local variables ! -REAL, DIMENSION(D%NIT,D%NKT) :: ZVARS +REAL, DIMENSION(D%NIJT,D%NKT) :: ZVARS INTEGER :: JSV !number of scalar variables and Loop counter INTEGER :: JI, JK REAL(KIND=JPRB) :: ZHOOK_HANDLE @@ -155,19 +155,19 @@ CALL MZM_MF(D, PTHLM(:,:), PFLXZTHMF(:,:)) CALL MZM_MF(D, PRTM(:,:), PFLXZRMF(:,:)) CALL MZM_MF(D, PTHVM(:,:), PFLXZTHVMF(:,:)) -!$mnh_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) -PFLXZTHMF(D%NIB:D%NIE,:) = PEMF(D%NIB:D%NIE,:)*(PTHL_UP(D%NIB:D%NIE,:)-PFLXZTHMF(D%NIB:D%NIE,:)) -PFLXZRMF(D%NIB:D%NIE,:) = PEMF(D%NIB:D%NIE,:)*(PRT_UP(D%NIB:D%NIE,:)-PFLXZRMF(D%NIB:D%NIE,:)) -PFLXZTHVMF(D%NIB:D%NIE,:) = PEMF(D%NIB:D%NIE,:)*(PTHV_UP(D%NIB:D%NIE,:)-PFLXZTHVMF(D%NIB:D%NIE,:)) -!$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) +!$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) +PFLXZTHMF(D%NIJB:D%NIJE,:) = PEMF(D%NIJB:D%NIJE,:)*(PTHL_UP(D%NIJB:D%NIJE,:)-PFLXZTHMF(D%NIJB:D%NIJE,:)) +PFLXZRMF(D%NIJB:D%NIJE,:) = PEMF(D%NIJB:D%NIJE,:)*(PRT_UP(D%NIJB:D%NIJE,:)-PFLXZRMF(D%NIJB:D%NIJE,:)) +PFLXZTHVMF(D%NIJB:D%NIJE,:) = PEMF(D%NIJB:D%NIJE,:)*(PTHV_UP(D%NIJB:D%NIJE,:)-PFLXZTHVMF(D%NIJB:D%NIJE,:)) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) IF (OMIXUV) THEN CALL MZM_MF(D, PUM(:,:), PFLXZUMF(:,:)) CALL MZM_MF(D, PVM(:,:), PFLXZVMF(:,:)) - !$mnh_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) - PFLXZUMF(D%NIB:D%NIE,:) = PEMF(D%NIB:D%NIE,:)*(PU_UP(D%NIB:D%NIE,:)-PFLXZUMF(D%NIB:D%NIE,:)) - PFLXZVMF(D%NIB:D%NIE,:) = PEMF(D%NIB:D%NIE,:)*(PV_UP(D%NIB:D%NIE,:)-PFLXZVMF(D%NIB:D%NIE,:)) - !$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) + !$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) + PFLXZUMF(D%NIJB:D%NIJE,:) = PEMF(D%NIJB:D%NIJE,:)*(PU_UP(D%NIJB:D%NIJE,:)-PFLXZUMF(D%NIJB:D%NIJE,:)) + PFLXZVMF(D%NIJB:D%NIJE,:) = PEMF(D%NIJB:D%NIJE,:)*(PV_UP(D%NIJB:D%NIJE,:)-PFLXZVMF(D%NIJB:D%NIJE,:)) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) ELSE PFLXZUMF(:,:) = 0. PFLXZVMF(:,:) = 0. @@ -190,10 +190,10 @@ CALL TRIDIAG_MASSFLUX(D,PTHLM,PFLXZTHMF,-PEMF,PTSTEP,PIMPL, & PDZZ,PRHODJ,ZVARS ) ! compute new flux and THL tendency CALL MZM_MF(D, ZVARS(:,:), PFLXZTHMF(:,:)) -!$mnh_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) -PFLXZTHMF(D%NIB:D%NIE,:) = PEMF(D%NIB:D%NIE,:)*(PTHL_UP(D%NIB:D%NIE,:)-PFLXZTHMF(D%NIB:D%NIE,:)) -PTHLDT(D%NIB:D%NIE,:)= (ZVARS(D%NIB:D%NIE,:)-PTHLM(D%NIB:D%NIE,:))/PTSTEP -!$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) +!$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) +PFLXZTHMF(D%NIJB:D%NIJE,:) = PEMF(D%NIJB:D%NIJE,:)*(PTHL_UP(D%NIJB:D%NIJE,:)-PFLXZTHMF(D%NIJB:D%NIJE,:)) +PTHLDT(D%NIJB:D%NIJE,:)= (ZVARS(D%NIJB:D%NIJE,:)-PTHLM(D%NIJB:D%NIJE,:))/PTSTEP +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) ! ! 3.2 Compute the tendency for the conservative mixing ratio @@ -202,10 +202,10 @@ CALL TRIDIAG_MASSFLUX(D,PRTM(:,:),PFLXZRMF,-PEMF,PTSTEP,PIMPL, & PDZZ,PRHODJ,ZVARS ) ! compute new flux and RT tendency CALL MZM_MF(D, ZVARS(:,:), PFLXZRMF(:,:)) -!$mnh_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) -PFLXZRMF(D%NIB:D%NIE,:) = PEMF(D%NIB:D%NIE,:)*(PRT_UP(D%NIB:D%NIE,:)-PFLXZRMF(D%NIB:D%NIE,:)) -PRTDT(D%NIB:D%NIE,:) = (ZVARS(D%NIB:D%NIE,:)-PRTM(D%NIB:D%NIE,:))/PTSTEP -!$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) +!$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) +PFLXZRMF(D%NIJB:D%NIJE,:) = PEMF(D%NIJB:D%NIJE,:)*(PRT_UP(D%NIJB:D%NIJE,:)-PFLXZRMF(D%NIJB:D%NIJE,:)) +PRTDT(D%NIJB:D%NIJE,:) = (ZVARS(D%NIJB:D%NIJE,:)-PRTM(D%NIJB:D%NIJE,:))/PTSTEP +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) ! IF (OMIXUV) THEN @@ -218,10 +218,10 @@ IF (OMIXUV) THEN PDZZ,PRHODJ,ZVARS ) ! compute new flux and U tendency CALL MZM_MF(D, ZVARS(:,:), PFLXZUMF(:,:)) - !$mnh_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) - PFLXZUMF(D%NIB:D%NIE,:) = PEMF(D%NIB:D%NIE,:)*(PU_UP(D%NIB:D%NIE,:)-PFLXZUMF(D%NIB:D%NIE,:)) - PUDT(D%NIB:D%NIE,:)= (ZVARS(D%NIB:D%NIE,:)-PUM(D%NIB:D%NIE,:))/PTSTEP - !$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) + !$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) + PFLXZUMF(D%NIJB:D%NIJE,:) = PEMF(D%NIJB:D%NIJE,:)*(PU_UP(D%NIJB:D%NIJE,:)-PFLXZUMF(D%NIJB:D%NIJE,:)) + PUDT(D%NIJB:D%NIJE,:)= (ZVARS(D%NIJB:D%NIJE,:)-PUM(D%NIJB:D%NIJE,:))/PTSTEP + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) ! ! ! 3.4 Compute the tendency for the (non conservative but treated as it for the time beiing) @@ -232,10 +232,10 @@ IF (OMIXUV) THEN PDZZ,PRHODJ,ZVARS ) ! compute new flux and V tendency CALL MZM_MF(D, ZVARS(:,:), PFLXZVMF(:,:)) - !$mnh_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) - PFLXZVMF(D%NIB:D%NIE,:) = PEMF(D%NIB:D%NIE,:)*(PV_UP(D%NIB:D%NIE,:)-PFLXZVMF(D%NIB:D%NIE,:)) - PVDT(D%NIB:D%NIE,:)= (ZVARS(D%NIB:D%NIE,:)-PVM(D%NIB:D%NIE,:))/PTSTEP - !$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) + !$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) + PFLXZVMF(D%NIJB:D%NIJE,:) = PEMF(D%NIJB:D%NIJE,:)*(PV_UP(D%NIJB:D%NIJE,:)-PFLXZVMF(D%NIJB:D%NIJE,:)) + PVDT(D%NIJB:D%NIJE,:)= (ZVARS(D%NIJB:D%NIJE,:)-PVM(D%NIJB:D%NIJE,:))/PTSTEP + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) ELSE PUDT(:,:)=0. PVDT(:,:)=0. @@ -249,9 +249,9 @@ DO JSV=1,KSV ! ( Resulting fluxes are in flux level (w-point) as PEMF and PTHL_UP ) CALL MZM_MF(D, PSVM(:,:,JSV), PFLXZSVMF(:,:,JSV)) - !$mnh_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) - PFLXZSVMF(D%NIB:D%NIE,:,JSV) = PEMF(D%NIB:D%NIE,:)*(PSV_UP(D%NIB:D%NIE,:,JSV)-PFLXZSVMF(D%NIB:D%NIE,:,JSV)) - !$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) + !$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) + PFLXZSVMF(D%NIJB:D%NIJE,:,JSV) = PEMF(D%NIJB:D%NIJE,:)*(PSV_UP(D%NIJB:D%NIJE,:,JSV)-PFLXZSVMF(D%NIJB:D%NIJE,:,JSV)) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) ! ! 3.5 Compute the tendency for scalar variables ! (PDZZ and flux in w-point and PRHODJ is mass point, result in mass point) @@ -260,10 +260,10 @@ DO JSV=1,KSV -PEMF,PTSTEP,PIMPL,PDZZ,PRHODJ,ZVARS ) ! compute new flux and Sv tendency CALL MZM_MF(D, ZVARS, PFLXZSVMF(:,:,JSV)) - !$mnh_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) - PFLXZSVMF(D%NIB:D%NIE,:,JSV) = PEMF(D%NIB:D%NIE,:)*(PSV_UP(D%NIB:D%NIE,:,JSV)-PFLXZSVMF(D%NIB:D%NIE,:,JSV)) - PSVDT(D%NIB:D%NIE,:,JSV)= (ZVARS(D%NIB:D%NIE,:)-PSVM(D%NIB:D%NIE,:,JSV))/PTSTEP - !$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) + !$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) + PFLXZSVMF(D%NIJB:D%NIJE,:,JSV) = PEMF(D%NIJB:D%NIJE,:)*(PSV_UP(D%NIJB:D%NIJE,:,JSV)-PFLXZSVMF(D%NIJB:D%NIJE,:,JSV)) + PSVDT(D%NIJB:D%NIJE,:,JSV)= (ZVARS(D%NIJB:D%NIJE,:)-PSVM(D%NIJB:D%NIJE,:,JSV))/PTSTEP + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) ENDDO ! diff --git a/src/common/turb/mode_mf_turb_expl.F90 b/src/common/turb/mode_mf_turb_expl.F90 index cace0eb3ac7af50ab043dd2e25d2a56ba4063c0b..6f275cf85580ce0b82ff02e66e224f25155690d9 100644 --- a/src/common/turb/mode_mf_turb_expl.F90 +++ b/src/common/turb/mode_mf_turb_expl.F90 @@ -68,36 +68,36 @@ TYPE(DIMPHYEX_t), INTENT(IN) :: D TYPE(PARAM_MFSHALL_t), INTENT(IN) :: PARAMMF LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PRHODJ ! dry density * Grid size +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODJ ! dry density * Grid size ! Conservative var. at t-dt -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PTHLM ! conservative pot. temp. -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PRTM ! water var. where +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHLM ! conservative pot. temp. +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRTM ! water var. where ! Virtual potential temperature at t-dt -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PTHVM +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHVM ! Momentum at t-dt -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PUM -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PVM +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PUM +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PVM ! ! Tendencies of conservative variables -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PTHLDT +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PTHLDT -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PRTDT +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PRTDT ! Tendencies of momentum -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PUDT -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PVDT +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PUDT +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PVDT ! Updraft characteritics -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PEMF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PEMF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP ! Fluxes -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PFLXZTHLMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PFLXZTHLMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF -REAL, DIMENSION(D%NIT,D%NKT) :: ZFLXZTHSMF,ZTHS_UP,ZTHSM ! Theta S flux -REAL, DIMENSION(D%NIT,D%NKT) :: ZQT_UP,ZQTM,ZTHSDT,ZQTDT -REAL, DIMENSION(D%NIT,D%NKT) :: ZTHLM_F,ZRTM_F +REAL, DIMENSION(D%NIJT,D%NKT) :: ZFLXZTHSMF,ZTHS_UP,ZTHSM ! Theta S flux +REAL, DIMENSION(D%NIJT,D%NKT) :: ZQT_UP,ZQTM,ZTHSDT,ZQTDT +REAL, DIMENSION(D%NIJT,D%NKT) :: ZTHLM_F,ZRTM_F INTEGER :: JK, JI ! loop counter REAL(KIND=JPRB) :: ZHOOK_HANDLE @@ -130,31 +130,31 @@ PVDT = 0. CALL MZM_MF(D, PRTM (:,:), ZRTM_F(:,:)) CALL MZM_MF(D, PTHLM(:,:), ZTHLM_F(:,:)) -!$mnh_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) -ZQTM(D%NIB:D%NIE,:) = ZRTM_F(D%NIB:D%NIE,:)/(1.+ZRTM_F(D%NIB:D%NIE,:)) -ZQT_UP(D%NIB:D%NIE,:) = PRT_UP(D%NIB:D%NIE,:)/(1.+PRT_UP(D%NIB:D%NIE,:)) -ZTHS_UP(D%NIB:D%NIE,:)= PTHL_UP(D%NIB:D%NIE,:)*(1.+PARAMMF%XLAMBDA_MF*ZQT_UP(D%NIB:D%NIE,:)) -ZTHSM(D%NIB:D%NIE,:) = ZTHLM_F(D%NIB:D%NIE,:)*(1.+PARAMMF%XLAMBDA_MF*ZQTM(D%NIB:D%NIE,:)) -!$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) +!$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) +ZQTM(D%NIJB:D%NIJE,:) = ZRTM_F(D%NIJB:D%NIJE,:)/(1.+ZRTM_F(D%NIJB:D%NIJE,:)) +ZQT_UP(D%NIJB:D%NIJE,:) = PRT_UP(D%NIJB:D%NIJE,:)/(1.+PRT_UP(D%NIJB:D%NIJE,:)) +ZTHS_UP(D%NIJB:D%NIJE,:)= PTHL_UP(D%NIJB:D%NIJE,:)*(1.+PARAMMF%XLAMBDA_MF*ZQT_UP(D%NIJB:D%NIJE,:)) +ZTHSM(D%NIJB:D%NIJE,:) = ZTHLM_F(D%NIJB:D%NIJE,:)*(1.+PARAMMF%XLAMBDA_MF*ZQTM(D%NIJB:D%NIJE,:)) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) CALL MZM_MF(D, PTHLM(:,:), PFLXZTHLMF(:,:)) CALL MZM_MF(D, PRTM(:,:), PFLXZRMF(:,:)) CALL MZM_MF(D, PTHVM(:,:), PFLXZTHVMF(:,:)) -!$mnh_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) -PFLXZTHLMF(D%NIB:D%NIE,:) = PEMF(D%NIB:D%NIE,:)*(PTHL_UP(D%NIB:D%NIE,:)-PFLXZTHLMF(D%NIB:D%NIE,:)) ! ThetaL -PFLXZRMF(D%NIB:D%NIE,:) = PEMF(D%NIB:D%NIE,:)*(PRT_UP(D%NIB:D%NIE,:)-PFLXZRMF(D%NIB:D%NIE,:)) ! Rt -PFLXZTHVMF(D%NIB:D%NIE,:) = PEMF(D%NIB:D%NIE,:)*(PTHV_UP(D%NIB:D%NIE,:)-PFLXZTHVMF(D%NIB:D%NIE,:)) ! ThetaV +!$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) +PFLXZTHLMF(D%NIJB:D%NIJE,:) = PEMF(D%NIJB:D%NIJE,:)*(PTHL_UP(D%NIJB:D%NIJE,:)-PFLXZTHLMF(D%NIJB:D%NIJE,:)) ! ThetaL +PFLXZRMF(D%NIJB:D%NIJE,:) = PEMF(D%NIJB:D%NIJE,:)*(PRT_UP(D%NIJB:D%NIJE,:)-PFLXZRMF(D%NIJB:D%NIJE,:)) ! Rt +PFLXZTHVMF(D%NIJB:D%NIJE,:) = PEMF(D%NIJB:D%NIJE,:)*(PTHV_UP(D%NIJB:D%NIJE,:)-PFLXZTHVMF(D%NIJB:D%NIJE,:)) ! ThetaV -ZFLXZTHSMF(D%NIB:D%NIE,:) = PEMF(D%NIB:D%NIE,:)*(ZTHS_UP(D%NIB:D%NIE,:)-ZTHSM(D%NIB:D%NIE,:)) ! Theta S flux -!$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) +ZFLXZTHSMF(D%NIJB:D%NIJE,:) = PEMF(D%NIJB:D%NIJE,:)*(ZTHS_UP(D%NIJB:D%NIJE,:)-ZTHSM(D%NIJB:D%NIJE,:)) ! Theta S flux +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) IF (OMIXUV) THEN CALL MZM_MF(D, PUM(:,:), PFLXZUMF(:,:)) CALL MZM_MF(D, PVM(:,:), PFLXZVMF(:,:)) - !$mnh_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) - PFLXZUMF(D%NIB:D%NIE,:) = PEMF(D%NIB:D%NIE,:)*(PU_UP(D%NIB:D%NIE,:)-PFLXZUMF(D%NIB:D%NIE,:)) ! U - PFLXZVMF(D%NIB:D%NIE,:) = PEMF(D%NIB:D%NIE,:)*(PV_UP(D%NIB:D%NIE,:)-PFLXZVMF(D%NIB:D%NIE,:)) ! V - !$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) + !$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) + PFLXZUMF(D%NIJB:D%NIJE,:) = PEMF(D%NIJB:D%NIJE,:)*(PU_UP(D%NIJB:D%NIJE,:)-PFLXZUMF(D%NIJB:D%NIJE,:)) ! U + PFLXZVMF(D%NIJB:D%NIJE,:) = PEMF(D%NIJB:D%NIJE,:)*(PV_UP(D%NIJB:D%NIJE,:)-PFLXZVMF(D%NIJB:D%NIJE,:)) ! V + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) ELSE PFLXZUMF(:,:) = 0. PFLXZVMF(:,:) = 0. @@ -168,7 +168,7 @@ ENDIF ! -------------------------------------------- DO JK=D%NKB,D%NKE-D%NKL,D%NKL - DO JI=D%NIB,D%NIE + DO JI=D%NIJB,D%NIJE !PTHLDT(JI,JK) = (PFLXZTHLMF(JI,JK ) - PFLXZTHLMF(JI,JK+D%NKL)) / PRHODJ(JI,JK) PRTDT(JI,JK) = (PFLXZRMF(JI,JK) - PFLXZRMF(JI,JK+D%NKL)) / PRHODJ(JI,JK) ZQTDT(JI,JK) = PRTDT(JI,JK)/(1.+ ZRTM_F(JI,JK)*ZRTM_F(JI,JK)) @@ -179,7 +179,7 @@ END DO IF (OMIXUV) THEN DO JK=D%NKB,D%NKE-D%NKL,D%NKL - DO JI=D%NIB,D%NIE + DO JI=D%NIJB,D%NIJE PUDT(JI,JK) = (PFLXZUMF(JI,JK) - PFLXZUMF(JI,JK+D%NKL)) / PRHODJ(JI,JK) PVDT(JI,JK) = (PFLXZVMF(JI,JK) - PFLXZVMF(JI,JK+D%NKL)) / PRHODJ(JI,JK) ENDDO diff --git a/src/common/turb/mode_thl_rt_from_th_r_mf.F90 b/src/common/turb/mode_thl_rt_from_th_r_mf.F90 index c83a0ff578f714f84542d789806b55590b454cce..055c6b5ee3c78862868a27b9a63fb61fcf28ef45 100644 --- a/src/common/turb/mode_thl_rt_from_th_r_mf.F90 +++ b/src/common/turb/mode_thl_rt_from_th_r_mf.F90 @@ -63,12 +63,12 @@ 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. -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PTH ! theta -REAL, DIMENSION(D%NIT,D%NKT,KRR), INTENT(IN) :: PR ! water species -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PEXN ! exner function +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTH ! theta +REAL, DIMENSION(D%NIJT,D%NKT,KRR), INTENT(IN) :: PR ! water species +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PEXN ! exner function -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PTHL ! th_l -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PRT ! total non precip. water +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PTHL ! th_l +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PRT ! total non precip. water ! !------------------------------------------------------------------------------- ! @@ -76,65 +76,65 @@ REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PRT ! total non precip. water ! !---------------------------------------------------------------------------- -REAL, DIMENSION(D%NIT,D%NKT) :: ZCP, ZT -REAL, DIMENSION(D%NIT,D%NKT) :: ZLVOCPEXN, ZLSOCPEXN +REAL, DIMENSION(D%NIJT,D%NKT) :: ZCP, ZT +REAL, DIMENSION(D%NIJT,D%NKT) :: ZLVOCPEXN, ZLSOCPEXN INTEGER :: JRR, JI, JK REAL(KIND=JPRB) :: ZHOOK_HANDLE !---------------------------------------------------------------------------- ! ! IF (LHOOK) CALL DR_HOOK('THL_RT_FRM_TH_R_MF',0,ZHOOK_HANDLE) -!$mnh_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) +!$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) !temperature -ZT(D%NIB:D%NIE,:) = PTH(D%NIB:D%NIE,:) * PEXN(D%NIB:D%NIE,:) +ZT(D%NIJB:D%NIJE,:) = PTH(D%NIJB:D%NIJE,:) * PEXN(D%NIJB:D%NIJE,:) !Cp -ZCP(D%NIB:D%NIE,:)=CST%XCPD -IF (KRR > 0) ZCP(D%NIB:D%NIE,:) = ZCP(D%NIB:D%NIE,:) + CST%XCPV * PR(D%NIB:D%NIE,:,1) -!$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) +ZCP(D%NIJB:D%NIJE,:)=CST%XCPD +IF (KRR > 0) ZCP(D%NIJB:D%NIJE,:) = ZCP(D%NIJB:D%NIJE,:) + CST%XCPV * PR(D%NIJB:D%NIJE,:,1) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) DO JRR = 2,1+KRRL ! loop on the liquid components - !$mnh_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) - ZCP(D%NIB:D%NIE,:) = ZCP(D%NIB:D%NIE,:) + CST%XCL * PR(D%NIB:D%NIE,:,JRR) - !$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) + !$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) + ZCP(D%NIJB:D%NIJE,:) = ZCP(D%NIJB:D%NIJE,:) + CST%XCL * PR(D%NIJB:D%NIJE,:,JRR) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) END DO DO JRR = 2+KRRL,1+KRRL+KRRI ! loop on the solid components - !$mnh_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) - ZCP(D%NIB:D%NIE,:) = ZCP(D%NIB:D%NIE,:) + CST%XCI * PR(D%NIB:D%NIE,:,JRR) - !$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) + !$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) + ZCP(D%NIJB:D%NIJE,:) = ZCP(D%NIJB:D%NIJE,:) + CST%XCI * PR(D%NIJB:D%NIJE,:,JRR) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) END DO IF ( KRRL >= 1 ) THEN IF ( KRRI >= 1 ) THEN - !$mnh_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) + !$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) !ZLVOCPEXN and ZLSOCPEXN - ZLVOCPEXN(D%NIB:D%NIE,:)=(CST%XLVTT + (CST%XCPV-CST%XCL) * (ZT(D%NIB:D%NIE,:)-CST%XTT) ) & - &/ ZCP(D%NIB:D%NIE,:) / PEXN(D%NIB:D%NIE,:) - ZLSOCPEXN(D%NIB:D%NIE,:)=(CST%XLSTT + (CST%XCPV-CST%XCI) * (ZT(D%NIB:D%NIE,:)-CST%XTT) ) & - &/ ZCP(D%NIB:D%NIE,:) / PEXN(D%NIB:D%NIE,:) + ZLVOCPEXN(D%NIJB:D%NIJE,:)=(CST%XLVTT + (CST%XCPV-CST%XCL) * (ZT(D%NIJB:D%NIJE,:)-CST%XTT) ) & + &/ ZCP(D%NIJB:D%NIJE,:) / PEXN(D%NIJB:D%NIJE,:) + ZLSOCPEXN(D%NIJB:D%NIJE,:)=(CST%XLSTT + (CST%XCPV-CST%XCI) * (ZT(D%NIJB:D%NIJE,:)-CST%XTT) ) & + &/ ZCP(D%NIJB:D%NIJE,:) / PEXN(D%NIJB:D%NIJE,:) ! Rnp - PRT(D%NIB:D%NIE,:) = PR(D%NIB:D%NIE,:,1) + PR(D%NIB:D%NIE,:,2) + PR(D%NIB:D%NIE,:,4) + PRT(D%NIJB:D%NIJE,:) = PR(D%NIJB:D%NIJE,:,1) + PR(D%NIJB:D%NIJE,:,2) + PR(D%NIJB:D%NIJE,:,4) ! Theta_l - PTHL(D%NIB:D%NIE,:) = PTH(D%NIB:D%NIE,:) - ZLVOCPEXN(D%NIB:D%NIE,:) * PR(D%NIB:D%NIE,:,2) & - - ZLSOCPEXN(D%NIB:D%NIE,:) * PR(D%NIB:D%NIE,:,4) - !$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) + PTHL(D%NIJB:D%NIJE,:) = PTH(D%NIJB:D%NIJE,:) - ZLVOCPEXN(D%NIJB:D%NIJE,:) * PR(D%NIJB:D%NIJE,:,2) & + - ZLSOCPEXN(D%NIJB:D%NIJE,:) * PR(D%NIJB:D%NIJE,:,4) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) ELSE - !$mnh_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) + !$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) !ZLVOCPEXN - ZLVOCPEXN(D%NIB:D%NIE,:)=(CST%XLVTT + (CST%XCPV-CST%XCL) * (ZT(D%NIB:D%NIE,:)-CST%XTT) ) & - &/ ZCP(D%NIB:D%NIE,:) / PEXN(D%NIB:D%NIE,:) + ZLVOCPEXN(D%NIJB:D%NIJE,:)=(CST%XLVTT + (CST%XCPV-CST%XCL) * (ZT(D%NIJB:D%NIJE,:)-CST%XTT) ) & + &/ ZCP(D%NIJB:D%NIJE,:) / PEXN(D%NIJB:D%NIJE,:) ! Rnp - PRT(D%NIB:D%NIE,:) = PR(D%NIB:D%NIE,:,1) + PR(D%NIB:D%NIE,:,2) + PRT(D%NIJB:D%NIJE,:) = PR(D%NIJB:D%NIJE,:,1) + PR(D%NIJB:D%NIJE,:,2) ! Theta_l - PTHL(D%NIB:D%NIE,:) = PTH(D%NIB:D%NIE,:) - ZLVOCPEXN(D%NIB:D%NIE,:) * PR(D%NIB:D%NIE,:,2) - !$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) + PTHL(D%NIJB:D%NIJE,:) = PTH(D%NIJB:D%NIJE,:) - ZLVOCPEXN(D%NIJB:D%NIJE,:) * PR(D%NIJB:D%NIJE,:,2) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) END IF ELSE - !$mnh_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) + !$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) ! Rnp = rv - PRT(D%NIB:D%NIE,:) = PR(D%NIB:D%NIE,:,1) + PRT(D%NIJB:D%NIJE,:) = PR(D%NIJB:D%NIJE,:,1) ! Theta_l = Theta - PTHL(D%NIB:D%NIE,:) = PTH(D%NIB:D%NIE,:) - !$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=1:D%NKT) + PTHL(D%NIJB:D%NIJE,:) = PTH(D%NIJB:D%NIJE,:) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=1:D%NKT) END IF IF (LHOOK) CALL DR_HOOK('THL_RT_FRM_TH_R_MF',1,ZHOOK_HANDLE) END SUBROUTINE THL_RT_FROM_TH_R_MF diff --git a/src/common/turb/mode_tridiag_massflux.F90 b/src/common/turb/mode_tridiag_massflux.F90 index 88fd02999a71cf1e3b35a2bfd5ada7cbdda82348..c2145ba59cb306a42e5d5d362f85c7466ec927a2 100644 --- a/src/common/turb/mode_tridiag_massflux.F90 +++ b/src/common/turb/mode_tridiag_massflux.F90 @@ -131,27 +131,27 @@ IMPLICIT NONE !* 0.1 declarations of arguments ! TYPE(DIMPHYEX_t), INTENT(IN) :: D -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PVARM ! variable at t-1 at mass point -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PF ! flux in dT/dt=-dF/dz at flux point -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PDFDT ! dF/dT at flux point +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PVARM ! variable at t-1 at mass point +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PF ! flux in dT/dt=-dF/dz at flux point +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDFDT ! dF/dT at flux point REAL, INTENT(IN) :: PTSTEP ! Double time step REAL, INTENT(IN) :: PIMPL ! implicit weight -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PDZZ ! Dz at flux point -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PRHODJ ! (dry rho)*J at mass point +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDZZ ! Dz at flux point +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODJ ! (dry rho)*J at mass point ! -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT):: PVARP ! variable at t+1 at mass point +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT):: PVARP ! variable at t+1 at mass point ! ! !* 0.2 declarations of local variables ! -REAL, DIMENSION(D%NIT,D%NKT) :: ZRHODJ_DFDT_O_DZ -REAL, DIMENSION(D%NIT,D%NKT) :: ZMZM_RHODJ -REAL, DIMENSION(D%NIT,D%NKT) :: ZA, ZB, ZC -REAL, DIMENSION(D%NIT,D%NKT) :: ZY ,ZGAM +REAL, DIMENSION(D%NIJT,D%NKT) :: ZRHODJ_DFDT_O_DZ +REAL, DIMENSION(D%NIJT,D%NKT) :: ZMZM_RHODJ +REAL, DIMENSION(D%NIJT,D%NKT) :: ZA, ZB, ZC +REAL, DIMENSION(D%NIJT,D%NKT) :: ZY ,ZGAM ! RHS of the equation, 3D work array -REAL, DIMENSION(D%NIT) :: ZBET +REAL, DIMENSION(D%NIJT) :: ZBET ! 2D work array -INTEGER :: JK ! loop counter +INTEGER :: JK, JI ! loop counter ! ! --------------------------------------------------------------------------- ! @@ -172,30 +172,38 @@ ZY=0. !* 2. COMPUTE THE RIGHT HAND SIDE ! --------------------------- ! -ZY(:,D%NKB) = PRHODJ(:,D%NKB)*PVARM(:,D%NKB)/PTSTEP & - - ZMZM_RHODJ(:,D%NKB+D%NKL) * PF(:,D%NKB+D%NKL)/PDZZ(:,D%NKB+D%NKL) & - + ZMZM_RHODJ(:,D%NKB ) * PF(:,D%NKB )/PDZZ(:,D%NKB ) & - + ZRHODJ_DFDT_O_DZ(:,D%NKB+D%NKL) * 0.5*PIMPL * PVARM(:,D%NKB+D%NKL) & - + ZRHODJ_DFDT_O_DZ(:,D%NKB+D%NKL) * 0.5*PIMPL * PVARM(:,D%NKB ) +!$mnh_expand_array(JI=D%NIJB:D%NIJE) +ZY(D%NIJB:D%NIJE,D%NKB) = PRHODJ(D%NIJB:D%NIJE,D%NKB)*PVARM(D%NIJB:D%NIJE,D%NKB)/PTSTEP & + - ZMZM_RHODJ(D%NIJB:D%NIJE,D%NKB+D%NKL) * PF(D%NIJB:D%NIJE,D%NKB+D%NKL)/PDZZ(D%NIJB:D%NIJE,D%NKB+D%NKL) & + + ZMZM_RHODJ(D%NIJB:D%NIJE,D%NKB ) * PF(D%NIJB:D%NIJE,D%NKB )/PDZZ(D%NIJB:D%NIJE,D%NKB ) & + + ZRHODJ_DFDT_O_DZ(D%NIJB:D%NIJE,D%NKB+D%NKL) * 0.5*PIMPL * PVARM(D%NIJB:D%NIJE,D%NKB+D%NKL) & + + ZRHODJ_DFDT_O_DZ(D%NIJB:D%NIJE,D%NKB+D%NKL) * 0.5*PIMPL * PVARM(D%NIJB:D%NIJE,D%NKB ) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE) ! DO JK=1+D%NKTB,D%NKTE-1 - ZY(:,JK) = PRHODJ(:,JK)*PVARM(:,JK)/PTSTEP & - - ZMZM_RHODJ(:,JK+D%NKL) * PF(:,JK+D%NKL)/PDZZ(:,JK+D%NKL) & - + ZMZM_RHODJ(:,JK ) * PF(:,JK )/PDZZ(:,JK ) & - + ZRHODJ_DFDT_O_DZ(:,JK+D%NKL) * 0.5*PIMPL * PVARM(:,JK+D%NKL) & - + ZRHODJ_DFDT_O_DZ(:,JK+D%NKL) * 0.5*PIMPL * PVARM(:,JK ) & - - ZRHODJ_DFDT_O_DZ(:,JK ) * 0.5*PIMPL * PVARM(:,JK ) & - - ZRHODJ_DFDT_O_DZ(:,JK ) * 0.5*PIMPL * PVARM(:,JK-D%NKL) + !$mnh_expand_array(JI=D%NIJB:D%NIJE) + ZY(D%NIJB:D%NIJE,JK) = PRHODJ(D%NIJB:D%NIJE,JK)*PVARM(D%NIJB:D%NIJE,JK)/PTSTEP & + - ZMZM_RHODJ(D%NIJB:D%NIJE,JK+D%NKL) * PF(D%NIJB:D%NIJE,JK+D%NKL)/PDZZ(D%NIJB:D%NIJE,JK+D%NKL) & + + ZMZM_RHODJ(D%NIJB:D%NIJE,JK ) * PF(D%NIJB:D%NIJE,JK )/PDZZ(D%NIJB:D%NIJE,JK ) & + + ZRHODJ_DFDT_O_DZ(D%NIJB:D%NIJE,JK+D%NKL) * 0.5*PIMPL * PVARM(D%NIJB:D%NIJE,JK+D%NKL) & + + ZRHODJ_DFDT_O_DZ(D%NIJB:D%NIJE,JK+D%NKL) * 0.5*PIMPL * PVARM(D%NIJB:D%NIJE,JK ) & + - ZRHODJ_DFDT_O_DZ(D%NIJB:D%NIJE,JK ) * 0.5*PIMPL * PVARM(D%NIJB:D%NIJE,JK ) & + - ZRHODJ_DFDT_O_DZ(D%NIJB:D%NIJE,JK ) * 0.5*PIMPL * PVARM(D%NIJB:D%NIJE,JK-D%NKL) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE) END DO ! IF (D%NKE==D%NKU) THEN - ZY(:,D%NKE) = PRHODJ(:,D%NKE)*PVARM(:,D%NKE)/PTSTEP + !$mnh_expand_array(JI=D%NIJB:D%NIJE) + ZY(D%NIJB:D%NIJE,D%NKE) = PRHODJ(D%NIJB:D%NIJE,D%NKE)*PVARM(D%NIJB:D%NIJE,D%NKE)/PTSTEP + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE) ELSE - ZY(:,D%NKE) = PRHODJ(:,D%NKE)*PVARM(:,D%NKE)/PTSTEP & - - ZMZM_RHODJ(:,D%NKE+D%NKL) * PF(:,D%NKE+D%NKL)/PDZZ(:,D%NKE+D%NKL) & - + ZMZM_RHODJ(:,D%NKE ) * PF(:,D%NKE )/PDZZ(:,D%NKE ) & - - ZRHODJ_DFDT_O_DZ(:,D%NKE ) * 0.5*PIMPL * PVARM(:,D%NKE ) & - - ZRHODJ_DFDT_O_DZ(:,D%NKE ) * 0.5*PIMPL * PVARM(:,D%NKE-D%NKL) + !$mnh_expand_array(JI=D%NIJB:D%NIJE) + ZY(D%NIJB:D%NIJE,D%NKE) = PRHODJ(D%NIJB:D%NIJE,D%NKE)*PVARM(D%NIJB:D%NIJE,D%NKE)/PTSTEP & + - ZMZM_RHODJ(D%NIJB:D%NIJE,D%NKE+D%NKL) * PF(D%NIJB:D%NIJE,D%NKE+D%NKL)/PDZZ(D%NIJB:D%NIJE,D%NKE+D%NKL) & + + ZMZM_RHODJ(D%NIJB:D%NIJE,D%NKE ) * PF(D%NIJB:D%NIJE,D%NKE )/PDZZ(D%NIJB:D%NIJE,D%NKE ) & + - ZRHODJ_DFDT_O_DZ(D%NIJB:D%NIJE,D%NKE ) * 0.5*PIMPL * PVARM(D%NIJB:D%NIJE,D%NKE ) & + - ZRHODJ_DFDT_O_DZ(D%NIJB:D%NIJE,D%NKE ) * 0.5*PIMPL * PVARM(D%NIJB:D%NIJE,D%NKE-D%NKL) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE) ENDIF ! ! @@ -207,50 +215,64 @@ IF ( PIMPL > 1.E-10 ) THEN !* 3.1 arrays A, B, C ! -------------- ! - ZB(:,D%NKB) = PRHODJ(:,D%NKB)/PTSTEP & - + ZRHODJ_DFDT_O_DZ(:,D%NKB+D%NKL) * 0.5*PIMPL - ZC(:,D%NKB) = ZRHODJ_DFDT_O_DZ(:,D%NKB+D%NKL) * 0.5*PIMPL + !$mnh_expand_array(JI=D%NIJB:D%NIJE) + ZB(D%NIJB:D%NIJE,D%NKB) = PRHODJ(D%NIJB:D%NIJE,D%NKB)/PTSTEP & + + ZRHODJ_DFDT_O_DZ(D%NIJB:D%NIJE,D%NKB+D%NKL) * 0.5*PIMPL + ZC(D%NIJB:D%NIJE,D%NKB) = ZRHODJ_DFDT_O_DZ(D%NIJB:D%NIJE,D%NKB+D%NKL) * 0.5*PIMPL + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE) DO JK=1+D%NKTB,D%NKTE-1 - ZA(:,JK) = - ZRHODJ_DFDT_O_DZ(:,JK ) * 0.5*PIMPL - ZB(:,JK) = PRHODJ(:,JK)/PTSTEP & - + ZRHODJ_DFDT_O_DZ(:,JK+D%NKL) * 0.5*PIMPL & - - ZRHODJ_DFDT_O_DZ(:,JK ) * 0.5*PIMPL - ZC(:,JK) = ZRHODJ_DFDT_O_DZ(:,JK+D%NKL) * 0.5*PIMPL + !$mnh_expand_array(JI=D%NIJB:D%NIJE) + ZA(D%NIJB:D%NIJE,JK) = - ZRHODJ_DFDT_O_DZ(D%NIJB:D%NIJE,JK ) * 0.5*PIMPL + ZB(D%NIJB:D%NIJE,JK) = PRHODJ(D%NIJB:D%NIJE,JK)/PTSTEP & + + ZRHODJ_DFDT_O_DZ(D%NIJB:D%NIJE,JK+D%NKL) * 0.5*PIMPL & + - ZRHODJ_DFDT_O_DZ(D%NIJB:D%NIJE,JK ) * 0.5*PIMPL + ZC(D%NIJB:D%NIJE,JK) = ZRHODJ_DFDT_O_DZ(D%NIJB:D%NIJE,JK+D%NKL) * 0.5*PIMPL + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE) END DO - - ZA(:,D%NKE) = - ZRHODJ_DFDT_O_DZ(:,D%NKE ) * 0.5*PIMPL - ZB(:,D%NKE) = PRHODJ(:,D%NKE)/PTSTEP & - - ZRHODJ_DFDT_O_DZ(:,D%NKE ) * 0.5*PIMPL + !$mnh_expand_array(JI=D%NIJB:D%NIJE) + ZA(D%NIJB:D%NIJE,D%NKE) = - ZRHODJ_DFDT_O_DZ(D%NIJB:D%NIJE,D%NKE ) * 0.5*PIMPL + ZB(D%NIJB:D%NIJE,D%NKE) = PRHODJ(D%NIJB:D%NIJE,D%NKE)/PTSTEP & + - ZRHODJ_DFDT_O_DZ(D%NIJB:D%NIJE,D%NKE ) * 0.5*PIMPL + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE) ! !* 3.2 going up ! -------- ! - ZBET(:) = ZB(:,D%NKB) ! bet = b(D%NKB) - PVARP(:,D%NKB) = ZY(:,D%NKB) / ZBET(:) + !$mnh_expand_array(JI=D%NIJB:D%NIJE) + ZBET(D%NIJB:D%NIJE) = ZB(D%NIJB:D%NIJE,D%NKB) ! bet = b(D%NKB) + PVARP(D%NIJB:D%NIJE,D%NKB) = ZY(D%NIJB:D%NIJE,D%NKB) / ZBET(D%NIJB:D%NIJE) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE) ! DO JK = D%NKB+D%NKL,D%NKE-D%NKL,D%NKL - ZGAM(:,JK) = ZC(:,JK-D%NKL) / ZBET(:) + !$mnh_expand_array(JI=D%NIJB:D%NIJE) + ZGAM(D%NIJB:D%NIJE,JK) = ZC(D%NIJB:D%NIJE,JK-D%NKL) / ZBET(D%NIJB:D%NIJE) ! gam(k) = c(k-1) / bet - ZBET(:) = ZB(:,JK) - ZA(:,JK) * ZGAM(:,JK) + ZBET(D%NIJB:D%NIJE) = ZB(D%NIJB:D%NIJE,JK) - ZA(D%NIJB:D%NIJE,JK) * ZGAM(D%NIJB:D%NIJE,JK) ! bet = b(k) - a(k)* gam(k) - PVARP(:,JK)= ( ZY(:,JK) - ZA(:,JK) * PVARP(:,JK-D%NKL) ) / ZBET(:) + PVARP(D%NIJB:D%NIJE,JK)= ( ZY(D%NIJB:D%NIJE,JK) - ZA(D%NIJB:D%NIJE,JK) * PVARP(D%NIJB:D%NIJE,JK-D%NKL) ) / ZBET(D%NIJB:D%NIJE) ! res(k) = (y(k) -a(k)*res(k-1))/ bet + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE) END DO + !$mnh_expand_array(JI=D%NIJB:D%NIJE) ! special treatment for the last level - ZGAM(:,D%NKE) = ZC(:,D%NKE-D%NKL) / ZBET(:) + ZGAM(D%NIJB:D%NIJE,D%NKE) = ZC(D%NIJB:D%NIJE,D%NKE-D%NKL) / ZBET(D%NIJB:D%NIJE) ! gam(k) = c(k-1) / bet - ZBET(:) = ZB(:,D%NKE) - ZA(:,D%NKE) * ZGAM(:,D%NKE) + ZBET(D%NIJB:D%NIJE) = ZB(D%NIJB:D%NIJE,D%NKE) - ZA(D%NIJB:D%NIJE,D%NKE) * ZGAM(D%NIJB:D%NIJE,D%NKE) ! bet = b(k) - a(k)* gam(k) - PVARP(:,D%NKE)= ( ZY(:,D%NKE) - ZA(:,D%NKE) * PVARP(:,D%NKE-D%NKL) ) / ZBET(:) + PVARP(D%NIJB:D%NIJE,D%NKE)= ( ZY(D%NIJB:D%NIJE,D%NKE) - ZA(D%NIJB:D%NIJE,D%NKE) * PVARP(D%NIJB:D%NIJE,D%NKE-D%NKL) ) / & + &ZBET(D%NIJB:D%NIJE) ! res(k) = (y(k) -a(k)*res(k-1))/ bet + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE) ! !* 3.3 going down ! ---------- ! DO JK = D%NKE-D%NKL,D%NKB,-D%NKL - PVARP(:,JK) = PVARP(:,JK) - ZGAM(:,JK+D%NKL) * PVARP(:,JK+D%NKL) + !$mnh_expand_array(JI=D%NIJB:D%NIJE) + PVARP(D%NIJB:D%NIJE,JK) = PVARP(D%NIJB:D%NIJE,JK) - ZGAM(D%NIJB:D%NIJE,JK+D%NKL) * PVARP(D%NIJB:D%NIJE,JK+D%NKL) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE) END DO ! ! @@ -258,7 +280,9 @@ ELSE !!! EXPLICIT FORMULATION ! DO JK=D%NKTB,D%NKTE - PVARP(:,JK) = ZY(:,JK) * PTSTEP / PRHODJ(:,JK) + !$mnh_expand_array(JI=D%NIJB:D%NIJE) + PVARP(D%NIJB:D%NIJE,JK) = ZY(D%NIJB:D%NIJE,JK) * PTSTEP / PRHODJ(D%NIJB:D%NIJE,JK) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE) ENDDO ! END IF @@ -267,8 +291,10 @@ END IF !* 4. FILL THE UPPER AND LOWER EXTERNAL VALUES ! ---------------------------------------- ! -PVARP(:,D%NKA)=PVARP(:,D%NKB) -PVARP(:,D%NKU)=PVARP(:,D%NKE) +!$mnh_expand_array(JI=D%NIJB:D%NIJE) +PVARP(D%NIJB:D%NIJE,D%NKA)=PVARP(D%NIJB:D%NIJE,D%NKB) +PVARP(D%NIJB:D%NIJE,D%NKU)=PVARP(D%NIJB:D%NIJE,D%NKE) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE) ! !------------------------------------------------------------------------------- ! diff --git a/src/common/turb/modi_shallow_mf.F90 b/src/common/turb/modi_shallow_mf.F90 index 7271a8b0864437564fa5b5704a89603d5921dec9..2fc3b6b45b3aa78a57bf60e8e9c29d86e34f6ddd 100644 --- a/src/common/turb/modi_shallow_mf.F90 +++ b/src/common/turb/modi_shallow_mf.F90 @@ -56,48 +56,48 @@ 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(D%NIT,D%NKT), INTENT(IN) :: PZZ ! Height of flux point -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PDZZ ! Metric coefficients -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PRHODJ ! dry density * Grid size -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PRHODREF ! dry density of the +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PZZ ! Height of flux point +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDZZ ! Metric coefficients +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODJ ! dry density * Grid size +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODREF ! dry density of the ! reference state -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PPABSM ! Pressure at time t-1 -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PEXNM ! Exner function at t-dt +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PPABSM ! Pressure at time t-1 +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PEXNM ! Exner function at t-dt -REAL, DIMENSION(D%NIT), INTENT(IN) :: PSFTH,PSFRV ! normal surface fluxes of theta and Rv -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PTHM ! Theta at t-dt -REAL, DIMENSION(D%NIT,KRR), INTENT(IN) :: PRM ! water var. at t-dt -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PUM,PVM ! wind components at t-dt -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PTKEM ! tke at t-dt +REAL, DIMENSION(D%NIJT), INTENT(IN) :: PSFTH,PSFRV ! normal surface fluxes of theta and Rv +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHM ! Theta at t-dt +REAL, DIMENSION(D%NIJT,KRR), INTENT(IN) :: PRM ! water var. at t-dt +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PUM,PVM ! wind components at t-dt +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTKEM ! tke at t-dt -REAL, DIMENSION(D%NIT,D%NKT,KSV), INTENT(IN) :: PSVM ! scalar variable a t-dt +REAL, DIMENSION(D%NIJT,D%NKT,KSV), INTENT(IN) :: PSVM ! scalar variable a t-dt -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT):: PDUDT_MF ! tendency of U by massflux scheme -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT):: PDVDT_MF ! tendency of V by massflux scheme -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT):: PDTHLDT_MF ! tendency of thl by massflux scheme -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT):: PDRTDT_MF ! tendency of rt by massflux scheme -REAL, DIMENSION(D%NIT,D%NKT,KSV), INTENT(OUT):: PDSVDT_MF ! tendency of Sv by massflux scheme +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT):: PDUDT_MF ! tendency of U by massflux scheme +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT):: PDVDT_MF ! tendency of V by massflux scheme +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT):: PDTHLDT_MF ! tendency of thl by massflux scheme +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT):: PDRTDT_MF ! tendency of rt by massflux scheme +REAL, DIMENSION(D%NIJT,D%NKT,KSV), INTENT(OUT):: PDSVDT_MF ! tendency of Sv by massflux scheme -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PSIGMF,PRC_MF,PRI_MF,PCF_MF ! cloud info for the cloud scheme -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PFLXZTHVMF ! Thermal production for TKE scheme -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PFLXZTHMF -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PFLXZRMF -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PFLXZUMF -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PFLXZVMF -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT) :: PTHL_UP ! Thl updraft characteristics -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT) :: PRT_UP ! Rt updraft characteristics -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PRV_UP ! Vapor updraft characteristics -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT) :: PU_UP ! U wind updraft characteristics -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT) :: PV_UP ! V wind updraft characteristics -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT) :: PRC_UP ! cloud content updraft characteristics -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT) :: PRI_UP ! ice content updraft characteristics -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT) :: PTHV_UP ! Thv updraft characteristics -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT) :: PW_UP ! vertical speed updraft characteristics -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT) :: PFRAC_UP ! updraft fraction -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT) :: PEMF ! updraft mass flux -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PDETR ! updraft detrainment -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PENTR ! updraft entrainment -INTEGER,DIMENSION(D%NIT), INTENT(OUT) :: KKLCL,KKETL,KKCTL ! level of LCL,ETL and CTL +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PSIGMF,PRC_MF,PRI_MF,PCF_MF ! cloud info for the cloud scheme +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PFLXZTHVMF ! Thermal production for TKE scheme +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PFLXZTHMF +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PFLXZRMF +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PFLXZUMF +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PFLXZVMF +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PTHL_UP ! Thl updraft characteristics +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRT_UP ! Rt updraft characteristics +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PRV_UP ! Vapor updraft characteristics +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PU_UP ! U wind updraft characteristics +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PV_UP ! V wind updraft characteristics +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRC_UP ! cloud content updraft characteristics +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRI_UP ! ice content updraft characteristics +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PTHV_UP ! Thv updraft characteristics +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PW_UP ! vertical speed updraft characteristics +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PFRAC_UP ! updraft fraction +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PEMF ! updraft mass flux +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PDETR ! updraft detrainment +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PENTR ! updraft entrainment +INTEGER,DIMENSION(D%NIJT), INTENT(OUT) :: KKLCL,KKETL,KKCTL ! level of LCL,ETL and CTL REAL, INTENT(IN) :: PDX, PDY diff --git a/src/common/turb/shallow_mf.F90 b/src/common/turb/shallow_mf.F90 index c59028930612593fdcec07a62d02b97dc047fcec..988798bb662451a1ab928f630e8cbbe2a2398147 100644 --- a/src/common/turb/shallow_mf.F90 +++ b/src/common/turb/shallow_mf.F90 @@ -118,70 +118,70 @@ 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(D%NIT,D%NKT), INTENT(IN) :: PZZ ! Height of flux point -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PDZZ ! Metric coefficients -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PRHODJ ! dry density * Grid size -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PRHODREF ! dry density of the +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PZZ ! Height of flux point +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDZZ ! Metric coefficients +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODJ ! dry density * Grid size +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODREF ! dry density of the ! reference state -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PPABSM ! Pressure at time t-1 -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PEXNM ! Exner function at t-dt +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PPABSM ! Pressure at time t-1 +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PEXNM ! Exner function at t-dt -REAL, DIMENSION(D%NIT), INTENT(IN) :: PSFTH,PSFRV ! normal surface fluxes of theta and Rv -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PTHM ! Theta at t-dt -REAL, DIMENSION(D%NIT,D%NKT,KRR), INTENT(IN) :: PRM ! water var. at t-dt -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PUM,PVM ! wind components at t-dt -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PTKEM ! tke at t-dt +REAL, DIMENSION(D%NIJT), INTENT(IN) :: PSFTH,PSFRV ! normal surface fluxes of theta and Rv +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHM ! Theta at t-dt +REAL, DIMENSION(D%NIJT,D%NKT,KRR), INTENT(IN) :: PRM ! water var. at t-dt +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PUM,PVM ! wind components at t-dt +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTKEM ! tke at t-dt -REAL, DIMENSION(D%NIT,D%NKT,KSV), INTENT(IN) :: PSVM ! scalar variable a t-dt +REAL, DIMENSION(D%NIJT,D%NKT,KSV), INTENT(IN) :: PSVM ! scalar variable a t-dt -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT):: PDUDT_MF ! tendency of U by massflux scheme -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT):: PDVDT_MF ! tendency of V by massflux scheme -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT):: PDTHLDT_MF ! tendency of thl by massflux scheme -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT):: PDRTDT_MF ! tendency of rt by massflux scheme -REAL, DIMENSION(D%NIT,D%NKT,KSV), INTENT(OUT):: PDSVDT_MF ! tendency of Sv by massflux scheme +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT):: PDUDT_MF ! tendency of U by massflux scheme +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT):: PDVDT_MF ! tendency of V by massflux scheme +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT):: PDTHLDT_MF ! tendency of thl by massflux scheme +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT):: PDRTDT_MF ! tendency of rt by massflux scheme +REAL, DIMENSION(D%NIJT,D%NKT,KSV), INTENT(OUT):: PDSVDT_MF ! tendency of Sv by massflux scheme -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PSIGMF,PRC_MF,PRI_MF,PCF_MF ! cloud info for the cloud scheme -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PFLXZTHVMF ! Thermal production for TKE scheme -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PFLXZTHMF -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PFLXZRMF -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PFLXZUMF -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PFLXZVMF -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT) :: PTHL_UP ! Thl updraft characteristics -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT) :: PRT_UP ! Rt updraft characteristics -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT) :: PRV_UP ! Vapor updraft characteristics -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT) :: PU_UP ! U wind updraft characteristics -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT) :: PV_UP ! V wind updraft characteristics -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT) :: PRC_UP ! cloud content updraft characteristics -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT) :: PRI_UP ! ice content updraft characteristics -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT) :: PTHV_UP ! Thv updraft characteristics -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT) :: PW_UP ! vertical speed updraft characteristics -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT) :: PFRAC_UP ! updraft fraction -REAL, DIMENSION(D%NIT,D%NKT), INTENT(INOUT) :: PEMF ! updraft mass flux -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PDETR ! updraft detrainment -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PENTR ! updraft entrainment -INTEGER,DIMENSION(D%NIT), INTENT(OUT) :: KKLCL,KKETL,KKCTL ! level of LCL,ETL and CTL +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PSIGMF,PRC_MF,PRI_MF,PCF_MF ! cloud info for the cloud scheme +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PFLXZTHVMF ! Thermal production for TKE scheme +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PFLXZTHMF +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PFLXZRMF +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PFLXZUMF +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PFLXZVMF +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PTHL_UP ! Thl updraft characteristics +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRT_UP ! Rt updraft characteristics +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRV_UP ! Vapor updraft characteristics +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PU_UP ! U wind updraft characteristics +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PV_UP ! V wind updraft characteristics +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRC_UP ! cloud content updraft characteristics +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRI_UP ! ice content updraft characteristics +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PTHV_UP ! Thv updraft characteristics +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PW_UP ! vertical speed updraft characteristics +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PFRAC_UP ! updraft fraction +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PEMF ! updraft mass flux +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PDETR ! updraft detrainment +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PENTR ! updraft entrainment +INTEGER,DIMENSION(D%NIJT), INTENT(OUT) :: KKLCL,KKETL,KKCTL ! level of LCL,ETL and CTL REAL, INTENT(IN) :: PDX, PDY ! ! 0.2 Declaration of local variables ! -REAL, DIMENSION(D%NIT,D%NKT) :: & +REAL, DIMENSION(D%NIJT,D%NKT) :: & ZTHLM, & ! ZRTM, & ! ZTHVM, & ! ZEMF_O_RHODREF, & ! entrainment/detrainment ZBUO_INTEG ! integrated buoyancy -REAL, DIMENSION(D%NIT,D%NKT) :: ZFRAC_ICE -REAL, DIMENSION(D%NIT,D%NKT) :: ZWK +REAL, DIMENSION(D%NIJT,D%NKT) :: ZFRAC_ICE +REAL, DIMENSION(D%NIJT,D%NKT) :: ZWK -REAL, DIMENSION(D%NIT,D%NKT,KSV) :: & +REAL, DIMENSION(D%NIJT,D%NKT,KSV) :: & ZSV_UP,& ! updraft scalar var. ZFLXZSVMF ! Flux -REAL, DIMENSION(D%NIT) :: ZDEPTH ! Deepness of cloud -REAL, DIMENSION(D%NIT,D%NKT) :: ZFRAC_ICE_UP ! liquid/solid fraction in updraft -REAL, DIMENSION(D%NIT,D%NKT) :: ZRSAT_UP ! Rsat in updraft +REAL, DIMENSION(D%NIJT) :: ZDEPTH ! Deepness of cloud +REAL, DIMENSION(D%NIJT,D%NKT) :: ZFRAC_ICE_UP ! liquid/solid fraction in updraft +REAL, DIMENSION(D%NIJT,D%NKT) :: ZRSAT_UP ! Rsat in updraft LOGICAL :: GENTR_DETR ! flag to recompute entrainment, detrainment and mass flux -INTEGER, DIMENSION(D%NIT,D%NKT) :: IERR +INTEGER, DIMENSION(D%NIJT,D%NKT) :: IERR INTEGER :: JI, JK ! REAL(KIND=JPRB) :: ZHOOK_HANDLE @@ -201,15 +201,15 @@ ENDIF ! Thermodynamics functions ZFRAC_ICE(:,:) = 0. IF (KRR.GE.4) THEN - !$mnh_expand_where(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) - WHERE(PRM(D%NIB:D%NIE,:,2)+PRM(D%NIB:D%NIE,:,4) > 1.E-20) - ZFRAC_ICE(D%NIB:D%NIE,:) = PRM(D%NIB:D%NIE,:,4) / (PRM(D%NIB:D%NIE,:,2)+PRM(D%NIB:D%NIE,:,4)) + !$mnh_expand_where(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) + WHERE(PRM(D%NIJB:D%NIJE,:,2)+PRM(D%NIJB:D%NIJE,:,4) > 1.E-20) + ZFRAC_ICE(D%NIJB:D%NIJE,:) = PRM(D%NIJB:D%NIJE,:,4) / (PRM(D%NIJB:D%NIJE,:,2)+PRM(D%NIJB:D%NIJE,:,4)) ENDWHERE - !$mnh_end_expand_where(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) + !$mnh_end_expand_where(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) ENDIF -!$mnh_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) -ZWK(D%NIB:D%NIE,:)=PTHM(D%NIB:D%NIE,:)*PEXNM(D%NIB:D%NIE,:) -!$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) +!$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) +ZWK(D%NIJB:D%NIJE,:)=PTHM(D%NIJB:D%NIJE,:)*PEXNM(D%NIJB:D%NIJE,:) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) CALL COMPUTE_FRAC_ICE(HFRAC_ICE,NEB,ZFRAC_ICE(:,:),ZWK(:,:), IERR(:,:)) ! Conservative variables at t-dt @@ -218,9 +218,9 @@ CALL THL_RT_FROM_TH_R_MF(D, CST, KRR,KRRL,KRRI, & ZTHLM, ZRTM ) ! Virtual potential temperature at t-dt -!$mnh_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) -ZTHVM(D%NIB:D%NIE,:) = PTHM(D%NIB:D%NIE,:)*((1.+CST%XRV / CST%XRD *PRM(D%NIB:D%NIE,:,1))/(1.+ZRTM(D%NIB:D%NIE,:))) -!$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) +!$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) +ZTHVM(D%NIJB:D%NIJE,:) = PTHM(D%NIJB:D%NIJE,:)*((1.+CST%XRV / CST%XRD *PRM(D%NIJB:D%NIJE,:,1))/(1.+ZRTM(D%NIJB:D%NIJE,:))) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) ! !!! 2. Compute updraft !!! --------------- @@ -291,9 +291,9 @@ CALL COMPUTE_MF_CLOUD(D, CST, PARAMMF, KRR, KRRL, KRRI, & !!! 3. Compute fluxes of conservative variables and their divergence = tendency !!! ------------------------------------------------------------------------ ! -!$mnh_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) -ZEMF_O_RHODREF(D%NIB:D%NIE,:)=PEMF(D%NIB:D%NIE,:)/PRHODREF(D%NIB:D%NIE,:) -!$mnh_end_expand_array(JI=D%NIB:D%NIE,JK=D%NKTB:D%NKTE) +!$mnh_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) +ZEMF_O_RHODREF(D%NIJB:D%NIJE,:)=PEMF(D%NIJB:D%NIJE,:)/PRHODREF(D%NIJB:D%NIJE,:) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE,JK=D%NKTB:D%NKTE) IF ( PIMPL_MF > 1.E-10 ) THEN CALL MF_TURB(D, KSV, OMIXUV, & diff --git a/src/common/turb/shuman_mf.F90 b/src/common/turb/shuman_mf.F90 index 2618e4052fbb194b1e577006eaa3cac0a972ebac..567347cbe7dc59c80935119686968b482808db3b 100644 --- a/src/common/turb/shuman_mf.F90 +++ b/src/common/turb/shuman_mf.F90 @@ -12,8 +12,8 @@ SUBROUTINE DZF_MF(D, PA, PDZF) USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t IMPLICIT NONE TYPE(DIMPHYEX_t), INTENT(IN) :: D -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PA ! variable at flux side -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PDZF ! result at mass +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PA ! variable at flux side +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PDZF ! result at mass ! localization END SUBROUTINE DZF_MF ! @@ -21,8 +21,8 @@ SUBROUTINE DZM_MF(D, PA, PDZM) USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t IMPLICIT NONE TYPE(DIMPHYEX_t), INTENT(IN) :: D -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PA ! variable at mass localization -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PDZM ! result at flux +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PA ! variable at mass localization +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PDZM ! result at flux ! side END SUBROUTINE DZM_MF ! @@ -30,8 +30,8 @@ SUBROUTINE MZF_MF(D, PA, PMZF) USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t IMPLICIT NONE TYPE(DIMPHYEX_t), INTENT(IN) :: D -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PA ! variable at flux side -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PMZF ! result at mass +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PA ! variable at flux side +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PMZF ! result at mass ! localization END SUBROUTINE MZF_MF ! @@ -39,17 +39,17 @@ SUBROUTINE MZM_MF(D, PA, PMZM) USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t IMPLICIT NONE TYPE(DIMPHYEX_t), INTENT(IN) :: D -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PA ! variable at mass localization -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PMZM ! result at flux localization +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PA ! variable at mass localization +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PMZM ! result at flux localization END SUBROUTINE MZM_MF ! SUBROUTINE GZ_M_W_MF(D, PY, PDZZ, PGZ_M_W) USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t IMPLICIT NONE TYPE(DIMPHYEX_t), INTENT(IN) :: D -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PDZZ ! Metric coefficient d*zz -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PY ! variable at mass localization -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PGZ_M_W ! result at flux side +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDZZ ! Metric coefficient d*zz +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PY ! variable at mass localization +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PGZ_M_W ! result at flux side END SUBROUTINE GZ_M_W_MF ! END INTERFACE @@ -110,14 +110,14 @@ IMPLICIT NONE ! ------------------------------------ ! TYPE(DIMPHYEX_t), INTENT(IN) :: D -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PA ! variable at flux side -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PMZF ! result at mass +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PA ! variable at flux side +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PMZF ! result at mass ! localization ! !* 0.2 Declarations of local variables ! ------------------------------- ! -INTEGER :: JK ! Loop index in z direction +INTEGER :: JK, JI ! ! !------------------------------------------------------------------------------- @@ -126,10 +126,14 @@ INTEGER :: JK ! Loop index in z direction ! ------------------ ! DO JK=2,D%NKT-1 - PMZF(:,JK) = 0.5*( PA(:,JK)+PA(:,JK+D%NKL) ) + !$mnh_expand_array(JI=D%NIJB:D%NIJE) + PMZF(D%NIJB:D%NIJE,JK) = 0.5*( PA(D%NIJB:D%NIJE,JK)+PA(D%NIJB:D%NIJE,JK+D%NKL) ) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE) END DO -PMZF(:,D%NKA) = 0.5*( PA(:,D%NKA)+PA(:,D%NKA+D%NKL) ) -PMZF(:,D%NKU) = PA(:,D%NKU) +!$mnh_expand_array(JI=D%NIJB:D%NIJE) +PMZF(D%NIJB:D%NIJE,D%NKA) = 0.5*( PA(D%NIJB:D%NIJE,D%NKA)+PA(D%NIJB:D%NIJE,D%NKA+D%NKL) ) +PMZF(D%NIJB:D%NIJE,D%NKU) = PA(D%NIJB:D%NIJE,D%NKU) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE) ! !------------------------------------------------------------------------------- ! @@ -188,13 +192,13 @@ IMPLICIT NONE ! ------------------------------------ ! TYPE(DIMPHYEX_t), INTENT(IN) :: D -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PA ! variable at mass localization -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PMZM ! result at flux localization +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PA ! variable at mass localization +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PMZM ! result at flux localization ! !* 0.2 Declarations of local variables ! ------------------------------- ! -INTEGER :: JK ! Loop index in z direction +INTEGER :: JK, JI ! ! !------------------------------------------------------------------------------- @@ -203,10 +207,14 @@ INTEGER :: JK ! Loop index in z direction ! ------------------ ! DO JK=2,D%NKT-1 - PMZM(:,JK) = 0.5*( PA(:,JK)+PA(:,JK-D%NKL) ) + !$mnh_expand_array(JI=D%NIJB:D%NIJE) + PMZM(D%NIJB:D%NIJE,JK) = 0.5*( PA(D%NIJB:D%NIJE,JK)+PA(D%NIJB:D%NIJE,JK-D%NKL) ) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE) END DO -PMZM(:,D%NKA) = PA(:,D%NKA) -PMZM(:,D%NKU) = 0.5*( PA(:,D%NKU)+PA(:,D%NKU-D%NKL) ) +!$mnh_expand_array(JI=D%NIJB:D%NIJE) +PMZM(D%NIJB:D%NIJE,D%NKA) = PA(D%NIJB:D%NIJE,D%NKA) +PMZM(D%NIJB:D%NIJE,D%NKU) = 0.5*( PA(D%NIJB:D%NIJE,D%NKU)+PA(D%NIJB:D%NIJE,D%NKU-D%NKL) ) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE) ! !------------------------------------------------------------------------------- ! @@ -265,14 +273,14 @@ IMPLICIT NONE ! ------------------------------------ ! TYPE(DIMPHYEX_t), INTENT(IN) :: D -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PA ! variable at flux side -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PDZF ! result at mass +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PA ! variable at flux side +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PDZF ! result at mass ! localization ! !* 0.2 Declarations of local variables ! ------------------------------- ! -INTEGER :: JK ! Loop index in z direction +INTEGER :: JK, JI ! !------------------------------------------------------------------------------- ! @@ -280,10 +288,14 @@ INTEGER :: JK ! Loop index in z direction ! ------------------ ! DO JK=2,D%NKT-1 - PDZF(:,JK) = PA(:,JK+D%NKL) - PA(:,JK) + !$mnh_expand_array(JI=D%NIJB:D%NIJE) + PDZF(D%NIJB:D%NIJE,JK) = PA(D%NIJB:D%NIJE,JK+D%NKL) - PA(D%NIJB:D%NIJE,JK) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE) END DO -PDZF(:,D%NKA) = PA(:,D%NKA+D%NKL) - PA(:,D%NKA) -PDZF(:,D%NKU) = 0. +!$mnh_expand_array(JI=D%NIJB:D%NIJE) +PDZF(D%NIJB:D%NIJE,D%NKA) = PA(D%NIJB:D%NIJE,D%NKA+D%NKL) - PA(D%NIJB:D%NIJE,D%NKA) +PDZF(D%NIJB:D%NIJE,D%NKU) = 0. +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE) ! !------------------------------------------------------------------------------- ! @@ -342,14 +354,14 @@ IMPLICIT NONE ! ------------------------------------ ! TYPE(DIMPHYEX_t), INTENT(IN) :: D -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PA ! variable at mass localization -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PDZM ! result at flux +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PA ! variable at mass localization +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PDZM ! result at flux ! side ! !* 0.2 Declarations of local variables ! ------------------------------- ! -INTEGER :: JK ! Loop index in z direction +INTEGER :: JK, JI ! !------------------------------------------------------------------------------- ! @@ -357,10 +369,14 @@ INTEGER :: JK ! Loop index in z direction ! ------------------ ! DO JK=2,D%NKT-1 - PDZM(:,JK) = PA(:,JK) - PA(:,JK-D%NKL) + !$mnh_expand_array(JI=D%NIJB:D%NIJE) + PDZM(D%NIJB:D%NIJE,JK) = PA(D%NIJB:D%NIJE,JK) - PA(D%NIJB:D%NIJE,JK-D%NKL) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE) END DO -PDZM(:,D%NKA) = 0. -PDZM(:,D%NKU) = PA(:,D%NKU) - PA(:,D%NKU-D%NKL) +!$mnh_expand_array(JI=D%NIJB:D%NIJE) +PDZM(D%NIJB:D%NIJE,D%NKA) = 0. +PDZM(D%NIJB:D%NIJE,D%NKU) = PA(D%NIJB:D%NIJE,D%NKU) - PA(D%NIJB:D%NIJE,D%NKU-D%NKL) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE) ! !------------------------------------------------------------------------------- ! @@ -420,24 +436,28 @@ IMPLICIT NONE ! ------------------------------------ ! TYPE(DIMPHYEX_t), INTENT(IN) :: D -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PDZZ ! Metric coefficient d*zz -REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PY ! variable at mass localization -REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PGZ_M_W ! result at flux side +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDZZ ! Metric coefficient d*zz +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PY ! variable at mass localization +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PGZ_M_W ! result at flux side ! !* 0.2 Declarations of local variables ! ------------------------------- ! -INTEGER JK +INTEGER JK, JI !------------------------------------------------------------------------------- ! !* 1. COMPUTE THE GRADIENT ALONG Z ! ----------------------------- ! DO JK=2,D%NKT-1 - PGZ_M_W(:,JK) = (PY(:,JK) - PY(:,JK-D%NKL)) / PDZZ(:,JK) + !$mnh_expand_array(JI=D%NIJB:D%NIJE) + PGZ_M_W(D%NIJB:D%NIJE,JK) = (PY(D%NIJB:D%NIJE,JK) - PY(D%NIJB:D%NIJE,JK-D%NKL)) / PDZZ(D%NIJB:D%NIJE,JK) + !$mnh_end_expand_array(JI=D%NIJB:D%NIJE) END DO -PGZ_M_W(:,D%NKA) = 0. -PGZ_M_W(:,D%NKU) = (PY(:,D%NKU) - PY(:,D%NKU-D%NKL)) / PDZZ(:,D%NKU) +!$mnh_expand_array(JI=D%NIJB:D%NIJE) +PGZ_M_W(D%NIJB:D%NIJE,D%NKA) = 0. +PGZ_M_W(D%NIJB:D%NIJE,D%NKU) = (PY(D%NIJB:D%NIJE,D%NKU) - PY(D%NIJB:D%NIJE,D%NKU-D%NKL)) / PDZZ(D%NIJB:D%NIJE,D%NKU) +!$mnh_end_expand_array(JI=D%NIJB:D%NIJE) ! !------------------------------------------------------------------------------- ! diff --git a/src/mesonh/aux/mode_fill_dimphyexn.F90 b/src/mesonh/aux/mode_fill_dimphyexn.F90 index 416d34ce3a3d4683cd03d1f595a005d8e6ea16ee..1f5cc3c3c3381f78a01fc9e4a6cc8c6e62028e83 100644 --- a/src/mesonh/aux/mode_fill_dimphyexn.F90 +++ b/src/mesonh/aux/mode_fill_dimphyexn.F90 @@ -6,7 +6,7 @@ MODULE MODE_FILL_DIMPHYEX IMPLICIT NONE CONTAINS -SUBROUTINE FILL_DIMPHYEX(YDDIMPHYEX, KIT, KJT, KKT, LTURB, OHPACK) +SUBROUTINE FILL_DIMPHYEX(YDDIMPHYEX, KIT, KJT, KKT, LTURB) ! ######################### ! !! @@ -48,38 +48,23 @@ TYPE(DIMPHYEX_t), INTENT(OUT) :: YDDIMPHYEX ! Structure to fill in INTEGER, INTENT(IN) :: KIT, KJT, KKT ! Array dimensions LOGICAL, INTENT(IN), OPTIONAL :: LTURB ! Flag to replace array dimensions I/JB and I/JE to the full array size ! needed if computation in HALO points (e.g. in turbulence) -LOGICAL, OPTIONAL, INTENT(IN) :: OHPACK ! True to pack both horizontal dimension into a single one LOGICAL :: YTURB ! !* 0.2 declaration of local variables ! REAL(KIND=JPRB) :: ZHOOK_HANDLE -LOGICAL :: LHPACK !------------------------------------------------------------------------------- ! IF (LHOOK) CALL DR_HOOK('FILL_DIMPHYEX', 0, ZHOOK_HANDLE) ! -IF(PRESENT(OHPACK)) THEN - LHPACK=OHPACK -ELSE - LHPACK=.FALSE. -ENDIF -IF(LHPACK) THEN - !Both horizontal dimensions are packed into a single one - !Computations are done on the entire array - YDDIMPHYEX%NIT=KIT*KJT - YDDIMPHYEX%NJT=1 - YDDIMPHYEX%NIB=1 - YDDIMPHYEX%NJB=1 - YDDIMPHYEX%NIE=KIT*KJT - YDDIMPHYEX%NJE=1 -ELSE - !Computations are done only on the physical domain - YDDIMPHYEX%NIT=KIT - YDDIMPHYEX%NJT=KJT - CALL GET_INDICE_ll(YDDIMPHYEX%NIB, YDDIMPHYEX%NJB,& - &YDDIMPHYEX%NIE, YDDIMPHYEX%NJE) -ENDIF +YDDIMPHYEX%NIT=KIT +YDDIMPHYEX%NJT=KJT +YDDIMPHYEX%NIJT=KIT*KJT +CALL GET_INDICE_ll(YDDIMPHYEX%NIB, YDDIMPHYEX%NJB,& + &YDDIMPHYEX%NIE, YDDIMPHYEX%NJE) +! +YDDIMPHYEX%NIJB=1 +YDDIMPHYEX%NIJE=KIT*KJT ! YDDIMPHYEX%NKL=1 YDDIMPHYEX%NKT=KKT diff --git a/src/mesonh/ext/shallow_mf_pack.f90 b/src/mesonh/ext/shallow_mf_pack.f90 index 73a1810be3d509d037a26c52efe5a0157d25a465..ab426cbaadf688b3e8d2718ee5aac39259aa2fcb 100644 --- a/src/mesonh/ext/shallow_mf_pack.f90 +++ b/src/mesonh/ext/shallow_mf_pack.f90 @@ -272,7 +272,7 @@ TYPE(DIMPHYEX_t) :: YLDIMPHYEXPACK !------------------------------------------------------------------------ !!! 1. Initialisation -CALL FILL_DIMPHYEX(YLDIMPHYEXPACK, SIZE(PZZ,1), SIZE(PZZ,2), SIZE(PZZ,3), OHPACK=.TRUE.) +CALL FILL_DIMPHYEX(YLDIMPHYEXPACK, SIZE(PZZ,1), SIZE(PZZ,2), SIZE(PZZ,3)) ! Internal Domain IIU=SIZE(PTHM,1)