SURFEX v7.3
General documentation of Surfex
|
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