SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/OFFLIN/sxpost.F90
Go to the documentation of this file.
00001 !     ######spl
00002         PROGRAM SXPOST
00003 !
00004 !!    MODIFICATIONS
00005 !!    -------------
00006 !!      B. Decharme : partition pgd/prep (grid attributes are only in the PGD file)
00007 !!
00008 !-------------------------------------------------------------------------------
00009 !        
00010         USE MODD_IO_SURF_ASC
00011         USE MODD_SURF_PAR
00012         USE MODI_READ_SURF
00013         USE MODI_GET_LUOUT
00014         USE MODE_POS_SURF
00015         USE MODD_IO_SURF_OL, ONLY : XSTART,XCOUNT,XSTRIDE,LPARTR
00016         
00017 !
00018         USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00019         USE PARKIND1  ,ONLY : JPRB
00020 !
00021         USE MODI_ABOR1_SFX
00022 !
00023         USE MODI_GOTO_SURFEX
00024         USE MODI_GET_LUOUT
00025 !
00026         USE MODI_ALLOC_SURFEX
00027         USE MODI_DEALLOC_SURFEX
00028         USE MODI_END_IO_SURF_n
00029         USE MODI_INIT_IO_SURF_n
00030         IMPLICIT NONE        
00031 
00032         REAL, ALLOCATABLE, DIMENSION(:)   ::   ZLOC
00033         REAL, ALLOCATABLE, DIMENSION(:)   ::   ZWRK
00034         REAL, ALLOCATABLE, DIMENSION(:)   ::   XLON
00035         REAL, ALLOCATABLE, DIMENSION(:)   ::   XLAT
00036         INTEGER, ALLOCATABLE, DIMENSION(:)::   IWRK2
00037         CHARACTER(LEN=50)                 ::   YCOMMENT
00038         CHARACTER(LEN=50)                 ::   NOM_ARTICLE
00039         CHARACTER(LEN=12)                 ::   HREC
00040         CHARACTER(LEN=1)                  ::   PATCHFLAG
00041         CHARACTER(LEN=2)                  ::   YPAS,YLVL
00042         CHARACTER(LEN=10)                 ::   CGRID_TYPE
00043         CHARACTER(LEN=6)                  ::   CMASK_SAVE
00044         LOGICAL                           ::   GFOUND
00045         LOGICAL                           ::   LINITS ! true if PGD has been run
00046         LOGICAL                           ::   LINITP ! true if PREP has been run
00047         LOGICAL                           ::   LSXNAM ! true if SXPOST.nam present
00048         LOGICAL                           ::   LCOORD ! true if LONLAT.dat present
00049         LOGICAL                           ::   LGEO=.TRUE.  !
00050 
00051         CHARACTER(LEN=28)  :: YLUOUT ='LISTING_SXPOST                '  ! name of listing
00052 
00053         INTEGER    ::   IRET
00054         INTEGER    ::   INI, INI_N
00055         INTEGER    ::   INJ
00056         INTEGER    ::   IF, IC, IP
00057         INTEGER    ::   IFIELD, IWFIELD
00058         INTEGER    ::   IPATCH, JPATCH
00059         INTEGER    ::   IBEG, IEND
00060         REAL(KIND=JPRB) :: ZHOOK_HANDLE
00061 
00062         
00063         !=====================================================================
00064         !*
00065         !** check if file exists
00066         !*
00067         !=====================================================================
00068         IF (LHOOK) CALL DR_HOOK('SXPOST',0,ZHOOK_HANDLE)
00069         CALL ALLOC_SURFEX(1)
00070 
00071         CALL GET_LUOUT('ASCII ',NLUOUT)
00072         OPEN(UNIT=NLUOUT,FILE=ADJUSTL(ADJUSTR(YLUOUT)//'.txt'),&
00073                         FORM='FORMATTED',ACTION='WRITE')
00074 
00075         INQUIRE(FILE='SXPOST.nam', EXIST=LSXNAM)
00076         IF (.NOT.LSXNAM) THEN
00077            WRITE(*,*)' > SXPOST.nam missing'
00078            CALL ABOR1_SFX('SXPOST: NAMELIST SXPOST.nam MISSING')
00079         ENDIF
00080 
00081         INQUIRE(FILE='PGD.txt',    EXIST=LINITS)
00082         INQUIRE(FILE='PREP.txt',   EXIST=LINITP)
00083 
00084         IF (.NOT. LINITP .AND. .NOT. LINITS) THEN
00085            WRITE(*,*)' NO INPUT FILE FOUND FOR SXPOST'
00086            WRITE(*,*)' YOU SHOULD AT LEAST RUN PGD! '
00087            CALL ABOR1_SFX('SXPOST: NO INPUT FILE')
00088         ENDIF
00089 
00090         CFILEIN = 'PGD.txt'
00091 
00092         !=====================================================================
00093         !*
00094         !** get number of patches
00095         !*
00096         !=====================================================================
00097 
00098         CALL GOTO_SURFEX(1,.TRUE.)
00099 
00100         CALL INIT_IO_SURF_n('ASCII ','FULL  ','SURF  ','READ ')
00101 
00102         CALL READ_SURF('ASCII ','DIM_FULL', INI, IRET)
00103         CALL READ_SURF('ASCII ','GRID_TYPE', CGRID_TYPE, IRET)
00104         CALL READ_SURF('ASCII ','DIM_NATURE', INI_N, IRET)        
00105            
00106         CALL END_IO_SURF_n('ASCII ')
00107 
00108         NFULL = INI
00109 
00110         IF (INI_N.NE.0) THEN
00111           CALL INIT_IO_SURF_n('ASCII ','NATURE','SURF  ','READ ')
00112 
00113           CALL READ_SURF('ASCII ','PATCH_NUMBER', IPATCH, IRET)
00114 
00115           CALL END_IO_SURF_n('ASCII ')
00116         ENDIF
00117 
00118         !=====================================================================
00119         !*
00120         !** get domain size and read latitudes and longitudes 
00121         !*
00122         !=====================================================================
00123         CALL INIT_IO_SURF_n('ASCII ','FULL  ','SURF  ','READ ')
00124 
00125         OPEN(UNIT=45,FILE='SXPOST.nam',FORM='FORMATTED')
00126         READ(45,*)IFIELD
00127 
00128         INQUIRE(FILE='LONLAT.dat',EXIST=LCOORD)
00129         ALLOCATE(XLON(INI))
00130         ALLOCATE(XLAT(INI))
00131         OPEN(UNIT=30,FILE='LONLAT.dat',FORM='FORMATTED')
00132 
00133         IF (LCOORD) THEN
00134           DO IP=1,INI
00135             READ(30,*)XLON(IP),XLAT(IP)
00136           ENDDO
00137         ELSE
00138           WRITE(*,*) 'LONLAT.DAT file missing !'
00139           IF (CGRID_TYPE=='GAUSS     ') THEN
00140             CALL POSNAM(NUNIT,'FULL  '//' '//'LONGAUSS',GFOUND,NLUOUT)
00141           ELSE
00142             CALL POSNAM(NUNIT,'FULL  '//' '//'XLON',GFOUND,NLUOUT)
00143           ENDIF
00144 
00145          IF (.NOT.GFOUND) THEN
00146            CALL ERR_STOP('XLON            ',CFILEIN,NLUOUT)
00147          ELSE
00148            READ(NUNIT,FMT=*)
00149            READ(NUNIT,FMT='(A50)') YCOMMENT
00150            READ(NUNIT,FMT=*,ERR=100) XLON(:)
00151 
00152            IF (CGRID_TYPE=='GAUSS     ') THEN
00153              CALL POSNAM(NUNIT,'FULL  '//' '//'LATGAUSS',GFOUND,NLUOUT)
00154            ELSE
00155              CALL POSNAM(NUNIT,'FULL  '//' '//'XLAT',GFOUND,NLUOUT)
00156            ENDIF
00157 
00158            READ(NUNIT,FMT=*)
00159            READ(NUNIT,FMT='(A50)') YCOMMENT
00160            READ(NUNIT,FMT=*,ERR=100) XLAT(:)
00161 
00162            DO IP=1,INI
00163              WRITE(30,*)XLON(IP),XLAT(IP)
00164            ENDDO
00165          ENDIF
00166        ENDIF
00167 
00168        CALL END_IO_SURF_n('ASCII ')
00169 
00170        IF (IFIELD==0) STOP
00171 
00172        !=====================================================================
00173        !*
00174        !** read 2d fields from PGD.txt or PREP.txt if exists
00175        !*
00176        !=====================================================================
00177 
00178        ! Search var first in PREP file
00179        IC=0
00180 
00181        DO IF=1,IFIELD
00182 
00183          READ(45,'(A1,1X,A6,1X,A16)') PATCHFLAG,CMASK,HREC
00184          CMASK_SAVE = CMASK
00185 
00186          IF (PATCHFLAG == '+') THEN
00187            INJ = INI * IPATCH
00188          ELSE IF (PATCHFLAG == '-') THEN
00189            INJ = INI
00190          ELSE
00191            PRINT*,' '
00192            PRINT*,' WRONG PATCHFLAG IN SXPOST.nam '
00193            PRINT*,' USE + FOR PATCHED VARIABLES '
00194            PRINT*,' USE - FOR UNPATCHED VARIABLES '
00195            PRINT*,' '
00196            PRINT*,' SYNTAX OF SXPOST.nam SHOULD LOOK: '
00197            PRINT*,' '
00198            PRINT*,'2 '
00199            PRINT*,'- FULL   ZS  '
00200            PRINT*,'+ NATURE TG1 '
00201            PRINT*,' '
00202            CALL ABOR1_SFX('SXPOST: WRONG PATCHFLAG')
00203          ENDIF
00204 
00205          ALLOCATE(ZWRK(INJ))
00206          IC=IC+1
00207          
00208          IF (LINITP) CFILEIN = 'PREP.txt'
00209          CALL INIT_IO_SURF_n('ASCII ',CMASK_SAVE,'SURF  ','READ ')
00210          CALL POSNAM(NUNIT,CMASK//' '//HREC,GFOUND,NLUOUT)
00211          IF (.NOT.GFOUND .AND. LINITP)THEN
00212            ! Search now in PGD file
00213            CALL END_IO_SURF_n('ASCII ')
00214            CFILEIN = 'PGD.txt'
00215            CALL INIT_IO_SURF_n('ASCII ',CMASK,'SURF  ','READ ')
00216            CALL POSNAM(NUNIT,CMASK//' '//HREC,GFOUND,NLUOUT)
00217          ENDIF
00218          IF (.NOT.GFOUND) CALL ERR_STOP(HREC,CFILEIN,NLUOUT)
00219 
00220          READ(NUNIT,FMT='(A50)') NOM_ARTICLE
00221          READ(NUNIT,FMT='(A50)') YCOMMENT
00222          READ(NUNIT,FMT=*,ERR=100) ZWRK
00223          ALLOCATE(ZLOC(INJ))
00224          ZLOC(:)=ZWRK(:)
00225          WHERE(ZLOC(:)==999.) ZLOC(:)=-999.
00226 
00227          PRINT*,CMASK,' ',HREC,' ','MINVAL = ',MINVAL(ZWRK(:)),&
00228                      ' MAXVAL = ',MAXVAL(ZLOC(:))
00229          DEALLOCATE(ZLOC)
00230 
00231          IWFIELD=1
00232          IF (PATCHFLAG == '+') THEN
00233            DO JPATCH=1,IPATCH
00234              WRITE(YPAS,'(I2)') JPATCH
00235              YLVL=ADJUSTL(YPAS(:LEN_TRIM(YPAS)))
00236              OPEN(UNIT=30,FILE=TRIM(HREC)//'_p'//TRIM(YLVL)//'.dat',FORM='FORMATTED')
00237              IBEG=INI*(JPATCH-1)+1
00238              IEND=INI*JPATCH
00239              IF (LGEO) THEN
00240                DO IP=1,INI
00241                  !IF (ZWRK(IP)/=XUNDEF) THEN
00242                  WRITE(30,*)XLON(IP),XLAT(IP),ZWRK(INI*(JPATCH-1)+IP)
00243                  !ENDIF
00244                ENDDO
00245              ELSE
00246                WRITE(30,*)NOM_ARTICLE
00247                WRITE(30,*)YCOMMENT
00248                DO IP=1,INI
00249                  WRITE(30,*)ZWRK(IP)
00250                ENDDO
00251                !WRITE(30,*)INI
00252                !WRITE(30,'(60F16.8)')ZWRK(IBEG:IEND)
00253              ENDIF
00254              CLOSE(30)
00255            ENDDO
00256          ELSE
00257            OPEN(UNIT=30,FILE=TRIM(HREC)//'.dat',FORM='FORMATTED')
00258            IF (LGEO) THEN
00259              DO IP=1,INI
00260                !IF (ZWRK(IP)/=XUNDEF) THEN
00261                WRITE(30,*)XLAT(IP),XLON(IP),ZWRK(IP)
00262                !ENDIF
00263              ENDDO
00264            ELSE
00265              WRITE(30,*)NOM_ARTICLE
00266              WRITE(30,*)YCOMMENT
00267              DO IP=1,INI
00268                WRITE(30,*)ZWRK(IP)
00269              ENDDO
00270              !WRITE(30,*)INI
00271              !WRITE(30,'(60F16.8)')ZWRK(:)
00272            ENDIF
00273            CLOSE(30)
00274          ENDIF
00275 
00276          DEALLOCATE(ZWRK)
00277          CALL END_IO_SURF_n('ASCII ')
00278 
00279        ENDDO
00280 
00281        CLOSE(NLUOUT)
00282        CALL DEALLOC_SURFEX
00283        IF (LHOOK) CALL DR_HOOK('SXPOST',1,ZHOOK_HANDLE)
00284 
00285 
00286        STOP
00287  100   CONTINUE
00288        WRITE(NLUOUT,*) ' '
00289        WRITE(NLUOUT,*) ' ERROR WHEN READING ARTICLE',HREC
00290        WRITE(NLUOUT,*) ' '
00291        CLOSE(NLUOUT)
00292        CALL DEALLOC_SURFEX
00293        IF (LHOOK) CALL DR_HOOK('SXPOST',1,ZHOOK_HANDLE)
00294 
00295        CONTAINS
00296 
00297        SUBROUTINE ERR_STOP(HREC,CFILEIN,NLUOUT)
00298        CHARACTER(LEN=12)   ::   HREC
00299        CHARACTER(LEN=*)    ::   CFILEIN
00300        INTEGER             ::   NLUOUT
00301        REAL(KIND=JPRB) :: ZHOOK_HANDLE
00302        IF (LHOOK) CALL DR_HOOK('ERR_STOP',0,ZHOOK_HANDLE)
00303        WRITE(NLUOUT,*) ' '
00304        WRITE(NLUOUT,*) ' ARTICLE ',TRIM(HREC),' NOT FOUND IN FILE ', CFILEIN
00305        WRITE(NLUOUT,*) ' '
00306        WRITE(*,*) ' '
00307        WRITE(*,*) ' ARTICLE ',TRIM(HREC),' NOT FOUND IN FILE ', CFILEIN
00308        WRITE(*,*) ' '
00309        CALL ABOR1_SFX('SXPOST: ARTICLE '//HREC//' NOT FOUND')
00310        IF (LHOOK) CALL DR_HOOK('ERR_STOP',1,ZHOOK_HANDLE)
00311        END SUBROUTINE ERR_STOP
00312 
00313        END PROGRAM SXPOST