diff --git a/src/LIB/SURCOUCHE/src/modd_io.f90 b/src/LIB/SURCOUCHE/src/modd_io.f90 index 4fd3dbfd711122098d7512aa99dd56802db0ec9a..5c9b6e0a20bcac91c47e209357b4721b710eb95f 100644 --- a/src/LIB/SURCOUCHE/src/modd_io.f90 +++ b/src/LIB/SURCOUCHE/src/modd_io.f90 @@ -54,10 +54,10 @@ TYPE TFILEDATA CHARACTER(LEN=7) :: CMODE = "UNKNOWN" !Opening mode (read, write...) LOGICAL :: LOPENED = .FALSE. !Is the file opened 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 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 :: NLFIVERB = 1 !LFI verbosity level ! diff --git a/src/LIB/SURCOUCHE/src/mode_fm.f90 b/src/LIB/SURCOUCHE/src/mode_fm.f90 index dc7d1416bad83cf58c7e2b02052aa1988d6943ca..db092a52354ed9916a8ea6c0b7714ba66c676b19 100644 --- a/src/LIB/SURCOUCHE/src/mode_fm.f90 +++ b/src/LIB/SURCOUCHE/src/mode_fm.f90 @@ -27,6 +27,7 @@ INTEGER, PARAMETER :: JPPIPE = 10 !INCLUDE 'mpif.h' PUBLIC SET_FMPACK_ll,FMATTR_ll,FMLOOK_ll,FMOPEN_ll,FMCLOS_ll +PUBLIC IO_FILE_OPEN_ll, IO_FILE_CLOSE_ll CONTAINS @@ -129,9 +130,32 @@ END IF 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& - & ,KRESP,OPARALLELIO) -USE MODD_IO_ll, ONLY : ISP,ISTDOUT,LFIPARAM,LIOCDF4,LLFIOUT,LLFIREAD + & ,KRESP,OPARALLELIO,TPFILE) +USE MODD_IO_ll, ONLY : ISP,ISTDOUT,LFIPARAM,LIOCDF4,LLFIOUT,LLFIREAD,TFILEDATA USE MODE_FD_ll, ONLY : FD_ll,GETFD,JPFINL USE MODE_IO_ll, ONLY : OPEN_ll,GCONFIO !JUANZ @@ -153,8 +177,9 @@ INTEGER, INTENT(OUT)::KNINAR ! number of articles ! initially ! present in the file. INTEGER, INTENT(OUT)::KRESP ! return-code if a problem -LOGICAL, INTENT(IN), OPTIONAL :: OPARALLELIO ! araised. +LOGICAL, INTENT(IN), OPTIONAL :: OPARALLELIO +TYPE(TFILEDATA),POINTER,INTENT(IN),OPTIONAL :: TPFILE ! File structure ! ! Local variable ! @@ -176,6 +201,13 @@ LOGICAL :: GPARALLELIO #if defined(MNH_IOCDF4) INTEGER(KIND=IDCDF_KIND) :: INCERR #endif +CHARACTER(LEN=7) :: YTYPE + +IF ( PRESENT(TPFILE) ) THEN + YTYPE = TPFILE%CTYPE +ELSE + YTYPE = 'UNKNOWN' +ENDIF IF ( PRESENT(OPARALLELIO) ) THEN GPARALLELIO = OPARALLELIO @@ -220,9 +252,13 @@ ELSEIF (IROWF.GT.IFMFNL) THEN GOTO 1000 ENDIF -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) +!Do not open '.des' file if OUTPUT +IF(YTYPE/='OUTPUT') THEN + 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 @@ -339,15 +375,37 @@ KRESP=IRESP RETURN 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 !! ------------- ! !! J.Escobar 18/10/10 bug with PGI compiler on ADJUSTL !------------------------------------------------------------------------------- -USE MODD_IO_ll, ONLY : ISP -USE MODE_FD_ll, ONLY : FD_ll,GETFD,JPFINL +USE MODD_IO_ll, ONLY : ISP,TFILEDATA +!USE MODE_FD_ll, ONLY : FD_ll,GETFD,JPFINL +USE MODE_FD_ll USE MODE_IO_ll, ONLY : CLOSE_ll,UPCASE #if !defined(MNH_SGI) USE MODI_SYSTEM_MNH @@ -360,6 +418,7 @@ CHARACTER(LEN=*), INTENT(IN) ::HSTATU ! status for the closed file CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! file for prints in FM INTEGER, INTENT(OUT)::KRESP ! return-code if problems araised LOGICAL, INTENT(IN), OPTIONAL :: OPARALLELIO +TYPE(TFILEDATA),POINTER,INTENT(IN),OPTIONAL :: TPFILE ! File structure INTEGER ::IRESP,IROWF,IFMFNL CHARACTER(LEN=7) ::YSTATU @@ -375,6 +434,13 @@ TYPE(FD_ll), POINTER :: TZFDLFI INTEGER(KIND=LFI_INT) :: IRESP8,INUM8 !JUAN LOGICAL :: GPARALLELIO +CHARACTER(LEN=7) :: YTYPE + +IF ( PRESENT(TPFILE) ) THEN + YTYPE = TPFILE%CTYPE +ELSE + YTYPE = 'UNKNOWN' +ENDIF IF ( PRESENT(OPARALLELIO) ) THEN GPARALLELIO = OPARALLELIO @@ -397,8 +463,6 @@ ELSEIF (IROWF.GT.IFMFNL) THEN GOTO 1000 ENDIF -YFNDES=ADJUSTL(TRIM(HFILEM)//'.des') - IF (LEN(HSTATU).LE.0) THEN IRESP=-41 GOTO 1000 @@ -411,7 +475,12 @@ ELSE 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 YFNLFI=ADJUSTL(TRIM(HFILEM)//'.lfi') diff --git a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 index 5c6fe1f833c468d7cd2a0eee7ebc3bec6a386daa..978c32b84d29dd5aff15ecf99fd4017e0f5dbbd1 100644 --- a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 @@ -448,18 +448,26 @@ SUBROUTINE POPULATE_STRUCT(TPFILE_FIRST,TPFILE_LAST,KSTEPS,HFILETYPE,TPBAKOUTN) TPBAKOUTN(IPOS)%TFILE%CTYPE=HFILETYPE TPBAKOUTN(IPOS)%TFILE%CMODE="WRITE" 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 !PW: TODO: set NLFIVERB only when useful (only if LFI file...) TPBAKOUTN(IPOS)%TFILE%NLFIVERB=NVERB IF (LIOCDF4) THEN - TPBAKOUTN(IPOS)%TFILE%CTYPE='NETCDF4' + TPBAKOUTN(IPOS)%TFILE%CFORMAT='NETCDF4' IF (LLFIOUT) THEN PRINT *,'Warning: LLFIOUT + LIOCDF4 = .TRUE. not yet implemented with new IO data structures' TPBAKOUTN(IPOS)%TFILE%NLFINPRAR= 22+2*(4+NRR+NSV) END IF ELSE IF (LLFIOUT) THEN - TPBAKOUTN(IPOS)%TFILE%CTYPE='LFI' + TPBAKOUTN(IPOS)%TFILE%CFORMAT='LFI' TPBAKOUTN(IPOS)%TFILE%NLFINPRAR= 22+2*(4+NRR+NSV) ELSE PRINT *,'Error: unknown backup/output fileformat' diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90 index 7ba4a816a11d002a98f377b4a92fa0df9c73997c..8a1ee6baa7be434c6d24a2b58dc74e8a619eb10e 100644 --- a/src/MNH/modeln.f90 +++ b/src/MNH/modeln.f90 @@ -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(HALO2LIST_ll), POINTER :: TZHALO2C_ll ! list of fields to exchange ! -TYPE(TFILEDATA),POINTER :: TZFILE -CHARACTER(LEN=:),ALLOCATABLE :: YMODE +TYPE(TFILEDATA),POINTER :: TZBAKFILE, TZOUTFILE !------------------------------------------------------------------------------- ! !* 0. MICROPHYSICAL SCHEME @@ -601,8 +600,9 @@ IF (KTCOUNT == 1) THEN ALLOCATE(ZWT_ACT_NUC(SIZE(XWT,1),SIZE(XWT,2),SIZE(XWT,3))) 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 + IOUT=0 ! INPRAR = 50 CALL FMOPEN_ll(CFMDIAC,'WRITE',CLUOUT,INPRAR,ITYPE,NVERB,ININAR,IRESP) @@ -911,19 +911,12 @@ IF (IBAK < NBAK_NUMB ) THEN IBAK=IBAK+1 GCLOSE_OUT=.TRUE. ! - TZFILE => TBACKUPN(IBAK)%TFILE - YFMFILE = TZFILE%CNAME + TZBAKFILE => TBACKUPN(IBAK)%TFILE + YFMFILE = TZBAKFILE%CNAME YDADFILE = TBACKUPN(IBAK)%CDADFILENAME - YMODE = TZFILE%CMODE - INPRAR = TZFILE%NLFINPRAR - ITYPE = TZFILE%NLFITYPE - IVERB = TZFILE%NLFIVERB + IVERB = TZBAKFILE%NLFIVERB ! - CALL FMOPEN_ll(YFMFILE,YMODE,CLUOUT,INPRAR,ITYPE,IVERB,ININAR,IRESP) - ! - TZFILE%NLFININAR = ININAR - TZFILE%LOPENED = .TRUE. - TZFILE%NOPEN = TZFILE%NOPEN + 1 + CALL IO_FILE_OPEN_ll(TZBAKFILE,CLUOUT,IRESP) ! YDESFM=ADJUSTL(ADJUSTR(YFMFILE)//'.des') ! @@ -953,6 +946,19 @@ IF (IBAK < NBAK_NUMB ) THEN 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) ! XT_STORE = XT_STORE + ZTIME2 - ZTIME1 @@ -1912,8 +1918,7 @@ XT_STEP_BUD = XT_STEP_BUD + ZTIME2 - ZTIME1 + XTIME_BU ! IF (GCLOSE_OUT) THEN GCLOSE_OUT=.FALSE. - CALL FMCLOS_ll(YFMFILE,'KEEP',CLUOUT,IRESP) - TZFILE%LOPENED = .FALSE. + CALL IO_FILE_CLOSE_ll(TZBAKFILE,CLUOUT,IRESP) END IF ! !-------------------------------------------------------------------------------