From 230a960abf7b940584be862825c4e45f797242cb Mon Sep 17 00:00:00 2001
From: Gaelle Tanguy <gaelle.tanguy@meteo.fr>
Date: Thu, 23 Apr 2015 14:20:48 +0000
Subject: [PATCH] Gaelle 23/04/2015 : add case AGRB llav LLAV + correction for
 FF10MAX+add CFIXRESOL for grib case

---
 tools/diachro/src/EXTRACTDIA/extractdia.f90 | 110 +++++++++++++++++---
 tools/diachro/src/EXTRACTDIA/writegrib.f90  |   4 +
 tools/diachro/src/EXTRACTDIA/writellhv.f90  |   6 +-
 3 files changed, 100 insertions(+), 20 deletions(-)

diff --git a/tools/diachro/src/EXTRACTDIA/extractdia.f90 b/tools/diachro/src/EXTRACTDIA/extractdia.f90
index b06819b4d..8f443df69 100644
--- a/tools/diachro/src/EXTRACTDIA/extractdia.f90
+++ b/tools/diachro/src/EXTRACTDIA/extractdia.f90
@@ -87,7 +87,13 @@
 !       11/07/2014 (G. TANGUY) : correction pour les donnees LES de type SSOl
 !                                (vlev et field ne correspondaient pas suite à
 !                                mauvais zoom)
-!-------------------------------------------------------------------------------
+!       16/12/2014 (G.DELAUTIER) : ajout cas LLAV llav : altitude au dessus du
+!       sol
+!       18/02/2015 (G.DELAUTIER) : ajout cas AGRB : altitude au dessus du
+!       sol
+!       Avril 2015 (G.DELAUTIER) : ajout CFIXRESOL pour car GRIB +correction
+!       pour FF10MAX
+! -----------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
 !              ------------
@@ -210,8 +216,13 @@ LOGICAL :: LVAR2D
 INTEGER :: ILEVEL2D ! en option : altitude du champ 2D à coder dans le fichier GRIB
 LOGICAL :: LLEVEL2D 
 REAL,DIMENSION(4) :: ZLATLON
+INTEGER,DIMENSION(4) :: ILATLON
 INTEGER :: INX,INY
 REAL,DIMENSION(:,:,:),ALLOCATABLE :: ZALT
+REAL,DIMENSION(:,:,:),ALLOCATABLE :: zlistevert3D
+INTEGER :: IZLIST
+CHARACTER(LEN=1) :: CFIXRESOL
+REAL :: ZDX_GRB,ZDY_GRB,ZCONTROL
 !-------------------------------------------------------------------------------
 !
 !*       1.     INIT
@@ -262,7 +273,7 @@ READ(5,'(A28)') YFILEIN
 CALL WRITEDIR(ILUDIR,YFILEIN)
 !
 PRINT*, '- type of the output file ?'
-PRINT*, '(DIAC/llhv/llzv/llpv/LLHV/LLZV/LLPV/IJHV/IJZV/IJPV/jihv/jizv/jipv/FREE/KCDL/ZCDL/PCDL/ZGRB/PGRB)'
+PRINT*, '(DIAC/llhv/llzv/llpv/llav/LLHV/LLZV/LLPV/LLAV/IJHV/IJZV/IJPV/jihv/jizv/jipv/FREE/KCDL/ZCDL/PCDL/ZGRB/PGRB/AGRB)'
 READ(5,'(A4)')YTYPEOUT
 CALL WRITEDIR(ILUDIR,YTYPEOUT)
 PRINT*,'the file ',TRIM(YFILEIN),' will be converted in type ',YTYPEOUT
@@ -281,7 +292,8 @@ NVERB=ilocverbia                          ! verbosity of mesonh routines
 !
 SELECT CASE (YTYPEOUT)                                   
   CASE('LLHV','llhv','DIAC','FREE','KCDL','ZCDL','PCDL','llzv','LLZV',&
-          &'llpv','LLPV','IJHV','IJZV','IJPV','jihv','jizv','jipv','ZGRB','PGRB') ! lecture des choix de l utilisateur
+          &'llpv','LLPV','IJHV','IJZV','IJPV','jihv','jizv','jipv','ZGRB','PGRB','AGRB',&
+          &'llav','LLAV') ! lecture des choix de l utilisateur
     IF ( YTYPEOUT == 'FREE' ) THEN
       PRINT*, '- format of writing for fields ? '
       PRINT*, '    (fortran syntaxe of FMT in WRITE)'
