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

Philippe 27/06/2017: IO:

* added IO_READ_FIELD_LFI interface
* 1st version of IO_READ_FIELD_LFI_N0 (not yet fully implemented)
* corrected problems in ini_segn if process is not the owner of the file
parent f71cdb03
No related branches found
No related tags found
No related merge requests found
...@@ -271,6 +271,19 @@ IMPLICIT NONE ...@@ -271,6 +271,19 @@ IMPLICIT NONE
! !
PRIVATE 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 INTERFACE IO_WRITE_FIELD_LFI
MODULE PROCEDURE IO_WRITE_FIELD_LFI_X0,IO_WRITE_FIELD_LFI_X1, & MODULE PROCEDURE IO_WRITE_FIELD_LFI_X0,IO_WRITE_FIELD_LFI_X1, &
IO_WRITE_FIELD_LFI_X2,IO_WRITE_FIELD_LFI_X3, & IO_WRITE_FIELD_LFI_X2,IO_WRITE_FIELD_LFI_X3, &
...@@ -283,10 +296,127 @@ INTERFACE IO_WRITE_FIELD_LFI ...@@ -283,10 +296,127 @@ INTERFACE IO_WRITE_FIELD_LFI
IO_WRITE_FIELD_LFI_T0 IO_WRITE_FIELD_LFI_T0
END INTERFACE IO_WRITE_FIELD_LFI END INTERFACE IO_WRITE_FIELD_LFI
! !
PUBLIC IO_WRITE_FIELD_LFI PUBLIC IO_READ_FIELD_LFI,IO_WRITE_FIELD_LFI
! !
CONTAINS 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) SUBROUTINE IO_WRITE_FIELD_LFI_X0(TPFIELD,KFLU,PFIELD,KRESP)
! !
IMPLICIT NONE IMPLICIT NONE
...@@ -973,8 +1103,6 @@ ALLOCATE(KWORK(KTOTAL)) ...@@ -973,8 +1103,6 @@ ALLOCATE(KWORK(KTOTAL))
KWORK(1)=TPFIELD%NGRID KWORK(1)=TPFIELD%NGRID
! !
SELECT CASE (ICOMLEN) SELECT CASE (ICOMLEN)
CASE(:-1)
KRESP=-55
CASE(0) CASE(0)
KWORK(2)=ICOMLEN KWORK(2)=ICOMLEN
CASE(1:JPXKRK) CASE(1:JPXKRK)
...@@ -985,7 +1113,7 @@ CASE(1:JPXKRK) ...@@ -985,7 +1113,7 @@ CASE(1:JPXKRK)
KWORK(3:ICOMLEN+2)=ICOMMENT(1:ICOMLEN) KWORK(3:ICOMLEN+2)=ICOMMENT(1:ICOMLEN)
CASE(JPXKRK+1:) CASE(JPXKRK+1:)
CALL PRINT_MSG(NVERB_WARNING,'IO','WRITE_PREPARE','comment is too long') CALL PRINT_MSG(NVERB_WARNING,'IO','WRITE_PREPARE','comment is too long')
KRESP = -9999 KRESP = -57
END SELECT END SELECT
! !
END SUBROUTINE WRITE_PREPARE END SUBROUTINE WRITE_PREPARE
......
...@@ -173,7 +173,7 @@ USE MODD_CONF ...@@ -173,7 +173,7 @@ USE MODD_CONF
USE MODD_CONF_n, ONLY : CSTORAGE_TYPE USE MODD_CONF_n, ONLY : CSTORAGE_TYPE
USE MODN_CONFZ USE MODN_CONFZ
USE MODD_DYN 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
USE MODD_LUNIT_n, ONLY : CINIFILE_n=> CINIFILE,CINIFILEPGD_n=> CINIFILEPGD USE MODD_LUNIT_n, ONLY : CINIFILE_n=> CINIFILE,CINIFILEPGD_n=> CINIFILEPGD
USE MODD_PARAM_n, ONLY : CSURF USE MODD_PARAM_n, ONLY : CSURF
...@@ -401,11 +401,11 @@ TZFD=>GETFD(TRIM(ADJUSTL(TZFILE%CNAME))//'.lfi') ...@@ -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 (.NOT.ASSOCIATED(TZFD)) CALL PRINT_MSG(NVERB_FATAL,'IO','INI_SEG_n','file '//TRIM(TZFILE%CNAME)//' not found')
IF (LIOCDF4 .AND. .NOT.LLFIREAD) THEN IF (LIOCDF4 .AND. .NOT.LLFIREAD) THEN
TZFILE%CFORMAT = 'NETCDF4' TZFILE%CFORMAT = 'NETCDF4'
TZFILE%NNCID = TZFD%CDF%NCID IF (ISP == TZFD%OWNER) TZFILE%NNCID = TZFD%CDF%NCID
ELSE ELSE
TZFILE%CFORMAT = 'LFI' TZFILE%CFORMAT = 'LFI'
TZFILE%NLFINPRAR = 0 TZFILE%NLFINPRAR = 0
TZFILE%NLFIFLU = TZFD%FLU IF (ISP == TZFD%OWNER) TZFILE%NLFIFLU = TZFD%FLU
ENDIF ENDIF
TZFILE%CMODE = 'READ' TZFILE%CMODE = 'READ'
TZFILE%NLFITYPE = 2 TZFILE%NLFITYPE = 2
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment