From 46feb413d36d8fec4b95078d66317477260903a6 Mon Sep 17 00:00:00 2001
From: Jean-Pierre CHABOUREAU <jean-pierre.chaboureau@aero.obs-mip.fr>
Date: Fri, 21 Oct 2022 17:36:56 +0200
Subject: [PATCH] Jean-Pierre 21/10/2022: PREP_REAL_CASE fix for GFS/ERA5
 analysis on pressure levels

---
 src/MNH/read_all_data_grib_case.f90 | 17 +++++++++--------
 src/MNH/ver_prep_gribex_case.f90    | 29 ++++++++++++++---------------
 2 files changed, 23 insertions(+), 23 deletions(-)

diff --git a/src/MNH/read_all_data_grib_case.f90 b/src/MNH/read_all_data_grib_case.f90
index 04a8ff5e8..ec83d1da9 100644
--- a/src/MNH/read_all_data_grib_case.f90
+++ b/src/MNH/read_all_data_grib_case.f90
@@ -136,7 +136,8 @@ END MODULE MODI_READ_ALL_DATA_GRIB_CASE
 !  Q. Rodier   21/04/2020: correction GFS u and v wind component written in the right vertical order
 !  Q. Rodier   02/09/2020: Read and interpol geopotential height for interpolation on isobaric surface Grid of NCEP
 !  P. Wautelet 09/03/2021: move some chemistry initializations to ini_nsv
-!JP Chaboureau 02/08/2021: add ERA5 reanlysis in pressure levels
+!JP Chaboureau 02/08/2021: add ERA5 reanalysis in pressure levels
+!JP Chaboureau 18/10/2022: correction on vertical level for GFS and ERA5 reanalyses in pressure levels
 !-------------------------------------------------------------------------------
 !
 !*      0. DECLARATIONS
@@ -925,6 +926,9 @@ ALLOCATE (ZEXNM_G(INI,INLEVEL))
 ZEXNM_G(:,1:INLEVEL-1) = (ZEXNF_G(:,1:INLEVEL-1)-ZEXNF_G(:,2:INLEVEL)) / &
                      (LOG(ZEXNF_G(:,1:INLEVEL-1))-LOG(ZEXNF_G(:,2:INLEVEL)))
 ZEXNM_G(:,INLEVEL) = (ZPF_G(:,INLEVEL)/2./XP00)**(XRD/XCPD)
+!
+IF (IMODEL==10.OR.IMODEL==11) ZEXNM_G(:,:)=ZEXNF_G(:,:) ! for GFS and ERA5 on pressure levels
+!
 DEALLOCATE (ZEXNF_G)
 DEALLOCATE (ZPF_G)
 !
@@ -1010,8 +1014,6 @@ ALLOCATE (ZRV_G(INI))
 ALLOCATE (ZOUT(INO))
 IF (IMODEL/=10) THEN ! others than NCEP
   DO JLOOP1=1, INLEVEL
-    !WRITE (ILUOUT0,*) 'JLOOP1=',JLOOP1,MINVAL(ZPM_G(:,JLOOP1)),MINVAL(ZT_G(:,JLOOP1)),MINVAL(ZQ_G(:,JLOOP1))
-    !WRITE (ILUOUT0,*) '                     ',MAXVAL(ZPM_G(:,JLOOP1)),MAXVAL(ZT_G(:,JLOOP1)),MAXVAL(ZQ_G(:,JLOOP1))
     !
     ! Compute Theta V and relative humidity on grib grid
     !
@@ -1039,17 +1041,13 @@ IF (IMODEL/=10) THEN ! others than NCEP
     CALL ARRAY_1D_TO_2D (INO,ZOUT,IIU,IJU,ZTHV_LS(:,:,JLOOP1))
     !
   END DO
-ELSE !NCEP
+ELSE !GFS and ERA5 on pressure levels
   DO JLOOP1=1, INLEVEL
-    !WRITE (ILUOUT0,*) 'JLOOP1=',JLOOP1,MINVAL(ZPM_G(:,JLOOP1)),MINVAL(ZT_G(:,JLOOP1)),MINVAL(ZQ_G(:,JLOOP1))
-    !WRITE (ILUOUT0,*) '                     ',MAXVAL(ZPM_G(:,JLOOP1)),MAXVAL(ZT_G(:,JLOOP1)),MAXVAL(ZQ_G(:,JLOOP1))
     ZH_G(:)  =ZQ_G(:,JLOOP1)
     ZRV_G(:) = (XRD/XRV)*SM_FOES(ZT_G(:,JLOOP1))*0.01*ZH_G(:) &
                         /(ZPM_G(:,JLOOP1) -SM_FOES(ZT_G(:,JLOOP1))*0.01*ZH_G(:))
-    !WRITE (ILUOUT0,*) '                     ',MINVAL(ZRV_G(:)),MAXVAL(ZRV_G(:))
     ZTHV_G(:)=ZT_G(:,JLOOP1) * ((XP00/ZPM_G(:,JLOOP1))**(XRD/XCPD)) * &
                                ((1. + XRV*ZRV_G(:)/XRD) / (1. + ZRV_G(:)))
