SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/LIB/FM/fmopen.F90
Go to the documentation of this file.
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