diff --git a/src/common/turb/mode_compute_entr_detr.F90 b/src/common/turb/mode_compute_entr_detr.F90 index 77ef02bf56ab1911aa6a9a1dc9948e80473a9c9a..9f3d89ccbee9ca2f7b493c786f1c1de35bf29c30 100644 --- a/src/common/turb/mode_compute_entr_detr.F90 +++ b/src/common/turb/mode_compute_entr_detr.F90 @@ -81,7 +81,7 @@ USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALL_t ! USE MODE_TH_R_FROM_THL_RT_1D, ONLY: TH_R_FROM_THL_RT_1D ! -USE MODE_THERMO +!USE MODE_THERMO USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK diff --git a/src/common/turb/mode_compute_mf_cloud_bigaus.F90 b/src/common/turb/mode_compute_mf_cloud_bigaus.F90 index cc6818be72f6901dc1a9937bad5fb170d37c9959..0e1e0aa08a1e333ee94705118d88b672d76f2f88 100644 --- a/src/common/turb/mode_compute_mf_cloud_bigaus.F90 +++ b/src/common/turb/mode_compute_mf_cloud_bigaus.F90 @@ -62,9 +62,9 @@ USE MODD_CST, ONLY: CST_t USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALL_t ! USE MODI_SHUMAN_MF, ONLY: MZF_MF, GZ_M_W_MF -USE MODI_GAMMA_INC +!USE MODI_GAMMA_INC ! -USE MODE_THERMO +!USE MODE_THERMO ! USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK diff --git a/src/common/turb/mode_mf_turb.F90 b/src/common/turb/mode_mf_turb.F90 index 7f9e698ce2f108aa9b5fc33d8a6ccbfdaa2f0d40..4720c6753583c0c16517039683984340ea87a25e 100644 --- a/src/common/turb/mode_mf_turb.F90 +++ b/src/common/turb/mode_mf_turb.F90 @@ -8,7 +8,7 @@ ! IMPLICIT NONE CONTAINS - SUBROUTINE MF_TURB(KKA,KKB,KKE,KKU,KKL,OMIXUV, & + SUBROUTINE MF_TURB(D, KSV, OMIXUV, & ONOMIXLG,KSV_LGBEG,KSV_LGEND, & PIMPL, PTSTEP, & PDZZ, & @@ -62,26 +62,22 @@ CONTAINS !* 0. DECLARATIONS ! ------------ ! +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +! USE MODI_SHUMAN_MF, ONLY: MZM_MF USE MODE_TRIDIAG_MASSFLUX, ONLY: TRIDIAG_MASSFLUX ! USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK ! -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK -! IMPLICIT NONE ! ! !* 0.1 declarations of arguments ! ! -INTEGER, INTENT(IN) :: KKA ! near ground array index -INTEGER, INTENT(IN) :: KKB ! near ground physical index -INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index -INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +TYPE(DIMPHYEX_t), INTENT(IN) :: D +INTEGER, INTENT(IN) :: KSV 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 @@ -89,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(:,:), INTENT(IN) :: PDZZ ! metric coefficients +REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PDZZ ! metric coefficients -REAL, DIMENSION(:,:), INTENT(IN) :: PRHODJ ! dry density * Grid size +REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PRHODJ ! dry density * Grid size ! Conservative var. at t-dt -REAL, DIMENSION(:,:), INTENT(IN) :: PTHLM ! conservative pot. temp. -REAL, DIMENSION(:,:), INTENT(IN) :: PRTM ! water var. where +REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PTHLM ! conservative pot. temp. +REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PRTM ! water var. where ! Virtual potential temperature at t-dt -REAL, DIMENSION(:,:), INTENT(IN) :: PTHVM +REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PTHVM ! Momentum at t-dt -REAL, DIMENSION(:,:), INTENT(IN) :: PUM -REAL, DIMENSION(:,:), INTENT(IN) :: PVM +REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PUM +REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PVM ! scalar variables at t-dt -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSVM +REAL, DIMENSION(D%NIT,D%NKT,KSV), INTENT(IN) :: PSVM ! ! Tendencies of conservative variables -REAL, DIMENSION(:,:), INTENT(OUT) :: PTHLDT +REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PTHLDT -REAL, DIMENSION(:,:), INTENT(OUT) :: PRTDT +REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PRTDT ! Tendencies of momentum -REAL, DIMENSION(:,:), INTENT(OUT) :: PUDT -REAL, DIMENSION(:,:), INTENT(OUT) :: PVDT +REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PUDT +REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PVDT ! Tendencies of scalar variables -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSVDT +REAL, DIMENSION(D%NIT,D%NKT,KSV), INTENT(OUT) :: PSVDT ! Updraft characteritics -REAL, DIMENSION(:,:), INTENT(IN) :: PEMF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP -REAL, DIMENSION(:,:,:), INTENT(IN) :: PSV_UP +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 ! Fluxes -REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF +REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF -REAL, DIMENSION(:,:,:), INTENT(OUT):: PFLXZSVMF +REAL, DIMENSION(D%NIT,D%NKT,KSV), INTENT(OUT):: PFLXZSVMF ! ! ! @@ -130,8 +126,8 @@ REAL, DIMENSION(:,:,:), INTENT(OUT):: PFLXZSVMF ! 0.2 declaration of local variables ! -REAL, DIMENSION(SIZE(PTHLM,1),SIZE(PTHLM,2)) :: ZVARS -INTEGER :: ISV,JSV !number of scalar variables and Loop counter +REAL, DIMENSION(D%NIT,D%NKT) :: ZVARS +INTEGER :: JSV !number of scalar variables and Loop counter REAL(KIND=JPRB) :: ZHOOK_HANDLE ! !---------------------------------------------------------------------------- @@ -140,10 +136,6 @@ REAL(KIND=JPRB) :: ZHOOK_HANDLE ! ------------- ! IF (LHOOK) CALL DR_HOOK('MF_TURB',0,ZHOOK_HANDLE) -! -! number of scalar var -ISV=SIZE(PSVM,3) - ! PFLXZSVMF = 0. PSVDT = 0. @@ -158,15 +150,15 @@ PSVDT = 0. ! ( Resulting fluxes are in flux level (w-point) as PEMF and PTHL_UP ) ! -PFLXZTHMF(:,:) = PEMF(:,:)*(PTHL_UP(:,:)-MZM_MF(PTHLM(:,:), KKA, KKU, KKL)) +PFLXZTHMF(:,:) = PEMF(:,:)*(PTHL_UP(:,:)-MZM_MF(PTHLM(:,:), D%NKA, D%NKU, D%NKL)) -PFLXZRMF(:,:) = PEMF(:,:)*(PRT_UP(:,:)-MZM_MF(PRTM(:,:), KKA, KKU, KKL)) +PFLXZRMF(:,:) = PEMF(:,:)*(PRT_UP(:,:)-MZM_MF(PRTM(:,:), D%NKA, D%NKU, D%NKL)) -PFLXZTHVMF(:,:) = PEMF(:,:)*(PTHV_UP(:,:)-MZM_MF(PTHVM(:,:), KKA, KKU, KKL)) +PFLXZTHVMF(:,:) = PEMF(:,:)*(PTHV_UP(:,:)-MZM_MF(PTHVM(:,:), D%NKA, D%NKU, D%NKL)) IF (OMIXUV) THEN - PFLXZUMF(:,:) = PEMF(:,:)*(PU_UP(:,:)-MZM_MF(PUM(:,:), KKA, KKU, KKL)) - PFLXZVMF(:,:) = PEMF(:,:)*(PV_UP(:,:)-MZM_MF(PVM(:,:), KKA, KKU, KKL)) + PFLXZUMF(:,:) = PEMF(:,:)*(PU_UP(:,:)-MZM_MF(PUM(:,:), D%NKA, D%NKU, D%NKL)) + PFLXZVMF(:,:) = PEMF(:,:)*(PV_UP(:,:)-MZM_MF(PVM(:,:), D%NKA, D%NKU, D%NKL)) ELSE PFLXZUMF(:,:) = 0. PFLXZVMF(:,:) = 0. @@ -185,10 +177,10 @@ ENDIF ! 3.1 Compute the tendency for the conservative potential temperature ! (PDZZ and flux in w-point and PRHODJ is mass point, result in mass point) ! -CALL TRIDIAG_MASSFLUX(KKA,KKB,KKE,KKU,KKL,PTHLM,PFLXZTHMF,-PEMF,PTSTEP,PIMPL, & +CALL TRIDIAG_MASSFLUX(D,PTHLM,PFLXZTHMF,-PEMF,PTSTEP,PIMPL, & PDZZ,PRHODJ,ZVARS ) ! compute new flux -PFLXZTHMF(:,:) = PEMF(:,:)*(PTHL_UP(:,:)-MZM_MF(ZVARS(:,:), KKA, KKU, KKL)) +PFLXZTHMF(:,:) = PEMF(:,:)*(PTHL_UP(:,:)-MZM_MF(ZVARS(:,:), D%NKA, D%NKU, D%NKL)) !!! compute THL tendency ! @@ -197,10 +189,10 @@ PTHLDT(:,:)= (ZVARS(:,:)-PTHLM(:,:))/PTSTEP ! ! 3.2 Compute the tendency for the conservative mixing ratio ! -CALL TRIDIAG_MASSFLUX(KKA,KKB,KKE,KKU,KKL,PRTM(:,:),PFLXZRMF,-PEMF,PTSTEP,PIMPL, & +CALL TRIDIAG_MASSFLUX(D,PRTM(:,:),PFLXZRMF,-PEMF,PTSTEP,PIMPL, & PDZZ,PRHODJ,ZVARS ) ! compute new flux -PFLXZRMF(:,:) = PEMF(:,:)*(PRT_UP(:,:)-MZM_MF(ZVARS(:,:), KKA, KKU, KKL)) +PFLXZRMF(:,:) = PEMF(:,:)*(PRT_UP(:,:)-MZM_MF(ZVARS(:,:), D%NKA, D%NKU, D%NKL)) !!! compute RT tendency PRTDT(:,:) = (ZVARS(:,:)-PRTM(:,:))/PTSTEP @@ -212,10 +204,10 @@ IF (OMIXUV) THEN ! (PDZZ and flux in w-point and PRHODJ is mass point, result in mass point) ! - CALL TRIDIAG_MASSFLUX(KKA,KKB,KKE,KKU,KKL,PUM,PFLXZUMF,-PEMF,PTSTEP,PIMPL, & + CALL TRIDIAG_MASSFLUX(D,PUM,PFLXZUMF,-PEMF,PTSTEP,PIMPL, & PDZZ,PRHODJ,ZVARS ) ! compute new flux - PFLXZUMF(:,:) = PEMF(:,:)*(PU_UP(:,:)-MZM_MF(ZVARS(:,:), KKA, KKU, KKL)) + PFLXZUMF(:,:) = PEMF(:,:)*(PU_UP(:,:)-MZM_MF(ZVARS(:,:), D%NKA, D%NKU, D%NKL)) ! compute U tendency PUDT(:,:)= (ZVARS(:,:)-PUM(:,:))/PTSTEP @@ -226,10 +218,10 @@ IF (OMIXUV) THEN ! meridian momentum ! (PDZZ and flux in w-point and PRHODJ is mass point, result in mass point) ! - CALL TRIDIAG_MASSFLUX(KKA,KKB,KKE,KKU,KKL,PVM,PFLXZVMF,-PEMF,PTSTEP,PIMPL, & + CALL TRIDIAG_MASSFLUX(D,PVM,PFLXZVMF,-PEMF,PTSTEP,PIMPL, & PDZZ,PRHODJ,ZVARS ) ! compute new flux - PFLXZVMF(:,:) = PEMF(:,:)*(PV_UP(:,:)-MZM_MF(ZVARS(:,:), KKA, KKU, KKL)) + PFLXZVMF(:,:) = PEMF(:,:)*(PV_UP(:,:)-MZM_MF(ZVARS(:,:), D%NKA, D%NKU, D%NKL)) ! compute V tendency PVDT(:,:)= (ZVARS(:,:)-PVM(:,:))/PTSTEP @@ -238,23 +230,23 @@ ELSE PVDT(:,:)=0. ENDIF -DO JSV=1,ISV +DO JSV=1,KSV IF (ONOMIXLG .AND. JSV >= KSV_LGBEG .AND. JSV<= KSV_LGEND) CYCLE !* compute mean flux of scalar variables at time t-dt ! ( Resulting fluxes are in flux level (w-point) as PEMF and PTHL_UP ) - PFLXZSVMF(:,:,JSV) = PEMF(:,:)*(PSV_UP(:,:,JSV)-MZM_MF(PSVM(:,:,JSV), KKA, KKU, KKL)) + PFLXZSVMF(:,:,JSV) = PEMF(:,:)*(PSV_UP(:,:,JSV)-MZM_MF(PSVM(:,:,JSV), D%NKA, D%NKU, D%NKL)) ! ! 3.5 Compute the tendency for scalar variables ! (PDZZ and flux in w-point and PRHODJ is mass point, result in mass point) ! - CALL TRIDIAG_MASSFLUX(KKA,KKB,KKE,KKU,KKL,PSVM(:,:,JSV),PFLXZSVMF(:,:,JSV),& + CALL TRIDIAG_MASSFLUX(D,PSVM(:,:,JSV),PFLXZSVMF(:,:,JSV),& -PEMF,PTSTEP,PIMPL,PDZZ,PRHODJ,ZVARS ) ! compute new flux - PFLXZSVMF(:,:,JSV) = PEMF(:,:)*(PSV_UP(:,:,JSV)-MZM_MF(ZVARS, KKA, KKU, KKL)) + PFLXZSVMF(:,:,JSV) = PEMF(:,:)*(PSV_UP(:,:,JSV)-MZM_MF(ZVARS, D%NKA, D%NKU, D%NKL)) ! compute Sv tendency PSVDT(:,:,JSV)= (ZVARS(:,:)-PSVM(:,:,JSV))/PTSTEP diff --git a/src/common/turb/mode_mf_turb_expl.F90 b/src/common/turb/mode_mf_turb_expl.F90 index 2bff78e0aa035c9bf2d1427e5c674ec844d2be80..b865f5925d04c173ee1b13b9a0f5a424756ebba1 100644 --- a/src/common/turb/mode_mf_turb_expl.F90 +++ b/src/common/turb/mode_mf_turb_expl.F90 @@ -7,7 +7,7 @@ ! ###################### IMPLICIT NONE CONTAINS - SUBROUTINE MF_TURB_EXPL(KKA,KKB,KKE,KKU,KKL,OMIXUV, & + SUBROUTINE MF_TURB_EXPL(D, PARAMMF, OMIXUV, & PRHODJ, & PTHLM,PTHVM,PRTM,PUM,PVM, & PTHLDT,PRTDT,PUDT,PVDT, & @@ -51,10 +51,11 @@ CONTAINS ! !* 0. DECLARATIONS ! ------------ - +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALL_t +! USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK -USE MODD_PARAM_MFSHALL_n, ONLY: XLAMBDA_MF USE MODI_SHUMAN_MF, ONLY: MZM_MF IMPLICIT NONE @@ -63,43 +64,40 @@ IMPLICIT NONE !* 0.1 declarations of arguments -INTEGER, INTENT(IN) :: KKA ! near ground array index -INTEGER, INTENT(IN) :: KKB ! near ground physical index -INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index -INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise +TYPE(DIMPHYEX_t), INTENT(IN) :: D +TYPE(PARAM_MFSHALL_t), INTENT(IN) :: PARAMMF LOGICAL, INTENT(IN) :: OMIXUV ! True if mixing of momentum -REAL, DIMENSION(:,:), INTENT(IN) :: PRHODJ ! dry density * Grid size +REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PRHODJ ! dry density * Grid size ! Conservative var. at t-dt -REAL, DIMENSION(:,:), INTENT(IN) :: PTHLM ! conservative pot. temp. -REAL, DIMENSION(:,:), INTENT(IN) :: PRTM ! water var. where +REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PTHLM ! conservative pot. temp. +REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PRTM ! water var. where ! Virtual potential temperature at t-dt -REAL, DIMENSION(:,:), INTENT(IN) :: PTHVM +REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PTHVM ! Momentum at t-dt -REAL, DIMENSION(:,:), INTENT(IN) :: PUM -REAL, DIMENSION(:,:), INTENT(IN) :: PVM +REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PUM +REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PVM ! ! Tendencies of conservative variables -REAL, DIMENSION(:,:), INTENT(OUT) :: PTHLDT +REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PTHLDT -REAL, DIMENSION(:,:), INTENT(OUT) :: PRTDT +REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PRTDT ! Tendencies of momentum -REAL, DIMENSION(:,:), INTENT(OUT) :: PUDT -REAL, DIMENSION(:,:), INTENT(OUT) :: PVDT +REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PUDT +REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PVDT ! Updraft characteritics -REAL, DIMENSION(:,:), INTENT(IN) :: PEMF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP +REAL, DIMENSION(D%NIT,D%NKT), INTENT(IN) :: PEMF,PTHL_UP,PTHV_UP,PRT_UP,PU_UP,PV_UP ! Fluxes -REAL, DIMENSION(:,:), INTENT(OUT) :: PFLXZTHLMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF +REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT) :: PFLXZTHLMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF -REAL, DIMENSION(SIZE(PFLXZTHLMF,1),SIZE(PFLXZTHLMF,2)) :: ZFLXZTHSMF,ZTHS_UP,ZTHSM ! Theta S flux -REAL, DIMENSION(SIZE(PFLXZTHLMF,1),SIZE(PFLXZTHLMF,2)) :: ZQT_UP,ZQTM,ZTHSDT,ZQTDT -REAL, DIMENSION(SIZE(PFLXZTHLMF,1),SIZE(PFLXZTHLMF,2)) :: ZTHLM_F,ZRTM_F +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 INTEGER :: JK ! loop counter REAL(KIND=JPRB) :: ZHOOK_HANDLE @@ -130,22 +128,22 @@ PVDT = 0. ! ----------------------------------------------- ! ( Resulting fluxes are in flux level (w-point) as PEMF and PTHL_UP ) -ZRTM_F (:,:) = MZM_MF(PRTM (:,:), KKA, KKU, KKL) -ZTHLM_F(:,:) = MZM_MF(PTHLM(:,:), KKA, KKU, KKL) +ZRTM_F (:,:) = MZM_MF(PRTM (:,:), D%NKA, D%NKU, D%NKL) +ZTHLM_F(:,:) = MZM_MF(PTHLM(:,:), D%NKA, D%NKU, D%NKL) ZQTM (:,:) = ZRTM_F (:,:)/(1.+ZRTM_F (:,:)) ZQT_UP (:,:) = PRT_UP (:,:)/(1.+PRT_UP (:,:)) -ZTHS_UP(:,:) = PTHL_UP(:,:)*(1.+XLAMBDA_MF*ZQT_UP(:,:)) -ZTHSM (:,:) = ZTHLM_F(:,:)*(1.+XLAMBDA_MF*ZQTM(:,:)) +ZTHS_UP(:,:) = PTHL_UP(:,:)*(1.+PARAMMF%XLAMBDA_MF*ZQT_UP(:,:)) +ZTHSM (:,:) = ZTHLM_F(:,:)*(1.+PARAMMF%XLAMBDA_MF*ZQTM(:,:)) -PFLXZTHLMF(:,:) = PEMF(:,:)*(PTHL_UP(:,:)-MZM_MF(PTHLM(:,:), KKA, KKU, KKL)) ! ThetaL -PFLXZRMF(:,:) = PEMF(:,:)*(PRT_UP (:,:)-MZM_MF(PRTM (:,:), KKA, KKU, KKL)) ! Rt -PFLXZTHVMF(:,:) = PEMF(:,:)*(PTHV_UP(:,:)-MZM_MF(PTHVM(:,:), KKA, KKU, KKL)) ! ThetaV +PFLXZTHLMF(:,:) = PEMF(:,:)*(PTHL_UP(:,:)-MZM_MF(PTHLM(:,:), D%NKA, D%NKU, D%NKL)) ! ThetaL +PFLXZRMF(:,:) = PEMF(:,:)*(PRT_UP (:,:)-MZM_MF(PRTM (:,:), D%NKA, D%NKU, D%NKL)) ! Rt +PFLXZTHVMF(:,:) = PEMF(:,:)*(PTHV_UP(:,:)-MZM_MF(PTHVM(:,:), D%NKA, D%NKU, D%NKL)) ! ThetaV ZFLXZTHSMF(:,:) = PEMF(:,:)*(ZTHS_UP(:,:)-ZTHSM(:,:)) ! Theta S flux IF (OMIXUV) THEN - PFLXZUMF(:,:) = PEMF(:,:)*(PU_UP(:,:)-MZM_MF(PUM(:,:), KKA, KKU, KKL)) ! U - PFLXZVMF(:,:) = PEMF(:,:)*(PV_UP(:,:)-MZM_MF(PVM(:,:), KKA, KKU, KKL)) ! V + PFLXZUMF(:,:) = PEMF(:,:)*(PU_UP(:,:)-MZM_MF(PUM(:,:), D%NKA, D%NKU, D%NKL)) ! U + PFLXZVMF(:,:) = PEMF(:,:)*(PV_UP(:,:)-MZM_MF(PVM(:,:), D%NKA, D%NKU, D%NKL)) ! V ELSE PFLXZUMF(:,:) = 0. PFLXZVMF(:,:) = 0. @@ -158,18 +156,18 @@ ENDIF ! (explicit formulation) ! -------------------------------------------- -DO JK=KKB,KKE-KKL,KKL -! PTHLDT(:,JK) = (PFLXZTHLMF(:,JK ) - PFLXZTHLMF(:,JK+KKL)) / PRHODJ(:,JK) - PRTDT (:,JK) = (PFLXZRMF (:,JK ) - PFLXZRMF (:,JK+KKL)) / PRHODJ(:,JK) +DO JK=D%NKB,D%NKE-D%NKL,D%NKL +! PTHLDT(:,JK) = (PFLXZTHLMF(:,JK ) - PFLXZTHLMF(:,JK+D%NKL)) / PRHODJ(:,JK) + PRTDT (:,JK) = (PFLXZRMF (:,JK ) - PFLXZRMF (:,JK+D%NKL)) / PRHODJ(:,JK) ZQTDT (:,JK) = PRTDT (:,JK)/(1.+ ZRTM_F (:,JK)*ZRTM_F (:,JK)) - ZTHSDT(:,JK) = (ZFLXZTHSMF(:,JK ) - ZFLXZTHSMF(:,JK+KKL)) / PRHODJ(:,JK) - PTHLDT(:,JK) = ZTHSDT(:,JK)/(1.+XLAMBDA_MF*ZQTM(:,JK)) - ZTHLM_F(:,JK)*XLAMBDA_MF*ZQTDT(:,JK) + ZTHSDT(:,JK) = (ZFLXZTHSMF(:,JK ) - ZFLXZTHSMF(:,JK+D%NKL)) / PRHODJ(:,JK) + PTHLDT(:,JK) = ZTHSDT(:,JK)/(1.+PARAMMF%XLAMBDA_MF*ZQTM(:,JK)) - ZTHLM_F(:,JK)*PARAMMF%XLAMBDA_MF*ZQTDT(:,JK) END DO IF (OMIXUV) THEN - DO JK=KKB,KKE-KKL,KKL - PUDT(:,JK) = (PFLXZUMF(:,JK ) - PFLXZUMF(:,JK+KKL)) / PRHODJ(:,JK) - PVDT(:,JK) = (PFLXZVMF(:,JK ) - PFLXZVMF(:,JK+KKL)) / PRHODJ(:,JK) + DO JK=D%NKB,D%NKE-D%NKL,D%NKL + PUDT(:,JK) = (PFLXZUMF(:,JK ) - PFLXZUMF(:,JK+D%NKL)) / PRHODJ(:,JK) + PVDT(:,JK) = (PFLXZVMF(:,JK ) - PFLXZVMF(:,JK+D%NKL)) / PRHODJ(:,JK) END DO ENDIF diff --git a/src/common/turb/mode_tridiag_massflux.F90 b/src/common/turb/mode_tridiag_massflux.F90 index 915d75b936fd4131452da4cf5c7e41a9922390f5..230caa4c10014983e015a00b1e1575ac7e0bc88c 100644 --- a/src/common/turb/mode_tridiag_massflux.F90 +++ b/src/common/turb/mode_tridiag_massflux.F90 @@ -5,7 +5,7 @@ MODULE MODE_TRIDIAG_MASSFLUX IMPLICIT NONE CONTAINS -SUBROUTINE TRIDIAG_MASSFLUX(KKA,KKB,KKE,KKU,KKL,PVARM,PF,PDFDT,PTSTEP,PIMPL, & +SUBROUTINE TRIDIAG_MASSFLUX(D,PVARM,PF,PDFDT,PTSTEP,PIMPL, & PDZZ,PRHODJ,PVARP ) USE PARKIND1, ONLY : JPRB @@ -121,7 +121,8 @@ SUBROUTINE TRIDIAG_MASSFLUX(KKA,KKB,KKE,KKU,KKL,PVARM,PF,PDFDT,PTSTEP,PIMPL, & ! !* 0. DECLARATIONS ! -USE MODD_PARAMETERS, ONLY: JPVEXT +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +! USE MODI_SHUMAN_MF ! IMPLICIT NONE @@ -129,30 +130,26 @@ IMPLICIT NONE ! !* 0.1 declarations of arguments ! -INTEGER, INTENT(IN) :: KKA ! near ground array index -INTEGER, INTENT(IN) :: KKB ! near ground physical index -INTEGER, INTENT(IN) :: KKE ! uppest atmosphere physical index -INTEGER, INTENT(IN) :: KKU ! uppest atmosphere array index -INTEGER, INTENT(IN) :: KKL ! +1 if grid goes from ground to atmosphere top, -1 otherwise -REAL, DIMENSION(:,:), INTENT(IN) :: PVARM ! variable at t-1 at mass point -REAL, DIMENSION(:,:), INTENT(IN) :: PF ! flux in dT/dt=-dF/dz at flux point -REAL, DIMENSION(:,:), INTENT(IN) :: PDFDT ! dF/dT at flux point +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, INTENT(IN) :: PTSTEP ! Double time step REAL, INTENT(IN) :: PIMPL ! implicit weight -REAL, DIMENSION(:,:), INTENT(IN) :: PDZZ ! Dz at flux point -REAL, DIMENSION(:,:), INTENT(IN) :: PRHODJ ! (dry rho)*J at mass point +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(:,:), INTENT(OUT):: PVARP ! variable at t+1 at mass point +REAL, DIMENSION(D%NIT,D%NKT), INTENT(OUT):: PVARP ! variable at t+1 at mass point ! ! !* 0.2 declarations of local variables ! -REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2)) :: ZRHODJ_DFDT_O_DZ -REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2)) :: ZMZM_RHODJ -REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2)) :: ZA, ZB, ZC -REAL, DIMENSION(SIZE(PVARM,1),SIZE(PVARM,2)) :: ZY ,ZGAM +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 ! RHS of the equation, 3D work array -REAL, DIMENSION(SIZE(PVARM,1)) :: ZBET +REAL, DIMENSION(D%NIT) :: ZBET ! 2D work array INTEGER :: JK ! loop counter ! @@ -163,7 +160,7 @@ INTEGER :: JK ! loop counter ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('TRIDIAG_MASSFLUX',0,ZHOOK_HANDLE) -ZMZM_RHODJ = MZM_MF(PRHODJ, KKA, KKU, KKL) +ZMZM_RHODJ = MZM_MF(PRHODJ, D%NKA, D%NKU, D%NKL) ZRHODJ_DFDT_O_DZ = ZMZM_RHODJ*PDFDT/PDZZ ! ZA=0. @@ -175,30 +172,30 @@ ZY=0. !* 2. COMPUTE THE RIGHT HAND SIDE ! --------------------------- ! -ZY(:,KKB) = PRHODJ(:,KKB)*PVARM(:,KKB)/PTSTEP & - - ZMZM_RHODJ(:,KKB+KKL) * PF(:,KKB+KKL)/PDZZ(:,KKB+KKL) & - + ZMZM_RHODJ(:,KKB ) * PF(:,KKB )/PDZZ(:,KKB ) & - + ZRHODJ_DFDT_O_DZ(:,KKB+KKL) * 0.5*PIMPL * PVARM(:,KKB+KKL) & - + ZRHODJ_DFDT_O_DZ(:,KKB+KKL) * 0.5*PIMPL * PVARM(:,KKB ) +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 ) ! -DO JK=2+JPVEXT,SIZE(ZY,2)-JPVEXT-1 +DO JK=1+D%NKTB,D%NKTE-1 ZY(:,JK) = PRHODJ(:,JK)*PVARM(:,JK)/PTSTEP & - - ZMZM_RHODJ(:,JK+KKL) * PF(:,JK+KKL)/PDZZ(:,JK+KKL) & + - 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+KKL) * 0.5*PIMPL * PVARM(:,JK+KKL) & - + ZRHODJ_DFDT_O_DZ(:,JK+KKL) * 0.5*PIMPL * PVARM(:,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-KKL) + - ZRHODJ_DFDT_O_DZ(:,JK ) * 0.5*PIMPL * PVARM(:,JK-D%NKL) END DO ! -IF (JPVEXT==0) THEN - ZY(:,KKE) = PRHODJ(:,KKE)*PVARM(:,KKE)/PTSTEP +IF (D%NKE==D%NKU) THEN + ZY(:,D%NKE) = PRHODJ(:,D%NKE)*PVARM(:,D%NKE)/PTSTEP ELSE - ZY(:,KKE) = PRHODJ(:,KKE)*PVARM(:,KKE)/PTSTEP & - - ZMZM_RHODJ(:,KKE+KKL) * PF(:,KKE+KKL)/PDZZ(:,KKE+KKL) & - + ZMZM_RHODJ(:,KKE ) * PF(:,KKE )/PDZZ(:,KKE ) & - - ZRHODJ_DFDT_O_DZ(:,KKE ) * 0.5*PIMPL * PVARM(:,KKE ) & - - ZRHODJ_DFDT_O_DZ(:,KKE ) * 0.5*PIMPL * PVARM(:,KKE-KKL) + 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) ENDIF ! ! @@ -210,57 +207,57 @@ IF ( PIMPL > 1.E-10 ) THEN !* 3.1 arrays A, B, C ! -------------- ! - ZB(:,KKB) = PRHODJ(:,KKB)/PTSTEP & - + ZRHODJ_DFDT_O_DZ(:,KKB+KKL) * 0.5*PIMPL - ZC(:,KKB) = ZRHODJ_DFDT_O_DZ(:,KKB+KKL) * 0.5*PIMPL + 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 - DO JK=2+JPVEXT,SIZE(ZY,2)-JPVEXT-1 + 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+KKL) * 0.5*PIMPL & + + 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+KKL) * 0.5*PIMPL + ZC(:,JK) = ZRHODJ_DFDT_O_DZ(:,JK+D%NKL) * 0.5*PIMPL END DO - ZA(:,KKE) = - ZRHODJ_DFDT_O_DZ(:,KKE ) * 0.5*PIMPL - ZB(:,KKE) = PRHODJ(:,KKE)/PTSTEP & - - ZRHODJ_DFDT_O_DZ(:,KKE ) * 0.5*PIMPL + 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 ! !* 3.2 going up ! -------- ! - ZBET(:) = ZB(:,KKB) ! bet = b(KKB) - PVARP(:,KKB) = ZY(:,KKB) / ZBET(:) + ZBET(:) = ZB(:,D%NKB) ! bet = b(D%NKB) + PVARP(:,D%NKB) = ZY(:,D%NKB) / ZBET(:) ! - DO JK = KKB+KKL,KKE-KKL,KKL - ZGAM(:,JK) = ZC(:,JK-KKL) / ZBET(:) + DO JK = D%NKB+D%NKL,D%NKE-D%NKL,D%NKL + ZGAM(:,JK) = ZC(:,JK-D%NKL) / ZBET(:) ! gam(k) = c(k-1) / bet ZBET(:) = ZB(:,JK) - ZA(:,JK) * ZGAM(:,JK) ! bet = b(k) - a(k)* gam(k) - PVARP(:,JK)= ( ZY(:,JK) - ZA(:,JK) * PVARP(:,JK-KKL) ) / ZBET(:) + PVARP(:,JK)= ( ZY(:,JK) - ZA(:,JK) * PVARP(:,JK-D%NKL) ) / ZBET(:) ! res(k) = (y(k) -a(k)*res(k-1))/ bet END DO ! special treatment for the last level - ZGAM(:,KKE) = ZC(:,KKE-KKL) / ZBET(:) + ZGAM(:,D%NKE) = ZC(:,D%NKE-D%NKL) / ZBET(:) ! gam(k) = c(k-1) / bet - ZBET(:) = ZB(:,KKE) - ZA(:,KKE) * ZGAM(:,KKE) + ZBET(:) = ZB(:,D%NKE) - ZA(:,D%NKE) * ZGAM(:,D%NKE) ! bet = b(k) - a(k)* gam(k) - PVARP(:,KKE)= ( ZY(:,KKE) - ZA(:,KKE) * PVARP(:,KKE-KKL) ) / ZBET(:) + PVARP(:,D%NKE)= ( ZY(:,D%NKE) - ZA(:,D%NKE) * PVARP(:,D%NKE-D%NKL) ) / ZBET(:) ! res(k) = (y(k) -a(k)*res(k-1))/ bet ! !* 3.3 going down ! ---------- ! - DO JK = KKE-KKL,KKB,-KKL - PVARP(:,JK) = PVARP(:,JK) - ZGAM(:,JK+KKL) * PVARP(:,JK+KKL) + DO JK = D%NKE-D%NKL,D%NKB,-D%NKL + PVARP(:,JK) = PVARP(:,JK) - ZGAM(:,JK+D%NKL) * PVARP(:,JK+D%NKL) END DO ! ! ELSE !!! EXPLICIT FORMULATION ! - DO JK=1+JPVEXT,SIZE(PVARP,2)-JPVEXT + DO JK=D%NKTB,D%NKTE PVARP(:,JK) = ZY(:,JK) * PTSTEP / PRHODJ(:,JK) ENDDO ! @@ -270,8 +267,8 @@ END IF !* 4. FILL THE UPPER AND LOWER EXTERNAL VALUES ! ---------------------------------------- ! -PVARP(:,KKA)=PVARP(:,KKB) -PVARP(:,KKU)=PVARP(:,KKE) +PVARP(:,D%NKA)=PVARP(:,D%NKB) +PVARP(:,D%NKU)=PVARP(:,D%NKE) ! !------------------------------------------------------------------------------- ! diff --git a/src/common/turb/shallow_mf.F90 b/src/common/turb/shallow_mf.F90 index d210176b1a60619586daf01ac489462ee113f17f..6eef6acc9bd3a3377d5ce72733b9981e44ab2dca 100644 --- a/src/common/turb/shallow_mf.F90 +++ b/src/common/turb/shallow_mf.F90 @@ -286,7 +286,7 @@ CALL COMPUTE_MF_CLOUD(D, CST, PARAMMF, KRR, KRRL, KRRI, & ZEMF_O_RHODREF=PEMF/PRHODREF IF ( PIMPL_MF > 1.E-10 ) THEN - CALL MF_TURB(D%NKA,D%NKB,D%NKE,D%NKU,D%NKL, OMIXUV, & + CALL MF_TURB(D, KSV, OMIXUV, & ONOMIXLG,KSV_LGBEG,KSV_LGEND, & PIMPL_MF, PTSTEP, & PDZZ, & @@ -297,7 +297,7 @@ IF ( PIMPL_MF > 1.E-10 ) THEN PFLXZTHMF,PFLXZTHVMF,PFLXZRMF,PFLXZUMF,PFLXZVMF, & ZFLXZSVMF ) ELSE - CALL MF_TURB_EXPL(D%NKA,D%NKB,D%NKE,D%NKU,D%NKL, OMIXUV, & + CALL MF_TURB_EXPL(D, PARAMMF, OMIXUV, & PRHODJ, & ZTHLM,ZTHVM,ZRTM,PUM,PVM, & PDTHLDT_MF,PDRTDT_MF,PDUDT_MF,PDVDT_MF, &