diff --git a/src/MNH/aircraft_balloon_evol.f90 b/src/MNH/aircraft_balloon_evol.f90 index dcbdd6349d012cb4ceea2734c75146d1c55a5c4b..03cd50c1cce361a500a3efce9b4fb9ce39b4cc17 100644 --- a/src/MNH/aircraft_balloon_evol.f90 +++ b/src/MNH/aircraft_balloon_evol.f90 @@ -26,6 +26,7 @@ ! -do not use PMAP if cartesian domain ! P. Wautelet 06/2022: reorganize flyers ! P. Wautelet 01/06/2023: deduplicate code => moved to modd/mode_sensors.f90 +! B. Vie 21/09/2023: add T and scalar variables !----------------------------------------------------------------- ! ########################## MODULE MODE_AIRCRAFT_BALLOON_EVOL @@ -107,7 +108,7 @@ CONTAINS ! ------------ ! USE MODD_AIRCRAFT_BALLOON -USE MODD_CST, ONLY: XCPD, XLVTT +USE MODD_CST, ONLY: XP00, XRD, XCPD, XLVTT USE MODD_IO, ONLY: ISP USE MODD_TIME_n, ONLY: TDTCUR USE MODD_TURB_FLUX_AIRCRAFT_BALLOON, ONLY: XRCW_FLUX, XSVW_FLUX, XTHW_FLUX @@ -158,6 +159,7 @@ REAL, DIMENSION(2,2,SIZE(PZ,3)) :: ZZU ! U points z coordinates REAL, DIMENSION(2,2,SIZE(PZ,3)) :: ZZV ! V points z coordinates REAL, DIMENSION(2,2,SIZE(PZ,3)) :: ZWM ! mass point wind ! +REAL, DIMENSION(SIZE(PTH,1),SIZE(PTH,2),SIZE(PTH,3)) :: ZEXN3D ! Exner function REAL, DIMENSION(2,2,SIZE(PTH,3)) :: ZEXN ! Exner function REAL, DIMENSION(2,2,SIZE(PTH,3)) :: ZTH_EXN ! potential temperature multiplied by Exner function REAL, DIMENSION(2,2,SIZE(PTH,3)) :: ZRHO ! air density @@ -229,6 +231,7 @@ SELECT TYPE ( TPFLYER ) ISOWNERAIR: IF ( TPFLYER%NRANK_CUR == ISP ) THEN CALL FLYER_INTERP_TO_MASSPOINTS() + ZEXN3D(:,:,:) = (PP(:,:,:)/XP00)**(XRD/XCPD) ZEXN(:,:,:) = FLYER_COMPUTE_EXNER( ) ZRHO(:,:,:) = FLYER_COMPUTE_RHO( ) @@ -332,6 +335,7 @@ SELECT TYPE ( TPFLYER ) ISOWNERBAL: IF ( TPFLYER%NRANK_CUR == ISP ) THEN CALL FLYER_INTERP_TO_MASSPOINTS() + ZEXN3D(:,:,:) = (PP(:,:,:)/XP00)**(XRD/XCPD) ZEXN(:,:,:) = FLYER_COMPUTE_EXNER( ) ZRHO(:,:,:) = FLYER_COMPUTE_RHO( ) @@ -894,7 +898,6 @@ SUBROUTINE FLYER_RECORD_DATA( ) USE MODD_CST, ONLY: XP00, XPI, XRD USE MODD_DIAG_IN_RUN, ONLY: XCURRENT_TKE_DISS USE MODD_GRID, ONLY: XBETA, XLON0, XRPK -USE MODD_NSV, ONLY: NSV_LIMA_NC, NSV_LIMA_NR, NSV_LIMA_NI USE MODD_PARAMETERS, ONLY: JPVEXT USE MODD_PARAM_n, ONLY: CCLOUD, CRAD @@ -933,6 +936,7 @@ TPFLYER%XTH (1,ISTORE) = TPFLYER%INTERP_FROM_MASSPOINT( PTH ) ! ZFLYER_EXN = TPFLYER%INTERP_FROM_MASSPOINT( ZEXN ) TPFLYER%XP (1,ISTORE) = XP00 * ZFLYER_EXN**(XCPD/XRD) +TPFLYER%XT (1,ISTORE) = TPFLYER%INTERP_FROM_MASSPOINT( PTH ) * ZFLYER_EXN ZR(:,:,:) = 0. DO JLOOP=1,SIZE(PR,4) @@ -947,14 +951,17 @@ DO JLOOP=1,SIZE(PR,4) TPFLYER%XRZ (:,ISTORE,JLOOP) = TPFLYER%INTERP_HOR_FROM_MASSPOINT( PR(:,:,:,JLOOP) ) END DO +TPFLYER%XTZ (:,ISTORE) = TPFLYER%INTERP_HOR_FROM_MASSPOINT( PTH * ZEXN3D ) + TPFLYER%XFFZ (:,ISTORE) = TPFLYER%INTERP_HOR_FROM_MASSPOINT( SQRT(PU**2+PV**2) ) TPFLYER%XRHOD (:,ISTORE) = TPFLYER%INTERP_HOR_FROM_MASSPOINT( PRHODREF ) +DO JLOOP=1,SIZE(PSV,4) + TPFLYER%XSVZ (:,ISTORE,JLOOP) = TPFLYER%INTERP_HOR_FROM_MASSPOINT( PSV(:,:,:,JLOOP) ) +END DO + IF (CCLOUD=="LIMA") THEN - TPFLYER%XCIZ (:,ISTORE) = TPFLYER%INTERP_HOR_FROM_MASSPOINT( PSV(:,:,:,NSV_LIMA_NI) ) - TPFLYER%XCCZ (:,ISTORE) = TPFLYER%INTERP_HOR_FROM_MASSPOINT( PSV(:,:,:,NSV_LIMA_NC) ) - TPFLYER%XCRZ (:,ISTORE) = TPFLYER%INTERP_HOR_FROM_MASSPOINT( PSV(:,:,:,NSV_LIMA_NR) ) ELSE IF ( CCLOUD=="ICE3" .OR. CCLOUD=="ICE4" ) THEN TPFLYER%XCIZ (:,ISTORE) = TPFLYER%INTERP_HOR_FROM_MASSPOINT( PCIT(:,:,:) ) END IF diff --git a/src/MNH/modd_sensor.f90 b/src/MNH/modd_sensor.f90 index b780c39137fc86ee7ed5d63c5a9af8921b9b8c04..7e5573bc41b37ca1759e2cc5bd75697f7bc0fad6 100644 --- a/src/MNH/modd_sensor.f90 +++ b/src/MNH/modd_sensor.f90 @@ -6,6 +6,7 @@ ! Original version: ! P. Wautelet: 27/04/2023 ! Modifications: +! B. Vie: 21/09/2023 Add SVs and temperature to recorded variables !----------------------------------------------------------------- MODULE MODD_SENSOR USE MODD_PARAMETERS, ONLY: NSENSORNAMELGTMAX, NNEGUNDEF, XNEGUNDEF, XUNDEF @@ -101,6 +102,7 @@ MODULE MODD_SENSOR REAL, DIMENSION(:,:), ALLOCATABLE :: XP ! p(n) REAL, DIMENSION(:,:), ALLOCATABLE :: XTKE ! tke(n) REAL, DIMENSION(:,:), ALLOCATABLE :: XTH ! th(n) + REAL, DIMENSION(:,:), ALLOCATABLE :: XT ! t(n) REAL, DIMENSION(:,:,:), ALLOCATABLE :: XR ! r*(n) REAL, DIMENSION(:,:,:), ALLOCATABLE :: XSV ! Sv*(n) REAL, DIMENSION(:), ALLOCATABLE :: XTSRAD ! surface temperature Ts(n) @@ -108,8 +110,8 @@ MODULE MODD_SENSOR REAL, DIMENSION(:,:), ALLOCATABLE :: XRHOD ! density of dry air REAL, DIMENSION(:,:), ALLOCATABLE :: XCIZ ! Ice concentration - REAL, DIMENSION(:,:), ALLOCATABLE :: XCCZ ! Cloud concentration (LIMA) - REAL, DIMENSION(:,:), ALLOCATABLE :: XCRZ ! Rain concentration (LIMA) + REAL, DIMENSION(:,:), ALLOCATABLE :: XTZ ! Temperature + REAL, DIMENSION(:,:,:), ALLOCATABLE :: XSVZ ! Scalar variables REAL, DIMENSION(:,:), ALLOCATABLE :: XIWCZ ! ice water content REAL, DIMENSION(:,:), ALLOCATABLE :: XLWCZ ! liquid water content REAL, DIMENSION(:,:), ALLOCATABLE :: XCRARE ! cloud radar reflectivity @@ -212,6 +214,7 @@ MODULE MODD_SENSOR ALLOCATE( TPSENSOR%XTKE(0, 0) ) END IF ALLOCATE( TPSENSOR%XTH (KLEVELS, KSTORE) ) ; IVARSIZE = IVARSIZE + KLEVELS + ALLOCATE( TPSENSOR%XT (KLEVELS, KSTORE) ) ; IVARSIZE = IVARSIZE + KLEVELS ALLOCATE( TPSENSOR%XR (KLEVELS, KSTORE, NRR) ) ; IVARSIZE = IVARSIZE + KLEVELS * NRR ALLOCATE( TPSENSOR%XSV (KLEVELS, KSTORE, NSV) ) ; IVARSIZE = IVARSIZE + KLEVELS * NSV IF ( CRAD /= 'NONE' ) THEN @@ -224,29 +227,25 @@ MODULE MODD_SENSOR IF ( OVERTPROF ) THEN ALLOCATE( TPSENSOR%XRHOD(IKU, KSTORE) ) ; IVARSIZE = IVARSIZE + IKU + ALLOCATE( TPSENSOR%XSVZ (IKU,KSTORE,NSV) ) ; IVARSIZE = IVARSIZE + IKU * NSV IF ( CCLOUD == 'LIMA') THEN - ALLOCATE( TPSENSOR%XCIZ (IKU, KSTORE) ) ; IVARSIZE = IVARSIZE + IKU - ALLOCATE( TPSENSOR%XCCZ (IKU, KSTORE) ) ; IVARSIZE = IVARSIZE + IKU - ALLOCATE( TPSENSOR%XCRZ (IKU, KSTORE) ) ; IVARSIZE = IVARSIZE + IKU + ALLOCATE( TPSENSOR%XCIZ (0, 0) ) ELSE IF ( CCLOUD(1:3) == 'ICE') THEN ALLOCATE( TPSENSOR%XCIZ (IKU, KSTORE) ) ; IVARSIZE = IVARSIZE + IKU - ALLOCATE( TPSENSOR%XCCZ (0, 0) ) - ALLOCATE( TPSENSOR%XCRZ (0, 0) ) ELSE ALLOCATE( TPSENSOR%XCIZ (0, 0) ) - ALLOCATE( TPSENSOR%XCCZ (0, 0) ) - ALLOCATE( TPSENSOR%XCRZ (0, 0) ) END IF + ALLOCATE( TPSENSOR%XTZ (IKU, KSTORE) ) ; IVARSIZE = IVARSIZE + IKU ALLOCATE( TPSENSOR%XIWCZ (IKU, KSTORE) ) ; IVARSIZE = IVARSIZE + IKU ALLOCATE( TPSENSOR%XLWCZ (IKU, KSTORE) ) ; IVARSIZE = IVARSIZE + IKU ALLOCATE( TPSENSOR%XCRARE (IKU, KSTORE) ) ; IVARSIZE = IVARSIZE + IKU ALLOCATE( TPSENSOR%XCRARE_ATT(IKU, KSTORE) ) ; IVARSIZE = IVARSIZE + IKU ELSE + ALLOCATE( TPSENSOR%XSVZ (0, 0, 0) ) + ALLOCATE( TPSENSOR%XTZ (0, 0) ) ALLOCATE( TPSENSOR%XRHOD (0, 0) ) ALLOCATE( TPSENSOR%XCIZ (0, 0) ) - ALLOCATE( TPSENSOR%XCCZ (0, 0) ) - ALLOCATE( TPSENSOR%XCRZ (0, 0) ) ALLOCATE( TPSENSOR%XIWCZ (0, 0) ) ALLOCATE( TPSENSOR%XLWCZ (0, 0) ) ALLOCATE( TPSENSOR%XCRARE (0, 0) ) @@ -261,14 +260,15 @@ MODULE MODD_SENSOR TPSENSOR%XP (:,:) = XUNDEF TPSENSOR%XTKE (:,:) = XUNDEF TPSENSOR%XTH (:,:) = XUNDEF + TPSENSOR%XT (:,:) = XUNDEF TPSENSOR%XR (:,:,:) = XUNDEF TPSENSOR%XSV (:,:,:) = XUNDEF TPSENSOR%XTSRAD (:) = XUNDEF_SFX TPSENSOR%XRHOD_SENSOR(:) = XNEGUNDEF + TPSENSOR%XTZ (:,:) = XUNDEF TPSENSOR%XRHOD (:,:) = XNEGUNDEF TPSENSOR%XCIZ (:,:) = XUNDEF - TPSENSOR%XCCZ (:,:) = XUNDEF - TPSENSOR%XCRZ (:,:) = XUNDEF + TPSENSOR%XSVZ (:,:,:) = XUNDEF TPSENSOR%XIWCZ (:,:) = XUNDEF TPSENSOR%XLWCZ (:,:) = XUNDEF TPSENSOR%XCRARE (:,:) = XUNDEF @@ -296,14 +296,15 @@ MODULE MODD_SENSOR DEALLOCATE( TPSENSOR%XP ) DEALLOCATE( TPSENSOR%XTKE ) DEALLOCATE( TPSENSOR%XTH ) + DEALLOCATE( TPSENSOR%XT ) DEALLOCATE( TPSENSOR%XR ) DEALLOCATE( TPSENSOR%XSV ) DEALLOCATE( TPSENSOR%XTSRAD ) DEALLOCATE( TPSENSOR%XRHOD_SENSOR ) + DEALLOCATE( TPSENSOR%XTZ ) DEALLOCATE( TPSENSOR%XRHOD ) DEALLOCATE( TPSENSOR%XCIZ ) - DEALLOCATE( TPSENSOR%XCCZ ) - DEALLOCATE( TPSENSOR%XCRZ ) + DEALLOCATE( TPSENSOR%XSVZ ) DEALLOCATE( TPSENSOR%XIWCZ ) DEALLOCATE( TPSENSOR%XLWCZ ) DEALLOCATE( TPSENSOR%XCRARE ) @@ -1003,6 +1004,7 @@ MODULE MODD_SENSOR PBUFFER(KPOS:KPOS+ILVST-1) = RESHAPE( TPSENSOR%XTKE(:,1:ISTORES), [ILVST] ) ; KPOS = KPOS + ILVST END IF PBUFFER(KPOS:KPOS+ILVST-1) = RESHAPE( TPSENSOR%XTH(:,1:ISTORES), [ILVST] ) ; KPOS = KPOS + ILVST + PBUFFER(KPOS:KPOS+ILVST-1) = RESHAPE( TPSENSOR%XT (:,1:ISTORES), [ILVST] ) ; KPOS = KPOS + ILVST PBUFFER(KPOS:KPOS+ILVST*NRR-1) = RESHAPE( TPSENSOR%XR (:,1:ISTORES,:), [ILVST*NRR] ) ; KPOS = KPOS + ILVST * NRR PBUFFER(KPOS:KPOS+ILVST*NSV-1) = RESHAPE( TPSENSOR%XSV(:,1:ISTORES,:), [ILVST*NSV] ) ; KPOS = KPOS + ILVST * NSV IF ( CRAD /= 'NONE' ) THEN @@ -1011,15 +1013,12 @@ MODULE MODD_SENSOR PBUFFER(KPOS:KPOS+ISTORES-1) = TPSENSOR%XRHOD_SENSOR(1:ISTORES) ; KPOS = KPOS + ISTORES IF ( SIZE( TPSENSOR%XRHOD ) > 0 ) THEN + PBUFFER(KPOS:KPOS+IKU*ISTORES-1) = RESHAPE( TPSENSOR%XTZ (:,1:ISTORES), [IKU*ISTORES] ) ; KPOS = KPOS + IKU * ISTORES PBUFFER(KPOS:KPOS+IKU*ISTORES-1) = RESHAPE( TPSENSOR%XRHOD (:,1:ISTORES), [IKU*ISTORES] ) ; KPOS = KPOS + IKU * ISTORES IF ( CCLOUD(1:3) == 'ICE') THEN PBUFFER(KPOS:KPOS+IKU*ISTORES-1) = RESHAPE( TPSENSOR%XCIZ (:,1:ISTORES), [IKU*ISTORES] ) ; KPOS = KPOS + IKU * ISTORES END IF - IF ( CCLOUD == 'LIMA') THEN - PBUFFER(KPOS:KPOS+IKU*ISTORES-1) = RESHAPE( TPSENSOR%XCIZ (:,1:ISTORES), [IKU*ISTORES] ) ; KPOS = KPOS + IKU * ISTORES - PBUFFER(KPOS:KPOS+IKU*ISTORES-1) = RESHAPE( TPSENSOR%XCCZ (:,1:ISTORES), [IKU*ISTORES] ) ; KPOS = KPOS + IKU * ISTORES - PBUFFER(KPOS:KPOS+IKU*ISTORES-1) = RESHAPE( TPSENSOR%XCRZ (:,1:ISTORES), [IKU*ISTORES] ) ; KPOS = KPOS + IKU * ISTORES - END IF + PBUFFER(KPOS:KPOS+IKU*ISTORES*NSV-1) = RESHAPE( TPSENSOR%XSVZ (:,1:ISTORES,:), [IKU*ISTORES*NSV] ) ; KPOS = KPOS + IKU * ISTORES * NSV PBUFFER(KPOS:KPOS+IKU*ISTORES-1) = RESHAPE( TPSENSOR%XIWCZ (:,1:ISTORES), [IKU*ISTORES] ) ; KPOS = KPOS + IKU * ISTORES PBUFFER(KPOS:KPOS+IKU*ISTORES-1) = RESHAPE( TPSENSOR%XLWCZ (:,1:ISTORES), [IKU*ISTORES] ) ; KPOS = KPOS + IKU * ISTORES PBUFFER(KPOS:KPOS+IKU*ISTORES-1) = RESHAPE( TPSENSOR%XCRARE (:,1:ISTORES), [IKU*ISTORES] ) ; KPOS = KPOS + IKU * ISTORES @@ -1130,6 +1129,7 @@ MODULE MODD_SENSOR TPSENSOR%XTKE(:,1:KSTORE) = RESHAPE( PBUFFER(KPOS:KPOS+ILVST-1), [ ILEVELS, KSTORE ] ) ; KPOS = KPOS + ILVST END IF TPSENSOR%XTH(:,1:KSTORE) = RESHAPE( PBUFFER(KPOS:KPOS+ILVST-1), [ ILEVELS, KSTORE ] ) ; KPOS = KPOS + ILVST + TPSENSOR%XT (:,1:KSTORE) = RESHAPE( PBUFFER(KPOS:KPOS+ILVST-1), [ ILEVELS, KSTORE ] ) ; KPOS = KPOS + ILVST TPSENSOR%XR (:,1:KSTORE,:) = RESHAPE( PBUFFER(KPOS:KPOS+ILVST*NRR-1), [ ILEVELS, KSTORE, NRR ] ) ; KPOS = KPOS + ILVST * NRR TPSENSOR%XSV(:,1:KSTORE,:) = RESHAPE( PBUFFER(KPOS:KPOS+ILVST*NSV-1), [ ILEVELS, KSTORE, NSV ] ) ; KPOS = KPOS + ILVST * NSV IF ( CRAD /= 'NONE' ) THEN @@ -1138,15 +1138,12 @@ MODULE MODD_SENSOR TPSENSOR%XRHOD_SENSOR(1:KSTORE) = PBUFFER(KPOS:KPOS+KSTORE-1) ; KPOS = KPOS + KSTORE IF ( SIZE( TPSENSOR%XRHOD ) > 0 ) THEN + TPSENSOR%XTZ (:,1:KSTORE) = RESHAPE( PBUFFER(KPOS:KPOS+IKU*KSTORE-1), [ IKU, KSTORE ] ) ; KPOS = KPOS + IKU * KSTORE TPSENSOR%XRHOD (:,1:KSTORE) = RESHAPE( PBUFFER(KPOS:KPOS+IKU*KSTORE-1), [ IKU, KSTORE ] ) ; KPOS = KPOS + IKU * KSTORE IF ( CCLOUD(1:3) == 'ICE' ) THEN TPSENSOR%XCIZ (:,1:KSTORE) = RESHAPE( PBUFFER(KPOS:KPOS+IKU*KSTORE-1), [ IKU, KSTORE ] ) ; KPOS = KPOS + IKU * KSTORE END IF - IF ( CCLOUD == 'LIMA' ) THEN - TPSENSOR%XCIZ (:,1:KSTORE) = RESHAPE( PBUFFER(KPOS:KPOS+IKU*KSTORE-1), [ IKU, KSTORE ] ) ; KPOS = KPOS + IKU * KSTORE - TPSENSOR%XCCZ (:,1:KSTORE) = RESHAPE( PBUFFER(KPOS:KPOS+IKU*KSTORE-1), [ IKU, KSTORE ] ) ; KPOS = KPOS + IKU * KSTORE - TPSENSOR%XCRZ (:,1:KSTORE) = RESHAPE( PBUFFER(KPOS:KPOS+IKU*KSTORE-1), [ IKU, KSTORE ] ) ; KPOS = KPOS + IKU * KSTORE - END IF + TPSENSOR%XSVZ(:,1:KSTORE,:) = RESHAPE( PBUFFER(KPOS:KPOS+IKU*KSTORE*NSV-1), [ IKU, KSTORE, NSV ] ) ; KPOS = KPOS + IKU * KSTORE * NSV TPSENSOR%XIWCZ (:,1:KSTORE) = RESHAPE( PBUFFER(KPOS:KPOS+IKU*KSTORE-1), [ IKU, KSTORE ] ) ; KPOS = KPOS + IKU * KSTORE TPSENSOR%XLWCZ (:,1:KSTORE) = RESHAPE( PBUFFER(KPOS:KPOS+IKU*KSTORE-1), [ IKU, KSTORE ] ) ; KPOS = KPOS + IKU * KSTORE TPSENSOR%XCRARE (:,1:KSTORE) = RESHAPE( PBUFFER(KPOS:KPOS+IKU*KSTORE-1), [ IKU, KSTORE ] ) ; KPOS = KPOS + IKU * KSTORE diff --git a/src/MNH/profilern.f90 b/src/MNH/profilern.f90 index f95533090650d9f5c3252f178feb93068d322e3a..9cb0edfd7e531d64b0de71b432d9d53d33a2c831 100644 --- a/src/MNH/profilern.f90 +++ b/src/MNH/profilern.f90 @@ -93,7 +93,7 @@ USE MODD_ALLPROFILER_n, ONLY: LDIAG_SURFRAD_PROF USE MODD_CST, ONLY: XCPD, XG, XP00, XPI, XRD, XRV USE MODD_DIAG_IN_RUN, ONLY: XCURRENT_TKE_DISS USE MODD_GRID, ONLY: XBETA, XLON0, XRPK -USE MODD_NSV, ONLY: NSV_C2R2BEG, NSV_LIMA_NC, NSV_LIMA_NR, NSV_LIMA_NI +USE MODD_NSV, ONLY: NSV_C2R2BEG USE MODD_PARAMETERS, ONLY: JPVEXT, XUNDEF USE MODD_PARAM_n, ONLY: CCLOUD, CRAD USE MODD_PROFILER_n @@ -331,6 +331,8 @@ PROFILER: DO JP = 1, NUMBPROFILER_LOC TPROFILERS(JP)%XDD (:,IN) = ZDD(:) TPROFILERS(JP)%XW (:,IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( PW ) TPROFILERS(JP)%XTH (:,IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( PTH ) + TPROFILERS(JP)%XT (:,IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( ZTEMP ) + TPROFILERS(JP)%XTZ (:,IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( ZTEMP ) TPROFILERS(JP)%XTHV (:,IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( ZTHV ) IF ( CCLOUD == 'C2R2' .OR. CCLOUD == 'KHKO' ) & TPROFILERS(JP)%XVISIGUL(:,IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( ZVISIGUL ) @@ -339,9 +341,6 @@ PROFILER: DO JP = 1, NUMBPROFILER_LOC TPROFILERS(JP)%XZZ (:,IN) = ZZ(:) TPROFILERS(JP)%XRHOD(:,IN) = ZRHOD(:) IF (CCLOUD=="LIMA") THEN - TPROFILERS(JP)%XCIZ(:,IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( PSV(:,:,:,NSV_LIMA_NI) ) - TPROFILERS(JP)%XCCZ(:,IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( PSV(:,:,:,NSV_LIMA_NC) ) - TPROFILERS(JP)%XCRZ(:,IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( PSV(:,:,:,NSV_LIMA_NR) ) ELSE IF ( CCLOUD=="ICE3" .OR. CCLOUD=="ICE4" ) THEN TPROFILERS(JP)%XCIZ(:,IN) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( PCIT ) END IF @@ -358,6 +357,7 @@ PROFILER: DO JP = 1, NUMBPROFILER_LOC ZWORK(:,:,1,:)=PSV(:,:,2,:) DO JSV=1,SIZE(PSV,4) TPROFILERS(JP)%XSV (:,IN,JSV) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( ZWORK(:,:,:,JSV) ) + TPROFILERS(JP)%XSVZ (:,IN,JSV) = TPROFILERS(JP)%INTERP_HOR_FROM_MASSPOINT( ZWORK(:,:,:,JSV) ) END DO ZWORK2(:,:,:,:) = 0. DO JK=IKB,IKE diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90 index a1b978be286734a3a65d09439ffd0d0792e0300c..0c8c59b4ba96fddb147a2fe36628b7e68997b118 100644 --- a/src/MNH/write_aircraft_balloon.f90 +++ b/src/MNH/write_aircraft_balloon.f90 @@ -254,7 +254,7 @@ IF ( ALL( TPFLYER%XX == XUNDEF ) ) RETURN ! IKU = SIZE(TPFLYER%XRTZ,1) !number of vertical levels ! -IPROC = 10 + IRR + SIZE(TPFLYER%XSV,3) + 2 + SIZE(TPFLYER%XSVW_FLUX,2) +IPROC = 11 + IRR + SIZE(TPFLYER%XSV,3) + 2 + SIZE(TPFLYER%XSVW_FLUX,2) IF ( IRR > 1 ) IPROC = IPROC + 1 IF ( SIZE( TPFLYER%XTKE ) > 0 ) IPROC = IPROC + 1 IPROC = IPROC + 1 ! TKE_DISS @@ -291,6 +291,7 @@ call Add_point( 'ZON_WIND', 'zonal wind', 'm s-1', tpflyer%xzon(1,:) call Add_point( 'MER_WIND', 'meridian wind', 'm s-1', tpflyer%xmer(1,:) ) call Add_point( 'W', 'air vertical speed', 'm s-1', tpflyer%xw(1,:) ) call Add_point( 'Th', 'potential temperature', 'K', tpflyer%xth(1,:) ) +call Add_point( 'T', 'temperature', 'K', tpflyer%xt(1,:) ) ! if ( irr >= 1 ) call Add_point( 'Rv', 'water vapor mixing ratio', 'kg kg-1', tpflyer%xr(1,:,1) ) if ( irr >= 2 ) call Add_point( 'Rc', 'liquid cloud water mixing ratio', 'kg kg-1', tpflyer%xr(1,:,2) ) @@ -430,8 +431,7 @@ call Sensor_write_workarrays_deallocate( ) !---------------------------------------------------------------------------- !Treat vertical profiles -IPROCZ = 9 + IRR -IF ( CCLOUD == 'LIMA' ) IPROCZ = IPROCZ + 3 +IPROCZ = 10 + IRR + NSV IF ( CCLOUD(1:3) == 'ICE' ) IPROCZ = IPROCZ + 1 call Sensor_write_workarrays_allocate( iku, istore, iprocz ) @@ -448,14 +448,25 @@ if ( irr >= 7 ) call Add_profile( 'Rh', '1D Hail mixing ratio', 'k call Add_profile( 'FF', 'Horizontal wind', 'm s-1', tpflyer%xffz(:,:) ) +call Add_profile( 'T', 'Temperature', 'K', tpflyer%xtz(:,:) ) + call Add_profile( 'IWC', 'Ice water content', 'kg m-3', tpflyer%xiwcz(:,:) ) call Add_profile( 'LWC', 'Liquid water content', 'kg m-3', tpflyer%xlwcz(:,:) ) call Add_profile( 'Rhod', 'Density of dry air', 'kg m-3', tpflyer%xrhod(:,:) ) + +IF (SIZE(TPFLYER%XSVZ,3)>=1) THEN + ! Scalar variables + DO JSV = 1, NSV + IF ( TRIM( TSVLIST(JSV)%CUNITS ) == 'ppv' ) THEN + call Add_profile( Trim( tsvlist(jsv)%cmnhname ), '', 'ppb', tpflyer%xsvz(:,:,jsv) * 1.e9 ) !*1e9 for conversion ppv->ppb + ELSE + call Add_profile( Trim( tsvlist(jsv)%cmnhname ), '', Trim( tsvlist(jsv)%cunits ), tpflyer%xsvz(:,:,jsv) ) + END IF + END DO +ENDIF + IF ( CCLOUD == 'LIMA' ) THEN - call Add_profile( 'CCLOUDT', 'liquid cloud concentration', 'kg-1', tpflyer%xccz(:,:) ) - call Add_profile( 'CRAINT', 'Rain concentration', 'kg-1', tpflyer%xcrz(:,:) ) - call Add_profile( 'CICET', 'Ice concentration', 'kg-1', tpflyer%xciz(:,:) ) ELSE IF ( CCLOUD == 'ICE3' .OR. CCLOUD == 'ICE4' ) THEN call Add_profile( 'CIT', 'Ice concentration', 'm-3', tpflyer%xciz(:,:) ) END IF diff --git a/src/MNH/write_profilern.f90 b/src/MNH/write_profilern.f90 index a5f1ddd398c231fed6087c15cf4b9da3a372d016..a00231ef22497f3454ce6b1c205d28b9bbdd2290 100644 --- a/src/MNH/write_profilern.f90 +++ b/src/MNH/write_profilern.f90 @@ -89,11 +89,10 @@ type(tfieldmetadata_base), dimension(:), allocatable :: tzfields IKU = NKMAX + 2 * JPVEXT !Number of vertical levels -IPROC = 13 + NRR + NSV +IPROC = 14 + NRR + NSV if ( ccloud == 'C2R2' .or. ccloud == 'KHKO' ) IPROC = IPROC + 1 if ( ccloud /= 'NONE' .and. ccloud /= 'REVE' ) IPROC = IPROC + 1 if ( ccloud == 'ICE3' .or. ccloud == 'ICE4' ) IPROC = IPROC + 1 -if ( ccloud == 'LIMA' ) IPROC = IPROC + 3 IF ( LORILAM ) IPROC = IPROC + JPMODE * ( 3 + NSOA + NCARB + NSP ) IF ( LDUST ) IPROC = IPROC + NMODE_DST * 3 IF ( LSALT ) IPROC = IPROC + NMODE_SLT * 3 @@ -108,6 +107,7 @@ call Sensor_write_workarrays_allocate( iku, istore, iproc ) !Treat vertical profiles call Add_profile( 'Th', 'Potential temperature', 'K', tpprofiler%xth ) +call Add_profile( 'T', 'Temperature', 'K', tpprofiler%xtz ) call Add_profile( 'Thv', 'Virtual Potential temperature', 'K', tpprofiler%xthv ) if ( ccloud == 'C2R2' .or. ccloud == 'KHKO' ) & call Add_profile( 'VISIGUL', 'Visibility Gultepe', 'km', tpprofiler%xvisigul ) @@ -130,9 +130,6 @@ jproc_w = Sensor_current_processes_number_get() call Add_profile( 'TKE_DISS', 'TKE dissipation rate', 'm2 s-2', tpprofiler%xtke_diss ) if ( ccloud == 'LIMA' ) then - call Add_profile( 'CCLOUDT', 'liquid cloud concentration', 'kg-1', tpprofiler%xccz(:,:) ) - call Add_profile( 'CRAINT', 'Rain concentration', 'kg-1', tpprofiler%xcrz(:,:) ) - call Add_profile( 'CICET', 'Ice concentration', 'kg-1', tpprofiler%xciz(:,:) ) else if ( ccloud == 'ICE3' .or. ccloud == 'ICE4' ) then call Add_profile( 'CIT', 'Ice concentration', 'm-3', tpprofiler%xciz(:,:) ) end if @@ -255,7 +252,7 @@ call Sensor_write_workarrays_deallocate( ) !---------------------------------------------------------------------------- !Treat point values -IPROC = 4 +IPROC = 5 IF (LDIAG_SURFRAD_PROF) THEN IPROC = IPROC + 10 IF(CRAD/="NONE") IPROC = IPROC + 8 @@ -275,6 +272,7 @@ call Add_point( 'IWV', 'Integrated Water Vapour', 'kg m-2', tpprofiler%xiwv ) call Add_point( 'ZTD', 'Zenith Tropospheric Delay', 'm', tpprofiler%xztd ) call Add_point( 'ZWD', 'Zenith Wet Delay', 'm', tpprofiler%xzwd ) call Add_point( 'ZHD', 'Zenith Hydrostatic Delay', 'm', tpprofiler%xzhd ) +call Add_point( 'T', 'Temperature', 'K', tpprofiler%xt(1,:) ) if ( crad /= 'NONE' ) call Add_point( 'Tsrad', 'Radiative Surface Temperature', 'K', tpprofiler%xtsrad(:) )