diff --git a/src/MNH/default_desfmn.f90 b/src/MNH/default_desfmn.f90 index 783bad812b268012a3888a4a6089814fb275244e..0597b379c5aeca8cd26e19d71a7b33d4fa478296 100644 --- a/src/MNH/default_desfmn.f90 +++ b/src/MNH/default_desfmn.f90 @@ -895,6 +895,8 @@ IF (KMI == 1) THEN LDEPOSC = .FALSE. XVDEPOSC= 0.02 ! 2 cm/s LSNOW_T=.FALSE. + LPACK_INTERP=.TRUE. + LPACK_MICRO=.TRUE. ! Meso-NH does not work with LPACK_MICRO=.FALSE. END IF ! !------------------------------------------------------------------------------- diff --git a/src/MNH/phys_paramn.f90 b/src/MNH/phys_paramn.f90 index e94400bedbdec4ccb3e551a056dcb944ed15e1f5..275e7eca4ed889e565eafd2cdb9ddc19f63d760d 100644 --- a/src/MNH/phys_paramn.f90 +++ b/src/MNH/phys_paramn.f90 @@ -1584,7 +1584,7 @@ END IF NSV, NSV_LGBEG, NSV_LGEND,CPROGRAM, & NSV_LIMA_NR, NSV_LIMA_NS, NSV_LIMA_NG, NSV_LIMA_NH, & L2D, LNOMIXLG,LFLAT, & - LCOUPLES, LBLOWSNOW, LIBM, & + LCOUPLES, LBLOWSNOW, LIBM,LFLYER, & GCOMPUTE_SRC, XRSNOW, & LOCEAN, LDEEPOC, LDIAG_IN_RUN, & CTURBLEN_CLOUD, CCLOUD, & diff --git a/src/MNH/resolved_cloud.f90 b/src/MNH/resolved_cloud.f90 index 275735ad4619a18591c04982befd70e0cc9d0b68..2ab08f041204aeff43b7d3cdd2f003c06a640dd0 100644 --- a/src/MNH/resolved_cloud.f90 +++ b/src/MNH/resolved_cloud.f90 @@ -477,12 +477,10 @@ REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: ZZZ ! INTEGER :: ISVBEG ! first scalar index for microphysics INTEGER :: ISVEND ! last scalar index for microphysics -REAL, DIMENSION(:), ALLOCATABLE :: ZRSMIN ! Minimum value for tendencies !UPG*PT REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZSVT ! scalar variable for microphysics only !UPG*PT -LOGICAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)):: LLMICRO ! mask to limit computation REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3), KRR) :: ZFPR ! INTEGER :: JMOD, JMOD_IFN @@ -579,10 +577,6 @@ END IF !UPG*PT ! -IF (HCLOUD(1:3)=='ICE' .AND. LRED) THEN - ALLOCATE(ZRSMIN(SIZE(XRTMIN))) - ZRSMIN(:) = XRTMIN(:) / PTSTEP -END IF ! !* 2. TRANSFORMATION INTO PHYSICAL TENDENCIES ! --------------------------------------- @@ -832,22 +826,9 @@ SELECT CASE ( HCLOUD ) PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF ) ENDIF IF (LRED) THEN - LLMICRO(:,:,:) = .FALSE. - LLMICRO(IIB:IIE,IJB:IJE,IKB:IKE)=PRT(IIB:IIE,IJB:IJE,IKB:IKE,2)>XRTMIN(2) .OR. & - PRT(IIB:IIE,IJB:IJE,IKB:IKE,3)>XRTMIN(3) .OR. & - PRT(IIB:IIE,IJB:IJE,IKB:IKE,4)>XRTMIN(4) .OR. & - PRT(IIB:IIE,IJB:IJE,IKB:IKE,5)>XRTMIN(5) .OR. & - PRT(IIB:IIE,IJB:IJE,IKB:IKE,6)>XRTMIN(6) - LLMICRO(IIB:IIE,IJB:IJE,IKB:IKE)=LLMICRO(IIB:IIE,IJB:IJE,IKB:IKE) .OR. & - PRS(IIB:IIE,IJB:IJE,IKB:IKE,2)>ZRSMIN(2) .OR. & - PRS(IIB:IIE,IJB:IJE,IKB:IKE,3)>ZRSMIN(3) .OR. & - PRS(IIB:IIE,IJB:IJE,IKB:IKE,4)>ZRSMIN(4) .OR. & - PRS(IIB:IIE,IJB:IJE,IKB:IKE,5)>ZRSMIN(5) .OR. & - PRS(IIB:IIE,IJB:IJE,IKB:IKE,6)>ZRSMIN(6) CALL RAIN_ICE (YLDIMPHYEX,CST, PARAM_ICE, RAIN_ICE_PARAM, RAIN_ICE_DESCR,TBUCONF,& - COUNT(LLMICRO), COUNT(LLMICRO), & - .FALSE., HSUBG_AUCV, CSUBG_AUCV_RI,& - PTSTEP, KRR, LLMICRO, ZEXN, & + 0, .FALSE., HSUBG_AUCV, CSUBG_AUCV_RI, & + PTSTEP, KRR, ZEXN, & ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT,PCLDFR,& PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & PTHT, PRT(:,:,:,1), PRT(:,:,:,2), & @@ -937,26 +918,11 @@ SELECT CASE ( HCLOUD ) PHLI_HRI=PHLI_HRI, PHLI_HCF=PHLI_HCF ) ENDIF IF (LRED) THEN - LLMICRO(:,:,:) = .FALSE. - LLMICRO(IIB:IIE,IJB:IJE,IKB:IKE)=PRT(IIB:IIE,IJB:IJE,IKB:IKE,2)>XRTMIN(2) .OR. & - PRT(IIB:IIE,IJB:IJE,IKB:IKE,3)>XRTMIN(3) .OR. & - PRT(IIB:IIE,IJB:IJE,IKB:IKE,4)>XRTMIN(4) .OR. & - PRT(IIB:IIE,IJB:IJE,IKB:IKE,5)>XRTMIN(5) .OR. & - PRT(IIB:IIE,IJB:IJE,IKB:IKE,6)>XRTMIN(6) .OR. & - PRT(IIB:IIE,IJB:IJE,IKB:IKE,7)>XRTMIN(7) - LLMICRO(IIB:IIE,IJB:IJE,IKB:IKE)=LLMICRO(IIB:IIE,IJB:IJE,IKB:IKE) .OR. & - PRS(IIB:IIE,IJB:IJE,IKB:IKE,2)>ZRSMIN(2) .OR. & - PRS(IIB:IIE,IJB:IJE,IKB:IKE,3)>ZRSMIN(3) .OR. & - PRS(IIB:IIE,IJB:IJE,IKB:IKE,4)>ZRSMIN(4) .OR. & - PRS(IIB:IIE,IJB:IJE,IKB:IKE,5)>ZRSMIN(5) .OR. & - PRS(IIB:IIE,IJB:IJE,IKB:IKE,6)>ZRSMIN(6) .OR. & - PRS(IIB:IIE,IJB:IJE,IKB:IKE,7)>ZRSMIN(7) CALL RAIN_ICE (YLDIMPHYEX,CST, PARAM_ICE, RAIN_ICE_PARAM, RAIN_ICE_DESCR,TBUCONF,& - COUNT(LLMICRO), COUNT(LLMICRO), & - .FALSE., HSUBG_AUCV, CSUBG_AUCV_RI,& - PTSTEP, KRR, LLMICRO, ZEXN, & + 0, .FALSE., HSUBG_AUCV, CSUBG_AUCV_RI, & + PTSTEP, KRR, ZEXN, & ZDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,& - PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF,& + PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & PTHT, PRT(:,:,:,1), PRT(:,:,:,2), & PRT(:,:,:,3), PRT(:,:,:,4), & PRT(:,:,:,5), PRT(:,:,:,6), & diff --git a/src/PHYEX/micro/interp_micro.func.h b/src/PHYEX/micro/interp_micro.func.h new file mode 100644 index 0000000000000000000000000000000000000000..ec9a912eafdbc59d879bea36596c0f73461e4ecb --- /dev/null +++ b/src/PHYEX/micro/interp_micro.func.h @@ -0,0 +1,269 @@ +!These routines are intented to be included in the contains part of other subroutines. +!To allow the transformation for GPU, no local array must be declared. +!If a temporary local array is needed, it must be added as a buffer in the interface (IBUF?, ZBUF?) + +SUBROUTINE INTERP_MICRO_1D(KPROMA, KSIZE, PIN, KNUM, P1, P2, & + LDPACK, LDMASK, KBUF1, KBUF2, PBUF1, PBUF2, & + KLEN, & + PLT1, POUT1, PLT2, POUT2, PLT3, POUT3) + +IMPLICIT NONE + +INTEGER, INTENT(IN) :: KPROMA !Array size +INTEGER, INTENT(IN) :: KSIZE !Last usefull array index +REAL, DIMENSION(KPROMA), INTENT(IN) :: PIN !Input array +INTEGER, INTENT(IN) :: KNUM !Number of points in the look-up table +REAL, INTENT(IN) :: P1 !Scaling factor +REAL, INTENT(IN) :: P2 !Scaling factor +LOGICAL, INTENT(IN) :: LDPACK !.TRUE. to perform packing +LOGICAL, DIMENSION(KPROMA), INTENT(IN) :: LDMASK !Computation mask +INTEGER, DIMENSION(KPROMA), INTENT(OUT) :: KBUF1, KBUF2 !Buffer arrays +REAL, DIMENSION(KPROMA), INTENT(OUT) :: PBUF1, PBUF2 !Buffer arrays +INTEGER, INTENT(OUT) :: KLEN !Number of active points +REAL, DIMENSION(KNUM), INTENT(IN) :: PLT1 !Look-up table +REAL, DIMENSION(KPROMA), INTENT(OUT) :: POUT1 !Interpolated values +REAL, DIMENSION(KNUM), INTENT(IN) , OPTIONAL :: PLT2 +REAL, DIMENSION(KPROMA), INTENT(OUT), OPTIONAL :: POUT2 +REAL, DIMENSION(KNUM), INTENT(IN) , OPTIONAL :: PLT3 +REAL, DIMENSION(KPROMA), INTENT(OUT), OPTIONAL :: POUT3 + +INTEGER :: JL +INTEGER :: IINDEX +REAL :: ZINDEX + +IF (LDPACK) THEN + + !Pack input array + KLEN=0 + DO JL=1, KSIZE + IF (LDMASK(JL)) THEN + KLEN=KLEN+1 + PBUF1(KLEN)=PIN(JL) + KBUF1(KLEN)=JL + ENDIF + ENDDO + + IF (KLEN>0) THEN + !Index computation + !$mnh_expand_array(JL=1:KLEN) + PBUF1(1:KLEN) = MAX(1.00001, MIN(REAL(KNUM)-0.00001, P1 * LOG(PBUF1(1:KLEN)) + P2)) + KBUF2(1:KLEN) = INT(PBUF1(1:KLEN)) + PBUF1(1:KLEN) = PBUF1(1:KLEN) - REAL(KBUF2(1:KLEN)) + !$mnh_end_expand_array(JL=1:KLEN) + + !Interpolation and unpack + !$mnh_expand_array(JL=1:KLEN) + PBUF2(1:KLEN) = PLT1(KBUF2(1:KLEN)+1) * PBUF1(1:KLEN) & + &-PLT1(KBUF2(1:KLEN) ) * (PBUF1(1:KLEN) - 1.0) + !$mnh_end_expand_array(JL=1:KLEN) + POUT1(:)=0. + DO JL=1, KLEN + POUT1(KBUF1(JL))=PBUF2(JL) + ENDDO + + !Interpolation and unpack 2 + IF(PRESENT(PLT2)) THEN + !$mnh_expand_array(JL=1:KLEN) + PBUF2(1:KLEN) = PLT2(KBUF2(1:KLEN)+1) * PBUF1(1:KLEN) & + &-PLT2(KBUF2(1:KLEN) ) * (PBUF1(1:KLEN) - 1.0) + !$mnh_end_expand_array(JL=1:KLEN) + POUT2(:)=0. + DO JL=1, KLEN + POUT2(KBUF1(JL))=PBUF2(JL) + ENDDO + ENDIF + + !Interpolation and unpack 3 + IF(PRESENT(PLT3)) THEN + !$mnh_expand_array(JL=1:KLEN) + PBUF2(1:KLEN) = PLT3(KBUF2(1:KLEN)+1) * PBUF1(1:KLEN) & + &-PLT3(KBUF2(1:KLEN) ) * (PBUF1(1:KLEN) - 1.0) + !$mnh_end_expand_array(JL=1:KLEN) + POUT3(:)=0. + DO JL=1, KLEN + POUT3(KBUF1(JL))=PBUF2(JL) + ENDDO + ENDIF + + ENDIF + +ELSE + + KLEN=0 + DO JL=1, KSIZE + IF (LDMASK(JL)) THEN + KLEN=KLEN+1 + + !Index computation + ZINDEX = MAX(1.00001, MIN(REAL(KNUM)-0.00001, P1 * LOG(PIN(JL)) + P2)) + IINDEX = INT(ZINDEX) + ZINDEX = ZINDEX - REAL(IINDEX) + + !Interpolations + POUT1(JL) = PLT1(IINDEX+1) * ZINDEX & + &-PLT1(IINDEX ) * (ZINDEX - 1.0) + + IF(PRESENT(PLT2)) THEN + POUT2(JL) = PLT2(IINDEX+1) * ZINDEX & + &-PLT2(IINDEX ) * (ZINDEX - 1.0) + ENDIF + + IF(PRESENT(PLT3)) THEN + POUT3(JL) = PLT3(IINDEX+1) * ZINDEX & + &-PLT3(IINDEX ) * (ZINDEX - 1.0) + ENDIF + + ELSE + POUT1(JL) = 0. + IF(PRESENT(PLT2)) POUT2(JL) = 0. + IF(PRESENT(PLT3)) POUT3(JL) = 0. + ENDIF + ENDDO + +ENDIF +END SUBROUTINE INTERP_MICRO_1D + +SUBROUTINE INTERP_MICRO_2D(KPROMA, KSIZE, PIN1, PIN2, KNUM1, KNUM2, P11, P12, P21, P22,& + LDPACK, LDMASK, KBUF1, KBUF2, KBUF3, PBUF1, PBUF2, PBUF3, & + KLEN, & + PLT1, POUT1, PLT2, POUT2, PLT3, POUT3) + +IMPLICIT NONE + +INTEGER, INTENT(IN) :: KPROMA !Array size +INTEGER, INTENT(IN) :: KSIZE !Last usefull array index +REAL, DIMENSION(KPROMA), INTENT(IN) :: PIN1 !Input array +REAL, DIMENSION(KPROMA), INTENT(IN) :: PIN2 !Input array +INTEGER, INTENT(IN) :: KNUM1 !First dimension of the look-up table +INTEGER, INTENT(IN) :: KNUM2 !Second dimension of the look-up table +REAL, INTENT(IN) :: P11 !Scaling factor +REAL, INTENT(IN) :: P12 !Scaling factor +REAL, INTENT(IN) :: P21 !Scaling factor +REAL, INTENT(IN) :: P22 !Scaling factor +LOGICAL, INTENT(IN) :: LDPACK !.TRUE. to perform packing +LOGICAL, DIMENSION(KPROMA), INTENT(IN) :: LDMASK !Computation mask +INTEGER, DIMENSION(KPROMA), INTENT(OUT) :: KBUF1, KBUF2, KBUF3 !Buffer arrays +REAL, DIMENSION(KPROMA), INTENT(OUT) :: PBUF1, PBUF2, PBUF3 !Buffer arrays +INTEGER, INTENT(OUT) :: KLEN !Number of active points +REAL, DIMENSION(KNUM1, KNUM2), INTENT(IN) :: PLT1 !Look-up table +REAL, DIMENSION(KPROMA), INTENT(OUT) :: POUT1 !Interpolated values from the first look-up table +REAL, DIMENSION(KNUM1, KNUM2), INTENT(IN) , OPTIONAL :: PLT2 !Other look-up table +REAL, DIMENSION(KPROMA), INTENT(OUT), OPTIONAL :: POUT2 !Interpolated values from the second look-up table +REAL, DIMENSION(KNUM2, KNUM1), INTENT(IN) , OPTIONAL :: PLT3 !Another look-up table **CAUTION, TABLE IS REVERSED** +REAL, DIMENSION(KPROMA), INTENT(OUT), OPTIONAL :: POUT3 !Interpolated values from the third look-up table + +INTEGER :: JL +INTEGER :: IINDEX1, IINDEX2 +REAL :: ZINDEX1, ZINDEX2 + +IF (LDPACK) THEN + + !Pack input array + KLEN=0 + DO JL=1, KSIZE + IF (LDMASK(JL)) THEN + KLEN=KLEN+1 + PBUF1(KLEN)=PIN1(JL) + PBUF2(KLEN)=PIN2(JL) + KBUF3(KLEN)=JL + ENDIF + ENDDO + + IF (KLEN>0) THEN + !Index computation + !$mnh_expand_array(JL=1:KLEN) + PBUF1(1:KLEN) = MAX(1.00001, MIN(REAL(KNUM1)-0.00001, P11 * LOG(PBUF1(1:KLEN)) + P12)) + KBUF1(1:KLEN) = INT(PBUF1(1:KLEN)) + PBUF1(1:KLEN) = PBUF1(1:KLEN) - REAL(KBUF1(1:KLEN)) + + PBUF2(1:KLEN) = MAX(1.00001, MIN(REAL(KNUM2)-0.00001, P21 * LOG(PBUF2(1:KLEN)) + P22)) + KBUF2(1:KLEN) = INT(PBUF2(1:KLEN)) + PBUF2(1:KLEN) = PBUF2(1:KLEN) - REAL(KBUF2(1:KLEN)) + !$mnh_end_expand_array(JL=1:KLEN) + + !Interpolation and unpack 1 + DO JL=1, KLEN + PBUF3(JL) = ( PLT1(KBUF1(JL)+1,KBUF2(JL)+1)* PBUF2(JL) & + -PLT1(KBUF1(JL)+1,KBUF2(JL) )*(PBUF2(JL) - 1.0)) * PBUF1(JL) & + -( PLT1(KBUF1(JL) ,KBUF2(JL)+1)* PBUF2(JL) & + -PLT1(KBUF1(JL) ,KBUF2(JL) )*(PBUF2(JL) - 1.0)) * (PBUF1(JL) - 1.0) + ENDDO + POUT1(:)=0. + DO JL=1, KLEN + POUT1(KBUF3(JL))=PBUF3(JL) + ENDDO + + !Interpolation and unpack 2 + IF(PRESENT(PLT2)) THEN + DO JL=1, KLEN + PBUF3(JL) = ( PLT2(KBUF1(JL)+1,KBUF2(JL)+1)* PBUF2(JL) & + -PLT2(KBUF1(JL)+1,KBUF2(JL) )*(PBUF2(JL) - 1.0)) * PBUF1(JL) & + -( PLT2(KBUF1(JL) ,KBUF2(JL)+1)* PBUF2(JL) & + -PLT2(KBUF1(JL) ,KBUF2(JL) )*(PBUF2(JL) - 1.0)) * (PBUF1(JL) - 1.0) + ENDDO + POUT2(:)=0. + DO JL=1, KLEN + POUT2(KBUF3(JL))=PBUF3(JL) + ENDDO + ENDIF + + !Interpolation and unpack 3 + IF(PRESENT(PLT3)) THEN + DO JL=1, KLEN + PBUF3(JL) = ( PLT3(KBUF2(JL)+1,KBUF1(JL)+1)* PBUF1(JL) & + -PLT3(KBUF2(JL)+1,KBUF1(JL) )*(PBUF1(JL) - 1.0)) * PBUF2(JL) & + -( PLT3(KBUF2(JL) ,KBUF1(JL)+1)* PBUF1(JL) & + -PLT3(KBUF2(JL) ,KBUF1(JL) )*(PBUF1(JL) - 1.0)) * (PBUF2(JL) - 1.0) + ENDDO + POUT3(:)=0. + DO JL=1, KLEN + POUT3(KBUF3(JL))=PBUF3(JL) + ENDDO + ENDIF + ENDIF + +ELSE + + KLEN=0 + DO JL=1, KSIZE + IF (LDMASK(JL)) THEN + KLEN=KLEN+1 + + !Indexes computation + ZINDEX1 = MAX(1.00001, MIN(REAL(KNUM1)-0.00001, P11 * LOG(PIN1(JL)) + P12)) + IINDEX1 = INT(ZINDEX1) + ZINDEX1 = ZINDEX1 - REAL(IINDEX1) + + ZINDEX2 = MAX(1.00001, MIN(REAL(KNUM1)-0.00001, P21 * LOG(PIN2(JL)) + P22)) + IINDEX2 = INT(ZINDEX2) + ZINDEX2 = ZINDEX2 - REAL(IINDEX2) + + !Interpolations + POUT1(JL) = ( PLT1(IINDEX1+1,IINDEX2+1)* ZINDEX2 & + -PLT1(IINDEX1+1,IINDEX2 )*(ZINDEX2 - 1.0)) * ZINDEX1 & + -( PLT1(IINDEX1 ,IINDEX2+1)* ZINDEX2 & + -PLT1(IINDEX1 ,IINDEX2 )*(ZINDEX2 - 1.0)) * (ZINDEX1 - 1.0) + + IF(PRESENT(PLT2)) THEN + POUT2(JL) = ( PLT2(IINDEX1+1,IINDEX2+1)* ZINDEX2 & + -PLT2(IINDEX1+1,IINDEX2 )*(ZINDEX2 - 1.0)) * ZINDEX1 & + -( PLT2(IINDEX1 ,IINDEX2+1)* ZINDEX2 & + -PLT2(IINDEX1 ,IINDEX2 )*(ZINDEX2 - 1.0)) * (ZINDEX1 - 1.0) + ENDIF + + IF(PRESENT(PLT3)) THEN + POUT3(JL) = ( PLT3(IINDEX2+1,IINDEX1+1)* ZINDEX1 & + -PLT3(IINDEX2+1,IINDEX1 )*(ZINDEX1 - 1.0)) * ZINDEX2 & + -( PLT3(IINDEX2 ,IINDEX1+1)* ZINDEX1 & + -PLT3(IINDEX2 ,IINDEX1 )*(ZINDEX1 - 1.0)) * (ZINDEX2 - 1.0) + ENDIF + + ELSE + POUT1(JL)=0. + IF(PRESENT(PLT2)) POUT2(JL)=0. + IF(PRESENT(PLT3)) POUT3(JL)=0. + ENDIF + ENDDO + +ENDIF +END SUBROUTINE INTERP_MICRO_2D diff --git a/src/PHYEX/micro/modd_fields_address.f90 b/src/PHYEX/micro/modd_fields_address.f90 index 322b9957ea830dde6c34b2108f5a385d036deb16..45786b5a345ddb2ad6ccc02514a1d9cc1fde73dd 100644 --- a/src/PHYEX/micro/modd_fields_address.f90 +++ b/src/PHYEX/micro/modd_fields_address.f90 @@ -44,4 +44,50 @@ INTEGER, PARAMETER :: & ! pointer of fields in microphysic species arrays : & IRG=6, & ! Graupel & IRH=7 ! Hail ! +! Pointers for tendency arrays +! Tendencies are computed either directly as a tendency or as a mixing ratio change that is transformed, afterwards, in a tendency +! The second type is suffixed by _MR +! Some final tendencies can have two contributions (one from a tendency, one from a mixing ratio change). +! In the following list, order matters: +! - first are the normal tendencies directly computed as tendencies +! - second are the tendencies computed only from a mixing ratio change +! - third are the indexes used to designate the mising ratio change part of double-contribution tendencies +INTEGER, PARAMETER :: IBUNUM=47, & ! Total number + IBUNUM_MR=3, & ! Number of tendencies computed only from a mixing ratio change + IBUNUM_EXTRA=2 ! Extra terms +INTEGER, PARAMETER :: & + !normal tendencies directly computed as tendencies + & IRCHONI=1, & ! Homogeneous nucleation + & IRVDEPS=2, & ! Deposition on r_s, + & IRIAGGS=3, & ! Aggregation on r_s + & IRIAUTS=4, & ! Autoconversion of r_i for r_s production + & IRVDEPG=5, & ! Deposition on r_g + & IRCAUTR=6, & ! Autoconversion of r_c for r_r production + & IRCACCR=7, & ! Accretion of r_c for r_r production + & IRREVAV=8, & ! Evaporation of r_r + & IRCBERI=9, & ! Bergeron-Findeisen effect + & IRHMLTR=10, & ! Melting of the hailstones + & IRSMLTG=11, & ! Conversion-Melting of the aggregates + & IRCMLTSR=12, & ! Cloud droplet collection onto aggregates by positive temperature + & IRRACCSS=13, IRRACCSG=14, IRSACCRG=15, & ! Rain accretion onto the aggregates + & IRCRIMSS=16, IRCRIMSG=17, IRSRIMCG=18, & ! Cloud droplet riming of the aggregates + & IRICFRRG=19, IRRCFRIG=20, IRICFRR=21, & ! Rain contact freezing + & IRCWETG=22, IRIWETG=23, IRRWETG=24, IRSWETG=25, & ! Graupel wet growth + & IRCDRYG=26, IRIDRYG=27, IRRDRYG=28, IRSDRYG=29, & ! Graupel dry growth + & IRWETGH=30, & ! Conversion of graupel into hail + & IRGMLTR=31, & ! Melting of the graupel + & IRCWETH=32, IRIWETH=33, IRSWETH=34, IRGWETH=35, IRRWETH=36, & ! Dry growth of hailstone + & IRCDRYH=37, IRIDRYH=38, IRSDRYH=39, IRRDRYH=40, IRGDRYH=41, & ! Wet growth of hailstone + & IRDRYHG=42, & + + !tendencies computed only with a mixing ratio change + & IRVHENI_MR=43, & ! heterogeneous nucleation mixing ratio change + & IRRHONG_MR=44, & ! Spontaneous freezing mixing ratio change + & IRIMLTC_MR=45, & ! Cloud ice melting mixing ratio change + + !Extra term computed as a mixing ratio change, to be added to other term + & IRSRIMCG_MR=46,& ! Cloud droplet riming of the aggregates + & IRWETGH_MR=47 ! Conversion of graupel into hail +INTEGER, PARAMETER, DIMENSION(IBUNUM-IBUNUM_EXTRA+1:IBUNUM) :: IBUEXTRAIND=(/18, 30/) +! END MODULE MODD_FIELDS_ADDRESS diff --git a/src/PHYEX/micro/modd_param_ice.f90 b/src/PHYEX/micro/modd_param_ice.f90 index 0ce2390e82aaf1e1f0d3eade38cf81cce5809452..8f7ea8f52195660c051d6204d788300fc215c487 100644 --- a/src/PHYEX/micro/modd_param_ice.f90 +++ b/src/PHYEX/micro/modd_param_ice.f90 @@ -79,6 +79,9 @@ LOGICAL :: LSEDIM_AFTER ! sedimentation done before (.FALSE.) or after (.TRUE.) ! REAL :: XSPLIT_MAXCFL ! Maximum CFL number allowed for SPLIT scheme LOGICAL :: LSNOW_T ! Snow parameterization from Wurtz (2021) +! +LOGICAL :: LPACK_INTERP !To pack arrays before computing the different interpolations (kernels and other) +LOGICAL :: LPACK_MICRO !To pack arrays before computing the process tendencies END TYPE PARAM_ICE_t ! TYPE(PARAM_ICE_t), SAVE, TARGET :: PARAM_ICE @@ -98,7 +101,9 @@ LOGICAL, POINTER :: LWARM => NULL(), & LADJ_BEFORE => NULL(), & LADJ_AFTER => NULL(), & LSEDIM_AFTER => NULL(),& - LSNOW_T => NULL() + LSNOW_T => NULL(),& + LPACK_INTERP => NULL(),& + LPACK_MICRO => NULL() REAL, POINTER :: XVDEPOSC => NULL(), & XFRACM90 => NULL(), & @@ -138,6 +143,8 @@ SUBROUTINE PARAM_ICE_ASSOCIATE() LADJ_AFTER => PARAM_ICE%LADJ_AFTER LSEDIM_AFTER => PARAM_ICE%LSEDIM_AFTER LSNOW_T => PARAM_ICE%LSNOW_T + LPACK_INTERP => PARAM_ICE%LPACK_INTERP + LPACK_MICRO => PARAM_ICE%LPACK_MICRO ! XVDEPOSC => PARAM_ICE%XVDEPOSC XFRACM90 => PARAM_ICE%XFRACM90 diff --git a/src/PHYEX/micro/mode_ice4_budgets.f90 b/src/PHYEX/micro/mode_ice4_budgets.f90 new file mode 100644 index 0000000000000000000000000000000000000000..99cf34f3123f146272562530c881fec1efb33a29 --- /dev/null +++ b/src/PHYEX/micro/mode_ice4_budgets.f90 @@ -0,0 +1,436 @@ +!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +! ######spl +MODULE MODE_ICE4_BUDGETS +IMPLICIT NONE +CONTAINS +SUBROUTINE ICE4_BUDGETS(D, PARAMI, BUCONF, KSIZE, PTSTEP, KRR, K1, K2, & + PLVFACT, PLSFACT, PRHODJ, PEXNREF, & + PRVHENI, PBU_PACK, & + TBUDGETS, KBUDGETS) +! +!* 0. DECLARATIONS +! ------------ +! +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK + +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_BUDGET, ONLY: TBUDGETDATA, TBUDGETCONF_t, NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, & + NBUDGET_RI, NBUDGET_RR, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH +USE MODD_PARAM_ICE, ONLY: PARAM_ICE_t +! +USE MODD_FIELDS_ADDRESS ! index number for prognostic (theta and mixing ratios) and budgets +! +USE MODE_BUDGET, ONLY: BUDGET_STORE_ADD_PHY, BUDGET_STORE_INIT_PHY, BUDGET_STORE_END_PHY +! +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +! +! +TYPE(DIMPHYEX_t), INTENT(IN) :: D +TYPE(PARAM_ICE_t), INTENT(IN) :: PARAMI +TYPE(TBUDGETCONF_t), INTENT(IN) :: BUCONF +INTEGER, INTENT(IN) :: KSIZE +REAL, INTENT(IN) :: PTSTEP +INTEGER, INTENT(IN) :: KRR +INTEGER, DIMENSION(KSIZE), INTENT(IN) :: K1 +INTEGER, DIMENSION(KSIZE), INTENT(IN) :: K2 +REAL, DIMENSION(D%NIJT, D%NKT), INTENT(IN) :: PLVFACT +REAL, DIMENSION(D%NIJT, D%NKT), INTENT(IN) :: PLSFACT +REAL, DIMENSION(D%NIJT, D%NKT), INTENT(IN) :: PRHODJ +REAL, DIMENSION(D%NIJT, D%NKT), INTENT(IN) :: PEXNREF +REAL, DIMENSION(D%NIJT, D%NKT), INTENT(IN) :: PRVHENI +REAL, DIMENSION(KSIZE, IBUNUM-IBUNUM_EXTRA), INTENT(IN) :: PBU_PACK +TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS +INTEGER, INTENT(IN) :: KBUDGETS +! +! +!* 0.2 Declarations of local variables : +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +INTEGER :: JIJ, JK, JL +INTEGER :: IKTB, IKTE, IKB, IIJB, IIJE +REAL, DIMENSION(D%NIJT, D%NKT) :: ZW1, ZW2, ZW3, ZW4, ZW5, ZW6 ! work array +REAL, DIMENSION(D%NIJT, D%NKT) :: ZZ_DIFF, ZZ_LVFACT, ZZ_LSFACT +REAL :: ZINV_TSTEP +! +!------------------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('ICE4_BUDGETS', 0, ZHOOK_HANDLE) +! +IKTB=D%NKTB +IKTE=D%NKTE +IKB=D%NKB +IIJB=D%NIJB +IIJE=D%NIJE +ZINV_TSTEP=1./PTSTEP +! +IF (BUCONF%LBUDGET_TH) THEN + ZZ_DIFF(:,:)=0. + DO JK = IKTB, IKTE + DO JIJ = IIJB, IIJE + ZZ_LVFACT(JIJ, JK) = PLVFACT(JIJ, JK) / PEXNREF(JIJ, JK) + ZZ_LSFACT(JIJ, JK) = PLSFACT(JIJ, JK) / PEXNREF(JIJ, JK) + ZZ_DIFF(JIJ, JK) = ZZ_LSFACT(JIJ, JK) - ZZ_LVFACT(JIJ, JK) + ENDDO + ENDDO +END IF + +ZW1(:,:) = 0. +DO JL=1, KSIZE + ZW1(K1(JL), K2(JL)) = PBU_PACK(JL, IRVHENI_MR) * ZINV_TSTEP +END DO +DO JK = IKTB, IKTE + DO JIJ = IIJB, IIJE + ZW1(JIJ,JK)=ZW1(JIJ,JK)+PRVHENI(JIJ,JK) + ENDDO +ENDDO +#ifdef REPRO48 +IF (BUCONF%LBUDGET_TH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'HENU', ZW1(:, :)*ZZ_LSFACT(:, :)*PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RV) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RV), 'HENU', -ZW1(:, :) *PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'HENU', ZW1(:, :) *PRHODJ(:, :)) +#else +IF (BUCONF%LBUDGET_TH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'HIN', ZW1(:, :)*ZZ_LSFACT(:, :)*PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RV) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RV), 'HIN', -ZW1(:, :) *PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'HIN', ZW1(:, :) *PRHODJ(:, :)) +#endif +ZW1(:,:) = 0. +DO JL=1, KSIZE + ZW1(K1(JL), K2(JL)) = PBU_PACK(JL, IRCHONI) * ZINV_TSTEP +END DO +IF (BUCONF%LBUDGET_TH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'HON', ZW1(:, :)*ZZ_DIFF(:, :)*PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RC) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'HON', -ZW1(:, :) *PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'HON', ZW1(:, :) *PRHODJ(:, :)) + +ZW1(:,:) = 0. +DO JL=1, KSIZE + ZW1(K1(JL), K2(JL)) = PBU_PACK(JL, IRRHONG_MR) * ZINV_TSTEP +END DO +IF (BUCONF%LBUDGET_TH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'SFR', ZW1(:, :)*ZZ_DIFF(:, :)*PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RR) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'SFR', -ZW1(:, :) *PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'SFR', ZW1(:, :) *PRHODJ(:, :)) + +ZW1(:,:) = 0. +DO JL=1, KSIZE + ZW1(K1(JL), K2(JL)) = PBU_PACK(JL, IRVDEPS) * ZINV_TSTEP +END DO +IF (BUCONF%LBUDGET_TH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'DEPS', ZW1(:, :)*ZZ_LSFACT(:, :)*PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RV) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RV), 'DEPS', -ZW1(:, :) *PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RS) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'DEPS', ZW1(:, :) *PRHODJ(:, :)) + +ZW1(:,:) = 0. +DO JL=1, KSIZE + ZW1(K1(JL), K2(JL)) = PBU_PACK(JL, IRIAGGS) * ZINV_TSTEP +END DO +IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'AGGS', -ZW1(:, :)*PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RS) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'AGGS', ZW1(:, :)*PRHODJ(:, :)) + +ZW1(:,:) = 0. +DO JL=1, KSIZE + ZW1(K1(JL), K2(JL)) = PBU_PACK(JL, IRIAUTS) * ZINV_TSTEP +END DO +IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'AUTS', -ZW1(:, :)*PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RS) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'AUTS', ZW1(:, :)*PRHODJ(:, :)) + +ZW1(:,:) = 0. +DO JL=1, KSIZE + ZW1(K1(JL), K2(JL)) = PBU_PACK(JL, IRVDEPG) * ZINV_TSTEP +END DO +IF (BUCONF%LBUDGET_TH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'DEPG', ZW1(:, :)*ZZ_LSFACT(:, :)*PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RV) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RV), 'DEPG', -ZW1(:, :) *PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'DEPG', ZW1(:, :) *PRHODJ(:, :)) + +IF(PARAMI%LWARM) THEN + ZW1(:,:) = 0. + DO JL=1, KSIZE + ZW1(K1(JL), K2(JL)) = PBU_PACK(JL, IRCAUTR) * ZINV_TSTEP + END DO + IF (BUCONF%LBUDGET_RC) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'AUTO', -ZW1(:, :)*PRHODJ(:, :)) + IF (BUCONF%LBUDGET_RR) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'AUTO', ZW1(:, :)*PRHODJ(:, :)) + + ZW1(:,:) = 0. + DO JL=1, KSIZE + ZW1(K1(JL), K2(JL)) = PBU_PACK(JL, IRCACCR) * ZINV_TSTEP + END DO + IF (BUCONF%LBUDGET_RC) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'ACCR', -ZW1(:, :)*PRHODJ(:, :)) + IF (BUCONF%LBUDGET_RR) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'ACCR', ZW1(:, :)*PRHODJ(:, :)) + + ZW1(:,:) = 0. + DO JL=1, KSIZE + ZW1(K1(JL), K2(JL)) = PBU_PACK(JL, IRREVAV) * ZINV_TSTEP + END DO + IF (BUCONF%LBUDGET_TH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'REVA', -ZW1(:, :)*ZZ_LVFACT(:, :)*PRHODJ(:, :)) + IF (BUCONF%LBUDGET_RV) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RV), 'REVA', ZW1(:, :) *PRHODJ(:, :)) + IF (BUCONF%LBUDGET_RR) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'REVA', -ZW1(:, :) *PRHODJ(:, :)) +ENDIF + +ZW1(:,:) = 0. +DO JL=1, KSIZE + ZW1(K1(JL), K2(JL)) = PBU_PACK(JL, IRCRIMSS) * ZINV_TSTEP +END DO +ZW2(:,:) = 0. +DO JL=1, KSIZE + ZW2(K1(JL), K2(JL)) = PBU_PACK(JL, IRCRIMSG) * ZINV_TSTEP +END DO +ZW3(:,:) = 0. +DO JL=1, KSIZE + ZW3(K1(JL), K2(JL)) = PBU_PACK(JL, IRSRIMCG) * ZINV_TSTEP +END DO +IF (BUCONF%LBUDGET_TH) & + CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'RIM', (ZW1(:, :)+ZW2(:, :))*ZZ_DIFF(:, :)*PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RC) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'RIM', (-ZW1(:, :)-ZW2(:, :))*PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RS) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'RIM', ( ZW1(:, :)-ZW3(:, :))*PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'RIM', ( ZW2(:, :)+ZW3(:, :))*PRHODJ(:, :)) + +ZW1(:,:) = 0. +DO JL=1, KSIZE + ZW1(K1(JL), K2(JL)) = PBU_PACK(JL, IRRACCSS) * ZINV_TSTEP +END DO +ZW2(:,:) = 0. +DO JL=1, KSIZE + ZW2(K1(JL), K2(JL)) = PBU_PACK(JL, IRRACCSG) * ZINV_TSTEP +END DO +ZW3(:,:) = 0. +DO JL=1, KSIZE + ZW3(K1(JL), K2(JL)) = PBU_PACK(JL, IRSACCRG) * ZINV_TSTEP +END DO +IF (BUCONF%LBUDGET_TH) & + CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'ACC', (ZW1(:, :)+ZW2(:, :) )*ZZ_DIFF(:, :)*PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RR) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'ACC', (-ZW1(:, :)-ZW2(:, :))*PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RS) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'ACC', ( ZW1(:, :)-ZW3(:, :))*PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'ACC', ( ZW2(:, :)+ZW3(:, :))*PRHODJ(:, :)) + +ZW1(:,:) = 0. +DO JL=1, KSIZE + ZW1(K1(JL), K2(JL)) = PBU_PACK(JL, IRSMLTG) * ZINV_TSTEP +END DO +IF (BUCONF%LBUDGET_RS) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'CMEL', -ZW1(:, :)*PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'CMEL', ZW1(:, :)*PRHODJ(:, :)) +ZW1(:,:) = 0. +DO JL=1, KSIZE + ZW1(K1(JL), K2(JL)) = PBU_PACK(JL, IRCMLTSR) * ZINV_TSTEP +END DO +IF (BUCONF%LBUDGET_RC) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'CMEL', -ZW1(:, :)*PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RR) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'CMEL', ZW1(:, :)*PRHODJ(:, :)) + +ZW1(:,:) = 0. +DO JL=1, KSIZE + ZW1(K1(JL), K2(JL)) = PBU_PACK(JL, IRICFRRG) * ZINV_TSTEP +END DO +ZW2(:,:) = 0. +DO JL=1, KSIZE + ZW2(K1(JL), K2(JL)) = PBU_PACK(JL, IRRCFRIG) * ZINV_TSTEP +END DO +ZW3(:,:) = 0. +DO JL=1, KSIZE + ZW3(K1(JL), K2(JL)) = PBU_PACK(JL, IRICFRR) * ZINV_TSTEP +END DO +IF (BUCONF%LBUDGET_TH) & + CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'CFRZ', ZW2(:, :)*ZZ_DIFF(:, :)*PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RR) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'CFRZ', (-ZW2(:, :)+ZW3(:, :))*PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'CFRZ', (-ZW1(:, :)-ZW3(:, :))*PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'CFRZ', ( ZW1(:, :)+ZW2(:, :))*PRHODJ(:, :)) + +ZW1(:,:) = 0. +DO JL=1, KSIZE + ZW1(K1(JL), K2(JL)) = PBU_PACK(JL, IRCWETG) * ZINV_TSTEP +END DO +ZW2(:,:) = 0. +DO JL=1, KSIZE + ZW2(K1(JL), K2(JL)) = PBU_PACK(JL, IRRWETG) * ZINV_TSTEP +END DO +ZW3(:,:) = 0. +DO JL=1, KSIZE + ZW3(K1(JL), K2(JL)) = PBU_PACK(JL, IRIWETG) * ZINV_TSTEP +END DO +ZW4(:,:) = 0. +DO JL=1, KSIZE + ZW4(K1(JL), K2(JL)) = PBU_PACK(JL, IRSWETG) * ZINV_TSTEP +END DO +IF (BUCONF%LBUDGET_TH) & + CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'WETG', (ZW1(:, :)+ZW2(:, :))*ZZ_DIFF(:, :)*PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RC) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'WETG', -ZW1(:, :) *PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RR) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'WETG', -ZW2(:, :) *PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'WETG', -ZW3(:, :) *PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RS) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'WETG', -ZW4(:, :) *PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'WETG', (ZW1(:, :)+ZW2(:, :)+ZW3(:, :)+ZW4(:, :)) & + & *PRHODJ(:, :)) + +IF(KRR==7) THEN + ZW1(:,:) = 0. + DO JL=1, KSIZE + ZW1(K1(JL), K2(JL)) = PBU_PACK(JL, IRWETGH) * ZINV_TSTEP + END DO + IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'GHCV', -ZW1(:, :)*PRHODJ(:, :)) + IF (BUCONF%LBUDGET_RH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RH), 'GHCV', ZW1(:, :)*PRHODJ(:, :)) +END IF + +ZW1(:,:) = 0. +DO JL=1, KSIZE + ZW1(K1(JL), K2(JL)) = PBU_PACK(JL, IRCDRYG) * ZINV_TSTEP +END DO +ZW2(:,:) = 0. +DO JL=1, KSIZE + ZW2(K1(JL), K2(JL)) = PBU_PACK(JL, IRRDRYG) * ZINV_TSTEP +END DO +ZW3(:,:) = 0. +DO JL=1, KSIZE + ZW3(K1(JL), K2(JL)) = PBU_PACK(JL, IRIDRYG) * ZINV_TSTEP +END DO +ZW4(:,:) = 0. +DO JL=1, KSIZE + ZW4(K1(JL), K2(JL)) = PBU_PACK(JL, IRSDRYG) * ZINV_TSTEP +END DO +IF (BUCONF%LBUDGET_TH) & + CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'DRYG', (ZW1(:, :)+ZW2(:, :) )*ZZ_DIFF(:, :)*PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RC) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'DRYG', -ZW1(:, :) *PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RR) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'DRYG', -ZW2(:, :) *PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'DRYG', -ZW3(:, :) *PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RS) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'DRYG', -ZW4(:, :) *PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'DRYG', (ZW1(:, :)+ZW2(:, :)+ZW3(:, :)+ZW4(:, :)) & + & *PRHODJ(:, :)) + +ZW1(:,:) = 0. +DO JL=1, KSIZE + ZW1(K1(JL), K2(JL)) = PBU_PACK(JL, IRGMLTR) * ZINV_TSTEP +END DO +IF (BUCONF%LBUDGET_TH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'GMLT', -ZW1(:, :)*ZZ_DIFF(:, :)*PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RR) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'GMLT', ZW1(:, :) *PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'GMLT', -ZW1(:, :) *PRHODJ(:, :)) + +IF(KRR==7) THEN + ZW1(:,:) = 0. + DO JL=1, KSIZE + ZW1(K1(JL), K2(JL)) = PBU_PACK(JL, IRCWETH) * ZINV_TSTEP + END DO + ZW2(:,:) = 0. + DO JL=1, KSIZE + ZW2(K1(JL), K2(JL)) = PBU_PACK(JL, IRRWETH) * ZINV_TSTEP + END DO + ZW3(:,:) = 0. + DO JL=1, KSIZE + ZW3(K1(JL), K2(JL)) = PBU_PACK(JL, IRIWETH) * ZINV_TSTEP + END DO + ZW4(:,:) = 0. + DO JL=1, KSIZE + ZW4(K1(JL), K2(JL)) = PBU_PACK(JL, IRSWETH) * ZINV_TSTEP + END DO + ZW5(:,:) = 0. + DO JL=1, KSIZE + ZW5(K1(JL), K2(JL)) = PBU_PACK(JL, IRGWETH) * ZINV_TSTEP + END DO + IF (BUCONF%LBUDGET_TH) & + CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'WETH', (ZW1(:, :)+ZW2(:, :))*ZZ_DIFF(:, :)*PRHODJ(:, :)) + IF (BUCONF%LBUDGET_RC) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'WETH', -ZW1(:, :) *PRHODJ(:, :)) + IF (BUCONF%LBUDGET_RR) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'WETH', -ZW2(:, :) *PRHODJ(:, :)) + IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'WETH', -ZW3(:, :) *PRHODJ(:, :)) + IF (BUCONF%LBUDGET_RS) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'WETH', -ZW4(:, :) *PRHODJ(:, :)) +#ifdef REPRO48 +#else + IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'WETH', -ZW5(:, :) *PRHODJ(:, :)) +#endif + IF (BUCONF%LBUDGET_RH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RH), 'WETH', (ZW1(:, :)+ZW2(:, :)+ZW3(:, :)+ & + &ZW4(:, :)+ZW5(:, : )) *PRHODJ(:, :)) + +#if defined(REPRO48) || defined(REPRO55) + ZW1(:,:) = 0. + DO JL=1, KSIZE + ZW1(K1(JL), K2(JL)) = PBU_PACK(JL, IRGWETH) * ZINV_TSTEP + END DO +#endif +#ifdef REPRO48 + IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'HGCV', (-ZW5(:, :)-ZW1(:, :))*PRHODJ(:, :)) +#endif +#ifdef REPRO55 + IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'HGCV', -ZW1(:, :)*PRHODJ(:, :)) +#endif +#if defined(REPRO48) || defined(REPRO55) + IF (BUCONF%LBUDGET_RH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RH), 'HGCV', ZW1(:, :)*PRHODJ(:, :)) +#endif + + ZW1(:,:) = 0. + DO JL=1, KSIZE + ZW1(K1(JL), K2(JL)) = PBU_PACK(JL, IRCDRYH) * ZINV_TSTEP + END DO + ZW2(:,:) = 0. + DO JL=1, KSIZE + ZW2(K1(JL), K2(JL)) = PBU_PACK(JL, IRRDRYH) * ZINV_TSTEP + END DO + ZW3(:,:) = 0. + DO JL=1, KSIZE + ZW3(K1(JL), K2(JL)) = PBU_PACK(JL, IRIDRYH) * ZINV_TSTEP + END DO + ZW4(:,:) = 0. + DO JL=1, KSIZE + ZW4(K1(JL), K2(JL)) = PBU_PACK(JL, IRSDRYH) * ZINV_TSTEP + END DO + ZW5(:,:) = 0. + DO JL=1, KSIZE + ZW5(K1(JL), K2(JL)) = PBU_PACK(JL, IRGDRYH) * ZINV_TSTEP + END DO + ZW6(:,:) = 0. +#if defined(REPRO48) || defined(REPRO55) + !ZW6 must be removed when REPRO* will be suppressed + DO JL=1, KSIZE + ZW6(K1(JL), K2(JL)) = PBU_PACK(JL, IRDRYHG) * ZINV_TSTEP + END DO +#endif + IF (BUCONF%LBUDGET_TH) & + CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'DRYH', (ZW1(:, :)+ZW2(:, :))*ZZ_DIFF(:, :)*PRHODJ(:, :)) + IF (BUCONF%LBUDGET_RC) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'DRYH', -ZW1(:, :) *PRHODJ(:, :)) + IF (BUCONF%LBUDGET_RR) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'DRYH', -ZW2(:, :) *PRHODJ(:, :)) + IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'DRYH', -ZW3(:, :) *PRHODJ(:, :)) + IF (BUCONF%LBUDGET_RS) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'DRYH', -ZW4(:, :) *PRHODJ(:, :)) + IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'DRYH', (-ZW5(:, :)+ZW6(:, :)) *PRHODJ(:, :)) + IF (BUCONF%LBUDGET_RH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RH), 'DRYH', (ZW1(:, :)+ZW2(:, :)+ZW3(:, :)+ & + &ZW4(:, :)+ZW5(:, :)-ZW6(:, :)) & + & *PRHODJ(:, :)) + +#if defined(REPRO48) || defined(REPRO55) +#else + !When REPRO48 will be suppressed, ZW6 must be removed + ZW(:,:) = 0. + DO JL=1, KSIZE + ZW1(K1(JL), K2(JL)) = PBU_PACK(JL, IRDRYHG) * ZINV_TSTEP + END DO + IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'HGCV', -ZW1(:, :)*PRHODJ(:, :)) + IF (BUCONF%LBUDGET_RH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RH), 'HGCV', ZW1(:, :)*PRHODJ(:, :)) +#endif + + ZW1(:,:) = 0. + DO JL=1, KSIZE + ZW1(K1(JL), K2(JL)) = PBU_PACK(JL, IRHMLTR) * ZINV_TSTEP + END DO + IF (BUCONF%LBUDGET_TH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'HMLT', -ZW1(:, :)*ZZ_DIFF(:, :)*PRHODJ(:, :)) + IF (BUCONF%LBUDGET_RR) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'HMLT', ZW1(:, :) *PRHODJ(:, :)) + IF (BUCONF%LBUDGET_RH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RH), 'HMLT', -ZW1(:, :) *PRHODJ(:, :)) +ENDIF + +ZW1(:,:) = 0. +DO JL=1, KSIZE + ZW1(K1(JL), K2(JL)) = PBU_PACK(JL, IRIMLTC_MR) * ZINV_TSTEP +END DO +IF (BUCONF%LBUDGET_TH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'IMLT', -ZW1(:, :)*ZZ_DIFF(:, :)*PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RC) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'IMLT', ZW1(:, :) *PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'IMLT', -ZW1(:, :) *PRHODJ(:, :)) + +ZW1(:,:) = 0. +DO JL=1, KSIZE + ZW1(K1(JL), K2(JL)) = PBU_PACK(JL, IRCBERI) * ZINV_TSTEP +END DO +IF (BUCONF%LBUDGET_TH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'BERFI', ZW1(:, :)*ZZ_DIFF(:, :)*PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RC) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'BERFI', -ZW1(:, :) *PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'BERFI', ZW1(:, :) *PRHODJ(:, :)) +! +IF (LHOOK) CALL DR_HOOK('ICE4_BUDGETS', 1, ZHOOK_HANDLE) +! +END SUBROUTINE ICE4_BUDGETS +! +END MODULE MODE_ICE4_BUDGETS diff --git a/src/PHYEX/micro/mode_ice4_correct_negativities.f90 b/src/PHYEX/micro/mode_ice4_correct_negativities.f90 new file mode 100644 index 0000000000000000000000000000000000000000..12f8b08aa4eed8fc9565d2fc7462d48cf92eabff --- /dev/null +++ b/src/PHYEX/micro/mode_ice4_correct_negativities.f90 @@ -0,0 +1,118 @@ +!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +MODULE MODE_ICE4_CORRECT_NEGATIVITIES +IMPLICIT NONE +CONTAINS +SUBROUTINE ICE4_CORRECT_NEGATIVITIES(D, ICED, KRR, PRV, PRC, PRR, & + &PRI, PRS, PRG, & + &PTH, PLVFACT, PLSFACT, PRH) +! +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_RAIN_ICE_DESCR, ONLY: RAIN_ICE_DESCR_t +! +IMPLICIT NONE +! +TYPE(DIMPHYEX_t), INTENT(IN) :: D +TYPE(RAIN_ICE_DESCR_t), INTENT(IN) :: ICED +INTEGER, INTENT(IN) :: KRR +REAL, DIMENSION(D%NIJT, D%NKT), INTENT(INOUT) :: PRV, PRC, PRR, PRI, PRS, PRG, PTH +REAL, DIMENSION(D%NIJT, D%NKT), INTENT(IN) :: PLVFACT, PLSFACT +REAL, DIMENSION(D%NIJT, D%NKT), OPTIONAL, INTENT(INOUT) :: PRH +! +REAL :: ZW +INTEGER :: JIJ, JK, IKTB, IKTE, IIJB, IIJE + +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +IF (LHOOK) CALL DR_HOOK('ICE4_CORRECT_NEGATIVITIES', 0, ZHOOK_HANDLE) +! +IKTB=D%NKTB +IKTE=D%NKTE +IIJB=D%NIJB +IIJE=D%NIJE +! +!We correct negativities with conservation +DO JK = IKTB, IKTE + DO JIJ = IIJB, IIJE + ! 1) deal with negative values for mixing ratio, except for vapor + ZW =PRC(JIJ,JK)-MAX(PRC(JIJ,JK), 0.) + PRV(JIJ,JK)=PRV(JIJ,JK)+ZW + PTH(JIJ,JK)=PTH(JIJ,JK)-ZW*PLVFACT(JIJ,JK) + PRC(JIJ,JK)=PRC(JIJ,JK)-ZW + + ZW =PRR(JIJ,JK)-MAX(PRR(JIJ,JK), 0.) + PRV(JIJ,JK)=PRV(JIJ,JK)+ZW + PTH(JIJ,JK)=PTH(JIJ,JK)-ZW*PLVFACT(JIJ,JK) + PRR(JIJ,JK)=PRR(JIJ,JK)-ZW + + ZW =PRI(JIJ,JK)-MAX(PRI(JIJ,JK), 0.) + PRV(JIJ,JK)=PRV(JIJ,JK)+ZW + PTH(JIJ,JK)=PTH(JIJ,JK)-ZW*PLSFACT(JIJ,JK) + PRI(JIJ,JK)=PRI(JIJ,JK)-ZW + + ZW =PRS(JIJ,JK)-MAX(PRS(JIJ,JK), 0.) + PRV(JIJ,JK)=PRV(JIJ,JK)+ZW + PTH(JIJ,JK)=PTH(JIJ,JK)-ZW*PLSFACT(JIJ,JK) + PRS(JIJ,JK)=PRS(JIJ,JK)-ZW + + ZW =PRG(JIJ,JK)-MAX(PRG(JIJ,JK), 0.) + PRV(JIJ,JK)=PRV(JIJ,JK)+ZW + PTH(JIJ,JK)=PTH(JIJ,JK)-ZW*PLSFACT(JIJ,JK) + PRG(JIJ,JK)=PRG(JIJ,JK)-ZW + + IF(KRR==7) THEN + ZW =PRH(JIJ,JK)-MAX(PRH(JIJ,JK), 0.) + PRV(JIJ,JK)=PRV(JIJ,JK)+ZW + PTH(JIJ,JK)=PTH(JIJ,JK)-ZW*PLSFACT(JIJ,JK) + PRH(JIJ,JK)=PRH(JIJ,JK)-ZW + ENDIF + + ! 2) deal with negative vapor mixing ratio + + ! for rc and ri, we keep ice fraction constant + ZW=MIN(1., MAX(ICED%XRTMIN(1)-PRV(JIJ,JK), 0.) / & + &MAX(PRC(JIJ,JK)+PRI(JIJ,JK), 1.E-20)) ! Proportion of rc+ri to convert into rv + PTH(JIJ,JK)=PTH(JIJ,JK)-ZW* & + &(PRC(JIJ,JK)*PLVFACT(JIJ,JK)+PRI(JIJ,JK)*PLSFACT(JIJ,JK)) + PRV(JIJ,JK)=PRV(JIJ,JK)+ZW*(PRC(JIJ,JK)+PRI(JIJ,JK)) + PRC(JIJ,JK)=(1.-ZW)*PRC(JIJ,JK) + PRI(JIJ,JK)=(1.-ZW)*PRI(JIJ,JK) + + ZW=MIN(MAX(PRR(JIJ,JK), 0.), & + &MAX(ICED%XRTMIN(1)-PRV(JIJ,JK), 0.)) ! Quantity of rr to convert into rv + PRV(JIJ,JK)=PRV(JIJ,JK)+ZW + PRR(JIJ,JK)=PRR(JIJ,JK)-ZW + PTH(JIJ,JK)=PTH(JIJ,JK)-ZW*PLVFACT(JIJ,JK) + + ZW=MIN(MAX(PRS(JIJ,JK), 0.), & + &MAX(ICED%XRTMIN(1)-PRV(JIJ,JK), 0.)) ! Quantity of rs to convert into rv + PRV(JIJ,JK)=PRV(JIJ,JK)+ZW + PRS(JIJ,JK)=PRS(JIJ,JK)-ZW + PTH(JIJ,JK)=PTH(JIJ,JK)-ZW*PLSFACT(JIJ,JK) + + ZW=MIN(MAX(PRG(JIJ,JK), 0.), & + &MAX(ICED%XRTMIN(1)-PRV(JIJ,JK), 0.)) ! Quantity of rg to convert into rv + PRV(JIJ,JK)=PRV(JIJ,JK)+ZW + PRG(JIJ,JK)=PRG(JIJ,JK)-ZW + PTH(JIJ,JK)=PTH(JIJ,JK)-ZW*PLSFACT(JIJ,JK) + + IF(KRR==7) THEN + ZW=MIN(MAX(PRH(JIJ,JK), 0.), & + &MAX(ICED%XRTMIN(1)-PRV(JIJ,JK), 0.)) ! Quantity of rh to convert into rv + PRV(JIJ,JK)=PRV(JIJ,JK)+ZW + PRH(JIJ,JK)=PRH(JIJ,JK)-ZW + PTH(JIJ,JK)=PTH(JIJ,JK)-ZW*PLSFACT(JIJ,JK) + ENDIF + ENDDO +ENDDO +! +IF (LHOOK) CALL DR_HOOK('ICE4_CORRECT_NEGATIVITIES', 1, ZHOOK_HANDLE) +! +END SUBROUTINE ICE4_CORRECT_NEGATIVITIES +! +END MODULE MODE_ICE4_CORRECT_NEGATIVITIES diff --git a/src/PHYEX/micro/mode_ice4_fast_rg.f90 b/src/PHYEX/micro/mode_ice4_fast_rg.f90 index a3457b89e99265cb6324ac53302a3616e871d308..e861b521e69116ceee0607e9998e1debd2314a0e 100644 --- a/src/PHYEX/micro/mode_ice4_fast_rg.f90 +++ b/src/PHYEX/micro/mode_ice4_fast_rg.f90 @@ -97,15 +97,14 @@ REAL, DIMENSION(KPROMA, 8), INTENT(INOUT) :: PRG_TEND ! Individual tendencies INTEGER, PARAMETER :: IRCDRYG=1, IRIDRYG=2, IRIWETG=3, IRSDRYG=4, IRSWETG=5, IRRDRYG=6, & & IFREEZ1=7, IFREEZ2=8 LOGICAL, DIMENSION(KPROMA) :: GDRY, LLDRYG -INTEGER, DIMENSION(KPROMA) :: I1 INTEGER :: IGDRY -REAL, DIMENSION(KPROMA) :: ZVEC1, ZVEC2, ZVEC3 -INTEGER, DIMENSION(KPROMA) :: IVEC1, IVEC2 +REAL, DIMENSION(KPROMA) :: ZBUF1, ZBUF2, ZBUF3 +INTEGER, DIMENSION(KPROMA) :: IBUF1, IBUF2, IBUF3 REAL, DIMENSION(KPROMA) :: ZZW, & ZRDRYG_INIT, & !Initial dry growth rate of the graupeln ZRWETG_INIT !Initial wet growth rate of the graupeln REAL :: ZZW0D -INTEGER :: JJ, JL +INTEGER :: JL REAL(KIND=JPRB) :: ZHOOK_HANDLE !------------------------------------------------------------------------------- @@ -171,58 +170,23 @@ DO JL=1, KSIZE ENDDO ! Wet and dry collection of rs on graupel (6.2.1) -IGDRY = 0 DO JL = 1, KSIZE IF (PRST(JL)>ICED%XRTMIN(5) .AND. PRGT(JL)>ICED%XRTMIN(6) .AND. LDCOMPUTE(JL)) THEN - IGDRY = IGDRY + 1 - I1(IGDRY) = JL GDRY(JL) = .TRUE. ELSE GDRY(JL) = .FALSE. PRG_TEND(JL, IRSDRYG)=0. PRG_TEND(JL, IRSWETG)=0. - END IF + ENDIF ENDDO + IF(.NOT. LDSOFT) THEN + CALL INTERP_MICRO_2D(KPROMA, KSIZE, PLBDAG(:), PLBDAS(:), ICEP%NDRYLBDAG, ICEP%NDRYLBDAS, & + &ICEP%XDRYINTP1G, ICEP%XDRYINTP2G, ICEP%XDRYINTP1S, ICEP%XDRYINTP2S, & + &PARAMI%LPACK_INTERP, GDRY(:), IBUF1(:), IBUF2(:), IBUF3(:), ZBUF1(:), ZBUF2(:), ZBUF3(:), & + &IGDRY, & + &ICEP%XKER_SDRYG(:,:), ZZW(:)) IF(IGDRY>0)THEN - ! - !* 6.2.3 select the (PLBDAG,PLBDAS) couplet - ! - DO JJ = 1, IGDRY - ZVEC1(JJ) = PLBDAG(I1(JJ)) - ZVEC2(JJ) = PLBDAS(I1(JJ)) - END DO - ! - !* 6.2.4 find the next lower indice for the PLBDAG and for the PLBDAS - ! in the geometrical set of (Lbda_g,Lbda_s) couplet use to - ! tabulate the SDRYG-kernel - ! - ZVEC1(1:IGDRY)=MAX(1.00001, MIN(REAL(ICEP%NDRYLBDAG)-0.00001, & - ICEP%XDRYINTP1G*LOG(ZVEC1(1:IGDRY))+ICEP%XDRYINTP2G)) - IVEC1(1:IGDRY)=INT(ZVEC1(1:IGDRY) ) - ZVEC1(1:IGDRY)=ZVEC1(1:IGDRY)-REAL(IVEC1(1:IGDRY)) - ! - ZVEC2(1:IGDRY)=MAX(1.00001, MIN( REAL(ICEP%NDRYLBDAS)-0.00001, & - ICEP%XDRYINTP1S*LOG(ZVEC2(1:IGDRY))+ICEP%XDRYINTP2S)) - IVEC2(1:IGDRY)=INT(ZVEC2(1:IGDRY)) - ZVEC2(1:IGDRY)=ZVEC2(1:IGDRY)-REAL(IVEC2(1:IGDRY)) - ! - !* 6.2.5 perform the bilinear interpolation of the normalized - ! SDRYG-kernel - ! - DO JJ=1, IGDRY - ZVEC3(JJ) = ( ICEP%XKER_SDRYG(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - - ICEP%XKER_SDRYG(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * ZVEC1(JJ) & - - ( ICEP%XKER_SDRYG(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - - ICEP%XKER_SDRYG(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - *(ZVEC1(JJ) - 1.0) - END DO - ZZW(:) = 0. - DO JJ = 1, IGDRY - ZZW(I1(JJ)) = ZVEC3(JJ) - END DO - ! !$mnh_expand_where(JL=1:KSIZE) WHERE(GDRY(1:KSIZE)) PRG_TEND(1:KSIZE, IRSWETG)=ICEP%XFSDRYG*ZZW(1:KSIZE) & ! RSDRYG @@ -245,11 +209,8 @@ ENDIF ! !* 6.2.6 accretion of raindrops on the graupeln ! -IGDRY = 0 DO JL = 1, KSIZE IF (PRRT(JL)>ICED%XRTMIN(3) .AND. PRGT(JL)>ICED%XRTMIN(6) .AND. LDCOMPUTE(JL)) THEN - IGDRY = IGDRY + 1 - I1(IGDRY) = JL GDRY(JL) = .TRUE. ELSE GDRY(JL) = .FALSE. @@ -258,45 +219,12 @@ DO JL = 1, KSIZE ENDDO IF(.NOT. LDSOFT) THEN ! + CALL INTERP_MICRO_2D(KPROMA, KSIZE, PLBDAG(:), PLBDAR(:), ICEP%NDRYLBDAG, ICEP%NDRYLBDAR, & + &ICEP%XDRYINTP1G, ICEP%XDRYINTP2G, ICEP%XDRYINTP1R, ICEP%XDRYINTP2R, & + &PARAMI%LPACK_INTERP, GDRY(:), IBUF1(:), IBUF2(:), IBUF3(:), ZBUF1(:), ZBUF2(:), ZBUF3(:), & + &IGDRY, & + &ICEP%XKER_RDRYG(:,:), ZZW(:)) IF(IGDRY>0) THEN - ! - !* 6.2.8 select the (PLBDAG,PLBDAR) couplet - ! - DO JJ = 1, IGDRY - ZVEC1(JJ) = PLBDAG(I1(JJ)) - ZVEC2(JJ) = PLBDAR(I1(JJ)) - ENDDO - ! - !* 6.2.9 find the next lower indice for the PLBDAG and for the PLBDAR - ! in the geometrical set of (Lbda_g,Lbda_r) couplet use to - ! tabulate the RDRYG-kernel - ! - ZVEC1(1:IGDRY)=MAX(1.00001, MIN( REAL(ICEP%NDRYLBDAG)-0.00001, & - ICEP%XDRYINTP1G*LOG(ZVEC1(1:IGDRY))+ICEP%XDRYINTP2G)) - IVEC1(1:IGDRY)=INT(ZVEC1(1:IGDRY)) - ZVEC1(1:IGDRY)=ZVEC1(1:IGDRY)-REAL(IVEC1(1:IGDRY)) - ! - ZVEC2(1:IGDRY)=MAX(1.00001, MIN( REAL(ICEP%NDRYLBDAR)-0.00001, & - ICEP%XDRYINTP1R*LOG(ZVEC2(1:IGDRY))+ICEP%XDRYINTP2R)) - IVEC2(1:IGDRY)=INT(ZVEC2(1:IGDRY)) - ZVEC2(1:IGDRY)=ZVEC2(1:IGDRY)-REAL(IVEC2(1:IGDRY)) - ! - !* 6.2.10 perform the bilinear interpolation of the normalized - ! RDRYG-kernel - ! - DO JJ=1, IGDRY - ZVEC3(JJ)= ( ICEP%XKER_RDRYG(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - - ICEP%XKER_RDRYG(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * ZVEC1(JJ) & - - ( ICEP%XKER_RDRYG(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - - ICEP%XKER_RDRYG(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - *(ZVEC1(JJ) - 1.0) - END DO - ZZW(:) = 0. - DO JJ = 1, IGDRY - ZZW(I1(JJ)) = ZVEC3(JJ) - END DO - ! !$mnh_expand_where(JL=1:KSIZE) WHERE(GDRY(1:KSIZE)) PRG_TEND(1:KSIZE, IRRDRYG) = ICEP%XFRDRYG*ZZW(1:KSIZE) & ! RRDRYG @@ -439,6 +367,11 @@ DO JL=1, KSIZE ENDDO ! IF (LHOOK) CALL DR_HOOK('ICE4_FAST_RG', 1, ZHOOK_HANDLE) - +! +CONTAINS +! +INCLUDE "interp_micro.func.h" +! END SUBROUTINE ICE4_FAST_RG +! END MODULE MODE_ICE4_FAST_RG diff --git a/src/PHYEX/micro/mode_ice4_fast_rh.f90 b/src/PHYEX/micro/mode_ice4_fast_rh.f90 index 3d13263d73a3d9d3da053943622cc70cc540113b..c35275a392405ce6ac6d661d415b0f4191b5549b 100644 --- a/src/PHYEX/micro/mode_ice4_fast_rh.f90 +++ b/src/PHYEX/micro/mode_ice4_fast_rh.f90 @@ -93,9 +93,8 @@ INTEGER, PARAMETER :: IRCWETH=1, IRRWETH=2, IRIDRYH=3, IRIWETH=4, IRSDRYH=5, IRS & IFREEZ1=9, IFREEZ2=10 LOGICAL, DIMENSION(KPROMA) :: GWET INTEGER :: IGWET -INTEGER, DIMENSION(KPROMA) :: I1 -REAL, DIMENSION(KPROMA) :: ZVEC1, ZVEC2, ZVEC3 -INTEGER, DIMENSION(KPROMA) :: IVEC1, IVEC2 +REAL, DIMENSION(KPROMA) :: ZBUF1, ZBUF2, ZBUF3 +INTEGER, DIMENSION(KPROMA) :: IBUF1, IBUF2, IBUF3 REAL, DIMENSION(KPROMA) :: ZZW, & ZRDRYH_INIT, ZRWETH_INIT, & ZRDRYHG @@ -134,11 +133,8 @@ ENDDO ! !* 7.2.1 accretion of aggregates on the hailstones ! -IGWET = 0 DO JL = 1, KSIZE IF (PRHT(JL)>ICED%XRTMIN(7) .AND. PRST(JL)>ICED%XRTMIN(5) .AND. LDCOMPUTE(JL)) THEN - IGWET = IGWET + 1 - I1(IGWET) = JL GWET(JL) = .TRUE. ELSE GWET(JL) = .FALSE. @@ -147,45 +143,12 @@ DO JL = 1, KSIZE ENDIF ENDDO IF(.NOT. LDSOFT) THEN + CALL INTERP_MICRO_2D(KPROMA, KSIZE, PLBDAH(:), PLBDAS(:), ICEP%NWETLBDAH, ICEP%NWETLBDAS, & + &ICEP%XWETINTP1H, ICEP%XWETINTP2H, ICEP%XWETINTP1S, ICEP%XWETINTP2S, & + &PARAMI%LPACK_INTERP, GWET(:), IBUF1(:), IBUF2(:), IBUF3(:), ZBUF1(:), ZBUF2(:), ZBUF3(:), & + &IGWET, & + &ICEP%XKER_SWETH(:,:), ZZW(:)) IF(IGWET>0)THEN - ! - !* 7.2.3 select the (PLBDAH,PLBDAS) couplet - ! - DO JJ = 1, IGWET - ZVEC1(JJ) = PLBDAH(I1(JJ)) - ZVEC2(JJ) = PLBDAS(I1(JJ)) - ENDDO - ! - !* 7.2.4 find the next lower indice for the PLBDAG and for the PLBDAS - ! in the geometrical set of (Lbda_h,Lbda_s) couplet use to - ! tabulate the SWETH-kernel - ! - ZVEC1(1:IGWET) = MAX( 1.00001, MIN( REAL(ICEP%NWETLBDAH)-0.00001, & - ICEP%XWETINTP1H * LOG( ZVEC1(1:IGWET) ) + ICEP%XWETINTP2H ) ) - IVEC1(1:IGWET) = INT( ZVEC1(1:IGWET) ) - ZVEC1(1:IGWET) = ZVEC1(1:IGWET) - REAL( IVEC1(1:IGWET) ) - ! - ZVEC2(1:IGWET) = MAX( 1.00001, MIN( REAL(ICEP%NWETLBDAS)-0.00001, & - ICEP%XWETINTP1S * LOG( ZVEC2(1:IGWET) ) + ICEP%XWETINTP2S ) ) - IVEC2(1:IGWET) = INT( ZVEC2(1:IGWET) ) - ZVEC2(1:IGWET) = ZVEC2(1:IGWET) - REAL( IVEC2(1:IGWET) ) - ! - !* 7.2.5 perform the bilinear interpolation of the normalized - ! SWETH-kernel - ! - DO JJ = 1,IGWET - ZVEC3(JJ) = ( ICEP%XKER_SWETH(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - - ICEP%XKER_SWETH(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * ZVEC1(JJ) & - - ( ICEP%XKER_SWETH(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - - ICEP%XKER_SWETH(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * (ZVEC1(JJ) - 1.0) - END DO - ZZW(:) = 0. - DO JJ = 1, IGWET - ZZW(I1(JJ)) = ZVEC3(JJ) - END DO - ! !$mnh_expand_where(JL=1:KSIZE) WHERE(GWET(1:KSIZE)) PRH_TEND(1:KSIZE, IRSWETH)=ICEP%XFSWETH*ZZW(1:KSIZE) & ! RSWETH @@ -207,11 +170,8 @@ ENDIF ! !* 7.2.6 accretion of graupeln on the hailstones ! -IGWET = 0 DO JL = 1, KSIZE IF (PRHT(JL)>ICED%XRTMIN(7) .AND. PRGT(JL)>ICED%XRTMIN(6) .AND. LDCOMPUTE(JL)) THEN - IGWET = IGWET + 1 - I1(IGWET) = JL GWET(JL) = .TRUE. ELSE GWET(JL) = .FALSE. @@ -220,45 +180,12 @@ DO JL = 1, KSIZE END IF ENDDO IF(.NOT. LDSOFT) THEN + CALL INTERP_MICRO_2D(KPROMA, KSIZE, PLBDAH(:), PLBDAG(:), ICEP%NWETLBDAH, ICEP%NWETLBDAG, & + &ICEP%XWETINTP1H, ICEP%XWETINTP2H, ICEP%XWETINTP1G, ICEP%XWETINTP2G, & + &PARAMI%LPACK_INTERP, GWET(:), IBUF1(:), IBUF2(:), IBUF3(:), ZBUF1(:), ZBUF2(:), ZBUF3(:), & + &IGWET, & + &ICEP%XKER_GWETH(:,:), ZZW(:)) IF(IGWET>0)THEN - ! - !* 7.2.8 select the (PLBDAH,PLBDAG) couplet - ! - DO JJ = 1, IGWET - ZVEC1(JJ) = PLBDAH(I1(JJ)) - ZVEC2(JJ) = PLBDAG(I1(JJ)) - END DO - ! - !* 7.2.9 find the next lower indice for the PLBDAH and for the PLBDAG - ! in the geometrical set of (Lbda_h,Lbda_g) couplet use to - ! tabulate the GWETH-kernel - ! - ZVEC1(1:IGWET) = MAX( 1.00001, MIN( REAL(ICEP%NWETLBDAG)-0.00001, & - ICEP%XWETINTP1H * LOG( ZVEC1(1:IGWET) ) + ICEP%XWETINTP2H ) ) - IVEC1(1:IGWET) = INT( ZVEC1(1:IGWET) ) - ZVEC1(1:IGWET) = ZVEC1(1:IGWET) - REAL( IVEC1(1:IGWET) ) - ! - ZVEC2(1:IGWET) = MAX( 1.00001, MIN( REAL(ICEP%NWETLBDAG)-0.00001, & - ICEP%XWETINTP1G * LOG( ZVEC2(1:IGWET) ) + ICEP%XWETINTP2G ) ) - IVEC2(1:IGWET) = INT( ZVEC2(1:IGWET) ) - ZVEC2(1:IGWET) = ZVEC2(1:IGWET) - REAL( IVEC2(1:IGWET) ) - ! - !* 7.2.10 perform the bilinear interpolation of the normalized - ! GWETH-kernel - ! - DO JJ = 1,IGWET - ZVEC3(JJ) = ( ICEP%XKER_GWETH(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - - ICEP%XKER_GWETH(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * ZVEC1(JJ) & - - ( ICEP%XKER_GWETH(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - - ICEP%XKER_GWETH(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * (ZVEC1(JJ) - 1.0) - END DO - ZZW(:) = 0. - DO JJ = 1, IGWET - ZZW(I1(JJ)) = ZVEC3(JJ) - END DO - ! !$mnh_expand_where(JL=1:KSIZE) WHERE(GWET(1:KSIZE)) PRH_TEND(1:KSIZE, IRGWETH)=ICEP%XFGWETH*ZZW(1:KSIZE) & ! RGWETH @@ -279,11 +206,8 @@ ENDIF ! !* 7.2.11 accretion of raindrops on the hailstones ! -IGWET = 0 DO JL = 1, KSIZE IF (PRHT(JL)>ICED%XRTMIN(7) .AND. PRRT(JL)>ICED%XRTMIN(3) .AND. LDCOMPUTE(JL)) THEN - IGWET = IGWET + 1 - I1(IGWET) = JL GWET(JL) = .TRUE. ELSE GWET(JL) = .FALSE. @@ -291,45 +215,12 @@ DO JL = 1, KSIZE ENDIF ENDDO IF(.NOT. LDSOFT) THEN + CALL INTERP_MICRO_2D(KPROMA, KSIZE, PLBDAH(:), PLBDAR(:), ICEP%NWETLBDAH, ICEP%NWETLBDAR, & + &ICEP%XWETINTP1H, ICEP%XWETINTP2H, ICEP%XWETINTP1R, ICEP%XWETINTP2R, & + &PARAMI%LPACK_INTERP, GWET(:), IBUF1(:), IBUF2(:), IBUF3(:), ZBUF1(:), ZBUF2(:), ZBUF3(:), & + &IGWET, & + &ICEP%XKER_RWETH(:,:), ZZW(:)) IF(IGWET>0)THEN - ! - !* 7.2.12 select the (PLBDAH,PLBDAR) couplet - ! - DO JJ = 1, IGWET - ZVEC1(JJ) = PLBDAH(I1(JJ)) - ZVEC2(JJ) = PLBDAR(I1(JJ)) - ENDDO - ! - !* 7.2.13 find the next lower indice for the PLBDAH and for the PLBDAR - ! in the geometrical set of (Lbda_h,Lbda_r) couplet use to - ! tabulate the RWETH-kernel - ! - ZVEC1(1:IGWET)=MAX(1.00001, MIN( REAL(ICEP%NWETLBDAH)-0.00001, & - ICEP%XWETINTP1H*LOG(ZVEC1(1:IGWET))+ICEP%XWETINTP2H)) - IVEC1(1:IGWET)=INT(ZVEC1(1:IGWET)) - ZVEC1(1:IGWET)=ZVEC1(1:IGWET)-REAL(IVEC1(1:IGWET)) - ! - ZVEC2(1:IGWET)=MAX(1.00001, MIN( REAL(ICEP%NWETLBDAR)-0.00001, & - ICEP%XWETINTP1R*LOG(ZVEC2(1:IGWET))+ICEP%XWETINTP2R)) - IVEC2(1:IGWET)=INT(ZVEC2(1:IGWET)) - ZVEC2(1:IGWET)=ZVEC2(1:IGWET)-REAL(IVEC2(1:IGWET)) - ! - !* 7.2.14 perform the bilinear interpolation of the normalized - ! RWETH-kernel - ! - DO JJ=1, IGWET - ZVEC3(JJ)= ( ICEP%XKER_RWETH(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - - ICEP%XKER_RWETH(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * ZVEC1(JJ) & - - ( ICEP%XKER_RWETH(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - - ICEP%XKER_RWETH(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - *(ZVEC1(JJ) - 1.0) - END DO - ZZW(:) = 0. - DO JJ = 1, IGWET - ZZW(I1(JJ)) = ZVEC3(JJ) - END DO - ! !$mnh_expand_where(JL=1:KSIZE) WHERE(GWET(1:KSIZE)) PRH_TEND(1:KSIZE, IRRWETH) = ICEP%XFRWETH*ZZW(1:KSIZE) & ! RRWETH @@ -476,5 +367,9 @@ ENDDO ! IF (LHOOK) CALL DR_HOOK('ICE4_FAST_RH', 1, ZHOOK_HANDLE) ! +CONTAINS +! +INCLUDE "interp_micro.func.h" +! END SUBROUTINE ICE4_FAST_RH END MODULE MODE_ICE4_FAST_RH diff --git a/src/PHYEX/micro/mode_ice4_fast_rs.f90 b/src/PHYEX/micro/mode_ice4_fast_rs.f90 index 6655b2061604da1a8fc9f135b27728317ad0ba93..d79105d0c9f6cd0b2de3959b14a4bc558aa16288 100644 --- a/src/PHYEX/micro/mode_ice4_fast_rs.f90 +++ b/src/PHYEX/micro/mode_ice4_fast_rs.f90 @@ -85,11 +85,11 @@ INTEGER, PARAMETER :: IRCRIMS=1, IRCRIMSS=2, IRSRIMCG=3, IRRACCS=4, IRRACCSS=5, & IFREEZ1=7, IFREEZ2=8 LOGICAL, DIMENSION(KPROMA) :: GRIM, GACC INTEGER :: IGRIM, IGACC -INTEGER, DIMENSION(KPROMA) :: I1 -REAL, DIMENSION(KPROMA) :: ZVEC1, ZVEC2, ZVEC3 -INTEGER, DIMENSION(KPROMA) :: IVEC1, IVEC2 -REAL, DIMENSION(KPROMA) :: ZZW, ZZW2, ZZW6, ZFREEZ_RATE +INTEGER, DIMENSION(KPROMA) :: IBUF1, IBUF2, IBUF3 +REAL, DIMENSION(KPROMA) :: ZBUF1, ZBUF2, ZBUF3 +REAL, DIMENSION(KPROMA) :: ZZW, ZZW1, ZZW2, ZZW3, ZFREEZ_RATE INTEGER :: JJ, JL +REAL :: ZZW0D REAL(KIND=JPRB) :: ZHOOK_HANDLE !------------------------------------------------------------------------------- ! @@ -137,11 +137,13 @@ ENDDO ! !* 5.1 cloud droplet riming of the aggregates ! -IGRIM = 0 DO JL=1, KSIZE IF (PRCT(JL)>ICED%XRTMIN(2) .AND. PRST(JL)>ICED%XRTMIN(5) .AND. LDCOMPUTE(JL)) THEN - IGRIM = IGRIM + 1 - I1(IGRIM) = JL +#if defined(REPRO48) || defined(REPRO55) + ZZW(JL) = PLBDAS(JL) +#else + ZZW(JL) = (PLBDAS(JL)**ICED%XALPHAS + ICED%XFVELOS**ICED%XALPHAS)**(1./ICED%XALPHAS) +#endif GRIM(JL) = .TRUE. ELSE GRIM(JL) = .FALSE. @@ -153,77 +155,29 @@ ENDDO ! ! Collection of cloud droplets by snow: this rate is used for riming (T<0) and for conversion/melting (T>0) IF(.NOT. LDSOFT) THEN + CALL INTERP_MICRO_1D(KPROMA, KSIZE, ZZW, ICEP%NGAMINC, ICEP%XRIMINTP1, ICEP%XRIMINTP2, & + PARAMI%LPACK_INTERP, GRIM(:), IBUF1, IBUF2, ZBUF1, ZBUF2, & + IGRIM, & + ICEP%XGAMINC_RIM1(:), ZZW1(:), ICEP%XGAMINC_RIM2(:), ZZW2(:), ICEP%XGAMINC_RIM4(:), ZZW3(:)) IF(IGRIM>0) THEN - ! - ! 5.1.1 select the PLBDAS - ! - DO JJ = 1, IGRIM -#if defined(REPRO48) || defined(REPRO55) - ZVEC1(JJ) = PLBDAS(I1(JJ)) -#else - ZVEC1(JJ) = (PLBDAS(I1(JJ))**ICED%XALPHAS + ICED%XFVELOS**ICED%XALPHAS)**(1./ICED%XALPHAS) -#endif - END DO - ! - ! 5.1.2 find the next lower indice for the PLBDAS in the geometrical - ! set of Lbda_s used to tabulate some moments of the incomplete - ! gamma function - ! - !$mnh_expand_where(JJ=1:IGRIM) - ZVEC2(1:IGRIM) = MAX( 1.00001, MIN( REAL(ICEP%NGAMINC)-0.00001, & - ICEP%XRIMINTP1 * LOG( ZVEC1(1:IGRIM) ) + ICEP%XRIMINTP2 ) ) - IVEC2(1:IGRIM) = INT( ZVEC2(1:IGRIM) ) - ZVEC2(1:IGRIM) = ZVEC2(1:IGRIM) - REAL( IVEC2(1:IGRIM) ) - ! - ! 5.1.3 perform the linear interpolation of the normalized - ! "2+XDS"-moment of the incomplete gamma function - ! - ZVEC1(1:IGRIM) = ICEP%XGAMINC_RIM1( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & - - ICEP%XGAMINC_RIM1( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) - !$mnh_end_expand_where(JJ=1:IGRIM) - ZZW(:) = 0. - DO JJ = 1, IGRIM - ZZW(I1(JJ)) = ZVEC1(JJ) - END DO ! ! 5.1.4 riming of the small sized aggregates ! !$mnh_expand_where(JL=1:KSIZE) WHERE (GRIM(1:KSIZE)) - PRS_TEND(1:KSIZE, IRCRIMSS) = ICEP%XCRIMSS * ZZW(1:KSIZE) * PRCT(1:KSIZE) & ! RCRIMSS + PRS_TEND(1:KSIZE, IRCRIMSS) = ICEP%XCRIMSS * ZZW1(1:KSIZE) * PRCT(1:KSIZE) & ! RCRIMSS #if defined(REPRO48) || defined(REPRO55) - * PLBDAS(1:KSIZE)**ICEP%XEXCRIMSS & + * PLBDAS(1:KSIZE)**ICEP%XEXCRIMSS & * PRHODREF(1:KSIZE)**(-ICED%XCEXVT) #else - * PRST(1:KSIZE)*(1+(ICED%XFVELOS/PLBDAS(1:KSIZE))**ICED%XALPHAS)**(-ICED%XNUS+ICEP%XEXCRIMSS/ICED%XALPHAS) & + * PRST(1:KSIZE)*(1+(ICED%XFVELOS/PLBDAS(1:KSIZE))**ICED%XALPHAS) & + **(-ICED%XNUS+ICEP%XEXCRIMSS/ICED%XALPHAS) & * PRHODREF(1:KSIZE)**(-ICED%XCEXVT+1.) & - * (PLBDAS(1:KSIZE)) ** (ICEP%XEXCRIMSS+ICED%XBS) + * (PLBDAS(1:KSIZE)) ** (ICEP%XEXCRIMSS+ICED%XBS) #endif END WHERE !$mnh_end_expand_where(JL=1:KSIZE) ! - ! 5.1.5 perform the linear interpolation of the normalized - ! "XBS"-moment of the incomplete gamma function (XGAMINC_RIM2) and - ! "XBG"-moment of the incomplete gamma function (XGAMINC_RIM4) - ! - !$mnh_expand_where(JJ=1:IGRIM) - ZVEC1(1:IGRIM) = ICEP%XGAMINC_RIM2( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & - - ICEP%XGAMINC_RIM2( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) - !$mnh_end_expand_where(JJ=1:IGRIM) - ZZW(:) = 0. - DO JJ = 1, IGRIM - ZZW(I1(JJ)) = ZVEC1(JJ) - END DO - - !$mnh_expand_where(JJ=1:IGRIM) - ZVEC1(1:IGRIM) = ICEP%XGAMINC_RIM4( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & - - ICEP%XGAMINC_RIM4( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) - !$mnh_end_expand_where(JJ=1:IGRIM) - ZZW2(:) = 0. - DO JJ = 1, IGRIM - ZZW2(I1(JJ)) = ZVEC1(JJ) - END DO - ! ! 5.1.6 riming-conversion of the large sized aggregates into graupeln ! ! @@ -234,7 +188,8 @@ IF(.NOT. LDSOFT) THEN * PLBDAS(1:KSIZE)**ICEP%XEXCRIMSG & * PRHODREF(1:KSIZE)**(-ICED%XCEXVT) #else - * PRST(1:KSIZE)*(1+(ICED%XFVELOS/PLBDAS(1:KSIZE))**(ICED%XALPHAS))**(-ICED%XNUS+ICEP%XEXCRIMSG/ICED%XALPHAS) & + * PRST(1:KSIZE)*(1+(ICED%XFVELOS/PLBDAS(1:KSIZE))**(ICED%XALPHAS)) & + **(-ICED%XNUS+ICEP%XEXCRIMSG/ICED%XALPHAS) & * PRHODREF(1:KSIZE)**(-ICED%XCEXVT+1.) & * PLBDAS(1:KSIZE)**(ICED%XBS+ICEP%XEXCRIMSG) #endif @@ -245,18 +200,20 @@ IF(.NOT. LDSOFT) THEN !Murakami 1990 !$mnh_expand_where(JL=1:KSIZE) WHERE(GRIM(1:KSIZE)) - ZZW6(1:KSIZE) = PRS_TEND(1:KSIZE, IRCRIMS) - PRS_TEND(1:KSIZE, IRCRIMSS) ! RCRIMSG + ZZW(1:KSIZE) = PRS_TEND(1:KSIZE, IRCRIMS) - PRS_TEND(1:KSIZE, IRCRIMSS) ! RCRIMSG #if defined(REPRO48) || defined(REPRO55) - PRS_TEND(1:KSIZE, IRSRIMCG)=ICEP%XSRIMCG * PLBDAS(1:KSIZE)**ICEP%XEXSRIMCG*(1.0-ZZW(1:KSIZE)) + PRS_TEND(1:KSIZE, IRSRIMCG)=ICEP%XSRIMCG * PLBDAS(1:KSIZE)**ICEP%XEXSRIMCG*(1.0-ZZW2(1:KSIZE)) #else - PRS_TEND(1:KSIZE, IRSRIMCG)=ICEP%XSRIMCG * PRST(1:KSIZE)*PRHODREF(1:KSIZE)*PLBDAS(1:KSIZE)**(ICEP%XEXSRIMCG+ICED%XBS)*(1.0-ZZW(1:KSIZE)) + PRS_TEND(1:KSIZE, IRSRIMCG)=ICEP%XSRIMCG * PRST(1:KSIZE)*PRHODREF(1:KSIZE) & + * PLBDAS(1:KSIZE)**(ICEP%XEXSRIMCG+ICED%XBS)*(1.0-ZZW2(1:KSIZE)) #endif - PRS_TEND(1:KSIZE, IRSRIMCG)=ZZW6(1:KSIZE)*PRS_TEND(1:KSIZE, IRSRIMCG)/ & + PRS_TEND(1:KSIZE, IRSRIMCG)=ZZW(1:KSIZE)*PRS_TEND(1:KSIZE, IRSRIMCG)/ & MAX(1.E-20, & #if defined(REPRO48) || defined(REPRO55) - ICEP%XSRIMCG3*ICEP%XSRIMCG2*PLBDAS(1:KSIZE)**ICEP%XEXSRIMCG2*(1.-ZZW2(1:KSIZE)) - & + ICEP%XSRIMCG3*ICEP%XSRIMCG2*PLBDAS(1:KSIZE)**ICEP%XEXSRIMCG2*(1.-ZZW3(1:KSIZE)) - & #else - ICEP%XSRIMCG3*ICEP%XSRIMCG2*PRST(1:KSIZE)*PRHODREF(1:KSIZE)*PLBDAS(1:KSIZE)**ICEP%XEXSRIMCG2*(1.-ZZW2(1:KSIZE)) - & + ICEP%XSRIMCG3*ICEP%XSRIMCG2*PRST(1:KSIZE)*PRHODREF(1:KSIZE) & + *PLBDAS(1:KSIZE)**ICEP%XEXSRIMCG2*(1.-ZZW3(1:KSIZE)) - & #endif ICEP%XSRIMCG3*PRS_TEND(1:KSIZE, IRSRIMCG)) END WHERE @@ -272,10 +229,10 @@ DO JL=1, KSIZE IF(GRIM(JL) .AND. PT(JL)<CST%XTT) THEN PRCRIMSS(JL)=MIN(ZFREEZ_RATE(JL), PRS_TEND(JL, IRCRIMSS)) ZFREEZ_RATE(JL)=MAX(0., ZFREEZ_RATE(JL)-PRCRIMSS(JL)) - ZZW(JL) = MIN(1., ZFREEZ_RATE(JL) / MAX(1.E-20, PRS_TEND(JL, IRCRIMS) - PRCRIMSS(JL))) ! proportion we are able to freeze - PRCRIMSG(JL) = ZZW(JL) * MAX(0., PRS_TEND(JL, IRCRIMS) - PRCRIMSS(JL)) ! RCRIMSG + ZZW0D = MIN(1., ZFREEZ_RATE(JL) / MAX(1.E-20, PRS_TEND(JL, IRCRIMS) - PRCRIMSS(JL))) ! proportion we are able to freeze + PRCRIMSG(JL) = ZZW0D * MAX(0., PRS_TEND(JL, IRCRIMS) - PRCRIMSS(JL)) ! RCRIMSG ZFREEZ_RATE(JL)=MAX(0., ZFREEZ_RATE(JL)-PRCRIMSG(JL)) - PRSRIMCG(JL) = ZZW(JL) * PRS_TEND(JL, IRSRIMCG) + PRSRIMCG(JL) = ZZW0D * PRS_TEND(JL, IRSRIMCG) PRSRIMCG(JL) = PRSRIMCG(JL) * MAX(0., -SIGN(1., -PRCRIMSG(JL))) PRCRIMSG(JL)=MAX(0., PRCRIMSG(JL)) @@ -288,11 +245,8 @@ ENDDO ! !* 5.2 rain accretion onto the aggregates ! -IGACC = 0 DO JL = 1, KSIZE IF (PRRT(JL)>ICED%XRTMIN(3) .AND. PRST(JL)>ICED%XRTMIN(5) .AND. LDCOMPUTE(JL)) THEN - IGACC = IGACC + 1 - I1(IGACC) = JL GACC(JL) = .TRUE. ELSE GACC(JL) = .FALSE. @@ -305,53 +259,17 @@ IF(.NOT. LDSOFT) THEN PRS_TEND(:, IRRACCS)=0. PRS_TEND(:, IRRACCSS)=0. PRS_TEND(:, IRSACCRG)=0. + CALL INTERP_MICRO_2D(KPROMA, KSIZE, PLBDAS, PLBDAR, ICEP%NACCLBDAS, ICEP%NACCLBDAR, & + &ICEP%XACCINTP1S, ICEP%XACCINTP2S, ICEP%XACCINTP1R, ICEP%XACCINTP2R,& + &PARAMI%LPACK_INTERP, GACC(:), IBUF1(:), IBUF2(:), IBUF3(:), ZBUF1(:), ZBUF2(:), ZBUF3(:), & + &IGACC, & + &ICEP%XKER_RACCSS(:,:), ZZW1(:), ICEP%XKER_RACCS(:,:), ZZW2(:), ICEP%XKER_SACCRG(:,:), ZZW3(:)) IF(IGACC>0)THEN - ! - ! - ! 5.2.1 select the (PLBDAS,PLBDAR) couplet - ! - DO JJ = 1, IGACC - ZVEC1(JJ) = PLBDAS(I1(JJ)) - ZVEC2(JJ) = PLBDAR(I1(JJ)) - ENDDO - ! - ! 5.2.2 find the next lower indice for the PLBDAS and for the PLBDAR - ! in the geometrical set of (Lbda_s,Lbda_r) couplet use to - ! tabulate the RACCSS-kernel - ! - !$mnh_expand_where(JJ=1:IGACC) - ZVEC1(1:IGACC) = MAX( 1.00001, MIN( REAL(ICEP%NACCLBDAS)-0.00001, & - ICEP%XACCINTP1S * LOG( ZVEC1(1:IGACC) ) + ICEP%XACCINTP2S ) ) - IVEC1(1:IGACC) = INT( ZVEC1(1:IGACC) ) - ZVEC1(1:IGACC) = ZVEC1(1:IGACC) - REAL( IVEC1(1:IGACC) ) - ! - ZVEC2(1:IGACC) = MAX( 1.00001, MIN( REAL(ICEP%NACCLBDAR)-0.00001, & - ICEP%XACCINTP1R * LOG( ZVEC2(1:IGACC) ) + ICEP%XACCINTP2R ) ) - IVEC2(1:IGACC) = INT( ZVEC2(1:IGACC) ) - ZVEC2(1:IGACC) = ZVEC2(1:IGACC) - REAL( IVEC2(1:IGACC) ) - !$mnh_end_expand_where(JJ=1:IGACC) - ! - ! 5.2.3 perform the bilinear interpolation of the normalized - ! RACCSS-kernel - ! - DO JJ = 1, IGACC - ZVEC3(JJ) = ( ICEP%XKER_RACCSS(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - - ICEP%XKER_RACCSS(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * ZVEC1(JJ) & - - ( ICEP%XKER_RACCSS(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - - ICEP%XKER_RACCSS(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * (ZVEC1(JJ) - 1.0) - END DO - ZZW(:) = 0. - DO JJ = 1, IGACC - ZZW(I1(JJ)) = ZVEC3(JJ) - END DO - ! ! 5.2.4 raindrop accretion on the small sized aggregates ! !$mnh_expand_where(JL=1:KSIZE) WHERE(GACC(1:KSIZE)) - ZZW6(1:KSIZE) = & !! coef of RRACCS + ZZW(1:KSIZE) = & !! coef of RRACCS #if defined(REPRO48) || defined(REPRO55) ICEP%XFRACCSS*( PLBDAS(1:KSIZE)**ICED%XCXS )*( PRHODREF(1:KSIZE)**(-ICED%XCEXVT-1.) ) & #else @@ -360,52 +278,22 @@ IF(.NOT. LDSOFT) THEN *( ICEP%XLBRACCS1/((PLBDAS(1:KSIZE)**2) ) + & ICEP%XLBRACCS2/( PLBDAS(1:KSIZE) * PLBDAR(1:KSIZE) ) + & ICEP%XLBRACCS3/( (PLBDAR(1:KSIZE)**2)) )/PLBDAR(1:KSIZE)**4 - PRS_TEND(1:KSIZE, IRRACCSS) =ZZW(1:KSIZE)*ZZW6(1:KSIZE) + PRS_TEND(1:KSIZE, IRRACCSS) =ZZW1(1:KSIZE)*ZZW(1:KSIZE) END WHERE !$mnh_end_expand_where(JL=1:KSIZE) ! - ! 5.2.4b perform the bilinear interpolation of the normalized - ! RACCS-kernel - ! - DO JJ = 1, IGACC - ZVEC3(JJ) = ( ICEP%XKER_RACCS(IVEC1(JJ)+1,IVEC2(JJ)+1)* ZVEC2(JJ) & - - ICEP%XKER_RACCS(IVEC1(JJ)+1,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * ZVEC1(JJ) & - - ( ICEP%XKER_RACCS(IVEC1(JJ) ,IVEC2(JJ)+1)* ZVEC2(JJ) & - - ICEP%XKER_RACCS(IVEC1(JJ) ,IVEC2(JJ) )*(ZVEC2(JJ) - 1.0) ) & - * (ZVEC1(JJ) - 1.0) - END DO - ZZW(:) = 0. - DO JJ = 1, IGACC - ZZW(I1(JJ)) = ZVEC3(JJ) - END DO !$mnh_expand_where(JL=1:KSIZE) WHERE(GACC(1:KSIZE)) - PRS_TEND(1:KSIZE, IRRACCS) = ZZW(1:KSIZE)*ZZW6(1:KSIZE) + PRS_TEND(1:KSIZE, IRRACCS) = ZZW2(1:KSIZE)*ZZW(1:KSIZE) END WHERE !$mnh_end_expand_where(JL=1:KSIZE) - ! 5.2.5 perform the bilinear interpolation of the normalized - ! SACCRG-kernel - ! - DO JJ = 1, IGACC - ZVEC3(JJ) = ( ICEP%XKER_SACCRG(IVEC2(JJ)+1,IVEC1(JJ)+1)* ZVEC1(JJ) & - - ICEP%XKER_SACCRG(IVEC2(JJ)+1,IVEC1(JJ) )*(ZVEC1(JJ) - 1.0) ) & - * ZVEC2(JJ) & - - ( ICEP%XKER_SACCRG(IVEC2(JJ) ,IVEC1(JJ)+1)* ZVEC1(JJ) & - - ICEP%XKER_SACCRG(IVEC2(JJ) ,IVEC1(JJ) )*(ZVEC1(JJ) - 1.0) ) & - * (ZVEC2(JJ) - 1.0) - END DO - ZZW(:) = 0. - DO JJ = 1, IGACC - ZZW(I1(JJ)) = ZVEC3(JJ) - END DO ! ! 5.2.6 raindrop accretion-conversion of the large sized aggregates ! into graupeln ! !$mnh_expand_where(JL=1:KSIZE) WHERE(GACC(1:KSIZE)) - PRS_TEND(1:KSIZE, IRSACCRG) = ICEP%XFSACCRG*ZZW(1:KSIZE)* & ! RSACCRG + PRS_TEND(1:KSIZE, IRSACCRG) = ICEP%XFSACCRG*ZZW3(1:KSIZE)* & ! RSACCRG #if defined(REPRO48) || defined(REPRO55) ( PLBDAS(1:KSIZE)**(ICED%XCXS-ICED%XBS) )*( PRHODREF(1:KSIZE)**(-ICED%XCEXVT-1.) ) & #else @@ -484,5 +372,9 @@ ENDDO IF (LHOOK) CALL DR_HOOK('ICE4_FAST_RS', 1, ZHOOK_HANDLE) ! +CONTAINS +! +INCLUDE "interp_micro.func.h" +! END SUBROUTINE ICE4_FAST_RS END MODULE MODE_ICE4_FAST_RS diff --git a/src/PHYEX/micro/mode_ice4_pack.f90 b/src/PHYEX/micro/mode_ice4_pack.f90 new file mode 100644 index 0000000000000000000000000000000000000000..e955a223d98f4629b532d6cdd68f71539e59fa05 --- /dev/null +++ b/src/PHYEX/micro/mode_ice4_pack.f90 @@ -0,0 +1,407 @@ +!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +MODULE MODE_ICE4_PACK +IMPLICIT NONE +CONTAINS +SUBROUTINE ICE4_PACK(D, CST, PARAMI, ICEP, ICED, BUCONF, & + KPROMA, KSIZE, KSIZE2, & + HSUBG_AUCV_RC, HSUBG_AUCV_RI, & + PTSTEP, KRR, ODMICRO, PEXN, & + PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR, & + PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & + PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS, & + PEVAP3D, & + PRAINFR, PSIGS, & + PRVHENI, PLVFACT, PLSFACT, & + PWR, & + TBUDGETS, KBUDGETS, & + PRHS ) +! ----------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK + +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_BUDGET, ONLY: TBUDGETDATA, TBUDGETCONF_t +USE MODD_CST, ONLY: CST_t +USE MODD_PARAM_ICE, ONLY: PARAM_ICE_t +USE MODD_RAIN_ICE_DESCR, ONLY: RAIN_ICE_DESCR_t +USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t +USE MODD_FIELDS_ADDRESS, ONLY : & ! common fields adress + & ITH, & ! Potential temperature + & IRV, & ! Water vapor + & IRC, & ! Cloud water + & IRR, & ! Rain water + & IRI, & ! Pristine ice + & IRS, & ! Snow/aggregate + & IRG, & ! Graupel + & IRH, & ! Hail + & IBUNUM, & ! Number of tendency terms + & IBUNUM_EXTRA ! Number of extra tendency terms + +USE MODE_MSG, ONLY: PRINT_MSG, NVERB_FATAL + +USE MODE_ICE4_STEPPING, ONLY: ICE4_STEPPING +USE MODE_ICE4_BUDGETS, ONLY: ICE4_BUDGETS +! +IMPLICIT NONE + +!NOTES ON SIZES +!If we pack: +! - KSIZE is the number of relevant point (with mixing ratio different from 0) +! - KPROMA is the size of bloc of points +! - ZSIZE2 has the same value as KPROMA +!If we do not pack: +! - KSIZE is the total number of points +! - KPROMA is null for memory saving +! - KSIZE2 has the same value as KSIZE +! +!When we do not pack, we can transmit directly the 3D arrays to the ice4_stepping subroutine, we do not need +!to copy the values. It is why KPROMA is null because we do not need these arrays. +!But some arrays must me manipulated before being transmitted and we need temporary arrays for this. +!KSIZE2 is used for those arrays that must be dimensioned KPROMA if we pack or with the total size if not. + + +! +!* 0.1 Declarations of dummy arguments : +! +! +! +TYPE(DIMPHYEX_t), INTENT(IN) :: D +TYPE(CST_t), INTENT(IN) :: CST +TYPE(PARAM_ICE_t), INTENT(IN) :: PARAMI +TYPE(RAIN_ICE_PARAM_t), INTENT(IN) :: ICEP +TYPE(RAIN_ICE_DESCR_t), INTENT(IN) :: ICED +TYPE(TBUDGETCONF_t), INTENT(IN) :: BUCONF +INTEGER, INTENT(IN) :: KPROMA ! cache-blocking factor for microphysic loop +INTEGER, INTENT(IN) :: KSIZE +INTEGER, INTENT(IN) :: KSIZE2 +CHARACTER(LEN=4), INTENT(IN) :: HSUBG_AUCV_RC ! Kind of Subgrid autoconversion method +CHARACTER(LEN=80), INTENT(IN) :: HSUBG_AUCV_RI ! Kind of Subgrid autoconversion method +REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) +INTEGER, INTENT(IN) :: KRR ! Number of moist variable +LOGICAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: ODMICRO ! mask to limit computation +! +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PEXN ! Exner function +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PEXNREF ! Reference Exner function +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PPABST ! absolute pressure at t +! +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PCIT ! Pristine ice n.c. at t +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PCLDFR ! Cloud fraction +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PHLC_HRC +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PHLC_HCF +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PHLI_HRI +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PHLI_HCF +! +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PTHS ! Theta source +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRVS ! Water vapor m.r. source +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRGS ! Graupel m.r. source +! +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PEVAP3D! Rain evap profile +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PRAINFR !Precipitation fraction +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PSIGS ! Sigma_s at t +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRVHENI ! heterogeneous nucleation +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PLVFACT +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PLSFACT +REAL, DIMENSION(D%NIJT,D%NKT,0:7), INTENT(OUT) :: PWR +TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS +INTEGER, INTENT(IN) :: KBUDGETS +REAL, DIMENSION(D%NIJT,D%NKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source +! +! +!* 0.2 Declarations of local variables : +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +INTEGER :: JIJ, JK +INTEGER :: IKTB, IKTE, IIJB, IIJE +INTEGER :: ISTIJ, ISTK +! +LOGICAL :: GEXT_TEND +! +!Output packed total mixing ratio change (for budgets only) +REAL, DIMENSION(KSIZE, IBUNUM-IBUNUM_EXTRA) :: ZBU_PACK +! +!For packing +INTEGER :: IMICRO ! Case r_x>0 locations +INTEGER :: JL, JV +REAL, DIMENSION(KPROMA) :: & + & ZCIT, & ! Pristine ice conc. at t + & ZRHODREF, & ! RHO Dry REFerence + & ZPRES, & ! Pressure + & ZEXN, & ! EXNer Pressure + & ZCF, & ! Cloud fraction + & ZHLC_HCF, & ! HLCLOUDS : fraction of High Cloud Fraction in grid + & ZHLC_HRC, & ! HLCLOUDS : LWC that is High LWC in grid + & ZHLI_HCF, & + & ZHLI_HRI, & + & ZRREVAV +REAL, DIMENSION(KSIZE2) :: ZSIGMA_RC ! Standard deviation of rc at time t +LOGICAL, DIMENSION(KPROMA) :: LLMICRO +! +!Output packed tendencies (for budgets only) +REAL, DIMENSION(KPROMA, IBUNUM-IBUNUM_EXTRA) :: ZBU_SUM +! +!For mixing-ratio-splitting +REAL, DIMENSION(KPROMA,0:7) :: ZVART !Packed variables +REAL, DIMENSION(KSIZE2,0:7) :: ZEXTPK !To take into acount external tendencies inside the splitting +! +INTEGER, DIMENSION(KPROMA) :: I1,I2 ! Used to replace the COUNT and PACK intrinsics on variables +INTEGER, DIMENSION(KSIZE) :: I1TOT, I2TOT ! Used to replace the COUNT and PACK intrinsics +! +INTEGER :: IC, JMICRO +LOGICAL :: LLSIGMA_RC, LL_AUCV_ADJU +! +!------------------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('ICE4_PACK', 0, ZHOOK_HANDLE) +! +!* 1. GENERALITIES +! ------------ +! +IKTB=D%NKTB +IKTE=D%NKTE +IIJB=D%NIJB +IIJE=D%NIJE +GEXT_TEND=.TRUE. +LLSIGMA_RC=(HSUBG_AUCV_RC=='PDF ' .AND. PARAMI%CSUBG_PR_PDF=='SIGM') +LL_AUCV_ADJU=(HSUBG_AUCV_RC=='ADJU' .OR. HSUBG_AUCV_RI=='ADJU') +! +IF(PARAMI%LPACK_MICRO) THEN + IF(KPROMA /= KSIZE) THEN + CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'RAIN_ICE', 'For now, KPROMA must be equal to KSIZE, see comments in code for explanation') + ! Microphyscs was optimized by introducing chunks of KPROMA size + ! Thus, in ice4_tendencies, the 1D array represent only a fraction of the points where microphisical species are present + ! We cannot rebuild the entire 3D arrays in the subroutine, so we cannot call ice4_rainfr_vert in it + ! A solution would be to suppress optimisation in this case by setting KPROMA=KSIZE in rain_ice + ! Another solution would be to compute column by column? + ! Another one would be to cut tendencies in 3 parts: before rainfr_vert, rainfr_vert, after rainfr_vert + ENDIF + ! + IF(BUCONF%LBU_ENABLE) THEN + DO JV=1, IBUNUM-IBUNUM_EXTRA + ZBU_PACK(:, JV)=0. + ENDDO + ENDIF + ! + !* 2. POINT SELECTION + ! --------------- + ! + ! optimization by looking for locations where + ! the microphysical fields are larger than a minimal value only !!! + ! + IF (KSIZE /= COUNT(ODMICRO(IIJB:IIJE,IKTB:IKTE))) THEN + CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'ICE4_PACK', 'ICE4_PACK : KSIZE /= COUNT(ODMICRO)') + ENDIF + + IF (KSIZE > 0) THEN + ! + !* 3. CACHE-BLOCKING LOOP + ! ------------------- + ! + + ! starting indexes : + IC=0 + ISTK=IKTB + ISTIJ=IIJB + + DO JMICRO=1,KSIZE,KPROMA + + IMICRO=MIN(KPROMA,KSIZE-JMICRO+1) + ! + !* 4. PACKING + ! ------- + ! + + ! Setup packing parameters + OUTER_LOOP: DO JK = ISTK, IKTE + IF (ANY(ODMICRO(:,JK))) THEN + DO JIJ = ISTIJ, IIJE + IF (ODMICRO(JIJ,JK)) THEN + IC=IC+1 + LLMICRO(IC)=.TRUE. + ! Initialization of variables in packed format : + ZVART(IC, ITH)=PWR(JIJ, JK, ITH) + ZVART(IC, IRV)=PWR(JIJ, JK, IRV) + ZVART(IC, IRC)=PWR(JIJ, JK, IRC) + ZVART(IC, IRR)=PWR(JIJ, JK, IRR) + ZVART(IC, IRI)=PWR(JIJ, JK, IRI) + ZVART(IC, IRS)=PWR(JIJ, JK, IRS) + ZVART(IC, IRG)=PWR(JIJ, JK, IRG) + IF (KRR==7) THEN + ZVART(IC, IRH)=PWR(JIJ, JK, IRH) + ENDIF + IF (GEXT_TEND) THEN + !The th tendency is not related to a mixing ratio change, there is no exn/exnref issue here + ZEXTPK(IC, ITH)=PTHS(JIJ, JK) + ZEXTPK(IC, IRV)=PRVS(JIJ, JK) + ZEXTPK(IC, IRC)=PRCS(JIJ, JK) + ZEXTPK(IC, IRR)=PRRS(JIJ, JK) + ZEXTPK(IC, IRI)=PRIS(JIJ, JK) + ZEXTPK(IC, IRS)=PRSS(JIJ, JK) + ZEXTPK(IC, IRG)=PRGS(JIJ, JK) + IF (KRR==7) THEN + ZEXTPK(IC, IRH)=PRHS(JIJ, JK) + ENDIF + ENDIF + ZCIT (IC)=PCIT (JIJ, JK) + ZCF (IC)=PCLDFR (JIJ, JK) + ZRHODREF (IC)=PRHODREF(JIJ, JK) + ZPRES (IC)=PPABST (JIJ, JK) + ZEXN (IC)=PEXN (JIJ, JK) + IF(LLSIGMA_RC) THEN + ZSIGMA_RC(IC)=PSIGS (JIJ, JK) + ENDIF + IF (LL_AUCV_ADJU) THEN + ZHLC_HCF(IC) = PHLC_HCF(JIJ, JK) + ZHLC_HRC(IC) = PHLC_HRC(JIJ, JK) + ZHLI_HCF(IC) = PHLI_HCF(JIJ, JK) + ZHLI_HRI(IC) = PHLI_HRI(JIJ, JK) + ENDIF + ! Save indices for later usages: + I1(IC) = JIJ + I2(IC) = JK + I1TOT(JMICRO+IC-1)=JIJ + I2TOT(JMICRO+IC-1)=JK + IF (IC==IMICRO) THEN + ! the end of the chunk has been reached, then reset the starting index : + ISTIJ=JIJ+1 + IF (ISTIJ <= IIJE) THEN + ISTK=JK + ELSE + ! end of line, restart from 1 and increment upper loop + ISTK=JK+1 + IF (ISTK > IKTE) THEN + ! end of line, restart from 1 + ISTK=IKTB + ENDIF + ENDIF + IC=0 + EXIT OUTER_LOOP + ENDIF + ENDIF + ENDDO + ENDIF + ! restart inner loop on JIJ : + ISTIJ=IIJB + ENDDO OUTER_LOOP + + ! + !* 5. TENDENCIES COMPUTATION + ! ---------------------- + ! + CALL ICE4_STEPPING(D, CST, PARAMI, ICEP, ICED, BUCONF, & + &LLSIGMA_RC, LL_AUCV_ADJU, GEXT_TEND, & + &KPROMA, IMICRO, LLMICRO, PTSTEP, & + &KRR, & + &HSUBG_AUCV_RC, HSUBG_AUCV_RI, & + &ZEXN, ZRHODREF, I1, I2, & + &ZPRES, ZCF, ZSIGMA_RC, & + &ZCIT, & + &ZVART, & + &ZHLC_HCF, ZHLC_HRC, & + &ZHLI_HCF, ZHLI_HRI, PRAINFR, & + &ZEXTPK, ZBU_SUM, ZRREVAV) + ! + !* 6. UNPACKING + ! --------- + ! + DO JL=1, IMICRO + PCIT (I1(JL),I2(JL))=ZCIT (JL) + IF(PARAMI%LWARM) THEN + PEVAP3D(I1(JL),I2(JL))=ZRREVAV(JL) + ENDIF + PWR(I1(JL),I2(JL),IRV)=ZVART(JL, IRV) + PWR(I1(JL),I2(JL),IRC)=ZVART(JL, IRC) + PWR(I1(JL),I2(JL),IRR)=ZVART(JL, IRR) + PWR(I1(JL),I2(JL),IRI)=ZVART(JL, IRI) + PWR(I1(JL),I2(JL),IRS)=ZVART(JL, IRS) + PWR(I1(JL),I2(JL),IRG)=ZVART(JL, IRG) + IF (KRR==7) THEN + PWR(I1(JL),I2(JL),IRH)=ZVART(JL, IRH) + ENDIF + ENDDO + IF(BUCONF%LBU_ENABLE) THEN + DO JV=1, IBUNUM-IBUNUM_EXTRA + DO JL=1, IMICRO + ZBU_PACK(JMICRO+JL-1, JV) = ZBU_SUM(JL, JV) + ENDDO + ENDDO + ENDIF + + + ENDDO ! JMICRO + ENDIF ! KSIZE > 0 + +ELSE ! PARAMI%LPACK_MICRO + IF (KSIZE /= D%NIJT*D%NKT) THEN + CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'ICE4_PACK', 'ICE4_PACK : KSIZE /= NIJT*NKT') + ENDIF + + IC=0 + DO JK = IKTB, IKTE + DO JIJ = IIJB, IIJE + IC=IC+1 + I1TOT(IC)=JIJ + I2TOT(IC)=JK + IF (GEXT_TEND) THEN + !The th tendency is not related to a mixing ratio change, there is no exn/exnref issue here + ZEXTPK(IC, ITH)=PTHS(JIJ, JK) + ZEXTPK(IC, IRV)=PRVS(JIJ, JK) + ZEXTPK(IC, IRC)=PRCS(JIJ, JK) + ZEXTPK(IC, IRR)=PRRS(JIJ, JK) + ZEXTPK(IC, IRI)=PRIS(JIJ, JK) + ZEXTPK(IC, IRS)=PRSS(JIJ, JK) + ZEXTPK(IC, IRG)=PRGS(JIJ, JK) + IF (KRR==7) THEN + ZEXTPK(IC, IRH)=PRHS(JIJ, JK) + ENDIF + IF(LLSIGMA_RC) THEN + ZSIGMA_RC(IC)=PSIGS(JIJ, JK) + ENDIF + ENDIF + ENDDO + ENDDO + ! + !* 5bis. TENDENCIES COMPUTATION + ! ---------------------- + ! + CALL ICE4_STEPPING(D, CST, PARAMI, ICEP, ICED, BUCONF, & + &LLSIGMA_RC, LL_AUCV_ADJU, GEXT_TEND, & + &KSIZE, KSIZE, ODMICRO, PTSTEP, & + &KRR, & + &HSUBG_AUCV_RC, HSUBG_AUCV_RI, & + &PEXN, PRHODREF, I1TOT, I2TOT, & + &PPABST, PCLDFR, ZSIGMA_RC, & + &PCIT, & + &PWR, & + &PHLC_HCF, PHLC_HRC, & + &PHLI_HCF, PHLI_HRI, PRAINFR, & + &ZEXTPK, ZBU_PACK, PEVAP3D) + +ENDIF ! PARAMI%LPACK_MICRO +! +!* 7. BUDGETS +! ------- +! +IF(BUCONF%LBU_ENABLE) THEN + !Budgets for the different processes + CALL ICE4_BUDGETS(D, PARAMI, BUCONF, KSIZE, PTSTEP, KRR, I1TOT, I2TOT, & + PLVFACT, PLSFACT, PRHODJ, PEXNREF, & + PRVHENI, ZBU_PACK, & + TBUDGETS, KBUDGETS) +ENDIF +IF (LHOOK) CALL DR_HOOK('ICE4_PACK', 1, ZHOOK_HANDLE) +END SUBROUTINE ICE4_PACK +END MODULE MODE_ICE4_PACK diff --git a/src/PHYEX/micro/mode_ice4_rsrimcg_old.f90 b/src/PHYEX/micro/mode_ice4_rsrimcg_old.f90 index 865ed74004ea51dcc1a28356f2046e03a0413705..970f214f322bc79eec5ad895d366595959e0974e 100644 --- a/src/PHYEX/micro/mode_ice4_rsrimcg_old.f90 +++ b/src/PHYEX/micro/mode_ice4_rsrimcg_old.f90 @@ -6,7 +6,7 @@ MODULE MODE_ICE4_RSRIMCG_OLD IMPLICIT NONE CONTAINS -SUBROUTINE ICE4_RSRIMCG_OLD(CST, ICEP, ICED, KPROMA, KSIZE, LDSOFT, LDCOMPUTE, & +SUBROUTINE ICE4_RSRIMCG_OLD(CST, PARAMI, ICEP, ICED, KPROMA, KSIZE, LDSOFT, LDCOMPUTE, & &PRHODREF, & &PLBDAS, & &PT, PRCT, PRST, & @@ -31,6 +31,7 @@ SUBROUTINE ICE4_RSRIMCG_OLD(CST, ICEP, ICED, KPROMA, KSIZE, LDSOFT, LDCOMPUTE, & ! ------------ ! USE MODD_CST, ONLY: CST_t +USE MODD_PARAM_ICE, ONLY: PARAM_ICE_t USE MODD_RAIN_ICE_DESCR, ONLY: RAIN_ICE_DESCR_t USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t USE PARKIND1, ONLY : JPRB @@ -41,6 +42,7 @@ IMPLICIT NONE !* 0.1 Declarations of dummy arguments : ! TYPE(CST_t), INTENT(IN) :: CST +TYPE(PARAM_ICE_t), INTENT(IN) :: PARAMI TYPE(RAIN_ICE_PARAM_t), INTENT(IN) :: ICEP TYPE(RAIN_ICE_DESCR_t), INTENT(IN) :: ICED INTEGER, INTENT(IN) :: KPROMA, KSIZE @@ -57,8 +59,8 @@ REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRSRIMCG_MR ! Mr change due to c ! LOGICAL, DIMENSION(KPROMA) :: GRIM INTEGER :: IGRIM -REAL, DIMENSION(KPROMA) :: ZVEC1, ZVEC2 -INTEGER, DIMENSION(KPROMA) :: IVEC1, IVEC2 +REAL, DIMENSION(KPROMA) :: ZBUF1, ZBUF2 +INTEGER, DIMENSION(KPROMA) :: IBUF1, IBUF2 REAL, DIMENSION(KPROMA) :: ZZW INTEGER :: JL REAL(KIND=JPRB) :: ZHOOK_HANDLE @@ -73,49 +75,15 @@ IF (LHOOK) CALL DR_HOOK('ICE4_RSRIMCG_OLD', 0, ZHOOK_HANDLE) PRSRIMCG_MR(:)=0. ! IF(.NOT. LDSOFT) THEN - IGRIM = 0 DO JL = 1, KSIZE - IF(PRCT(JL)>ICED%XRTMIN(2) .AND. PRST(JL)>ICED%XRTMIN(5) .AND. LDCOMPUTE(JL) .AND. PT(JL)<CST%XTT) THEN - IGRIM = IGRIM + 1 - IVEC1(IGRIM) = JL - GRIM(JL) = .TRUE. - ELSE - GRIM(JL) = .FALSE. - ENDIF + GRIM(JL)=PRCT(JL)>ICED%XRTMIN(2) .AND. PRST(JL)>ICED%XRTMIN(5) .AND. LDCOMPUTE(JL) .AND. PT(JL)<CST%XTT ENDDO + CALL INTERP_MICRO_1D(KPROMA, KSIZE, PLBDAS(:), ICEP%NGAMINC, ICEP%XRIMINTP1, ICEP%XRIMINTP2, & + &PARAMI%LPACK_INTERP, GRIM(:), IBUF1, IBUF2, ZBUF1, ZBUF2, & + &IGRIM, & + &ICEP%XGAMINC_RIM2, ZZW) ! IF(IGRIM>0) THEN - ! - ! 5.1.1 select the PLBDAS - ! - DO JL = 1, IGRIM - ZVEC1(JL) = PLBDAS(IVEC1(JL)) - ENDDO - ! - ! 5.1.2 find the next lower indice for the PLBDAS in the geometrical - ! set of Lbda_s used to tabulate some moments of the incomplete - ! gamma function - ! - ZVEC2(1:IGRIM) = MAX( 1.00001, MIN(REAL(ICEP%NGAMINC)-0.00001, & - ICEP%XRIMINTP1 * LOG( ZVEC1(1:IGRIM) ) + ICEP%XRIMINTP2 ) ) - IVEC2(1:IGRIM) = INT( ZVEC2(1:IGRIM) ) - ZVEC2(1:IGRIM) = ZVEC2(1:IGRIM) - REAL( IVEC2(1:IGRIM) ) - - ! - ! 5.1.5 perform the linear interpolation of the normalized - ! "XBS"-moment of the incomplete gamma function (XGAMINC_RIM2) - ! - ZVEC1(1:IGRIM) = ICEP%XGAMINC_RIM2( IVEC2(1:IGRIM)+1 )* ZVEC2(1:IGRIM) & - - ICEP%XGAMINC_RIM2( IVEC2(1:IGRIM) )*(ZVEC2(1:IGRIM) - 1.0) - ZZW(:) = 0. - DO JL = 1, IGRIM - ZZW(IVEC1(JL)) = ZVEC1(JL) - ENDDO - - ! - ! 5.1.6 riming-conversion of the large sized aggregates into graupeln - ! - ! !$mnh_expand_where(JL=1:KSIZE) WHERE(GRIM(1:KSIZE)) PRSRIMCG_MR(1:KSIZE) = ICEP%XSRIMCG * PLBDAS(1:KSIZE)**ICEP%XEXSRIMCG & ! RSRIMCG @@ -132,5 +100,9 @@ ENDIF ! IF (LHOOK) CALL DR_HOOK('ICE4_RSRIMCG_OLD', 1, ZHOOK_HANDLE) ! +CONTAINS +! +INCLUDE "interp_micro.func.h" +! END SUBROUTINE ICE4_RSRIMCG_OLD END MODULE MODE_ICE4_RSRIMCG_OLD diff --git a/src/PHYEX/micro/mode_ice4_sedimentation.f90 b/src/PHYEX/micro/mode_ice4_sedimentation.f90 new file mode 100644 index 0000000000000000000000000000000000000000..f6fc795edff66ad05a393e199992dfb0fb4955d5 --- /dev/null +++ b/src/PHYEX/micro/mode_ice4_sedimentation.f90 @@ -0,0 +1,184 @@ +!MNH_LIC Copyright 1994-2019 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_ICE4_SEDIMENTATION +IMPLICIT NONE +CONTAINS +SUBROUTINE ICE4_SEDIMENTATION(D, CST, ICEP, ICED, PARAMI, BUCONF, & + &PTSTEP, KRR, PDZZ, & + &PLVFACT, PLSFACT, PRHODREF, PPABST, PTHT, PT, PRHODJ, & + &PTHS, PRVS, PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& + &PINPRC, PINPRR, PINPRS, PINPRG, & + &TBUDGETS, KBUDGETS, & + &PSEA, PTOWN, & + &PINPRH, PRHT, PRHS, PFPR) +!! +!!** PURPOSE +!! ------- +!! Computes the sedimentation +!! +!! AUTHOR +!! ------ +!! S. Riette code extracted from rain_ice +!! +!! MODIFICATIONS +!! ------------- +!! +! +! +!* 0. DECLARATIONS +! ------------ +! +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_BUDGET, ONLY: TBUDGETDATA, TBUDGETCONF_t, NBUDGET_TH, NBUDGET_RV, NBUDGET_RC, & + NBUDGET_RI, NBUDGET_RR, NBUDGET_RS, NBUDGET_RG, NBUDGET_RH +USE MODD_CST, ONLY: CST_t +USE MODD_RAIN_ICE_DESCR, ONLY: RAIN_ICE_DESCR_t +USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t +USE MODD_PARAM_ICE, ONLY: PARAM_ICE_t +! +USE MODE_MSG, ONLY: PRINT_MSG, NVERB_FATAL +USE MODE_BUDGET, ONLY: BUDGET_STORE_INIT_PHY, BUDGET_STORE_END_PHY +! +USE MODE_ICE4_SEDIMENTATION_STAT, ONLY: ICE4_SEDIMENTATION_STAT +USE MODE_ICE4_SEDIMENTATION_SPLIT, ONLY: ICE4_SEDIMENTATION_SPLIT +USE MODE_ICE4_CORRECT_NEGATIVITIES, ONLY: ICE4_CORRECT_NEGATIVITIES +! +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +TYPE(DIMPHYEX_t), INTENT(IN) :: D !array dimensions +TYPE(CST_t), INTENT(IN) :: CST +TYPE(RAIN_ICE_PARAM_t), INTENT(IN) :: ICEP +TYPE(RAIN_ICE_DESCR_t), INTENT(IN) :: ICED +TYPE(PARAM_ICE_t), INTENT(IN) :: PARAMI +TYPE(TBUDGETCONF_t), INTENT(IN) :: BUCONF +REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) +INTEGER, INTENT(IN) :: KRR ! Number of moist variable +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDZZ ! Layer thikness (m) +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PLVFACT +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PLSFACT +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PPABST ! absolute pressure at t +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PT ! Temperature at time t +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PTHS +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRVS +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRIT ! Pristine ice m.r. at t +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRGS ! Graupel m.r. source +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t +REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PINPRC ! Cloud instant precip +REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PINPRS ! Snow instant precip +REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PINPRG ! Graupel instant precip +TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS +INTEGER, INTENT(IN) :: KBUDGETS +REAL, DIMENSION(D%NIJT), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask +REAL, DIMENSION(D%NIJT), OPTIONAL, INTENT(IN) :: PTOWN ! Fraction that is town +REAL, DIMENSION(D%NIJT), OPTIONAL, INTENT(OUT) :: PINPRH ! Hail instant precip +REAL, DIMENSION(D%NIJT,D%NKT), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t +REAL, DIMENSION(D%NIJT,D%NKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source +REAL, DIMENSION(D%NIJT,D%NKT,KRR), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes +! +!* 0.2 declaration of local variables +! +REAL, DIMENSION(D%NIJT,D%NKT) :: ZRCT, ZRRT, ZRIT, ZRST, ZRGT, ZRHT +REAL, DIMENSION(D%NIJT) :: ZINPRI +INTEGER :: JK, JIJ, IKTB, IKTE, IIJB, IIJE +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION', 0, ZHOOK_HANDLE) +IKTB=D%NKTB +IKTE=D%NKTE +IIJB=D%NIJB +IIJE=D%NIJE +! +! +!------------------------------------------------------------------------------- +! +!* 2. COMPUTE THE SEDIMENTATION (RS) SOURCE +! ------------------------------------- +! +! +! +IF (BUCONF%LBUDGET_RC .AND. PARAMI%LSEDIC) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RC), 'SEDI', PRCS(:, :) * PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RR) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RR), 'SEDI', PRRS(:, :) * PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RI), 'SEDI', PRIS(:, :) * PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RS) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RS), 'SEDI', PRSS(:, :) * PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RG), 'SEDI', PRGS(:, :) * PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RH .AND. KRR==7) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RH), 'SEDI', PRHS(:, :) * PRHODJ(:, :)) + +IF(PARAMI%CSEDIM=='STAT') THEN + DO JK = IKTB,IKTE + DO JIJ = IIJB,IIJE + ZRCT(JIJ,JK)=PRCS(JIJ,JK)*PTSTEP + ZRRT(JIJ,JK)=PRRS(JIJ,JK)*PTSTEP + ZRIT(JIJ,JK)=PRIS(JIJ,JK)*PTSTEP + ZRST(JIJ,JK)=PRSS(JIJ,JK)*PTSTEP + ZRGT(JIJ,JK)=PRGS(JIJ,JK)*PTSTEP + IF (KRR==7) ZRHT(JIJ,JK)=PRHS(JIJ,JK)*PTSTEP + ENDDO + ENDDO + CALL ICE4_SEDIMENTATION_STAT(D, CST, ICEP, ICED, PARAMI, & + &PTSTEP, KRR, PDZZ, & + &PRHODREF, PPABST, PTHT, PT, PRHODJ, & + &PRCS, ZRCT, PRRS, ZRRT, PRIS, ZRIT,& + &PRSS, ZRST, PRGS, ZRGT,& + &PINPRC, PINPRR, ZINPRI, PINPRS, PINPRG, & + &PSEA=PSEA, PTOWN=PTOWN, & + &PINPRH=PINPRH, PRHT=ZRHT, PRHS=PRHS, PFPR=PFPR) + PINPRS(IIJB:IIJE) = PINPRS(IIJB:IIJE) + ZINPRI(IIJB:IIJE) + !No negativity correction here as we apply sedimentation on PR.S*PTSTEP variables +ELSEIF(PARAMI%CSEDIM=='SPLI') THEN + CALL ICE4_SEDIMENTATION_SPLIT(D, CST, ICEP, ICED, PARAMI, & + &PTSTEP, KRR, PDZZ, & + &PRHODREF, PPABST, PTHT, PT, PRHODJ, & + &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& + &PINPRC, PINPRR, ZINPRI, PINPRS, PINPRG, & + &PSEA=PSEA, PTOWN=PTOWN, & + &PINPRH=PINPRH, PRHT=PRHT, PRHS=PRHS, PFPR=PFPR) + PINPRS(IIJB:IIJE) = PINPRS(IIJB:IIJE) + ZINPRI(IIJB:IIJE) + !We correct negativities with conservation + !SPLI algorith uses a time-splitting. Inside the loop a temporary m.r. is used. + ! It is initialized with the m.r. at T and is modified by two tendencies: + ! sedimentation tendency and an external tendency which represents all other + ! processes (mainly advection and microphysical processes). If both tendencies + ! are negative, sedimentation can remove a species at a given sub-timestep. From + ! this point sedimentation stops for the remaining sub-timesteps but the other tendency + ! will be still active and will lead to negative values. + ! We could prevent the algorithm to not consume too much a species, instead we apply + ! a correction here. + CALL ICE4_CORRECT_NEGATIVITIES(D, ICED, KRR, PRVS, PRCS, PRRS, & + &PRIS, PRSS, PRGS, & + &PTHS, PLVFACT, PLSFACT, PRHS) +ELSEIF(PARAMI%CSEDIM=='NONE') THEN +ELSE + CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'RAIN_ICE', 'no sedimentation scheme for PARAMI%CSEDIM='//PARAMI%CSEDIM) +END IF +! +! +IF (BUCONF%LBUDGET_RC .AND. PARAMI%LSEDIC) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RC), 'SEDI', PRCS(:, :) * PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RR) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RR), 'SEDI', PRRS(:, :) * PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RI), 'SEDI', PRIS(:, :) * PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RS) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RS), 'SEDI', PRSS(:, :) * PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RG), 'SEDI', PRGS(:, :) * PRHODJ(:, :)) +IF (BUCONF%LBUDGET_RH .AND. KRR==7) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RH), 'SEDI', PRHS(:, :) * PRHODJ(:, :)) +! +IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION', 1, ZHOOK_HANDLE) +! +END SUBROUTINE ICE4_SEDIMENTATION +END MODULE MODE_ICE4_SEDIMENTATION diff --git a/src/PHYEX/micro/mode_ice4_sedimentation_split.f90 b/src/PHYEX/micro/mode_ice4_sedimentation_split.f90 index e7b90b3d4ae6dd7f2c3b4ba22908543ab8e152e1..6534e7043ae2036c7e2d5eef53b5d0d94829f9fa 100644 --- a/src/PHYEX/micro/mode_ice4_sedimentation_split.f90 +++ b/src/PHYEX/micro/mode_ice4_sedimentation_split.f90 @@ -56,46 +56,46 @@ TYPE(RAIN_ICE_DESCR_t), INTENT(IN) :: ICED TYPE(PARAM_ICE_t), INTENT(IN) :: PARAMI REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) INTEGER, INTENT(IN) :: KRR ! Number of moist variable -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PDZZ ! Layer thikness (m) -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRHODREF! Reference density -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PPABST ! absolute pressure at t -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PTHT ! Theta at time t -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PT ! Temperature at time t -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRHODJ ! Dry density * Jacobian -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PRCS ! Cloud water m.r. source -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PRRS ! Rain water m.r. source -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRRT ! Rain water m.r. at t -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRIT ! Pristine ice m.r. at t -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PRGS ! Graupel m.r. source -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t -REAL, DIMENSION(D%NIT,D%NJT), INTENT(OUT) :: PINPRC ! Cloud instant precip -REAL, DIMENSION(D%NIT,D%NJT), INTENT(OUT) :: PINPRR ! Rain instant precip -REAL, DIMENSION(D%NIT,D%NJT), INTENT(OUT) :: PINPRI ! Pristine ice instant precip -REAL, DIMENSION(D%NIT,D%NJT), INTENT(OUT) :: PINPRS ! Snow instant precip -REAL, DIMENSION(D%NIT,D%NJT), INTENT(OUT) :: PINPRG ! Graupel instant precip -REAL, DIMENSION(D%NIT,D%NJT), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask -REAL, DIMENSION(D%NIT,D%NJT), OPTIONAL, INTENT(IN) :: PTOWN ! Fraction that is town -REAL, DIMENSION(D%NIT,D%NJT), OPTIONAL, INTENT(OUT) :: PINPRH ! Hail instant precip -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source -REAL, DIMENSION(D%NIT,D%NJT,D%NKT,KRR), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDZZ ! Layer thikness (m) +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PPABST ! absolute pressure at t +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PT ! Temperature at time t +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRIT ! Pristine ice m.r. at t +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRGS ! Graupel m.r. source +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t +REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PINPRC ! Cloud instant precip +REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PINPRI ! Pristine ice instant precip +REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PINPRS ! Snow instant precip +REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PINPRG ! Graupel instant precip +REAL, DIMENSION(D%NIJT), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask +REAL, DIMENSION(D%NIJT), OPTIONAL, INTENT(IN) :: PTOWN ! Fraction that is town +REAL, DIMENSION(D%NIJT), OPTIONAL, INTENT(OUT) :: PINPRH ! Hail instant precip +REAL, DIMENSION(D%NIJT,D%NKT), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t +REAL, DIMENSION(D%NIJT,D%NKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source +REAL, DIMENSION(D%NIJT,D%NKT,KRR), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes ! !* 0.2 declaration of local variables ! ! -INTEGER :: JI, JJ, JK -INTEGER :: IKTB, IKTE, IKB, IKL, IIE, IIB, IJB, IJE +INTEGER :: JIJ, JK +INTEGER :: IKTB, IKTE, IKB, IKL, IIJE, IIJB INTEGER :: IRR !Workaround of PGI bug with OpenACC (at least up to 18.10 version) LOGICAL :: GSEDIC !Workaround of PGI bug with OpenACC (at least up to 18.10 version) LOGICAL :: GPRESENT_PFPR, GPRESENT_PSEA REAL :: ZINVTSTEP -REAL, DIMENSION(D%NIT, D%NJT) :: ZCONC_TMP ! Weighted concentration -REAL, DIMENSION(D%NIT,D%NJT,D%NKTB:D%NKTE) :: ZW ! work array -REAL, DIMENSION(D%NIT, D%NJT, D%NKT) :: ZCONC3D, & ! droplet condensation +REAL, DIMENSION(D%NIJT) :: ZCONC_TMP ! Weighted concentration +REAL, DIMENSION(D%NIJT,D%NKTB:D%NKTE) :: ZW ! work array +REAL, DIMENSION(D%NIJT, D%NKT) :: ZCONC3D, & ! droplet condensation & ZRAY, & ! Cloud Mean radius & ZLBC, & ! XLBC weighted by sea fraction & ZFSEDC, & @@ -118,10 +118,8 @@ IRR = KRR ! IKTB=D%NKTB IKTE=D%NKTE -IIB=D%NIB -IIE=D%NIE -IJB=D%NJB -IJE=D%NJE +IIJB=D%NIJB +IIJE=D%NIJE ! IF (PRESENT(PFPR)) THEN GPRESENT_PFPR = .TRUE. @@ -139,41 +137,41 @@ END IF ! ZINVTSTEP=1./PTSTEP IF (GPRESENT_PFPR) THEN - PFPR(:,:,:,:) = 0. + PFPR(:,:,:) = 0. END IF ! !* 1. Parameters for cloud sedimentation ! IF (GSEDIC) THEN - ZRAY(:,:,:) = 0. - ZLBC(:,:,:) = ICED%XLBC(1) - ZFSEDC(:,:,:) = ICEP%XFSEDC(1) - ZCONC3D(:,:,:)= ICED%XCONC_LAND - ZCONC_TMP(:,:)= ICED%XCONC_LAND + ZRAY(:,:) = 0. + ZLBC(:,:) = ICED%XLBC(1) + ZFSEDC(:,:) = ICEP%XFSEDC(1) + ZCONC3D(:,:)= ICED%XCONC_LAND + ZCONC_TMP(:)= ICED%XCONC_LAND IF (GPRESENT_PSEA) THEN - DO JJ = IJB, IJE - DO JI = IIB, IIE - ZCONC_TMP(JI,JJ)=PSEA(JI,JJ)*ICED%XCONC_SEA+(1.-PSEA(JI,JJ))*ICED%XCONC_LAND - ENDDO + DO JIJ = IIJB, IIJE + ZCONC_TMP(JIJ)=PSEA(JIJ)*ICED%XCONC_SEA+(1.-PSEA(JIJ))*ICED%XCONC_LAND ENDDO DO JK=IKTB, IKTE - DO JJ = IJB, IJE - DO JI = IIB, IIE - ZLBC(JI,JJ,JK) = PSEA(JI,JJ)*ICED%XLBC(2)+(1.-PSEA(JI,JJ))*ICED%XLBC(1) - ZFSEDC(JI,JJ,JK) = (PSEA(JI,JJ)*ICEP%XFSEDC(2)+(1.-PSEA(JI,JJ))*ICEP%XFSEDC(1)) - ZFSEDC(JI,JJ,JK) = MAX(MIN(ICEP%XFSEDC(1),ICEP%XFSEDC(2)),ZFSEDC(JI,JJ,JK)) - ZCONC3D(JI,JJ,JK)= (1.-PTOWN(JI,JJ))*ZCONC_TMP(JI,JJ)+PTOWN(JI,JJ)*ICED%XCONC_URBAN - ZRAY(JI,JJ,JK) = 0.5*((1.-PSEA(JI,JJ))*GAMMA(ICED%XNUC+1.0/ICED%XALPHAC)/(GAMMA(ICED%XNUC)) + & - & PSEA(JI,JJ)*GAMMA(ICED%XNUC2+1.0/ICED%XALPHAC2)/(GAMMA(ICED%XNUC2))) - ENDDO + DO JIJ = IIJB, IIJE + ZLBC(JIJ,JK) = PSEA(JIJ)*ICED%XLBC(2)+(1.-PSEA(JIJ))*ICED%XLBC(1) + ZFSEDC(JIJ,JK) = (PSEA(JIJ)*ICEP%XFSEDC(2)+(1.-PSEA(JIJ))*ICEP%XFSEDC(1)) + ZFSEDC(JIJ,JK) = MAX(MIN(ICEP%XFSEDC(1),ICEP%XFSEDC(2)),ZFSEDC(JIJ,JK)) + ZCONC3D(JIJ,JK)= (1.-PTOWN(JIJ))*ZCONC_TMP(JIJ)+PTOWN(JIJ)*ICED%XCONC_URBAN + ZRAY(JIJ,JK) = 0.5*((1.-PSEA(JIJ))*GAMMA(ICED%XNUC+1.0/ICED%XALPHAC)/(GAMMA(ICED%XNUC)) + & + & PSEA(JIJ)*GAMMA(ICED%XNUC2+1.0/ICED%XALPHAC2)/(GAMMA(ICED%XNUC2))) ENDDO END DO ELSE - ZCONC3D(:,:,:) = ICED%XCONC_LAND - ZRAY(:,:,:) = 0.5*(GAMMA(ICED%XNUC+1.0/ICED%XALPHAC)/(GAMMA(ICED%XNUC))) + ZCONC3D(:,:) = ICED%XCONC_LAND + ZRAY(:,:) = 0.5*(GAMMA(ICED%XNUC+1.0/ICED%XALPHAC)/(GAMMA(ICED%XNUC))) END IF - ZRAY(:,:,:) = MAX(1.,ZRAY(:,:,:)) - ZLBC(:,:,:) = MAX(MIN(ICED%XLBC(1),ICED%XLBC(2)),ZLBC(:,:,:)) + DO JK=IKTB, IKTE + DO JIJ = IIJB, IIJE + ZRAY(JIJ,JK) = MAX(1.,ZRAY(JIJ,JK)) + ZLBC(JIJ,JK) = MAX(MIN(ICED%XLBC(1),ICED%XLBC(2)),ZLBC(JIJ,JK)) + ENDDO + ENDDO ENDIF ! !* 2. compute the fluxes @@ -183,32 +181,30 @@ ENDIF ! For optimization we consider each variable separately ! DO JK=IKTB, IKTE - DO JJ = IJB, IJE - DO JI = IIB, IIE - ! External tendecies - IF (GSEDIC) THEN - ZPRCS(JI,JJ,JK) = PRCS(JI,JJ,JK)-PRCT(JI,JJ,JK)*ZINVTSTEP - ENDIF - ZPRRS(JI,JJ,JK) = PRRS(JI,JJ,JK)-PRRT(JI,JJ,JK)*ZINVTSTEP - ZPRIS(JI,JJ,JK) = PRIS(JI,JJ,JK)-PRIT(JI,JJ,JK)*ZINVTSTEP - ZPRSS(JI,JJ,JK) = PRSS(JI,JJ,JK)-PRST(JI,JJ,JK)*ZINVTSTEP - ZPRGS(JI,JJ,JK) = PRGS(JI,JJ,JK)-PRGT(JI,JJ,JK)*ZINVTSTEP - IF ( IRR == 7 ) THEN - ZPRHS(JI,JJ,JK) = PRHS(JI,JJ,JK)-PRHT(JI,JJ,JK)*ZINVTSTEP - END IF - ! - ! mr values inside the time-splitting loop - ZRCT(JI,JJ,JK) = PRCT(JI,JJ,JK) - ZRRT(JI,JJ,JK) = PRRT(JI,JJ,JK) - ZRIT(JI,JJ,JK) = PRIT(JI,JJ,JK) - ZRST(JI,JJ,JK) = PRST(JI,JJ,JK) - ZRGT(JI,JJ,JK) = PRGT(JI,JJ,JK) - IF (IRR==7) THEN - ZRHT(JI,JJ,JK) = PRHT(JI,JJ,JK) - END IF - ! - ZW(JI,JJ,JK) =1./(PRHODREF(JI,JJ,JK)* PDZZ(JI,JJ,JK)) - ENDDO + DO JIJ = IIJB, IIJE + ! External tendecies + IF (GSEDIC) THEN + ZPRCS(JIJ,JK) = PRCS(JIJ,JK)-PRCT(JIJ,JK)*ZINVTSTEP + ENDIF + ZPRRS(JIJ,JK) = PRRS(JIJ,JK)-PRRT(JIJ,JK)*ZINVTSTEP + ZPRIS(JIJ,JK) = PRIS(JIJ,JK)-PRIT(JIJ,JK)*ZINVTSTEP + ZPRSS(JIJ,JK) = PRSS(JIJ,JK)-PRST(JIJ,JK)*ZINVTSTEP + ZPRGS(JIJ,JK) = PRGS(JIJ,JK)-PRGT(JIJ,JK)*ZINVTSTEP + IF ( IRR == 7 ) THEN + ZPRHS(JIJ,JK) = PRHS(JIJ,JK)-PRHT(JIJ,JK)*ZINVTSTEP + END IF + ! + ! mr values inside the time-splitting loop + ZRCT(JIJ,JK) = PRCT(JIJ,JK) + ZRRT(JIJ,JK) = PRRT(JIJ,JK) + ZRIT(JIJ,JK) = PRIT(JIJ,JK) + ZRST(JIJ,JK) = PRST(JIJ,JK) + ZRGT(JIJ,JK) = PRGT(JIJ,JK) + IF (IRR==7) THEN + ZRHT(JIJ,JK) = PRHT(JIJ,JK) + END IF + ! + ZW(JIJ,JK) =1./(PRHODREF(JIJ,JK)* PDZZ(JIJ,JK)) ENDDO ENDDO ! @@ -242,27 +238,27 @@ ENDIF !* 2.4 for aggregates/snow ! CALL INTERNAL_SEDIM_SPLI(D, CST, ICEP, ICED, PARAMI, KRR, & - &PRHODREF, ZW, PDZZ, PPABST, PTHT, PT, PTSTEP, & - &5, & - &ZRST, PRSS, PINPRS, ZPRSS, & - &PFPR=PFPR) + &PRHODREF, ZW, PDZZ, PPABST, PTHT, PT, PTSTEP, & + &5, & + &ZRST, PRSS, PINPRS, ZPRSS, & + &PFPR=PFPR) ! !* 2.5 for graupeln ! CALL INTERNAL_SEDIM_SPLI(D, CST, ICEP, ICED, PARAMI, KRR, & - &PRHODREF, ZW, PDZZ, PPABST, PTHT, PT, PTSTEP, & - &6, & - &ZRGT, PRGS, PINPRG, ZPRGS, & - &PFPR=PFPR) + &PRHODREF, ZW, PDZZ, PPABST, PTHT, PT, PTSTEP, & + &6, & + &ZRGT, PRGS, PINPRG, ZPRGS, & + &PFPR=PFPR) ! !* 2.6 for hail ! IF (IRR==7) THEN CALL INTERNAL_SEDIM_SPLI(D, CST, ICEP, ICED, PARAMI, KRR, & - &PRHODREF, ZW, PDZZ, PPABST, PTHT, PT, PTSTEP, & - &7, & - &ZRHT, PRHS, PINPRH, ZPRHS, & - &PFPR=PFPR) + &PRHODREF, ZW, PDZZ, PPABST, PTHT, PT, PTSTEP, & + &7, & + &ZRHT, PRHS, PINPRH, ZPRHS, & + &PFPR=PFPR) ENDIF ! IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_SPLIT', 1, ZHOOK_HANDLE) @@ -274,8 +270,9 @@ CONTAINS ! ! SUBROUTINE INTERNAL_SEDIM_SPLI(D, CST, ICEP, ICED, PARAMI, KRR, & - &PRHODREF, POORHODZ, PDZZ, PPABST,PTHT,PT,PTSTEP, & - &KSPE, PRXT, PRXS, PINPRX, PPRXS, & + &PRHODREF, POORHODZ, PDZZ, PPABST, PTHT, PT, PTSTEP, & + &KSPE, & + &PRXT, PRXS, PINPRX, PPRXS, & &PRAY, PLBC, PFSEDC, PCONC3D, PFPR) ! !* 0. DECLARATIONS @@ -296,38 +293,36 @@ TYPE(RAIN_ICE_PARAM_t), INTENT(IN) :: ICEP TYPE(RAIN_ICE_DESCR_t), INTENT(IN) :: ICED TYPE(PARAM_ICE_t), INTENT(IN) :: PARAMI INTEGER, INTENT(IN) :: KRR -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRHODREF ! Reference density -REAL, DIMENSION(D%NIT,D%NJT,D%NKTB:D%NKTE), INTENT(IN) :: POORHODZ ! One Over (Rhodref times delta Z) -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PDZZ ! layer thikness (m) -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PPABST -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PTHT -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PT +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODREF ! Reference density +REAL, DIMENSION(D%NIJT,D%NKTB:D%NKTE), INTENT(IN) :: POORHODZ ! One Over (Rhodref times delta Z) +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDZZ ! layer thikness (m) +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PPABST +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHT +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PT REAL, INTENT(IN) :: PTSTEP ! total timestep INTEGER, INTENT(IN) :: KSPE ! 1 for rc, 2 for rr... -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PRXT ! mr of specy X -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PRXS !Tendency of the specy KSPE -REAL, DIMENSION(D%NIT,D%NJT), INTENT(OUT) :: PINPRX ! instant precip -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PPRXS ! external tendencie -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN), OPTIONAL :: PRAY, PLBC, PFSEDC, PCONC3D -REAL, DIMENSION(D%NIT,D%NJT,D%NKT,KRR), INTENT(INOUT), OPTIONAL :: PFPR ! upper-air precipitation fluxes +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRXT ! mr of specy X +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRXS !Tendency of the specy KSPE +REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PINPRX ! instant precip +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PPRXS ! external tendencie +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN), OPTIONAL :: PRAY, PLBC, PFSEDC, PCONC3D +REAL, DIMENSION(D%NIJT,D%NKT,KRR), INTENT(INOUT), OPTIONAL :: PFPR ! upper-air precipitation fluxes ! !* 0.2 declaration of local variables ! CHARACTER(LEN=10) :: YSPE ! String for error message -INTEGER :: IDX, ISEDIM -INTEGER :: JI, JJ, JK, JL -INTEGER, DIMENSION(D%NIT*D%NJT*D%NKT) :: I1,I2,I3 ! Used to replace the COUNT +INTEGER :: JIJ, JK, JL LOGICAL :: GPRESENT_PFPR REAL :: ZINVTSTEP REAL :: ZZWLBDC, ZRAY, ZZT, ZZWLBDA, ZZCC REAL :: ZLBDA REAL :: ZFSED, ZEXSED REAL :: ZMRCHANGE -REAL, DIMENSION(D%NIT, D%NJT) :: ZMAX_TSTEP ! Maximum CFL in column +REAL, DIMENSION(D%NIJT) :: ZMAX_TSTEP ! Maximum CFL in column REAL, DIMENSION(SIZE(ICED%XRTMIN)) :: ZRSMIN -REAL, DIMENSION(D%NIT, D%NJT) :: ZREMAINT ! Remaining time until the timestep end -REAL, DIMENSION(D%NIT, D%NJT, 0:D%NKT+1) :: ZWSED ! Sedimentation fluxes -INTEGER :: IKTB, IKTE, IKB, IKL, IIE, IIB, IJB, IJE +REAL, DIMENSION(D%NIJT) :: ZREMAINT ! Remaining time until the timestep end +REAL, DIMENSION(D%NIJT, 0:D%NKT+1) :: ZWSED ! Sedimentation fluxes +INTEGER :: IKTB, IKTE, IKB, IKL, IIJE, IIJB REAL(KIND=JPRB) :: ZHOOK_HANDLE IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_SPLIT:INTERNAL_SEDIM_SPLIT', 0, ZHOOK_HANDLE) ! @@ -335,10 +330,8 @@ IKTB=D%NKTB IKTE=D%NKTE IKB=D%NKB IKL=D%NKL -IIB=D%NIB -IIE=D%NIE -IJB=D%NJB -IJE=D%NJE +IIJB=D%NIJB +IIJE=D%NIJE !------------------------------------------------------------------------------- IF (KSPE<2 .OR. KSPE>7) CALL PRINT_MSG(NVERB_FATAL,'GEN','INTERNAL_SEDIM_SPLIT','invalid species (KSPE variable)') ! @@ -348,29 +341,13 @@ ELSE GPRESENT_PFPR = .FALSE. END IF ! -PINPRX(:,:) = 0. +PINPRX(:) = 0. ZINVTSTEP=1./PTSTEP ZRSMIN(:) = ICED%XRTMIN(:) * ZINVTSTEP -ZREMAINT(:,:) = 0. -ZREMAINT(IIB:IIE,IJB:IJE) = PTSTEP +ZREMAINT(:) = 0. +ZREMAINT(IIJB:IIJE) = PTSTEP ! DO WHILE (ANY(ZREMAINT>0.)) - ISEDIM = 0 - DO JK = IKTB,IKTE - DO JJ = IJB,IJE - DO JI = IIB,IIE - IF( (PRXT (JI,JJ,JK)>ICED%XRTMIN(KSPE) .OR. & - PPRXS(JI,JJ,JK)>ZRSMIN(KSPE)) .AND. & - ZREMAINT(JI,JJ)>0. ) THEN - ISEDIM = ISEDIM + 1 - IDX = ISEDIM - I1(IDX) = JI - I2(IDX) = JJ - I3(IDX) = JK - END IF - END DO - END DO - END DO ! ! !* 1. Parameters for cloud sedimentation @@ -381,62 +358,59 @@ DO WHILE (ANY(ZREMAINT>0.)) ! IF(KSPE==2) THEN !******* for cloud - ZWSED(:,:,:) = 0. - DO JL=1, ISEDIM - JI=I1(JL) - JJ=I2(JL) - JK=I3(JL) - IF(PRXT(JI,JJ,JK)>ICED%XRTMIN(KSPE)) THEN - ZZWLBDC = PLBC(JI,JJ,JK) * PCONC3D(JI,JJ,JK) / & - &(PRHODREF(JI,JJ,JK) * PRXT(JI,JJ,JK)) - ZZWLBDC = ZZWLBDC**ICED%XLBEXC - ZRAY = PRAY(JI,JJ,JK) / ZZWLBDC - ZZT = PTHT(JI,JJ,JK) * (PPABST(JI,JJ,JK)/CST%XP00)**(CST%XRD/CST%XCPD) - ZZWLBDA = 6.6E-8*(101325./PPABST(JI,JJ,JK))*(ZZT/293.15) - ZZCC = ICED%XCC*(1.+1.26*ZZWLBDA/ZRAY) - ZWSED(JI, JJ, JK) = PRHODREF(JI,JJ,JK)**(-ICED%XCEXVT +1 ) * & - &ZZWLBDC**(-ICED%XDC)*ZZCC*PFSEDC(JI,JJ,JK) * PRXT(JI,JJ,JK) - ENDIF + ZWSED(:,:) = 0. + DO JK = IKTB,IKTE + DO JIJ = IIJB,IIJE + IF(PRXT(JIJ,JK)>ICED%XRTMIN(KSPE) .AND. ZREMAINT(JIJ)>0.) THEN + ZZWLBDC = PLBC(JIJ,JK) * PCONC3D(JIJ,JK) / & + &(PRHODREF(JIJ,JK) * PRXT(JIJ,JK)) + ZZWLBDC = ZZWLBDC**ICED%XLBEXC + ZRAY = PRAY(JIJ,JK) / ZZWLBDC + ZZT = PTHT(JIJ,JK) * (PPABST(JIJ,JK)/CST%XP00)**(CST%XRD/CST%XCPD) + ZZWLBDA = 6.6E-8*(101325./PPABST(JIJ,JK))*(ZZT/293.15) + ZZCC = ICED%XCC*(1.+1.26*ZZWLBDA/ZRAY) + ZWSED(JIJ, JK) = PRHODREF(JIJ,JK)**(-ICED%XCEXVT +1 ) * & + &ZZWLBDC**(-ICED%XDC)*ZZCC*PFSEDC(JIJ,JK) * PRXT(JIJ,JK) + ENDIF + ENDDO ENDDO ELSEIF(KSPE==4) THEN ! ******* for pristine ice - ZWSED(:,:,:) = 0. - DO JL=1, ISEDIM - JI=I1(JL) - JJ=I2(JL) - JK=I3(JL) - IF(PRXT(JI, JJ, JK) .GT. MAX(ICED%XRTMIN(4), 1.0E-7)) THEN - ZWSED(JI, JJ, JK) = ICEP%XFSEDI * PRXT(JI, JJ, JK) * & - & PRHODREF(JI,JJ,JK)**(1.-ICED%XCEXVT) * & ! McF&H - & MAX( 0.05E6,-0.15319E6-0.021454E6* & - & ALOG(PRHODREF(JI,JJ,JK)*PRXT(JI,JJ,JK)) )**ICEP%XEXCSEDI - ENDIF + ZWSED(:,:) = 0. + DO JK = IKTB,IKTE + DO JIJ = IIJB,IIJE + IF(PRXT(JIJ, JK) .GT. MAX(ICED%XRTMIN(4), 1.0E-7) .AND. ZREMAINT(JIJ)>0.) THEN + ZWSED(JIJ, JK) = ICEP%XFSEDI * PRXT(JIJ, JK) * & + & PRHODREF(JIJ,JK)**(1.-ICED%XCEXVT) * & ! McF&H + & MAX( 0.05E6,-0.15319E6-0.021454E6* & + & ALOG(PRHODREF(JIJ,JK)*PRXT(JIJ,JK)) )**ICEP%XEXCSEDI + ENDIF + ENDDO ENDDO #if defined(REPRO48) || defined(REPRO55) #else - ELSEIF(KSPE==5) THEN - ! ******* for snow - ZWSED(:,:,:) = 0. - DO JL=1, ISEDIM - JI=I1(JL) - JJ=I2(JL) - JK=I3(JL) - IF(PRXT(JI,JJ,JK)> ICED%XRTMIN(KSPE)) THEN - IF (PARAMI%LSNOW_T .AND. PT(JI,JJ,JK)>263.15) THEN - ZLBDA = MAX(MIN(ICED%XLBDAS_MAX, 10**(14.554-0.0423*PT(JI,JJ,JK))),ICED%XLBDAS_MIN)*ICED%XTRANS_MP_GAMMAS + ELSEIF(KSPE==5) THEN + ! ******* for snow + ZWSED(:,:) = 0. + DO JK = IKTB,IKTE + DO JIJ = IIJB,IIJE + IF(PRXT(JIJ,JK)> ICED%XRTMIN(KSPE) .AND. ZREMAINT(JIJ)>0.) THEN + IF (PARAMI%LSNOW_T .AND. PT(JIJ,JK)>263.15) THEN + ZLBDA = MAX(MIN(ICED%XLBDAS_MAX, 10**(14.554-0.0423*PT(JIJ,JK))),ICED%XLBDAS_MIN)*ICED%XTRANS_MP_GAMMAS ELSE IF (PARAMI%LSNOW_T) THEN - ZLBDA = MAX(MIN(ICED%XLBDAS_MAX, 10**(6.226 -0.0106*PT(JI,JJ,JK))),ICED%XLBDAS_MIN)*ICED%XTRANS_MP_GAMMAS + ZLBDA = MAX(MIN(ICED%XLBDAS_MAX, 10**(6.226 -0.0106*PT(JIJ,JK))),ICED%XLBDAS_MIN)*ICED%XTRANS_MP_GAMMAS ELSE - ZLBDA=MAX(MIN(ICED%XLBDAS_MAX, ICED%XLBS * ( PRHODREF(JI,JJ,JK) * PRXT(JI,JJ,JK) )**ICED%XLBEXS),ICED%XLBDAS_MIN) + ZLBDA=MAX(MIN(ICED%XLBDAS_MAX, ICED%XLBS * ( PRHODREF(JIJ,JK) * PRXT(JIJ,JK) )**ICED%XLBEXS),ICED%XLBDAS_MIN) END IF - ZWSED(JI, JJ, JK) = ICEP%XFSEDS * & - & PRXT(JI,JJ,JK)* & - & PRHODREF(JI,JJ,JK)**(1-ICED%XCEXVT) * & + ZWSED(JIJ, JK) = ICEP%XFSEDS * & + & PRXT(JIJ,JK)* & + & PRHODREF(JIJ,JK)**(1-ICED%XCEXVT) * & & (1 + (ICED%XFVELOS/ZLBDA)**ICED%XALPHAS)** (-ICED%XNUS+ICEP%XEXSEDS/ICED%XALPHAS) * & & ZLBDA ** (ICED%XBS+ICEP%XEXSEDS) ENDIF ENDDO + ENDDO #endif ELSE ! ******* for other species @@ -461,45 +435,39 @@ DO WHILE (ANY(ZREMAINT>0.)) CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'ICE4_SEDIMENTATION_SPLIT', 'no sedimentation parameter for KSPE='//TRIM(YSPE) ) END SELECT ! - ZWSED(:,:,:) = 0. - DO JL=1, ISEDIM - JI=I1(JL) - JJ=I2(JL) - JK=I3(JL) - IF(PRXT(JI,JJ,JK)>ICED%XRTMIN(KSPE)) THEN - ZWSED(JI, JJ, JK) = ZFSED * PRXT(JI, JJ, JK)**ZEXSED & - & * PRHODREF(JI, JJ, JK)**(ZEXSED-ICED%XCEXVT) - ENDIF + ZWSED(:,:) = 0. + DO JK = IKTB,IKTE + DO JIJ = IIJB,IIJE + IF(PRXT(JIJ,JK)>ICED%XRTMIN(KSPE) .AND. ZREMAINT(JIJ)>0.) THEN + ZWSED(JIJ, JK) = ZFSED * PRXT(JIJ, JK)**ZEXSED & + & * PRHODREF(JIJ, JK)**(ZEXSED-ICED%XCEXVT) + ENDIF + ENDDO ENDDO ENDIF - ZMAX_TSTEP(:,:) = ZREMAINT(:,:) - DO JL=1, ISEDIM - JI=I1(JL) - JJ=I2(JL) - JK=I3(JL) - IF(PRXT(JI,JJ,JK)>ICED%XRTMIN(KSPE) .AND. ZWSED(JI, JJ, JK)>1.E-20) THEN - ZMAX_TSTEP(JI, JJ) = MIN(ZMAX_TSTEP(JI, JJ), PARAMI%XSPLIT_MAXCFL * PRHODREF(JI, JJ, JK) * & - & PRXT(JI, JJ, JK) * PDZZ(JI, JJ, JK) / ZWSED(JI, JJ, JK)) - ENDIF + ZMAX_TSTEP(:) = ZREMAINT(:) + DO JK = IKTB,IKTE + DO JIJ = IIJB,IIJE + IF(PRXT(JIJ,JK)>ICED%XRTMIN(KSPE) .AND. ZWSED(JIJ, JK)>1.E-20 .AND. ZREMAINT(JIJ)>0.) THEN + ZMAX_TSTEP(JIJ) = MIN(ZMAX_TSTEP(JIJ), PARAMI%XSPLIT_MAXCFL * PRHODREF(JIJ, JK) * & + & PRXT(JIJ, JK) * PDZZ(JIJ, JK) / ZWSED(JIJ, JK)) + ENDIF + ENDDO ENDDO - DO JJ = IJB, IJE - DO JI = IIB, IIE - ZREMAINT(JI,JJ) = ZREMAINT(JI,JJ) - ZMAX_TSTEP(JI,JJ) - PINPRX(JI,JJ) = PINPRX(JI,JJ) + ZWSED(JI,JJ,IKB) / CST%XRHOLW * (ZMAX_TSTEP(JI,JJ) * ZINVTSTEP) - ENDDO + DO JIJ = IIJB, IIJE + ZREMAINT(JIJ) = ZREMAINT(JIJ) - ZMAX_TSTEP(JIJ) + PINPRX(JIJ) = PINPRX(JIJ) + ZWSED(JIJ,IKB) / CST%XRHOLW * (ZMAX_TSTEP(JIJ) * ZINVTSTEP) ENDDO DO JK = IKTB , IKTE - DO JJ = IJB, IJE - DO JI = IIB, IIE - ZMRCHANGE = ZMAX_TSTEP(JI,JJ) * POORHODZ(JI,JJ,JK)*(ZWSED(JI,JJ,JK+IKL)-ZWSED(JI,JJ,JK)) - PRXT(JI,JJ,JK) = PRXT(JI,JJ,JK) + ZMRCHANGE + PPRXS(JI,JJ,JK) * ZMAX_TSTEP(JI,JJ) - PRXS(JI,JJ,JK) = PRXS(JI,JJ,JK) + ZMRCHANGE * ZINVTSTEP - IF (GPRESENT_PFPR) THEN - PFPR(JI,JJ,JK,KSPE) = PFPR(JI,JJ,JK,KSPE) + ZWSED(JI,JJ,JK) * (ZMAX_TSTEP(JI,JJ) * ZINVTSTEP) - ENDIF - ENDDO + DO JIJ = IIJB, IIJE + ZMRCHANGE = ZMAX_TSTEP(JIJ) * POORHODZ(JIJ,JK)*(ZWSED(JIJ,JK+IKL)-ZWSED(JIJ,JK)) + PRXT(JIJ,JK) = PRXT(JIJ,JK) + ZMRCHANGE + PPRXS(JIJ,JK) * ZMAX_TSTEP(JIJ) + PRXS(JIJ,JK) = PRXS(JIJ,JK) + ZMRCHANGE * ZINVTSTEP + IF (GPRESENT_PFPR) THEN + PFPR(JIJ,JK,KSPE) = PFPR(JIJ,JK,KSPE) + ZWSED(JIJ,JK) * (ZMAX_TSTEP(JIJ) * ZINVTSTEP) + ENDIF ENDDO ENDDO ! diff --git a/src/PHYEX/micro/mode_ice4_sedimentation_split_momentum.f90 b/src/PHYEX/micro/mode_ice4_sedimentation_split_momentum.f90 deleted file mode 100644 index 498375058494a79d840b508deb57b099087ccab4..0000000000000000000000000000000000000000 --- a/src/PHYEX/micro/mode_ice4_sedimentation_split_momentum.f90 +++ /dev/null @@ -1,549 +0,0 @@ -!MNH_LIC Copyright 1994-2019 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_ICE4_SEDIMENTATION_SPLIT_MOMENTUM -IMPLICIT NONE -CONTAINS -SUBROUTINE ICE4_SEDIMENTATION_SPLIT_MOMENTUM(KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT, KKL, & - &PTSTEP, KRR, OSEDIC, OMOMENTUM, PDZZ, & - &PRHODREF, PPABST, PTHT, PRHODJ, & - &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& - &PINPRC, PINPRR, PINPRI, PINPRS, PINPRG, & - &PSEA, PTOWN, & - &PINPRH, PRHT, PRHS, PFPR) -!! -!!** PURPOSE -!! ------- -!! Computes the sedimentation -!! -!! AUTHOR -!! ------ -!! S. Riette from the plitting of rain_ice source code (nov. 2014) -!! and modified to use momentum -!! -!! MODIFICATIONS -!! ------------- -!! -! P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg -! P. Wautelet 28/05/2019: move COUNTJV function to tools.f90 -! -! -!* 0. DECLARATIONS -! ------------ -! -USE MODD_CST -USE MODD_PARAM_ICE -USE MODD_RAIN_ICE_DESCR -USE MODD_RAIN_ICE_PARAM - -USE MODE_MSG -use mode_tools, only: Countjv - -USE MODI_GAMMA -! -IMPLICIT NONE -! -!* 0.1 Declarations of dummy arguments : -! -INTEGER, INTENT(IN) :: KIB, KIE, KIT, KJB, KJE, KJT, KKB, KKE, KKTB, KKTE, KKT -INTEGER, INTENT(IN) :: KKL !vert. levels type 1=MNH -1=ARO -REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) -INTEGER, INTENT(IN) :: KRR ! Number of moist variable -LOGICAL, INTENT(IN) :: OSEDIC ! Switch for droplet sedim. -LOGICAL, INTENT(IN) :: OMOMENTUM ! Switch to use momentum flux -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PDZZ ! Layer thikness (m) -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF! Reference density -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPABST ! absolute pressure at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PTHT ! Theta at time t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODJ ! Dry density * Jacobian -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRCS ! Cloud water m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRRS ! Rain water m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRRT ! Rain water m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRIT ! Pristine ice m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRGS ! Graupel m.r. source -REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRC ! Cloud instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRR ! Rain instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRI ! Pristine ice instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRS ! Snow instant precip -REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRG ! Graupel instant precip -REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask -REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(IN) :: PTOWN ! Fraction that is town -REAL, DIMENSION(KIT,KJT), OPTIONAL, INTENT(OUT) :: PINPRH ! Hail instant precip -REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t -REAL, DIMENSION(KIT,KJT,KKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source -REAL, DIMENSION(KIT,KJT,KKT,KRR), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes -! -!* 0.2 declaration of local variables -! -! -LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) & - :: GSEDIM ! Test where to compute the SED processes -INTEGER , DIMENSION(SIZE(GSEDIM)) :: I1,I2,I3 ! Used to replace the COUNT - -REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: ZCONC3D, & ! droplet condensation - & ZRAY, & ! Cloud Mean radius - & ZLBC, & ! XLBC weighted by sea fraction - & ZFSEDC, & - & ZPRCS,ZPRRS,ZPRIS,ZPRSS,ZPRGS,ZPRHS, & ! Mixing ratios created during the time step - & ZW, & ! work array - & ZRCT, & - & ZRRT, & - & ZRIT, & - & ZRST, & - & ZRGT, & - & ZRHT -REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: ZMOMC, ZMOMR, ZMOMI, ZMOMS, ZMOMG, ZMOMH ! momentum -REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) :: ZMOMC_EXT, ZMOMR_EXT, ZMOMI_EXT, & - ZMOMS_EXT, ZMOMG_EXT, ZMOMH_EXT ! momentum tendencies -REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),0:SIZE(PRHODREF,3)+1) :: ZWSED ! sedimentation fluxes -REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2)) :: ZCONC_TMP ! Weighted concentration -REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2)) :: ZREMAINT ! Remaining time until the timestep end -REAL :: ZINVTSTEP -INTEGER :: ISEDIM ! ! Case number of sedimentation -INTEGER :: JK -LOGICAL :: FIRST -REAL, DIMENSION(SIZE(XRTMIN)) :: ZRSMIN -!------------------------------------------------------------------------------- -! -!------------------------------------------------------------------------------- -! -! -! O. Initialization of for sedimentation -! -ZINVTSTEP=1./PTSTEP -ZRSMIN(:) = XRTMIN(:) * ZINVTSTEP -IF (OSEDIC) PINPRC (:,:) = 0. -PINPRR (:,:) = 0. -PINPRI (:,:) = 0. -PINPRS (:,:) = 0. -PINPRG (:,:) = 0. -IF ( KRR == 7 ) PINPRH (:,:) = 0. -IF (PRESENT(PFPR)) PFPR(:,:,:,:) = 0. -! -!* 1. Parameters for cloud sedimentation -! -IF (OSEDIC) THEN - ZRAY(:,:,:) = 0. - ZLBC(:,:,:) = XLBC(1) - ZFSEDC(:,:,:) = XFSEDC(1) - ZCONC3D(:,:,:)= XCONC_LAND - ZCONC_TMP(:,:)= XCONC_LAND - IF (PRESENT(PSEA)) THEN - ZCONC_TMP(:,:)=PSEA(:,:)*XCONC_SEA+(1.-PSEA(:,:))*XCONC_LAND - DO JK=KKTB, KKTE - ZLBC(:,:,JK) = PSEA(:,:)*XLBC(2)+(1.-PSEA(:,:))*XLBC(1) - ZFSEDC(:,:,JK) = (PSEA(:,:)*XFSEDC(2)+(1.-PSEA(:,:))*XFSEDC(1)) - ZFSEDC(:,:,JK) = MAX(MIN(XFSEDC(1),XFSEDC(2)),ZFSEDC(:,:,JK)) - ZCONC3D(:,:,JK)= (1.-PTOWN(:,:))*ZCONC_TMP(:,:)+PTOWN(:,:)*XCONC_URBAN - ZRAY(:,:,JK) = 0.5*((1.-PSEA(:,:))*GAMMA(XNUC+1.0/XALPHAC)/(GAMMA(XNUC)) + & - & PSEA(:,:)*GAMMA(XNUC2+1.0/XALPHAC2)/(GAMMA(XNUC2))) - END DO - ELSE - ZCONC3D(:,:,:) = XCONC_LAND - ZRAY(:,:,:) = 0.5*(GAMMA(XNUC+1.0/XALPHAC)/(GAMMA(XNUC))) - END IF - ZRAY(:,:,:) = MAX(1.,ZRAY(:,:,:)) - ZLBC(:,:,:) = MAX(MIN(XLBC(1),XLBC(2)),ZLBC(:,:,:)) -ENDIF -! -!* 2. compute the fluxes -! -! optimization by looking for locations where -! the precipitating fields are larger than a minimal value only !!! -! For optimization we consider each variable separately -! -! External tendecies -IF (OSEDIC) THEN - ZPRCS(:,:,:) = PRCS(:,:,:)-PRCT(:,:,:)*ZINVTSTEP -ENDIF -ZPRRS(:,:,:) = PRRS(:,:,:)-PRRT(:,:,:)*ZINVTSTEP -ZPRIS(:,:,:) = PRIS(:,:,:)-PRIT(:,:,:)*ZINVTSTEP -ZPRSS(:,:,:) = PRSS(:,:,:)-PRST(:,:,:)*ZINVTSTEP -ZPRGS(:,:,:) = PRGS(:,:,:)-PRGT(:,:,:)*ZINVTSTEP -IF ( KRR == 7 ) THEN - ZPRHS(:,:,:) = PRHS(:,:,:)-PRHT(:,:,:)*ZINVTSTEP -END IF -! -! mr values inside the time-splitting loop -ZRCT(:,:,:) = PRCT(:,:,:) -ZRRT(:,:,:) = PRRT(:,:,:) -ZRIT(:,:,:) = PRIT(:,:,:) -ZRST(:,:,:) = PRST(:,:,:) -ZRGT(:,:,:) = PRGT(:,:,:) -IF (KRR==7) THEN - ZRHT(:,:,:) = PRHT(:,:,:) -END IF -! -DO JK = KKTB , KKTE - ZW(:,:,JK) =1./(PRHODREF(:,:,JK)* PDZZ(:,:,JK)) -END DO -! -! -!* 2.1 for cloud -! -IF (OSEDIC) THEN - ZREMAINT(:,:) = PTSTEP - FIRST = .TRUE. - DO WHILE (ANY(ZREMAINT>0.)) - GSEDIM(:,:,:)=.FALSE. - DO JK = KKTB , KKTE - GSEDIM(KIB:KIE,KJB:KJE,JK) = & - (ZRCT(KIB:KIE,KJB:KJE,JK)>XRTMIN(2) .OR. & - ZPRCS(KIB:KIE,KJB:KJE,JK)>ZRSMIN(2)) .AND. & - ZREMAINT(KIB:KIE,KJB:KJE)>0. - ENDDO - ISEDIM = COUNTJV(GSEDIM(:,:,:),I1(:),I2(:),I3(:)) - CALL INTERNAL_SEDIM_SPLI(KIT, KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & - &OMOMENTUM, FIRST .AND. OMOMENTUM, & - &ISEDIM, GSEDIM, I1, I2, I3, XSPLIT_MAXCFL, ZREMAINT, & - &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & - &2, & - &ZRCT, PRCS, ZWSED, PINPRC, ZPRCS, ZMOMC, ZMOMC_EXT, & - &ZRAY, ZLBC, ZFSEDC, ZCONC3D, PFPR=PFPR) - FIRST = .FALSE. - ENDDO -ENDIF -! -!* 2.2 for rain -! -ZREMAINT(:,:) = PTSTEP -FIRST = .TRUE. -DO WHILE (ANY(ZREMAINT>0.)) - GSEDIM(:,:,:)=.FALSE. - DO JK = KKTB , KKTE - GSEDIM(KIB:KIE,KJB:KJE,JK) = & - (ZRRT(KIB:KIE,KJB:KJE,JK)>XRTMIN(3) .OR. & - ZPRRS(KIB:KIE,KJB:KJE,JK)>ZRSMIN(3)) .AND. & - ZREMAINT(KIB:KIE,KJB:KJE)>0. - ENDDO - ISEDIM = COUNTJV(GSEDIM(:,:,:),I1(:),I2(:),I3(:)) - CALL INTERNAL_SEDIM_SPLI(KIT, KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & - &OMOMENTUM, FIRST .AND. OMOMENTUM, & - &ISEDIM, GSEDIM, I1, I2, I3, XSPLIT_MAXCFL, ZREMAINT, & - &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & - &3, & - &ZRRT, PRRS, ZWSED, PINPRR, ZPRRS, ZMOMR, ZMOMR_EXT, & - &PFPR=PFPR) - FIRST = .FALSE. -ENDDO -! -!* 2.3 for pristine ice -! -ZREMAINT(:,:) = PTSTEP -FIRST = .TRUE. -DO WHILE (ANY(ZREMAINT>0.)) - GSEDIM(:,:,:)=.FALSE. - DO JK = KKTB , KKTE - GSEDIM(KIB:KIE,KJB:KJE,JK) = & - (ZRIT(KIB:KIE,KJB:KJE,JK)>XRTMIN(4) .OR. & - ZPRIS(KIB:KIE,KJB:KJE,JK)>ZRSMIN(4)) .AND. & - ZREMAINT(KIB:KIE,KJB:KJE)>0. - ENDDO - ISEDIM = COUNTJV(GSEDIM(:,:,:),I1(:),I2(:),I3(:)) - CALL INTERNAL_SEDIM_SPLI(KIT, KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & - &OMOMENTUM, FIRST .AND. OMOMENTUM, & - &ISEDIM, GSEDIM, I1, I2, I3, XSPLIT_MAXCFL, ZREMAINT, & - &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & - &4, & - &ZRIT, PRIS, ZWSED, PINPRI, ZPRIS, ZMOMI, ZMOMI_EXT, PFPR=PFPR) - FIRST = .FALSE. -ENDDO -! -!* 2.4 for aggregates/snow -! -ZREMAINT(:,:) = PTSTEP -FIRST = .TRUE. -DO WHILE (ANY(ZREMAINT>0.)) - GSEDIM(:,:,:)=.FALSE. - DO JK = KKTB , KKTE - GSEDIM(KIB:KIE,KJB:KJE,JK) = & - (ZRST(KIB:KIE,KJB:KJE,JK)>XRTMIN(5) .OR. & - ZPRSS(KIB:KIE,KJB:KJE,JK)>ZRSMIN(5)) .AND. & - ZREMAINT(KIB:KIE,KJB:KJE)>0. - ENDDO - ISEDIM = COUNTJV(GSEDIM(:,:,:),I1(:),I2(:),I3(:)) - CALL INTERNAL_SEDIM_SPLI(KIT, KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & - &OMOMENTUM, FIRST .AND. OMOMENTUM, & - &ISEDIM, GSEDIM, I1, I2, I3, XSPLIT_MAXCFL, ZREMAINT, & - &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & - &5, & - &ZRST, PRSS, ZWSED, PINPRS, ZPRSS, ZMOMS, ZMOMS_EXT, PFPR=PFPR) - FIRST = .FALSE. -ENDDO -! -!* 2.5 for graupeln -! -ZREMAINT(:,:) = PTSTEP -FIRST = .TRUE. -DO WHILE (ANY(ZREMAINT>0.)) - GSEDIM(:,:,:)=.FALSE. - DO JK = KKTB , KKTE - GSEDIM(KIB:KIE,KJB:KJE,JK) = & - (ZRGT(KIB:KIE,KJB:KJE,JK)>XRTMIN(6) .OR. & - ZPRGS(KIB:KIE,KJB:KJE,JK)>ZRSMIN(6)) .AND. & - ZREMAINT(KIB:KIE,KJB:KJE)>0. - ENDDO - ISEDIM = COUNTJV(GSEDIM(:,:,:),I1(:),I2(:),I3(:)) - CALL INTERNAL_SEDIM_SPLI(KIT, KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & - &OMOMENTUM, FIRST .AND. OMOMENTUM, & - &ISEDIM, GSEDIM, I1, I2, I3, XSPLIT_MAXCFL, ZREMAINT, & - &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & - &6, & - &ZRGT, PRGS, ZWSED, PINPRG, ZPRGS, ZMOMG, ZMOMG_EXT, PFPR=PFPR) - FIRST = .FALSE. -ENDDO -! -!* 2.6 for hail -! -IF (KRR==7) THEN - ZREMAINT(:,:) = PTSTEP - FIRST = .TRUE. - DO WHILE (ANY(ZREMAINT>0.)) - GSEDIM(:,:,:)=.FALSE. - DO JK = KKTB , KKTE - GSEDIM(KIB:KIE,KJB:KJE,JK) = & - (ZRHT(KIB:KIE,KJB:KJE,JK)>XRTMIN(7) .OR. & - ZPRHS(KIB:KIE,KJB:KJE,JK)>ZRSMIN(7)) .AND. & - ZREMAINT(KIB:KIE,KJB:KJE)>0. - ENDDO - ISEDIM = COUNTJV(GSEDIM(:,:,:),I1(:),I2(:),I3(:)) - CALL INTERNAL_SEDIM_SPLI(KIT, KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & - &OMOMENTUM, FIRST .AND. OMOMENTUM, & - &ISEDIM, GSEDIM, I1, I2, I3, XSPLIT_MAXCFL, ZREMAINT, & - &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & - &7, & - &ZRHT, PRHS, ZWSED, PINPRH, ZPRHS, ZMOMH, ZMOMH_EXT, PFPR=PFPR) - FIRST = .FALSE. - END DO -ENDIF -! -! -CONTAINS -! -! -!------------------------------------------------------------------------------- -! -! - SUBROUTINE INTERNAL_SEDIM_SPLI(KIT, KJT, KKB, KKTB, KKTE, KKT, KKL, KRR, & - &OMOMENTUM, OCOMPUTE_MOM, & - &KSEDIM, LDSEDIM, I1, I2, I3, PMAXCFL, PREMAINT, & - &PRHODREF, POORHODZ, PDZZ, PPABST, PTHT, PTSTEP, & - &KSPE, & - &PRXT, PRXS, PWSED, PINPRX, PPRXS, PMOM, PMOM_EXT, & - &PRAY, PLBC, PFSEDC, PCONC3D, PFPR) - ! - !* 0. DECLARATIONS - ! ------------ - ! - USE MODD_RAIN_ICE_DESCR - USE MODD_RAIN_ICE_PARAM - ! - IMPLICIT NONE - ! - !* 0.1 Declarations of dummy arguments : - ! - INTEGER, INTENT(IN) :: KIT, KJT, KKB, KKTB, KKTE, KKT, KKL, KRR - LOGICAL, INTENT(IN) :: OMOMENTUM, OCOMPUTE_MOM - INTEGER, INTENT(IN) :: KSEDIM - LOGICAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: LDSEDIM - INTEGER, DIMENSION(KSEDIM), INTENT(IN) :: I1, I2, I3 - REAL, INTENT(IN) :: PMAXCFL ! maximum CFL allowed - REAL, DIMENSION(KIT,KJT), INTENT(INOUT) :: PREMAINT ! Time remaining until the end of the timestep - REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PRHODREF ! Reference density - REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: POORHODZ ! One Over (Rhodref times delta Z) - REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PDZZ ! layer thikness (m) - REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPABST - REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PTHT - REAL, INTENT(IN) :: PTSTEP ! total timestep - INTEGER, INTENT(IN) :: KSPE ! 1 for rc, 2 for rr... - REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRXT ! mr of specy X - REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PRXS !Tendency of the specy KSPE - REAL, DIMENSION(KIT,KJT,0:KKT+1), INTENT(OUT) :: PWSED ! sedimentation flux - REAL, DIMENSION(KIT,KJT), INTENT(INOUT) :: PINPRX ! instant precip - REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PPRXS ! external tendencie - REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PMOM ! momentum associated to PRXT - REAL, DIMENSION(KIT,KJT,KKT), INTENT(INOUT) :: PMOM_EXT ! momentum tendency associated to PPRXS - REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN), OPTIONAL :: PRAY, PLBC, PFSEDC, PCONC3D - REAL, DIMENSION(KIT,KJT,KKT,KRR), OPTIONAL, INTENT(INOUT) :: PFPR ! upper-air precipitation fluxes - ! - !* 0.2 declaration of local variables - ! - ! - character(len=10) :: yspe ! String for error message - INTEGER :: JK, JL, JI, JJ - REAL :: ZINVTSTEP - REAL :: ZZWLBDC, ZRAY, ZZT, ZZWLBDA, ZZCC - REAL :: ZFSED, ZEXSED - REAL, DIMENSION(KIT, KJT) :: ZMRCHANGE - REAL, DIMENSION(KIT, KJT) :: ZMAX_TSTEP ! Maximum CFL in column - REAL, DIMENSION(KIT,KJT,0:KKT+1) :: ZWSED_MOM ! Momentum flux - REAL, DIMENSION(SIZE(XRTMIN)) :: ZRSMIN - ! - !------------------------------------------------------------------------------- - ! - ! - !* 1. Parameters for cloud sedimentation - ! - ! - IF(OCOMPUTE_MOM .AND. .NOT. OMOMENTUM) THEN - call Print_msg( NVERB_FATAL, 'GEN', 'ICE4_SEDIMENTATION_SPLIT_MOMENTUM', & - 'OCOMPUTE_MOM cannot be .TRUE. if we do not use momentum' ) - ENDIF - !* 2. compute the fluxes - ! - ! - ZINVTSTEP = 1./PTSTEP - ZRSMIN(:) = XRTMIN(:) * ZINVTSTEP - IF(KSPE==2) THEN - !******* for cloud - IF(OCOMPUTE_MOM .OR. .NOT. OMOMENTUM) THEN - PWSED(:,:,:) = 0. - PMOM_EXT(:,:,:) = 0. - DO JL=1, KSEDIM - JI=I1(JL) - JJ=I2(JL) - JK=I3(JL) - IF(PRXT(JI,JJ,JK)>XRTMIN(KSPE)) THEN - ZZWLBDC = PLBC(JI,JJ,JK) * PCONC3D(JI,JJ,JK) / & - (PRHODREF(JI,JJ,JK) * PRXT(JI,JJ,JK)) - ZZWLBDC = ZZWLBDC**XLBEXC - ZRAY = PRAY(JI,JJ,JK) / ZZWLBDC - ZZT = PTHT(JI,JJ,JK) * (PPABST(JI,JJ,JK)/XP00)**(XRD/XCPD) - ZZWLBDA = 6.6E-8*(101325./PPABST(JI,JJ,JK))*(ZZT/293.15) - ZZCC = XCC*(1.+1.26*ZZWLBDA/ZRAY) - PWSED(JI, JJ, JK) = PRHODREF(JI,JJ,JK)**(-XCEXVT +1 ) * & - ZZWLBDC**(-XDC)*ZZCC*PFSEDC(JI,JJ,JK) * PRXT(JI,JJ,JK) - ENDIF - IF(PPRXS(JI,JJ,JK)>ZRSMIN(KSPE) .AND. OCOMPUTE_MOM) THEN - ZZWLBDC = PLBC(JI,JJ,JK) * PCONC3D(JI,JJ,JK) / & - (PRHODREF(JI,JJ,JK) * PPRXS(JI,JJ,JK) * PTSTEP) - ZZWLBDC = ZZWLBDC**XLBEXC - ZRAY = PRAY(JI,JJ,JK) / ZZWLBDC - ZZT = PTHT(JI,JJ,JK) * (PPABST(JI,JJ,JK)/XP00)**(XRD/XCPD) - ZZWLBDA = 6.6E-8*(101325./PPABST(JI,JJ,JK))*(ZZT/293.15) - ZZCC = XCC*(1.+1.26*ZZWLBDA/ZRAY) - PMOM_EXT(JI, JJ, JK) = PRHODREF(JI,JJ,JK)**(-XCEXVT +1 -1) * & - ZZWLBDC**(-XDC)*ZZCC*PFSEDC(JI,JJ,JK) * PPRXS(JI,JJ,JK) - ENDIF - ENDDO - IF(OCOMPUTE_MOM) PMOM(:, :, :)=PWSED(:, :, 1:KKT) - ENDIF - ELSEIF(KSPE==4) THEN - ! ******* for pristine ice - IF(OCOMPUTE_MOM .OR. .NOT. OMOMENTUM) THEN - PWSED(:,:,:) = 0. - PMOM_EXT(:,:,:) = 0. - DO JL=1, KSEDIM - JI=I1(JL) - JJ=I2(JL) - JK=I3(JL) - IF(PRXT(JI, JJ, JK) .GT. MAX(XRTMIN(4), 1.0E-7)) THEN - PWSED(JI, JJ, JK) = XFSEDI * PRXT(JI, JJ, JK) * & - & PRHODREF(JI,JJ,JK)**(1.-XCEXVT) * & ! McF&H - & MAX( 0.05E6,-0.15319E6-0.021454E6* & - & ALOG(PRHODREF(JI,JJ,JK)*PRXT(JI,JJ,JK)) )**XEXCSEDI - ENDIF - IF(PPRXS(JI,JJ,JK)>MAX(ZRSMIN(4), 1.0E-7/PTSTEP) .AND. OCOMPUTE_MOM) THEN - PMOM_EXT(JI, JJ, JK) = XFSEDI * PPRXS(JI, JJ, JK) * & - & PRHODREF(JI,JJ,JK)**(1.-XCEXVT-1) * & ! McF&H - & MAX( 0.05E6,-0.15319E6-0.021454E6* & - & ALOG(PRHODREF(JI,JJ,JK)*PPRXS(JI,JJ,JK)*PTSTEP) )**XEXCSEDI - ENDIF - ENDDO - IF(OCOMPUTE_MOM) PMOM(:, :, :)=PWSED(:, :, 1:KKT) - ENDIF - ELSE - ! ******* for other species - IF(KSPE==3) THEN - ZFSED=XFSEDR - ZEXSED=XEXSEDR - ELSEIF(KSPE==5) THEN - ZFSED=XFSEDS - ZEXSED=XEXSEDS - ELSEIF(KSPE==6) THEN - ZFSED=XFSEDG - ZEXSED=XEXSEDG - ELSEIF(KSPE==7) THEN - ZFSED=XFSEDH - ZEXSED=XEXSEDH - ELSE - write( yspe, '( I10 )' ) kspe - call Print_msg( NVERB_FATAL, 'GEN', 'ICE4_SEDIMENTATION_SPLIT_MOMENTUM', & - 'no sedimentation parameter for KSPE='//trim(yspe) ) - ENDIF - IF(OCOMPUTE_MOM .OR. .NOT. OMOMENTUM) THEN - !Momentum (per m3) and mass flux are given by the same formulae - PWSED(:,:,:) = 0. - PMOM_EXT(:,:,:) = 0. - DO JL=1, KSEDIM - JI=I1(JL) - JJ=I2(JL) - JK=I3(JL) - IF(PRXT(JI,JJ,JK)>XRTMIN(KSPE)) THEN - PWSED(JI, JJ, JK) = ZFSED * PRXT(JI, JJ, JK)**ZEXSED * & - PRHODREF(JI, JJ, JK)**(ZEXSED-XCEXVT) - ENDIF - IF(PPRXS(JI,JJ,JK)>ZRSMIN(KSPE) .AND. OCOMPUTE_MOM) THEN - PMOM_EXT(JI, JJ, JK) = ZFSED * (PPRXS(JI, JJ, JK)*PTSTEP)**ZEXSED * & - PRHODREF(JI, JJ, JK)**(ZEXSED-XCEXVT-1) * ZINVTSTEP - ENDIF - ENDDO - IF(OCOMPUTE_MOM) PMOM(:, :, :)=PWSED(:, :, 1:KKT) / PRHODREF(:, :, :) ! momentum per kg of dry air - ENDIF - ENDIF - IF(OMOMENTUM) THEN - PWSED(:,:,:) = 0. - ZWSED_MOM(:,:,:) = 0. - DO JL=1, KSEDIM - JI=I1(JL) - JJ=I2(JL) - JK=I3(JL) - IF(PRXT(JI,JJ,JK)>XRTMIN(KSPE)) THEN - ZWSED_MOM(JI, JJ, JK) = PMOM(JI, JJ, JK)**2 / PRXT(JI, JJ, JK) * PRHODREF(JI, JJ, JK) ! (kg*m/s)/(s*m**2) - ENDIF - ENDDO - PWSED(:, :, 1:KKT) = PMOM(:, :, :)*PRHODREF(:, :, :) !PMOM divided by r to get speed and multiply by rho*r to get flux - ENDIF - ZMAX_TSTEP(:,:) = PREMAINT(:,:) - DO JL=1, KSEDIM - JI=I1(JL) - JJ=I2(JL) - JK=I3(JL) - IF(PRXT(JI,JJ,JK)>XRTMIN(KSPE)) THEN - ZMAX_TSTEP(JI, JJ) = MIN(ZMAX_TSTEP(JI, JJ), PMAXCFL * PRHODREF(JI, JJ, JK) * & - PRXT(JI, JJ, JK) * PDZZ(JI, JJ, JK) / PWSED(JI, JJ, JK)) - ENDIF - ENDDO - ZMRCHANGE(:,:) = 0. - PREMAINT(:,:) = PREMAINT(:,:) - ZMAX_TSTEP(:,:) - DO JK = KKTB , KKTE - ZMRCHANGE(:,:) = ZMAX_TSTEP(:,:) * POORHODZ(:,:,JK)*(PWSED(:,:,JK+KKL)-PWSED(:,:,JK)) - PRXT(:,:,JK) = PRXT(:,:,JK) + ZMRCHANGE(:,:) + PPRXS(:,:,JK) * ZMAX_TSTEP(:,:) - PRXS(:,:,JK) = PRXS(:,:,JK) + ZMRCHANGE(:,:) * ZINVTSTEP - ENDDO - IF(OMOMENTUM) THEN - DO JK = KKTB , KKTE - PMOM(:,:,JK) = PMOM(:,:,JK) + ZMAX_TSTEP(:,:) * POORHODZ(:,:,JK) * (ZWSED_MOM(:,:,JK+KKL)-ZWSED_MOM(:,:,JK)) - PMOM(:,:,JK) = PMOM(:,:,JK) + ZMAX_TSTEP(:,:) * PMOM_EXT(:,:,JK) - PMOM(:,:,JK) = MAX(0., PMOM(:,:,JK)) - ENDDO - ENDIF - PINPRX(:,:) = PINPRX(:,:) + ZWSED(:,:,KKB) / XRHOLW * (ZMAX_TSTEP(:,:) * ZINVTSTEP) - IF (PRESENT(PFPR)) THEN - DO JK = KKTB , KKTE - PFPR(:,:,JK,KSPE) = PFPR(:,:,JK,KSPE) + ZWSED(:,:,JK) * (ZMAX_TSTEP(:,:) * ZINVTSTEP) - ENDDO - ENDIF - ! - END SUBROUTINE INTERNAL_SEDIM_SPLI - ! -END SUBROUTINE ICE4_SEDIMENTATION_SPLIT_MOMENTUM -! -END MODULE MODE_ICE4_SEDIMENTATION_SPLIT_MOMENTUM diff --git a/src/PHYEX/micro/mode_ice4_sedimentation_stat.f90 b/src/PHYEX/micro/mode_ice4_sedimentation_stat.f90 index 33e4e6e01e7ff5992ce919206038b62e0647a2e3..52183c8547782f2507b58d01a61d7428a6564822 100644 --- a/src/PHYEX/micro/mode_ice4_sedimentation_stat.f90 +++ b/src/PHYEX/micro/mode_ice4_sedimentation_stat.f90 @@ -6,10 +6,9 @@ MODULE MODE_ICE4_SEDIMENTATION_STAT IMPLICIT NONE CONTAINS -SUBROUTINE ICE4_SEDIMENTATION_STAT(D, CST, ICEP, ICED, & - &PTSTEP, KRR, OSEDIC, PDZZ, & - &PRHODREF, PPABST, PTHT, PRHODJ, & - &PLBDAS, & +SUBROUTINE ICE4_SEDIMENTATION_STAT(D, CST, ICEP, ICED, PARAMI, & + &PTSTEP, KRR, PDZZ, & + &PRHODREF, PPABST, PTHT, PT, PRHODJ, & &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, & &PRSS, PRST, PRGS, PRGT,& &PINPRC, PINPRR, PINPRI, PINPRS, PINPRG, & @@ -45,6 +44,7 @@ USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t USE MODD_CST, ONLY: CST_t USE MODD_RAIN_ICE_DESCR, ONLY: RAIN_ICE_DESCR_t USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t +USE MODD_PARAM_ICE, ONLY: PARAM_ICE_t USE MODI_GAMMA, ONLY: GAMMA ! IMPLICIT NONE @@ -55,46 +55,46 @@ TYPE(DIMPHYEX_t), INTENT(IN) :: D !array dimensio TYPE(CST_t), INTENT(IN) :: CST TYPE(RAIN_ICE_PARAM_t), INTENT(IN) :: ICEP TYPE(RAIN_ICE_DESCR_t), INTENT(IN) :: ICED +TYPE(PARAM_ICE_t), INTENT(IN) :: PARAMI REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) INTEGER, INTENT(IN) :: KRR ! Number of moist variable -LOGICAL, INTENT(IN) :: OSEDIC ! Switch for droplet sedim. -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PDZZ ! Layer thikness (m) -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRHODREF! Reference density -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PPABST ! absolute pressure at t -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PTHT ! Theta at time t -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRHODJ ! Dry density * Jacobian -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PLBDAS ! lambda parameter for snow -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PRCS ! Cloud water m.r. source -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRCT ! Cloud water m.r. at t -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PRRS ! Rain water m.r. source -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRRT ! Rain water m.r. at t -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRIT ! Pristine ice m.r. at t -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(INOUT) :: PRGS ! Graupel m.r. source -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t -REAL, DIMENSION(D%NIT,D%NJT), INTENT(OUT) :: PINPRC ! Cloud instant precip -REAL, DIMENSION(D%NIT,D%NJT), INTENT(OUT) :: PINPRR ! Rain instant precip -REAL, DIMENSION(D%NIT,D%NJT), INTENT(OUT) :: PINPRI ! Pristine ice instant precip -REAL, DIMENSION(D%NIT,D%NJT), INTENT(OUT) :: PINPRS ! Snow instant precip -REAL, DIMENSION(D%NIT,D%NJT), INTENT(OUT) :: PINPRG ! Graupel instant precip -REAL, DIMENSION(D%NIT,D%NJT), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask -REAL, DIMENSION(D%NIT,D%NJT), OPTIONAL, INTENT(IN) :: PTOWN ! Fraction that is town -REAL, DIMENSION(D%NIT,D%NJT), OPTIONAL, INTENT(OUT) :: PINPRH ! Hail instant precip -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t -REAL, DIMENSION(D%NIT,D%NJT,D%NKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source -REAL, DIMENSION(D%NIT,D%NJT,D%NKT,KRR), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDZZ ! Layer thikness (m) +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODREF! Reference density +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PPABST ! absolute pressure at t +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHT ! Theta at time t +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PT ! Temperature +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRHODJ ! Dry density * Jacobian +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRCS ! Cloud water m.r. source +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRCT ! Cloud water m.r. at t +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRRS ! Rain water m.r. source +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRRT ! Rain water m.r. at t +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRIS ! Pristine ice m.r. source +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRIT ! Pristine ice m.r. at t +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRSS ! Snow/aggregate m.r. source +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRST ! Snow/aggregate m.r. at t +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PRGS ! Graupel m.r. source +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRGT ! Graupel/hail m.r. at t +REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PINPRC ! Cloud instant precip +REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PINPRR ! Rain instant precip +REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PINPRI ! Pristine ice instant precip +REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PINPRS ! Snow instant precip +REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PINPRG ! Graupel instant precip +REAL, DIMENSION(D%NIJT), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask +REAL, DIMENSION(D%NIJT), OPTIONAL, INTENT(IN) :: PTOWN ! Fraction that is town +REAL, DIMENSION(D%NIJT), OPTIONAL, INTENT(OUT) :: PINPRH ! Hail instant precip +REAL, DIMENSION(D%NIJT,D%NKT), OPTIONAL, INTENT(IN) :: PRHT ! Hail m.r. at t +REAL, DIMENSION(D%NIJT,D%NKT), OPTIONAL, INTENT(INOUT) :: PRHS ! Hail m.r. source +REAL, DIMENSION(D%NIJT,D%NKT,KRR), OPTIONAL, INTENT(OUT) :: PFPR ! upper-air precipitation fluxes ! !* 0.2 declaration of local variables ! LOGICAL :: LLSEA_AND_TOWN -INTEGER :: JRR, JI, JJ, JK, IKB, IKE,IKL, IIE, IIB, IJB, IJE, IKTB, IKTE +INTEGER :: JRR, JIJ, JK, IKB, IKE,IKL, IIJB, IIJE, IKTB, IKTE INTEGER :: ISHIFT, IK, IKPLUS -REAL :: ZQP, ZP1, ZINVTSTEP, ZGAC, ZGC, ZGAC2, ZGC2, ZRAYDEFO -REAL, DIMENSION(D%NIT) :: ZWSEDW1, ZWSEDW2 ! sedimentation speed -REAL, DIMENSION(D%NIT,D%NJT) :: ZTSORHODZ ! TimeStep Over (Rhodref times delta Z) -REAL, DIMENSION(D%NIT,D%NJT,0:1,2:KRR) :: ZSED ! sedimentation flux array for each species and for above and current levels +REAL :: ZQP, ZP1, ZINVTSTEP, ZGAC, ZGC, ZGAC2, ZGC2, ZRAYDEFO, ZLBDAS +REAL, DIMENSION(D%NIJT) :: ZWSEDW1, ZWSEDW2 ! sedimentation speed +REAL, DIMENSION(D%NIJT) :: ZTSORHODZ ! TimeStep Over (Rhodref times delta Z) +REAL, DIMENSION(D%NIJT,0:1,2:KRR) :: ZSED ! sedimentation flux array for each species and for above and current levels REAL :: FWSED1, FWSED2, PWSEDW, PWSEDWSUP, PINVTSTEP, PTSTEP1, PDZZ1, PRHODREF1, PRXT1 REAL(KIND=JPRB) :: ZHOOK_HANDLE @@ -115,17 +115,15 @@ IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_STAT',0,ZHOOK_HANDLE) IKB=D%NKB IKE=D%NKE IKL=D%NKL -IIB=D%NIB -IIE=D%NIE -IJB=D%NJB -IJE=D%NJE +IIJB=D%NIJB +IIJE=D%NIJE IKTB=D%NKTB IKTE=D%NKTE ! IF ( PRESENT( PFPR ) ) THEN !Set to 0. to avoid undefined values (in files) - PFPR(:, :, : IKTB, :) = 0. - PFPR(:, :, IKTE :, :) = 0. + PFPR(:, : IKTB, :) = 0. + PFPR(:, IKTE :, :) = 0. END IF !------------------------------------------------------------------------------- @@ -149,16 +147,14 @@ CALL SHIFT ! Initialize vertical loop DO JRR=2,KRR - ZSED(:,:,IKPLUS,JRR) = 0. + ZSED(:,IKPLUS,JRR) = 0. ENDDO ! calculation sedimentation flux DO JK = IKE , IKB, -1*IKL - DO JJ = IJB, IJE - DO JI = IIB, IIE - ZTSORHODZ(JI,JJ) =PTSTEP/(PRHODREF(JI,JJ,JK)*PDZZ(JI,JJ,JK)) - ENDDO + DO JIJ = IIJB, IIJE + ZTSORHODZ(JIJ) =PTSTEP/(PRHODREF(JIJ,JK)*PDZZ(JIJ,JK)) ENDDO ! DO JRR=2,KRR @@ -166,40 +162,40 @@ DO JK = IKE , IKB, -1*IKL IF (JRR==2) THEN !******* for cloud - IF (OSEDIC) THEN - CALL CLOUD(PRCT(:,:,JK)) + IF (PARAMI%LSEDIC) THEN + CALL CLOUD(PRCT(:,JK)) ELSE - ZSED(:,:,IK,JRR)=0. + ZSED(:,IK,JRR)=0. ENDIF ELSEIF (JRR==3) THEN !* 2.2 for rain - CALL OTHER_SPECIES(ICEP%XFSEDR,ICEP%XEXSEDR,PRRT(:,:,JK)) + CALL OTHER_SPECIES(ICEP%XFSEDR,ICEP%XEXSEDR,PRRT(:,JK)) ELSEIF (JRR==4) THEN - CALL PRISTINE_ICE(PRIT(:,:,JK)) + CALL PRISTINE_ICE(PRIT(:,JK)) ELSEIF (JRR==5) THEN !* 2.4 for aggregates/snow #ifdef REPRO48 - CALL OTHER_SPECIES(ICEP%XFSEDS,ICEP%XEXSEDS,PRST(:,:,JK)) + CALL OTHER_SPECIES(ICEP%XFSEDS,ICEP%XEXSEDS,PRST(:,JK)) #else - CALL SNOW(PRST(:,:,JK)) + CALL SNOW(PRST(:,JK)) #endif ELSEIF (JRR==6) THEN !* 2.5 for graupeln - CALL OTHER_SPECIES(ICEP%XFSEDG,ICEP%XEXSEDG,PRGT(:,:,JK)) + CALL OTHER_SPECIES(ICEP%XFSEDG,ICEP%XEXSEDG,PRGT(:,JK)) ELSEIF (JRR==7) THEN !* 2.6 for hail IF (PRESENT(PRHT)) THEN - CALL OTHER_SPECIES(ICEP%XFSEDH,ICEP%XEXSEDH,PRHT(:,:,JK)) + CALL OTHER_SPECIES(ICEP%XFSEDH,ICEP%XEXSEDH,PRHT(:,JK)) ENDIF ENDIF @@ -210,35 +206,31 @@ DO JK = IKE , IKB, -1*IKL IF(PRESENT(PFPR)) THEN DO JRR=2,KRR - PFPR(:,:,JK,JRR)=ZSED(:,:,IK,JRR) + PFPR(:,JK,JRR)=ZSED(:,IK,JRR) ENDDO ENDIF - DO JJ = IJB, IJE - DO JI = IIB, IIE - PRCS(JI,JJ,JK) = PRCS(JI,JJ,JK)+ZTSORHODZ(JI,JJ)*(ZSED(JI,JJ,IKPLUS,2)-ZSED(JI,JJ,IK,2))*ZINVTSTEP - PRRS(JI,JJ,JK) = PRRS(JI,JJ,JK)+ZTSORHODZ(JI,JJ)*(ZSED(JI,JJ,IKPLUS,3)-ZSED(JI,JJ,IK,3))*ZINVTSTEP - PRIS(JI,JJ,JK) = PRIS(JI,JJ,JK)+ZTSORHODZ(JI,JJ)*(ZSED(JI,JJ,IKPLUS,4)-ZSED(JI,JJ,IK,4))*ZINVTSTEP - PRSS(JI,JJ,JK) = PRSS(JI,JJ,JK)+ZTSORHODZ(JI,JJ)*(ZSED(JI,JJ,IKPLUS,5)-ZSED(JI,JJ,IK,5))*ZINVTSTEP - PRGS(JI,JJ,JK) = PRGS(JI,JJ,JK)+ZTSORHODZ(JI,JJ)*(ZSED(JI,JJ,IKPLUS,6)-ZSED(JI,JJ,IK,6))*ZINVTSTEP - IF (PRESENT(PRHS)) THEN - PRHS(JI,JJ,JK) = PRHS(JI,JJ,JK)+ZTSORHODZ(JI,JJ)*(ZSED(JI,JJ,IKPLUS,7)-ZSED(JI,JJ,IK,7))*ZINVTSTEP - ENDIF - ENDDO + DO JIJ = IIJB, IIJE + PRCS(JIJ,JK) = PRCS(JIJ,JK)+ZTSORHODZ(JIJ)*(ZSED(JIJ,IKPLUS,2)-ZSED(JIJ,IK,2))*ZINVTSTEP + PRRS(JIJ,JK) = PRRS(JIJ,JK)+ZTSORHODZ(JIJ)*(ZSED(JIJ,IKPLUS,3)-ZSED(JIJ,IK,3))*ZINVTSTEP + PRIS(JIJ,JK) = PRIS(JIJ,JK)+ZTSORHODZ(JIJ)*(ZSED(JIJ,IKPLUS,4)-ZSED(JIJ,IK,4))*ZINVTSTEP + PRSS(JIJ,JK) = PRSS(JIJ,JK)+ZTSORHODZ(JIJ)*(ZSED(JIJ,IKPLUS,5)-ZSED(JIJ,IK,5))*ZINVTSTEP + PRGS(JIJ,JK) = PRGS(JIJ,JK)+ZTSORHODZ(JIJ)*(ZSED(JIJ,IKPLUS,6)-ZSED(JIJ,IK,6))*ZINVTSTEP + IF (PRESENT(PRHS) .AND. KRR==7) THEN + PRHS(JIJ,JK) = PRHS(JIJ,JK)+ZTSORHODZ(JIJ)*(ZSED(JIJ,IKPLUS,7)-ZSED(JIJ,IK,7))*ZINVTSTEP + ENDIF ENDDO IF (JK==IKB) THEN - DO JJ = IJB, IJE - DO JI = IIB, IIE - IF(OSEDIC) PINPRC(JI,JJ) = ZSED(JI,JJ,IK,2)/CST%XRHOLW - PINPRR(JI,JJ) = ZSED(JI,JJ,IK,3)/CST%XRHOLW - PINPRI(JI,JJ) = ZSED(JI,JJ,IK,4)/CST%XRHOLW - PINPRS(JI,JJ) = ZSED(JI,JJ,IK,5)/CST%XRHOLW - PINPRG(JI,JJ) = ZSED(JI,JJ,IK,6)/CST%XRHOLW - IF (PRESENT(PINPRH)) THEN - PINPRH(JI,JJ) = ZSED(JI,JJ,IK,7)/CST%XRHOLW - ENDIF - ENDDO + DO JIJ = IIJB, IIJE + IF(PARAMI%LSEDIC) PINPRC(JIJ) = ZSED(JIJ,IK,2)/CST%XRHOLW + PINPRR(JIJ) = ZSED(JIJ,IK,3)/CST%XRHOLW + PINPRI(JIJ) = ZSED(JIJ,IK,4)/CST%XRHOLW + PINPRS(JIJ) = ZSED(JIJ,IK,5)/CST%XRHOLW + PINPRG(JIJ) = ZSED(JIJ,IK,6)/CST%XRHOLW + IF (PRESENT(PINPRH) .AND. KRR==7) THEN + PINPRH(JIJ) = ZSED(JIJ,IK,7)/CST%XRHOLW + ENDIF ENDDO ENDIF @@ -253,7 +245,7 @@ CONTAINS SUBROUTINE CLOUD(PRXT) - REAL, INTENT(IN) :: PRXT(D%NIT,D%NJT) ! mr of specy X + REAL, INTENT(IN) :: PRXT(D%NIJT) ! mr of specy X REAL :: ZLBC ! XLBC weighted by sea fraction REAL :: ZFSEDC @@ -265,53 +257,51 @@ CONTAINS !!IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_STAT:CLOUD',0,ZHOOK_HANDLE) - DO JJ = IJB, IJE - DO JI = IIB, IIE - !estimation of q' taking into account incoming ZWSED from previous vertical level - ZQP=ZSED(JI,JJ,IKPLUS,JRR)*ZTSORHODZ(JI,JJ) - IF ((PRXT(JI,JJ) > ICED%XRTMIN(JRR)) .OR. (ZQP > ICED%XRTMIN(JRR))) THEN - IF (LLSEA_AND_TOWN) THEN - ZRAY = MAX(1.,0.5*((1.-PSEA(JI,JJ))*ZGAC/ZGC+PSEA(JI,JJ)*ZGAC2/ZGC2)) - ZLBC = MAX(MIN(ICED%XLBC(1),ICED%XLBC(2)),(PSEA(JI,JJ)*ICED%XLBC(2)+(1.-PSEA(JI,JJ))*ICED%XLBC(1)) ) - ZFSEDC = MAX(MIN(ICEP%XFSEDC(1),ICEP%XFSEDC(2)), (PSEA(JI,JJ)*ICEP%XFSEDC(2)+(1.-PSEA(JI,JJ))*ICEP%XFSEDC(1)) ) - ZCONC3D= (1.-PTOWN(JI,JJ))*(PSEA(JI,JJ)*ICED%XCONC_SEA+(1.-PSEA(JI,JJ))*ICED%XCONC_LAND) + & - PTOWN(JI,JJ) *ICED%XCONC_URBAN - ELSE - ZRAY = ZRAYDEFO - ZLBC = ICED%XLBC(1) - ZFSEDC = ICEP%XFSEDC(1) - ZCONC3D= ICED%XCONC_LAND - ENDIF - !calculation of w - IF(PRXT(JI,JJ) > ICED%XRTMIN(JRR)) THEN - ZZWLBDA=6.6E-8*(101325./PPABST(JI,JJ,JK))*(PTHT(JI,JJ,JK)/293.15) - ZZWLBDC=(ZLBC*ZCONC3D/(PRHODREF(JI,JJ,JK)*PRXT(JI,JJ)))**ICED%XLBEXC - ZZCC=ICED%XCC*(1.+1.26*ZZWLBDA*ZZWLBDC/ZRAY) !! ZCC : Fall speed - ZWSEDW1(JI)=PRHODREF(JI,JJ,JK)**(-ICED%XCEXVT ) * ZZWLBDC**(-ICED%XDC)*ZZCC*ZFSEDC - ELSE - ZWSEDW1(JI)=0. - ENDIF - IF ( ZQP > ICED%XRTMIN(JRR) ) THEN - ZZWLBDA=6.6E-8*(101325./PPABST(JI,JJ,JK))*(PTHT(JI,JJ,JK)/293.15) - ZZWLBDC=(ZLBC*ZCONC3D/(PRHODREF(JI,JJ,JK)*ZQP))**ICED%XLBEXC - ZZCC=ICED%XCC*(1.+1.26*ZZWLBDA*ZZWLBDC/ZRAY) !! ZCC : Fall speed - ZWSEDW2(JI)=PRHODREF(JI,JJ,JK)**(-ICED%XCEXVT ) * ZZWLBDC**(-ICED%XDC)*ZZCC*ZFSEDC - ELSE - ZWSEDW2(JI)=0. - ENDIF + DO JIJ = IIJB, IIJE + !estimation of q' taking into account incoming ZWSED from previous vertical level + ZQP=ZSED(JIJ,IKPLUS,JRR)*ZTSORHODZ(JIJ) + IF ((PRXT(JIJ) > ICED%XRTMIN(JRR)) .OR. (ZQP > ICED%XRTMIN(JRR))) THEN + IF (LLSEA_AND_TOWN) THEN + ZRAY = MAX(1.,0.5*((1.-PSEA(JIJ))*ZGAC/ZGC+PSEA(JIJ)*ZGAC2/ZGC2)) + ZLBC = MAX(MIN(ICED%XLBC(1),ICED%XLBC(2)),(PSEA(JIJ)*ICED%XLBC(2)+(1.-PSEA(JIJ))*ICED%XLBC(1)) ) + ZFSEDC = MAX(MIN(ICEP%XFSEDC(1),ICEP%XFSEDC(2)), (PSEA(JIJ)*ICEP%XFSEDC(2)+(1.-PSEA(JIJ))*ICEP%XFSEDC(1)) ) + ZCONC3D= (1.-PTOWN(JIJ))*(PSEA(JIJ)*ICED%XCONC_SEA+(1.-PSEA(JIJ))*ICED%XCONC_LAND) + & + PTOWN(JIJ) *ICED%XCONC_URBAN ELSE - ZWSEDW1(JI)=0. - ZWSEDW2(JI)=0. + ZRAY = ZRAYDEFO + ZLBC = ICED%XLBC(1) + ZFSEDC = ICEP%XFSEDC(1) + ZCONC3D= ICED%XCONC_LAND ENDIF -!- duplicated code ------------------------------------------------------------------------- - IF (ZWSEDW2(JI) /= 0.) THEN - ZSED(JI,JJ,IK,JRR)=FWSED1(ZWSEDW1(JI),PTSTEP,PDZZ(JI,JJ,JK),PRHODREF(JI,JJ,JK),PRXT(JI,JJ),ZINVTSTEP) & - & + FWSED2(ZWSEDW2(JI),PTSTEP,PDZZ(JI,JJ,JK),ZSED(JI,JJ,IKPLUS,JRR)) + !calculation of w + IF(PRXT(JIJ) > ICED%XRTMIN(JRR)) THEN + ZZWLBDA=6.6E-8*(101325./PPABST(JIJ,JK))*(PTHT(JIJ,JK)/293.15) + ZZWLBDC=(ZLBC*ZCONC3D/(PRHODREF(JIJ,JK)*PRXT(JIJ)))**ICED%XLBEXC + ZZCC=ICED%XCC*(1.+1.26*ZZWLBDA*ZZWLBDC/ZRAY) !! ZCC : Fall speed + ZWSEDW1(JIJ)=PRHODREF(JIJ,JK)**(-ICED%XCEXVT ) * ZZWLBDC**(-ICED%XDC)*ZZCC*ZFSEDC + ELSE + ZWSEDW1(JIJ)=0. + ENDIF + IF ( ZQP > ICED%XRTMIN(JRR) ) THEN + ZZWLBDA=6.6E-8*(101325./PPABST(JIJ,JK))*(PTHT(JIJ,JK)/293.15) + ZZWLBDC=(ZLBC*ZCONC3D/(PRHODREF(JIJ,JK)*ZQP))**ICED%XLBEXC + ZZCC=ICED%XCC*(1.+1.26*ZZWLBDA*ZZWLBDC/ZRAY) !! ZCC : Fall speed + ZWSEDW2(JIJ)=PRHODREF(JIJ,JK)**(-ICED%XCEXVT ) * ZZWLBDC**(-ICED%XDC)*ZZCC*ZFSEDC ELSE - ZSED(JI,JJ,IK,JRR)=FWSED1(ZWSEDW1(JI),PTSTEP,PDZZ(JI,JJ,JK),PRHODREF(JI,JJ,JK),PRXT(JI,JJ),ZINVTSTEP) + ZWSEDW2(JIJ)=0. ENDIF + ELSE + ZWSEDW1(JIJ)=0. + ZWSEDW2(JIJ)=0. + ENDIF +!- duplicated code ------------------------------------------------------------------------- + IF (ZWSEDW2(JIJ) /= 0.) THEN + ZSED(JIJ,IK,JRR)=FWSED1(ZWSEDW1(JIJ),PTSTEP,PDZZ(JIJ,JK),PRHODREF(JIJ,JK),PRXT(JIJ),ZINVTSTEP) & + & + FWSED2(ZWSEDW2(JIJ),PTSTEP,PDZZ(JIJ,JK),ZSED(JIJ,IKPLUS,JRR)) + ELSE + ZSED(JIJ,IK,JRR)=FWSED1(ZWSEDW1(JIJ),PTSTEP,PDZZ(JIJ,JK),PRHODREF(JIJ,JK),PRXT(JIJ),ZINVTSTEP) + ENDIF !------------------------------------------------------------------------------------------- - ENDDO ENDDO !!IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_STAT:CLOUD',1,ZHOOK_HANDLE) @@ -320,47 +310,45 @@ CONTAINS SUBROUTINE PRISTINE_ICE(PRXT) - REAL, INTENT(IN) :: PRXT(D%NIT,D%NJT) ! mr of specy X + REAL, INTENT(IN) :: PRXT(D%NIJT) ! mr of specy X REAL(KIND=JPRB) :: ZHOOK_HANDLE !!IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_STAT:PRISTINE_ICE',0,ZHOOK_HANDLE) ! ******* for pristine ice - DO JJ = IJB, IJE - DO JI = IIB, IIE - ZQP=ZSED(JI,JJ,IKPLUS,JRR)*ZTSORHODZ(JI,JJ) - IF ((PRXT(JI,JJ) > ICED%XRTMIN(JRR)) .OR. (ZQP > ICED%XRTMIN(JRR))) THEN - !calculation of w - IF ( PRXT(JI,JJ) > MAX(ICED%XRTMIN(JRR),1.0E-7 ) ) THEN - ZWSEDW1(JI)= ICEP%XFSEDI * & - & PRHODREF(JI,JJ,JK)**(-ICED%XCEXVT) * & ! McF&H - & MAX( 0.05E6,-0.15319E6-0.021454E6* & - & ALOG(PRHODREF(JI,JJ,JK)*PRXT(JI,JJ)) )**ICEP%XEXCSEDI - ELSE - ZWSEDW1(JI)=0. - ENDIF - IF ( ZQP > MAX(ICED%XRTMIN(JRR),1.0E-7 ) ) THEN - ZWSEDW2(JI)= ICEP%XFSEDI * & - & PRHODREF(JI,JJ,JK)**(-ICED%XCEXVT) * & ! McF&H - & MAX( 0.05E6,-0.15319E6-0.021454E6* & - & ALOG(PRHODREF(JI,JJ,JK)*ZQP) )**ICEP%XEXCSEDI - ELSE - ZWSEDW2(JI)=0. - ENDIF + DO JIJ = IIJB, IIJE + ZQP=ZSED(JIJ,IKPLUS,JRR)*ZTSORHODZ(JIJ) + IF ((PRXT(JIJ) > ICED%XRTMIN(JRR)) .OR. (ZQP > ICED%XRTMIN(JRR))) THEN + !calculation of w + IF ( PRXT(JIJ) > MAX(ICED%XRTMIN(JRR),1.0E-7 ) ) THEN + ZWSEDW1(JIJ)= ICEP%XFSEDI * & + & PRHODREF(JIJ,JK)**(-ICED%XCEXVT) * & ! McF&H + & MAX( 0.05E6,-0.15319E6-0.021454E6* & + & ALOG(PRHODREF(JIJ,JK)*PRXT(JIJ)) )**ICEP%XEXCSEDI ELSE - ZWSEDW1(JI)=0. - ZWSEDW2(JI)=0. + ZWSEDW1(JIJ)=0. ENDIF -!- duplicated code ------------------------------------------------------------------------- - IF (ZWSEDW2(JI) /= 0.) THEN - ZSED(JI,JJ,IK,JRR)=FWSED1(ZWSEDW1(JI),PTSTEP,PDZZ(JI,JJ,JK),PRHODREF(JI,JJ,JK),PRXT(JI,JJ),ZINVTSTEP) & - & + FWSED2(ZWSEDW2(JI),PTSTEP,PDZZ(JI,JJ,JK),ZSED(JI,JJ,IKPLUS,JRR)) + IF ( ZQP > MAX(ICED%XRTMIN(JRR),1.0E-7 ) ) THEN + ZWSEDW2(JIJ)= ICEP%XFSEDI * & + & PRHODREF(JIJ,JK)**(-ICED%XCEXVT) * & ! McF&H + & MAX( 0.05E6,-0.15319E6-0.021454E6* & + & ALOG(PRHODREF(JIJ,JK)*ZQP) )**ICEP%XEXCSEDI ELSE - ZSED(JI,JJ,IK,JRR)=FWSED1(ZWSEDW1(JI),PTSTEP,PDZZ(JI,JJ,JK),PRHODREF(JI,JJ,JK),PRXT(JI,JJ),ZINVTSTEP) + ZWSEDW2(JIJ)=0. ENDIF + ELSE + ZWSEDW1(JIJ)=0. + ZWSEDW2(JIJ)=0. + ENDIF +!- duplicated code ------------------------------------------------------------------------- + IF (ZWSEDW2(JIJ) /= 0.) THEN + ZSED(JIJ,IK,JRR)=FWSED1(ZWSEDW1(JIJ),PTSTEP,PDZZ(JIJ,JK),PRHODREF(JIJ,JK),PRXT(JIJ),ZINVTSTEP) & + & + FWSED2(ZWSEDW2(JIJ),PTSTEP,PDZZ(JIJ,JK),ZSED(JIJ,IKPLUS,JRR)) + ELSE + ZSED(JIJ,IK,JRR)=FWSED1(ZWSEDW1(JIJ),PTSTEP,PDZZ(JIJ,JK),PRHODREF(JIJ,JK),PRXT(JIJ),ZINVTSTEP) + ENDIF !------------------------------------------------------------------------------------------- - ENDDO ENDDO !!IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_STAT:PRISTINE_ICE',1,ZHOOK_HANDLE) @@ -369,47 +357,55 @@ CONTAINS SUBROUTINE SNOW(PRXT) - REAL, INTENT(IN) :: PRXT(D%NIT,D%NJT) ! mr of specy X + REAL, INTENT(IN) :: PRXT(D%NIJT) ! mr of specy X REAL(KIND=JPRB) :: ZHOOK_HANDLE !!IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_STAT:SNOW',0,ZHOOK_HANDLE) ! ******* for snow - DO JJ = IJB, IJE - DO JI = IIB, IIE - ZQP=ZSED(JI,JJ,IKPLUS,JRR)*ZTSORHODZ(JI,JJ) - IF ((PRXT(JI,JJ) > ICED%XRTMIN(JRR)) .OR. (ZQP > ICED%XRTMIN(JRR))) THEN - !calculation of w - IF ( PRXT(JI,JJ) > ICED%XRTMIN(JRR) ) THEN - ZWSEDW1(JI)= ICEP%XFSEDS * & - & PRHODREF(JI,JJ,JK)**(-ICED%XCEXVT) * & - & (1+(ICED%XFVELOS/PLBDAS(JI,JJ,JK))**ICED%XALPHAS)**(-ICED%XNUS+ICEP%XEXSEDS/ICED%XALPHAS)* & - & PLBDAS(JI,JJ,JK)**(ICED%XBS+ICEP%XEXSEDS) - ELSE - ZWSEDW1(JI)=0. - ENDIF - IF ( ZQP > ICED%XRTMIN(JRR) ) THEN - ZWSEDW2(JI)= ICEP%XFSEDS * & - & PRHODREF(JI,JJ,JK)**(-ICED%XCEXVT) * & - & (1+(ICED%XFVELOS/PLBDAS(JI,JJ,JK))**ICED%XALPHAS)**(-ICED%XNUS+ICEP%XEXSEDS/ICED%XALPHAS)* & - & PLBDAS(JI,JJ,JK)**(ICED%XBS+ICEP%XEXSEDS) + DO JIJ = IIJB, IIJE + ZQP=ZSED(JIJ,IKPLUS,JRR)*ZTSORHODZ(JIJ) + IF ((PRXT(JIJ) > ICED%XRTMIN(JRR)) .OR. (ZQP > ICED%XRTMIN(JRR))) THEN + !Compute lambda_snow parameter + IF (PARAMI%LSNOW_T) THEN + IF(PT(JIJ,JK)>CST%XTT-10.0) THEN + ZLBDAS = MAX(MIN(ICED%XLBDAS_MAX, 10**(14.554-0.0423*PT(JIJ,JK))),ICED%XLBDAS_MIN)*ICED%XTRANS_MP_GAMMAS ELSE - ZWSEDW2(JI)=0. - ENDIF + ZLBDAS = MAX(MIN(ICED%XLBDAS_MAX, 10**(6.226-0.0106*PT(JIJ,JK))),ICED%XLBDAS_MIN)*ICED%XTRANS_MP_GAMMAS + END IF ELSE - ZWSEDW1(JI)=0. - ZWSEDW2(JI)=0. + ZLBDAS = MAX(MIN(ICED%XLBDAS_MAX,ICED%XLBS*(PRHODREF(JIJ,JK)*PRXT(JIJ))**ICED%XLBEXS),ICED%XLBDAS_MIN) + END IF + !calculation of w + IF ( PRXT(JIJ) > ICED%XRTMIN(JRR) ) THEN + ZWSEDW1(JIJ)= ICEP%XFSEDS * & + & PRHODREF(JIJ,JK)**(-ICED%XCEXVT) * & + & (1+(ICED%XFVELOS/ZLBDAS)**ICED%XALPHAS)**(-ICED%XNUS+ICEP%XEXSEDS/ICED%XALPHAS)* & + & ZLBDAS**(ICED%XBS+ICEP%XEXSEDS) + ELSE + ZWSEDW1(JIJ)=0. ENDIF -!- duplicated code ------------------------------------------------------------------------- - IF (ZWSEDW2(JI) /= 0.) THEN - ZSED(JI,JJ,IK,JRR)=FWSED1(ZWSEDW1(JI),PTSTEP,PDZZ(JI,JJ,JK),PRHODREF(JI,JJ,JK),PRXT(JI,JJ),ZINVTSTEP) & - & + FWSED2(ZWSEDW2(JI),PTSTEP,PDZZ(JI,JJ,JK),ZSED(JI,JJ,IKPLUS,JRR)) + IF ( ZQP > ICED%XRTMIN(JRR) ) THEN + ZWSEDW2(JIJ)= ICEP%XFSEDS * & + & PRHODREF(JIJ,JK)**(-ICED%XCEXVT) * & + & (1+(ICED%XFVELOS/ZLBDAS)**ICED%XALPHAS)**(-ICED%XNUS+ICEP%XEXSEDS/ICED%XALPHAS)* & + & ZLBDAS**(ICED%XBS+ICEP%XEXSEDS) ELSE - ZSED(JI,JJ,IK,JRR)=FWSED1(ZWSEDW1(JI),PTSTEP,PDZZ(JI,JJ,JK),PRHODREF(JI,JJ,JK),PRXT(JI,JJ),ZINVTSTEP) + ZWSEDW2(JIJ)=0. ENDIF + ELSE + ZWSEDW1(JIJ)=0. + ZWSEDW2(JIJ)=0. + ENDIF +!- duplicated code ------------------------------------------------------------------------- + IF (ZWSEDW2(JIJ) /= 0.) THEN + ZSED(JIJ,IK,JRR)=FWSED1(ZWSEDW1(JIJ),PTSTEP,PDZZ(JIJ,JK),PRHODREF(JIJ,JK),PRXT(JIJ),ZINVTSTEP) & + & + FWSED2(ZWSEDW2(JIJ),PTSTEP,PDZZ(JIJ,JK),ZSED(JIJ,IKPLUS,JRR)) + ELSE + ZSED(JIJ,IK,JRR)=FWSED1(ZWSEDW1(JIJ),PTSTEP,PDZZ(JIJ,JK),PRHODREF(JIJ,JK),PRXT(JIJ),ZINVTSTEP) + ENDIF !------------------------------------------------------------------------------------------- - ENDDO ENDDO !!IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_STAT:SNOW',1,ZHOOK_HANDLE) @@ -420,41 +416,39 @@ CONTAINS REAL, INTENT(IN) :: PFSED REAL, INTENT(IN) :: PEXSED - REAL, INTENT(IN) :: PRXT(D%NIT,D%NJT) ! mr of specy X + REAL, INTENT(IN) :: PRXT(D%NIJT) ! mr of specy X REAL(KIND=JPRB) :: ZHOOK_HANDLE !!IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_STAT:OTHER_SPECIES',0,ZHOOK_HANDLE) ! for all but cloud and pristine ice : - DO JJ = IJB, IJE - DO JI = IIB, IIE - ZQP=ZSED(JI,JJ,IKPLUS,JRR)*ZTSORHODZ(JI,JJ) - IF ((PRXT(JI,JJ) > ICED%XRTMIN(JRR)) .OR. (ZQP > ICED%XRTMIN(JRR))) THEN - !calculation of w - IF ( PRXT(JI,JJ) > ICED%XRTMIN(JRR) ) THEN - ZWSEDW1(JI)= PFSED *PRXT(JI,JJ)**(PEXSED-1)*PRHODREF(JI,JJ,JK)**(PEXSED-ICED%XCEXVT-1) - ELSE - ZWSEDW1(JI)=0. - ENDIF - IF ( ZQP > ICED%XRTMIN(JRR) ) THEN - ZWSEDW2(JI)= PFSED *ZQP**(PEXSED-1)*PRHODREF(JI,JJ,JK)**(PEXSED-ICED%XCEXVT-1) - ELSE - ZWSEDW2(JI)=0. - ENDIF + DO JIJ = IIJB, IIJE + ZQP=ZSED(JIJ,IKPLUS,JRR)*ZTSORHODZ(JIJ) + IF ((PRXT(JIJ) > ICED%XRTMIN(JRR)) .OR. (ZQP > ICED%XRTMIN(JRR))) THEN + !calculation of w + IF ( PRXT(JIJ) > ICED%XRTMIN(JRR) ) THEN + ZWSEDW1(JIJ)= PFSED *PRXT(JIJ)**(PEXSED-1)*PRHODREF(JIJ,JK)**(PEXSED-ICED%XCEXVT-1) ELSE - ZWSEDW1(JI)=0. - ZWSEDW2(JI)=0. + ZWSEDW1(JIJ)=0. ENDIF -!- duplicated code ------------------------------------------------------------------------- - IF (ZWSEDW2(JI) /= 0.) THEN - ZSED(JI,JJ,IK,JRR)=FWSED1(ZWSEDW1(JI),PTSTEP,PDZZ(JI,JJ,JK),PRHODREF(JI,JJ,JK),PRXT(JI,JJ),ZINVTSTEP) & - & + FWSED2(ZWSEDW2(JI),PTSTEP,PDZZ(JI,JJ,JK),ZSED(JI,JJ,IKPLUS,JRR)) + IF ( ZQP > ICED%XRTMIN(JRR) ) THEN + ZWSEDW2(JIJ)= PFSED *ZQP**(PEXSED-1)*PRHODREF(JIJ,JK)**(PEXSED-ICED%XCEXVT-1) ELSE - ZSED(JI,JJ,IK,JRR)=FWSED1(ZWSEDW1(JI),PTSTEP,PDZZ(JI,JJ,JK),PRHODREF(JI,JJ,JK),PRXT(JI,JJ),ZINVTSTEP) + ZWSEDW2(JIJ)=0. ENDIF + ELSE + ZWSEDW1(JIJ)=0. + ZWSEDW2(JIJ)=0. + ENDIF +!- duplicated code ------------------------------------------------------------------------- + IF (ZWSEDW2(JIJ) /= 0.) THEN + ZSED(JIJ,IK,JRR)=FWSED1(ZWSEDW1(JIJ),PTSTEP,PDZZ(JIJ,JK),PRHODREF(JIJ,JK),PRXT(JIJ),ZINVTSTEP) & + & + FWSED2(ZWSEDW2(JIJ),PTSTEP,PDZZ(JIJ,JK),ZSED(JIJ,IKPLUS,JRR)) + ELSE + ZSED(JIJ,IK,JRR)=FWSED1(ZWSEDW1(JIJ),PTSTEP,PDZZ(JIJ,JK),PRHODREF(JIJ,JK),PRXT(JIJ),ZINVTSTEP) + ENDIF !------------------------------------------------------------------------------------------- - ENDDO ENDDO !!IF (LHOOK) CALL DR_HOOK('ICE4_SEDIMENTATION_STAT:OTHER_SPECIES',1,ZHOOK_HANDLE) diff --git a/src/PHYEX/micro/mode_ice4_stepping.f90 b/src/PHYEX/micro/mode_ice4_stepping.f90 new file mode 100644 index 0000000000000000000000000000000000000000..8a438a79968778ffb2de9d0ea91bae7f98d31a24 --- /dev/null +++ b/src/PHYEX/micro/mode_ice4_stepping.f90 @@ -0,0 +1,432 @@ +!MNH_LIC Copyright 1995-2021 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +MODULE MODE_ICE4_STEPPING +IMPLICIT NONE +CONTAINS +SUBROUTINE ICE4_STEPPING(D, CST, PARAMI, ICEP, ICED, BUCONF, & + &LDSIGMA_RC, LDAUCV_ADJU, LDEXT_TEND, & + &KPROMA, KMICRO, LDMICRO, PTSTEP, & + &KRR, & + &HSUBG_AUCV_RC, HSUBG_AUCV_RI, & + &PEXN, PRHODREF, K1, K2, & + &PPRES, PCF, PSIGMA_RC, & + &PCIT, & + &PVART, & + &PHLC_HCF, PHLC_HRC, & + &PHLI_HCF, PHLI_HRI, PRAINFR, & + &PEXTPK, PBU_SUM, PRREVAV) + +! ----------------------------------------------------------------- +! +!* 0. DECLARATIONS +! ------------ +! +USE PARKIND1, ONLY : JPRB +USE YOMHOOK , ONLY : LHOOK, DR_HOOK + +USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t +USE MODD_BUDGET, ONLY: TBUDGETCONF_t +USE MODD_CST, ONLY: CST_t +USE MODD_PARAM_ICE, ONLY: PARAM_ICE_t +USE MODD_RAIN_ICE_DESCR, ONLY: RAIN_ICE_DESCR_t +USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t +USE MODD_FIELDS_ADDRESS, ONLY : & ! common fields adress + & ITH, & ! Potential temperature + & IRV, & ! Water vapor + & IRC, & ! Cloud water + & IRR, & ! Rain water + & IRI, & ! Pristine ice + & IBUNUM, & ! Number of tendency terms + & IBUNUM_MR, & ! Number of tendency terms expressed as mixing ratio changes + & IBUNUM_EXTRA, & ! Number of extra tendency terms + & IRREVAV, & ! Index for the evaporation tendency + & IBUEXTRAIND ! Index indirection + +USE MODE_MSG, ONLY: PRINT_MSG, NVERB_FATAL + +USE MODE_ICE4_TENDENCIES, ONLY: ICE4_TENDENCIES +! +IMPLICIT NONE +! +!* 0.1 Declarations of dummy arguments : +! +! +! +TYPE(DIMPHYEX_t), INTENT(IN) :: D +TYPE(CST_t), INTENT(IN) :: CST +TYPE(PARAM_ICE_t), INTENT(IN) :: PARAMI +TYPE(RAIN_ICE_PARAM_t), INTENT(IN) :: ICEP +TYPE(RAIN_ICE_DESCR_t), INTENT(IN) :: ICED +TYPE(TBUDGETCONF_t), INTENT(IN) :: BUCONF +LOGICAL, INTENT(IN) :: LDSIGMA_RC +LOGICAL, INTENT(IN) :: LDAUCV_ADJU +LOGICAL, INTENT(IN) :: LDEXT_TEND +INTEGER, INTENT(IN) :: KPROMA ! cache-blocking factor for microphysic loop +INTEGER, INTENT(IN) :: KMICRO ! Case r_x>0 locations +LOGICAL, DIMENSION(KPROMA), INTENT(IN) :: LDMICRO +REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) +INTEGER, INTENT(IN) :: KRR ! Number of moist variable +CHARACTER(LEN=4), INTENT(IN) :: HSUBG_AUCV_RC ! Kind of Subgrid autoconversion method +CHARACTER(LEN=80), INTENT(IN) :: HSUBG_AUCV_RI ! Kind of Subgrid autoconversion method +! +REAL, DIMENSION(KPROMA), INTENT(IN) :: PEXN ! Exner function +REAL, DIMENSION(KPROMA), INTENT(IN) :: PRHODREF! Reference density +INTEGER, DIMENSION(KPROMA), INTENT(IN) :: K1,K2 ! Used to replace the COUNT and PACK intrinsics on variables +REAL, DIMENSION(KPROMA), INTENT(IN) :: PPRES +REAL, DIMENSION(KPROMA), INTENT(IN) :: PCF ! Cloud fraction +REAL, DIMENSION(KPROMA), INTENT(INOUT) :: PSIGMA_RC +REAL, DIMENSION(KPROMA), INTENT(INOUT) :: PCIT +REAL, DIMENSION(KPROMA,0:7), INTENT(INOUT) :: PVART !Packed variables +REAL, DIMENSION(KPROMA), INTENT(INOUT) :: PHLC_HRC +REAL, DIMENSION(KPROMA), INTENT(INOUT) :: PHLC_HCF +REAL, DIMENSION(KPROMA), INTENT(INOUT) :: PHLI_HRI +REAL, DIMENSION(KPROMA), INTENT(INOUT) :: PHLI_HCF +REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRAINFR +REAL, DIMENSION(KPROMA,0:7), INTENT(INOUT) :: PEXTPK !To take into acount external tendencies inside the splitting +REAL, DIMENSION(KPROMA, IBUNUM-IBUNUM_EXTRA),INTENT(OUT) :: PBU_SUM +REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRREVAV +! +! +!* 0.2 Declarations of local variables : +! +REAL(KIND=JPRB) :: ZHOOK_HANDLE +! +LOGICAL :: LSOFT ! Must we really compute tendencies or only adjust them to new T variables +INTEGER :: INB_ITER_MAX ! Maximum number of iterations (with real tendencies computation) +REAL :: ZTSTEP ! length of sub-timestep in case of time splitting +REAL :: ZINV_TSTEP ! Inverse ov PTSTEP +REAL :: ZTIME_THRESHOLD ! Time to reach threshold +! +INTEGER :: JL, JV, JJV +REAL, DIMENSION(KPROMA) :: & + & ZTIME, & ! Current integration time (starts with 0 and ends with PTSTEP) + & ZMAXTIME, & ! Time on which we can apply the current tendencies + & ZTIME_LASTCALL, & ! Integration time when last tendecies call has been done + & ZSSI, & + & ZZT, & ! Temperature + & ZLSFACT, & ! L_s/(Pi*C_ph) + & ZLVFACT, & ! L_v/(Pi*C_ph) + & ZHLC_LCF, & ! HLCLOUDS : fraction of Low Cloud Fraction in grid + ! note that PCF = PHLC_HCF + ZHLC_LCF + & ZHLC_LRC, & ! HLCLOUDS : LWC that is Low LWC in grid + ! note that ZRC = PHLC_HRC + ZHLC_LRC + & ZHLI_LCF, & + & ZHLI_LRI +LOGICAL, DIMENSION(KPROMA) :: LLCOMPUTE ! .TRUE. or points where we must compute tendencies, +! +!Output packed tendencies (for budgets only) +REAL, DIMENSION(KPROMA, IBUNUM) :: ZBU_INST +! +!For mixing-ratio-splitting +LOGICAL :: LLCPZ0RT +REAL :: ZTIME_THRESHOLD1D(KPROMA) ! Time to reach threshold +REAL, DIMENSION(KPROMA, KRR) :: Z0RT ! Mixing-ratios at the beginig of the current loop +! +REAL, DIMENSION(KPROMA,0:7) :: ZA, ZB +! +REAL, DIMENSION(KPROMA, 8) :: ZRS_TEND, ZRG_TEND +REAL, DIMENSION(KPROMA,10) :: ZRH_TEND + +INTEGER, DIMENSION(KPROMA) :: IITER ! Number of iterations done (with real tendencies computation) +! +REAL, DIMENSION(KPROMA) :: ZSUM2, ZMAXB +REAL :: ZDEVIDE, ZX +! +LOGICAL :: LL_ANY_ITER +! +!------------------------------------------------------------------------------- +IF (LHOOK) CALL DR_HOOK('ICE4_STEPPING', 0, ZHOOK_HANDLE) +! +!* 1. GENERALITIES +! ------------ +! +ZINV_TSTEP=1./PTSTEP +! +IF(BUCONF%LBU_ENABLE) THEN + DO JV=1, IBUNUM-IBUNUM_EXTRA + PBU_SUM(:, JV)=0. + ENDDO +ENDIF + +!Maximum number of iterations +!We only count real iterations (those for which we *compute* tendencies) +INB_ITER_MAX=PARAMI%NMAXITER +IF(PARAMI%XTSTEP_TS/=0.)THEN + INB_ITER_MAX=MAX(1, INT(PTSTEP/PARAMI%XTSTEP_TS)) !At least the number of iterations needed for the time-splitting + ZTSTEP=PTSTEP/INB_ITER_MAX + INB_ITER_MAX=MAX(PARAMI%NMAXITER, INB_ITER_MAX) !For the case XMRSTEP/=0. at the same time +ENDIF + +IF (LDEXT_TEND) THEN + DO JV=0, KRR + DO JL=1, KMICRO + PEXTPK(JL, JV)=PEXTPK(JL, JV)-PVART(JL, JV)*ZINV_TSTEP + ENDDO + ENDDO +ENDIF +IF (LDSIGMA_RC) THEN + DO JL=1, KMICRO + PSIGMA_RC(JL)=PSIGMA_RC(JL)*2. + ENDDO +ENDIF +IF (LDAUCV_ADJU) THEN + DO JL=1, KMICRO + ZHLC_LRC(JL) = PVART(JL, IRC) - PHLC_HRC(JL) + ZHLI_LRI(JL) = PVART(JL, IRI) - PHLI_HRI(JL) + IF(PVART(JL, IRC)>0.) THEN + ZHLC_LCF(JL) = PCF(JL)- PHLC_HCF(JL) + ELSE + ZHLC_LCF(JL)=0. + ENDIF + IF(PVART(JL, IRI)>0.) THEN + ZHLI_LCF(JL) = PCF(JL)- PHLI_HCF(JL) + ELSE + ZHLI_LCF(JL)=0. + ENDIF + ENDDO +ENDIF + +!------------------------------------------------------------------------------- +! +!*** 4.4 temporal loop +! +! +IITER(1:KMICRO)=0 +DO JL=1, KMICRO + IF(LDMICRO(JL)) THEN + ZTIME(JL)=0. ! Current integration time (all points may have a different integration time) + ELSE + ZTIME(JL)=PTSTEP ! Nothing to do on this point, it has already reached the end of the timestep + ENDIF +ENDDO + +DO WHILE(ANY(ZTIME(1:KMICRO)<PTSTEP)) ! Loop to *really* compute tendencies + + IF(PARAMI%XTSTEP_TS/=0.) THEN + ! In this case we need to remember the time when tendencies were computed + ! because when time has evolved more than a limit, we must re-compute tendencies + ZTIME_LASTCALL(1:KMICRO)=ZTIME(1:KMICRO) + ENDIF + DO JL=1, KMICRO + IF (ZTIME(JL) < PTSTEP) THEN + LLCOMPUTE(JL)=.TRUE. ! Computation (.TRUE.) only for points for which integration time has not reached the timestep + IITER(JL)=IITER(JL)+1 + ELSE + LLCOMPUTE(JL)=.FALSE. + ENDIF + ENDDO + LL_ANY_ITER=ANY(IITER(1:KMICRO) < INB_ITER_MAX) + LLCPZ0RT=.TRUE. + LSOFT=.FALSE. ! We *really* compute the tendencies + + DO WHILE(ANY(LLCOMPUTE(1:KMICRO))) ! Loop to adjust tendencies when we cross the 0°C or when a species disappears +!$OMP SIMD + DO JL=1, KMICRO + ZSUM2(JL)=SUM(PVART(JL,IRI:KRR)) + ENDDO + DO JL=1, KMICRO + ZDEVIDE=(CST%XCPD + CST%XCPV*PVART(JL, IRV) + CST%XCL*(PVART(JL, IRC)+PVART(JL, IRR)) + CST%XCI*ZSUM2(JL)) * PEXN(JL) + ZZT(JL) = PVART(JL, ITH) * PEXN(JL) + ZLSFACT(JL)=(CST%XLSTT+(CST%XCPV-CST%XCI)*(ZZT(JL)-CST%XTT)) / ZDEVIDE + ZLVFACT(JL)=(CST%XLVTT+(CST%XCPV-CST%XCL)*(ZZT(JL)-CST%XTT)) / ZDEVIDE + ENDDO + !------------------------------------------------------------------------------- + ! + !*** 4.5 Effective tendencies computation + ! + ! + ! Tendencies are *really* computed when LSOFT==.FALSE. and only adjusted otherwise + CALL ICE4_TENDENCIES(D, CST, PARAMI, ICEP, ICED, BUCONF, & + &KPROMA, KMICRO, & + &KRR, LSOFT, LLCOMPUTE, & + &HSUBG_AUCV_RC, HSUBG_AUCV_RI, & + &PEXN, PRHODREF, ZLVFACT, ZLSFACT, K1, K2, & + &PPRES, PCF, PSIGMA_RC, & + &PCIT, & + &ZZT, PVART, & + &ZBU_INST, & + &ZRS_TEND, ZRG_TEND, ZRH_TEND, ZSSI, & + &ZA, ZB, & + &PHLC_HCF, ZHLC_LCF, PHLC_HRC, ZHLC_LRC, & + &PHLI_HCF, ZHLI_LCF, PHLI_HRI, ZHLI_LRI, PRAINFR) + + ! External tendencies + IF(LDEXT_TEND) THEN + DO JV=0, KRR + DO JL=1, KMICRO + ZA(JL, JV) = ZA(JL, JV) + PEXTPK(JL, JV) + ENDDO + ENDDO + ENDIF + !------------------------------------------------------------------------------- + ! + !*** 4.6 Time integration + ! + ! + ! If we can, we shall use these tendencies until the end of the timestep + DO JL=1, KMICRO + IF(LLCOMPUTE(JL)) THEN + ZMAXTIME(JL)=(PTSTEP-ZTIME(JL)) ! Remaining time until the end of the timestep + ELSE + ZMAXTIME(JL)=0. + ENDIF + ENDDO + + !We need to adjust tendencies when temperature reaches 0 + IF(PARAMI%LFEEDBACKT) THEN + DO JL=1, KMICRO + !Is ZB(:, ITH) enough to change temperature sign? + ZX=CST%XTT/PEXN(JL) + IF ((PVART(JL, ITH) - ZX) * (PVART(JL, ITH) + ZB(JL, ITH) - ZX) < 0.) THEN + ZMAXTIME(JL)=0. + ENDIF + !Can ZA(:, ITH) make temperature change of sign? + IF (ABS(ZA(JL,ITH)) > 1.E-20 ) THEN + ZTIME_THRESHOLD=(ZX - ZB(JL, ITH) - PVART(JL, ITH))/ZA(JL, ITH) + IF (ZTIME_THRESHOLD > 0.) THEN + ZMAXTIME(JL)=MIN(ZMAXTIME(JL), ZTIME_THRESHOLD) + ENDIF + ENDIF + ENDDO + ENDIF + + !We need to adjust tendencies when a species disappears + !When a species is missing, only the external tendencies can be negative (and we must keep track of it) + DO JV=1, KRR + DO JL=1, KMICRO + IF (ZA(JL, JV) < -1.E-20 .AND. PVART(JL, JV) > ICED%XRTMIN(JV)) THEN + ZMAXTIME(JL)=MIN(ZMAXTIME(JL), -(ZB(JL, JV)+PVART(JL, JV))/ZA(JL, JV)) + ENDIF + ENDDO + ENDDO + + !We stop when the end of the timestep is reached + DO JL=1, KMICRO + IF (ZTIME(JL)+ZMAXTIME(JL) >= PTSTEP) THEN + LLCOMPUTE(JL)=.FALSE. + ENDIF + ENDDO + !We must recompute tendencies when the end of the sub-timestep is reached + IF (PARAMI%XTSTEP_TS/=0.) THEN + DO JL=1, KMICRO + IF ((IITER(JL) < INB_ITER_MAX) .AND. (ZTIME(JL)+ZMAXTIME(JL) > ZTIME_LASTCALL(JL)+ZTSTEP)) THEN + ZMAXTIME(JL)=ZTIME_LASTCALL(JL)-ZTIME(JL)+ZTSTEP + LLCOMPUTE(JL)=.FALSE. + ENDIF + ENDDO + ENDIF + + !We must recompute tendencies when the maximum allowed change is reached + !When a species is missing, only the external tendencies can be active and we do not want to recompute + !the microphysical tendencies when external tendencies are negative (results won't change because species was already missing) + IF (PARAMI%XMRSTEP/=0.) THEN + IF (LL_ANY_ITER) THEN + ! In this case we need to remember the initial mixing ratios used to compute the tendencies + ! because when mixing ratio has evolved more than a threshold, we must re-compute tendencies + ! Thus, at first iteration (ie when LLCPZ0RT=.TRUE.) we copy PVART into Z0RT + DO JV=1,KRR + IF (LLCPZ0RT) Z0RT(1:KMICRO, JV)=PVART(1:KMICRO, JV) + DO JL=1, KMICRO + IF (IITER(JL)<INB_ITER_MAX .AND. ABS(ZA(JL,JV))>1.E-20) THEN + ZTIME_THRESHOLD1D(JL)=(SIGN(1., ZA(JL, JV))*PARAMI%XMRSTEP+ & + &Z0RT(JL, JV)-PVART(JL, JV)-ZB(JL, JV))/ZA(JL, JV) + ELSE + ZTIME_THRESHOLD1D(JL)=-1. + ENDIF + ENDDO + DO JL=1, KMICRO + IF (ZTIME_THRESHOLD1D(JL)>=0 .AND. ZTIME_THRESHOLD1D(JL)<ZMAXTIME(JL) .AND. & + &(PVART(JL, JV)>ICED%XRTMIN(JV) .OR. ZA(JL, JV)>0.)) THEN + ZMAXTIME(JL)=MIN(ZMAXTIME(JL), ZTIME_THRESHOLD1D(JL)) + LLCOMPUTE(JL)=.FALSE. + ENDIF + ENDDO + ENDDO + LLCPZ0RT=.FALSE. +!$OMP SIMD + DO JL=1,KMICRO + ZMAXB(JL)=MAXVAL(ABS(ZB(JL,1:KRR))) + ENDDO + DO JL=1, KMICRO + IF (IITER(JL)<INB_ITER_MAX .AND. ZMAXB(JL)>PARAMI%XMRSTEP) THEN + ZMAXTIME(JL)=0. + LLCOMPUTE(JL)=.FALSE. + ENDIF + ENDDO + ENDIF ! LL_ANY_ITER + ENDIF ! XMRSTEP/=0. + !------------------------------------------------------------------------------- + ! + !*** 4.7 New values of variables for next iteration + ! + ! + DO JV=0, KRR + DO JL=1, KMICRO + IF(LDMICRO(JL)) THEN + PVART(JL, JV)=PVART(JL, JV)+ZA(JL, JV)*ZMAXTIME(JL)+ZB(JL, JV) + ENDIF + ENDDO + ENDDO + DO JL=1, KMICRO +#ifdef REPRO55 + PCIT(JL)=PCIT(JL) * MAX(0., -SIGN(1., -PVART(JL,IRI))) +#else + IF (PVART(JL,IRI)<=0. .AND. LDMICRO(JL)) PCIT(JL) = 0. +#endif + ZTIME(JL)=ZTIME(JL)+ZMAXTIME(JL) + ENDDO + !------------------------------------------------------------------------------- + ! + !*** 4.8 Mixing ratio change due to each process + ! + IF(BUCONF%LBU_ENABLE) THEN + !Mixing ratio change due to a tendency + DO JV=1, IBUNUM-IBUNUM_MR-IBUNUM_EXTRA + DO JL=1, KMICRO + PBU_SUM(JL, JV) = PBU_SUM(JL, JV) + ZBU_INST(JL, JV)*ZMAXTIME(JL) + ENDDO + ENDDO + + !Mixing ratio change due to a mixing ratio change + DO JV=IBUNUM-IBUNUM_MR-IBUNUM_EXTRA+1, IBUNUM-IBUNUM_EXTRA + DO JL=1, KMICRO + PBU_SUM(JL, JV) = PBU_SUM(JL, JV) + ZBU_INST(JL, JV) + ENDDO + ENDDO + + !Extra contribution as a mixing ratio change + DO JV=IBUNUM-IBUNUM_EXTRA+1, IBUNUM + JJV=IBUEXTRAIND(JV) + DO JL=1, KMICRO + PBU_SUM(JL, JJV) = PBU_SUM(JL, JJV) + ZBU_INST(JL, JV) + ENDDO + ENDDO + ENDIF + !------------------------------------------------------------------------------- + ! + !*** 4.9 Next loop + ! + LSOFT=.TRUE. ! We try to adjust tendencies (inner while loop) + ENDDO !Iterations on tendency computations (WHILE ANY(LLCOMPUTE)) +ENDDO !Temporal loop + +IF(LDEXT_TEND) THEN + !Z..T variables contain the external tendency, we substract it + DO JV=0, KRR + DO JL=1, KMICRO + IF(LDMICRO(JL)) THEN + PVART(JL, JV) = PVART(JL, JV) - PEXTPK(JL, JV) * PTSTEP + ENDIF + ENDDO + ENDDO +ENDIF +DO JL=1, KMICRO + PRREVAV(JL)=ZBU_INST(JL, IRREVAV) +ENDDO +! +IF (LHOOK) CALL DR_HOOK('ICE4_STEPPING', 1, ZHOOK_HANDLE) +END SUBROUTINE ICE4_STEPPING +END MODULE MODE_ICE4_STEPPING diff --git a/src/PHYEX/micro/mode_ice4_tendencies.f90 b/src/PHYEX/micro/mode_ice4_tendencies.f90 index d6eebfdf81ace36fcae6b31c221eedf33cadf132..b85db3a9861ddc67733f699a0042228b251f77a3 100644 --- a/src/PHYEX/micro/mode_ice4_tendencies.f90 +++ b/src/PHYEX/micro/mode_ice4_tendencies.f90 @@ -13,15 +13,7 @@ SUBROUTINE ICE4_TENDENCIES(D, CST, PARAMI, ICEP, ICED, BUCONF, KPROMA, KSIZE, & &PPRES, PCF, PSIGMA_RC, & &PCIT, & &PT, PVART, & - &PRVHENI_MR, PRRHONG_MR, PRIMLTC_MR, PRSRIMCG_MR, & - &PRCHONI, PRVDEPS, PRIAGGS, PRIAUTS, PRVDEPG, & - &PRCAUTR, PRCACCR, PRREVAV, & - &PRCRIMSS, PRCRIMSG, PRSRIMCG, PRRACCSS, PRRACCSG, PRSACCRG, PRSMLTG, PRCMLTSR, & - &PRICFRRG, PRRCFRIG, PRICFRR, PRCWETG, PRIWETG, PRRWETG, PRSWETG, & - &PRCDRYG, PRIDRYG, PRRDRYG, PRSDRYG, PRWETGH, PRWETGH_MR, PRGMLTR, & - &PRCWETH, PRIWETH, PRSWETH, PRGWETH, PRRWETH, & - &PRCDRYH, PRIDRYH, PRSDRYH, PRRDRYH, PRGDRYH, PRDRYHG, PRHMLTR, & - &PRCBERI, & + &PBU_INST, & &PRS_TEND, PRG_TEND, PRH_TEND, PSSI, & &PA, PB, & &PHLC_HCF, PHLC_LCF, PHLC_HRC, PHLC_LRC, & @@ -54,16 +46,7 @@ USE MODD_PARAM_ICE, ONLY: PARAM_ICE_t USE MODD_RAIN_ICE_DESCR, ONLY: RAIN_ICE_DESCR_t USE MODD_RAIN_ICE_PARAM, ONLY: RAIN_ICE_PARAM_t ! -USE MODD_FIELDS_ADDRESS, ONLY : & ! common fields adress - & ITH, & ! Potential temperature - & IRV, & ! Water vapor - & IRC, & ! Cloud water - & IRR, & ! Rain water - & IRI, & ! Pristine ice - & IRS, & ! Snow/aggregate - & IRG, & ! Graupel - & IRH ! Hail -! +USE MODD_FIELDS_ADDRESS USE MODE_ICE4_RRHONG, ONLY: ICE4_RRHONG USE MODE_ICE4_RIMLTC, ONLY: ICE4_RIMLTC USE MODE_ICE4_RSRIMCG_OLD, ONLY: ICE4_RSRIMCG_OLD @@ -108,57 +91,11 @@ REAL, DIMENSION(KPROMA), INTENT(IN) :: PSIGMA_RC REAL, DIMENSION(KPROMA), INTENT(INOUT) :: PCIT REAL, DIMENSION(KPROMA), INTENT(IN) :: PT REAL, DIMENSION(KPROMA,0:KRR), INTENT(IN) :: PVART -REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRVHENI_MR -REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRRHONG_MR -REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRIMLTC_MR -REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRSRIMCG_MR -REAL, DIMENSION(KPROMA), INTENT(INOUT) :: PRCHONI -REAL, DIMENSION(KPROMA), INTENT(INOUT) :: PRVDEPS -REAL, DIMENSION(KPROMA), INTENT(INOUT) :: PRIAGGS -REAL, DIMENSION(KPROMA), INTENT(INOUT) :: PRIAUTS -REAL, DIMENSION(KPROMA), INTENT(INOUT) :: PRVDEPG -REAL, DIMENSION(KPROMA), INTENT(INOUT) :: PRCAUTR -REAL, DIMENSION(KPROMA), INTENT(INOUT) :: PRCACCR -REAL, DIMENSION(KPROMA), INTENT(INOUT) :: PRREVAV -REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRCRIMSS -REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRCRIMSG -REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRSRIMCG -REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRRACCSS -REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRRACCSG -REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRSACCRG -REAL, DIMENSION(KPROMA), INTENT(INOUT) :: PRSMLTG -REAL, DIMENSION(KPROMA), INTENT(INOUT) :: PRCMLTSR -REAL, DIMENSION(KPROMA), INTENT(INOUT) :: PRICFRRG -REAL, DIMENSION(KPROMA), INTENT(INOUT) :: PRRCFRIG -REAL, DIMENSION(KPROMA), INTENT(INOUT) :: PRICFRR -REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRCWETG -REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRIWETG -REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRRWETG -REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRSWETG -REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRCDRYG -REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRIDRYG -REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRRDRYG -REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRSDRYG -REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRWETGH -REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRWETGH_MR -REAL, DIMENSION(KPROMA), INTENT(INOUT) :: PRGMLTR -REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRCWETH -REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRIWETH -REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRSWETH -REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRGWETH -REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRRWETH -REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRCDRYH -REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRIDRYH -REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRSDRYH -REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRRDRYH -REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRGDRYH -REAL, DIMENSION(KPROMA), INTENT(OUT) :: PRDRYHG -REAL, DIMENSION(KPROMA), INTENT(INOUT) :: PRHMLTR -REAL, DIMENSION(KPROMA), INTENT(INOUT) :: PRCBERI +REAL, DIMENSION(KPROMA, IBUNUM),INTENT(INOUT):: PBU_INST REAL, DIMENSION(KPROMA, 8), INTENT(INOUT) :: PRS_TEND REAL, DIMENSION(KPROMA, 8), INTENT(INOUT) :: PRG_TEND REAL, DIMENSION(KPROMA, 10), INTENT(INOUT) :: PRH_TEND -REAL, DIMENSION(KPROMA), INTENT(OUT) :: PSSI +REAL, DIMENSION(KPROMA), INTENT(INOUT) :: PSSI REAL, DIMENSION(KPROMA,0:7), INTENT(OUT) :: PA REAL, DIMENSION(KPROMA,0:7), INTENT(OUT) :: PB REAL, DIMENSION(KPROMA), INTENT(INOUT) :: PHLC_HCF @@ -198,10 +135,10 @@ DO JV=0,KRR ENDDO ! IF(ODSOFT) THEN - PRVHENI_MR(:)=0. - PRRHONG_MR(:)=0. - PRIMLTC_MR(:)=0. - PRSRIMCG_MR(:)=0. + PBU_INST(:, IRVHENI_MR)=0. + PBU_INST(:, IRRHONG_MR)=0. + PBU_INST(:, IRIMLTC_MR)=0. + PBU_INST(:, IRSRIMCG_MR)=0. ELSE ! !* 2. COMPUTES THE SLOW COLD PROCESS SOURCES @@ -209,12 +146,12 @@ ELSE CALL ICE4_NUCLEATION(CST, PARAMI, ICEP, ICED, KSIZE, LDCOMPUTE(:), & ZVART(:,ITH), PPRES(:), PRHODREF(:), PEXN(:), PLSFACT(:), ZT(:), & ZVART(:,IRV), & - PCIT(:), PRVHENI_MR(:)) + PCIT(:), PBU_INST(:, IRVHENI_MR)) DO JL=1, KSIZE - ZVART(JL,ITH)=ZVART(JL,ITH) + PRVHENI_MR(JL)*PLSFACT(JL) + ZVART(JL,ITH)=ZVART(JL,ITH) + PBU_INST(JL, IRVHENI_MR)*PLSFACT(JL) ZT(JL) = ZVART(JL,ITH) * PEXN(JL) - ZVART(JL,IRV)=ZVART(JL,IRV) - PRVHENI_MR(JL) - ZVART(JL,IRI)=ZVART(JL,IRI) + PRVHENI_MR(JL) + ZVART(JL,IRV)=ZVART(JL,IRV) - PBU_INST(JL, IRVHENI_MR) + ZVART(JL,IRI)=ZVART(JL,IRI) + PBU_INST(JL, IRVHENI_MR) ENDDO ! !* 3.3 compute the spontaneous freezing source: RRHONG @@ -223,12 +160,12 @@ ELSE &PEXN, PLVFACT, PLSFACT, & &ZT, ZVART(:,IRR), & &ZVART(:,ITH), & - &PRRHONG_MR) + &PBU_INST(:, IRRHONG_MR)) DO JL=1, KSIZE - ZVART(JL,ITH) = ZVART(JL,ITH) + PRRHONG_MR(JL)*(PLSFACT(JL)-PLVFACT(JL)) ! f(L_f*(RRHONG)) + ZVART(JL,ITH) = ZVART(JL,ITH) + PBU_INST(JL, IRRHONG_MR)*(PLSFACT(JL)-PLVFACT(JL)) ! f(L_f*(RRHONG)) ZT(JL) = ZVART(JL,ITH) * PEXN(JL) - ZVART(JL,IRR) = ZVART(JL,IRR) - PRRHONG_MR(JL) - ZVART(JL,IRG) = ZVART(JL,IRG) + PRRHONG_MR(JL) + ZVART(JL,IRR) = ZVART(JL,IRR) - PBU_INST(JL, IRRHONG_MR) + ZVART(JL,IRG) = ZVART(JL,IRG) + PBU_INST(JL, IRRHONG_MR) ENDDO ! !* 7.1 cloud ice melting @@ -237,12 +174,12 @@ ELSE &PEXN, PLVFACT, PLSFACT, & &ZT, & &ZVART(:,ITH), ZVART(:,IRI), & - &PRIMLTC_MR) + &PBU_INST(:, IRIMLTC_MR)) DO JL=1, KSIZE - ZVART(JL,ITH) = ZVART(JL,ITH) - PRIMLTC_MR(JL)*(PLSFACT(JL)-PLVFACT(JL)) ! f(L_f*(-RIMLTC)) + ZVART(JL,ITH) = ZVART(JL,ITH) - PBU_INST(JL, IRIMLTC_MR)*(PLSFACT(JL)-PLVFACT(JL)) ! f(L_f*(-RIMLTC)) ZT(JL) = ZVART(JL,ITH) * PEXN(JL) - ZVART(JL,IRC) = ZVART(JL,IRC) + PRIMLTC_MR(JL) - ZVART(JL,IRI) = ZVART(JL,IRI) - PRIMLTC_MR(JL) + ZVART(JL,IRC) = ZVART(JL,IRC) + PBU_INST(JL, IRIMLTC_MR) + ZVART(JL,IRI) = ZVART(JL,IRI) - PBU_INST(JL, IRIMLTC_MR) ENDDO ! ! 5.1.6 riming-conversion of the large sized aggregates into graupel (old parametrisation) @@ -255,37 +192,37 @@ ELSE ZLBDAS(1:KSIZE)=0. END WHERE !$mnh_end_expand_where(JL=1:KSIZE) - CALL ICE4_RSRIMCG_OLD(CST, ICEP, ICED, KPROMA, KSIZE, ODSOFT, LDCOMPUTE, & + CALL ICE4_RSRIMCG_OLD(CST, PARAMI, ICEP, ICED, KPROMA, KSIZE, ODSOFT, LDCOMPUTE, & &PRHODREF, & &ZLBDAS, & &ZT, ZVART(:,IRC), ZVART(:,IRS), & - &PRSRIMCG_MR) + &PBU_INST(:, IRSRIMCG_MR)) DO JL=1, KSIZE - ZVART(JL,IRS) = ZVART(JL,IRS) - PRSRIMCG_MR(JL) - ZVART(JL,IRG) = ZVART(JL,IRG) + PRSRIMCG_MR(JL) + ZVART(JL,IRS) = ZVART(JL,IRS) - PBU_INST(JL, IRSRIMCG_MR) + ZVART(JL,IRG) = ZVART(JL,IRG) + PBU_INST(JL, IRSRIMCG_MR) ENDDO ELSE - PRSRIMCG_MR(:) = 0. + PBU_INST(:, IRSRIMCG_MR) = 0. ENDIF DO JL=1, KSIZE - PB(JL, ITH)=PB(JL, ITH) + PRVHENI_MR(JL)*PLSFACT(JL) - PB(JL, ITH)=PB(JL, ITH) + PRRHONG_MR(JL)*(PLSFACT(JL)-PLVFACT(JL)) - PB(JL, ITH)=PB(JL, ITH) - PRIMLTC_MR(JL)*(PLSFACT(JL)-PLVFACT(JL)) + PB(JL, ITH)=PB(JL, ITH) + PBU_INST(JL, IRVHENI_MR)*PLSFACT(JL) + PB(JL, ITH)=PB(JL, ITH) + PBU_INST(JL, IRRHONG_MR)*(PLSFACT(JL)-PLVFACT(JL)) + PB(JL, ITH)=PB(JL, ITH) - PBU_INST(JL, IRIMLTC_MR)*(PLSFACT(JL)-PLVFACT(JL)) - PB(JL, IRV)=PB(JL, IRV) - PRVHENI_MR(JL) + PB(JL, IRV)=PB(JL, IRV) - PBU_INST(JL, IRVHENI_MR) - PB(JL, IRC)=PB(JL, IRC) + PRIMLTC_MR(JL) + PB(JL, IRC)=PB(JL, IRC) + PBU_INST(JL, IRIMLTC_MR) - PB(JL, IRR)=PB(JL, IRR) - PRRHONG_MR(JL) + PB(JL, IRR)=PB(JL, IRR) - PBU_INST(JL, IRRHONG_MR) - PB(JL, IRI)=PB(JL, IRI) + PRVHENI_MR(JL) - PB(JL, IRI)=PB(JL, IRI) - PRIMLTC_MR(JL) + PB(JL, IRI)=PB(JL, IRI) + PBU_INST(JL, IRVHENI_MR) + PB(JL, IRI)=PB(JL, IRI) - PBU_INST(JL, IRIMLTC_MR) - PB(JL, IRS)=PB(JL, IRS) - PRSRIMCG_MR(JL) + PB(JL, IRS)=PB(JL, IRS) - PBU_INST(JL, IRSRIMCG_MR) - PB(JL, IRG)=PB(JL, IRG) + PRRHONG_MR(JL) - PB(JL, IRG)=PB(JL, IRG) + PRSRIMCG_MR(JL) + PB(JL, IRG)=PB(JL, IRG) + PBU_INST(JL, IRRHONG_MR) + PB(JL, IRG)=PB(JL, IRG) + PBU_INST(JL, IRSRIMCG_MR) ENDDO ! !* Derived fields @@ -385,7 +322,7 @@ CALL ICE4_SLOW(CST, ICEP, ICED, KPROMA, KSIZE, ODSOFT, LDCOMPUTE, PRHODREF, ZT, &ZVART(:,IRV), ZVART(:,IRC), ZVART(:,IRI), ZVART(:,IRS), ZVART(:,IRG), & &ZLBDAS, ZLBDAG, & &ZAI, ZCJ, PHLI_HCF, PHLI_HRI, & - &PRCHONI, PRVDEPS, PRIAGGS, PRIAUTS, PRVDEPG) + &PBU_INST(:, IRCHONI), PBU_INST(:, IRVDEPS), PBU_INST(:, IRIAGGS), PBU_INST(:, IRIAUTS), PBU_INST(:, IRVDEPG)) ! !------------------------------------------------------------------------------- ! @@ -403,11 +340,11 @@ IF(PARAMI%LWARM) THEN ! Check if the formation of the raindrops by the slow &PHLC_LCF, PHLC_HCF, PHLC_LRC, PHLC_HRC, & &PCF, ZRAINFR, & &ZVART(:,IRV), ZVART(:,IRC), ZVART(:,IRR), & - &PRCAUTR, PRCACCR, PRREVAV) + &PBU_INST(:, IRCAUTR), PBU_INST(:, IRCACCR), PBU_INST(:, IRREVAV)) ELSE - PRCAUTR(:)=0. - PRCACCR(:)=0. - PRREVAV(:)=0. + PBU_INST(:, IRCAUTR)=0. + PBU_INST(:, IRCACCR)=0. + PBU_INST(:, IRREVAV)=0. END IF ! !------------------------------------------------------------------------------- @@ -421,10 +358,10 @@ CALL ICE4_FAST_RS(CST, PARAMI, ICEP, ICED, KPROMA, KSIZE, ODSOFT, LDCOMPUTE, & &ZDV, ZKA, ZCJ, & &ZLBDAR, ZLBDAS, & &ZT, ZVART(:,IRV), ZVART(:,IRC), ZVART(:,IRR), ZVART(:,IRS), & - &PRIAGGS, & - &PRCRIMSS, PRCRIMSG, PRSRIMCG, & - &PRRACCSS, PRRACCSG, PRSACCRG, PRSMLTG, & - &PRCMLTSR, & + &PBU_INST(:, IRIAGGS), & + &PBU_INST(:, IRCRIMSS), PBU_INST(:, IRCRIMSG), PBU_INST(:, IRSRIMCG), & + &PBU_INST(:, IRRACCSS), PBU_INST(:, IRRACCSG), PBU_INST(:, IRSACCRG), PBU_INST(:, IRSMLTG), & + &PBU_INST(:, IRCMLTSR), & &PRS_TEND) ! !------------------------------------------------------------------------------- @@ -434,9 +371,9 @@ CALL ICE4_FAST_RS(CST, PARAMI, ICEP, ICED, KPROMA, KSIZE, ODSOFT, LDCOMPUTE, & ! ------------------------------------------------------ ! DO JL=1, KSIZE - ZRGSI(JL) = PRVDEPG(JL) + PRSMLTG(JL) + PRRACCSG(JL) + & - & PRSACCRG(JL) + PRCRIMSG(JL) + PRSRIMCG(JL) - ZRGSI_MR(JL) = PRRHONG_MR(JL) + PRSRIMCG_MR(JL) + ZRGSI(JL) = PBU_INST(JL, IRVDEPG) + PBU_INST(JL, IRSMLTG) + PBU_INST(JL, IRRACCSG) + & + & PBU_INST(JL, IRSACCRG) + PBU_INST(JL, IRCRIMSG) + PBU_INST(JL, IRSRIMCG) + ZRGSI_MR(JL) = PBU_INST(JL, IRRHONG_MR) + PBU_INST(JL, IRSRIMCG_MR) ENDDO CALL ICE4_FAST_RG(CST, PARAMI, ICEP, ICED, KPROMA, KSIZE, ODSOFT, LDCOMPUTE, KRR, & &PRHODREF, PLVFACT, PLSFACT, PPRES, & @@ -445,8 +382,10 @@ CALL ICE4_FAST_RG(CST, PARAMI, ICEP, ICED, KPROMA, KSIZE, ODSOFT, LDCOMPUTE, KRR &ZT, ZVART(:,IRV), ZVART(:,IRC), ZVART(:,IRR), ZVART(:,IRI), ZVART(:,IRS), ZVART(:,IRG), & &ZRGSI, ZRGSI_MR(:), & &LLWETG, & - &PRICFRRG, PRRCFRIG, PRICFRR, PRCWETG, PRIWETG, PRRWETG, PRSWETG, & - &PRCDRYG, PRIDRYG, PRRDRYG, PRSDRYG, PRWETGH, PRWETGH_MR, PRGMLTR, & + &PBU_INST(:, IRICFRRG), PBU_INST(:, IRRCFRIG), PBU_INST(:, IRICFRR), PBU_INST(:, IRCWETG), & + &PBU_INST(:, IRIWETG), PBU_INST(:, IRRWETG), PBU_INST(:, IRSWETG), & + &PBU_INST(:, IRCDRYG), PBU_INST(:, IRIDRYG), PBU_INST(:, IRRDRYG), PBU_INST(:, IRSDRYG), & + &PBU_INST(:, IRWETGH), PBU_INST(:, IRWETGH_MR), PBU_INST(:, IRGMLTR), & &PRG_TEND) ! !------------------------------------------------------------------------------- @@ -461,22 +400,23 @@ IF (KRR==7) THEN &ZDV, ZKA, ZCJ, & &ZLBDAS, ZLBDAG, ZLBDAR, ZLBDAH, & &ZT, ZVART(:,IRV), ZVART(:,IRC), ZVART(:,IRR), ZVART(:,IRI), ZVART(:,IRS), ZVART(:,IRG), ZVART(:,IRH), & - &PRCWETH, PRIWETH, PRSWETH, PRGWETH, PRRWETH, & - &PRCDRYH, PRIDRYH, PRSDRYH, PRRDRYH, PRGDRYH, PRDRYHG, PRHMLTR, & + &PBU_INST(:, IRCWETH), PBU_INST(:, IRIWETH), PBU_INST(:, IRSWETH), PBU_INST(:, IRGWETH), PBU_INST(:, IRRWETH), & + &PBU_INST(:, IRCDRYH), PBU_INST(:, IRIDRYH), PBU_INST(:, IRSDRYH), PBU_INST(:, IRRDRYH), & + &PBU_INST(:, IRGDRYH), PBU_INST(:, IRDRYHG), PBU_INST(:, IRHMLTR), & &PRH_TEND) ELSEIF (BUCONF%LBU_ENABLE) THEN - PRCWETH(:)=0. - PRIWETH(:)=0. - PRSWETH(:)=0. - PRGWETH(:)=0. - PRRWETH(:)=0. - PRCDRYH(:)=0. - PRIDRYH(:)=0. - PRSDRYH(:)=0. - PRRDRYH(:)=0. - PRGDRYH(:)=0. - PRDRYHG(:)=0. - PRHMLTR(:)=0. + PBU_INST(:, IRCWETH)=0. + PBU_INST(:, IRIWETH)=0. + PBU_INST(:, IRSWETH)=0. + PBU_INST(:, IRGWETH)=0. + PBU_INST(:, IRRWETH)=0. + PBU_INST(:, IRCDRYH)=0. + PBU_INST(:, IRIDRYH)=0. + PBU_INST(:, IRSDRYH)=0. + PBU_INST(:, IRRDRYH)=0. + PBU_INST(:, IRGDRYH)=0. + PBU_INST(:, IRDRYHG)=0. + PBU_INST(:, IRHMLTR)=0. END IF ! !------------------------------------------------------------------------------- @@ -490,7 +430,7 @@ CALL ICE4_FAST_RI(ICEP, ICED, KPROMA, KSIZE, ODSOFT, LDCOMPUTE, & &ZAI, ZCJ, PCIT, & &PSSI, & &ZVART(:,IRC), ZVART(:,IRI), & - &PRCBERI) + &PBU_INST(:, IRCBERI)) ! !------------------------------------------------------------------------------- ! @@ -499,108 +439,109 @@ CALL ICE4_FAST_RI(ICEP, ICED, KPROMA, KSIZE, ODSOFT, LDCOMPUTE, & ! ------------------------- ! DO JL=1, KSIZE - PA(JL, ITH) = PA(JL, ITH) + PRVDEPG(JL)*PLSFACT(JL) - PA(JL, ITH) = PA(JL, ITH) + PRCHONI(JL)*(PLSFACT(JL)-PLVFACT(JL)) - PA(JL, ITH) = PA(JL, ITH) + PRVDEPS(JL)*PLSFACT(JL) - PA(JL, ITH) = PA(JL, ITH) - PRREVAV(JL)*PLVFACT(JL) - PA(JL, ITH) = PA(JL, ITH) + PRCRIMSS(JL)*(PLSFACT(JL)-PLVFACT(JL)) - PA(JL, ITH) = PA(JL, ITH) + PRCRIMSG(JL)*(PLSFACT(JL)-PLVFACT(JL)) - PA(JL, ITH) = PA(JL, ITH) + PRRACCSS(JL)*(PLSFACT(JL)-PLVFACT(JL)) - PA(JL, ITH) = PA(JL, ITH) + PRRACCSG(JL)*(PLSFACT(JL)-PLVFACT(JL)) - PA(JL, ITH) = PA(JL, ITH) + (PRRCFRIG(JL) - PRICFRR(JL))*(PLSFACT(JL)-PLVFACT(JL)) - PA(JL, ITH) = PA(JL, ITH) + (PRCWETG(JL) + PRRWETG(JL))*(PLSFACT(JL)-PLVFACT(JL)) - PA(JL, ITH) = PA(JL, ITH) + (PRCDRYG(JL)+PRRDRYG(JL))*(PLSFACT(JL)-PLVFACT(JL)) - PA(JL, ITH) = PA(JL, ITH) - PRGMLTR(JL)*(PLSFACT(JL)-PLVFACT(JL)) + PA(JL, ITH) = PA(JL, ITH) + PBU_INST(JL, IRVDEPG)*PLSFACT(JL) + PA(JL, ITH) = PA(JL, ITH) + PBU_INST(JL, IRCHONI)*(PLSFACT(JL)-PLVFACT(JL)) + PA(JL, ITH) = PA(JL, ITH) + PBU_INST(JL, IRVDEPS)*PLSFACT(JL) + PA(JL, ITH) = PA(JL, ITH) - PBU_INST(JL, IRREVAV)*PLVFACT(JL) + PA(JL, ITH) = PA(JL, ITH) + PBU_INST(JL, IRCRIMSS)*(PLSFACT(JL)-PLVFACT(JL)) + PA(JL, ITH) = PA(JL, ITH) + PBU_INST(JL, IRCRIMSG)*(PLSFACT(JL)-PLVFACT(JL)) + PA(JL, ITH) = PA(JL, ITH) + PBU_INST(JL, IRRACCSS)*(PLSFACT(JL)-PLVFACT(JL)) + PA(JL, ITH) = PA(JL, ITH) + PBU_INST(JL, IRRACCSG)*(PLSFACT(JL)-PLVFACT(JL)) + PA(JL, ITH) = PA(JL, ITH) + (PBU_INST(JL, IRRCFRIG) - PBU_INST(JL, IRICFRR))*(PLSFACT(JL)-PLVFACT(JL)) + PA(JL, ITH) = PA(JL, ITH) + (PBU_INST(JL, IRCWETG) + PBU_INST(JL, IRRWETG))*(PLSFACT(JL)-PLVFACT(JL)) + PA(JL, ITH) = PA(JL, ITH) + (PBU_INST(JL, IRCDRYG)+PBU_INST(JL, IRRDRYG))*(PLSFACT(JL)-PLVFACT(JL)) + PA(JL, ITH) = PA(JL, ITH) - PBU_INST(JL, IRGMLTR)*(PLSFACT(JL)-PLVFACT(JL)) IF (KRR==7) THEN - PA(JL, ITH) = PA(JL, ITH) + (PRRWETH(JL)+PRCWETH(JL))*(PLSFACT(JL)-PLVFACT(JL)) - PA(JL, ITH) = PA(JL, ITH) + (PRCDRYH(JL)+PRRDRYH(JL))*(PLSFACT(JL)-PLVFACT(JL)) - PA(JL, ITH) = PA(JL, ITH) - PRHMLTR(JL)*(PLSFACT(JL)-PLVFACT(JL)) + PA(JL, ITH) = PA(JL, ITH) + (PBU_INST(JL, IRRWETH)+PBU_INST(JL, IRCWETH))*(PLSFACT(JL)-PLVFACT(JL)) + PA(JL, ITH) = PA(JL, ITH) + (PBU_INST(JL, IRCDRYH)+PBU_INST(JL, IRRDRYH))*(PLSFACT(JL)-PLVFACT(JL)) + PA(JL, ITH) = PA(JL, ITH) - PBU_INST(JL, IRHMLTR)*(PLSFACT(JL)-PLVFACT(JL)) ENDIF - PA(JL, ITH) = PA(JL, ITH) + PRCBERI(JL)*(PLSFACT(JL)-PLVFACT(JL)) + PA(JL, ITH) = PA(JL, ITH) + PBU_INST(JL, IRCBERI)*(PLSFACT(JL)-PLVFACT(JL)) - PA(JL, IRV) = PA(JL, IRV) - PRVDEPG(JL) - PA(JL, IRV) = PA(JL, IRV) - PRVDEPS(JL) - PA(JL, IRV) = PA(JL, IRV) + PRREVAV(JL) + PA(JL, IRV) = PA(JL, IRV) - PBU_INST(JL, IRVDEPG) + PA(JL, IRV) = PA(JL, IRV) - PBU_INST(JL, IRVDEPS) + PA(JL, IRV) = PA(JL, IRV) + PBU_INST(JL, IRREVAV) - PA(JL, IRC) = PA(JL, IRC) - PRCHONI(JL) - PA(JL, IRC) = PA(JL, IRC) - PRCAUTR(JL) - PA(JL, IRC) = PA(JL, IRC) - PRCACCR(JL) - PA(JL, IRC) = PA(JL, IRC) - PRCRIMSS(JL) - PA(JL, IRC) = PA(JL, IRC) - PRCRIMSG(JL) - PA(JL, IRC) = PA(JL, IRC) - PRCMLTSR(JL) - PA(JL, IRC) = PA(JL, IRC) - PRCWETG(JL) - PA(JL, IRC) = PA(JL, IRC) - PRCDRYG(JL) + PA(JL, IRC) = PA(JL, IRC) - PBU_INST(JL, IRCHONI) + PA(JL, IRC) = PA(JL, IRC) - PBU_INST(JL, IRCAUTR) + PA(JL, IRC) = PA(JL, IRC) - PBU_INST(JL, IRCACCR) + PA(JL, IRC) = PA(JL, IRC) - PBU_INST(JL, IRCRIMSS) + PA(JL, IRC) = PA(JL, IRC) - PBU_INST(JL, IRCRIMSG) + PA(JL, IRC) = PA(JL, IRC) - PBU_INST(JL, IRCMLTSR) + PA(JL, IRC) = PA(JL, IRC) - PBU_INST(JL, IRCWETG) + PA(JL, IRC) = PA(JL, IRC) - PBU_INST(JL, IRCDRYG) IF (KRR==7) THEN - PA(JL, IRC) = PA(JL, IRC) - PRCWETH(JL) - PA(JL, IRC) = PA(JL, IRC) - PRCDRYH(JL) + PA(JL, IRC) = PA(JL, IRC) - PBU_INST(JL, IRCWETH) + PA(JL, IRC) = PA(JL, IRC) - PBU_INST(JL, IRCDRYH) ENDIF - PA(JL, IRC) = PA(JL, IRC) - PRCBERI(JL) + PA(JL, IRC) = PA(JL, IRC) - PBU_INST(JL, IRCBERI) - PA(JL, IRR) = PA(JL, IRR) + PRCAUTR(JL) - PA(JL, IRR) = PA(JL, IRR) + PRCACCR(JL) - PA(JL, IRR) = PA(JL, IRR) - PRREVAV(JL) - PA(JL, IRR) = PA(JL, IRR) - PRRACCSS(JL) - PA(JL, IRR) = PA(JL, IRR) - PRRACCSG(JL) - PA(JL, IRR) = PA(JL, IRR) + PRCMLTSR(JL) - PA(JL, IRR) = PA(JL, IRR) - PRRCFRIG(JL) + PRICFRR(JL) - PA(JL, IRR) = PA(JL, IRR) - PRRWETG(JL) - PA(JL, IRR) = PA(JL, IRR) - PRRDRYG(JL) - PA(JL, IRR) = PA(JL, IRR) + PRGMLTR(JL) + PA(JL, IRR) = PA(JL, IRR) + PBU_INST(JL, IRCAUTR) + PA(JL, IRR) = PA(JL, IRR) + PBU_INST(JL, IRCACCR) + PA(JL, IRR) = PA(JL, IRR) - PBU_INST(JL, IRREVAV) + PA(JL, IRR) = PA(JL, IRR) - PBU_INST(JL, IRRACCSS) + PA(JL, IRR) = PA(JL, IRR) - PBU_INST(JL, IRRACCSG) + PA(JL, IRR) = PA(JL, IRR) + PBU_INST(JL, IRCMLTSR) + PA(JL, IRR) = PA(JL, IRR) - PBU_INST(JL, IRRCFRIG) + PBU_INST(JL, IRICFRR) + PA(JL, IRR) = PA(JL, IRR) - PBU_INST(JL, IRRWETG) + PA(JL, IRR) = PA(JL, IRR) - PBU_INST(JL, IRRDRYG) + PA(JL, IRR) = PA(JL, IRR) + PBU_INST(JL, IRGMLTR) IF(KRR==7) THEN - PA(JL, IRR) = PA(JL, IRR) - PRRWETH(JL) - PA(JL, IRR) = PA(JL, IRR) - PRRDRYH(JL) - PA(JL, IRR) = PA(JL, IRR) + PRHMLTR(JL) + PA(JL, IRR) = PA(JL, IRR) - PBU_INST(JL, IRRWETH) + PA(JL, IRR) = PA(JL, IRR) - PBU_INST(JL, IRRDRYH) + PA(JL, IRR) = PA(JL, IRR) + PBU_INST(JL, IRHMLTR) ENDIF - PA(JL, IRI) = PA(JL, IRI) + PRCHONI(JL) - PA(JL, IRI) = PA(JL, IRI) - PRIAGGS(JL) - PA(JL, IRI) = PA(JL, IRI) - PRIAUTS(JL) - PA(JL, IRI) = PA(JL, IRI) - PRICFRRG(JL) - PRICFRR(JL) - PA(JL, IRI) = PA(JL, IRI) - PRIWETG(JL) - PA(JL, IRI) = PA(JL, IRI) - PRIDRYG(JL) + PA(JL, IRI) = PA(JL, IRI) + PBU_INST(JL, IRCHONI) + PA(JL, IRI) = PA(JL, IRI) - PBU_INST(JL, IRIAGGS) + PA(JL, IRI) = PA(JL, IRI) - PBU_INST(JL, IRIAUTS) + PA(JL, IRI) = PA(JL, IRI) - PBU_INST(JL, IRICFRRG) - PBU_INST(JL, IRICFRR) + PA(JL, IRI) = PA(JL, IRI) - PBU_INST(JL, IRIWETG) + PA(JL, IRI) = PA(JL, IRI) - PBU_INST(JL, IRIDRYG) IF (KRR==7) THEN - PA(JL, IRI) = PA(JL, IRI) - PRIWETH(JL) - PA(JL, IRI) = PA(JL, IRI) - PRIDRYH(JL) + PA(JL, IRI) = PA(JL, IRI) - PBU_INST(JL, IRIWETH) + PA(JL, IRI) = PA(JL, IRI) - PBU_INST(JL, IRIDRYH) ENDIF - PA(JL, IRI) = PA(JL, IRI) + PRCBERI(JL) + PA(JL, IRI) = PA(JL, IRI) + PBU_INST(JL, IRCBERI) - PA(JL, IRS) = PA(JL, IRS) + PRVDEPS(JL) - PA(JL, IRS) = PA(JL, IRS) + PRIAGGS(JL) - PA(JL, IRS) = PA(JL, IRS) + PRIAUTS(JL) - PA(JL, IRS) = PA(JL, IRS) + PRCRIMSS(JL) - PA(JL, IRS) = PA(JL, IRS) - PRSRIMCG(JL) - PA(JL, IRS) = PA(JL, IRS) + PRRACCSS(JL) - PA(JL, IRS) = PA(JL, IRS) - PRSACCRG(JL) - PA(JL, IRS) = PA(JL, IRS) - PRSMLTG(JL) - PA(JL, IRS) = PA(JL, IRS) - PRSWETG(JL) - PA(JL, IRS) = PA(JL, IRS) - PRSDRYG(JL) + PA(JL, IRS) = PA(JL, IRS) + PBU_INST(JL, IRVDEPS) + PA(JL, IRS) = PA(JL, IRS) + PBU_INST(JL, IRIAGGS) + PA(JL, IRS) = PA(JL, IRS) + PBU_INST(JL, IRIAUTS) + PA(JL, IRS) = PA(JL, IRS) + PBU_INST(JL, IRCRIMSS) + PA(JL, IRS) = PA(JL, IRS) - PBU_INST(JL, IRSRIMCG) + PA(JL, IRS) = PA(JL, IRS) + PBU_INST(JL, IRRACCSS) + PA(JL, IRS) = PA(JL, IRS) - PBU_INST(JL, IRSACCRG) + PA(JL, IRS) = PA(JL, IRS) - PBU_INST(JL, IRSMLTG) + PA(JL, IRS) = PA(JL, IRS) - PBU_INST(JL, IRSWETG) + PA(JL, IRS) = PA(JL, IRS) - PBU_INST(JL, IRSDRYG) IF (KRR==7) THEN - PA(JL, IRS) = PA(JL, IRS) - PRSWETH(JL) - PA(JL, IRS) = PA(JL, IRS) - PRSDRYH(JL) + PA(JL, IRS) = PA(JL, IRS) - PBU_INST(JL, IRSWETH) + PA(JL, IRS) = PA(JL, IRS) - PBU_INST(JL, IRSDRYH) ENDIF - PA(JL, IRG) = PA(JL, IRG) + PRVDEPG(JL) - PA(JL, IRG) = PA(JL, IRG) + PRCRIMSG(JL)+PRSRIMCG(JL) - PA(JL, IRG) = PA(JL, IRG) + PRRACCSG(JL)+PRSACCRG(JL) - PA(JL, IRG) = PA(JL, IRG) + PRSMLTG(JL) - PA(JL, IRG) = PA(JL, IRG) + PRICFRRG(JL) + PRRCFRIG(JL) - PA(JL, IRG) = PA(JL, IRG) + PRCWETG(JL) + PRIWETG(JL) + PRSWETG(JL) + PRRWETG(JL) - PA(JL, IRG) = PA(JL, IRG) - PRWETGH(JL) - PB(JL, IRG) = PB(JL, IRG) - PRWETGH_MR(JL) - PA(JL, IRG) = PA(JL, IRG) + PRCDRYG(JL) + PRIDRYG(JL) + PRSDRYG(JL) + PRRDRYG(JL) - PA(JL, IRG) = PA(JL, IRG) - PRGMLTR(JL) + PA(JL, IRG) = PA(JL, IRG) + PBU_INST(JL, IRVDEPG) + PA(JL, IRG) = PA(JL, IRG) + PBU_INST(JL, IRCRIMSG)+PBU_INST(JL, IRSRIMCG) + PA(JL, IRG) = PA(JL, IRG) + PBU_INST(JL, IRRACCSG)+PBU_INST(JL, IRSACCRG) + PA(JL, IRG) = PA(JL, IRG) + PBU_INST(JL, IRSMLTG) + PA(JL, IRG) = PA(JL, IRG) + PBU_INST(JL, IRICFRRG) + PBU_INST(JL, IRRCFRIG) + PA(JL, IRG) = PA(JL, IRG) + PBU_INST(JL, IRCWETG) + PBU_INST(JL, IRIWETG) + PBU_INST(JL, IRSWETG) + PBU_INST(JL, IRRWETG) + PA(JL, IRG) = PA(JL, IRG) - PBU_INST(JL, IRWETGH) + PB(JL, IRG) = PB(JL, IRG) - PBU_INST(JL, IRWETGH_MR) + PA(JL, IRG) = PA(JL, IRG) + PBU_INST(JL, IRCDRYG) + PBU_INST(JL, IRIDRYG) + PBU_INST(JL, IRSDRYG) + PBU_INST(JL, IRRDRYG) + PA(JL, IRG) = PA(JL, IRG) - PBU_INST(JL, IRGMLTR) IF (KRR==7) THEN - PA(JL, IRG) = PA(JL, IRG) - PRGWETH(JL) - PA(JL, IRG) = PA(JL, IRG) - PRGDRYH(JL) + PRDRYHG(JL) + PA(JL, IRG) = PA(JL, IRG) - PBU_INST(JL, IRGWETH) + PA(JL, IRG) = PA(JL, IRG) - PBU_INST(JL, IRGDRYH) + PBU_INST(JL, IRDRYHG) ENDIF IF (KRR==7) THEN - PA(JL, IRH) = PA(JL, IRH) + PRWETGH(JL) - PB(JL, IRH) = PB(JL, IRH) + PRWETGH_MR(JL) - PA(JL, IRH) = PA(JL, IRH) + PRCWETH(JL)+PRIWETH(JL)+PRSWETH(JL)+PRGWETH(JL)+PRRWETH(JL) - PA(JL, IRH) = PA(JL, IRH) + PRCDRYH(JL)+PRIDRYH(JL)+PRSDRYH(JL)+& - &PRRDRYH(JL)+PRGDRYH(JL) - PRDRYHG(JL) - PA(JL, IRH) = PA(JL, IRH) - PRHMLTR(JL) + PA(JL, IRH) = PA(JL, IRH) + PBU_INST(JL, IRWETGH) + PB(JL, IRH) = PB(JL, IRH) + PBU_INST(JL, IRWETGH_MR) + PA(JL, IRH) = PA(JL, IRH) + PBU_INST(JL, IRCWETH)+PBU_INST(JL, IRIWETH)+PBU_INST(JL, IRSWETH)+& + & PBU_INST(JL, IRGWETH)+PBU_INST(JL, IRRWETH) + PA(JL, IRH) = PA(JL, IRH) + PBU_INST(JL, IRCDRYH)+PBU_INST(JL, IRIDRYH)+PBU_INST(JL, IRSDRYH)+& + & PBU_INST(JL, IRRDRYH)+PBU_INST(JL, IRGDRYH) - PBU_INST(JL, IRDRYHG) + PA(JL, IRH) = PA(JL, IRH) - PBU_INST(JL, IRHMLTR) ENDIF ENDDO ! diff --git a/src/PHYEX/micro/modi_rain_ice.f90 b/src/PHYEX/micro/modi_rain_ice.f90 index 44988b26ccd07cc685a414d4c073471c676dc866..bf65a39d521a0b9ce389d053524d36f815a21f44 100644 --- a/src/PHYEX/micro/modi_rain_ice.f90 +++ b/src/PHYEX/micro/modi_rain_ice.f90 @@ -4,9 +4,8 @@ ! INTERFACE SUBROUTINE RAIN_ICE ( D, CST, PARAMI, ICEP, ICED, BUCONF, & - KPROMA, KSIZE, & - OCND2, HSUBG_AUCV_RC, HSUBG_AUCV_RI, & - PTSTEP, KRR, ODMICRO, PEXN, & + KPROMA, OCND2, HSUBG_AUCV_RC, HSUBG_AUCV_RI, & + PTSTEP, KRR, PEXN, & PDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,& PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & PTHT, PRVT, PRCT, PRRT, PRIT, PRST, & @@ -33,16 +32,11 @@ TYPE(RAIN_ICE_PARAM_t), INTENT(IN) :: ICEP TYPE(RAIN_ICE_DESCR_t), INTENT(IN) :: ICED TYPE(TBUDGETCONF_t), INTENT(IN) :: BUCONF INTEGER, INTENT(IN) :: KPROMA ! cache-blocking factor for microphysic loop -INTEGER, INTENT(IN) :: KSIZE LOGICAL :: OCND2 ! Logical switch to separate liquid and ice -CHARACTER(LEN=4), INTENT(IN) :: HSUBG_AUCV_RC ! Switch for rc->rr Subgrid autoconversion - ! Kind of Subgrid autoconversion method -CHARACTER(LEN=80), INTENT(IN) :: HSUBG_AUCV_RI ! Switch for ri->rs Subgrid autoconversion - ! Kind of Subgrid autoconversion method -REAL, INTENT(IN) :: PTSTEP ! Double Time step - ! (single if cold start) +CHARACTER(LEN=4), INTENT(IN) :: HSUBG_AUCV_RC ! Kind of Subgrid autoconversion method +CHARACTER(LEN=80), INTENT(IN) :: HSUBG_AUCV_RI ! Kind of Subgrid autoconversion method +REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) INTEGER, INTENT(IN) :: KRR ! Number of moist variable -LOGICAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: ODMICRO ! mask to limit computation ! REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PEXN ! Exner function REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDZZ ! Layer thikness (m) @@ -53,10 +47,10 @@ REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PPABST ! absolute pressure at ! REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PCIT ! Pristine ice n.c. at t REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PCLDFR ! Cloud fraction -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PHLC_HRC -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PHLC_HCF -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PHLI_HRI -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PHLI_HCF +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PHLC_HRC +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PHLC_HCF +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PHLI_HRI +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PHLI_HCF ! REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHT ! Theta at time t REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRVT ! Water vapor m.r. at t diff --git a/src/PHYEX/micro/rain_ice.f90 b/src/PHYEX/micro/rain_ice.f90 index aa9b05d272540471381ce91dd65f468fb73b6be2..2008e76f6b6552c424e91d78e78e8a310eed4a79 100644 --- a/src/PHYEX/micro/rain_ice.f90 +++ b/src/PHYEX/micro/rain_ice.f90 @@ -5,9 +5,8 @@ !----------------------------------------------------------------- ! ######spl SUBROUTINE RAIN_ICE ( D, CST, PARAMI, ICEP, ICED, BUCONF, & - KPROMA, KSIZE, & - OCND2,HSUBG_AUCV_RC, HSUBG_AUCV_RI, & - PTSTEP, KRR, ODMICRO, PEXN, & + KPROMA, OCND2, HSUBG_AUCV_RC, HSUBG_AUCV_RI, & + PTSTEP, KRR, PEXN, & PDZZ, PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR,& PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & PTHT, PRVT, PRCT, PRRT, PRIT, PRST, & @@ -202,11 +201,10 @@ USE MODE_BUDGET, ONLY: BUDGET_STORE_ADD_PHY, BUDGET_STORE_INIT_PHY, BUDG USE MODE_MSG, ONLY: PRINT_MSG, NVERB_FATAL USE MODE_ICE4_RAINFR_VERT, ONLY: ICE4_RAINFR_VERT -USE MODE_ICE4_SEDIMENTATION_STAT, ONLY: ICE4_SEDIMENTATION_STAT -USE MODE_ICE4_SEDIMENTATION_SPLIT, ONLY: ICE4_SEDIMENTATION_SPLIT -USE MODE_ICE4_SEDIMENTATION_SPLIT_MOMENTUM, ONLY: ICE4_SEDIMENTATION_SPLIT_MOMENTUM -USE MODE_ICE4_TENDENCIES, ONLY: ICE4_TENDENCIES +USE MODE_ICE4_SEDIMENTATION, ONLY: ICE4_SEDIMENTATION +USE MODE_ICE4_PACK, ONLY: ICE4_PACK USE MODE_ICE4_NUCLEATION, ONLY: ICE4_NUCLEATION +USE MODE_ICE4_CORRECT_NEGATIVITIES, ONLY: ICE4_CORRECT_NEGATIVITIES ! IMPLICIT NONE ! @@ -221,13 +219,11 @@ TYPE(RAIN_ICE_PARAM_t), INTENT(IN) :: ICEP TYPE(RAIN_ICE_DESCR_t), INTENT(IN) :: ICED TYPE(TBUDGETCONF_t), INTENT(IN) :: BUCONF INTEGER, INTENT(IN) :: KPROMA ! cache-blocking factor for microphysic loop -INTEGER, INTENT(IN) :: KSIZE LOGICAL :: OCND2 ! Logical switch to separate liquid and ice CHARACTER(LEN=4), INTENT(IN) :: HSUBG_AUCV_RC ! Kind of Subgrid autoconversion method CHARACTER(LEN=80), INTENT(IN) :: HSUBG_AUCV_RI ! Kind of Subgrid autoconversion method REAL, INTENT(IN) :: PTSTEP ! Double Time step (single if cold start) INTEGER, INTENT(IN) :: KRR ! Number of moist variable -LOGICAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: ODMICRO ! mask to limit computation ! REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PEXN ! Exner function REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PDZZ ! Layer thikness (m) @@ -238,10 +234,11 @@ REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PPABST ! absolute pressure at ! REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PCIT ! Pristine ice n.c. at t REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PCLDFR ! Cloud fraction -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PHLC_HRC -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PHLC_HCF -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PHLI_HRI -REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PHLI_HCF +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PHLC_HRC +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PHLC_HCF +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PHLI_HRI +REAL, DIMENSION(D%NIJT,D%NKT), INTENT(INOUT) :: PHLI_HCF +! REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PTHT ! Theta at time t REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRVT ! Water vapor m.r. at t REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PRCT ! Cloud water m.r. at t @@ -266,6 +263,7 @@ REAL, DIMENSION(D%NIJT), INTENT(OUT) :: PINPRG! Graupel instant precip REAL, DIMENSION(MERGE(D%NIJT, 0, PARAMI%LDEPOSC)), INTENT(OUT) :: PINDEP ! Cloud instant deposition REAL, DIMENSION(D%NIJT,D%NKT), INTENT(OUT) :: PRAINFR !Precipitation fraction REAL, DIMENSION(D%NIJT,D%NKT), INTENT(IN) :: PSIGS ! Sigma_s at t +! TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS INTEGER, INTENT(IN) :: KBUDGETS REAL, DIMENSION(D%NIJT), OPTIONAL, INTENT(IN) :: PSEA ! Sea Mask @@ -282,153 +280,30 @@ REAL(KIND=JPRB) :: ZHOOK_HANDLE ! INTEGER :: JIJ, JK INTEGER :: IKTB, IKTE, IKB, IIJB, IIJE -INTEGER :: ISTIJ, ISTK ! -!Arrays for nucleation call outisde of ODMICRO points -REAL, DIMENSION(D%NIJT, D%NKT) :: ZW ! work array +LOGICAL, DIMENSION(D%NIJT,D%NKT) :: LLMICRO ! mask to limit computation +!Arrays for nucleation call outisde of LLMICRO points REAL, DIMENSION(D%NIJT, D%NKT) :: ZT ! Temperature -REAL, DIMENSION(D%NIJT, D%NKT) :: ZZ_RVHENI_MR, & ! heterogeneous nucleation mixing ratio change - & ZZ_RVHENI ! heterogeneous nucleation -REAL, DIMENSION(MERGE(D%NIJT, 0, BUCONF%LBU_ENABLE), & - &MERGE(D%NKT, 0, BUCONF%LBU_ENABLE)) :: ZW1, ZW2, ZW3, ZW4, ZW5, ZW6 !Work arrays -REAL, DIMENSION(D%NIJT, D%NKT) :: ZZ_LVFACT, ZZ_LSFACT, ZZ_DIFF -! -REAL, DIMENSION(D%NIJT,D%NKT) :: ZRCT ! Cloud water m.r. source at t -REAL, DIMENSION(D%NIJT,D%NKT) :: ZRRT ! Rain water m.r. source at t -REAL, DIMENSION(D%NIJT,D%NKT) :: ZRIT ! Pristine ice m.r. source at t -REAL, DIMENSION(D%NIJT,D%NKT) :: ZRST ! Snow/aggregate m.r. source at t -REAL, DIMENSION(D%NIJT,D%NKT) :: ZRGT ! Graupel m.r. source at t -REAL, DIMENSION(D%NIJT,D%NKT) :: ZRHT ! Hail m.r. source at t -REAL, DIMENSION(D%NIJT,D%NKT) :: ZCITOUT ! Output value for CIT -REAL, DIMENSION(D%NIJT,D%NKT) :: ZLBDAS ! Modif !lbda parameter snow - -!Diagnostics -REAL, DIMENSION(D%NIJT) :: ZINPRI ! Pristine ice instant precip +REAL, DIMENSION(D%NIJT, D%NKT) :: ZZ_RVHENI ! heterogeneous nucleation +REAL, DIMENSION(D%NIJT, D%NKT) :: ZZ_LVFACT, ZZ_LSFACT ! -LOGICAL :: GEXT_TEND -LOGICAL :: LSOFT ! Must we really compute tendencies or only adjust them to new T variables -INTEGER :: INB_ITER_MAX ! Maximum number of iterations (with real tendencies computation) -REAL :: ZW0D -REAL :: ZTSTEP ! length of sub-timestep in case of time splitting REAL :: ZINV_TSTEP ! Inverse ov PTSTEP -REAL :: ZTIME_THRESHOLD ! Time to reach threshold !For total tendencies computation REAL, DIMENSION(D%NIJT,D%NKT,0:7) :: ZWR ! -!Output packed total mixing ratio change (for budgets only) -REAL, DIMENSION(KSIZE) :: ZTOT_RVHENI, & ! heterogeneous nucleation mixing ratio change - & ZTOT_RCHONI, & ! Homogeneous nucleation - & ZTOT_RRHONG, & ! Spontaneous freezing mixing ratio change - & ZTOT_RVDEPS, & ! Deposition on r_s, - & ZTOT_RIAGGS, & ! Aggregation on r_s - & ZTOT_RIAUTS, & ! Autoconversion of r_i for r_s production - & ZTOT_RVDEPG, & ! Deposition on r_g - & ZTOT_RCAUTR, & ! Autoconversion of r_c for r_r production - & ZTOT_RCACCR, & ! Accretion of r_c for r_r production - & ZTOT_RREVAV, & ! Evaporation of r_r - & ZTOT_RCRIMSS, ZTOT_RCRIMSG, ZTOT_RSRIMCG, & ! Cloud droplet riming of the aggregates - & ZTOT_RIMLTC, & ! Cloud ice melting mixing ratio change - & ZTOT_RCBERI, & ! Bergeron-Findeisen effect - & ZTOT_RHMLTR, & ! Melting of the hailstones - & ZTOT_RSMLTG, & ! Conversion-Melting of the aggregates - & ZTOT_RCMLTSR, & ! Cloud droplet collection onto aggregates by positive temperature - & ZTOT_RRACCSS, ZTOT_RRACCSG, ZTOT_RSACCRG, & ! Rain accretion onto the aggregates - & ZTOT_RICFRRG, ZTOT_RRCFRIG, ZTOT_RICFRR, & ! Rain contact freezing - & ZTOT_RCWETG, ZTOT_RIWETG, ZTOT_RRWETG, ZTOT_RSWETG, & ! Graupel wet growth - & ZTOT_RCDRYG, ZTOT_RIDRYG, ZTOT_RRDRYG, ZTOT_RSDRYG, & ! Graupel dry growth - & ZTOT_RWETGH, & ! Conversion of graupel into hail - & ZTOT_RGMLTR, & ! Melting of the graupel - & ZTOT_RCWETH, ZTOT_RIWETH, ZTOT_RSWETH, ZTOT_RGWETH, ZTOT_RRWETH, & ! Dry growth of hailstone - & ZTOT_RCDRYH, ZTOT_RIDRYH, ZTOT_RSDRYH, ZTOT_RRDRYH, ZTOT_RGDRYH, & ! Wet growth of hailstone - & ZTOT_RDRYHG ! Conversion of hailstone into graupel -! -!For packing -INTEGER :: IMICRO ! Case r_x>0 locations -INTEGER :: JL, JV -REAL, DIMENSION(KPROMA) :: ZTIME ! Current integration time (starts with 0 and ends with PTSTEP) -REAL, DIMENSION(KPROMA) :: & - & ZMAXTIME, & ! Time on which we can apply the current tendencies - & ZTIME_LASTCALL, & ! Integration time when last tendecies call has been done - & ZSSI, & - & ZCIT, & ! Pristine ice conc. at t - & ZRHODREF, & ! RHO Dry REFerence - & ZZT, & ! Temperature - & ZPRES, & ! Pressure - & ZEXN, & ! EXNer Pressure - & ZLSFACT, & ! L_s/(Pi*C_ph) - & ZLVFACT, & ! L_v/(Pi*C_ph) - & ZSIGMA_RC,& ! Standard deviation of rc at time t - & ZCF, & ! Cloud fraction - & ZHLC_HCF, & ! HLCLOUDS : fraction of High Cloud Fraction in grid - & ZHLC_LCF, & ! HLCLOUDS : fraction of Low Cloud Fraction in grid - ! note that ZCF = ZHLC_HCF + ZHLC_LCF - & ZHLC_HRC, & ! HLCLOUDS : LWC that is High LWC in grid - & ZHLC_LRC, & ! HLCLOUDS : LWC that is Low LWC in grid - ! note that ZRC = ZHLC_HRC + ZHLC_LRC - & ZHLI_HCF, & - & ZHLI_LCF, & - & ZHLI_HRI, & - & ZHLI_LRI -LOGICAL, DIMENSION(KPROMA) :: LLCOMPUTE ! .TRUE. or points where we must compute tendencies, -! -!Output packed tendencies (for budgets only) -REAL, DIMENSION(KPROMA) :: ZRVHENI_MR, & ! heterogeneous nucleation mixing ratio change - & ZRCHONI, & ! Homogeneous nucleation - & ZRRHONG_MR, & ! Spontaneous freezing mixing ratio change - & ZRVDEPS, & ! Deposition on r_s, - & ZRIAGGS, & ! Aggregation on r_s - & ZRIAUTS, & ! Autoconversion of r_i for r_s production - & ZRVDEPG, & ! Deposition on r_g - & ZRCAUTR, & ! Autoconversion of r_c for r_r production - & ZRCACCR, & ! Accretion of r_c for r_r production - & ZRREVAV, & ! Evaporation of r_r - & ZRIMLTC_MR, & ! Cloud ice melting mixing ratio change - & ZRCBERI, & ! Bergeron-Findeisen effect - & ZRHMLTR, & ! Melting of the hailstones - & ZRSMLTG, & ! Conversion-Melting of the aggregates - & ZRCMLTSR, & ! Cloud droplet collection onto aggregates by positive temperature - & ZRRACCSS, ZRRACCSG, ZRSACCRG, & ! Rain accretion onto the aggregates - & ZRCRIMSS, ZRCRIMSG, ZRSRIMCG, ZRSRIMCG_MR, & ! Cloud droplet riming of the aggregates - & ZRICFRRG, ZRRCFRIG, ZRICFRR, & ! Rain contact freezing - & ZRCWETG, ZRIWETG, ZRRWETG, ZRSWETG, & ! Graupel wet growth - & ZRCDRYG, ZRIDRYG, ZRRDRYG, ZRSDRYG, & ! Graupel dry growth - & ZRWETGH, & ! Conversion of graupel into hail - & ZRWETGH_MR, & ! Conversion of graupel into hail, mr change - & ZRGMLTR, & ! Melting of the graupel - & ZRCWETH, ZRIWETH, ZRSWETH, ZRGWETH, ZRRWETH, & ! Dry growth of hailstone - & ZRCDRYH, ZRIDRYH, ZRSDRYH, ZRRDRYH, ZRGDRYH, & ! Wet growth of hailstone - & ZRDRYHG ! Conversion of hailstone into graupel -! -!For mixing-ratio-splitting -LOGICAL :: LLCPZ0RT -REAL :: ZTIME_THRESHOLD1D(KPROMA) ! Time to reach threshold -REAL, DIMENSION(KPROMA, KRR) :: Z0RT ! Mixing-ratios at the beginig of the current loop -! -REAL, DIMENSION(KPROMA,0:7) :: & - & ZVART, & !Packed variables - & ZEXTPK, & !To take into acount external tendencies inside the splitting - & ZA, ZB -! -REAL, DIMENSION(KPROMA, 8) :: ZRS_TEND, ZRG_TEND -REAL, DIMENSION(KPROMA,10) :: ZRH_TEND - -INTEGER, DIMENSION(KPROMA) :: & - & I1,I2, & ! Used to replace the COUNT and PACK intrinsics on variables - & IITER ! Number of iterations done (with real tendencies computation) -INTEGER, DIMENSION(KSIZE) :: I1TOT, I2TOT ! Used to replace the COUNT and PACK intrinsics -! -REAL, DIMENSION(KPROMA) :: ZSUM2, ZMAXB -REAL :: ZDEVIDE, ZX, ZRICE -! -INTEGER :: IC, JMICRO -LOGICAL :: LLSIGMA_RC, LL_ANY_ITER, LL_AUCV_ADJU +REAL :: ZDEVIDE, ZRICE ! REAL, DIMENSION(D%NIJT,D%NKT) :: ZW3D LOGICAL, DIMENSION(D%NIJT,D%NKT) :: LLW3D +REAL, DIMENSION(KRR) :: ZRSMIN +INTEGER :: ISIZE, IPROMA, IGPBLKS, ISIZE2 ! !------------------------------------------------------------------------------- IF (LHOOK) CALL DR_HOOK('RAIN_ICE', 0, ZHOOK_HANDLE) ! +!* 1. GENERALITIES +! ------------ +! IKTB=D%NKTB IKTE=D%NKTE IKB=D%NKB @@ -439,25 +314,15 @@ IIJE=D%NIJE IF(OCND2) THEN CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'RAIN_ICE', 'OCND2 OPTION NOT CODED IN THIS RAIN_ICE VERSION') END IF -IF(KPROMA /= KSIZE) THEN - CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'RAIN_ICE', 'For now, KPROMA must be equal to KSIZE, see code for explanation') - ! Microphyscs was optimized by introducing chunks of KPROMA size - ! Thus, in ice4_tendencies, the 1D array represent only a fraction of the points where microphisical species are present - ! We cannot rebuild the entire 3D arrays in the subroutine, so we cannot call ice4_rainfr_vert in it - ! A solution would be to suppress optimisation in this case by setting KPROMA=KSIZE in rain_ice - ! Another solution would be to compute column by column? - ! Another one would be to cut tendencies in 3 parts: before rainfr_vert, rainfr_vert, after rainfr_vert -ENDIF -! -!* 1. COMPUTE THE LOOP BOUNDS -! ----------------------- -! ZINV_TSTEP=1./PTSTEP -GEXT_TEND=.TRUE. ! -! LSFACT and LVFACT without exner +! LSFACT and LVFACT without exner, and LLMICRO +! LLMICRO is a mask with a True value on points where microphysics is active +ZRSMIN(1:KRR) = ICED%XRTMIN(1:KRR) * ZINV_TSTEP +LLMICRO(:,:)=.FALSE. DO JK = IKTB,IKTE DO JIJ = IIJB,IIJE + !LSFACT and LVFACT IF (KRR==7) THEN ZRICE=PRIT(JIJ,JK)+PRST(JIJ,JK)+PRGT(JIJ,JK)+PRHT(JIJ,JK) ELSE @@ -467,36 +332,42 @@ DO JK = IKTB,IKTE ZT(JIJ,JK) = PTHT(JIJ,JK) * PEXN(JIJ,JK) ZZ_LSFACT(JIJ,JK)=(CST%XLSTT+(CST%XCPV-CST%XCI)*(ZT(JIJ,JK)-CST%XTT)) / ZDEVIDE ZZ_LVFACT(JIJ,JK)=(CST%XLVTT+(CST%XCPV-CST%XCL)*(ZT(JIJ,JK)-CST%XTT)) / ZDEVIDE + + !LLMICRO + IF (KRR==7) THEN + LLMICRO(JIJ,JK)=PRCT(JIJ,JK)>ICED%XRTMIN(2) .OR. & + PRRT(JIJ,JK)>ICED%XRTMIN(3) .OR. & + PRIT(JIJ,JK)>ICED%XRTMIN(4) .OR. & + PRST(JIJ,JK)>ICED%XRTMIN(5) .OR. & + PRGT(JIJ,JK)>ICED%XRTMIN(6) .OR. & + PRHT(JIJ,JK)>ICED%XRTMIN(7) +#ifdef REPRO55 + LLMICRO(JIJ,JK)=LLMICRO(JIJ,JK) .OR. & + PRCS(JIJ,JK)>ZRSMIN(2) .OR. & + PRRS(JIJ,JK)>ZRSMIN(3) .OR. & + PRIS(JIJ,JK)>ZRSMIN(4) .OR. & + PRSS(JIJ,JK)>ZRSMIN(5) .OR. & + PRGS(JIJ,JK)>ZRSMIN(6) .OR. & + PRHS(JIJ,JK)>ZRSMIN(7) +#endif + ELSE + LLMICRO(JIJ,JK)=PRCT(JIJ,JK)>ICED%XRTMIN(2) .OR. & + PRRT(JIJ,JK)>ICED%XRTMIN(3) .OR. & + PRIT(JIJ,JK)>ICED%XRTMIN(4) .OR. & + PRST(JIJ,JK)>ICED%XRTMIN(5) .OR. & + PRGT(JIJ,JK)>ICED%XRTMIN(6) +#ifdef REPRO55 + LLMICRO(JIJ,JK)=LLMICRO(JIJ,JK) .OR. & + PRCS(JIJ,JK)>ZRSMIN(2) .OR. & + PRRS(JIJ,JK)>ZRSMIN(3) .OR. & + PRIS(JIJ,JK)>ZRSMIN(4) .OR. & + PRSS(JIJ,JK)>ZRSMIN(5) .OR. & + PRGS(JIJ,JK)>ZRSMIN(6) +#endif + ENDIF ENDDO ENDDO ! -!Compute lambda_snow parameter -!ZT en KELVIN -DO JK = IKTB,IKTE - DO JIJ = IIJB,IIJE - ZLBDAS(JIJ,JK)=1000. - END DO -END DO -DO JK = IKTB,IKTE - DO JIJ = IIJB,IIJE - IF (PARAMI%LSNOW_T) THEN - IF (PRST(JIJ,JK)>ICED%XRTMIN(5)) THEN - IF(ZT(JIJ,JK)>CST%XTT-10.0) THEN - ZLBDAS(JIJ,JK) = MAX(MIN(ICED%XLBDAS_MAX, 10**(14.554-0.0423*ZT(JIJ,JK))),ICED%XLBDAS_MIN)*ICED%XTRANS_MP_GAMMAS - ELSE - ZLBDAS(JIJ,JK) = MAX(MIN(ICED%XLBDAS_MAX, 10**(6.226-0.0106*ZT(JIJ,JK))),ICED%XLBDAS_MIN)*ICED%XTRANS_MP_GAMMAS - END IF - END IF -#if defined(REPRO48) || defined(REPRO55) -#else - ELSE - IF (PRST(JIJ,JK).GT.ICED%XRTMIN(5)) THEN - ZLBDAS(JIJ,JK) = MAX(MIN(ICED%XLBDAS_MAX,ICED%XLBS*(PRHODREF(JIJ,JK)*PRST(JIJ,JK))**ICED%XLBEXS),ICED%XLBDAS_MIN) - END IF -#endif - END IF - END DO -END DO ! !------------------------------------------------------------------------------- ! @@ -504,130 +375,26 @@ END DO ! ------------------------------------- ! IF(.NOT. PARAMI%LSEDIM_AFTER) THEN - ! - !* 2.1 sedimentation - ! - IF (BUCONF%LBUDGET_RC .AND. PARAMI%LSEDIC) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RC), 'SEDI', PRCS(:, :) * PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RR) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RR), 'SEDI', PRRS(:, :) * PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RI), 'SEDI', PRIS(:, :) * PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RS) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RS), 'SEDI', PRSS(:, :) * PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RG), 'SEDI', PRGS(:, :) * PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RH .AND. KRR==7) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RH), 'SEDI', PRHS(:, :) * PRHODJ(:, :)) - - IF(PARAMI%CSEDIM=='STAT') THEN - IF(KRR==7) THEN - DO JK = IKTB,IKTE - DO JIJ = IIJB,IIJE - ZRCT(JIJ,JK)=PRCS(JIJ,JK)*PTSTEP - ZRRT(JIJ,JK)=PRRS(JIJ,JK)*PTSTEP - ZRIT(JIJ,JK)=PRIS(JIJ,JK)*PTSTEP - ZRST(JIJ,JK)=PRSS(JIJ,JK)*PTSTEP - ZRGT(JIJ,JK)=PRGS(JIJ,JK)*PTSTEP - ZRHT(JIJ,JK)=PRHS(JIJ,JK)*PTSTEP - ENDDO - ENDDO - CALL ICE4_SEDIMENTATION_STAT(D, CST, ICEP, ICED, & - &PTSTEP, KRR, PARAMI%LSEDIC, PDZZ, & - &PRHODREF, PPABST, PTHT, PRHODJ, & - &ZLBDAS, & - &PRCS, ZRCT, PRRS, ZRRT, PRIS, ZRIT,& - &PRSS, ZRST, PRGS, ZRGT,& - &PINPRC, PINPRR, ZINPRI, PINPRS, PINPRG, & - &PSEA=PSEA, PTOWN=PTOWN, & - &PINPRH=PINPRH, PRHT=ZRHT, PRHS=PRHS, PFPR=PFPR) - ELSE - DO JK = IKTB,IKTE - DO JIJ = IIJB,IIJE - ZRCT(JIJ,JK)=PRCS(JIJ,JK)*PTSTEP - ZRRT(JIJ,JK)=PRRS(JIJ,JK)*PTSTEP - ZRIT(JIJ,JK)=PRIS(JIJ,JK)*PTSTEP - ZRST(JIJ,JK)=PRSS(JIJ,JK)*PTSTEP - ZRGT(JIJ,JK)=PRGS(JIJ,JK)*PTSTEP - ENDDO - ENDDO - CALL ICE4_SEDIMENTATION_STAT(D, CST, ICEP, ICED, & - &PTSTEP, KRR, PARAMI%LSEDIC, PDZZ, & - &PRHODREF, PPABST, PTHT, PRHODJ, & - &ZLBDAS, & - &PRCS, ZRCT, PRRS, ZRRT, PRIS, ZRIT,& - &PRSS, ZRST, PRGS, ZRGT,& - &PINPRC, PINPRR, ZINPRI, PINPRS, PINPRG, & - &PSEA=PSEA, PTOWN=PTOWN, & - &PFPR=PFPR) - ENDIF - PINPRS(IIJB:IIJE) = PINPRS(IIJB:IIJE) + ZINPRI(IIJB:IIJE) - !No negativity correction here as we apply sedimentation on PR.S*PTSTEP variables - ELSEIF(PARAMI%CSEDIM=='SPLI') THEN - IF(KRR==7) THEN - CALL ICE4_SEDIMENTATION_SPLIT(D, CST, ICEP, ICED, PARAMI, & - &PTSTEP, KRR, PDZZ, & - &PRHODREF, PPABST, PTHT, ZT, PRHODJ, & - &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& - &PINPRC, PINPRR, ZINPRI, PINPRS, PINPRG, & - &PSEA=PSEA, PTOWN=PTOWN, & - &PINPRH=PINPRH, PRHT=PRHT, PRHS=PRHS, PFPR=PFPR) - ELSE - CALL ICE4_SEDIMENTATION_SPLIT(D, CST, ICEP, ICED, PARAMI, & - &PTSTEP, KRR, PDZZ, & - &PRHODREF, PPABST, PTHT, ZT, PRHODJ, & - &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& - &PINPRC, PINPRR, ZINPRI, PINPRS, PINPRG, & - &PSEA=PSEA, PTOWN=PTOWN, & - &PFPR=PFPR) - ENDIF - PINPRS(IIJB:IIJE) = PINPRS(IIJB:IIJE) + ZINPRI(IIJB:IIJE) - !We correct negativities with conservation - !SPLI algorith uses a time-splitting. Inside the loop a temporary m.r. is used. - ! It is initialized with the m.r. at T and is modified by two tendencies: - ! sedimentation tendency and an external tendency which represents all other - ! processes (mainly advection and microphysical processes). If both tendencies - ! are negative, sedimentation can remove a species at a given sub-timestep. From - ! this point sedimentation stops for the remaining sub-timesteps but the other tendency - ! will be still active and will lead to negative values. - ! We could prevent the algorithm to not consume too much a species, instead we apply - ! a correction here. - CALL CORRECT_NEGATIVITIES(D, KRR, PRVS, PRCS, PRRS, & - &PRIS, PRSS, PRGS, & - &PTHS, ZZ_LVFACT, ZZ_LSFACT, PRHS) - ELSEIF(PARAMI%CSEDIM=='NONE') THEN - ELSE - CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'RAIN_ICE', 'no sedimentation scheme for PARAMI%CSEDIM='//PARAMI%CSEDIM) - END IF - - - - - - -!!!!! ajouter momentum - - - - - - - - - - - - - - - ! - !* 2.2 budget storage - ! - IF (BUCONF%LBUDGET_RC .AND. PARAMI%LSEDIC) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RC), 'SEDI', PRCS(:, :) * PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RR) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RR), 'SEDI', PRRS(:, :) * PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RI), 'SEDI', PRIS(:, :) * PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RS) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RS), 'SEDI', PRSS(:, :) * PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RG), 'SEDI', PRGS(:, :) * PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RH .AND. KRR==7) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RH), 'SEDI', PRHS(:, :) * PRHODJ(:, :)) + CALL ICE4_SEDIMENTATION(D, CST, ICEP, ICED, PARAMI, BUCONF, & + &PTSTEP, KRR, PDZZ, & + &ZZ_LVFACT, ZZ_LSFACT, PRHODREF, PPABST, PTHT, ZT, PRHODJ, & + &PTHS, PRVS, PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& + &PINPRC, PINPRR, PINPRS, PINPRG, & + &TBUDGETS, KBUDGETS, & + &PSEA=PSEA, PTOWN=PTOWN, & + &PINPRH=PINPRH, PRHT=PRHT, PRHS=PRHS, PFPR=PFPR) ENDIF ! +! +!------------------------------------------------------------------------------- +! +!* 3. INITIAL VALUES SAVING +! --------------------- +! DO JK = IKTB,IKTE - !Backup of T variables + !Copy of T variables to keep untouched the prognostic variables + ZWR(:,JK,ITH)=PTHT(:,JK) ZWR(:,JK,IRV)=PRVT(:,JK) ZWR(:,JK,IRC)=PRCT(:,JK) ZWR(:,JK,IRR)=PRRT(:,JK) @@ -645,489 +412,25 @@ DO JK = IKTB,IKTE PEVAP3D(:,JK)=0. ENDIF PRAINFR(:,JK)=0. -#ifdef REPRO55 - ZCITOUT(:,JK)=PCIT(:,JK) -#else - ZCITOUT(:,JK)=0. !We want 0 outside of IMICRO points -#endif ENDDO - -IF(BUCONF%LBU_ENABLE) THEN - ZTOT_RVHENI(:)=0. - ZTOT_RCHONI(:)=0. - ZTOT_RRHONG(:)=0. - ZTOT_RVDEPS(:)=0. - ZTOT_RIAGGS(:)=0. - ZTOT_RIAUTS(:)=0. - ZTOT_RVDEPG(:)=0. - ZTOT_RCAUTR(:)=0. - ZTOT_RCACCR(:)=0. - ZTOT_RREVAV(:)=0. - ZTOT_RCRIMSS(:)=0. - ZTOT_RCRIMSG(:)=0. - ZTOT_RSRIMCG(:)=0. - ZTOT_RIMLTC(:)=0. - ZTOT_RCBERI(:)=0. - ZTOT_RHMLTR(:)=0. - ZTOT_RSMLTG(:)=0. - ZTOT_RCMLTSR(:)=0. - ZTOT_RRACCSS(:)=0. - ZTOT_RRACCSG(:)=0. - ZTOT_RSACCRG(:)=0. - ZTOT_RICFRRG(:)=0. - ZTOT_RRCFRIG(:)=0. - ZTOT_RICFRR(:)=0. - ZTOT_RCWETG(:)=0. - ZTOT_RIWETG(:)=0. - ZTOT_RRWETG(:)=0. - ZTOT_RSWETG(:)=0. - ZTOT_RCDRYG(:)=0. - ZTOT_RIDRYG(:)=0. - ZTOT_RRDRYG(:)=0. - ZTOT_RSDRYG(:)=0. - ZTOT_RWETGH(:)=0. - ZTOT_RGMLTR(:)=0. - ZTOT_RCWETH(:)=0. - ZTOT_RIWETH(:)=0. - ZTOT_RSWETH(:)=0. - ZTOT_RGWETH(:)=0. - ZTOT_RRWETH(:)=0. - ZTOT_RCDRYH(:)=0. - ZTOT_RIDRYH(:)=0. - ZTOT_RSDRYH(:)=0. - ZTOT_RRDRYH(:)=0. - ZTOT_RGDRYH(:)=0. - ZTOT_RDRYHG(:)=0. -ENDIF - -!------------------------------------------------------------------------------- -! optimization by looking for locations where -! the microphysical fields are larger than a minimal value only !!! ! -IF (KSIZE /= COUNT(ODMICRO(IIJB:IIJE,IKTB:IKTE))) THEN - CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'RAIN_ICE', 'RAIN_ICE : KSIZE /= COUNT(ODMICRO)') -ENDIF - -IF (KSIZE > 0) THEN - - !Maximum number of iterations - !We only count real iterations (those for which we *compute* tendencies) - INB_ITER_MAX=PARAMI%NMAXITER - IF(PARAMI%XTSTEP_TS/=0.)THEN - INB_ITER_MAX=MAX(1, INT(PTSTEP/PARAMI%XTSTEP_TS)) !At least the number of iterations needed for the time-splitting - ZTSTEP=PTSTEP/INB_ITER_MAX - INB_ITER_MAX=MAX(PARAMI%NMAXITER, INB_ITER_MAX) !For the case XMRSTEP/=0. at the same time - ENDIF - -!=============================================================================================================== -! Cache-blocking loop : - - LLSIGMA_RC=(HSUBG_AUCV_RC=='PDF ' .AND. PARAMI%CSUBG_PR_PDF=='SIGM') - LL_AUCV_ADJU=(HSUBG_AUCV_RC=='ADJU' .OR. HSUBG_AUCV_RI=='ADJU') - - ! starting indexes : - IC=0 - ISTK=IKTB - ISTIJ=IIJB - - DO JMICRO=1,KSIZE,KPROMA - - IMICRO=MIN(KPROMA,KSIZE-JMICRO+1) ! -!* 3. PACKING -! -------- - - ! Setup packing parameters - OUTER_LOOP: DO JK = ISTK, IKTE - IF (ANY(ODMICRO(:,JK))) THEN - DO JIJ = ISTIJ, IIJE - IF (ODMICRO(JIJ,JK)) THEN - IC=IC+1 - ! Initialization of variables in packed format : - ZVART(IC, ITH)=PTHT(JIJ, JK) - ZVART(IC, IRV)=PRVT(JIJ, JK) - ZVART(IC, IRC)=PRCT(JIJ, JK) - ZVART(IC, IRR)=PRRT(JIJ, JK) - ZVART(IC, IRI)=PRIT(JIJ, JK) - ZVART(IC, IRS)=PRST(JIJ, JK) - ZVART(IC, IRG)=PRGT(JIJ, JK) - IF (KRR==7) THEN - ZVART(IC, IRH)=PRHT(JIJ, JK) - ENDIF - IF (GEXT_TEND) THEN - !The th tendency is not related to a mixing ratio change, there is no exn/exnref issue here - ZEXTPK(IC, ITH)=PTHS(JIJ, JK) - ZEXTPK(IC, IRV)=PRVS(JIJ, JK) - ZEXTPK(IC, IRC)=PRCS(JIJ, JK) - ZEXTPK(IC, IRR)=PRRS(JIJ, JK) - ZEXTPK(IC, IRI)=PRIS(JIJ, JK) - ZEXTPK(IC, IRS)=PRSS(JIJ, JK) - ZEXTPK(IC, IRG)=PRGS(JIJ, JK) - IF (KRR==7) THEN - ZEXTPK(IC, IRH)=PRHS(JIJ, JK) - ENDIF - ENDIF - ZCIT (IC)=PCIT (JIJ, JK) - ZCF (IC)=PCLDFR (JIJ, JK) - ZRHODREF (IC)=PRHODREF(JIJ, JK) - ZPRES (IC)=PPABST (JIJ, JK) - ZEXN (IC)=PEXN (JIJ, JK) - IF(LLSIGMA_RC) THEN - ZSIGMA_RC(IC)=PSIGS (JIJ, JK) - ENDIF - IF (LL_AUCV_ADJU) THEN - ZHLC_HCF(IC) = PHLC_HCF(JIJ, JK) - ZHLC_HRC(IC) = PHLC_HRC(JIJ, JK) - ZHLI_HCF(IC) = PHLI_HCF(JIJ, JK) - ZHLI_HRI(IC) = PHLI_HRI(JIJ, JK) - ENDIF - ! Save indices for later usages: - I1(IC) = JIJ - I2(IC) = JK - I1TOT(JMICRO+IC-1)=JIJ - I2TOT(JMICRO+IC-1)=JK - IF (IC==IMICRO) THEN - ! the end of the chunk has been reached, then reset the starting index : - ISTIJ=JIJ+1 - IF (ISTIJ <= IIJE) THEN - ISTK=JK - ELSE - ! end of line, restart from 1 and increment upper loop - ISTK=JK+1 - IF (ISTK > IKTE) THEN - ! end of line, restart from 1 - ISTK=IKTB - ENDIF - ENDIF - IC=0 - EXIT OUTER_LOOP - ENDIF - ENDIF - ENDDO - ENDIF - ! restart inner loop on JIJ : - ISTIJ=IIJB - ENDDO OUTER_LOOP - - IF (GEXT_TEND) THEN - DO JV=0, KRR - DO JL=1, IMICRO - ZEXTPK(JL, JV)=ZEXTPK(JL, JV)-ZVART(JL, JV)*ZINV_TSTEP - ENDDO - ENDDO - ENDIF - IF (LLSIGMA_RC) THEN - DO JL=1, IMICRO - ZSIGMA_RC(JL)=ZSIGMA_RC(JL)*2. - ENDDO - ENDIF - IF (LL_AUCV_ADJU) THEN - DO JL=1, IMICRO - ZHLC_LRC(JL) = ZVART(JL, IRC) - ZHLC_HRC(JL) - ZHLI_LRI(JL) = ZVART(JL, IRI) - ZHLI_HRI(JL) - IF(ZVART(JL, IRC)>0.) THEN - ZHLC_LCF(JL) = ZCF(JL)- ZHLC_HCF(JL) - ELSE - ZHLC_LCF(JL)=0. - ENDIF - IF(ZVART(JL, IRI)>0.) THEN - ZHLI_LCF(JL) = ZCF(JL)- ZHLI_HCF(JL) - ELSE - ZHLI_LCF(JL)=0. - ENDIF - ENDDO - ENDIF - -!------------------------------------------------------------------------------- -! -!* 4. LOOP -! ---- -! - IITER(1:IMICRO)=0 - ZTIME(1:IMICRO)=0. ! Current integration time (all points may have a different integration time) - - DO WHILE(ANY(ZTIME(1:IMICRO)<PTSTEP)) ! Loop to *really* compute tendencies - - IF(PARAMI%XTSTEP_TS/=0.) THEN - ! In this case we need to remember the time when tendencies were computed - ! because when time has evolved more than a limit, we must re-compute tendencies - ZTIME_LASTCALL(1:IMICRO)=ZTIME(1:IMICRO) - ENDIF - DO JL=1, IMICRO - IF (ZTIME(JL) < PTSTEP) THEN - LLCOMPUTE(JL)=.TRUE. ! Computation (.TRUE.) only for points for which integration time has not reached the timestep - IITER(JL)=IITER(JL)+1 - ELSE - LLCOMPUTE(JL)=.FALSE. - ENDIF - ENDDO - LL_ANY_ITER=ANY(IITER(1:IMICRO) < INB_ITER_MAX) - LLCPZ0RT=.TRUE. - LSOFT=.FALSE. ! We *really* compute the tendencies - - DO WHILE(ANY(LLCOMPUTE(1:IMICRO))) ! Loop to adjust tendencies when we cross the 0°C or when a species disappears -!$OMP SIMD - DO JL=1, IMICRO - ZSUM2(JL)=SUM(ZVART(JL,IRI:KRR)) - ENDDO - DO JL=1, IMICRO - ZDEVIDE=(CST%XCPD + CST%XCPV*ZVART(JL, IRV) + CST%XCL*(ZVART(JL, IRC)+ZVART(JL, IRR)) + CST%XCI*ZSUM2(JL)) * ZEXN(JL) - ZZT(JL) = ZVART(JL, ITH) * ZEXN(JL) - ZLSFACT(JL)=(CST%XLSTT+(CST%XCPV-CST%XCI)*(ZZT(JL)-CST%XTT)) / ZDEVIDE - ZLVFACT(JL)=(CST%XLVTT+(CST%XCPV-CST%XCL)*(ZZT(JL)-CST%XTT)) / ZDEVIDE - ENDDO - ! - !*** 4.1 Tendencies computation - ! - ! Tendencies are *really* computed when LSOFT==.FALSE. and only adjusted otherwise - CALL ICE4_TENDENCIES(D, CST, PARAMI, ICEP, ICED, BUCONF, & - &KPROMA, IMICRO, & - &KRR, LSOFT, LLCOMPUTE, & - &HSUBG_AUCV_RC, HSUBG_AUCV_RI, & - &ZEXN, ZRHODREF, ZLVFACT, ZLSFACT, I1, I2, & - &ZPRES, ZCF, ZSIGMA_RC, & - &ZCIT, & - &ZZT, ZVART, & - &ZRVHENI_MR, ZRRHONG_MR, ZRIMLTC_MR, ZRSRIMCG_MR, & - &ZRCHONI, ZRVDEPS, ZRIAGGS, ZRIAUTS, ZRVDEPG, & - &ZRCAUTR, ZRCACCR, ZRREVAV, & - &ZRCRIMSS, ZRCRIMSG, ZRSRIMCG, ZRRACCSS, ZRRACCSG, ZRSACCRG, ZRSMLTG, ZRCMLTSR, & - &ZRICFRRG, ZRRCFRIG, ZRICFRR, ZRCWETG, ZRIWETG, ZRRWETG, ZRSWETG, & - &ZRCDRYG, ZRIDRYG, ZRRDRYG, ZRSDRYG, ZRWETGH, ZRWETGH_MR, ZRGMLTR, & - &ZRCWETH, ZRIWETH, ZRSWETH, ZRGWETH, ZRRWETH, & - &ZRCDRYH, ZRIDRYH, ZRSDRYH, ZRRDRYH, ZRGDRYH, ZRDRYHG, ZRHMLTR, & - &ZRCBERI, & - &ZRS_TEND, ZRG_TEND, ZRH_TEND, ZSSI, & - &ZA, ZB, & - &ZHLC_HCF, ZHLC_LCF, ZHLC_HRC, ZHLC_LRC, & - &ZHLI_HCF, ZHLI_LCF, ZHLI_HRI, ZHLI_LRI, PRAINFR) - - ! External tendencies - IF(GEXT_TEND) THEN - DO JV=0, KRR - DO JL=1, IMICRO - ZA(JL, JV) = ZA(JL, JV) + ZEXTPK(JL, JV) - ENDDO - ENDDO - ENDIF - ! - !*** 4.2 Integration time - ! - ! If we can, we shall use these tendencies until the end of the timestep - DO JL=1, IMICRO - IF(LLCOMPUTE(JL)) THEN - ZMAXTIME(JL)=(PTSTEP-ZTIME(JL)) ! Remaining time until the end of the timestep - ELSE - ZMAXTIME(JL)=0. - ENDIF - ENDDO - - !We need to adjust tendencies when temperature reaches 0 - IF(PARAMI%LFEEDBACKT) THEN - DO JL=1, IMICRO - !Is ZB(:, ITH) enough to change temperature sign? - ZX=CST%XTT/ZEXN(JL) - IF ((ZVART(JL, ITH) - ZX) * (ZVART(JL, ITH) + ZB(JL, ITH) - ZX) < 0.) THEN - ZMAXTIME(JL)=0. - ENDIF - !Can ZA(:, ITH) make temperature change of sign? - IF (ABS(ZA(JL,ITH)) > 1.E-20 ) THEN - ZTIME_THRESHOLD=(ZX - ZB(JL, ITH) - ZVART(JL, ITH))/ZA(JL, ITH) - IF (ZTIME_THRESHOLD > 0.) THEN - ZMAXTIME(JL)=MIN(ZMAXTIME(JL), ZTIME_THRESHOLD) - ENDIF - ENDIF - ENDDO - ENDIF - - !We need to adjust tendencies when a species disappears - !When a species is missing, only the external tendencies can be negative (and we must keep track of it) - DO JV=1, KRR - DO JL=1, IMICRO - IF (ZA(JL, JV) < -1.E-20 .AND. ZVART(JL, JV) > ICED%XRTMIN(JV)) THEN - ZMAXTIME(JL)=MIN(ZMAXTIME(JL), -(ZB(JL, JV)+ZVART(JL, JV))/ZA(JL, JV)) - ENDIF - ENDDO - ENDDO - - !We stop when the end of the timestep is reached - DO JL=1, IMICRO - IF (ZTIME(JL)+ZMAXTIME(JL) >= PTSTEP) THEN - LLCOMPUTE(JL)=.FALSE. - ENDIF - ENDDO - !We must recompute tendencies when the end of the sub-timestep is reached - IF (PARAMI%XTSTEP_TS/=0.) THEN - DO JL=1, IMICRO - IF ((IITER(JL) < INB_ITER_MAX) .AND. (ZTIME(JL)+ZMAXTIME(JL) > ZTIME_LASTCALL(JL)+ZTSTEP)) THEN - ZMAXTIME(JL)=ZTIME_LASTCALL(JL)-ZTIME(JL)+ZTSTEP - LLCOMPUTE(JL)=.FALSE. - ENDIF - ENDDO - ENDIF - - !We must recompute tendencies when the maximum allowed change is reached - !When a species is missing, only the external tendencies can be active and we do not want to recompute - !the microphysical tendencies when external tendencies are negative (results won't change because species was already missing) - IF (PARAMI%XMRSTEP/=0.) THEN - IF (LL_ANY_ITER) THEN - ! In this case we need to remember the initial mixing ratios used to compute the tendencies - ! because when mixing ratio has evolved more than a threshold, we must re-compute tendencies - ! Thus, at first iteration (ie when LLCPZ0RT=.TRUE.) we copy ZVART into Z0RT - DO JV=1,KRR - IF (LLCPZ0RT) Z0RT(1:IMICRO, JV)=ZVART(1:IMICRO, JV) - DO JL=1, IMICRO - IF (IITER(JL)<INB_ITER_MAX .AND. ABS(ZA(JL,JV))>1.E-20) THEN - ZTIME_THRESHOLD1D(JL)=(SIGN(1., ZA(JL, JV))*PARAMI%XMRSTEP+ & - &Z0RT(JL, JV)-ZVART(JL, JV)-ZB(JL, JV))/ZA(JL, JV) - ELSE - ZTIME_THRESHOLD1D(JL)=-1. - ENDIF - ENDDO - DO JL=1, IMICRO - IF (ZTIME_THRESHOLD1D(JL)>=0 .AND. ZTIME_THRESHOLD1D(JL)<ZMAXTIME(JL) .AND. & - &(ZVART(JL, JV)>ICED%XRTMIN(JV) .OR. ZA(JL, JV)>0.)) THEN - ZMAXTIME(JL)=MIN(ZMAXTIME(JL), ZTIME_THRESHOLD1D(JL)) - LLCOMPUTE(JL)=.FALSE. - ENDIF - ENDDO - ENDDO - LLCPZ0RT=.FALSE. -!$OMP SIMD - DO JL=1,IMICRO - ZMAXB(JL)=MAXVAL(ABS(ZB(JL,1:KRR))) - ENDDO - DO JL=1, IMICRO - IF (IITER(JL)<INB_ITER_MAX .AND. ZMAXB(JL)>PARAMI%XMRSTEP) THEN - ZMAXTIME(JL)=0. - LLCOMPUTE(JL)=.FALSE. - ENDIF - ENDDO - ENDIF ! LL_ANY_ITER - ENDIF ! XMRSTEP/=0. - ! - !*** 4.3 New values of variables for next iteration - ! - DO JV=0, KRR - DO JL=1, IMICRO - ZVART(JL, JV)=ZVART(JL, JV)+ZA(JL, JV)*ZMAXTIME(JL)+ZB(JL, JV) - ENDDO - ENDDO - DO JL=1, IMICRO -#ifdef REPRO55 - ZCIT(JL)=ZCIT(JL) * MAX(0., -SIGN(1., -ZVART(JL,IRI))) -#else - IF (ZVART(JL,IRI)<=0.) ZCIT(JL) = 0. -#endif - ZTIME(JL)=ZTIME(JL)+ZMAXTIME(JL) - ENDDO - - ! - !*** 4.4 Mixing ratio change due to each process - ! - IF(BUCONF%LBU_ENABLE) THEN - DO JL=1, IMICRO - ZTOT_RVHENI (JMICRO+JL-1)=ZTOT_RVHENI (JMICRO+JL-1)+ZRVHENI_MR(JL) - ZTOT_RCHONI (JMICRO+JL-1)=ZTOT_RCHONI (JMICRO+JL-1)+ZRCHONI (JL)*ZMAXTIME(JL) - ZTOT_RRHONG (JMICRO+JL-1)=ZTOT_RRHONG (JMICRO+JL-1)+ZRRHONG_MR(JL) - ZTOT_RVDEPS (JMICRO+JL-1)=ZTOT_RVDEPS (JMICRO+JL-1)+ZRVDEPS (JL)*ZMAXTIME(JL) - ZTOT_RIAGGS (JMICRO+JL-1)=ZTOT_RIAGGS (JMICRO+JL-1)+ZRIAGGS (JL)*ZMAXTIME(JL) - ZTOT_RIAUTS (JMICRO+JL-1)=ZTOT_RIAUTS (JMICRO+JL-1)+ZRIAUTS (JL)*ZMAXTIME(JL) - ZTOT_RVDEPG (JMICRO+JL-1)=ZTOT_RVDEPG (JMICRO+JL-1)+ZRVDEPG (JL)*ZMAXTIME(JL) - ZTOT_RCAUTR (JMICRO+JL-1)=ZTOT_RCAUTR (JMICRO+JL-1)+ZRCAUTR (JL)*ZMAXTIME(JL) - ZTOT_RCACCR (JMICRO+JL-1)=ZTOT_RCACCR (JMICRO+JL-1)+ZRCACCR (JL)*ZMAXTIME(JL) - ZTOT_RREVAV (JMICRO+JL-1)=ZTOT_RREVAV (JMICRO+JL-1)+ZRREVAV (JL)*ZMAXTIME(JL) - ZTOT_RCRIMSS(JMICRO+JL-1)=ZTOT_RCRIMSS(JMICRO+JL-1)+ZRCRIMSS (JL)*ZMAXTIME(JL) - ZTOT_RCRIMSG(JMICRO+JL-1)=ZTOT_RCRIMSG(JMICRO+JL-1)+ZRCRIMSG (JL)*ZMAXTIME(JL) - ZTOT_RSRIMCG(JMICRO+JL-1)=ZTOT_RSRIMCG(JMICRO+JL-1)+ZRSRIMCG (JL)*ZMAXTIME(JL)+ZRSRIMCG_MR(JL) - ZTOT_RRACCSS(JMICRO+JL-1)=ZTOT_RRACCSS(JMICRO+JL-1)+ZRRACCSS (JL)*ZMAXTIME(JL) - ZTOT_RRACCSG(JMICRO+JL-1)=ZTOT_RRACCSG(JMICRO+JL-1)+ZRRACCSG (JL)*ZMAXTIME(JL) - ZTOT_RSACCRG(JMICRO+JL-1)=ZTOT_RSACCRG(JMICRO+JL-1)+ZRSACCRG (JL)*ZMAXTIME(JL) - ZTOT_RSMLTG (JMICRO+JL-1)=ZTOT_RSMLTG (JMICRO+JL-1)+ZRSMLTG (JL)*ZMAXTIME(JL) - ZTOT_RCMLTSR(JMICRO+JL-1)=ZTOT_RCMLTSR(JMICRO+JL-1)+ZRCMLTSR (JL)*ZMAXTIME(JL) - ZTOT_RICFRRG(JMICRO+JL-1)=ZTOT_RICFRRG(JMICRO+JL-1)+ZRICFRRG (JL)*ZMAXTIME(JL) - ZTOT_RRCFRIG(JMICRO+JL-1)=ZTOT_RRCFRIG(JMICRO+JL-1)+ZRRCFRIG (JL)*ZMAXTIME(JL) - ZTOT_RICFRR (JMICRO+JL-1)=ZTOT_RICFRR (JMICRO+JL-1)+ZRICFRR (JL)*ZMAXTIME(JL) - ZTOT_RCWETG (JMICRO+JL-1)=ZTOT_RCWETG (JMICRO+JL-1)+ZRCWETG (JL)*ZMAXTIME(JL) - ZTOT_RIWETG (JMICRO+JL-1)=ZTOT_RIWETG (JMICRO+JL-1)+ZRIWETG (JL)*ZMAXTIME(JL) - ZTOT_RRWETG (JMICRO+JL-1)=ZTOT_RRWETG (JMICRO+JL-1)+ZRRWETG (JL)*ZMAXTIME(JL) - ZTOT_RSWETG (JMICRO+JL-1)=ZTOT_RSWETG (JMICRO+JL-1)+ZRSWETG (JL)*ZMAXTIME(JL) - ZTOT_RWETGH (JMICRO+JL-1)=ZTOT_RWETGH (JMICRO+JL-1)+ZRWETGH (JL)*ZMAXTIME(JL)+ZRWETGH_MR(JL) - ZTOT_RCDRYG (JMICRO+JL-1)=ZTOT_RCDRYG (JMICRO+JL-1)+ZRCDRYG (JL)*ZMAXTIME(JL) - ZTOT_RIDRYG (JMICRO+JL-1)=ZTOT_RIDRYG (JMICRO+JL-1)+ZRIDRYG (JL)*ZMAXTIME(JL) - ZTOT_RRDRYG (JMICRO+JL-1)=ZTOT_RRDRYG (JMICRO+JL-1)+ZRRDRYG (JL)*ZMAXTIME(JL) - ZTOT_RSDRYG (JMICRO+JL-1)=ZTOT_RSDRYG (JMICRO+JL-1)+ZRSDRYG (JL)*ZMAXTIME(JL) - ZTOT_RGMLTR (JMICRO+JL-1)=ZTOT_RGMLTR (JMICRO+JL-1)+ZRGMLTR (JL)*ZMAXTIME(JL) - ZTOT_RCWETH (JMICRO+JL-1)=ZTOT_RCWETH (JMICRO+JL-1)+ZRCWETH (JL)*ZMAXTIME(JL) - ZTOT_RIWETH (JMICRO+JL-1)=ZTOT_RIWETH (JMICRO+JL-1)+ZRIWETH (JL)*ZMAXTIME(JL) - ZTOT_RSWETH (JMICRO+JL-1)=ZTOT_RSWETH (JMICRO+JL-1)+ZRSWETH (JL)*ZMAXTIME(JL) - ZTOT_RGWETH (JMICRO+JL-1)=ZTOT_RGWETH (JMICRO+JL-1)+ZRGWETH (JL)*ZMAXTIME(JL) - ZTOT_RRWETH (JMICRO+JL-1)=ZTOT_RRWETH (JMICRO+JL-1)+ZRRWETH (JL)*ZMAXTIME(JL) - ZTOT_RCDRYH (JMICRO+JL-1)=ZTOT_RCDRYH (JMICRO+JL-1)+ZRCDRYH (JL)*ZMAXTIME(JL) - ZTOT_RIDRYH (JMICRO+JL-1)=ZTOT_RIDRYH (JMICRO+JL-1)+ZRIDRYH (JL)*ZMAXTIME(JL) - ZTOT_RSDRYH (JMICRO+JL-1)=ZTOT_RSDRYH (JMICRO+JL-1)+ZRSDRYH (JL)*ZMAXTIME(JL) - ZTOT_RRDRYH (JMICRO+JL-1)=ZTOT_RRDRYH (JMICRO+JL-1)+ZRRDRYH (JL)*ZMAXTIME(JL) - ZTOT_RGDRYH (JMICRO+JL-1)=ZTOT_RGDRYH (JMICRO+JL-1)+ZRGDRYH (JL)*ZMAXTIME(JL) - ZTOT_RDRYHG (JMICRO+JL-1)=ZTOT_RDRYHG (JMICRO+JL-1)+ZRDRYHG (JL)*ZMAXTIME(JL) - ZTOT_RHMLTR (JMICRO+JL-1)=ZTOT_RHMLTR (JMICRO+JL-1)+ZRHMLTR (JL)*ZMAXTIME(JL) - ZTOT_RIMLTC (JMICRO+JL-1)=ZTOT_RIMLTC (JMICRO+JL-1)+ZRIMLTC_MR(JL) - ZTOT_RCBERI (JMICRO+JL-1)=ZTOT_RCBERI (JMICRO+JL-1)+ZRCBERI (JL)*ZMAXTIME(JL) - ENDDO - ENDIF - ! - !*** 4.5 Next loop - ! - LSOFT=.TRUE. ! We try to adjust tendencies (inner while loop) - ENDDO - ENDDO - - IF(GEXT_TEND) THEN - !Z..T variables contain the external tendency, we substract it - DO JV=0, KRR - DO JL=1, IMICRO - ZVART(JL, JV) = ZVART(JL, JV) - ZEXTPK(JL, JV) * PTSTEP - ENDDO - ENDDO - ENDIF - -!------------------------------------------------------------------------------- -! -!* 5. UNPACKING DIAGNOSTICS -! --------------------- -! - DO JL=1, IMICRO - ZCITOUT (I1(JL),I2(JL))=ZCIT (JL) - IF(PARAMI%LWARM) THEN - PEVAP3D(I1(JL),I2(JL))=ZRREVAV(JL) - ENDIF - ZWR(I1(JL),I2(JL),IRV)=ZVART(JL, IRV) - ZWR(I1(JL),I2(JL),IRC)=ZVART(JL, IRC) - ZWR(I1(JL),I2(JL),IRR)=ZVART(JL, IRR) - ZWR(I1(JL),I2(JL),IRI)=ZVART(JL, IRI) - ZWR(I1(JL),I2(JL),IRS)=ZVART(JL, IRS) - ZWR(I1(JL),I2(JL),IRG)=ZVART(JL, IRG) - IF (KRR==7) THEN - ZWR(I1(JL),I2(JL),IRH)=ZVART(JL, IRH) - ENDIF - ENDDO - - ENDDO ! JMICRO -ENDIF ! KSIZE > 0 -PCIT(:,:)=ZCITOUT(:,:) - -!========================================================================================================== - - -! -!* 6. COMPUTES THE SLOW COLD PROCESS SOURCES OUTSIDE OF ODMICRO POINTS -! ---------------------------------------------------------------- +!* 4. COMPUTES THE SLOW COLD PROCESS SOURCES OUTSIDE OF LLMICRO POINTS +! ----------------------------------------------------------------- ! +!The nucelation must be call everywhere +!This call is for points outside of the LLMICR mask, another call is coded in ice4_tendencies LLW3D(:,:)=.FALSE. DO JK=IKTB,IKTE DO JIJ=IIJB,IIJE - IF (.NOT. ODMICRO(JIJ, JK)) THEN + IF (.NOT. LLMICRO(JIJ, JK)) THEN LLW3D(JIJ, JK)=.TRUE. ZW3D(JIJ, JK)=ZZ_LSFACT(JIJ, JK)/PEXN(JIJ, JK) +#ifdef REPRO55 +#else + PCIT(JIJ,JK)=0. !ri=0 because where are in the not odmicro case +#endif + ELSE LLW3D(JIJ, JK)=.FALSE. ENDIF @@ -1137,15 +440,59 @@ CALL ICE4_NUCLEATION(CST, PARAMI, ICEP, ICED, D%NIJT*D%NKT, LLW3D(:,:), & PTHT(:, :), PPABST(:, :), PRHODREF(:, :), & PEXN(:, :), ZW3D(:, :), ZT(:, :), & PRVT(:, :), & - PCIT(:, :), ZZ_RVHENI_MR(:, :)) + PCIT(:, :), ZZ_RVHENI(:, :)) +DO JK = IKTB, IKTE + DO JIJ=IIJB, IIJE + ZZ_RVHENI(JIJ,JK) = MIN(PRVS(JIJ,JK), ZZ_RVHENI(JIJ,JK)/PTSTEP) + ENDDO +ENDDO +! +! +!* 5. TENDENCIES COMPUTATION +! ---------------------- +! +IF(PARAMI%LPACK_MICRO) THEN + ISIZE=COUNT(LLMICRO) ! Number of points with active microphysics + !KPROMA is the requested size for cache_blocking loop + !IPROMA is the effective size + !This parameter must be computed here because it is used for array dimensioning in ice4_pack + IF (KPROMA > 0 .AND. ISIZE > 0) THEN + ! Cache-blocking is active + ! number of chunks : + IGPBLKS = (ISIZE-1)/MIN(KPROMA,ISIZE)+1 + ! Adjust IPROMA to limit the number of small chunks + IPROMA=(ISIZE-1)/IGPBLKS+1 + ELSE + IPROMA=ISIZE ! no cache-blocking + ENDIF + ISIZE2=IPROMA +ELSE + ISIZE=D%NIJT*D%NKT + IPROMA=0 + ISIZE2=ISIZE +ENDIF +!This part is put in another routine to separate pack/unpack operations from computations +CALL ICE4_PACK(D, CST, PARAMI, ICEP, ICED, BUCONF, & + IPROMA, ISIZE, ISIZE2, & + HSUBG_AUCV_RC, HSUBG_AUCV_RI, & + PTSTEP, KRR, LLMICRO, PEXN, & + PRHODJ, PRHODREF, PEXNREF, PPABST, PCIT, PCLDFR, & + PHLC_HRC, PHLC_HCF, PHLI_HRI, PHLI_HCF, & + PTHS, PRVS, PRCS, PRRS, PRIS, PRSS, PRGS, & + PEVAP3D, & + PRAINFR, PSIGS, & + ZZ_RVHENI, ZZ_LVFACT, ZZ_LSFACT, & + ZWR, & + TBUDGETS, KBUDGETS, & + PRHS ) ! !------------------------------------------------------------------------------- ! -!* 7. TOTAL TENDENCIES +!* 6. TOTAL TENDENCIES ! ---------------- ! ! -!*** 7.1 total tendencies limited by available species +!*** 6.1 total tendencies limited by available species ! DO JK = IKTB, IKTE DO CONCURRENT (JIJ=IIJB:IIJE) @@ -1153,10 +500,7 @@ DO JK = IKTB, IKTE ZZ_LSFACT(JIJ,JK)=ZZ_LSFACT(JIJ,JK)/PEXNREF(JIJ,JK) ZZ_LVFACT(JIJ,JK)=ZZ_LVFACT(JIJ,JK)/PEXNREF(JIJ,JK) - !Tendency dure to nucleation on non ODMICRO points - ZZ_RVHENI(JIJ,JK) = MIN(PRVS(JIJ,JK), ZZ_RVHENI_MR(JIJ,JK)/PTSTEP) - - !Hydrometeor tendencies is the difference between old state and new state (can be negative) + !Hydrometeor tendencies is the difference between new state and old state (can be negative) ZWR(JIJ,JK,IRV)=(ZWR(JIJ,JK,IRV)-PRVT(JIJ,JK))*ZINV_TSTEP ZWR(JIJ,JK,IRC)=(ZWR(JIJ,JK,IRC)-PRCT(JIJ,JK))*ZINV_TSTEP ZWR(JIJ,JK,IRR)=(ZWR(JIJ,JK,IRR)-PRRT(JIJ,JK))*ZINV_TSTEP @@ -1186,371 +530,20 @@ DO JK = IKTB, IKTE ENDIF ENDDO ENDDO - -! -!*** 7.2 LBU_ENABLE case +!------------------------------------------------------------------------------- ! -IF(BUCONF%LBU_ENABLE) THEN - IF (BUCONF%LBUDGET_TH) THEN - ZZ_DIFF(:,:)=0. - DO JK = IKTB, IKTE - DO JIJ = IIJB, IIJE - ZZ_DIFF(JIJ, JK) = ZZ_LSFACT(JIJ, JK) - ZZ_LVFACT(JIJ, JK) - ENDDO - ENDDO - END IF - - ZW(:,:) = 0. - DO JL=1, KSIZE - ZW(I1TOT(JL), I2TOT(JL)) = ZTOT_RVHENI(JL) * ZINV_TSTEP - END DO - DO JK = IKTB, IKTE - DO JIJ = IIJB, IIJE - ZW(JIJ,JK)=ZW(JIJ,JK)+ZZ_RVHENI(JIJ,JK) - ENDDO - ENDDO -#ifdef REPRO48 - IF (BUCONF%LBUDGET_TH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'HENU', ZW(:, :)*ZZ_LSFACT(:, :)*PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RV) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RV), 'HENU', -ZW(:, :) *PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'HENU', ZW(:, :) *PRHODJ(:, :)) -#else - IF (BUCONF%LBUDGET_TH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'HIN', ZW(:, :)*ZZ_LSFACT(:, :)*PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RV) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RV), 'HIN', -ZW(:, :) *PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'HIN', ZW(:, :) *PRHODJ(:, :)) -#endif - ZW(:,:) = 0. - DO JL=1, KSIZE - ZW(I1TOT(JL), I2TOT(JL)) = ZTOT_RCHONI(JL) * ZINV_TSTEP - END DO - IF (BUCONF%LBUDGET_TH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'HON', ZW(:, :)*ZZ_DIFF(:, :)*PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RC) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'HON', -ZW(:, :) *PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'HON', ZW(:, :) *PRHODJ(:, :)) - - ZW(:,:) = 0. - DO JL=1, KSIZE - ZW(I1TOT(JL), I2TOT(JL)) = ZTOT_RRHONG(JL) * ZINV_TSTEP - END DO - IF (BUCONF%LBUDGET_TH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'SFR', ZW(:, :)*ZZ_DIFF(:, :)*PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RR) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'SFR', -ZW(:, :) *PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'SFR', ZW(:, :) *PRHODJ(:, :)) - - ZW(:,:) = 0. - DO JL=1, KSIZE - ZW(I1TOT(JL), I2TOT(JL)) = ZTOT_RVDEPS(JL) * ZINV_TSTEP - END DO - IF (BUCONF%LBUDGET_TH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'DEPS', ZW(:, :)*ZZ_LSFACT(:, :)*PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RV) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RV), 'DEPS', -ZW(:, :) *PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RS) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'DEPS', ZW(:, :) *PRHODJ(:, :)) - - ZW(:,:) = 0. - DO JL=1, KSIZE - ZW(I1TOT(JL), I2TOT(JL)) = ZTOT_RIAGGS(JL) * ZINV_TSTEP - END DO - IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'AGGS', -ZW(:, :)*PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RS) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'AGGS', ZW(:, :)*PRHODJ(:, :)) - - ZW(:,:) = 0. - DO JL=1, KSIZE - ZW(I1TOT(JL), I2TOT(JL)) = ZTOT_RIAUTS(JL) * ZINV_TSTEP - END DO - IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'AUTS', -ZW(:, :)*PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RS) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'AUTS', ZW(:, :)*PRHODJ(:, :)) - - ZW(:,:) = 0. - DO JL=1, KSIZE - ZW(I1TOT(JL), I2TOT(JL)) = ZTOT_RVDEPG(JL) * ZINV_TSTEP - END DO - IF (BUCONF%LBUDGET_TH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'DEPG', ZW(:, :)*ZZ_LSFACT(:, :)*PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RV) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RV), 'DEPG', -ZW(:, :) *PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'DEPG', ZW(:, :) *PRHODJ(:, :)) - - IF(PARAMI%LWARM) THEN - ZW(:,:) = 0. - DO JL=1, KSIZE - ZW(I1TOT(JL), I2TOT(JL)) = ZTOT_RCAUTR(JL) * ZINV_TSTEP - END DO - IF (BUCONF%LBUDGET_RC) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'AUTO', -ZW(:, :)*PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RR) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'AUTO', ZW(:, :)*PRHODJ(:, :)) - - ZW(:,:) = 0. - DO JL=1, KSIZE - ZW(I1TOT(JL), I2TOT(JL)) = ZTOT_RCACCR(JL) * ZINV_TSTEP - END DO - IF (BUCONF%LBUDGET_RC) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'ACCR', -ZW(:, :)*PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RR) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'ACCR', ZW(:, :)*PRHODJ(:, :)) - - ZW(:,:) = 0. - DO JL=1, KSIZE - ZW(I1TOT(JL), I2TOT(JL)) = ZTOT_RREVAV(JL) * ZINV_TSTEP - END DO - IF (BUCONF%LBUDGET_TH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'REVA', -ZW(:, :)*ZZ_LVFACT(:, :)*PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RV) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RV), 'REVA', ZW(:, :) *PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RR) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'REVA', -ZW(:, :) *PRHODJ(:, :)) - ENDIF - - ZW1(:,:) = 0. - DO JL=1, KSIZE - ZW1(I1TOT(JL), I2TOT(JL)) = ZTOT_RCRIMSS(JL) * ZINV_TSTEP - END DO - ZW2(:,:) = 0. - DO JL=1, KSIZE - ZW2(I1TOT(JL), I2TOT(JL)) = ZTOT_RCRIMSG(JL) * ZINV_TSTEP - END DO - ZW3(:,:) = 0. - DO JL=1, KSIZE - ZW3(I1TOT(JL), I2TOT(JL)) = ZTOT_RSRIMCG(JL) * ZINV_TSTEP - END DO - IF (BUCONF%LBUDGET_TH) & - CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'RIM', (ZW1(:, :)+ZW2(:, :))*ZZ_DIFF(:, :)*PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RC) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'RIM', (-ZW1(:, :)-ZW2(:, :))*PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RS) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'RIM', ( ZW1(:, :)-ZW3(:, :))*PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'RIM', ( ZW2(:, :)+ZW3(:, :))*PRHODJ(:, :)) - - ZW1(:,:) = 0. - DO JL=1, KSIZE - ZW1(I1TOT(JL), I2TOT(JL)) = ZTOT_RRACCSS(JL) * ZINV_TSTEP - END DO - ZW2(:,:) = 0. - DO JL=1, KSIZE - ZW2(I1TOT(JL), I2TOT(JL)) = ZTOT_RRACCSG(JL) * ZINV_TSTEP - END DO - ZW3(:,:) = 0. - DO JL=1, KSIZE - ZW3(I1TOT(JL), I2TOT(JL)) = ZTOT_RSACCRG(JL) * ZINV_TSTEP - END DO - IF (BUCONF%LBUDGET_TH) & - CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'ACC', (ZW1(:, :)+ZW2(:, :) )*ZZ_DIFF(:, :)*PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RR) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'ACC', (-ZW1(:, :)-ZW2(:, :))*PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RS) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'ACC', ( ZW1(:, :)-ZW3(:, :))*PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'ACC', ( ZW2(:, :)+ZW3(:, :))*PRHODJ(:, :)) - - ZW(:,:) = 0. - DO JL=1, KSIZE - ZW(I1TOT(JL), I2TOT(JL)) = ZTOT_RSMLTG(JL) * ZINV_TSTEP - END DO - IF (BUCONF%LBUDGET_RS) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'CMEL', -ZW(:, :)*PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'CMEL', ZW(:, :)*PRHODJ(:, :)) - ZW(:,:) = 0. - DO JL=1, KSIZE - ZW(I1TOT(JL), I2TOT(JL)) = ZTOT_RCMLTSR(JL) * ZINV_TSTEP - END DO - IF (BUCONF%LBUDGET_RC) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'CMEL', -ZW(:, :)*PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RR) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'CMEL', ZW(:, :)*PRHODJ(:, :)) - - ZW1(:,:) = 0. - DO JL=1, KSIZE - ZW1(I1TOT(JL), I2TOT(JL)) = ZTOT_RICFRRG(JL) * ZINV_TSTEP - END DO - ZW2(:,:) = 0. - DO JL=1, KSIZE - ZW2(I1TOT(JL), I2TOT(JL)) = ZTOT_RRCFRIG(JL) * ZINV_TSTEP - END DO - ZW3(:,:) = 0. - DO JL=1, KSIZE - ZW3(I1TOT(JL), I2TOT(JL)) = ZTOT_RICFRR(JL) * ZINV_TSTEP - END DO - IF (BUCONF%LBUDGET_TH) & - CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'CFRZ', ZW2(:, :)*ZZ_DIFF(:, :)*PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RR) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'CFRZ', (-ZW2(:, :)+ZW3(:, :))*PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'CFRZ', (-ZW1(:, :)-ZW3(:, :))*PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'CFRZ', ( ZW1(:, :)+ZW2(:, :))*PRHODJ(:, :)) - - ZW1(:,:) = 0. - DO JL=1, KSIZE - ZW1(I1TOT(JL), I2TOT(JL)) = ZTOT_RCWETG(JL) * ZINV_TSTEP - END DO - ZW2(:,:) = 0. - DO JL=1, KSIZE - ZW2(I1TOT(JL), I2TOT(JL)) = ZTOT_RRWETG(JL) * ZINV_TSTEP - END DO - ZW3(:,:) = 0. - DO JL=1, KSIZE - ZW3(I1TOT(JL), I2TOT(JL)) = ZTOT_RIWETG(JL) * ZINV_TSTEP - END DO - ZW4(:,:) = 0. - DO JL=1, KSIZE - ZW4(I1TOT(JL), I2TOT(JL)) = ZTOT_RSWETG(JL) * ZINV_TSTEP - END DO - IF (BUCONF%LBUDGET_TH) & - CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'WETG', (ZW1(:, :)+ZW2(:, :))*ZZ_DIFF(:, :)*PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RC) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'WETG', -ZW1(:, :) *PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RR) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'WETG', -ZW2(:, :) *PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'WETG', -ZW3(:, :) *PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RS) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'WETG', -ZW4(:, :) *PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'WETG', (ZW1(:, :)+ZW2(:, :)+ZW3(:, :)+ZW4(:, :)) & - & *PRHODJ(:, :)) - - IF(KRR==7) THEN - ZW(:,:) = 0. - DO JL=1, KSIZE - ZW(I1TOT(JL), I2TOT(JL)) = ZTOT_RWETGH(JL) * ZINV_TSTEP - END DO - IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'GHCV', -ZW(:, :)*PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RH), 'GHCV', ZW(:, :)*PRHODJ(:, :)) - END IF - - ZW1(:,:) = 0. - DO JL=1, KSIZE - ZW1(I1TOT(JL), I2TOT(JL)) = ZTOT_RCDRYG(JL) * ZINV_TSTEP - END DO - ZW2(:,:) = 0. - DO JL=1, KSIZE - ZW2(I1TOT(JL), I2TOT(JL)) = ZTOT_RRDRYG(JL) * ZINV_TSTEP - END DO - ZW3(:,:) = 0. - DO JL=1, KSIZE - ZW3(I1TOT(JL), I2TOT(JL)) = ZTOT_RIDRYG(JL) * ZINV_TSTEP - END DO - ZW4(:,:) = 0. - DO JL=1, KSIZE - ZW4(I1TOT(JL), I2TOT(JL)) = ZTOT_RSDRYG(JL) * ZINV_TSTEP - END DO - IF (BUCONF%LBUDGET_TH) & - CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'DRYG', (ZW1(:, :)+ZW2(:, :) )*ZZ_DIFF(:, :)*PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RC) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'DRYG', -ZW1(:, :) *PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RR) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'DRYG', -ZW2(:, :) *PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'DRYG', -ZW3(:, :) *PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RS) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'DRYG', -ZW4(:, :) *PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'DRYG', (ZW1(:, :)+ZW2(:, :)+ZW3(:, :)+ZW4(:, :)) & - & *PRHODJ(:, :)) - - ZW(:,:) = 0. - DO JL=1, KSIZE - ZW(I1TOT(JL), I2TOT(JL)) = ZTOT_RGMLTR(JL) * ZINV_TSTEP - END DO - IF (BUCONF%LBUDGET_TH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'GMLT', -ZW(:, :)*ZZ_DIFF(:, :)*PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RR) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'GMLT', ZW(:, :) *PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'GMLT', -ZW(:, :) *PRHODJ(:, :)) - - IF(KRR==7) THEN - ZW1(:,:) = 0. - DO JL=1, KSIZE - ZW1(I1TOT(JL), I2TOT(JL)) = ZTOT_RCWETH(JL) * ZINV_TSTEP - END DO - ZW2(:,:) = 0. - DO JL=1, KSIZE - ZW2(I1TOT(JL), I2TOT(JL)) = ZTOT_RRWETH(JL) * ZINV_TSTEP - END DO - ZW3(:,:) = 0. - DO JL=1, KSIZE - ZW3(I1TOT(JL), I2TOT(JL)) = ZTOT_RIWETH(JL) * ZINV_TSTEP - END DO - ZW4(:,:) = 0. - DO JL=1, KSIZE - ZW4(I1TOT(JL), I2TOT(JL)) = ZTOT_RSWETH(JL) * ZINV_TSTEP - END DO - ZW5(:,:) = 0. - DO JL=1, KSIZE - ZW5(I1TOT(JL), I2TOT(JL)) = ZTOT_RGWETH(JL) * ZINV_TSTEP - END DO - IF (BUCONF%LBUDGET_TH) & - CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'WETH', (ZW1(:, :)+ZW2(:, :))*ZZ_DIFF(:, :)*PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RC) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'WETH', -ZW1(:, :) *PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RR) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'WETH', -ZW2(:, :) *PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'WETH', -ZW3(:, :) *PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RS) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'WETH', -ZW4(:, :) *PRHODJ(:, :)) -#ifdef REPRO48 -#else - IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'WETH', -ZW5(:, :) *PRHODJ(:, :)) -#endif - IF (BUCONF%LBUDGET_RH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RH), 'WETH', (ZW1(:, :)+ZW2(:, :)+ZW3(:, :)+ & - &ZW4(:, :)+ZW5(:, : )) *PRHODJ(:, :)) - -#if defined(REPRO48) || defined(REPRO55) - ZW(:,:) = 0. - DO JL=1, KSIZE - ZW(I1TOT(JL), I2TOT(JL)) = ZTOT_RGWETH(JL) * ZINV_TSTEP - END DO -#endif -#ifdef REPRO48 - IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'HGCV', (-ZW5(:, :)-ZW(:, :))*PRHODJ(:, :)) -#endif -#ifdef REPRO55 - IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'HGCV', -ZW(:, :)*PRHODJ(:, :)) -#endif -#if defined(REPRO48) || defined(REPRO55) - IF (BUCONF%LBUDGET_RH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RH), 'HGCV', ZW(:, :)*PRHODJ(:, :)) -#endif - - ZW1(:,:) = 0. - DO JL=1, KSIZE - ZW1(I1TOT(JL), I2TOT(JL)) = ZTOT_RCDRYH(JL) * ZINV_TSTEP - END DO - ZW2(:,:) = 0. - DO JL=1, KSIZE - ZW2(I1TOT(JL), I2TOT(JL)) = ZTOT_RRDRYH(JL) * ZINV_TSTEP - END DO - ZW3(:,:) = 0. - DO JL=1, KSIZE - ZW3(I1TOT(JL), I2TOT(JL)) = ZTOT_RIDRYH(JL) * ZINV_TSTEP - END DO - ZW4(:,:) = 0. - DO JL=1, KSIZE - ZW4(I1TOT(JL), I2TOT(JL)) = ZTOT_RSDRYH(JL) * ZINV_TSTEP - END DO - ZW5(:,:) = 0. - DO JL=1, KSIZE - ZW5(I1TOT(JL), I2TOT(JL)) = ZTOT_RGDRYH(JL) * ZINV_TSTEP - END DO - ZW6(:,:) = 0. -#if defined(REPRO48) || defined(REPRO55) - !ZW6 must be removed when REPRO* will be suppressed - DO JL=1, KSIZE - ZW6(I1TOT(JL), I2TOT(JL)) = ZTOT_RDRYHG(JL) * ZINV_TSTEP - END DO -#endif - IF (BUCONF%LBUDGET_TH) & - CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'DRYH', (ZW1(:, :)+ZW2(:, :))*ZZ_DIFF(:, :)*PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RC) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'DRYH', -ZW1(:, :) *PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RR) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'DRYH', -ZW2(:, :) *PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'DRYH', -ZW3(:, :) *PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RS) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RS), 'DRYH', -ZW4(:, :) *PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'DRYH', (-ZW5(:, :)+ZW6(:, :)) *PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RH), 'DRYH', (ZW1(:, :)+ZW2(:, :)+ZW3(:, :)+ & - &ZW4(:, :)+ZW5(:, :)-ZW6(:, :)) & - & *PRHODJ(:, :)) - -#if defined(REPRO48) || defined(REPRO55) -#else - !When REPRO48 will be suppressed, ZW6 must be removed - ZW(:,:) = 0. - DO JL=1, KSIZE - ZW(I1TOT(JL), I2TOT(JL)) = ZTOT_RDRYHG(JL) * ZINV_TSTEP - END DO - IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RG), 'HGCV', -ZW(:, :)*PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RH), 'HGCV', ZW(:, :)*PRHODJ(:, :)) -#endif - - ZW(:,:) = 0. - DO JL=1, KSIZE - ZW(I1TOT(JL), I2TOT(JL)) = ZTOT_RHMLTR(JL) * ZINV_TSTEP - END DO - IF (BUCONF%LBUDGET_TH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'HMLT', -ZW(:, :)*ZZ_DIFF(:, :)*PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RR) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RR), 'HMLT', ZW(:, :) *PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RH), 'HMLT', -ZW(:, :) *PRHODJ(:, :)) - ENDIF - - ZW(:,:) = 0. - DO JL=1, KSIZE - ZW(I1TOT(JL), I2TOT(JL)) = ZTOT_RIMLTC(JL) * ZINV_TSTEP - END DO - IF (BUCONF%LBUDGET_TH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'IMLT', -ZW(:, :)*ZZ_DIFF(:, :)*PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RC) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'IMLT', ZW(:, :) *PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'IMLT', -ZW(:, :) *PRHODJ(:, :)) - - ZW(:,:) = 0. - DO JL=1, KSIZE - ZW(I1TOT(JL), I2TOT(JL)) = ZTOT_RCBERI(JL) * ZINV_TSTEP - END DO - IF (BUCONF%LBUDGET_TH) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_TH), 'BERFI', ZW(:, :)*ZZ_DIFF(:, :)*PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RC) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RC), 'BERFI', -ZW(:, :) *PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_ADD_PHY(D, TBUDGETS(NBUDGET_RI), 'BERFI', ZW(:, :) *PRHODJ(:, :)) - -ENDIF +!*** 6.2 Negative corrections ! -!*** 7.3 Final tendencies +!NOTE: +! This call cannot be moved before the preeceding budget calls because, +! with AROME, the BUDGET_STORE_INIT does nothing. The equivalent is done only +! once before the physics call and copies of the S variables evolve automatically +! internally to the budget (DDH) machinery at each BUDGET_STORE_ADD and +! BUDGET_STORE_END calls. Thus, the difference between the DDH internal version +! of the S variables and the S variables used in the folowing BUDGET_STORE_END +! call must only be due to the correction of negativities. ! -IF (BUCONF%LBU_ENABLE) THEN +IF(BUCONF%LBU_ENABLE) THEN IF (BUCONF%LBUDGET_TH) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_TH), 'CORR', PTHS(:, :)*PRHODJ(:, :)) IF (BUCONF%LBUDGET_RV) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RV), 'CORR', PRVS(:, :)*PRHODJ(:, :)) IF (BUCONF%LBUDGET_RC) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RC), 'CORR', PRCS(:, :)*PRHODJ(:, :)) @@ -1561,19 +554,10 @@ IF (BUCONF%LBU_ENABLE) THEN IF (BUCONF%LBUDGET_RH .AND. KRR==7) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RH), 'CORR', PRHS(:, :)*PRHODJ(:, :)) END IF -!NOTE: -! This call cannot be moved before the preeceding budget calls because, -! with AROME, the BUDGET_STORE_INIT does nothing. The equivalent is done only -! once before the physics call and copies of the S variables evolve automatically -! internally to the budget (DDH) machinery at each BUDGET_STORE_ADD and -! BUDGET_STORE_END calls. Thus, the difference between the DDH internal version -! of the S variables and the S variables used in the folowing BUDGET_STORE_END -! call must only be due to the correction of negativities. -! !We correct negativities with conservation -CALL CORRECT_NEGATIVITIES(D, KRR, PRVS, PRCS, PRRS, & - &PRIS, PRSS, PRGS, & - &PTHS, ZZ_LVFACT, ZZ_LSFACT, PRHS) +CALL ICE4_CORRECT_NEGATIVITIES(D, ICED, KRR, PRVS, PRCS, PRRS, & + &PRIS, PRSS, PRGS, & + &PTHS, ZZ_LVFACT, ZZ_LSFACT, PRHS) IF (BUCONF%LBU_ENABLE) THEN IF (BUCONF%LBUDGET_TH) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_TH), 'CORR', PTHS(:, :)*PRHODJ(:, :)) @@ -1588,122 +572,42 @@ END IF ! !------------------------------------------------------------------------------- ! -!* 8. COMPUTE THE SEDIMENTATION (RS) SOURCE +!* 7. COMPUTE THE SEDIMENTATION (RS) SOURCE ! ------------------------------------- ! IF(PARAMI%LSEDIM_AFTER) THEN - ! - !* 8.1 sedimentation - ! - IF (BUCONF%LBUDGET_RC .AND. PARAMI%LSEDIC) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RC), 'SEDI', PRCS(:, :) * PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RR) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RR), 'SEDI', PRRS(:, :) * PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RI), 'SEDI', PRIS(:, :) * PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RS) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RS), 'SEDI', PRSS(:, :) * PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RG), 'SEDI', PRGS(:, :) * PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RH .AND. KRR==7) CALL BUDGET_STORE_INIT_PHY(D, TBUDGETS(NBUDGET_RH), 'SEDI', PRHS(:, :) * PRHODJ(:, :)) - - IF(PARAMI%CSEDIM=='STAT') THEN - IF (KRR==7) THEN - DO JK = IKTB,IKTE - DO JIJ = IIJB,IIJE - ZRCT(JIJ,JK)=PRCS(JIJ,JK)*PTSTEP - ZRRT(JIJ,JK)=PRRS(JIJ,JK)*PTSTEP - ZRIT(JIJ,JK)=PRIS(JIJ,JK)*PTSTEP - ZRST(JIJ,JK)=PRSS(JIJ,JK)*PTSTEP - ZRGT(JIJ,JK)=PRGS(JIJ,JK)*PTSTEP - ZRHT(JIJ,JK)=PRHS(JIJ,JK)*PTSTEP - ENDDO - ENDDO - CALL ICE4_SEDIMENTATION_STAT(D, CST, ICEP, ICED, & - &PTSTEP, KRR, PARAMI%LSEDIC, PDZZ, & - &PRHODREF, PPABST, PTHT, PRHODJ, & - &ZLBDAS, & - &PRCS, ZRCT, PRRS, ZRRT, PRIS, ZRIT,& - &PRSS, ZRST, PRGS, ZRGT,& - &PINPRC, PINPRR, ZINPRI, PINPRS, PINPRG, & - &PSEA=PSEA, PTOWN=PTOWN, & - &PINPRH=PINPRH, PRHT=ZRHT, PRHS=PRHS, PFPR=PFPR) - ELSE - DO JK = IKTB,IKTE - DO JIJ = IIJB,IIJE - ZRCT(JIJ,JK)=PRCS(JIJ,JK)*PTSTEP - ZRRT(JIJ,JK)=PRRS(JIJ,JK)*PTSTEP - ZRIT(JIJ,JK)=PRIS(JIJ,JK)*PTSTEP - ZRST(JIJ,JK)=PRSS(JIJ,JK)*PTSTEP - ZRGT(JIJ,JK)=PRGS(JIJ,JK)*PTSTEP - ENDDO - ENDDO - CALL ICE4_SEDIMENTATION_STAT(D, CST, ICEP, ICED, & - &PTSTEP, KRR, PARAMI%LSEDIC, PDZZ, & - &PRHODREF, PPABST, PTHT, PRHODJ, & - &ZLBDAS, & - &PRCS, ZRCT, PRRS, ZRRT, PRIS, ZRIT,& - &PRSS, ZRST, PRGS, ZRGT,& - &PINPRC, PINPRR, ZINPRI, PINPRS, PINPRG, & - &PSEA=PSEA, PTOWN=PTOWN, & - &PFPR=PFPR) - ENDIF - PINPRS(IIJB:IIJE) = PINPRS(IIJB:IIJE) + ZINPRI(IIJB:IIJE) - !No negativity correction here as we apply sedimentation on PR.S*PTSTEP variables - ELSEIF(PARAMI%CSEDIM=='SPLI') THEN - !SR: It *seems* that we must have two separate calls for ifort - IF(KRR==7) THEN - CALL ICE4_SEDIMENTATION_SPLIT(D, CST, ICEP, ICED, PARAMI, & - &PTSTEP, KRR, PDZZ, & - &PRHODREF, PPABST, PTHT, ZT, PRHODJ, & - &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& - &PINPRC, PINPRR, ZINPRI, PINPRS, PINPRG, & - &PSEA=PSEA, PTOWN=PTOWN, & - &PINPRH=PINPRH, PRHT=PRHT, PRHS=PRHS, PFPR=PFPR) - ELSE - CALL ICE4_SEDIMENTATION_SPLIT(D, CST, ICEP, ICED, PARAMI, & - &PTSTEP, KRR, PDZZ, & - &PRHODREF, PPABST, PTHT, ZT, PRHODJ, & - &PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& - &PINPRC, PINPRR, ZINPRI, PINPRS, PINPRG, & - &PSEA=PSEA, PTOWN=PTOWN, & - &PFPR=PFPR) - ENDIF - PINPRS(IIJB:IIJE) = PINPRS(IIJB:IIJE) + ZINPRI(IIJB:IIJE) - !We correct negativities with conservation - !SPLI algorith uses a time-splitting. Inside the loop a temporary m.r. is used. - ! It is initialized with the m.r. at T and is modified by two tendencies: - ! sedimentation tendency and an external tendency which represents all other - ! processes (mainly advection and microphysical processes). If both tendencies - ! are negative, sedimentation can remove a species at a given sub-timestep. From - ! this point sedimentation stops for the remaining sub-timesteps but the other tendency - ! will be still active and will lead to negative values. - ! We could prevent the algorithm to not consume too much a species, instead we apply - ! a correction here. - CALL CORRECT_NEGATIVITIES(D, KRR, PRVS, PRCS, PRRS, & - &PRIS, PRSS, PRGS, & - &PTHS, ZZ_LVFACT, ZZ_LSFACT, PRHS) - ELSE - CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'RAIN_ICE', 'no sedimentation scheme for PARAMI%CSEDIM='//PARAMI%CSEDIM) - END IF - ! - !* 8.2 budget storage - ! - IF (BUCONF%LBUDGET_RC .AND. PARAMI%LSEDIC) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RC), 'SEDI', PRCS(:, :) * PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RR) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RR), 'SEDI', PRRS(:, :) * PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RI) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RI), 'SEDI', PRIS(:, :) * PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RS) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RS), 'SEDI', PRSS(:, :) * PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RG) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RG), 'SEDI', PRGS(:, :) * PRHODJ(:, :)) - IF (BUCONF%LBUDGET_RH .AND. KRR==7) CALL BUDGET_STORE_END_PHY(D, TBUDGETS(NBUDGET_RH), 'SEDI', PRHS(:, :) * PRHODJ(:, :)) + CALL ICE4_SEDIMENTATION(D, CST, ICEP, ICED, PARAMI, BUCONF, & + &PTSTEP, KRR, PDZZ, & + &ZZ_LVFACT, ZZ_LSFACT, PRHODREF, PPABST, PTHT, ZT, PRHODJ, & + &PTHS, PRVS, PRCS, PRCT, PRRS, PRRT, PRIS, PRIT, PRSS, PRST, PRGS, PRGT,& + &PINPRC, PINPRR, PINPRS, PINPRG, & + &TBUDGETS, KBUDGETS, & + &PSEA=PSEA, PTOWN=PTOWN, & + &PINPRH=PINPRH, PRHT=PRHT, PRHS=PRHS, PFPR=PFPR) !"sedimentation" of rain fraction + DO JK = IKTB, IKTE + DO JIJ=IIJB,IIJE + ZWR(JIJ,JK,IRR)=PRRS(JIJ,JK)*PTSTEP + ZWR(JIJ,JK,IRS)=PRSS(JIJ,JK)*PTSTEP + ZWR(JIJ,JK,IRG)=PRGS(JIJ,JK)*PTSTEP + IF(KRR==7) THEN + ZWR(JIJ,JK,IRH)=PRHS(JIJ,JK)*PTSTEP + ENDIF + ENDDO + ENDDO IF (PRESENT(PRHS)) THEN - CALL ICE4_RAINFR_VERT(D, ICED, PRAINFR, PRRS(:,:)*PTSTEP, & - &PRSS(:,:)*PTSTEP, PRGS(:,:)*PTSTEP, PRHS(:,:)*PTSTEP) + CALL ICE4_RAINFR_VERT(D, ICED, PRAINFR, ZWR(:,:,IRR), & + &ZWR(:,:,IRS), ZWR(:,:,IRG), ZWR(:,:,IRH)) ELSE - CALL ICE4_RAINFR_VERT(D, ICED, PRAINFR, PRRS(:,:)*PTSTEP, & - &PRSS(:,:)*PTSTEP, PRGS(:,:)*PTSTEP) + CALL ICE4_RAINFR_VERT(D, ICED, PRAINFR, ZWR(:,:,IRR), & + &ZWR(:,:,IRS), ZWR(:,:,IRG)) ENDIF ENDIF ! !------------------------------------------------------------------------------- ! -!* 9. COMPUTE THE FOG DEPOSITION TERM +!* 8. COMPUTE THE FOG DEPOSITION TERM ! ------------------------------------- ! IF (PARAMI%LDEPOSC) THEN !cloud water deposition on vegetation @@ -1724,103 +628,4 @@ ENDIF IF (LHOOK) CALL DR_HOOK('RAIN_ICE', 1, ZHOOK_HANDLE) ! -CONTAINS - ! - SUBROUTINE CORRECT_NEGATIVITIES(D, KRR, PRV, PRC, PRR, & - &PRI, PRS, PRG, & - &PTH, PLVFACT, PLSFACT, PRH) - ! - IMPLICIT NONE - ! - TYPE(DIMPHYEX_t), INTENT(IN) :: D - INTEGER, INTENT(IN) :: KRR - REAL, DIMENSION(D%NIJT, D%NKT), INTENT(INOUT) :: PRV, PRC, PRR, PRI, PRS, PRG, PTH - REAL, DIMENSION(D%NIJT, D%NKT), INTENT(IN) :: PLVFACT, PLSFACT - REAL, DIMENSION(D%NIJT, D%NKT), OPTIONAL, INTENT(INOUT) :: PRH - ! - REAL :: ZW - INTEGER :: JIJ, JK - REAL(KIND=JPRB) :: ZHOOK_HANDLE - ! - IF (LHOOK) CALL DR_HOOK('RAIN_ICE:CORRECT_NEGATIVITIES', 0, ZHOOK_HANDLE) - ! - !We correct negativities with conservation - DO JK = IKTB, IKTE - DO JIJ = IIJB, IIJE - ! 1) deal with negative values for mixing ratio, except for vapor - ZW =PRC(JIJ,JK)-MAX(PRC(JIJ,JK), 0.) - PRV(JIJ,JK)=PRV(JIJ,JK)+ZW - PTH(JIJ,JK)=PTH(JIJ,JK)-ZW*PLVFACT(JIJ,JK) - PRC(JIJ,JK)=PRC(JIJ,JK)-ZW - - ZW =PRR(JIJ,JK)-MAX(PRR(JIJ,JK), 0.) - PRV(JIJ,JK)=PRV(JIJ,JK)+ZW - PTH(JIJ,JK)=PTH(JIJ,JK)-ZW*PLVFACT(JIJ,JK) - PRR(JIJ,JK)=PRR(JIJ,JK)-ZW - - ZW =PRI(JIJ,JK)-MAX(PRI(JIJ,JK), 0.) - PRV(JIJ,JK)=PRV(JIJ,JK)+ZW - PTH(JIJ,JK)=PTH(JIJ,JK)-ZW*PLSFACT(JIJ,JK) - PRI(JIJ,JK)=PRI(JIJ,JK)-ZW - - ZW =PRS(JIJ,JK)-MAX(PRS(JIJ,JK), 0.) - PRV(JIJ,JK)=PRV(JIJ,JK)+ZW - PTH(JIJ,JK)=PTH(JIJ,JK)-ZW*PLSFACT(JIJ,JK) - PRS(JIJ,JK)=PRS(JIJ,JK)-ZW - - ZW =PRG(JIJ,JK)-MAX(PRG(JIJ,JK), 0.) - PRV(JIJ,JK)=PRV(JIJ,JK)+ZW - PTH(JIJ,JK)=PTH(JIJ,JK)-ZW*PLSFACT(JIJ,JK) - PRG(JIJ,JK)=PRG(JIJ,JK)-ZW - - IF(KRR==7) THEN - ZW =PRH(JIJ,JK)-MAX(PRH(JIJ,JK), 0.) - PRV(JIJ,JK)=PRV(JIJ,JK)+ZW - PTH(JIJ,JK)=PTH(JIJ,JK)-ZW*PLSFACT(JIJ,JK) - PRH(JIJ,JK)=PRH(JIJ,JK)-ZW - ENDIF - - ! 2) deal with negative vapor mixing ratio - - ! for rc and ri, we keep ice fraction constant - ZW=MIN(1., MAX(ICED%XRTMIN(1)-PRV(JIJ,JK), 0.) / & - &MAX(PRC(JIJ,JK)+PRI(JIJ,JK), 1.E-20)) ! Proportion of rc+ri to convert into rv - PTH(JIJ,JK)=PTH(JIJ,JK)-ZW* & - &(PRC(JIJ,JK)*PLVFACT(JIJ,JK)+PRI(JIJ,JK)*PLSFACT(JIJ,JK)) - PRV(JIJ,JK)=PRV(JIJ,JK)+ZW*(PRC(JIJ,JK)+PRI(JIJ,JK)) - PRC(JIJ,JK)=(1.-ZW)*PRC(JIJ,JK) - PRI(JIJ,JK)=(1.-ZW)*PRI(JIJ,JK) - - ZW=MIN(MAX(PRR(JIJ,JK), 0.), & - &MAX(ICED%XRTMIN(1)-PRV(JIJ,JK), 0.)) ! Quantity of rr to convert into rv - PRV(JIJ,JK)=PRV(JIJ,JK)+ZW - PRR(JIJ,JK)=PRR(JIJ,JK)-ZW - PTH(JIJ,JK)=PTH(JIJ,JK)-ZW*PLVFACT(JIJ,JK) - - ZW=MIN(MAX(PRS(JIJ,JK), 0.), & - &MAX(ICED%XRTMIN(1)-PRV(JIJ,JK), 0.)) ! Quantity of rs to convert into rv - PRV(JIJ,JK)=PRV(JIJ,JK)+ZW - PRS(JIJ,JK)=PRS(JIJ,JK)-ZW - PTH(JIJ,JK)=PTH(JIJ,JK)-ZW*PLSFACT(JIJ,JK) - - ZW=MIN(MAX(PRG(JIJ,JK), 0.), & - &MAX(ICED%XRTMIN(1)-PRV(JIJ,JK), 0.)) ! Quantity of rg to convert into rv - PRV(JIJ,JK)=PRV(JIJ,JK)+ZW - PRG(JIJ,JK)=PRG(JIJ,JK)-ZW - PTH(JIJ,JK)=PTH(JIJ,JK)-ZW*PLSFACT(JIJ,JK) - - IF(KRR==7) THEN - ZW=MIN(MAX(PRH(JIJ,JK), 0.), & - &MAX(ICED%XRTMIN(1)-PRV(JIJ,JK), 0.)) ! Quantity of rh to convert into rv - PRV(JIJ,JK)=PRV(JIJ,JK)+ZW - PRH(JIJ,JK)=PRH(JIJ,JK)-ZW - PTH(JIJ,JK)=PTH(JIJ,JK)-ZW*PLSFACT(JIJ,JK) - ENDIF - ENDDO - ENDDO - ! - IF (LHOOK) CALL DR_HOOK('RAIN_ICE:CORRECT_NEGATIVITIES', 1, ZHOOK_HANDLE) - ! - END SUBROUTINE CORRECT_NEGATIVITIES -! END SUBROUTINE RAIN_ICE diff --git a/src/PHYEX/turb/mode_turb_ver.f90 b/src/PHYEX/turb/mode_turb_ver.f90 index 9cc0ef405d29fc3304612ef0d308c516265045ef..b014aa191d35db68f45b60b86ade811c2159ec3e 100644 --- a/src/PHYEX/turb/mode_turb_ver.f90 +++ b/src/PHYEX/turb/mode_turb_ver.f90 @@ -10,7 +10,7 @@ SUBROUTINE TURB_VER(D,CST,CSTURB,TURBN,TLES,KRR,KRRL,KRRI,KGRADIENTS,& OOCEAN,ODEEPOC,OCOMPUTE_SRC, & KSV,KSV_LGBEG,KSV_LGEND, & PEXPL, HPROGRAM, O2D, ONOMIXLG, OFLAT, & - OCOUPLES,OBLOWSNOW,PRSNOW, & + OCOUPLES,OBLOWSNOW,OFLYER,PRSNOW, & PTSTEP, TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & PCOSSLOPE,PSINSLOPE, & @@ -253,6 +253,7 @@ INTEGER, INTENT(IN) :: KRRI ! number of ice water var. INTEGER, INTENT(IN) :: KSV, KSV_LGBEG, KSV_LGEND ! number of scalar variables LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version LOGICAL, INTENT(IN) :: ODEEPOC ! activates sfc forcing for ideal ocean deep conv +LOGICAL, INTENT(IN) :: OFLYER ! MesoNH flyer diagnostic LOGICAL, INTENT(IN) :: OCOMPUTE_SRC ! flag to define dimensions of SIGS and SRCT variables LOGICAL, INTENT(IN) :: OFLAT ! Logical for zero ororography LOGICAL, INTENT(IN) :: OCOUPLES ! switch to activate atmos-ocean LES version @@ -503,7 +504,7 @@ ENDIF ! CALL TURB_VER_THERMO_FLUX(D,CST,CSTURB,TURBN,TLES, & KRR,KRRL,KRRI,KSV,KGRADIENTS, & - OOCEAN,ODEEPOC, & + OOCEAN,ODEEPOC,OFLYER, & OCOUPLES,OCOMPUTE_SRC, & PEXPL,PTSTEP,HPROGRAM,TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & @@ -576,7 +577,7 @@ IF (TURBN%LHARAT) ZLM(:,:)=PLENGTHH(:,:) IF (KSV>0) & CALL TURB_VER_SV_FLUX(D,CST,CSTURB,TURBN,TLES,ONOMIXLG, & KSV,KSV_LGBEG,KSV_LGEND, & - OBLOWSNOW, & + OBLOWSNOW,OFLYER, & PEXPL,PTSTEP,TPFILE,PRSNOW, & PDZZ,PDIRCOSZW, & PRHODJ,PWM, & diff --git a/src/PHYEX/turb/mode_turb_ver_sv_flux.f90 b/src/PHYEX/turb/mode_turb_ver_sv_flux.f90 index dc1ad272ad4b53b52f7f50c015527e05db19662c..09d51b09c9b107d184a2c192d057c3043afd55fe 100644 --- a/src/PHYEX/turb/mode_turb_ver_sv_flux.f90 +++ b/src/PHYEX/turb/mode_turb_ver_sv_flux.f90 @@ -8,7 +8,7 @@ IMPLICIT NONE CONTAINS SUBROUTINE TURB_VER_SV_FLUX(D,CST,CSTURB,TURBN,TLES,ONOMIXLG, & KSV,KSV_LGBEG,KSV_LGEND, & - OBLOWSNOW, & + OBLOWSNOW,OFLYER, & PEXPL,PTSTEP,TPFILE,PRSNOW, & PDZZ,PDIRCOSZW, & PRHODJ,PWM, & @@ -213,14 +213,12 @@ USE PARKIND1, ONLY: JPRB USE SHUMAN_PHY, ONLY: DZM_PHY, MZM_PHY, MZF_PHY USE YOMHOOK, ONLY: LHOOK, DR_HOOK ! -USE MODD_AIRCRAFT_BALLOON, ONLY: LFLYER USE MODD_CST, ONLY: CST_t USE MODD_CTURB, ONLY: CSTURB_t USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t USE MODD_FIELD, ONLY: TFIELDMETADATA, TYPEREAL USE MODD_IO, ONLY: TFILEDATA USE MODD_LES, ONLY: TLES_t -USE MODD_NSV, ONLY: XSVMIN, NSV_LGBEG, NSV_LGEND USE MODD_PARAMETERS, ONLY: JPVEXT_TURB, NMNHNAMELGTMAX USE MODD_TURB_n, ONLY: TURB_t ! @@ -248,6 +246,7 @@ INTEGER, INTENT(IN) :: KSV, & KSV_LGBEG, KSV_LGEND ! number of scalar variables LOGICAL, INTENT(IN) :: ONOMIXLG ! to use turbulence for lagrangian variables (modd_conf) LOGICAL, INTENT(IN) :: OBLOWSNOW ! switch to activate pronostic blowing snow +LOGICAL, INTENT(IN) :: OFLYER ! MesoNH flyer diagnostic REAL, INTENT(IN) :: PRSNOW ! Ratio for diffusion coeff. scalar (blowing snow) REAL, INTENT(IN) :: PEXPL ! Coef. for temporal disc. REAL, INTENT(IN) :: PTSTEP ! Double Time Step @@ -433,7 +432,7 @@ DO JSV=1,KSV ZFLXZ(IIJB:IIJE,IKA) = ZFLXZ(IIJB:IIJE,IKB) !$mnh_end_expand_array(JIJ=IIJB:IIJE) - IF ( LFLYER ) THEN + IF ( OFLYER ) THEN DO JK=IKTB+1,IKTE-1 !$mnh_expand_array(JIJ=IIJB:IIJE) PWSV(IIJB:IIJE,JK,JSV)=0.5*(ZFLXZ(IIJB:IIJE,JK)+ZFLXZ(IIJB:IIJE,JK+IKL)) diff --git a/src/PHYEX/turb/mode_turb_ver_thermo_flux.f90 b/src/PHYEX/turb/mode_turb_ver_thermo_flux.f90 index 6e1935f3e560aeead72b1474e76b743e8e9d1694..618fb377a19214004ad7dcd906efc3e6fbad40b5 100644 --- a/src/PHYEX/turb/mode_turb_ver_thermo_flux.f90 +++ b/src/PHYEX/turb/mode_turb_ver_thermo_flux.f90 @@ -8,7 +8,7 @@ IMPLICIT NONE CONTAINS SUBROUTINE TURB_VER_THERMO_FLUX(D,CST,CSTURB,TURBN,TLES, & KRR,KRRL,KRRI,KSV,KGRADIENTS, & - OOCEAN,ODEEPOC, & + OOCEAN,ODEEPOC,OFLYER, & OCOUPLES, OCOMPUTE_SRC, & PEXPL,PTSTEP,HPROGRAM, & TPFILE, & @@ -233,7 +233,6 @@ USE PARKIND1, ONLY: JPRB USE SHUMAN_PHY, ONLY: DZF_PHY, DZM_PHY, MXF_PHY, MYF_PHY, MZF_PHY, MZM_PHY USE YOMHOOK, ONLY: LHOOK, DR_HOOK ! -USE MODD_AIRCRAFT_BALLOON, ONLY: LFLYER USE MODD_CST, ONLY: CST_t USE MODD_CTURB, ONLY: CSTURB_t USE MODD_DIMPHYEX, ONLY: DIMPHYEX_t @@ -270,6 +269,7 @@ INTEGER, INTENT(IN) :: KSV ! number of scalar var. INTEGER, INTENT(IN) :: KGRADIENTS ! Number of stored horizontal gradients LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version LOGICAL, INTENT(IN) :: ODEEPOC ! activates sfc forcing for ideal ocean deep conv +LOGICAL, INTENT(IN) :: OFLYER ! MesoNH flyer diagnostic LOGICAL, INTENT(IN) :: OCOUPLES ! switch to activate atmos-ocean LES version LOGICAL, INTENT(IN) :: OCOMPUTE_SRC ! flag to define dimensions of SIGS and REAL, INTENT(IN) :: PEXPL ! Coef. for temporal disc. @@ -663,7 +663,7 @@ ELSE !$mnh_end_expand_array(JIJ=IIJB:IIJE) END IF ! -IF ( LFLYER ) THEN +IF ( OFLYER ) THEN PWTH(:,:IKTB) = XUNDEF PWTH(:,IKTE:) = XUNDEF ! @@ -1058,7 +1058,7 @@ IF (KRR /= 0) THEN ZFLXZ(IIJB:IIJE,IKU) = ZFLXZ(IIJB:IIJE,IKE) END IF ! - IF ( LFLYER ) THEN + IF ( OFLYER ) THEN DO JK=IKTB+1,IKTE-1 !$mnh_expand_array(JIJ=IIJB:IIJE) PWRC(IIJB:IIJE,JK)=0.5*(ZFLXZ(IIJB:IIJE,JK)+ZFLXZ(IIJB:IIJE,JK+IKL)) diff --git a/src/PHYEX/turb/modi_turb.f90 b/src/PHYEX/turb/modi_turb.f90 index 3694890aeed0689c5cfd322fe6b39c9dfdb739b5..747f10538154c6456a3824f929eff22814de4330 100644 --- a/src/PHYEX/turb/modi_turb.f90 +++ b/src/PHYEX/turb/modi_turb.f90 @@ -8,7 +8,7 @@ INTERFACE & KMI,KRR,KRRL,KRRI,HLBCX,HLBCY,KGRADIENTS,KHALO, & & KSPLIT,KMODEL_CL,KSV,KSV_LGBEG,KSV_LGEND,HPROGRAM, & & KSV_LIMA_NR, KSV_LIMA_NS, KSV_LIMA_NG, KSV_LIMA_NH, & - & O2D,ONOMIXLG,OFLAT,OCOUPLES,OBLOWSNOW,OIBM, & + & O2D,ONOMIXLG,OFLAT,OCOUPLES,OBLOWSNOW,OIBM,OFLYER, & & OCOMPUTE_SRC, PRSNOW, & & OOCEAN,ODEEPOC,ODIAG_IN_RUN, & & HTURBLEN_CL,HCLOUD, & @@ -61,6 +61,7 @@ INTEGER, INTENT(IN) :: KHALO ! Size of the halo for par LOGICAL, INTENT(IN) :: OCOMPUTE_SRC ! flag to define dimensions of SIGS and SRCT variables LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version LOGICAL, INTENT(IN) :: ODEEPOC ! activates sfc forcing for ideal ocean deep conv +LOGICAL, INTENT(IN) :: OFLYER ! MesoNH flyer diagnostic LOGICAL, INTENT(IN) :: OFLAT ! Logical for zero ororography LOGICAL, INTENT(IN) :: OCOUPLES ! switch to activate atmos-ocean LES version LOGICAL, INTENT(IN) :: OBLOWSNOW ! switch to activate pronostic blowing snow diff --git a/src/PHYEX/turb/turb.f90 b/src/PHYEX/turb/turb.f90 index 2a8a60e323301d8d5ffcdb501c46ef57fe56c552..58e0ba1847373e468597bdfa8ed1590f97281dc0 100644 --- a/src/PHYEX/turb/turb.f90 +++ b/src/PHYEX/turb/turb.f90 @@ -7,7 +7,7 @@ & KMI,KRR,KRRL,KRRI,HLBCX,HLBCY,KGRADIENTS,KHALO, & & KSPLIT,KMODEL_CL,KSV,KSV_LGBEG,KSV_LGEND,HPROGRAM, & & KSV_LIMA_NR, KSV_LIMA_NS, KSV_LIMA_NG, KSV_LIMA_NH, & - & O2D,ONOMIXLG,OFLAT,OCOUPLES,OBLOWSNOW,OIBM, & + & O2D,ONOMIXLG,OFLAT,OCOUPLES,OBLOWSNOW,OIBM,OFLYER, & & OCOMPUTE_SRC, PRSNOW, & & OOCEAN,ODEEPOC,ODIAG_IN_RUN, & & HTURBLEN_CL,HCLOUD, & @@ -272,7 +272,7 @@ USE MODE_SOURCES_NEG_CORRECT, ONLY: SOURCES_NEG_CORRECT_PHY USE MODE_TM06, ONLY: TM06 USE MODE_TKE_EPS_SOURCES, ONLY: TKE_EPS_SOURCES USE MODE_TURB_HOR_SPLT, ONLY: TURB_HOR_SPLT -USE MODE_TURB_VER, ONLY : TURB_VER +USE MODE_TURB_VER, ONLY: TURB_VER USE MODE_UPDATE_LM, ONLY: UPDATE_LM ! USE MODI_LES_MEAN_SUBGRID_PHY @@ -304,6 +304,7 @@ INTEGER, INTENT(IN) :: KMODEL_CL ! model number for cloud m LOGICAL, INTENT(IN) :: OCOMPUTE_SRC ! flag to define dimensions of SIGS and SRCT variables LOGICAL, INTENT(IN) :: OOCEAN ! switch for Ocean model version LOGICAL, INTENT(IN) :: ODEEPOC ! activates sfc forcing for ideal ocean deep conv +LOGICAL, INTENT(IN) :: OFLYER ! MesoNH flyer diagnostic LOGICAL, INTENT(IN) :: OFLAT ! Logical for zero ororography LOGICAL, INTENT(IN) :: OCOUPLES ! switch to activate atmos-ocean LES version LOGICAL, INTENT(IN) :: OBLOWSNOW ! switch to activate pronostic blowing snow @@ -1007,7 +1008,7 @@ CALL TURB_VER(D,CST,CSTURB,TURBN,TLES, & OOCEAN, ODEEPOC, OCOMPUTE_SRC, & KSV,KSV_LGBEG,KSV_LGEND, & ZEXPL,HPROGRAM, O2D, ONOMIXLG, OFLAT, & - OCOUPLES,OBLOWSNOW, PRSNOW, & + OCOUPLES,OBLOWSNOW,OFLYER, PRSNOW, & PTSTEP,TPFILE, & PDXX,PDYY,PDZZ,PDZX,PDZY,PDIRCOSZW,PZZ, & PCOSSLOPE,PSINSLOPE, &