|
SURFEX v7.3
General documentation of Surfex
|
00001 ! ######spl 00002 SUBROUTINE FMOPEN(HFILEM,HSTATU,HFIPRI,KNPRAR,KFTYPE,KVERB,& 00003 KNINAR,KRESP) 00004 USE PARKIND1, ONLY : JPRB 00005 USE YOMHOOK , ONLY : LHOOK, DR_HOOK 00006 ! ############################################################ 00007 ! 00008 !!**** *FMOPEN* - routine to open a meso-nh file (DESFM+LFIFM) 00009 !! 00010 !! PURPOSE 00011 !! ------- 00012 ! 00013 ! The purpose of FMOPEN is to open a meso-nh file for the "FM"-routines. 00014 ! It is composed of two distinct fortran files: DESFM and LFIFM. DESFM is 00015 ! a namelist formatted file. LFIFM is a LFI file, managed by the LFI-package. 00016 ! LFIFM is a fortran unformatted, direct access file which is 00017 ! manipulated by the FM-routines FMREAD and FMWRIT. 00018 ! The namelist file is a fortran 90 standard formatted file. 00019 ! 00020 !!** METHOD 00021 !! ------ 00022 !! 00023 !! The opening is performed in 4 main steps: 00024 !! 1. a logical unit is reserved for DESFM (first call to FMATTR) 00025 !! 2. the DESFM file is created by a 00026 !! formatted, fortran open. The name of the file is obtained by 00027 !! appending ".des" to HFILEM. 00028 !! 3. a logical unit is reserved for LFIFM (second call to FMATTR) 00029 !! 4. the LFIFM file is opened in the LFIOUV routine to 00030 !! which most of the explicit input arguments of FMOPEN are passed. 00031 !! The name of that file is obtained by appending ".lfi" 00032 !! to HFILEM. 00033 !! 00034 !! EXTERNAL 00035 !! -------- 00036 !! 00037 !! FMATTR,LFIOUV,OPEN 00038 !! 00039 !! IMPLICIT ARGUMENTS 00040 !! ------------------ 00041 !! 00042 !! MODULE: MODD_FMDECLAR contains management parameters and 00043 !! storage arrays to move information around at the 00044 !! level of all "FM"-routines. 00045 !! MODD_FMMULTI contains variables for multitasking 00046 !! 00047 !! REFERENCE 00048 !! --------- 00049 !! 00050 !! see the Technical Specifications Report for the Meso-nh project 00051 !! (in French) 00052 !! 00053 !! AUTHOR 00054 !! ------ 00055 !! 00056 !! C. FISCHER *METEO-FRANCE* 00057 !! 00058 !! MODIFICATIONS 00059 !! ------------- 00060 !! 00061 !! original 06/94 00062 !! modified by C. Fischer 5/7/95 (locks for multitasking) 00063 !! modified by V. Masson 16/09/96 (prints if error occurs) 00064 !! 00065 !---------------------------------------------------------------------------- 00066 ! 00067 !* 0. DECLARATIONS 00068 ! ------------ 00069 ! 00070 USE MODD_FMDECLAR 00071 USE MODD_FMMULTI 00072 00073 IMPLICIT NONE 00074 ! 00075 !* 0.1 Declarations of arguments 00076 ! 00077 CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! name of the file 00078 CHARACTER(LEN=*), INTENT(IN) ::HSTATU ! status of the file at opening 00079 CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! file for prints in FM 00080 00081 INTEGER, INTENT(IN) ::KNPRAR ! number of predicted articles (not vital) 00082 INTEGER, INTENT(IN) ::KFTYPE ! type of FM-file 00083 INTEGER, INTENT(IN) ::KVERB ! level of verbose 00084 00085 INTEGER, INTENT(OUT)::KNINAR ! number of articles initially present in the file 00086 INTEGER, INTENT(OUT)::KRESP ! return-code if a problem araised 00087 00088 ! 00089 !* 0.2 Declarations of local variables 00090 ! 00091 INTEGER::IRESOU,INPRAR,IROWF,IRESP,J,INUMBR,IFMFNL,IMELEV,ILUPRI 00092 CHARACTER(LEN=JPFINL)::YFNDES,YFNLFI 00093 CHARACTER(LEN=LEN(HFILEM))::YINTFN 00094 LOGICAL::GNEWFI,GNAMFI=.TRUE.,GFATER=.TRUE.,GSTATS 00095 ! 00096 !* 0.3 Taskcommon for logical units 00097 ! 00098 COMMON/TASKOPEN/ILUPRI,INUMBR,IRESP,YFNDES,YFNLFI 00099 !DIR$ TASKCOMMON TASKOPEN 00100 ! 00101 !---------------------------------------------------------------------------- 00102 ! 00103 !* 1. INITIALIZATION 00104 ! 00105 REAL(KIND=JPRB) :: ZHOOK_HANDLE 00106 IF (LHOOK) CALL DR_HOOK('FMOPEN',0,ZHOOK_HANDLE) 00107 INPRAR=KNPRAR+0;KNINAR=0 00108 IRESOU = 0 ; IROWF = 0 ; IRESP = 0 ; ILUPRI = 6 00109 ! 00110 !* the model's verbose level is connected to the LFI verbose 00111 ! 00112 SELECT CASE (KVERB) 00113 CASE(:2) 00114 GSTATS=.FALSE. ; IMELEV=0 00115 CASE(3:6) 00116 GSTATS=.FALSE. ; IMELEV=1 00117 CASE(7:9) 00118 GSTATS=.FALSE. ; IMELEV=2 00119 CASE(10:) 00120 GSTATS=.TRUE. ; IMELEV=2 00121 END SELECT 00122 00123 IF (NOPEFI.GE.JPNXFM) THEN 00124 IRESP=-44 00125 GOTO 1000 00126 ENDIF 00127 ! 00128 !* 2. LOGICAL UNIT FOR DESFM 00129 ! 00130 ! the fortran name for DESFM 00131 ! 00132 IFMFNL=JPFINL-4 00133 00134 IROWF=LEN(HFILEM) 00135 00136 IF (IROWF.EQ.0) THEN 00137 IRESP=-45 00138 GOTO 1000 00139 ELSEIF (IROWF.GT.IFMFNL) THEN 00140 IRESP=-49 00141 GOTO 1000 00142 ENDIF 00143 YINTFN=ADJUSTR(HFILEM) 00144 YFNDES=YINTFN//'.des' 00145 YFNDES=ADJUSTL(YFNDES) 00146 00147 CALL FMATTR(YFNDES,HFIPRI,INUMBR,IRESP) 00148 IF (IRESP.NE.0) GOTO 1000 00149 00150 ! 00151 !* 3. FILE OPENING FOR DESFM 00152 ! 00153 ! case of a namelist: sequential, formatted fortran open 00154 ! 00155 OPEN(UNIT=INUMBR,FILE=YFNDES,FORM='FORMATTED',DELIM='QUOTE',IOSTAT=IRESP) 00156 IF (IRESP.NE.0) GOTO 1000 00157 ! 00158 !* 4. LOGICAL UNIT FOR LFIFM 00159 ! 00160 ! the fortran name for LFIFM 00161 ! 00162 YFNLFI=YINTFN//'.lfi' 00163 YFNLFI=ADJUSTL(YFNLFI) 00164 00165 CALL FMATTR(YFNLFI,HFIPRI,INUMBR,IRESP) 00166 IF (IRESP.NE.0) GOTO 1000 00167 ! 00168 !* 5. FILE OPENING FOR LFIFM 00169 ! 00170 ! case of a LFI-file: direct access, unformatted open via LFIOUV 00171 ! 00172 CALL LFIOUV(IRESOU,INUMBR,GNAMFI,YFNLFI,HSTATU,GFATER,GSTATS,IMELEV,INPRAR,& 00173 KNINAR) 00174 IF (IRESOU.NE.0.AND.IRESOU.NE.-11) THEN 00175 IRESP=IRESOU 00176 GOTO 1000 00177 ENDIF 00178 00179 ! 00180 !* 6. TEST IF FILE IS NEWLY DEFINED 00181 ! 00182 00183 GNEWFI=(KNINAR.EQ.0).OR.(KVERB.LT.7) 00184 IF (.NOT.GNEWFI) THEN 00185 YFNLFI=ADJUSTL(HFIPRI) 00186 DO J=1,JPNXLU 00187 IF (CNAMFI(J).EQ.YFNLFI) THEN 00188 ILUPRI=J 00189 EXIT 00190 ENDIF 00191 ENDDO 00192 WRITE (ILUPRI,*) ' file ',INUMBR,'previously created with LFI' 00193 ENDIF 00194 ! 00195 !* 7. UPDATE OF THE FILE TYPE ARRAY 00196 ! 00197 NFITYP(INUMBR)=KFTYPE 00198 ! 00199 !* 8. MESSAGE PRINTING WHATEVER THE ISSUE WAS 00200 ! 00201 1000 CONTINUE 00202 00203 IF (IRESP.NE.0) THEN 00204 YFNLFI=ADJUSTL(HFIPRI) 00205 DO J=1,JPNXLU 00206 IF (CNAMFI(J).EQ.YFNLFI) THEN 00207 ILUPRI=J 00208 EXIT 00209 ENDIF 00210 ENDDO 00211 WRITE (ILUPRI,*) ' exit from FMOPEN with IRESP:',IRESP 00212 WRITE (ILUPRI,*) ' | HFILEM = ',HFILEM 00213 WRITE (ILUPRI,*) ' | HSTATU = ',HSTATU 00214 WRITE (ILUPRI,*) ' | KNPRAR = ',KNPRAR 00215 WRITE (ILUPRI,*) ' | KFTYPE = ',KFTYPE 00216 ENDIF 00217 KRESP=IRESP 00218 00219 IF (LHOOK) CALL DR_HOOK('FMOPEN',1,ZHOOK_HANDLE) 00220 RETURN 00221 IF (LHOOK) CALL DR_HOOK('FMOPEN',1,ZHOOK_HANDLE) 00222 END SUBROUTINE FMOPEN
1.8.0