From 03228fe12ea857c68ac919ae809004bb5d1b4320 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Riette?= <sebastien.riette@meteo.fr> Date: Tue, 5 Jul 2022 15:43:50 +0200 Subject: [PATCH] S. Riette 05/07/2022 some cleaning --- docs/TODO | 62 +++++++----------- src/arome/ext/apl_arome.F90 | 4 +- src/arome/ext/aro_shallow_mf.F90 | 6 +- src/arome/ext/aro_shallow_mf.h | 4 +- src/arome/ext/aro_turb_mnh.F90 | 11 +--- src/arome/ext/aro_turb_mnh.h | 4 +- ...mode_ice4_sedimentation_split_momentum.F90 | 64 +++++++++++-------- src/common/turb/mode_compute_updraft.F90 | 4 ++ 8 files changed, 78 insertions(+), 81 deletions(-) diff --git a/docs/TODO b/docs/TODO index 46bf4632a..56195acbb 100644 --- a/docs/TODO +++ b/docs/TODO @@ -1,7 +1,9 @@ -Module de clés namelists PHYEX -Une solution serait de créer un module propre à PHYEX qui contiendrait des clés de contrôle de haut niveau - pour la physique. Ce module serait initialisé dans Méso-NH à partir de clés actuellement en dehors - de la physique. +Module de clés namelists PHYEX. Des modules sont assez généraux et utilisés ailleurs dans Méso-NH (répertoire aux) + - Une solution serait de créer un module propre à PHYEX qui contiendrait des clés de contrôle de haut niveau + pour la physique. Ce module serait initialisé dans Méso-NH à partir de clés actuellement en dehors + de la physique. + - Une autre solution serait de supprimer ces modules de PHYEX et de recevoir ces quelques clés en argument (ex modd_lunit?) + - si certains modules contiennent des clés purement physiques et d'autres purement dynamique, on pourrait scinder le module Dependencies: - définir les interfaces propres @@ -9,15 +11,21 @@ Dependencies: - liste dans document Interfaces - pour AROME placés, en attendant, dans phyex/externals -Clé de compilation REPRO48 + REPRO55 ajoutées pour permettre de reproduire le cycle 48 MNH-5.5.0, elles: - - contournent des corrections de bug - - modifient l'organisation de calculs - - REPRO48 reproduit les résultats obtenus avant l'introduction de la fraction précipitante froide dans l'ajustement -Utilisation des clés: - - REPRO48 seule: la version de code qui sera retenue à la fin est celle de Méso-NH 5.5 - - REPRO55 seule: la version de code qui sera retenue à la fin est celle du cycle 48 d'AROME - - defined(REPRO48) || defined(REPRO55): la version de code qui sera retenue à la fin est nouvelle -Ces clés devront être supprimées +Intégration de PHYEX dans des cycles/versions officielles: +- Clés de compilation + - Clé de compilation REPRO48 + REPRO55 ajoutées pour permettre de reproduire le cycle 48 MNH-5.5.0, elles: + - contournent des corrections de bug + - modifient l'organisation de calculs + - REPRO48 reproduit les résultats obtenus avant l'introduction de la fraction précipitante froide dans l'ajustement + - Utilisation des clés: + - REPRO48 seule: la version de code qui sera retenue à la fin est celle de Méso-NH 5.5 + - REPRO55 seule: la version de code qui sera retenue à la fin est celle du cycle 48 d'AROME + - defined(REPRO48) || defined(REPRO55): la version de code qui sera retenue à la fin est nouvelle + - Ces clés devront être supprimées +- Répertoires ext + - Répertoire arome/ext et mesonh/ext contiennent les codes non PHYEX qu'il faut modifier dans le pack pour qu'il puisse être compilé. + - Ce répertoire devra être vidé à la fin du phasage, les modifications nécessaires ayadevront avoir été fournies par ailleurs +- modd_spp_type est pour l'instant dans mpa/micro/externals mais n'est pas de la microphysique Ecrire doc sur marche à suivre pour intégrer un nouveau développement: - dev dans MNH à faire en array-syntax @@ -30,11 +38,6 @@ Ecrire doc sur marche à suivre pour intégrer un nouveau développement: Merge pb: - rain_ice_old a rebrancher dans Meso-NH - - rain_ice_red: le cas test MesoNH n'est pas bit repro (diffs > 1% sur rapports de melange) - sur la modif src/mesonh/rain_ice_red au commit bdd10dd (First rain_ice new/red merge) - - shallow_mf (appels dans aro_shallow et arp_shallow): - Dans Méso-NH: shallow_mf doit être appelé avec PDX=XDXHAT(1) et PDY=XDYHAT(1) - Dans AROME/ARP: où trouver la taille de maille? Pb identifiés à corriger plus tard: - deposition devrait être déplacée dans ice4_tendencies @@ -45,17 +48,9 @@ Pb identifiés à corriger plus tard: => à corriger - seules quelques options sont testées avec les cas test (par exemple, il faudrait tester RMC01 mais l'option n'est pas remontée en namelist) - - arome/ini_cmfshall devrait s'appeler ini_param_mfshall - - th_r_from_thl_rt appelée partout, il faudrait limiter à OTEST - - doute sur le codage de MODD_PRECISION - - appel à abort à travers print_msg non testé - - indentation inorrecte dans les blocs mnh_expand - - sedimentation momentum non branchée (et à trasformer comme sedim_stat) + - sedimentation momentum non branchée - si possible, modifier ice4_sedimentation_split* dans le même esprit que stat -Répertoire arome/ext et mesonh/ext contiennent les codes non PHYEX qu'il faut modifier dans le pack pour qu'il puisse être compilé. -Ce répertoire devra être vidé à la fin du phasage, les modifications nécessaires ayadevront avoir été fournies par ailleurs - Budgets/DDH - Le code dans budget_DDH devra être transféré dans mode_budget - les routines arome specifiques aux budgets sont dans mpa/micro, il faudrait les mettre dans aux @@ -63,15 +58,4 @@ Budgets/DDH - Le code des budgets devrait être revu: pas en phase avec celui de Méso-NH et phasage a priori inutile car très peu de code semble réellement utile pour AROME -SPP -- modd_spp_type est pour l'instant dans mpa/micro/externals mais n'est pas de la microphysique - -Nettoyage apl_arome non fait (pb a la compilation) ==> 4 arguments dans aro_turb_mnh supprimés (non utilisés) - -turb.F90 : il reste un CALL à SOURCES_NEG_CORRECT à ajouter. - -Regarder s'il ne serait pas possible/souhaitable de supprimer modd_lunit de PHYEX. On pourrait se contenter de recevoir le numero d'unité logique - -Nettoyage des répertoires aux nécessaire - -Initialiser dans AROME la variable ldiag_in_run de MODD_DIAG_IN_RUN pour pouvoir phaser le modd +Initialiser dans AROME la variable ldiag_in_run de MODD_DIAG_IN_RUN pour pouvoir phaser le modd, ou passer la variable par l'interface diff --git a/src/arome/ext/apl_arome.F90 b/src/arome/ext/apl_arome.F90 index 66b261ad8..1af66f4e8 100644 --- a/src/arome/ext/apl_arome.F90 +++ b/src/arome/ext/apl_arome.F90 @@ -2916,6 +2916,7 @@ IF (LMFSHAL) THEN & HFRAC_ICE=CFRAC_ICE_SHALLOW_MF,& & OMIXUV=LMIXUV, ONOMIXLG=.FALSE.,KSV_LGBEG=0,KSV_LGEND=0,& & KTCOUNT=KSTEP+1, PTSTEP=ZDT,& + & PDX=YDGEOMETRY%YREGEO%EDELX, PDY=YDGEOMETRY%YREGEO%EDELY,& & PZZ=ZZZ_,PZZF=ZZZ_F_,& & PDZZF=ZDZZ_F_,& & PRHODJ=ZRHODJM__(:,1:KLEV),& @@ -3067,8 +3068,7 @@ IF (LTURB) THEN &LDHARATU=LHARATU,CMICRO=CMICRO,PTSTEP=ZDT,& & PZZ=ZZZ_,PZZF=ZZZ_F_,& & PZZTOP=ZZTOP_,PRHODJ=ZRHODJM__,PTHVREF=ZTHVREFM__,& - & PRHODREF=ZRHODREFM__,HINST_SFU='M',& - & HMF_UPDRAFT=CMF_UPDRAFT,& + & HINST_SFU='M',& & PSFTH=ZSFTH_,PSFRV=ZSFRV_,& & PSFSV=ZSFSVLIMA_,PSFU=ZSFU_,& & PSFV=ZSFV_,PPABSM=ZPABSM__,& diff --git a/src/arome/ext/aro_shallow_mf.F90 b/src/arome/ext/aro_shallow_mf.F90 index 4a59175ab..869503034 100644 --- a/src/arome/ext/aro_shallow_mf.F90 +++ b/src/arome/ext/aro_shallow_mf.F90 @@ -2,7 +2,7 @@ SUBROUTINE ARO_SHALLOW_MF(KKL, KLON,KLEV, KRR, KRRL, KRRI,KSV, & HMF_UPDRAFT, HMF_CLOUD, HFRAC_ICE, OMIXUV, & ONOMIXLG,KSV_LGBEG,KSV_LGEND, & - KTCOUNT, PTSTEP, & + KTCOUNT, PTSTEP, PDX, PDY, & PZZ, PZZF, PDZZF, & PRHODJ, PRHODREF, & PPABSM, PEXNM, & @@ -93,6 +93,8 @@ INTEGER, INTENT(IN) :: KSV_LGEND ! last index of lag. tracer INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop counter REAL, INTENT(IN) :: PTSTEP ! Time step +REAL, INTENT(IN) :: PDX ! grid size along x-axis +REAL, INTENT(IN) :: PDY ! grid size along y-axis ! REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PZZ ! Height of layer boundaries REAL, DIMENSION(KLON,KLEV), INTENT(IN) :: PZZF ! Height of level @@ -235,7 +237,7 @@ ZIMPL=1. &PTHL_UP=PTHL_UP,PRT_UP=PRT_UP,PRV_UP=PRV_UP,PRC_UP=PRC_UP,PRI_UP=PRI_UP, & &PU_UP=PU_UP, PV_UP=PV_UP, PTHV_UP=PTHV_UP, PW_UP=PW_UP, & &PFRAC_UP=PFRAC_UP,PEMF=PEMF,PDETR=ZDETR,PENTR=ZENTR, & - &KKLCL=IKLCL,KKETL=IKETL,KKCTL=IKCTL,PDX=0.,PDY=0. ) + &KKLCL=IKLCL,KKETL=IKETL,KKCTL=IKCTL,PDX=PDX,PDY=PDY ) ! ! !------------------------------------------------------------------------------ diff --git a/src/arome/ext/aro_shallow_mf.h b/src/arome/ext/aro_shallow_mf.h index 07cdb7a7d..b86c03fd4 100644 --- a/src/arome/ext/aro_shallow_mf.h +++ b/src/arome/ext/aro_shallow_mf.h @@ -2,7 +2,7 @@ INTERFACE SUBROUTINE ARO_SHALLOW_MF(KKL, KLON,KLEV, KRR, KRRL, KRRI,KSV,& & HMF_UPDRAFT, HMF_CLOUD, HFRAC_ICE, OMIXUV,& & ONOMIXLG,KSV_LGBEG,KSV_LGEND,& - & KTCOUNT, PTSTEP,& + & KTCOUNT, PTSTEP, PDX, PDY,& & PZZ, PZZF,PDZZF,& & PRHODJ, PRHODREF,& & PPABSM, PEXNM,& @@ -31,6 +31,8 @@ INTEGER(KIND=JPIM), INTENT(IN) :: KSV_LGBEG INTEGER(KIND=JPIM), INTENT(IN) :: KSV_LGEND INTEGER(KIND=JPIM), INTENT(IN) :: KTCOUNT REAL(KIND=JPRB), INTENT(IN) :: PTSTEP +REAL(KIND=JPRB), INTENT(IN) :: PDX +REAL(KIND=JPRB), INTENT(IN) :: PDY REAL(KIND=JPRB), DIMENSION(KLON,KLEV), INTENT(IN) :: PZZ REAL(KIND=JPRB), DIMENSION(KLON,KLEV), INTENT(IN) :: PZZF REAL(KIND=JPRB), DIMENSION(KLON,KLEV), INTENT(IN) :: PDZZF diff --git a/src/arome/ext/aro_turb_mnh.F90 b/src/arome/ext/aro_turb_mnh.F90 index 240fa330d..0139d7eb6 100644 --- a/src/arome/ext/aro_turb_mnh.F90 +++ b/src/arome/ext/aro_turb_mnh.F90 @@ -2,12 +2,12 @@ SUBROUTINE ARO_TURB_MNH( KKA,KKU,KKL,KLON,KLEV,KRR,KRRL,KRRI,KSV, & KTCOUNT, KGRADIENTS, LDHARATU, CMICRO, PTSTEP, & PZZ, PZZF, PZZTOP, & - PRHODJ, PTHVREF,PRHODREF,HINST_SFU,HMF_UPDRAFT, & + PRHODJ, PTHVREF,HINST_SFU, & PSFTH,PSFRV,PSFSV,PSFU,PSFV, & PPABSM,PUM,PVM,PWM,PTKEM,PEPSM,PSVM,PSRCM, & PTHM,PRM, & PRUS,PRVS,PRWS,PRTHS,PRRS,PRSVSIN,PRSVS,PRTKES,PRTKES_OUT,PREPSS, & - ZHGRAD,PSIGS,OSUBG_COND, & + PHGRAD,PSIGS,OSUBG_COND, & PFLXZTHVMF,PLENGTHM,PLENGTHH,MFMOIST, & PDRUS_TURB,PDRVS_TURB, & PDRTHLS_TURB,PDRRTS_TURB,PDRSVS_TURB, & @@ -100,7 +100,6 @@ INTEGER, INTENT(IN) :: KTCOUNT ! Temporal loop counter INTEGER, INTENT(IN) :: KGRADIENTS ! Number of stored horizontal gradients LOGICAL, INTENT(IN) :: LDHARATU ! HARATU scheme active CHARACTER (LEN=4), INTENT(IN) :: CMICRO ! Microphysics scheme -CHARACTER (LEN=4), INTENT(IN) :: HMF_UPDRAFT ! Type of mass flux scheme REAL, INTENT(IN) :: PTSTEP ! Time step ! ! @@ -113,8 +112,6 @@ REAL, DIMENSION(KLON,1,KLEV+2), INTENT(INOUT) :: PRHODJ !Dry density * Jaco REAL, DIMENSION(KLON,1,KLEV+2), INTENT(INOUT) :: MFMOIST !Moist mass flux from Dual scheme REAL, DIMENSION(KLON,1,KLEV+2), INTENT(INOUT) :: PTHVREF ! Virtual Potential ! Temperature of the reference state -REAL, DIMENSION(KLON,1,KLEV+2), INTENT(INOUT) :: PRHODREF ! dry density of the - ! reference state CHARACTER(LEN=1) , INTENT(IN) :: HINST_SFU ! temporal location of the ! surface friction flux ! @@ -229,11 +226,10 @@ REAL,DIMENSION(KLON,1,KLEV+2) :: ZWRC ! cloud water flux REAL,DIMENSION(KLON,1,KLEV+2,KSV) :: ZWSV,ZSVM,ZRSVS,ZDRSVS_TURB ! scalar flux REAL,DIMENSION(KLON,1,KLEV+2) :: ZZZ ! Local value of PZZ REAL,DIMENSION(KLON,1,KLEV+2,KRR) :: ZRM,ZRRS -REAL,DIMENSION(KLON,1,KLEV+2,KGRADIENTS) :: ZHGRAD ! Horizontal Gradients +REAL,DIMENSION(KLON,1,KLEV+2,KGRADIENTS) :: PHGRAD ! Horizontal Gradients ! REAL, DIMENSION(KLON,1), TARGET :: ZERO, ZONE ! -CHARACTER(LEN=4) :: CL !------------------------------------------------------------------------------ ! !* 1. PRELIMINARY COMPUTATIONS @@ -377,7 +373,6 @@ ENDDO ! CALL VERTICAL_EXTEND(PRHODJ) CALL VERTICAL_EXTEND(PTHVREF) -CALL VERTICAL_EXTEND(PRHODREF) CALL VERTICAL_EXTEND(PPABSM) CALL VERTICAL_EXTEND(PUM) CALL VERTICAL_EXTEND(PVM) diff --git a/src/arome/ext/aro_turb_mnh.h b/src/arome/ext/aro_turb_mnh.h index a09d5ddbb..87d261e86 100644 --- a/src/arome/ext/aro_turb_mnh.h +++ b/src/arome/ext/aro_turb_mnh.h @@ -2,7 +2,7 @@ INTERFACE SUBROUTINE ARO_TURB_MNH( KKA,KKU,KKL,KLON,KLEV, KRR, KRRL, KRRI,KSV,& & KTCOUNT,KGRADIENTS, LDHARATU, CMICRO, PTSTEP,& & PZZ, PZZF, PZZTOP,& - & PRHODJ, PTHVREF,PRHODREF,HINST_SFU,HMF_UPDRAFT,& + & PRHODJ, PTHVREF,HINST_SFU,& & PSFTH,PSFRV,PSFSV,PSFU,PSFV,& & PPABSM,PUM,PVM,PWM,PTKEM,PEPSM,PSVM,PSRCM,& & PTHM,PRM,& @@ -40,7 +40,6 @@ REAL(KIND=JPRB), DIMENSION(KLON), INTENT(IN) :: PZZTOP REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV+2), INTENT(INOUT) :: PRHODJ REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV+2), INTENT(INOUT) :: MFMOIST REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV+2), INTENT(INOUT) :: PTHVREF -REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV), INTENT(INOUT) :: PRHODREF CHARACTER*1 , INTENT(IN) :: HINST_SFU REAL(KIND=JPRB), DIMENSION(KLON,1), INTENT(INOUT) :: PSFTH,PSFRV REAL(KIND=JPRB), DIMENSION(KLON,1), INTENT(INOUT) :: PSFU,PSFV @@ -70,7 +69,6 @@ REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV+2), INTENT(OUT) :: PDRTHLS_TURB REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV+2), INTENT(OUT) :: PDRRTS_TURB REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV,KSV), INTENT(OUT) :: PDRSVS_TURB REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV+2), INTENT(INOUT) :: PFLXZTHVMF -CHARACTER (LEN=4), INTENT(IN) :: HMF_UPDRAFT LOGICAL , INTENT(INOUT) :: OSUBG_COND REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV+2), INTENT(OUT) :: PDP REAL(KIND=JPRB), DIMENSION(KLON,1,KLEV+2), INTENT(OUT) :: PTP diff --git a/src/common/micro/mode_ice4_sedimentation_split_momentum.F90 b/src/common/micro/mode_ice4_sedimentation_split_momentum.F90 index 43d3094e4..498375058 100644 --- a/src/common/micro/mode_ice4_sedimentation_split_momentum.F90 +++ b/src/common/micro/mode_ice4_sedimentation_split_momentum.F90 @@ -7,11 +7,11 @@ 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, & - &PSEA, PTOWN, PDZZ, & + &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 @@ -53,8 +53,6 @@ REAL, INTENT(IN) :: PTSTEP ! Double Time s 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), INTENT(IN) :: PSEA ! Sea Mask -REAL, DIMENSION(KIT,KJT), INTENT(IN) :: PTOWN ! Fraction that is town 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 @@ -75,6 +73,8 @@ REAL, DIMENSION(KIT,KJT), INTENT(OUT) :: PINPRR ! Rain instant 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 @@ -131,16 +131,24 @@ IF (PRESENT(PFPR)) PFPR(:,:,:,:) = 0. ! IF (OSEDIC) THEN ZRAY(:,:,:) = 0. - 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 + 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 @@ -152,12 +160,16 @@ ENDIF ! For optimization we consider each variable separately ! ! External tendecies -IF (OSEDIC) ZPRCS(:,:,:) = PRCS(:,:,:)-PRCT(:,:,:)*ZINVTSTEP +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 ) ZPRHS(:,:,:) = PRHS(:,:,:)-PRHT(:,:,:)*ZINVTSTEP +IF ( KRR == 7 ) THEN + ZPRHS(:,:,:) = PRHS(:,:,:)-PRHT(:,:,:)*ZINVTSTEP +END IF ! ! mr values inside the time-splitting loop ZRCT(:,:,:) = PRCT(:,:,:) @@ -165,7 +177,9 @@ ZRRT(:,:,:) = PRRT(:,:,:) ZRIT(:,:,:) = PRIT(:,:,:) ZRST(:,:,:) = PRST(:,:,:) ZRGT(:,:,:) = PRGT(:,:,:) -IF (KRR==7) ZRHT(:,:,:) = PRHT(:,:,:) +IF (KRR==7) THEN + ZRHT(:,:,:) = PRHT(:,:,:) +END IF ! DO JK = KKTB , KKTE ZW(:,:,JK) =1./(PRHODREF(:,:,JK)* PDZZ(:,:,JK)) @@ -189,7 +203,7 @@ IF (OSEDIC) THEN 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, PSEA, PTOWN, PTSTEP, & + &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & &2, & &ZRCT, PRCS, ZWSED, PINPRC, ZPRCS, ZMOMC, ZMOMC_EXT, & &ZRAY, ZLBC, ZFSEDC, ZCONC3D, PFPR=PFPR) @@ -213,7 +227,7 @@ DO WHILE (ANY(ZREMAINT>0.)) 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, PSEA, PTOWN, PTSTEP, & + &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & &3, & &ZRRT, PRRS, ZWSED, PINPRR, ZPRRS, ZMOMR, ZMOMR_EXT, & &PFPR=PFPR) @@ -236,7 +250,7 @@ DO WHILE (ANY(ZREMAINT>0.)) 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, PSEA, PTOWN, PTSTEP, & + &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & &4, & &ZRIT, PRIS, ZWSED, PINPRI, ZPRIS, ZMOMI, ZMOMI_EXT, PFPR=PFPR) FIRST = .FALSE. @@ -258,7 +272,7 @@ DO WHILE (ANY(ZREMAINT>0.)) 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, PSEA, PTOWN, PTSTEP, & + &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & &5, & &ZRST, PRSS, ZWSED, PINPRS, ZPRSS, ZMOMS, ZMOMS_EXT, PFPR=PFPR) FIRST = .FALSE. @@ -280,7 +294,7 @@ DO WHILE (ANY(ZREMAINT>0.)) 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, PSEA, PTOWN, PTSTEP, & + &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & &6, & &ZRGT, PRGS, ZWSED, PINPRG, ZPRGS, ZMOMG, ZMOMG_EXT, PFPR=PFPR) FIRST = .FALSE. @@ -303,7 +317,7 @@ IF (KRR==7) THEN 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, PSEA, PTOWN, PTSTEP, & + &PRHODREF, ZW, PDZZ, PPABST, PTHT, PTSTEP, & &7, & &ZRHT, PRHS, ZWSED, PINPRH, ZPRHS, ZMOMH, ZMOMH_EXT, PFPR=PFPR) FIRST = .FALSE. @@ -320,7 +334,7 @@ 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, PSEA, PTOWN, PTSTEP, & + &PRHODREF, POORHODZ, PDZZ, PPABST, PTHT, PTSTEP, & &KSPE, & &PRXT, PRXS, PWSED, PINPRX, PPRXS, PMOM, PMOM_EXT, & &PRAY, PLBC, PFSEDC, PCONC3D, PFPR) @@ -346,8 +360,6 @@ CONTAINS 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), INTENT(IN) :: PSEA ! Sea Mask - REAL, DIMENSION(KIT,KJT), INTENT(IN) :: PTOWN ! Fraction that is town REAL, DIMENSION(KIT,KJT,KKT), INTENT(IN) :: PTHT REAL, INTENT(IN) :: PTSTEP ! total timestep INTEGER, INTENT(IN) :: KSPE ! 1 for rc, 2 for rr... diff --git a/src/common/turb/mode_compute_updraft.F90 b/src/common/turb/mode_compute_updraft.F90 index f3b480826..784afbe68 100644 --- a/src/common/turb/mode_compute_updraft.F90 +++ b/src/common/turb/mode_compute_updraft.F90 @@ -75,6 +75,7 @@ USE MODE_TH_R_FROM_THL_RT_1D, ONLY: TH_R_FROM_THL_RT_1D USE MODI_SHUMAN_MF, ONLY: MZM_MF, MZF_MF, GZ_M_W_MF USE MODE_COMPUTE_BL89_ML, ONLY: COMPUTE_BL89_ML +USE MODE_MSG, ONLY: PRINT_MSG, NVERB_FATAL USE PARKIND1, ONLY : JPRB USE YOMHOOK , ONLY : LHOOK, DR_HOOK @@ -332,6 +333,9 @@ IF (OENTR_DETR) THEN ! Mass flux at KKB level (updraft triggered if PSFTH>0.) IF (LGZ) THEN + IF(PDX==0. .OR. PDY==0.) THEN + CALL PRINT_MSG(NVERB_FATAL, 'GEN', 'COMPUTE_UPDRAFT', 'PDX or PDY is NULL with option LGZ!') + ENDIF ZSURF(:)=TANH(XGZ*SQRT(PDX*PDY)/ZLUP) ELSE ZSURF(:)=1. -- GitLab