-    !WRITE (ILUOUT0,*) '                     ',MINVAL(ZTHV_G(:)),MAXVAL(ZTHV_G(:))
     !
     ! Interpolation : H           
     CALL HORIBL(ZPARAM(3),ZPARAM(4),ZPARAM(5),ZPARAM(6),INT(ZPARAM(2)),IINLO,INI, &
@@ -1140,6 +1138,9 @@ ALLOCATE (ZEXNM_LS(IIU,IJU,INLEVEL))
 ZEXNM_LS(:,:,1:INLEVEL-1) = (ZEXNF_LS(:,:,1:INLEVEL-1)-ZEXNF_LS(:,:,2:INLEVEL)) / &
                      (LOG(ZEXNF_LS(:,:,1:INLEVEL-1))-LOG(ZEXNF_LS(:,:,2:INLEVEL)))
 ZEXNM_LS(:,:,INLEVEL) = (ZPF_LS(:,:,INLEVEL)/2./XP00)**(XRD/XCPD)
+!
+IF (IMODEL==10.OR.IMODEL==11) ZEXNM_LS(:,:,:)=ZEXNF_LS(:,:,:) ! for GFS and ERA5 on pressure levels
+!
 DEALLOCATE (ZEXNF_LS)
 DEALLOCATE (ZPF_LS)
 !
diff --git a/src/MNH/ver_prep_gribex_case.f90 b/src/MNH/ver_prep_gribex_case.f90
index 8a6cc54bb..0763ea885 100644
--- a/src/MNH/ver_prep_gribex_case.f90
+++ b/src/MNH/ver_prep_gribex_case.f90
@@ -87,6 +87,8 @@ END MODULE MODI_VER_PREP_GRIBEX_CASE
 !!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
 !!                  Sep, 02, 2020 (Q. Rodier) use of geopotential height instead of
 !!                                height above orography for isobaric surface interpolation
+!!                  Oct, 18 2022 (J.-P. Chaboureau) correction on vertical level
+!!                           for input fields on isobaric surface (GFS and ERA5)
 !-------------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
@@ -142,6 +144,7 @@ REAL,DIMENSION(:,:,:), ALLOCATABLE :: ZTKE_LS
 INTEGER                            :: JRR     ! loop counter
 INTEGER                            :: JSV     ! loop counter
 INTEGER                            :: JK      ! loop counter
+CHARACTER(LEN=4)                   :: YWLOC_LS ! localisation of vertical wind speed
 !-------------------------------------------------------------------------------
 !
 ILUOUT0 = TLUOUT0%NLU
@@ -195,6 +198,9 @@ END IF
 ALLOCATE(ZZMASS_LS(IIU,IJU,ILU+2*JPVEXT))
 ALLOCATE(ZSV_LS(IIU,IJU,ILU+2*JPVEXT,SIZE(XSV_LS,4)))
 IF (HFILE(1:3)=='ATM') THEN
+  IF (SIZE(XB_LS)==0) THEN   ! pressure level
+    XZMASS_LS(:,:,:)=XGH_LS(:,:,:)
+  END IF
   ALLOCATE(ZZFLUX_LS(IIU,IJU,ILU+2*JPVEXT))
   ALLOCATE(ZPMHP_LS(IIU,IJU,ILU+2*JPVEXT))
   ALLOCATE(ZTHV_LS(IIU,IJU,ILU+2*JPVEXT))
@@ -262,27 +268,20 @@ IF (HFILE(1:3)=='ATM') THEN
 END IF
 !
 IF (HFILE(1:3)=='ATM') THEN
-
-  IF (SIZE(XB_LS)/=0) THEN   ! hybrid level (w at flux points)
-  CALL VER_INTERP_TO_MIXED_GRID('ATM ',.TRUE.,XZS_LS,XZSMT_LS,    &
+  IF (SIZE(XB_LS)/=0) THEN  ! hybrid level (w at flux points)
+    YWLOC_LS='FLUX'
+  ELSE                      ! isobaric surfaces (w at mass points)
+    YWLOC_LS='MASS'
+  END IF
+  !Warning, for pressure level (GFS and ERA5 only for now), ZZFLUX_LS is not correct (but not used)
+  CALL VER_INTERP_TO_MIXED_GRID('ATM ',.TRUE.,XZS_LS,XZSMT_LS,   &
                                 ZZMASS_LS,ZSV_LS,                &
                                 ZZFLUX_LS,XPS_LS,ZPMHP_LS,       &
                                 ZTHV_LS,ZR_LS,                   &
                                 ZHU_LS,                          &
                                 ZTKE_LS,                         &
                                 ZU_LS,ZV_LS,                     &
-                                ZW_LS,'FLUX'                     )
-  ELSE                      ! isobaric surfaces (w at mass points)
-    !Warning, in that case (NCEP only for now) ZZFLUX_LS is not correct (but not used)
-    CALL VER_INTERP_TO_MIXED_GRID('ATM ',.TRUE.,XZS_LS,XZSMT_LS,    &
-                                  XGH_LS,ZSV_LS, &
-                                  ZZFLUX_LS,XPS_LS,ZPMHP_LS,       &
-                                  ZTHV_LS,ZR_LS,                   &
-                                  ZHU_LS,                          &
-                                  ZTKE_LS,                         &
-                                  ZU_LS,ZV_LS,                     &
-                                  ZW_LS,'MASS'                     )
-  END IF
+                                ZW_LS,YWLOC_LS                   )
 ELSE IF (HFILE=='CHEM') THEN
   CALL VER_INTERP_TO_MIXED_GRID(HFILE,.TRUE.,XZS_SV_LS,XZS_SV_LS,&
                                 ZZMASS_LS,ZSV_LS                 )
-- 
GitLab