diff --git a/src/LIB/SURCOUCHE/src/fmreadwrit.f90 b/src/LIB/SURCOUCHE/src/fmreadwrit.f90 index 4f9c202ba983730f0dc8ad601e347a35c09ec40b..a235ff73dc2705b772c8ca6b33f33bd490035dc3 100644 --- a/src/LIB/SURCOUCHE/src/fmreadwrit.f90 +++ b/src/LIB/SURCOUCHE/src/fmreadwrit.f90 @@ -271,6 +271,19 @@ IMPLICIT NONE ! PRIVATE ! +INTERFACE IO_READ_FIELD_LFI + MODULE PROCEDURE IO_READ_FIELD_LFI_N0 +! IO_READ_FIELD_LFI_X0,IO_READ_FIELD_LFI_X1, & +! IO_READ_FIELD_LFI_X2,IO_READ_FIELD_LFI_X3, & +! IO_READ_FIELD_LFI_X4,IO_READ_FIELD_LFI_X5, & +! IO_READ_FIELD_LFI_X6, & +! IO_READ_FIELD_LFI_N1, & +! IO_READ_FIELD_LFI_N2,IO_READ_FIELD_LFI_N3, & +! IO_READ_FIELD_LFI_L0,IO_READ_FIELD_LFI_L1, & +! IO_READ_FIELD_LFI_C0, & +! IO_READ_FIELD_LFI_T0 +END INTERFACE IO_READ_FIELD_LFI +! INTERFACE IO_WRITE_FIELD_LFI MODULE PROCEDURE IO_WRITE_FIELD_LFI_X0,IO_WRITE_FIELD_LFI_X1, & IO_WRITE_FIELD_LFI_X2,IO_WRITE_FIELD_LFI_X3, & @@ -283,10 +296,127 @@ INTERFACE IO_WRITE_FIELD_LFI IO_WRITE_FIELD_LFI_T0 END INTERFACE IO_WRITE_FIELD_LFI ! -PUBLIC IO_WRITE_FIELD_LFI +PUBLIC IO_READ_FIELD_LFI,IO_WRITE_FIELD_LFI ! CONTAINS ! +SUBROUTINE IO_READ_FIELD_LFI_N0(TPFILE,TPFIELD,KFIELD,TPFMH,KRESP) +USE MODD_FM +USE MODD_CONFZ, ONLY : NZ_VERB +USE MODE_MSG +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments +! +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +TYPE(TFIELDDATA),INTENT(IN) :: TPFIELD +INTEGER, INTENT(OUT) :: KFIELD ! array containing the data field +TYPE(FMHEADER), INTENT(OUT) :: TPFMH ! FM-File Header +INTEGER, INTENT(OUT) :: KRESP ! return-code if problems occured +! +!* 0.2 Declarations of local variables +! +INTEGER(KIND=LFI_INT) :: IRESP,ITOTAL +INTEGER :: ILENG +INTEGER(KIND=8),DIMENSION(:),ALLOCATABLE :: IWORK +! +CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_READ_FIELD_LFI_N0',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME)) +! +ILENG = 1 +! +CALL IO_READ_AND_CHECK_FIELD_LFI(TPFILE,TPFIELD,ILENG,IWORK,ITOTAL,TPFMH,IRESP) +! +IF (IRESP==0) KFIELD = IWORK(TPFMH%COMLEN+3) +! +KRESP=IRESP +! +IF (ALLOCATED(IWORK)) DEALLOCATE(IWORK) +! +END SUBROUTINE IO_READ_FIELD_LFI_N0 +! +! +SUBROUTINE IO_READ_AND_CHECK_FIELD_LFI(TPFILE,TPFIELD,KLENG,KWORK,KTOTAL,TPFMH,KRESP) +! +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +INTEGER, INTENT(IN) :: KLENG +INTEGER(KIND=8),DIMENSION(:),ALLOCATABLE,INTENT(OUT) :: KWORK +INTEGER(KIND=LFI_INT), INTENT(OUT) :: KTOTAL +TYPE(FMHEADER), INTENT(OUT) :: TPFMH ! FM-File Header +INTEGER(KIND=LFI_INT), INTENT(OUT) :: KRESP +! +INTEGER :: IROW,J +INTEGER,DIMENSION(JPXKRK) :: ICOMMENT +INTEGER(KIND=LFI_INT) :: INUMBR,IPOSEX +CHARACTER(LEN=12) :: YRECLENGTH_FILE, YRECLENGTH_MEM +! +!* 2.a LET'S GET SOME INFORMATION ON THE DESIRED ARTICLE +! +INUMBR = TPFILE%NLFIFLU +CALL LFINFO(KRESP,INUMBR,TRIM(TPFIELD%CMNHNAME),KTOTAL,IPOSEX) +! +IF (KRESP.NE.0) THEN + RETURN +ELSEIF (KTOTAL.EQ.0) THEN + CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_AND_CHECK_FIELD_LFI',TRIM(TPFILE%CNAME)//': record length is zero for ' & + //TRIM(TPFIELD%CMNHNAME)) + KRESP=-47 + RETURN +ELSEIF (KTOTAL.GT.JPXFIE) THEN + CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_AND_CHECK_FIELD_LFI',TRIM(TPFILE%CNAME)// & + ': record length exceeds the maximum value in FM for '//TRIM(TPFIELD%CMNHNAME)) + KRESP=-48 + RETURN +ENDIF +! +!* 2.b UNFORMATTED DIRECT ACCESS READ OPERATION +! +ALLOCATE(KWORK(KTOTAL)) +! +CALL LFILEC(KRESP,INUMBR,TRIM(TPFIELD%CMNHNAME),KWORK,KTOTAL) +IF (KRESP.NE.0) RETURN +! +!* 2.c THE GRID INDICATOR AND THE COMMENT STRING +!* ARE SEPARATED FROM THE DATA +! +TPFMH%GRID = KWORK(1) +TPFMH%COMLEN = KWORK(2) +! +IROW=KLENG+TPFMH%COMLEN+2 +IF (KTOTAL.NE.IROW) THEN + WRITE(YRECLENGTH_FILE,'(I12)') KTOTAL-2-TPFMH%COMLEN + WRITE(YRECLENGTH_MEM, '(I12)') KLENG + CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_AND_CHECK_FIELD_LFI','wrong field size for '//TRIM(TPFIELD%CMNHNAME) & + //' (expected: '//TRIM(ADJUSTL(YRECLENGTH_MEM))// & + ', in file: ' //TRIM(ADJUSTL(YRECLENGTH_FILE))//')') + KRESP=-63 + RETURN +ENDIF +! +SELECT CASE (TPFMH%COMLEN) +CASE(:-1) + CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_AND_CHECK_FIELD_LFI',TRIM(TPFILE%CNAME)//': comment length is negative for ' & + //TRIM(TPFIELD%CMNHNAME)) + KRESP=-58 + RETURN +CASE(0) + KRESP = 0 +CASE(1:JPXKRK) + ICOMMENT(1:TPFMH%COMLEN)=KWORK(3:TPFMH%COMLEN+2) + DO J=1,TPFMH%COMLEN + TPFMH%COMMENT(J:J)=CHAR(ICOMMENT(J)) + ENDDO +CASE(JPXKRK+1:) + CALL PRINT_MSG(NVERB_WARNING,'IO','IO_READ_AND_CHECK_FIELD_LFI',TRIM(TPFILE%CNAME)//': comment is too long in file for ' & + //TRIM(TPFIELD%CMNHNAME)) + KRESP=-56 + RETURN +END SELECT +! +END SUBROUTINE IO_READ_AND_CHECK_FIELD_LFI +! +! SUBROUTINE IO_WRITE_FIELD_LFI_X0(TPFIELD,KFLU,PFIELD,KRESP) ! IMPLICIT NONE @@ -973,8 +1103,6 @@ ALLOCATE(KWORK(KTOTAL)) KWORK(1)=TPFIELD%NGRID ! SELECT CASE (ICOMLEN) -CASE(:-1) - KRESP=-55 CASE(0) KWORK(2)=ICOMLEN CASE(1:JPXKRK) @@ -985,7 +1113,7 @@ CASE(1:JPXKRK) KWORK(3:ICOMLEN+2)=ICOMMENT(1:ICOMLEN) CASE(JPXKRK+1:) CALL PRINT_MSG(NVERB_WARNING,'IO','WRITE_PREPARE','comment is too long') - KRESP = -9999 + KRESP = -57 END SELECT ! END SUBROUTINE WRITE_PREPARE diff --git a/src/MNH/ini_segn.f90 b/src/MNH/ini_segn.f90 index 7e50f17f8e2d6aa5f89ceb0751b4b075c05b7d00..bc4e1418d26b6988b18eecf7fef77559e1b677d1 100644 --- a/src/MNH/ini_segn.f90 +++ b/src/MNH/ini_segn.f90 @@ -173,7 +173,7 @@ USE MODD_CONF USE MODD_CONF_n, ONLY : CSTORAGE_TYPE USE MODN_CONFZ USE MODD_DYN -USE MODD_IO_ll, ONLY : LIOCDF4,LLFIREAD,NVERB_FATAL,NVERB_WARNING,TFILEDATA +USE MODD_IO_ll, ONLY : ISP,LIOCDF4,LLFIREAD,NVERB_FATAL,NVERB_WARNING,TFILEDATA USE MODD_LUNIT USE MODD_LUNIT_n, ONLY : CINIFILE_n=> CINIFILE,CINIFILEPGD_n=> CINIFILEPGD USE MODD_PARAM_n, ONLY : CSURF @@ -401,11 +401,11 @@ TZFD=>GETFD(TRIM(ADJUSTL(TZFILE%CNAME))//'.lfi') IF (.NOT.ASSOCIATED(TZFD)) CALL PRINT_MSG(NVERB_FATAL,'IO','INI_SEG_n','file '//TRIM(TZFILE%CNAME)//' not found') IF (LIOCDF4 .AND. .NOT.LLFIREAD) THEN TZFILE%CFORMAT = 'NETCDF4' - TZFILE%NNCID = TZFD%CDF%NCID + IF (ISP == TZFD%OWNER) TZFILE%NNCID = TZFD%CDF%NCID ELSE TZFILE%CFORMAT = 'LFI' TZFILE%NLFINPRAR = 0 - TZFILE%NLFIFLU = TZFD%FLU + IF (ISP == TZFD%OWNER) TZFILE%NLFIFLU = TZFD%FLU ENDIF TZFILE%CMODE = 'READ' TZFILE%NLFITYPE = 2