@@ -293,7 +305,8 @@ SELECT CASE (YTYPEOUT)
     ENDIF
     ! lecture du zoom
     IND_VERT= INDEX(YTYPEOUT(1:4),'Z') + INDEX(YTYPEOUT(1:4),'P') + &
-              INDEX(YTYPEOUT(1:4),'z') + INDEX(YTYPEOUT(1:4),'p')
+              INDEX(YTYPEOUT(1:4),'z') + INDEX(YTYPEOUT(1:4),'p') + &
+              INDEX(YTYPEOUT(1:4),'a') + INDEX(YTYPEOUT(1:4),'A')
     IND_LL= INDEX(YTYPEOUT(1:2),'L') + INDEX(YTYPEOUT(1:2),'l') 
     IND_IJ= INDEX(YTYPEOUT(1:2),'IJ') + INDEX(YTYPEOUT(1:2),'ji') 
     IND_GRB=INDEX(YTYPEOUT(1:4),'GRB')
@@ -327,8 +340,8 @@ print*,YTYPEOUT,IND_IJ
         CALL WRITEDIR(ILUDIR,ikfin)
       END IF
     ELSE
-      ! cas 'llzv','LLZV','llpv','LLPV','llhv','LLHV'
-      !      'ZGRB','PGRB'
+      ! cas 'llzv','LLZV','llpv','LLPV','llhv','LLHV','llav' 'LLAV'
+      !      'ZGRB','PGRB','AGRB'
       PRINT*, '- zoom on the 2 first directions: '
       PRINT*, '              lonmin,lonmax,latmin,latmax'
       PRINT*, '0.,0.,0.,0. for the whole physical domain'
@@ -353,6 +366,21 @@ print*,YTYPEOUT,IND_IJ
       else
         ijdeb=-2 ; ijfin=-2
       endif
+      IF (IND_GRB/=0) THEN
+        PRINT*,'Do you want to fix resolution in x and y ? (y/n)'
+        PRINT*,'(only available with LALO)'
+        READ(5,*) CFIXRESOL
+        CALL WRITEDIR(ILUDIR,CFIXRESOL)
+        IF (CFIXRESOL=='y') THEN
+          PRINT*,'Enter x resolution (in millidegrees)'
+          READ(5,*) ZDX_GRB
+          PRINT*,'Enter y resolution (in millidegrees)'
+          READ(5,*) ZDY_GRB
+          CALL WRITEDIR(ILUDIR,ZDX_GRB)
+          CALL WRITEDIR(ILUDIR,ZDY_GRB)
+        ENDIF
+
+      ENDIF
       IF (IND_VERT==0) THEN
         ! cas 'llhv','LLHV'
         PRINT*, '- zoom on the 3rd dimension: '
@@ -425,8 +453,9 @@ print*,YTYPEOUT,IND_IJ
     ENDIF
   CASE DEFAULT
     PRINT*, 'Incorrect value for the output type:',YTYPEOUT
-    PRINT*, ' the following ones are currently available : DIAC,LLHV,llhv,FREE,KCDL,ZCDL,PCDL,llzv,LLZV,llpv,LLPV'
-    PRINT*, 'IJHV,IJZV,IJPV,jihv,jizv,jipv'
+    PRINT*, 'the following ones are currently available :'
+    PRINT*, 'DIAC,LLHV,llhv,FREE,KCDL,ZCDL,PCDL,llzv,LLZV,llpv,LLPV,llav,LLAV'
+    PRINT*, 'IJHV,IJZV,IJPV,jihv,jizv,jipv,ZGRB,PGRB,AGRB'
     STOP
 END SELECT
 ! 
@@ -539,7 +568,7 @@ DO JGR=1,10000
   IF ( CGROUP(1:2) == 'UT' .OR. &
        CGROUP(1:2) == 'VT' .OR. &
        CGROUP(1:2) == 'DD' .OR. &
-       CGROUP(1:2) == 'FF'      )  THEN
+       CGROUP(1:2) == 'FF' .AND. CGROUP(1:7) /= 'FF10MAX'     )  THEN
     !
     IF ( (CGROUP(1:2)=='UT'.OR.CGROUP(1:2)=='VT') .AND. &
           YOUTGRID(1:4) /= 'LALO'                       ) THEN
