SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/LIB/FM/fmclos.F90
Go to the documentation of this file.
00001 !     ######spl
00002       SUBROUTINE FMCLOS(HFILEM,HSTATU,HFIPRI,KRESP)
00003       USE PARKIND1, ONLY : JPRB
00004       USE YOMHOOK , ONLY : LHOOK, DR_HOOK
00005 !     #############################################
00006 !
00007 !!****  *FMCLOS* - routine to close a meso-nh file opened with the "FM"-routines
00008 !!
00009 !!    PURPOSE
00010 !!    -------
00011 !
00012 !       The purpose of FMCLOS is to close a mesonh file composed of the DESFM
00013 !     and the LFIFM part. The LFIFM file is closed
00014 !     using the LFI-package for direct access Fortran files. The DESFM file is
00015 !     closed using a classical CLOSE statement.
00016 !
00017 !!**  METHOD
00018 !!    ------
00019 !!
00020 !!      The closure is proceeded in 4 steps:
00021 !!        1. close DESFM
00022 !!        2. close LFIFM by calling LFIFER
00023 !!        3. erase the file from the management arrays (FMFREE)
00024 !!        4. the cpio and storage command is loaded into the pipe
00025 !!           the pipe has the special fortran unit 10
00026 !!
00027 !!    EXTERNAL
00028 !!    --------
00029 !!
00030 !!      FMLOOK,FMFREE,LFIFER,CLOSE,FLUSH
00031 !!
00032 !!    IMPLICIT ARGUMENTS
00033 !!    ------------------
00034 !!
00035 !!      MODULE: MODD_FMDECLAR contains management parameters and
00036 !!              storage arrays to move information around at the
00037 !!              level of all "FM"-routines.
00038 !!              MODD_FMMULTI contains variables for multitasking
00039 !!
00040 !!    REFERENCE
00041 !!    ---------
00042 !!
00043 !!      see the Technical Specifications Report for the Meso-nh project
00044 !!      (in French)
00045 !!
00046 !!    AUTHOR
00047 !!    ------
00048 !!
00049 !!      C. FISCHER      *METEO-FRANCE*
00050 !!
00051 !!    MODIFICATIONS
00052 !!    -------------
00053 !!
00054 !!      original                                                        06/94
00055 !!      modified by C. Fischer                    4/11/94 (write in the pipe)
00056 !!      modified by C. Fischer                5/7/95 (locks for multitasking)
00057 !!      modified by P. Jabouille                  26/06/96 (case NFITYP=2 :
00058 !!                                     file is not sent to the remote machine)
00059 !!      modified by V. Masson               16/09/96 (prints if error occurs)
00060 !!
00061 !----------------------------------------------------------------------------
00062 !
00063 !*      0.    DECLARATIONS
00064 !             ------------
00065 !
00066 USE MODD_FMDECLAR
00067 USE MODD_FMMULTI
00068 
00069 IMPLICIT NONE
00070 !
00071 !*      0.1   Declarations of arguments
00072 !
00073 CHARACTER(LEN=*),     INTENT(IN) ::HFILEM  ! file name
00074 CHARACTER(LEN=*),     INTENT(IN) ::HSTATU  ! status for the closed file
00075 
00076 CHARACTER(LEN=*),     INTENT(IN) ::HFIPRI  ! file for prints in FM
00077 
00078 INTEGER,              INTENT(OUT)::KRESP   ! return-code if problems araised
00079 
00080 !
00081 !*      0.2   Declarations of local variables
00082 !
00083 INTEGER::IRESP,IROWF,IPOSNU,J,INUMBR,IFMFNL,ILUPRI,IERR
00084 CHARACTER(LEN=7)::YSTATU
00085 CHARACTER(LEN=JPFINL)::YFNDES,YFNLFI
00086 CHARACTER(LEN=LEN(HFILEM))::YINTFN
00087 CHARACTER(LEN=10)::YTRANS,YCPIO
00088 CHARACTER(LEN=100)::YCOMMAND
00089 LOGICAL::GSTATU
00090 !
00091 !*      0.3   Taskcommon for logical units
00092 !
00093 COMMON/TASKCLOS/ILUPRI,INUMBR,IRESP,YFNDES,YFNLFI,YSTATU
00094 !DIR$ TASKCOMMON TASKCLOS
00095 !
00096 !----------------------------------------------------------------------------
00097 !
00098 !*      1.1   THE NAME OF DESFM=HFILEM.des
00099 !
00100 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00101 IF (LHOOK) CALL DR_HOOK('FMCLOS',0,ZHOOK_HANDLE)
00102 IRESP = 0 ; IROWF = 0 ; IPOSNU = 0 ; ILUPRI = 6 ; IERR = 0
00103 IFMFNL=JPFINL-4
00104 YTRANS='transfer.x'
00105 
00106 IROWF=LEN(HFILEM)
00107 
00108 IF (IROWF.EQ.0) THEN
00109    IRESP=-59
00110    GOTO 1000
00111 ELSEIF (IROWF.GT.IFMFNL) THEN
00112    IRESP=-60
00113    GOTO 1000
00114 ENDIF
00115 YINTFN=ADJUSTR(HFILEM)
00116 YFNDES=YINTFN//'.des'
00117 YFNDES=ADJUSTL(YFNDES)
00118 !
00119 !*      1.2   TEST FOR FILE EXISTENCE AND SEARCH OF ITS LOGICAL UNIT
00120 !
00121 CALL FMLOOK(YFNDES,HFIPRI,INUMBR,IRESP)
00122 IF (IRESP.NE.0) THEN
00123         GOTO 1000
00124 ELSEIF (LEN(HSTATU).LE.0) THEN
00125         IRESP=-41
00126         GOTO 1000
00127 ELSE
00128         GSTATU=HSTATU.EQ.'KEEP'.OR.HSTATU.EQ.'DELETE'
00129         IF (GSTATU) THEN
00130         YSTATU=HSTATU(1:MIN0(LEN(HSTATU),LEN(YSTATU)))
00131         ELSE
00132         YSTATU='DEFAULT'
00133         ENDIF
00134 ENDIF
00135 !
00136 !*      1.3   THE LOGICAL UNIT OF DESFM IS RELEASED FOR "FM"
00137 !
00138 CALL FMFREE(YFNDES,HFIPRI,IRESP)
00139 IF (IRESP.NE.0) GOTO 1000
00140 !
00141 !*      2.    CLOSURE OF DESFM
00142 !
00143 !  case of a namelist
00144 !
00145 CLOSE (UNIT=INUMBR,IOSTAT=IRESP,STATUS=YSTATU)
00146 IF (IRESP.NE.0) GOTO 1000
00147 !
00148 !*      3.1   THE NAME OF LFIFM=HFILEM.lfi
00149 !
00150 YFNLFI=YINTFN//'.lfi'
00151 YFNLFI=ADJUSTL(YFNLFI)
00152 !
00153 !*      3.2   TEST FOR FILE EXISTENCE AND SEARCH OF ITS LOGICAL UNIT
00154 !
00155 CALL FMLOOK(YFNLFI,HFIPRI,INUMBR,IRESP)
00156 IF (IRESP.NE.0) GOTO 1000
00157 !
00158 !*      3.3   THE LOGICAL UNIT FOR LFIFM IS RELEASED FOR "FM"
00159 !
00160 CALL FMFREE(YFNLFI,HFIPRI,IRESP)
00161 IF (IRESP.NE.0) GOTO 1000
00162 !
00163 !*      4.    CLOSURE OF LFI
00164 !
00165 !  case of a LFI file
00166 !
00167 CALL LFIFER(IRESP,INUMBR,YSTATU)
00168 IF (IRESP.NE.0) GOTO 1000
00169 !
00170 !*      5.    INPUT FOR THE UNIX SYSTEM TO SAVE AND SEND THE FILE
00171 !
00172 PRINT*,'KTYPE=',NFITYP(INUMBR)
00173 SELECT CASE (NFITYP(INUMBR))
00174 CASE(:-1)
00175   IRESP=-66
00176   GOTO 1000
00177 CASE(0)
00178   YCPIO='NIL'
00179 CASE(1)
00180   YCPIO='MESONH'
00181 CASE(2)
00182   PRINT*,'FILE ',HFILEM,' NOT TRANSFERED'
00183   GOTO 1000
00184 CASE(3:)
00185   IRESP=-66
00186   GOTO 1000
00187 END SELECT
00188 WRITE (YCOMMAND,20) YTRANS,YCPIO,HFILEM
00189 !
00190 ! write into the pipe : the "flush" forces instanteneous buffer transfer
00191 ! which is necessary for parallel treatment
00192 !
00193 PRINT*,'YCOMMAND=',YCOMMAND
00194 WRITE (10,'(A100)') YCOMMAND
00195 !CALL FLUSH(10,IERR)
00196 !
00197 !*      6.    UPDATING OF ARRAY NFITYP
00198 !
00199 NFITYP(INUMBR)=JPNIIL
00200 !
00201 !*      7.    MESSAGE PRINTING WHATEVER THE ISSUE WAS
00202 !
00203 1000    CONTINUE
00204 
00205 IF (IRESP.NE.0) THEN
00206 YFNLFI=ADJUSTL(HFIPRI)
00207 DO J=1,JPNXLU
00208     IF (CNAMFI(J).EQ.YFNLFI) THEN
00209        ILUPRI=J
00210        EXIT
00211     ENDIF
00212 ENDDO
00213 WRITE (ILUPRI,*) ' exit from FMCLOS with IRESP:',IRESP
00214 WRITE (ILUPRI,*) '   | HFILEM = ',HFILEM
00215 WRITE (ILUPRI,*) '   | HSTATU = ',HSTATU
00216 ENDIF
00217 KRESP=IRESP
00218 
00219 ! format: 10c for transfer.x and mesonh/nil
00220 !         32c for file name
00221 ! if you have to change this format one day, don't forget the blank after 1H
00222 20    FORMAT(A10,1H ,A10,1H ,A32)
00223 
00224 IF (LHOOK) CALL DR_HOOK('FMCLOS',1,ZHOOK_HANDLE)
00225 RETURN
00226       IF (LHOOK) CALL DR_HOOK('FMCLOS',1,ZHOOK_HANDLE)
00227       END SUBROUTINE FMCLOS