Skip to content
Snippets Groups Projects
Commit 9efd31aa authored by WAUTELET Philippe's avatar WAUTELET Philippe
Browse files

Philippe 18/11/2016: IO:

* create OUTPUT files
* added IO_FILE_OPEN_ll and IO_FILE_CLOSE_ll subroutines (which call FMOPEN_ll and FMCLOSE_ll)
* FMOPEN_ll and FMCLOSE_ll: added new optional argument: TPFILE for file structure
* added NCLOSE field in TFILEDATA
* removed NLFININAR field in TFILEDATA
* bug correction: use CFORMAT field instead of CTYPE
parent 8db27922
No related branches found
No related tags found
No related merge requests found
...@@ -54,10 +54,10 @@ TYPE TFILEDATA ...@@ -54,10 +54,10 @@ TYPE TFILEDATA
CHARACTER(LEN=7) :: CMODE = "UNKNOWN" !Opening mode (read, write...) CHARACTER(LEN=7) :: CMODE = "UNKNOWN" !Opening mode (read, write...)
LOGICAL :: LOPENED = .FALSE. !Is the file opened LOGICAL :: LOPENED = .FALSE. !Is the file opened
INTEGER :: NOPEN = 0 !Number of times the file has been opened (during the current execution) INTEGER :: NOPEN = 0 !Number of times the file has been opened (during the current execution)
INTEGER :: NCLOSE = 0 !Number of times the file has been closed (during the current execution)
! !
! Fields for LFI files ! Fields for LFI files
INTEGER :: NLFINPRAR = 0 !Number of predicted articles of the LFI file (non crucial) INTEGER :: NLFINPRAR = 0 !Number of predicted articles of the LFI file (non crucial)
INTEGER :: NLFININAR = -1 !Number of articles present at opening of the LFI file
INTEGER :: NLFITYPE = -1 !Type of the file (used to generate list of files to transfers) INTEGER :: NLFITYPE = -1 !Type of the file (used to generate list of files to transfers)
INTEGER :: NLFIVERB = 1 !LFI verbosity level INTEGER :: NLFIVERB = 1 !LFI verbosity level
! !
......
...@@ -27,6 +27,7 @@ INTEGER, PARAMETER :: JPPIPE = 10 ...@@ -27,6 +27,7 @@ INTEGER, PARAMETER :: JPPIPE = 10
!INCLUDE 'mpif.h' !INCLUDE 'mpif.h'
PUBLIC SET_FMPACK_ll,FMATTR_ll,FMLOOK_ll,FMOPEN_ll,FMCLOS_ll PUBLIC SET_FMPACK_ll,FMATTR_ll,FMLOOK_ll,FMOPEN_ll,FMCLOS_ll
PUBLIC IO_FILE_OPEN_ll, IO_FILE_CLOSE_ll
CONTAINS CONTAINS
...@@ -129,9 +130,32 @@ END IF ...@@ -129,9 +130,32 @@ END IF
END SUBROUTINE FMLOOK_ll END SUBROUTINE FMLOOK_ll
SUBROUTINE IO_FILE_OPEN_ll(TPFILE,HFIPRI,KRESP)
!
USE MODD_IO_ll, ONLY: TFILEDATA
!
TYPE(TFILEDATA),POINTER,INTENT(IN) :: TPFILE ! File structure
CHARACTER(LEN=*), INTENT(IN) :: HFIPRI ! File for prints in FM
INTEGER, INTENT(OUT) :: KRESP ! Return code
!
INTEGER :: ININAR ! Number of articles present in LFI file (unused here)
!
IF (TPFILE%LOPENED) THEN
PRINT *,'ERROR: IO_FILE_OPEN_ll: file ',TRIM(TPFILE%CNAME),' already opened'
CALL ABORT
STOP
ENDIF
!
CALL FMOPEN_ll(TPFILE%CNAME,TPFILE%CMODE,HFIPRI,TPFILE%NLFINPRAR,TPFILE%NLFITYPE,TPFILE%NLFIVERB,ININAR,KRESP,TPFILE=TPFILE)
!
TPFILE%LOPENED = .TRUE.
TPFILE%NOPEN = TPFILE%NOPEN + 1
!
END SUBROUTINE IO_FILE_OPEN_ll
SUBROUTINE FMOPEN_ll(HFILEM,HACTION,HFIPRI,KNPRAR,KFTYPE,KVERB,KNINAR& SUBROUTINE FMOPEN_ll(HFILEM,HACTION,HFIPRI,KNPRAR,KFTYPE,KVERB,KNINAR&
& ,KRESP,OPARALLELIO) & ,KRESP,OPARALLELIO,TPFILE)
USE MODD_IO_ll, ONLY : ISP,ISTDOUT,LFIPARAM,LIOCDF4,LLFIOUT,LLFIREAD USE MODD_IO_ll, ONLY : ISP,ISTDOUT,LFIPARAM,LIOCDF4,LLFIOUT,LLFIREAD,TFILEDATA
USE MODE_FD_ll, ONLY : FD_ll,GETFD,JPFINL USE MODE_FD_ll, ONLY : FD_ll,GETFD,JPFINL
USE MODE_IO_ll, ONLY : OPEN_ll,GCONFIO USE MODE_IO_ll, ONLY : OPEN_ll,GCONFIO
!JUANZ !JUANZ
...@@ -153,8 +177,9 @@ INTEGER, INTENT(OUT)::KNINAR ! number of articles ...@@ -153,8 +177,9 @@ INTEGER, INTENT(OUT)::KNINAR ! number of articles
! initially ! initially
! present in the file. ! present in the file.
INTEGER, INTENT(OUT)::KRESP ! return-code if a problem INTEGER, INTENT(OUT)::KRESP ! return-code if a problem
LOGICAL, INTENT(IN), OPTIONAL :: OPARALLELIO
! araised. ! araised.
LOGICAL, INTENT(IN), OPTIONAL :: OPARALLELIO
TYPE(TFILEDATA),POINTER,INTENT(IN),OPTIONAL :: TPFILE ! File structure
! !
! Local variable ! Local variable
! !
...@@ -176,6 +201,13 @@ LOGICAL :: GPARALLELIO ...@@ -176,6 +201,13 @@ LOGICAL :: GPARALLELIO
#if defined(MNH_IOCDF4) #if defined(MNH_IOCDF4)
INTEGER(KIND=IDCDF_KIND) :: INCERR INTEGER(KIND=IDCDF_KIND) :: INCERR
#endif #endif
CHARACTER(LEN=7) :: YTYPE
IF ( PRESENT(TPFILE) ) THEN
YTYPE = TPFILE%CTYPE
ELSE
YTYPE = 'UNKNOWN'
ENDIF
IF ( PRESENT(OPARALLELIO) ) THEN IF ( PRESENT(OPARALLELIO) ) THEN
GPARALLELIO = OPARALLELIO GPARALLELIO = OPARALLELIO
...@@ -220,9 +252,13 @@ ELSEIF (IROWF.GT.IFMFNL) THEN ...@@ -220,9 +252,13 @@ ELSEIF (IROWF.GT.IFMFNL) THEN
GOTO 1000 GOTO 1000
ENDIF ENDIF
YFNDES=ADJUSTL(TRIM(HFILEM)//'.des') !Do not open '.des' file if OUTPUT
CALL OPEN_ll(UNIT=INUMBR,FILE=YFNDES,FORM='FORMATTED',ACTION=HACTION,DELIM& IF(YTYPE/='OUTPUT') THEN
& ='QUOTE',IOSTAT=IRESP,RECL=1024*8,OPARALLELIO=GPARALLELIO) YFNDES=ADJUSTL(TRIM(HFILEM)//'.des')
CALL OPEN_ll(UNIT=INUMBR,FILE=YFNDES,FORM='FORMATTED',ACTION=HACTION,DELIM&
& ='QUOTE',IOSTAT=IRESP,RECL=1024*8,OPARALLELIO=GPARALLELIO)
ENDIF
IF (IRESP /= 0) GOTO 1000 IF (IRESP /= 0) GOTO 1000
...@@ -339,15 +375,37 @@ KRESP=IRESP ...@@ -339,15 +375,37 @@ KRESP=IRESP
RETURN RETURN
END SUBROUTINE FMOPEN_ll END SUBROUTINE FMOPEN_ll
SUBROUTINE FMCLOS_ll(HFILEM,HSTATU,HFIPRI,KRESP,OPARALLELIO) SUBROUTINE IO_FILE_CLOSE_ll(TPFILE,HFIPRI,KRESP)
!
USE MODD_IO_ll, ONLY: TFILEDATA
!
TYPE(TFILEDATA),POINTER,INTENT(IN) :: TPFILE ! File structure
CHARACTER(LEN=*), INTENT(IN) :: HFIPRI ! File for prints in FM
INTEGER, INTENT(OUT) :: KRESP ! Return code
!
IF (.NOT.TPFILE%LOPENED) THEN
PRINT *,'ERROR: IO_FILE_CLOSE_ll: trying to close a file not opened: ',TRIM(TPFILE%CNAME)
CALL ABORT
STOP
ENDIF
!
CALL FMCLOS_ll(TPFILE%CNAME,'KEEP',HFIPRI,KRESP,TPFILE=TPFILE)
!
TPFILE%LOPENED = .FALSE.
TPFILE%NCLOSE = TPFILE%NCLOSE + 1
!
END SUBROUTINE IO_FILE_CLOSE_ll
SUBROUTINE FMCLOS_ll(HFILEM,HSTATU,HFIPRI,KRESP,OPARALLELIO,TPFILE)
! !
!! MODIFICATIONS !! MODIFICATIONS
!! ------------- !! -------------
! !
!! J.Escobar 18/10/10 bug with PGI compiler on ADJUSTL !! J.Escobar 18/10/10 bug with PGI compiler on ADJUSTL
!------------------------------------------------------------------------------- !-------------------------------------------------------------------------------
USE MODD_IO_ll, ONLY : ISP USE MODD_IO_ll, ONLY : ISP,TFILEDATA
USE MODE_FD_ll, ONLY : FD_ll,GETFD,JPFINL !USE MODE_FD_ll, ONLY : FD_ll,GETFD,JPFINL
USE MODE_FD_ll
USE MODE_IO_ll, ONLY : CLOSE_ll,UPCASE USE MODE_IO_ll, ONLY : CLOSE_ll,UPCASE
#if !defined(MNH_SGI) #if !defined(MNH_SGI)
USE MODI_SYSTEM_MNH USE MODI_SYSTEM_MNH
...@@ -360,6 +418,7 @@ CHARACTER(LEN=*), INTENT(IN) ::HSTATU ! status for the closed file ...@@ -360,6 +418,7 @@ CHARACTER(LEN=*), INTENT(IN) ::HSTATU ! status for the closed file
CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! file for prints in FM CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! file for prints in FM
INTEGER, INTENT(OUT)::KRESP ! return-code if problems araised INTEGER, INTENT(OUT)::KRESP ! return-code if problems araised
LOGICAL, INTENT(IN), OPTIONAL :: OPARALLELIO LOGICAL, INTENT(IN), OPTIONAL :: OPARALLELIO
TYPE(TFILEDATA),POINTER,INTENT(IN),OPTIONAL :: TPFILE ! File structure
INTEGER ::IRESP,IROWF,IFMFNL INTEGER ::IRESP,IROWF,IFMFNL
CHARACTER(LEN=7) ::YSTATU CHARACTER(LEN=7) ::YSTATU
...@@ -375,6 +434,13 @@ TYPE(FD_ll), POINTER :: TZFDLFI ...@@ -375,6 +434,13 @@ TYPE(FD_ll), POINTER :: TZFDLFI
INTEGER(KIND=LFI_INT) :: IRESP8,INUM8 INTEGER(KIND=LFI_INT) :: IRESP8,INUM8
!JUAN !JUAN
LOGICAL :: GPARALLELIO LOGICAL :: GPARALLELIO
CHARACTER(LEN=7) :: YTYPE
IF ( PRESENT(TPFILE) ) THEN
YTYPE = TPFILE%CTYPE
ELSE
YTYPE = 'UNKNOWN'
ENDIF
IF ( PRESENT(OPARALLELIO) ) THEN IF ( PRESENT(OPARALLELIO) ) THEN
GPARALLELIO = OPARALLELIO GPARALLELIO = OPARALLELIO
...@@ -397,8 +463,6 @@ ELSEIF (IROWF.GT.IFMFNL) THEN ...@@ -397,8 +463,6 @@ ELSEIF (IROWF.GT.IFMFNL) THEN
GOTO 1000 GOTO 1000
ENDIF ENDIF
YFNDES=ADJUSTL(TRIM(HFILEM)//'.des')
IF (LEN(HSTATU).LE.0) THEN IF (LEN(HSTATU).LE.0) THEN
IRESP=-41 IRESP=-41
GOTO 1000 GOTO 1000
...@@ -411,7 +475,12 @@ ELSE ...@@ -411,7 +475,12 @@ ELSE
ENDIF ENDIF
ENDIF ENDIF
CALL CLOSE_ll(YFNDES,IOSTAT=IRESP,STATUS=YSTATU) !Do not close (non-existing) '.des' file if OUTPUT
IF(YTYPE/='OUTPUT') THEN
YFNDES=ADJUSTL(TRIM(HFILEM)//'.des')
CALL CLOSE_ll(YFNDES,IOSTAT=IRESP,STATUS=YSTATU)
ENDIF
IF (IRESP /= 0) GOTO 1000 IF (IRESP /= 0) GOTO 1000
YFNLFI=ADJUSTL(TRIM(HFILEM)//'.lfi') YFNLFI=ADJUSTL(TRIM(HFILEM)//'.lfi')
......
...@@ -448,18 +448,26 @@ SUBROUTINE POPULATE_STRUCT(TPFILE_FIRST,TPFILE_LAST,KSTEPS,HFILETYPE,TPBAKOUTN) ...@@ -448,18 +448,26 @@ SUBROUTINE POPULATE_STRUCT(TPFILE_FIRST,TPFILE_LAST,KSTEPS,HFILETYPE,TPBAKOUTN)
TPBAKOUTN(IPOS)%TFILE%CTYPE=HFILETYPE TPBAKOUTN(IPOS)%TFILE%CTYPE=HFILETYPE
TPBAKOUTN(IPOS)%TFILE%CMODE="WRITE" TPBAKOUTN(IPOS)%TFILE%CMODE="WRITE"
WRITE (YNUMBER,FMT="('.',I3.3)") IPOS WRITE (YNUMBER,FMT="('.',I3.3)") IPOS
TPBAKOUTN(IPOS)%TFILE%CNAME=ADJUSTL(ADJUSTR(IO_SURF_MNH_MODEL(IMI)%COUTFILE)//YNUMBER) IF (HFILETYPE=='OUTPUT') THEN
! Add a "OUT" suffix for output files
TPBAKOUTN(IPOS)%TFILE%CNAME=ADJUSTL(ADJUSTR(IO_SURF_MNH_MODEL(IMI)%COUTFILE)//'.OUT'//YNUMBER)
ELSE IF (HFILETYPE=='BACKUP') THEN
TPBAKOUTN(IPOS)%TFILE%CNAME=ADJUSTL(ADJUSTR(IO_SURF_MNH_MODEL(IMI)%COUTFILE)//YNUMBER)
ELSE
PRINT *,'Error: unknown filetype (',TRIM(HFILETYPE),')'
CALL ABORT
ENDIF
TPBAKOUTN(IPOS)%TFILE%NLFITYPE=1 !1: to be transfered TPBAKOUTN(IPOS)%TFILE%NLFITYPE=1 !1: to be transfered
!PW: TODO: set NLFIVERB only when useful (only if LFI file...) !PW: TODO: set NLFIVERB only when useful (only if LFI file...)
TPBAKOUTN(IPOS)%TFILE%NLFIVERB=NVERB TPBAKOUTN(IPOS)%TFILE%NLFIVERB=NVERB
IF (LIOCDF4) THEN IF (LIOCDF4) THEN
TPBAKOUTN(IPOS)%TFILE%CTYPE='NETCDF4' TPBAKOUTN(IPOS)%TFILE%CFORMAT='NETCDF4'
IF (LLFIOUT) THEN IF (LLFIOUT) THEN
PRINT *,'Warning: LLFIOUT + LIOCDF4 = .TRUE. not yet implemented with new IO data structures' PRINT *,'Warning: LLFIOUT + LIOCDF4 = .TRUE. not yet implemented with new IO data structures'
TPBAKOUTN(IPOS)%TFILE%NLFINPRAR= 22+2*(4+NRR+NSV) TPBAKOUTN(IPOS)%TFILE%NLFINPRAR= 22+2*(4+NRR+NSV)
END IF END IF
ELSE IF (LLFIOUT) THEN ELSE IF (LLFIOUT) THEN
TPBAKOUTN(IPOS)%TFILE%CTYPE='LFI' TPBAKOUTN(IPOS)%TFILE%CFORMAT='LFI'
TPBAKOUTN(IPOS)%TFILE%NLFINPRAR= 22+2*(4+NRR+NSV) TPBAKOUTN(IPOS)%TFILE%NLFINPRAR= 22+2*(4+NRR+NSV)
ELSE ELSE
PRINT *,'Error: unknown backup/output fileformat' PRINT *,'Error: unknown backup/output fileformat'
......
...@@ -527,8 +527,7 @@ REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZTMP ...@@ -527,8 +527,7 @@ REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZTMP
TYPE(LIST_ll), POINTER :: TZFIELDC_ll ! list of fields to exchange TYPE(LIST_ll), POINTER :: TZFIELDC_ll ! list of fields to exchange
TYPE(HALO2LIST_ll), POINTER :: TZHALO2C_ll ! list of fields to exchange TYPE(HALO2LIST_ll), POINTER :: TZHALO2C_ll ! list of fields to exchange
! !
TYPE(TFILEDATA),POINTER :: TZFILE TYPE(TFILEDATA),POINTER :: TZBAKFILE, TZOUTFILE
CHARACTER(LEN=:),ALLOCATABLE :: YMODE
!------------------------------------------------------------------------------- !-------------------------------------------------------------------------------
! !
!* 0. MICROPHYSICAL SCHEME !* 0. MICROPHYSICAL SCHEME
...@@ -601,8 +600,9 @@ IF (KTCOUNT == 1) THEN ...@@ -601,8 +600,9 @@ IF (KTCOUNT == 1) THEN
ALLOCATE(ZWT_ACT_NUC(SIZE(XWT,1),SIZE(XWT,2),SIZE(XWT,3))) ALLOCATE(ZWT_ACT_NUC(SIZE(XWT,1),SIZE(XWT,2),SIZE(XWT,3)))
ALLOCATE(GMASKkids(SIZE(XWT,1),SIZE(XWT,2))) ALLOCATE(GMASKkids(SIZE(XWT,1),SIZE(XWT,2)))
! !
! initialization of the FM file output number ! initialization of the FM file backup/output number
IBAK=0 IBAK=0
IOUT=0
! !
INPRAR = 50 INPRAR = 50
CALL FMOPEN_ll(CFMDIAC,'WRITE',CLUOUT,INPRAR,ITYPE,NVERB,ININAR,IRESP) CALL FMOPEN_ll(CFMDIAC,'WRITE',CLUOUT,INPRAR,ITYPE,NVERB,ININAR,IRESP)
...@@ -911,19 +911,12 @@ IF (IBAK < NBAK_NUMB ) THEN ...@@ -911,19 +911,12 @@ IF (IBAK < NBAK_NUMB ) THEN
IBAK=IBAK+1 IBAK=IBAK+1
GCLOSE_OUT=.TRUE. GCLOSE_OUT=.TRUE.
! !
TZFILE => TBACKUPN(IBAK)%TFILE TZBAKFILE => TBACKUPN(IBAK)%TFILE
YFMFILE = TZFILE%CNAME YFMFILE = TZBAKFILE%CNAME
YDADFILE = TBACKUPN(IBAK)%CDADFILENAME YDADFILE = TBACKUPN(IBAK)%CDADFILENAME
YMODE = TZFILE%CMODE IVERB = TZBAKFILE%NLFIVERB
INPRAR = TZFILE%NLFINPRAR
ITYPE = TZFILE%NLFITYPE
IVERB = TZFILE%NLFIVERB
! !
CALL FMOPEN_ll(YFMFILE,YMODE,CLUOUT,INPRAR,ITYPE,IVERB,ININAR,IRESP) CALL IO_FILE_OPEN_ll(TZBAKFILE,CLUOUT,IRESP)
!
TZFILE%NLFININAR = ININAR
TZFILE%LOPENED = .TRUE.
TZFILE%NOPEN = TZFILE%NOPEN + 1
! !
YDESFM=ADJUSTL(ADJUSTR(YFMFILE)//'.des') YDESFM=ADJUSTL(ADJUSTR(YFMFILE)//'.des')
! !
...@@ -953,6 +946,19 @@ IF (IBAK < NBAK_NUMB ) THEN ...@@ -953,6 +946,19 @@ IF (IBAK < NBAK_NUMB ) THEN
END IF END IF
END IF END IF
! !
IF (IOUT < NOUT_NUMB ) THEN
IF (KTCOUNT == TOUTPUTN(IOUT+1)%NSTEP) THEN
IOUT=IOUT+1
!
TZOUTFILE => TOUTPUTN(IOUT)%TFILE
!
CALL IO_FILE_OPEN_ll(TZOUTFILE,CLUOUT,IRESP)
!
CALL IO_FILE_CLOSE_ll(TZOUTFILE,CLUOUT,IRESP)
!
END IF
END IF
!
CALL SECOND_MNH2(ZTIME2) CALL SECOND_MNH2(ZTIME2)
! !
XT_STORE = XT_STORE + ZTIME2 - ZTIME1 XT_STORE = XT_STORE + ZTIME2 - ZTIME1
...@@ -1912,8 +1918,7 @@ XT_STEP_BUD = XT_STEP_BUD + ZTIME2 - ZTIME1 + XTIME_BU ...@@ -1912,8 +1918,7 @@ XT_STEP_BUD = XT_STEP_BUD + ZTIME2 - ZTIME1 + XTIME_BU
! !
IF (GCLOSE_OUT) THEN IF (GCLOSE_OUT) THEN
GCLOSE_OUT=.FALSE. GCLOSE_OUT=.FALSE.
CALL FMCLOS_ll(YFMFILE,'KEEP',CLUOUT,IRESP) CALL IO_FILE_CLOSE_ll(TZBAKFILE,CLUOUT,IRESP)
TZFILE%LOPENED = .FALSE.
END IF END IF
! !
!------------------------------------------------------------------------------- !-------------------------------------------------------------------------------
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment