diff --git a/src/MNH/aircraft_balloon_evol.f90 b/src/MNH/aircraft_balloon_evol.f90 index 18a996be054912a357ede5fd2950a837d3b810d0..b6115ed625eae3d09869710df6cf2dc2b5bd4986 100644 --- a/src/MNH/aircraft_balloon_evol.f90 +++ b/src/MNH/aircraft_balloon_evol.f90 @@ -1,4 +1,4 @@ -!MNH_LIC Copyright 2000-2020 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC Copyright 2000-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. @@ -129,6 +129,10 @@ END MODULE MODI_AIRCRAFT_BALLOON_EVOL !! March,28, 2018 (P. Wautelet) replace TEMPORAL_DIST by DATETIME_DISTANCE !! Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O ! P. Wautelet 01/10/2020: bugfix: initialize GSTORE +! P. Wautelet 14/01/2021: bugfixes: -ZXCOEF and ZYCOEF were not computed if CVBALL +! -PCIT was used if CCLOUD/=ICEx (not allocated) +! -PSEA was always used even if not allocated (CSURF/=EXTE) +! -do not use PMAP if cartesian domain ! !! -------------------------------------------------------------------------- ! @@ -154,7 +158,7 @@ USE MODD_PARAM_LIMA_MIXED, ONLY: XDG_L=>XDG,XLBEXG_L=>XLBEXG,XLBG_L=>XLBG,XCCG_L XAG_L=>XAG,XBG_L=>XBG,XCXG_L=>XCXG,XCG_L=>XCG USE MODD_PARAM_LIMA_WARM, ONLY: XLBEXR_L=>XLBEXR,XLBR_L=>XLBR,XBR_L=>XBR,XAR_L=>XAR,& XBC_L=>XBC,XAC_L=>XAC -USE MODD_PARAM_n, ONLY: CCLOUD +USE MODD_PARAM_n, ONLY: CCLOUD, CSURF USE MODD_RAIN_ICE_DESCR, ONLY: XALPHAR_I=>XALPHAR,XNUR_I=>XNUR,XLBEXR_I=>XLBEXR,& XLBR_I=>XLBR,XCCR_I=>XCCR,XBR_I=>XBR,XAR_I=>XAR,& XALPHAC_I=>XALPHAC,XNUC_I=>XNUC,& @@ -721,6 +725,10 @@ IF ( TPFLYER%FLY) THEN !* 5.2.4 Constant Volume Balloon ! IF (TPFLYER%TYPE=='CVBALL') THEN + ZXCOEF = (TPFLYER%X_CUR - ZXHATM(II)) / (ZXHATM(II+1) - ZXHATM(II)) + ZXCOEF = MAX (0.,MIN(ZXCOEF,1.)) + ZYCOEF = (TPFLYER%Y_CUR - ZYHATM(IJ)) / (ZYHATM(IJ+1) - ZYHATM(IJ)) + ZYCOEF = MAX (0.,MIN(ZYCOEF,1.)) IF ( TPFLYER%ALT /= XUNDEF ) THEN IK00 = MAX ( COUNT (TPFLYER%ALT >= ZZM(1,1,:)), 1) IK01 = MAX ( COUNT (TPFLYER%ALT >= ZZM(1,2,:)), 1) @@ -747,7 +755,7 @@ IF ( TPFLYER%FLY) THEN IK10 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(2,1,:)), 1) IK11 = MAX ( COUNT (ZFLYER_EXN <= ZEXN(2,2,:)), 1) IF (IK00*IK01*IK10*IK11 .EQ. 0) THEN - TPFLYER%Z_CUR = ZZM(1,1,IKB) + TPFLYER%Z_CUR = ZZM(1,1,IKB) TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(2,1,IKB) ) TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(1,2,IKB) ) TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(2,2,IKB) ) @@ -766,7 +774,7 @@ IF ( TPFLYER%FLY) THEN IK10 = MAX ( COUNT (TPFLYER%RHO <= ZRHO(2,1,:)), 1) IK11 = MAX ( COUNT (TPFLYER%RHO <= ZRHO(2,2,:)), 1) IF (IK00*IK01*IK10*IK11 .EQ. 0) THEN - TPFLYER%Z_CUR = ZZM(1,1,IKB) + TPFLYER%Z_CUR = ZZM(1,1,IKB) TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(2,1,IKB) ) TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(1,2,IKB) ) TPFLYER%Z_CUR = MAX ( TPFLYER%Z_CUR , ZZM(2,2,IKB) ) @@ -987,8 +995,8 @@ IF ( TPFLYER%FLY) THEN TPFLYER%CIZ (IN,:) = FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NI)) TPFLYER%CCZ (IN,:) = FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NC)) TPFLYER%CRZ (IN,:) = FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NR)) - ELSE - TPFLYER%CIZ (IN,:) = FLYER_INTERPZ(PCIT(:,:,:)) + ELSE IF ( CCLOUD=="ICE3" .OR. CCLOUD=="ICE4" ) THEN + TPFLYER%CIZ (IN,:) = FLYER_INTERPZ(PCIT(:,:,:)) ENDIF ! initialization CRARE and CRARE_ATT + LWC and IWC TPFLYER%CRARE(IN,:) = 0. @@ -1000,19 +1008,28 @@ IF ( TPFLYER%FLY) THEN TPFLYER%IWCZ (IN,:) = FLYER_INTERPZ((PR(:,:,:,4)+PR(:,:,:,5)+PR(:,:,:,6))*PRHODREF(:,:,:)) ZTEMPZ(:)=FLYER_INTERPZ(PTH(II:II+1,IJ:IJ+1,:) * ZEXN(:,:,:)) ZRHODREFZ(:)=FLYER_INTERPZ(PRHODREF(:,:,:)) - ZCIT(:)=FLYER_INTERPZ(PCIT(:,:,:)) IF (CCLOUD=="LIMA") THEN ZCCI(:)=FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NI)) ZCCR(:)=FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NR)) ZCCC(:)=FLYER_INTERPZ(PSV(:,:,:,NSV_LIMA_NC)) + ELSE + ZCIT(:)=FLYER_INTERPZ(PCIT(:,:,:)) ENDIF DO JLOOP=3,6 ZRZ(:,JLOOP)=FLYER_INTERPZ(PR(:,:,:,JLOOP)) END DO - DO JK=1,IKU - ZRZ(JK,2)=FLYER_INTERP_2D(PR(:,:,JK,2)*PSEA(:,:)) ! becomes cloud mixing ratio over sea - ZRZ(JK,7)=FLYER_INTERP_2D(PR(:,:,JK,2)*(1.-PSEA(:,:))) ! becomes cloud mixing ratio over land - END DO + if ( csurf == 'EXTE' ) then + DO JK=1,IKU + ZRZ(JK,2)=FLYER_INTERP_2D(PR(:,:,JK,2)*PSEA(:,:)) ! becomes cloud mixing ratio over sea + ZRZ(JK,7)=FLYER_INTERP_2D(PR(:,:,JK,2)*(1.-PSEA(:,:))) ! becomes cloud mixing ratio over land + END DO + else + !if csurf/='EXTE', psea is not allocated + DO JK=1,IKU + ZRZ(JK,2)=FLYER_INTERP_2D(PR(:,:,JK,2)) + ZRZ(JK,7) = 0. + END DO + end if ALLOCATE(ZAELOC(IKU)) ! ZAELOC(:)=0. @@ -1299,7 +1316,11 @@ IF ( TPFLYER%FLY) THEN IF (TPFLYER%TYPE=='RADIOS' .OR. TPFLYER%TYPE=='ISODEN' .OR. TPFLYER%TYPE=='CVBALL') THEN ZU_BAL = FLYER_INTERP_U(PU) ZV_BAL = FLYER_INTERP_V(PV) - ZMAP = FLYER_INTERP_2D(PMAP) + if ( .not. lcartesian ) then + ZMAP = FLYER_INTERP_2D(PMAP) + else + ZMAP = 1. + end if ! TPFLYER%X_CUR = TPFLYER%X_CUR + ZU_BAL * PTSTEP * ZMAP TPFLYER%Y_CUR = TPFLYER%Y_CUR + ZV_BAL * PTSTEP * ZMAP