@@ -1017,7 +1046,7 @@ DO JGR=1,10000
         end if
       !
       CASE('KCDL','ZCDL','PCDL','LLZV','LLPV','llpv','llzv',&
-             & 'IJZV','jizv','IJPV','jipv')
+             & 'IJZV','jizv','IJPV','jipv','llav','LLAV')
         ! replace field at mass points
         IF ( CGROUP /= 'VLEV' ) THEN
           If (ALLOCATED(ZWORK3D))DEALLOCATE(ZWORK3D)
@@ -1094,6 +1123,14 @@ DO JGR=1,10000
                   ikdebzint=2
                   IF (INDEX(YTYPEOUT(1:4),'Z')/=0 .OR. INDEX(YTYPEOUT(1:4),'z')/=0) THEN
                     CALL ZINTER(ZWORK3D,XZZ,ZVARZCST,zlistevert,ikdebzint,XSPVAL)
+                  ELSE IF (INDEX(YTYPEOUT(1:4),'A')/=0 .OR. INDEX(YTYPEOUT(1:4),'a')/=0) THEN
+                    IF (.NOT. ALLOCATED(zlistevert3D)) THEN
+                      ALLOCATE(zlistevert3D(SIZE(XZS,1),SIZE(XZS,2),SIZE(zlistevert)))
+                      DO IZLIST=1,SIZE(zlistevert)
+                        zlistevert3D(:,:,IZLIST)=XZS(:,:)+zlistevert(IZLIST)
+                      ENDDO
+                    ENDIF     
+                    CALL SINTER(ZWORK3D,XZZ,ZVARZCST,zlistevert3D,ikdebzint,XSPVAL)
                   ELSE IF (INDEX(YTYPEOUT(1:4),'P')/=0 .OR. INDEX(YTYPEOUT(1:4),'p')/=0) THEN
                     CALL PINTER(ZWORK3D,0,XSPVAL,zlistevert,ZVARZCST,ZPABS)
                   ELSE IF (INDEX(YTYPEOUT(1:4),'H')/=0 .OR. INDEX(YTYPEOUT(1:4),'h')/=0) THEN
@@ -1295,7 +1332,7 @@ DO JGR=1,10000
             ivarjfin=IZOOMJFIN
           ENDIF
           SELECT CASE(YTYPEOUT(1:4))
-          CASE('LLZV','llzv','LLPV','llpv')
+          CASE('LLZV','llzv','LLPV','llpv','LLAV','llav')
             IF (allocated(ZWORK3D)) DEALLOCATE(ZWORK3D)
             ALLOCATE(ZWORK3D(size(XVAR,1),size(XVAR,2),size(XVAR,3)))
             IF (SIZE(XVAR,3)==inbvertz) THEN
@@ -1356,7 +1393,7 @@ DO JGR=1,10000
           END SELECT
         ELSE ! pas d interpolation horizontale
           SELECT CASE(YTYPEOUT(1:4))
-          CASE('LLZV','llzv','LLPV','llpv','IJZV','jizv','IJPV','jipv')
+          CASE('LLZV','llzv','LLPV','llpv','IJZV','jizv','IJPV','jipv','LLAV','llav')
             IF (SIZE(XVAR,3)==inbvertz) THEN  ! champ 3D
               IF (allocated(ZWORK3D)) DEALLOCATE(ZWORK3D)
               ALLOCATE(ZWORK3D(size(XVAR,1),size(XVAR,2),size(XVAR,3)))
@@ -1370,6 +1407,7 @@ DO JGR=1,10000
             ELSE                              ! champ 2D
               IF((YTYPEOUT(3:3)=='z').OR.(YTYPEOUT(3:3)=='p')) YTYPEOUT3='h'
               IF((YTYPEOUT(3:3)=='Z').OR.(YTYPEOUT(3:3)=='P')) YTYPEOUT3='H'
