diff --git a/src/common/micro/compute_frac_ice.func.h b/src/common/micro/compute_frac_ice.func.h index f63cfe5548499d148d97b967ea89afe934f7857c..8c6d4e617d519e2277d3a7defe3b11c95513cafc 100644 --- a/src/common/micro/compute_frac_ice.func.h +++ b/src/common/micro/compute_frac_ice.func.h @@ -30,13 +30,13 @@ CHARACTER(LEN=1), INTENT(IN) :: HFRAC_ICE ! scheme to use TYPE(NEB_t), INTENT(IN) :: NEB REAL, INTENT(IN) :: PT ! temperature REAL, INTENT(INOUT) :: PFRAC_ICE ! Ice fraction (1 for ice only, 0 for liquid only) -INTEGER, INTENT(OUT) :: KERR ! Error code in return +INTEGER, OPTIONAL, INTENT(OUT) :: KERR ! Error code in return ! !------------------------------------------------------------------------ ! 1. Compute FRAC_ICE ! -KERR=0 +IF (PRESENT(KERR)) KERR=0 SELECT CASE(HFRAC_ICE) CASE ('T') !using Temperature PFRAC_ICE = MAX( 0., MIN(1., (( NEB%XTMAXMIX - PT ) / ( NEB%XTMAXMIX - NEB%XTMINMIX )) ) ) ! freezing interval @@ -48,7 +48,7 @@ SELECT CASE(HFRAC_ICE) ! (almost) nothing to do PFRAC_ICE = MAX( 0., MIN(1., PFRAC_ICE ) ) CASE DEFAULT - KERR=1 + IF (PRESENT(KERR)) KERR=1 END SELECT END SUBROUTINE COMPUTE_FRAC_ICE diff --git a/src/common/turb/mode_compute_entr_detr.F90 b/src/common/turb/mode_compute_entr_detr.F90 index e0a5add791f07b7c2c43a1269580ccb8d1fedb81..9315bb751087c4f0eb781c4ea1bb600dee3c2ab4 100644 --- a/src/common/turb/mode_compute_entr_detr.F90 +++ b/src/common/turb/mode_compute_entr_detr.F90 @@ -79,8 +79,6 @@ USE MODD_CST, ONLY: CST_t USE MODD_NEB, ONLY: NEB_t 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 PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK @@ -172,6 +170,7 @@ REAL, DIMENSION(D%NIT) :: ZDZ_STOP,& ! Exact Height of the LCL above f ZTHV_PLUS_HALF ! Thv at flux point(kk+kkl) REAL :: ZDZ ! Delta Z used in computations INTEGER :: JI, JLOOP +REAL, DIMENSION(D%NIT, 16) :: ZBUF REAL(KIND=JPRB) :: ZHOOK_HANDLE !---------------------------------------------------------------------------------- @@ -286,10 +285,11 @@ ENDDO !but we are dealing with updraft and not mixture ZRCMIX(:)=PRC_UP(:) ZRIMIX(:)=PRI_UP(:) - CALL TH_R_FROM_THL_RT_1D(CST,NEB,D%NIT,HFRAC_ICE,ZFRAC_ICE,& + CALL TH_R_FROM_THL_RT(CST,NEB,D%NIT,HFRAC_ICE,ZFRAC_ICE,& PPRE_PLUS_HALF,PTHL_UP,PRT_UP,& ZTHMIX,ZRVMIX,ZRCMIX,ZRIMIX,& - ZRSATW, ZRSATI,OOCEAN=.FALSE.) + ZRSATW, ZRSATI,OOCEAN=.FALSE.,& + PBUF=ZBUF) ZTHV_UP_F2(:) = ZTHMIX(:)*(1.+ZRVORD*ZRVMIX(:))/(1.+PRT_UP(:)) ! Integral buoyancy for cloudy part @@ -363,19 +363,21 @@ DO JLOOP=1,SIZE(OTEST) ZMIXRT(JLOOP) = 0.1 ENDIF ENDDO - CALL TH_R_FROM_THL_RT_1D(CST,NEB,D%NIT,HFRAC_ICE,ZFRAC_ICE,& + CALL TH_R_FROM_THL_RT(CST,NEB,D%NIT,HFRAC_ICE,ZFRAC_ICE,& ZPRE,ZMIXTHL,ZMIXRT,& ZTHMIX,ZRVMIX,PRC_MIX,PRI_MIX,& - ZRSATW, ZRSATI,OOCEAN=.FALSE.) + ZRSATW, ZRSATI,OOCEAN=.FALSE.,& + PBUF=ZBUF) ZTHVMIX(:) = ZTHMIX(:)*(1.+ZRVORD*ZRVMIX(:))/(1.+ZMIXRT(:)) ! Compute cons then non cons. var. of mixture at the flux level KK+KKL with initial ZKIC ZMIXTHL(:) = ZKIC_INIT * 0.5*(PTHLM(:,KK)+PTHLM(:,KK+KKL))+(1. - ZKIC_INIT)*PTHL_UP(:) ZMIXRT(:) = ZKIC_INIT * 0.5*(PRTM(:,KK)+PRTM(:,KK+KKL))+(1. - ZKIC_INIT)*PRT_UP(:) - CALL TH_R_FROM_THL_RT_1D(CST,NEB,D%NIT,HFRAC_ICE,ZFRAC_ICE,& + CALL TH_R_FROM_THL_RT(CST,NEB,D%NIT,HFRAC_ICE,ZFRAC_ICE,& PPRE_PLUS_HALF,ZMIXTHL,ZMIXRT,& ZTHMIX,ZRVMIX,PRC_MIX,PRI_MIX,& - ZRSATW, ZRSATI,OOCEAN=.FALSE.) + ZRSATW, ZRSATI,OOCEAN=.FALSE.,& + PBUF=ZBUF) ZTHVMIX_F2(:) = ZTHMIX(:)*(1.+ZRVORD*ZRVMIX(:))/(1.+ZMIXRT(:)) !Computation of mean ZKIC over the cloudy part @@ -445,5 +447,8 @@ DO JLOOP=1,SIZE(OTEST) ENDDO IF (LHOOK) CALL DR_HOOK('COMPUTE_ENTR_DETR',1,ZHOOK_HANDLE) +CONTAINS +INCLUDE "th_r_from_thl_rt.func.h" +INCLUDE "compute_frac_ice.func.h" END SUBROUTINE COMPUTE_ENTR_DETR END MODULE MODE_COMPUTE_ENTR_DETR diff --git a/src/common/turb/mode_compute_mf_cloud_bigaus.F90 b/src/common/turb/mode_compute_mf_cloud_bigaus.F90 index bfe4f3a91e5014bfe13f43b342ad8209e04f6c62..da0e4f92bb261bd7e98c8221284b574255498d60 100644 --- a/src/common/turb/mode_compute_mf_cloud_bigaus.F90 +++ b/src/common/turb/mode_compute_mf_cloud_bigaus.F90 @@ -121,7 +121,7 @@ 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 +DO JK=D%NKB,D%NKE-D%NKL,D%NKL !Vertical integration over the entire column but only buoyant points are used !ZOMEGA_UP_M(:)=ZOMEGA_UP_M(:) + & ! ZEMF_M(:,JK) * & diff --git a/src/common/turb/mode_compute_updraft.F90 b/src/common/turb/mode_compute_updraft.F90 index 76c8df61cea7da482e8713da09a24d16b0b3337f..f5e2e5a74ce253e2e13d4f510ccf07bf2a2f58ac 100644 --- a/src/common/turb/mode_compute_updraft.F90 +++ b/src/common/turb/mode_compute_updraft.F90 @@ -74,7 +74,6 @@ USE MODD_TURB_n, ONLY: TURB_t USE MODD_CTURB, ONLY: CSTURB_t ! USE MODE_COMPUTE_ENTR_DETR, ONLY: COMPUTE_ENTR_DETR -USE MODE_TH_R_FROM_THL_RT_1D, ONLY: TH_R_FROM_THL_RT_1D USE MODI_SHUMAN_MF, ONLY: MZM_MF, MZF_MF, GZ_M_W_MF USE MODE_COMPUTE_BL89_ML, ONLY: COMPUTE_BL89_ML @@ -194,6 +193,7 @@ REAL, DIMENSION(D%NIT) :: ZSURF REAL, DIMENSION(D%NIT,D%NKT) :: ZSHEAR,ZDUDZ,ZDVDZ ! vertical wind shear ! REAL, DIMENSION(D%NIT,D%NKT) :: ZWK +REAL, DIMENSION(D%NIT,16) :: ZBUF ! REAL(KIND=JPRB) :: ZHOOK_HANDLE ! @@ -298,9 +298,10 @@ IF (OENTR_DETR) THEN ! (all or nothing ajustement) PRC_UP(:,D%NKB)=0. PRI_UP(:,D%NKB)=0. - CALL TH_R_FROM_THL_RT_1D(CST, NEB, D%NIT, HFRAC_ICE,PFRAC_ICE_UP(:,D%NKB),ZPRES_F(:,D%NKB), & + CALL TH_R_FROM_THL_RT(CST, NEB, D%NIT, 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.) + PRV_UP(:,D%NKB),PRC_UP(:,D%NKB),PRI_UP(:,D%NKB),ZRSATW(:),ZRSATI(:), OOCEAN=.FALSE., & + PBUF=ZBUF(:,:)) ! compute updraft thevav and buoyancy term at KKB level PTHV_UP(:,D%NKB) = ZTH_UP(:,D%NKB)*((1+ZRVORD*PRV_UP(:,D%NKB))/(1+PRT_UP(:,D%NKB))) @@ -492,9 +493,10 @@ DO JK=D%NKB,D%NKE-D%NKL,D%NKL ! Compute non cons. var. at level JK+KKL ZRC_UP(:)=PRC_UP(:,JK) ! guess = level just below ZRI_UP(:)=PRI_UP(:,JK) ! guess = level just below - CALL TH_R_FROM_THL_RT_1D(CST, NEB, D%NIT, HFRAC_ICE,PFRAC_ICE_UP(:,JK+D%NKL),ZPRES_F(:,JK+D%NKL), & + CALL TH_R_FROM_THL_RT(CST, NEB, D%NIT, 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.) + ZRV_UP(:),ZRC_UP(:),ZRI_UP(:),ZRSATW(:),ZRSATI(:), OOCEAN=.FALSE., & + PBUF=ZBUF(:,:)) WHERE(GTEST) PRC_UP(:,JK+D%NKL)=ZRC_UP(:) PRV_UP(:,JK+D%NKL)=ZRV_UP(:) @@ -588,5 +590,8 @@ IF(OENTR_DETR) THEN ENDIF IF (LHOOK) CALL DR_HOOK('COMPUTE_UPDRAFT',1,ZHOOK_HANDLE) +CONTAINS +INCLUDE "th_r_from_thl_rt.func.h" +INCLUDE "compute_frac_ice.func.h" END SUBROUTINE COMPUTE_UPDRAFT END MODULE MODE_COMPUTE_UPDRAFT diff --git a/src/common/turb/mode_compute_updraft_raha.F90 b/src/common/turb/mode_compute_updraft_raha.F90 index 3d35ad43ac14ccbb7a2db3975e8d75cd22da4544..f6818168e1722e9383e6aa1469a6e2c25f2f6a08 100644 --- a/src/common/turb/mode_compute_updraft_raha.F90 +++ b/src/common/turb/mode_compute_updraft_raha.F90 @@ -63,7 +63,6 @@ USE MODD_CST, ONLY: CST_t USE MODD_NEB, ONLY: NEB_t 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 MODI_SHUMAN_MF, ONLY: MZM_MF ! USE PARKIND1, ONLY : JPRB @@ -187,6 +186,7 @@ REAL, DIMENSION(D%NIT) :: 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(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('COMPUTE_UPDRAF_RAHA',0,ZHOOK_HANDLE) @@ -293,9 +293,10 @@ GTEST = (ZW_UP2(:,D%NKB) > ZEPS) PRC_UP(:,D%NKB)=0. PRI_UP(:,D%NKB)=0. -CALL TH_R_FROM_THL_RT_1D(CST,NEB, D%NIT, HFRAC_ICE,PFRAC_ICE_UP(:,D%NKB),ZPRES_F(:,D%NKB), & +CALL TH_R_FROM_THL_RT(CST,NEB, D%NIT, 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.) + PRV_UP(:,D%NKB),PRC_UP(:,D%NKB),PRI_UP(:,D%NKB),ZRSATW(:),ZRSATI(:),OOCEAN=.FALSE.,& + PBUF=ZBUF) ! compute updraft thevav and buoyancy term at KKB level PTHV_UP(:,D%NKB) = ZTH_UP(:,D%NKB)*((1+ZRVORD*PRV_UP(:,D%NKB))/(1+PRT_UP(:,D%NKB))) @@ -472,9 +473,10 @@ DO JK=D%NKB,D%NKE-D%NKL,D%NKL ZRC_UP(:)=PRC_UP(:,JK) ! guess = level just below ZRI_UP(:)=PRI_UP(:,JK) ! guess = level just below ZRV_UP(:)=PRV_UP(:,JK) - CALL TH_R_FROM_THL_RT_1D(CST,NEB, D%NIT, HFRAC_ICE,PFRAC_ICE_UP(:,JK+D%NKL),ZPRES_F(:,JK+D%NKL), & + CALL TH_R_FROM_THL_RT(CST,NEB, D%NIT, 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.) + ZRV_UP(:),ZRC_UP(:),ZRI_UP(:),ZRSATW(:),ZRSATI(:),OOCEAN=.FALSE.,& + PBUF=ZBUF) WHERE(GTEST) ZT_UP(:) = ZTH_UP(:,JK+D%NKL)*PEXNM(:,JK+D%NKL) ZCP(:) = CST%XCPD + CST%XCL * ZRC_UP(:) @@ -585,6 +587,10 @@ WHERE (GWORK2) ENDWHERE IF (LHOOK) CALL DR_HOOK('COMPUTE_UPDRAF_RAHA',1,ZHOOK_HANDLE) - +! +CONTAINS +INCLUDE "th_r_from_thl_rt.func.h" +INCLUDE "compute_frac_ice.func.h" +! END SUBROUTINE COMPUTE_UPDRAFT_RAHA END MODULE MODE_COMPUTE_UPDRAFT_RAHA diff --git a/src/common/turb/mode_compute_updraft_rhcj10.F90 b/src/common/turb/mode_compute_updraft_rhcj10.F90 index 57b31c12da1e44ce6770fb825cbaccddf045f90d..b5bfe8cf2f6965333331f8e898efee07a5c25f52 100644 --- a/src/common/turb/mode_compute_updraft_rhcj10.F90 +++ b/src/common/turb/mode_compute_updraft_rhcj10.F90 @@ -68,7 +68,6 @@ USE MODD_PARAM_MFSHALL_n, ONLY: PARAM_MFSHALL_t USE MODD_TURB_n, ONLY: TURB_t USE MODD_CTURB, ONLY: CSTURB_t ! -USE MODE_TH_R_FROM_THL_RT_1D, ONLY: TH_R_FROM_THL_RT_1D USE MODI_SHUMAN_MF, ONLY: MZF_MF, MZM_MF, GZ_M_W_MF USE MODE_COMPUTE_BL89_ML, ONLY: COMPUTE_BL89_ML @@ -192,6 +191,7 @@ REAL :: ZTMAX,ZRMAX, ZEPS ! control value REAL, DIMENSION(D%NIT,D%NKT) :: ZSHEAR,ZDUDZ,ZDVDZ ! vertical wind shear ! REAL, DIMENSION(D%NIT,D%NKT) :: ZWK +REAL, DIMENSION(D%NIT,16) :: ZBUF ! REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('COMPUTE_UPDRAFT_RHCJ10',0,ZHOOK_HANDLE) @@ -310,9 +310,10 @@ ZW_UP2(:,D%NKB) = MAX(0.0001,(2./3.)*ZTKEM_F(:,D%NKB)) PRC_UP(:,D%NKB)=0. PRI_UP(:,D%NKB)=0. -CALL TH_R_FROM_THL_RT_1D(CST,NEB,D%NIT,HFRAC_ICE,PFRAC_ICE_UP(:,D%NKB),ZPRES_F(:,D%NKB), & +CALL TH_R_FROM_THL_RT(CST,NEB,D%NIT,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.) + PRV_UP(:,D%NKB),PRC_UP(:,D%NKB),PRI_UP(:,D%NKB),ZRSATW(:),ZRSATI(:),OOCEAN=.FALSE.,& + PBUF=ZBUF) DO JI=1,D%NIT ! compute updraft thevav and buoyancy term at KKB level @@ -418,9 +419,10 @@ DO JK=D%NKB,D%NKE-D%NKL,D%NKL ZRC_UP(:) =PRC_UP(:,JK) ! guess ZRI_UP(:) =PRI_UP(:,JK) ! guess ZRV_UP(:) =PRV_UP(:,JK) - CALL TH_R_FROM_THL_RT_1D(CST,NEB, D%NIT, HFRAC_ICE,PFRAC_ICE_UP(:,JK),& + CALL TH_R_FROM_THL_RT(CST,NEB, D%NIT, 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.) + ZTH_UP(:,JK),ZRV_UP,ZRC_UP,ZRI_UP,ZRSATW(:),ZRSATI(:),OOCEAN=.FALSE.,& + PBUF=ZBUF) DO JI=1,D%NIT IF (GTEST(JI)) THEN @@ -518,9 +520,10 @@ DO JK=D%NKB,D%NKE-D%NKL,D%NKL ZRC_UP(:)=PRC_UP(:,JK) ! guess = level just below ZRI_UP(:)=PRI_UP(:,JK) ! guess = level just below ZRV_UP(:)=PRV_UP(:,JK) - CALL TH_R_FROM_THL_RT_1D(CST,NEB, D%NIT, HFRAC_ICE,PFRAC_ICE_UP(:,JK+D%NKL),ZPRES_F(:,JK+D%NKL), & + CALL TH_R_FROM_THL_RT(CST,NEB, D%NIT, 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.) + ZRV_UP(:),ZRC_UP(:),ZRI_UP(:),ZRSATW(:),ZRSATI(:),OOCEAN=.FALSE.,& + PBUF=ZBUF) DO JI=1,D%NIT IF(GTEST(JI)) THEN @@ -614,6 +617,10 @@ DO JK=1, D%NKT ENDDO IF (LHOOK) CALL DR_HOOK('COMPUTE_UPDRAFT_RHCJ10',1,ZHOOK_HANDLE) - +! +CONTAINS +INCLUDE "th_r_from_thl_rt.func.h" +INCLUDE "compute_frac_ice.func.h" +! END SUBROUTINE COMPUTE_UPDRAFT_RHCJ10 END MODULE MODE_COMPUTE_UPDRAFT_RHCJ10 diff --git a/src/common/turb/mode_th_r_from_thl_rt_1d.F90 b/src/common/turb/mode_th_r_from_thl_rt_1d.F90 deleted file mode 100644 index 1c974d8abab215de0b53bc4e82a2a465f781cc9f..0000000000000000000000000000000000000000 --- a/src/common/turb/mode_th_r_from_thl_rt_1d.F90 +++ /dev/null @@ -1,211 +0,0 @@ -!MNH_LIC Copyright 2006-2022 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -MODULE MODE_TH_R_FROM_THL_RT_1D -IMPLICIT NONE -CONTAINS - SUBROUTINE TH_R_FROM_THL_RT_1D(CST, NEB, KT, HFRAC_ICE,PFRAC_ICE,PP, & - PTHL, PRT, PTH, PRV, PRL, PRI, & - PRSATW, PRSATI, PRR, PRS, PRG, PRH,OOCEAN) -! ################################################################# -! -! -!!**** *TH_R_FROM_THL_RT_1D* - computes the non-conservative variables -!! from conservative variables -!! -!! PURPOSE -!! ------- -!! -!!** METHOD -!! ------ -!! -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! Julien PERGAUD * Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 13/03/06 -!! S. Riette April 2011 : ice added, allow ZRLTEMP to be negative -!! we use dQsat/dT to help convergence -!! use of optional PRR, PRS, PRG, PRH -!! S. Riette Nov 2016: support for HFRAC_ICE='S' -!! -!! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK -USE MODD_CST, ONLY : CST_t -USE MODD_NEB, ONLY : NEB_t -USE MODE_THERMO -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments -! -TYPE(CST_t), INTENT(IN) :: CST -TYPE(NEB_t), INTENT(IN) :: NEB -INTEGER, INTENT(IN) :: KT -CHARACTER(LEN=1), INTENT(IN) :: HFRAC_ICE -LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version -REAL, DIMENSION(KT), INTENT(INOUT) :: PFRAC_ICE -REAL, DIMENSION(KT), INTENT(IN) :: PP ! Pressure -REAL, DIMENSION(KT), INTENT(IN) :: PTHL ! thetal to transform into th -REAL, DIMENSION(KT),INTENT(IN) :: PRT ! Total mixing ratios to transform into rv,rc and ri -REAL, DIMENSION(KT),OPTIONAL,INTENT(IN) :: PRR, PRS, PRG, PRH -REAL, DIMENSION(KT), INTENT(OUT):: PTH ! th -REAL, DIMENSION(KT), INTENT(OUT):: PRV ! vapor mixing ratio -REAL, DIMENSION(KT), INTENT(INOUT):: PRL ! vapor mixing ratio -REAL, DIMENSION(KT), INTENT(INOUT):: PRI ! vapor mixing ratio -REAL, DIMENSION(KT), INTENT(OUT) :: PRSATW ! estimated mixing ration at saturation over water -REAL, DIMENSION(KT), INTENT(OUT) :: PRSATI ! estimated mixing ration at saturation over ice -! -!------------------------------------------------------------------------------- -! -! 0.2 declaration of local variables -INTEGER :: II ! Loop control -INTEGER :: JITER ! number of iterations -INTEGER :: J -REAL, DIMENSION(KT) :: ZEXN -REAL, DIMENSION(KT) :: ZRVSAT,ZCPH,ZRLTEMP,ZCPH2 -REAL, DIMENSION(KT) :: ZT,ZLVOCPEXN,ZLSOCPEXN -REAL, DIMENSION(KT) :: ZDRSATODT,ZDRSATODTW,ZDRSATODTI -REAL, DIMENSION(KT) :: ZFOESW, ZFOESI -REAL, DIMENSION(KT) :: ZLOGT, Z99PP, Z1PRT -REAL :: ZVAR1, ZVAR2, ZTPOW2, ZDELT -INTEGER, DIMENSION(KT) :: IERR - -REAL(KIND=JPRB) :: ZHOOK_HANDLE -!---------------------------------------------------------------------------- -! -!* 1 Initialisation -! -------------- -! -! -IF (LHOOK) CALL DR_HOOK('TH_R_FROM_THL_RT_1D',0,ZHOOK_HANDLE) -! -!Number of iterations -JITER=2 -! -!Computation of ZCPH2 depending on dummy arguments received -ZCPH2(:)=0 -IF(PRESENT(PRR)) ZCPH2(:)=ZCPH2(:) + CST%XCL*PRR(:) -IF(PRESENT(PRS)) ZCPH2(:)=ZCPH2(:) + CST%XCI*PRS(:) -IF(PRESENT(PRG)) ZCPH2(:)=ZCPH2(:) + CST%XCI*PRG(:) -IF(PRESENT(PRH)) ZCPH2(:)=ZCPH2(:) + CST%XCI*PRH(:) -! -!Computation of an approximate state thanks to PRL and PRI guess -ZEXN(:)=(PP(:)/CST%XP00) ** CST%RDSCPD - -DO J=1,KT - Z99PP(J)=0.99*PP(J) - PRV(J)=PRT(J)-PRL(J)-PRI(J) - ZCPH(J)=CST%XCPD+ CST%XCPV * PRV(J)+ CST%XCL * PRL(J) + CST%XCI * PRI(J) + ZCPH2(J) - ZVAR2=ZCPH(J)*ZEXN(J) - ZDELT=(PTHL(J)*ZEXN(J))-CST%XTT - ZLVOCPEXN(J) = (CST%XLVTT + (CST%XCPV-CST%XCL) * ZDELT) /ZVAR2 - ZLSOCPEXN(J) = (CST%XLSTT + (CST%XCPV-CST%XCI) * ZDELT) /ZVAR2 - PTH(J)=PTHL(J)+ZLVOCPEXN(J)*PRL(J)+ZLSOCPEXN(J)*PRI(J) - Z1PRT(J)=1+PRT(J) -ENDDO -! -! -! 2 Iteration -! --------- - -DO II=1,JITER - IF (OOCEAN) THEN - ZT=PTH - ELSE - ZT(:)=PTH(:)*ZEXN(:) - END IF - !Computation of liquid/ice fractions - PFRAC_ICE(:) = 0. - DO J=1, KT - IF(PRL(J)+PRI(J) > 1.E-20) THEN - PFRAC_ICE(J) = PRI(J) / (PRL(J)+PRI(J)) - ENDIF - ENDDO - CALL COMPUTE_FRAC_ICE(HFRAC_ICE,NEB,PFRAC_ICE(:),ZT(:), IERR(:)) - - !Computation of Rvsat and dRsat/dT - !In this version QSAT, QSATI, DQSAT and DQASATI functions are not used - !due to performance issue - - ! Log does not vectorize on all compilers: - ZLOGT(:)=LOG(ZT(:)) - - DO J=1,KT - ZFOESW(J) = MIN(EXP( CST%XALPW - CST%XBETAW/ZT(J) - CST%XGAMW*ZLOGT(J) ), Z99PP(J)) - ZFOESI(J) = MIN(EXP( CST%XALPI - CST%XBETAI/ZT(J) - CST%XGAMI*ZLOGT(J) ), Z99PP(J)) - PRSATW(J) = CST%XRD/CST%XRV*ZFOESW(J)/PP(J) / (1.+(CST%XRD/CST%XRV-1.)*ZFOESW(J)/PP(J)) - PRSATI(J) = CST%XRD/CST%XRV*ZFOESI(J)/PP(J) / (1.+(CST%XRD/CST%XRV-1.)*ZFOESI(J)/PP(J)) - ZTPOW2=ZT(J)**2 - ZDRSATODTW(J) = PRSATW(J) / (1.+(CST%XRD/CST%XRV-1.)*ZFOESW(J)/PP(J) ) & - * (CST%XBETAW/ZTPOW2 - CST%XGAMW/ZT(J))*Z1PRT(J) - ZDRSATODTI(J) = PRSATI(J) / (1.+(CST%XRD/CST%XRV-1.)*ZFOESI(J)/PP(J) ) & - * (CST%XBETAI/ZTPOW2 - CST%XGAMI/ZT(J))*Z1PRT(J) - !PRSATW(J) = QSAT(ZT(J),PP(J)) !qsatw - !PRSATI(J) = QSATI(ZT(J),PP(J)) !qsati - !ZDRSATODTW(J) = DQSAT(ZT(J),PP(J),PRSATW(J))*Z1PRT(J) - !ZDRSATODTI(J) = DQSATI(ZT(J),PP(J),PRSATI(J))*Z1PRT(J) - PRSATW(J) = PRSATW(J)*Z1PRT(J) - PRSATI(J) = PRSATI(J)*Z1PRT(J) - ZRVSAT(J) = PRSATW(J)*(1-PFRAC_ICE(J)) + PRSATI(J)*PFRAC_ICE(J) - ZDRSATODT(J) = (ZDRSATODTW(J)*(1-PFRAC_ICE(J))+ & - & ZDRSATODTI(J)*PFRAC_ICE(J)) - - !Computation of new PRL, PRI and PRV - !Correction term applied to (PRV(J)-ZRVSAT(J)) is computed assuming that - !ZLVOCPEXN, ZLSOCPEXN and ZCPH don't vary to much with T. It takes into account - !the variation (estimated linear) of Qsat with T - ZRLTEMP(J)=(PRV(J)-ZRVSAT(J))/ & - &(1 + ZDRSATODT(J)*ZEXN(J)* & - & (ZLVOCPEXN(J)*(1-PFRAC_ICE(J))+ZLSOCPEXN(J)*PFRAC_ICE(J))) - ZRLTEMP(J)=MIN(MAX(-PRL(J)-PRI(J), ZRLTEMP(J)),PRV(J)) - PRV(J)=PRV(J)-ZRLTEMP(J) - PRL(J)=PRL(J)+PRI(J)+ZRLTEMP(J) - PRI(J)=PFRAC_ICE(J) * (PRL(J)) - PRL(J)=(1-PFRAC_ICE(J)) * (PRT(J) - PRV(J)) - - !Computation of Cph (as defined in Meso-NH doc, equation 2.2, to be used with mixing ratios) - ZCPH(J)=CST%XCPD+ CST%XCPV * PRV(J)+ CST%XCL * PRL(J) + CST%XCI * PRI(J) + ZCPH2(J) - - !Computation of L/Cph/EXN, then new PTH - ZVAR2=ZCPH(J)*ZEXN(J) - ZLVOCPEXN(J) = (CST%XLVTT + (CST%XCPV-CST%XCL) * (ZT(J)-CST%XTT)) /ZVAR2 - ZLSOCPEXN(J) = (CST%XLSTT + (CST%XCPV-CST%XCI) * (ZT(J)-CST%XTT)) /ZVAR2 - PTH(J)=PTHL(J)+ZLVOCPEXN(J)*PRL(J)+ZLSOCPEXN(J)*PRI(J) - - !Computation of estimated mixing ration at saturation - !To compute the adjustement a first order development was used - ZVAR1=PTH(J)*ZEXN(J)-ZT(J) - PRSATW(J)=PRSATW(J) + ZDRSATODTW(J)*ZVAR1 - PRSATI(J)=PRSATI(J) + ZDRSATODTI(J)*ZVAR1 - ENDDO -ENDDO - -IF (LHOOK) CALL DR_HOOK('TH_R_FROM_THL_RT_1D',1,ZHOOK_HANDLE) - -! -CONTAINS -INCLUDE "compute_frac_ice.func.h" -! -END SUBROUTINE TH_R_FROM_THL_RT_1D -END MODULE MODE_TH_R_FROM_THL_RT_1D diff --git a/src/common/turb/mode_th_r_from_thl_rt_2d.F90 b/src/common/turb/mode_th_r_from_thl_rt_2d.F90 deleted file mode 100644 index c4911018a8fba842c010932302d1dd557b3c46e9..0000000000000000000000000000000000000000 --- a/src/common/turb/mode_th_r_from_thl_rt_2d.F90 +++ /dev/null @@ -1,114 +0,0 @@ -!MNH_LIC Copyright 2006-2022 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -MODULE MODE_TH_R_FROM_THL_RT_2D -IMPLICIT NONE -CONTAINS - SUBROUTINE TH_R_FROM_THL_RT_2D(HFRAC_ICE,PFRAC_ICE,PP, & - PTHL, PRT, PTH, PRV, PRL, PRI, & - PRSATW, PRSATI, PRR, PRS, PRG, PRH,OOCEAN) -! ################################################################# -! -! -!!**** *TH_R_FROM_THL_RT_2D* - computes the non-conservative variables -!! from conservative variables -!! -!! PURPOSE -!! ------- -!! -!!** METHOD -!! ------ -!! -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! Julien PERGAUD * Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 13/03/06 -!! Sébastien Riette April 2011: code moved in th_r_from_thl_rt_1D -!! -!! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -! -USE MODE_TH_R_FROM_THL_RT_3D, ONLY: TH_R_FROM_THL_RT_3D -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK -USE MODD_CST, ONLY: CST -USE MODD_NEB, ONLY: NEB - -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments -! -CHARACTER(LEN=1), INTENT(IN) :: HFRAC_ICE -REAL, DIMENSION(:,:), INTENT(INOUT) :: PFRAC_ICE -REAL, DIMENSION(:,:), INTENT(IN) :: PP ! Pressure -REAL, DIMENSION(:,:), INTENT(IN) :: PTHL ! Liquid pot. temp. -REAL, DIMENSION(:,:), INTENT(IN) :: PRT ! Total mixing ratios -REAL, DIMENSION(:,:),OPTIONAL,INTENT(IN) :: PRR, PRS, PRG, PRH -REAL, DIMENSION(:,:), INTENT(OUT):: PTH ! Potential temp. -REAL, DIMENSION(:,:), INTENT(OUT):: PRV ! vapor mixing ratio -REAL, DIMENSION(:,:), INTENT(INOUT):: PRL ! cloud mixing ratio -REAL, DIMENSION(:,:), INTENT(INOUT):: PRI ! ice mixing ratio -REAL, DIMENSION(:,:), INTENT(OUT) :: PRSATW ! estimated mixing ration at saturation over water -REAL, DIMENSION(:,:), INTENT(OUT) :: PRSATI ! estimated mixing ration at saturation over ice -LOGICAL, INTENT(IN) :: OOCEAN ! switch OCEAN version - -! -!------------------------------------------------------------------------------- -! -! 0.2 declaration of local variables -! -!---------------------------------------------------------------------------- -! -REAL, DIMENSION(SIZE(PP,1),SIZE(PP,2)) :: ZRR, ZRS, ZRG, ZRH -REAL(KIND=JPRB) :: ZHOOK_HANDLE -INTEGER :: JK -!---------------------------------------------------------------------------- -! -!* 1 Initialisation -! -------------- -! -IF (LHOOK) CALL DR_HOOK('TH_R_FROM_THL_RT_2D',0,ZHOOK_HANDLE) -ZRR(:,:)=0. -ZRS(:,:)=0. -ZRG(:,:)=0. -ZRH(:,:)=0. -IF(PRESENT(PRR)) ZRR(:,:)=PRR(:,:) -IF(PRESENT(PRS)) ZRS(:,:)=PRS(:,:) -IF(PRESENT(PRG)) ZRG(:,:)=PRG(:,:) -IF(PRESENT(PRH)) ZRH(:,:)=PRH(:,:) -! -! -! 2 Call of 1d version -! ------------------ -DO JK=1, SIZE(PTHL,2) - CALL TH_R_FROM_THL_RT_1D(CST, NEB, SIZE(PTHL,2), HFRAC_ICE,PFRAC_ICE(:,JK),PP(:,JK), & - PTHL(:,JK), PRT(:,JK), PTH(:,JK), & - PRV(:,JK), PRL(:,JK), PRI(:,JK), & - PRSATW(:,JK), PRSATI(:,JK), & - ZRR(:,JK), ZRS(:,JK), ZRG(:,JK), ZRH(:,JK),OOCEAN) -ENDDO - -IF (LHOOK) CALL DR_HOOK('TH_R_FROM_THL_RT_2D',1,ZHOOK_HANDLE) - -END SUBROUTINE TH_R_FROM_THL_RT_2D -END MODULE MODE_TH_R_FROM_THL_RT_2D - diff --git a/src/common/turb/mode_th_r_from_thl_rt_3d.F90 b/src/common/turb/mode_th_r_from_thl_rt_3d.F90 deleted file mode 100644 index 2c1733ce9dda37de77a20a615c06feb43f40999b..0000000000000000000000000000000000000000 --- a/src/common/turb/mode_th_r_from_thl_rt_3d.F90 +++ /dev/null @@ -1,110 +0,0 @@ -!MNH_LIC Copyright 2006-2022 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -MODULE MODE_TH_R_FROM_THL_RT_3D -IMPLICIT NONE -CONTAINS - SUBROUTINE TH_R_FROM_THL_RT_3D(HFRAC_ICE,PFRAC_ICE,PP, & - PTHL, PRT, PTH, PRV, PRL, PRI, & - PRSATW, PRSATI, PRR, PRS, PRG, PRH,OOCEAN) -! ################################################################# -! -! -!!**** *TH_R_FROM_THL_RT_3D* - computes the non-conservative variables -!! from conservative variables -!! -!! PURPOSE -!! ------- -!! -!!** METHOD -!! ------ -!! -!! -!! EXTERNAL -!! -------- -!! -!! IMPLICIT ARGUMENTS -!! ------------------ -!! -!! -!! REFERENCE -!! --------- -!! -!! AUTHOR -!! ------ -!! Julien PERGAUD * Meteo-France * -!! -!! MODIFICATIONS -!! ------------- -!! Original 15/03/2011 -!! S. Riette April 2011 : code moved in th_r_from_thl_rt_1d -!! -!! -------------------------------------------------------------------------- -! -!* 0. DECLARATIONS -! ------------ -! -USE MODE_TH_R_FROM_THL_RT_1D, ONLY: TH_R_FROM_THL_RT_1D -USE PARKIND1, ONLY : JPRB -USE YOMHOOK , ONLY : LHOOK, DR_HOOK -USE MODD_CST, ONLY : CST -USE MODD_NEB, ONLY : NEB -! -IMPLICIT NONE -! -! -!* 0.1 declarations of arguments -! -CHARACTER(LEN=1), INTENT(IN) :: HFRAC_ICE -REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PFRAC_ICE -REAL, DIMENSION(:,:,:), INTENT(IN) :: PP ! Pressure -REAL, DIMENSION(:,:,:), INTENT(IN) :: PTHL ! thetal to transform into th -REAL, DIMENSION(:,:,:),INTENT(IN) :: PRT ! Total mixing ratios to transform into rv,rc and ri -REAL, DIMENSION(:,:,:),OPTIONAL,INTENT(IN) :: PRR, PRS, PRG, PRH -REAL, DIMENSION(:,:,:), INTENT(OUT):: PTH ! th -REAL, DIMENSION(:,:,:), INTENT(OUT):: PRV ! vapor mixing ratio -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PRL ! vapor mixing ratio -REAL, DIMENSION(:,:,:), INTENT(INOUT):: PRI ! vapor mixing ratio -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRSATW ! estimated mixing ration at saturation over water -REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRSATI ! estimated mixing ration at saturation over ice -LOGICAL, INTENT(IN) :: OOCEAN ! switch OCEAN version -! -!------------------------------------------------------------------------------- -! -! 0.2 declaration of local variables -REAL, DIMENSION(SIZE(PTHL,1),SIZE(PTHL,2),SIZE(PTHL,3)) :: ZRR, ZRS, ZRG, ZRH -REAL(KIND=JPRB) :: ZHOOK_HANDLE -INTEGER :: JJ, JK -!---------------------------------------------------------------------------- -! -!* 1 Initialisation -! -------------- -! -IF (LHOOK) CALL DR_HOOK('TH_R_FROM_THL_RT_3D',0,ZHOOK_HANDLE) -ZRR(:,:,:)=0. -ZRS(:,:,:)=0. -ZRG(:,:,:)=0. -ZRH(:,:,:)=0. -IF(PRESENT(PRR)) ZRR(:,:,:)=PRR(:,:,:) -IF(PRESENT(PRS)) ZRS(:,:,:)=PRS(:,:,:) -IF(PRESENT(PRG)) ZRG(:,:,:)=PRG(:,:,:) -IF(PRESENT(PRH)) ZRH(:,:,:)=PRH(:,:,:) -! -! -! 2 Call of 1d version -! ------------------ -DO JK=1, SIZE(PTHL,3) - DO JJ=1, SIZE(PTHL,2) - CALL TH_R_FROM_THL_RT_1D(CST, NEB, SIZE(PTHL,2), HFRAC_ICE,PFRAC_ICE(:,JJ,JK),PP(:,JJ,JK), & - PTHL(:,JJ,JK), PRT(:,JJ,JK), PTH(:,JJ,JK), & - PRV(:,JJ,JK), PRL(:,JJ,JK), PRI(:,JJ,JK), & - PRSATW(:,JJ,JK), PRSATI(:,JJ,JK), & - ZRR(:,JJ,JK), ZRS(:,JJ,JK), ZRG(:,JJ,JK), ZRH(:,JJ,JK),OOCEAN) - ENDDO -ENDDO - -IF (LHOOK) CALL DR_HOOK('TH_R_FROM_THL_RT_3D',1,ZHOOK_HANDLE) - -END SUBROUTINE TH_R_FROM_THL_RT_3D -END MODULE MODE_TH_R_FROM_THL_RT_3D diff --git a/src/common/turb/th_r_from_thl_rt.func.h b/src/common/turb/th_r_from_thl_rt.func.h new file mode 100644 index 0000000000000000000000000000000000000000..62cbcd5c79fd7af3ac78ffaf24ed9c13783a754c --- /dev/null +++ b/src/common/turb/th_r_from_thl_rt.func.h @@ -0,0 +1,197 @@ +!MNH_LIC Copyright 2006-2022 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. + SUBROUTINE TH_R_FROM_THL_RT(CST, NEB, KT, HFRAC_ICE,PFRAC_ICE,PP, & + PTHL, PRT, PTH, PRV, PRL, PRI, & + PRSATW, PRSATI, PRR, PRS, PRG, PRH, OOCEAN,& + PBUF) +! ******* TO BE INCLUDED IN THE *CONTAINS* OF A SUBROUTINE, IN ORDER TO EASE AUTOMATIC INLINING ****** +! => Don't use drHook !!! +! "compute_frac_ice.func.h" must be included at the same time +! ################################################################# +! +! +!!**** *TH_R_FROM_THL_RT* - computes the non-conservative variables +!! from conservative variables +!! +!! PURPOSE +!! ------- +!! +!!** METHOD +!! ------ +!! +!! +!! EXTERNAL +!! -------- +!! +!! IMPLICIT ARGUMENTS +!! ------------------ +!! +!! +!! REFERENCE +!! --------- +!! +!! AUTHOR +!! ------ +!! Julien PERGAUD * Meteo-France * +!! +!! MODIFICATIONS +!! ------------- +!! Original 13/03/06 +!! S. Riette April 2011 : ice added, allow ZRLTEMP to be negative +!! we use dQsat/dT to help convergence +!! use of optional PRR, PRS, PRG, PRH +!! S. Riette Nov 2016: support for HFRAC_ICE='S' +!! +!! -------------------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE MODD_CST, ONLY : CST_t +USE MODD_NEB, ONLY : NEB_t +! +IMPLICIT NONE +! +! +!* 0.1 declarations of arguments +! +TYPE(CST_t), INTENT(IN) :: CST +TYPE(NEB_t), INTENT(IN) :: NEB +INTEGER, INTENT(IN) :: KT +CHARACTER(LEN=1), INTENT(IN) :: HFRAC_ICE +LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version +REAL, DIMENSION(KT), INTENT(INOUT) :: PFRAC_ICE +REAL, DIMENSION(KT), INTENT(IN) :: PP ! Pressure +REAL, DIMENSION(KT), INTENT(IN) :: PTHL ! thetal to transform into th +REAL, DIMENSION(KT),INTENT(IN) :: PRT ! Total mixing ratios to transform into rv,rc and ri +REAL, DIMENSION(KT),OPTIONAL,INTENT(IN) :: PRR, PRS, PRG, PRH +REAL, DIMENSION(KT), INTENT(OUT):: PTH ! th +REAL, DIMENSION(KT), INTENT(OUT):: PRV ! vapor mixing ratio +REAL, DIMENSION(KT), INTENT(INOUT):: PRL ! vapor mixing ratio +REAL, DIMENSION(KT), INTENT(INOUT):: PRI ! vapor mixing ratio +REAL, DIMENSION(KT), INTENT(OUT) :: PRSATW ! estimated mixing ration at saturation over water +REAL, DIMENSION(KT), INTENT(OUT) :: PRSATI ! estimated mixing ration at saturation over ice +REAL, DIMENSION(KT, 16), INTENT(OUT) :: PBUF ! buffer to replace automatic arrays +! +!------------------------------------------------------------------------------- +! +! 0.2 declaration of local variables +INTEGER :: II ! Loop control +INTEGER :: JITER ! number of iterations +INTEGER :: J +INTEGER, PARAMETER :: IEXN=1, IRVSAT=2, ICPH=3, IRLTEMP=4, ICPH2=5, IT=6, ILVOCPEXN=7, ILSOCPEXN=8, & + & IDRSATODT=9, IDRSATODTW=10, IDRSATODTI=11, IFOESW=12, IFOESI=13, & + & ILOGT=14, I99PP=15, I1PRT=16 +REAL :: ZVAR1, ZVAR2, ZTPOW2, ZDELT + +!---------------------------------------------------------------------------- +! +!* 1 Initialisation +! -------------- +! +! +! +!Number of iterations +JITER=2 +! +!Computation of PBUF(:, ICPH2) depending on dummy arguments received +PBUF(:, ICPH2)=0 +IF(PRESENT(PRR)) PBUF(:, ICPH2)=PBUF(:, ICPH2) + CST%XCL*PRR(:) +IF(PRESENT(PRS)) PBUF(:, ICPH2)=PBUF(:, ICPH2) + CST%XCI*PRS(:) +IF(PRESENT(PRG)) PBUF(:, ICPH2)=PBUF(:, ICPH2) + CST%XCI*PRG(:) +IF(PRESENT(PRH)) PBUF(:, ICPH2)=PBUF(:, ICPH2) + CST%XCI*PRH(:) +! +!Computation of an approximate state thanks to PRL and PRI guess +PBUF(:, IEXN)=(PP(:)/CST%XP00) ** CST%RDSCPD + +DO J=1,KT + PBUF(J, I99PP)=0.99*PP(J) + PRV(J)=PRT(J)-PRL(J)-PRI(J) + PBUF(J, ICPH)=CST%XCPD+ CST%XCPV * PRV(J)+ CST%XCL * PRL(J) + CST%XCI * PRI(J) + PBUF(J, ICPH2) + ZVAR2=PBUF(J, ICPH)*PBUF(J, IEXN) + ZDELT=(PTHL(J)*PBUF(J, IEXN))-CST%XTT + PBUF(J, ILVOCPEXN) = (CST%XLVTT + (CST%XCPV-CST%XCL) * ZDELT) /ZVAR2 + PBUF(J, ILSOCPEXN) = (CST%XLSTT + (CST%XCPV-CST%XCI) * ZDELT) /ZVAR2 + PTH(J)=PTHL(J)+PBUF(J, ILVOCPEXN)*PRL(J)+PBUF(J, ILSOCPEXN)*PRI(J) + PBUF(J, I1PRT)=1+PRT(J) +ENDDO +! +! +! 2 Iteration +! --------- + +DO II=1,JITER + IF (OOCEAN) THEN + PBUF(:, IT)=PTH(:) + ELSE + PBUF(:, IT)=PTH(:)*PBUF(:, IEXN) + END IF + !Computation of liquid/ice fractions + PFRAC_ICE(:) = 0. + DO J=1, KT + IF(PRL(J)+PRI(J) > 1.E-20) THEN + PFRAC_ICE(J) = PRI(J) / (PRL(J)+PRI(J)) + ENDIF + ENDDO + CALL COMPUTE_FRAC_ICE(HFRAC_ICE,NEB,PFRAC_ICE(:),PBUF(:, IT)) + + !Computation of Rvsat and dRsat/dT + !In this version QSAT, QSATI, DQSAT and DQASATI functions are not used + !due to performance issue + + ! Log does not vectorize on all compilers: + PBUF(:, ILOGT)=LOG(PBUF(:, IT)) + + DO J=1,KT + PBUF(J, IFOESW) = MIN(EXP( CST%XALPW - CST%XBETAW/PBUF(J, IT) - CST%XGAMW*PBUF(J, ILOGT) ), PBUF(J, I99PP)) + PBUF(J, IFOESI) = MIN(EXP( CST%XALPI - CST%XBETAI/PBUF(J, IT) - CST%XGAMI*PBUF(J, ILOGT) ), PBUF(J, I99PP)) + PRSATW(J) = CST%XRD/CST%XRV*PBUF(J, IFOESW)/PP(J) / (1.+(CST%XRD/CST%XRV-1.)*PBUF(J, IFOESW)/PP(J)) + PRSATI(J) = CST%XRD/CST%XRV*PBUF(J, IFOESI)/PP(J) / (1.+(CST%XRD/CST%XRV-1.)*PBUF(J, IFOESI)/PP(J)) + ZTPOW2=PBUF(J, IT)**2 + PBUF(J, IDRSATODTW) = PRSATW(J) / (1.+(CST%XRD/CST%XRV-1.)*PBUF(J, IFOESW)/PP(J) ) & + * (CST%XBETAW/ZTPOW2 - CST%XGAMW/PBUF(J, IT))*PBUF(J, I1PRT) + PBUF(J, IDRSATODTI) = PRSATI(J) / (1.+(CST%XRD/CST%XRV-1.)*PBUF(J, IFOESI)/PP(J) ) & + * (CST%XBETAI/ZTPOW2 - CST%XGAMI/PBUF(J, IT))*PBUF(J, I1PRT) + !PRSATW(J) = QSAT(PBUF(J, IT),PP(J)) !qsatw + !PRSATI(J) = QSATI(PBUF(J, IT),PP(J)) !qsati + !PBUF(J, IDRSATODTW) = DQSAT(PBUF(J, IT),PP(J),PRSATW(J))*PBUF(J, I1PRT) + !PBUF(J, IDRSATODTI) = DQSATI(PBUF(J, IT),PP(J),PRSATI(J))*PBUF(J, I1PRT) + PRSATW(J) = PRSATW(J)*PBUF(J, I1PRT) + PRSATI(J) = PRSATI(J)*PBUF(J, I1PRT) + PBUF(J, IRVSAT) = PRSATW(J)*(1-PFRAC_ICE(J)) + PRSATI(J)*PFRAC_ICE(J) + PBUF(J, IDRSATODT) = (PBUF(J, IDRSATODTW)*(1-PFRAC_ICE(J))+ & + & PBUF(J, IDRSATODTI)*PFRAC_ICE(J)) + + !Computation of new PRL, PRI and PRV + !Correction term applied to (PRV(J)-PBUF(J, IRVSAT)) is computed assuming that + !PBUF(J, ILVOCPEXN), PBUF(J, ILSOCPEXN) and PBUF(J, ICPH) don't vary to much with T. It takes into account + !the variation (estimated linear) of Qsat with T + PBUF(J, IRLTEMP)=(PRV(J)-PBUF(J, IRVSAT))/ & + &(1 + PBUF(J, IDRSATODT)*PBUF(J, IEXN)* & + & (PBUF(J, ILVOCPEXN)*(1-PFRAC_ICE(J))+PBUF(J, ILSOCPEXN)*PFRAC_ICE(J))) + PBUF(J, IRLTEMP)=MIN(MAX(-PRL(J)-PRI(J), PBUF(J, IRLTEMP)),PRV(J)) + PRV(J)=PRV(J)-PBUF(J, IRLTEMP) + PRL(J)=PRL(J)+PRI(J)+PBUF(J, IRLTEMP) + PRI(J)=PFRAC_ICE(J) * (PRL(J)) + PRL(J)=(1-PFRAC_ICE(J)) * (PRT(J) - PRV(J)) + + !Computation of Cph (as defined in Meso-NH doc, equation 2.2, to be used with mixing ratios) + PBUF(J, ICPH)=CST%XCPD+ CST%XCPV * PRV(J)+ CST%XCL * PRL(J) + CST%XCI * PRI(J) + PBUF(J, ICPH2) + + !Computation of L/Cph/EXN, then new PTH + ZVAR2=PBUF(J, ICPH)*PBUF(J, IEXN) + PBUF(J, ILVOCPEXN) = (CST%XLVTT + (CST%XCPV-CST%XCL) * (PBUF(J, IT)-CST%XTT)) /ZVAR2 + PBUF(J, ILSOCPEXN) = (CST%XLSTT + (CST%XCPV-CST%XCI) * (PBUF(J, IT)-CST%XTT)) /ZVAR2 + PTH(J)=PTHL(J)+PBUF(J, ILVOCPEXN)*PRL(J)+PBUF(J, ILSOCPEXN)*PRI(J) + + !Computation of estimated mixing ration at saturation + !To compute the adjustement a first order development was used + ZVAR1=PTH(J)*PBUF(J, IEXN)-PBUF(J, IT) + PRSATW(J)=PRSATW(J) + PBUF(J, IDRSATODTW)*ZVAR1 + PRSATI(J)=PRSATI(J) + PBUF(J, IDRSATODTI)*ZVAR1 + ENDDO +ENDDO + +END SUBROUTINE TH_R_FROM_THL_RT diff --git a/src/mesonh/ext/ice_adjust_bis.f90 b/src/mesonh/ext/ice_adjust_bis.f90 index c6f72a0868eee72ac6bd97ad98e4d3bd692529b2..44ab0c680b6d689ab050c53ddd39ec799bf0b100 100644 --- a/src/mesonh/ext/ice_adjust_bis.f90 +++ b/src/mesonh/ext/ice_adjust_bis.f90 @@ -65,10 +65,10 @@ END MODULE MODI_ICE_ADJUST_BIS !* 0. DECLARATIONS ! ------------ ! -USE MODD_CST, ONLY : XCPD, XRD, XP00 +USE MODD_CST, ONLY : XCPD, XRD, XP00, CST +USE MODD_NEB, ONLY : NEB ! USE MODI_COMPUTE_FUNCTION_THERMO -USE MODE_TH_R_FROM_THL_RT_3D USE MODI_THLRT_FROM_THRVRCRI ! USE MODE_ll @@ -89,6 +89,7 @@ REAL, DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)) :: ZTHL, ZRW, ZRV, ZRC, & ZRI, ZWORK REAL, DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)) :: ZFRAC_ICE, ZRSATW, ZRSATI REAL, DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)) :: ZT, ZEXN, ZLVOCPEXN,ZLSOCPEXN +REAL, DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3), 16) :: ZBUF INTEGER :: IRR CHARACTER(LEN=1) :: YFRAC_ICE ! @@ -127,10 +128,11 @@ CALL COMPUTE_FUNCTION_THERMO( IRR, & CALL THLRT_FROM_THRVRCRI( IRR, PTH, PR, ZLVOCPEXN, ZLSOCPEXN,& ZTHL, ZRW ) ! -CALL TH_R_FROM_THL_RT_3D(YFRAC_ICE,ZFRAC_ICE(:,:,:),PP(:,:,:), & +CALL TH_R_FROM_THL_RT(CST, NEB, SIZE(ZFRAC_ICE), YFRAC_ICE,ZFRAC_ICE(:,:,:),PP(:,:,:), & ZTHL(:,:,:), ZRW(:,:,:), PTH(:,:,:), & ZRV(:,:,:), ZRC(:,:,:), ZRI(:,:,:), & - ZRSATW(:,:,:), ZRSATI(:,:,:),OOCEAN=.FALSE.) + ZRSATW(:,:,:), ZRSATI(:,:,:),OOCEAN=.FALSE.,& + PBUF=ZBUF) CALL ADD3DFIELD_ll( TZFIELDS_ll, PTH, 'ICE_ADJUST_BIS::PTH') IF (IRR>=1) THEN CALL ADD3DFIELD_ll( TZFIELDS_ll, ZRV, 'ICE_ADJUST_BIS::ZRV' ) @@ -152,4 +154,7 @@ PR(:,:,:,2) = ZRC(:,:,:) IF (IRR>=4) & PR(:,:,:,4) = ZRI(:,:,:) ! +CONTAINS +INCLUDE "th_r_from_thl_rt.func.h" +INCLUDE "compute_frac_ice.func.h" END SUBROUTINE ICE_ADJUST_BIS diff --git a/src/mesonh/ext/prep_ideal_case.f90 b/src/mesonh/ext/prep_ideal_case.f90 index a1c1ec6c6a4d7ab52ea4549f93ffc4a35a2deb5b..7a1b8787e20d1a285ca8977ac578783f49181674 100644 --- a/src/mesonh/ext/prep_ideal_case.f90 +++ b/src/mesonh/ext/prep_ideal_case.f90 @@ -416,7 +416,6 @@ USE MODD_SUB_MODEL_n USE MODE_MNH_TIMING USE MODN_CONFZ !JUAN -USE MODE_TH_R_FROM_THL_RT_3D ! USE MODI_VERSION USE MODI_INIT_PGD_SURF_ATM @@ -431,6 +430,7 @@ USE MODI_SET_RELFRC ! USE MODI_INI_CST USE MODI_INI_NEB +USE MODD_NEB, ONLY: NEB USE MODI_WRITE_HGRID USE MODD_MPIF USE MODD_VAR_ll @@ -556,6 +556,7 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZXHAT_ll, ZYHAT_ll REAL, DIMENSION(:,:,:), ALLOCATABLE ::ZTHL,ZT,ZRT,ZFRAC_ICE,& ZEXN,ZLVOCPEXN,ZLSOCPEXN,ZCPH, & ZRSATW, ZRSATI +REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZBUF ! variables for adjustement REAL :: ZDIST ! @@ -1667,6 +1668,7 @@ IF (CIDEAL == 'RSOU') THEN ALLOCATE(ZFRAC_ICE(NIU,NJU,NKU)) ALLOCATE(ZRSATW(NIU,NJU,NKU)) ALLOCATE(ZRSATI(NIU,NJU,NKU)) + ALLOCATE(ZBUF(NIU,NJU,NKU,16)) ZRT=XRT(:,:,:,1)+XRT(:,:,:,2)+XRT(:,:,:,4) IF (LOCEAN) THEN ZEXN(:,:,:)= 1. @@ -1682,8 +1684,9 @@ ELSE ZLVOCPEXN = (XLVTT + (XCPV-XCL) * (ZT-XTT))/(ZCPH*ZEXN) ZLSOCPEXN = (XLSTT + (XCPV-XCI) * (ZT-XTT))/(ZCPH*ZEXN) ZTHL=XTHT-ZLVOCPEXN*XRT(:,:,:,2)-ZLSOCPEXN*XRT(:,:,:,4) - CALL TH_R_FROM_THL_RT_3D('T',ZFRAC_ICE,XPABST,ZTHL,ZRT,XTHT,XRT(:,:,:,1), & - XRT(:,:,:,2),XRT(:,:,:,4),ZRSATW, ZRSATI,OOCEAN=.FALSE.) + CALL TH_R_FROM_THL_RT(CST, NEB, SIZE(ZFRAC_ICE), 'T',ZFRAC_ICE,XPABST,ZTHL,ZRT,XTHT,XRT(:,:,:,1), & + XRT(:,:,:,2),XRT(:,:,:,4),ZRSATW, ZRSATI,OOCEAN=.FALSE.,& + PBUF=ZBUF) END IF DEALLOCATE(ZEXN) DEALLOCATE(ZT) @@ -1692,6 +1695,7 @@ END IF DEALLOCATE(ZLSOCPEXN) DEALLOCATE(ZTHL) DEALLOCATE(ZRT) + DEALLOCATE(ZBUF) ! Coherence test IF ((.NOT. LUSERI) ) THEN IF (MAXVAL(XRT(:,:,:,4))/= 0) THEN @@ -1930,4 +1934,8 @@ WRITE(NLUOUT,FMT=*) '****************************************************' ! CALL FINALIZE_MNH() ! +! +CONTAINS +INCLUDE "th_r_from_thl_rt.func.h" +INCLUDE "compute_frac_ice.func.h" END PROGRAM PREP_IDEAL_CASE diff --git a/src/mesonh/ext/set_rsou.f90 b/src/mesonh/ext/set_rsou.f90 index 8943cfbcde9ada76f156fb26f2a44b1a176ad123..352af8a53b1efdaca9aa28ef28c9658ef2d27ef5 100644 --- a/src/mesonh/ext/set_rsou.f90 +++ b/src/mesonh/ext/set_rsou.f90 @@ -283,7 +283,6 @@ USE MODI_PRESS_HEIGHT USE MODI_SET_MASS USE MODI_SHUMAN USE MODI_THETAVPU_THETAVPM -USE MODE_TH_R_FROM_THL_RT_1D USE MODI_VERT_COORD ! USE NETCDF ! for reading the NR files @@ -375,6 +374,7 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZFRAC_ICE ! ice fraction REAL, DIMENSION(:), ALLOCATABLE :: ZRSATW, ZRSATI REAL :: ZDZSDH,ZDZ1SDH,ZDZ2SDH ! interpolation ! working arrays +REAL, DIMENSION(:,:), ALLOCATABLE :: ZBUF ! INTEGER :: JK,JKLEV,JKU,JKM,JKT,JJ,JI,JO,JLOOP ! Loop indexes INTEGER :: IKU ! Upper bound in z direction @@ -1574,6 +1574,7 @@ ALLOCATE(ZFRAC_ICE(IKU)) ALLOCATE(ZRSATW(IKU)) ALLOCATE(ZRSATI(IKU)) ALLOCATE(ZMRT(IKU)) +ALLOCATE(ZBUF(IKU,16)) ZMRT=ZMRM+ZMRCM+ZMRIM ZTHVM=ZTHLM ! @@ -1593,8 +1594,9 @@ ELSE DO JLOOP=1,20 ! loop for pression CALL COMPUTE_EXNER_FROM_GROUND(ZTHVM,ZZMASS_PROFILE(:),ZEXNSURF,ZEXNFLUX,ZEXNMASS) ZPRESS(:)=XP00*(ZEXNMASS(:))**(XCPD/XRD) - CALL TH_R_FROM_THL_RT_1D(CST,NEB,SIZE(ZPRESS,1),'T',ZFRAC_ICE,ZPRESS,ZTHLM,ZMRT,ZTHM,ZMRM,ZMRCM,ZMRIM, & - ZRSATW, ZRSATI,OOCEAN=.FALSE.) + CALL TH_R_FROM_THL_RT(CST,NEB,SIZE(ZPRESS,1),'T',ZFRAC_ICE,ZPRESS,ZTHLM,ZMRT,ZTHM,ZMRM,ZMRCM,ZMRIM, & + ZRSATW, ZRSATI,OOCEAN=.FALSE.,& + PBUF=ZBUF) ZTHVM(:)=ZTHM(:)*(1.+XRV/XRD*ZMRM(:))/(1.+(ZMRM(:)+ZMRIM(:)+ZMRCM(:))) ENDDO ENDIF @@ -1606,6 +1608,7 @@ DEALLOCATE(ZFRAC_ICE) DEALLOCATE(ZRSATW) DEALLOCATE(ZRSATI) DEALLOCATE(ZMRT) +DEALLOCATE(ZBUF) !------------------------------------------------------------------------------- ! !* 4. COMPUTE FIELDS ON THE MODEL GRID (WITH OROGRAPHY) @@ -1630,5 +1633,8 @@ CONTAINS CALL PRINT_MSG( NVERB_ERROR, 'IO', 'SET_RSOU', 'error at ' // Trim( yloc) // ': ' // NF90_STRERROR( ISTATUS ) ) END IF END SUBROUTINE check -! + ! + INCLUDE "th_r_from_thl_rt.func.h" + INCLUDE "compute_frac_ice.func.h" + ! END SUBROUTINE SET_RSOU