+              IF((YTYPEOUT(3:3)=='a').OR.(YTYPEOUT(3:3)=='A')) YTYPEOUT3='H'
               CALL WRITELLHV(ivarideb,ivarifin,ivarjdeb,ivarjfin, &
                        ivarkdeb,ivarkfin,ivartinf,ivartsup, &
                        ivartrajinf,ivartrajsup,ivarprocinf,ivarprocsup, &
@@ -1431,7 +1469,7 @@ DO JGR=1,10000
         ! retour a XZZ pour NGRID a 4 (cf readvar)
         CALL COMPCOORD_FORDIACHRO(4)
 !============================================   
-   CASE('ZGRB','PGRB')
+   CASE('ZGRB','PGRB','AGRB')
         IF(SIZE(XVAR,3)==1) THEN
            LVAR2D=.TRUE.
         ENDIF
@@ -1492,6 +1530,14 @@ DO JGR=1,10000
                   ikdebzint=2
                   IF (INDEX(YTYPEOUT(1:4),'Z')/=0 .OR. INDEX(YTYPEOUT(1:4),'z')/=0) THEN
                     CALL ZINTER(ZWORK3D,XZZ,ZVARZCST,zlistevert,ikdebzint,XSPVAL)
+                  ELSE IF (INDEX(YTYPEOUT(1:4),'A')/=0 .OR. INDEX(YTYPEOUT(1:4),'a')/=0) THEN
+                    IF (.NOT. ALLOCATED(zlistevert3D)) THEN
+                      ALLOCATE(zlistevert3D(SIZE(XZS,1),SIZE(XZS,2),SIZE(zlistevert)))
+                      DO IZLIST=1,SIZE(zlistevert)
+                        zlistevert3D(:,:,IZLIST)=XZS(:,:)+zlistevert(IZLIST)
+                      ENDDO
+                    ENDIF     
+                    CALL SINTER(ZWORK3D,XZZ,ZVARZCST,zlistevert3D,ikdebzint,XSPVAL)
                   ELSE IF (INDEX(YTYPEOUT(1:4),'P')/=0 .OR. INDEX(YTYPEOUT(1:4),'p')/=0) THEN
                     CALL PINTER(ZWORK3D,0,XSPVAL,zlistevert,ZVARZCST,ZPABS)
                   ELSE IF (INDEX(YTYPEOUT(1:4),'H')/=0 .OR. INDEX(YTYPEOUT(1:4),'h')/=0) THEN
@@ -1525,8 +1571,38 @@ DO JGR=1,10000
           IF (ZJDEB /=0 .AND. ZJDEB/=-1) ZLATLON(2)=zjdeb*1000.
           IF (ZIDEB /=0 .AND. ZIDEB/=-1) ZLATLON(3)=zideb*1000.
           IF (ZIFIN /=0 .AND. ZIFIN/=-1) ZLATLON(4)=zifin*1000.
-
-          CALL INI2LALO(ZLATLON,INX,INY)
+         
+          ILATLON(:)=ZLATLON(:)
+          
+          IF (ILATLON(1)>  ZLATLON(1)) ILATLON(1)=ILATLON(1)-1
+          IF (ILATLON(2)<  ZLATLON(2)) ILATLON(2)=ILATLON(2)+1
+          IF (ILATLON(3)<  ZLATLON(3)) ILATLON(3)=ILATLON(3)+1
+          IF (ILATLON(4)>  ZLATLON(4)) ILATLON(4)=ILATLON(4)-1
+ 
+          ZLATLON=ILATLON
+          IF (CFIXRESOL=="y") THEN
+            INX=(ZLATLON(4)-ZLATLON(3))/ZDX_GRB +1 
+            INY=(ZLATLON(1)-ZLATLON(2))/ZDY_GRB +1 
+            ZCONTROL=ZLATLON(3)+(INX-1)*ZDX_GRB
+            IF (ZCONTROL/=ZLATLON(4)) THEN
+              print*,"warning : need to change E longitude"
+              ZLATLON(4)=ZCONTROL
+              print*,"lon min" ,ZLATLON(3)
+              print*,"lon max" ,ZLATLON(4)
+              print*,"dx",ZDX_GRB
+            ENDIF
+            ZCONTROL=ZLATLON(2)+(INY-1)*ZDY_GRB
+            IF (ZCONTROL/=ZLATLON(1)) THEN
+              print*,"warning : need to change N latitude"
+              ZLATLON(1)=ZCONTROL
+              print*,"lat min" ,ZLATLON(2)
+              print*,"lat max" ,ZLATLON(1)
+              print*,"dy",ZDY_GRB
+            ENDIF
+            print*,INX,INY,ZLATLON,ZDX_GRB,ZDY_GRB
+          ELSE
+            CALL INI2LALO(ZLATLON,INX,INY)
+          ENDIF
           ALLOCATE(ZVARSAVE(size(XVAR,1),size(XVAR,2),size(XVAR,3),   &
                               size(XVAR,4),size(XVAR,5),size(XVAR,6))   )
           ZVARSAVE=XVAR
@@ -1629,7 +1705,7 @@ SELECT CASE(YTYPEOUT(1:4))
     CALL WRITEVAR(ivarideb,ivarifin,ivarjdeb,ivarjfin,ivarkdeb,ivarkfin,&
                   ivartinf,ivartsup,ivartrajinf,ivartrajsup,ivarprocinf,ivarprocsup,  &
                  CGROUP,YFILEIN,YFLAGWRITE,'2  ',ilocverbia,iret)
-  CASE('LLHV','llhv','LLZV','llzv','LLPV','llpv',&
+  CASE('LLHV','llhv','LLZV','llzv','LLPV','llpv','LLAV','llav',&
           'IJHV','IJZV','IJPV','jihv','jizv','jipv')             
     CALL WRITELLHV(ivarideb,ivarifin,ivarjdeb,ivarjfin,ivarkdeb,ivarkfin,&
                  ivartinf,ivartsup,ivartrajinf,ivartrajsup,ivarprocinf,ivarprocsup,&
@@ -1639,7 +1715,7 @@ SELECT CASE(YTYPEOUT(1:4))
                   ivartinf,ivartsup,ivartrajinf,ivartrajsup,ivarprocinf,ivarprocsup,&
                   CGROUP,YFILEIN,YFLAGWRITE,YOUTGRID,YSUFFIX_file,      &
                   ilocverbia,iret,PGRIDX=XXX(:,IGRID),PGRIDY=XXY(:,IGRID))
-  CASE('ZGRB','PGRB')
+  CASE('ZGRB','PGRB','AGRB')
     CALL WRITEGRIB(ivarideb,ivarifin,ivarjdeb,ivarjfin, &
                    ivarkdeb,ivarkfin,ivartinf,ivartsup, &
                    ivartrajinf,ivartrajsup,ivarprocinf,ivarprocsup,&
diff --git a/tools/diachro/src/EXTRACTDIA/writegrib.f90 b/tools/diachro/src/EXTRACTDIA/writegrib.f90
index 3520f4469..3b71957fc 100644
--- a/tools/diachro/src/EXTRACTDIA/writegrib.f90
+++ b/tools/diachro/src/EXTRACTDIA/writegrib.f90
@@ -440,6 +440,10 @@ IF ( HFLAGFILE(1:3) /= 'CLO' ) THEN
         ISEC1(7)=100 ! type of level  : isobaric surfac
         ISEC1(8)=NINT(PLEV(JK)) ! value of level
         ISEC1(9)=0 ! bottom level if layer 
+      ELSEIF (HTYPEOUT(1:1) == 'A') THEN
+        ISEC1(7)=105 ! type of level  : isobaric surfac
+        ISEC1(8)=NINT(PLEV(JK)) ! value of level
+        ISEC1(9)=0 ! bottom level if layer 
       ELSE     ! code as height levels
         ISEC1(7)=103 ! type of level  : altitude
         ISEC1(8)=NINT(PLEV(JK)) ! value of level
diff --git a/tools/diachro/src/EXTRACTDIA/writellhv.f90 b/tools/diachro/src/EXTRACTDIA/writellhv.f90
index c0d48e9aa..d3bb95a9d 100644
--- a/tools/diachro/src/EXTRACTDIA/writellhv.f90
+++ b/tools/diachro/src/EXTRACTDIA/writellhv.f90
@@ -212,12 +212,12 @@ endif
 !
 SELECT CASE ( HTYPEOUT(1:4) )
  CASE ('LLHV','llhv','LLZV','llzv','LLPV','llpv','jihv','IJHV',&
-         'IJZV','jizv','IJPV','jipv') 
+         'IJZV','jizv','IJPV','jipv','llav','LLAV') 
    YFILEOUT=ADJUSTL(ADJUSTR(HFILENAME(1:LEN(HFILENAME)-1))//HTYPEOUT(1:4))
  CASE DEFAULT
    PRINT*,' ****WRITELLHV: type ', TRIM(HTYPEOUT),' non prevu'
    PRINT*,'types possibles: LLHV/llhv, LLZV/llzv, LLPV/llpv, IJHV/jihv'
-   PRINT*,'IJZV/jizv, IJPV/jipv'
+   PRINT*,'IJZV/jizv, IJPV/jipv,LLAV/llav'
    KRETCODE=1
    RETURN
 END SELECT
@@ -512,7 +512,7 @@ IF ( HFLAGFILE(1:3) /= 'CLO' ) THEN
               END DO
             ENDIF
   
-          CASE ('LLZV','llzv','LLPV','llpv') 
+          CASE ('LLZV','llzv','LLPV','llpv','LLAV','llav')
             IF (PRESENT (PALT) ) THEN
             !altitude des niveaux donnee par PALT
               if (KVERBIA > 0) then
-- 
GitLab