diff --git a/src/LIB/SURCOUCHE/src/fmreadwrit.f90 b/src/LIB/SURCOUCHE/src/fmreadwrit.f90 index 83e6aa08584320e541e584c9fc82f43bca87b7ee..994a8c6d2644abac35253cf0f74d3cc49ac83ae7 100644 --- a/src/LIB/SURCOUCHE/src/fmreadwrit.f90 +++ b/src/LIB/SURCOUCHE/src/fmreadwrit.f90 @@ -13,6 +13,7 @@ !----------------------------------------------------------------- MODULE MODD_FM +USE MODD_IO_ll, ONLY : TFIELDDATA IMPLICIT NONE INTEGER, PARAMETER :: JPXKRK = 100 @@ -251,3 +252,177 @@ KDEST(:) = KSOURCE(:) END SUBROUTINE TRANSFW + +MODULE MODE_READWRITE_LFI +! +USE MODD_FM +USE MODD_IO_ll, ONLY : TFIELDDATA +! +IMPLICIT NONE +! +PRIVATE +! +INTERFACE IO_WRITE_FIELD_LFI + MODULE PROCEDURE IO_WRITE_FIELD_LFI_X2,IO_WRITE_FIELD_LFI_X3, & + IO_WRITE_FIELD_LFI_N0 +END INTERFACE IO_WRITE_FIELD_LFI +! +PUBLIC IO_WRITE_FIELD_LFI +! +CONTAINS +! +SUBROUTINE IO_WRITE_FIELD_LFI_X2(TPFIELD,KFLU,PFIELD,KRESP,KVERTLEVEL) +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments +! +TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +INTEGER, INTENT(IN) :: KFLU ! Fortran Logical Unit +REAL,DIMENSION(:,:), INTENT(IN) :: PFIELD ! array containing the data field +INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised +INTEGER,OPTIONAL, INTENT(IN) :: KVERTLEVEL ! Number of the vertical level (needed for Z-level splitted files) +! +!* 0.2 Declarations of local variables +! +INTEGER :: ILENG +INTEGER(kind=LFI_INT) :: IRESP, ITOTAL +INTEGER(KIND=8),DIMENSION(:),ALLOCATABLE :: IWORK +CHARACTER(LEN=4) :: YSUFFIX +CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)+4) :: YVARNAME +! +ILENG = SIZE(PFIELD) +IF (PRESENT(KVERTLEVEL)) THEN + WRITE(YSUFFIX,'(I4.4)') KVERTLEVEL + YVARNAME = TRIM(TPFIELD%CMNHNAME)//YSUFFIX +ELSE + YVARNAME = TRIM(TPFIELD%CMNHNAME) +ENDIF +! +CALL WRITE_PREPARE(TPFIELD,ILENG,IWORK,ITOTAL,IRESP) +! +IF (IRESP==0) THEN + CALL TRANSFW(IWORK(LEN_TRIM(TPFIELD%CCOMMENT)+3),PFIELD,ILENG) + CALL LFIECR(IRESP,KFLU,YVARNAME,IWORK,ITOTAL) +ENDIF +! +KRESP=IRESP +! +IF (ALLOCATED(IWORK)) DEALLOCATE(IWORK) +! +END SUBROUTINE IO_WRITE_FIELD_LFI_X2 +! +SUBROUTINE IO_WRITE_FIELD_LFI_X3(TPFIELD,KFLU,PFIELD,KRESP) +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments +! +TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +INTEGER, INTENT(IN) :: KFLU ! Fortran Logical Unit +REAL,DIMENSION(:,:,:), INTENT(IN) :: PFIELD ! array containing the data field +INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised +! +!* 0.2 Declarations of local variables +! +INTEGER :: ILENG +INTEGER(kind=LFI_INT) :: IRESP, ITOTAL +INTEGER(KIND=8),DIMENSION(:),ALLOCATABLE :: IWORK +! +ILENG = SIZE(PFIELD) +! +CALL WRITE_PREPARE(TPFIELD,ILENG,IWORK,ITOTAL,IRESP) +! +IF (IRESP==0) THEN + CALL TRANSFW(IWORK(LEN_TRIM(TPFIELD%CCOMMENT)+3),PFIELD,ILENG) + CALL LFIECR(IRESP,KFLU,TPFIELD%CMNHNAME,IWORK,ITOTAL) +ENDIF +! +KRESP=IRESP +! +IF (ALLOCATED(IWORK)) DEALLOCATE(IWORK) +! +END SUBROUTINE IO_WRITE_FIELD_LFI_X3 +! +SUBROUTINE IO_WRITE_FIELD_LFI_N0(TPFIELD,KFLU,KFIELD,KRESP) +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments +! +TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +INTEGER, INTENT(IN) :: KFLU ! Fortran Logical Unit +INTEGER, INTENT(IN) :: KFIELD ! array containing the data field +INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised +! +!* 0.2 Declarations of local variables +! +INTEGER :: ILENG +INTEGER(kind=LFI_INT) :: IRESP, ITOTAL +INTEGER(KIND=8),DIMENSION(:),ALLOCATABLE :: IWORK +! +ILENG = 1 +! +CALL WRITE_PREPARE(TPFIELD,ILENG,IWORK,ITOTAL,IRESP) +! +IF (IRESP==0) THEN + IWORK(LEN_TRIM(TPFIELD%CCOMMENT)+3)=KFIELD + CALL LFIECR(IRESP,KFLU,TPFIELD%CMNHNAME,IWORK,ITOTAL) +ENDIF +! +KRESP=IRESP +! +IF (ALLOCATED(IWORK)) DEALLOCATE(IWORK) +! +END SUBROUTINE IO_WRITE_FIELD_LFI_N0 +! +SUBROUTINE WRITE_PREPARE(TPFIELD,KLENG,KWORK,KTOTAL,KRESP) +! +TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +INTEGER, INTENT(IN) :: KLENG +INTEGER(KIND=8),DIMENSION(:),ALLOCATABLE,INTENT(INOUT) :: KWORK +INTEGER(kind=LFI_INT), INTENT(OUT) :: KTOTAL +INTEGER(kind=LFI_INT), INTENT(OUT) :: KRESP +! +INTEGER :: ICOMLEN +INTEGER :: J +INTEGER,DIMENSION(JPXKRK) :: ICOMMENT +! +ICOMLEN = LEN_TRIM(TPFIELD%CCOMMENT) +KRESP = 0 +! +IF (KLENG.LE.0) THEN + KRESP=-40 + RETURN +ELSEIF (KLENG.GT.JPXFIE) THEN + KRESP=-43 + RETURN +ELSEIF ((TPFIELD%NGRID.LT.0).OR.(TPFIELD%NGRID.GT.8)) THEN + KRESP=-46 + RETURN +ENDIF +! +KTOTAL=KLENG+1+ICOMLEN+1 +ALLOCATE(KWORK(KTOTAL)) +! +KWORK(1)=TPFIELD%NGRID +! +SELECT CASE (ICOMLEN) +CASE(:-1) + KRESP=-55 +CASE(0) + KWORK(2)=ICOMLEN +CASE(1:JPXKRK) + DO J=1,ICOMLEN + ICOMMENT(J)=ICHAR(TPFIELD%CCOMMENT(J:J)) + ENDDO + KWORK(2)=ICOMLEN + KWORK(3:ICOMLEN+2)=ICOMMENT(1:ICOMLEN) +CASE(JPXKRK+1:) + PRINT *,'ERROR: WRITE_PREPARE: comment is too long' + KRESP = -9999 +END SELECT +! +END SUBROUTINE WRITE_PREPARE +! +END MODULE MODE_READWRITE_LFI diff --git a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 index 82aadc18a06658bd46838eeeb68104dc4567e061..19abe35f8240fc4a3545ff19ce2cbdeadf0050e3 100644 --- a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 +++ b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 @@ -171,6 +171,7 @@ MODULE MODE_FMWRIT #if defined(MNH_IOCDF4) USE MODE_NETCDF #endif + USE MODE_READWRITE_LFI IMPLICIT NONE @@ -969,7 +970,6 @@ CONTAINS SUBROUTINE IO_WRITE_FIELD_BYFIELD_X3(TPFILE,TPFIELD,HFIPRI,KRESP,PFIELD) USE MODD_IO_ll USE MODD_PARAMETERS_ll,ONLY : JPHEXT - USE MODD_FM USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL USE MODE_ALLOCBUFFER_ll USE MODE_GATHER_ll @@ -999,17 +999,13 @@ CONTAINS CHARACTER(LEN=16) :: YRECFM ! name of the article to write CHARACTER(LEN=2) :: YDIR ! field form CHARACTER(LEN=JPFINL) :: YFNLFI - CHARACTER(LEN=100) :: YCOMMENT ! comment string - INTEGER :: IGRID ! C-grid indicator (u,v,w,T) INTEGER :: IERR TYPE(FD_ll), POINTER :: TZFD INTEGER :: IRESP REAL,DIMENSION(:,:,:),POINTER :: ZFIELDP - TYPE(FMHEADER) :: TZFMH LOGICAL :: GALLOC !JUAN INTEGER :: JK,JKK - CHARACTER(LEN=LEN(YRECFM)) :: YK,YRECZSLIDE REAL,DIMENSION(:,:),POINTER :: ZSLIDE_ll,ZSLIDE INTEGER :: IK_FILE,IK_rank,inb_proc_real,JK_MAX CHARACTER(len=5) :: YK_FILE @@ -1040,8 +1036,6 @@ CONTAINS YFILEM = TPFILE%CNAME YRECFM = TPFIELD%CMNHNAME YDIR = TPFIELD%CDIR - YCOMMENT = TPFIELD%CCOMMENT - IGRID = TPFIELD%NGRID ! !* 1.1 THE NAME OF LFIFM ! @@ -1056,22 +1050,19 @@ CONTAINS TZFD=>GETFD(YFNLFI) IF (ASSOCIATED(TZFD)) THEN IF (GSMONOPROC .AND. (TZFD%nb_procio.eq.1) ) THEN ! sequential execution - TZFMH%GRID=IGRID - TZFMH%COMLEN=LEN(YCOMMENT) - TZFMH%COMMENT=YCOMMENT ! IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN ZFIELDP=>PFIELD(JPHEXT+1:JPHEXT+1,JPHEXT+1:JPHEXT+1,:) - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,YRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,YRECFM,YDIR,ZFIELDP,TZFMH,IRESP) + IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFIELD,TZFD%FLU,ZFIELDP,IRESP) + IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFIELD,TZFD%CDF,ZFIELDP,IRESP) ! ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN ZFIELDP=>PFIELD(:,JPHEXT+1:JPHEXT+1,:) - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,YRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,YRECFM,YDIR,ZFIELDP,TZFMH,IRESP) + IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFIELD,TZFD%FLU,ZFIELDP,IRESP) + IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFIELD,TZFD%CDF,ZFIELDP,IRESP) ELSE - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,YRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) - IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFIELD,TZFD%CDF,IRESP,PFIELD) + IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFIELD,TZFD%FLU,PFIELD,IRESP) + IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFIELD,TZFD%CDF,PFIELD,IRESP) END IF ELSEIF ( (TZFD%nb_procio .eq. 1 ) .OR. ( YDIR == '--' ) ) THEN ! multiprocessor execution & 1 proc IO ! write 3D field in 1 time = output for graphique @@ -1093,13 +1084,9 @@ CONTAINS END IF ! IF (ISP == TZFD%OWNER) THEN - TZFMH%GRID=IGRID - TZFMH%COMLEN=LEN(YCOMMENT) - TZFMH%COMMENT=YCOMMENT - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,YRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& - & ,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,YRECFM,YDIR,ZFIELDP,TZFMH,IRESP) - END IF + IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFIELD,TZFD%FLU,ZFIELDP,IRESP) + IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFIELD,TZFD%CDF,ZFIELDP,IRESP) + END IF ! CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD& & %COMM,IERR) @@ -1145,11 +1132,6 @@ CONTAINS ! IF (ISP == IK_RANK ) THEN CALL SECOND_MNH2(T0) - TZFMH%GRID=IGRID - TZFMH%COMLEN=LEN(YCOMMENT) - TZFMH%COMMENT=YCOMMENT - WRITE(YK,'(I4.4)') JKK - YRECZSLIDE = TRIM(YRECFM)//YK ! IF ( SIZE(ZSLIDE_ll) .EQ. 0 ) THEN DEALLOCATE(ZSLIDE_ll) @@ -1164,9 +1146,8 @@ CONTAINS CALL SECOND_MNH2(T1) TIMEZ%T_WRIT3D_RECV=TIMEZ%T_WRIT3D_RECV + T1 - T0 ! - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD_IOZ%FLU,YRECZSLIDE,.TRUE.,SIZE(ZSLIDE_ll),& - &ZSLIDE_ll,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD_IOZ%CDF,YRECZSLIDE,YDIR,ZSLIDE_ll,TZFMH,IRESP) + IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFIELD,TZFD_IOZ%FLU,ZSLIDE_ll,IRESP,KVERTLEVEL=JKK) + IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFIELD,TZFD_IOZ%CDF,ZSLIDE_ll,IRESP,KVERTLEVEL=JKK) CALL SECOND_MNH2(T2) TIMEZ%T_WRIT3D_WRIT=TIMEZ%T_WRIT3D_WRIT + T2 - T1 END IF @@ -1284,14 +1265,8 @@ CONTAINS CALL SECOND_MNH2(T1) TIMEZ%T_WRIT3D_RECV=TIMEZ%T_WRIT3D_RECV + T1 - T0 !JUANIOZ - TZFMH%GRID=IGRID - TZFMH%COMLEN=LEN(YCOMMENT) - TZFMH%COMMENT=YCOMMENT - WRITE(YK,'(I4.4)') JKK - YRECZSLIDE = TRIM(YRECFM)//YK - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD_IOZ%FLU,YRECZSLIDE,.TRUE.,SIZE(ZSLIDE_ll),ZSLIDE_ll,TZFMH& - & ,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD_IOZ%CDF,YRECZSLIDE,YDIR,ZSLIDE_ll,TZFMH,IRESP) + IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFIELD,TZFD_IOZ%FLU,ZSLIDE_ll,IRESP,KVERTLEVEL=JKK) + IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFIELD,TZFD_IOZ%CDF,ZSLIDE_ll,IRESP,KVERTLEVEL=JKK) CALL SECOND_MNH2(T2) TIMEZ%T_WRIT3D_WRIT=TIMEZ%T_WRIT3D_WRIT + T2 - T1 END IF @@ -1322,7 +1297,7 @@ CONTAINS END IF !---------------------------------------------------------------- IF (IRESP.NE.0) THEN - CALL FM_WRIT_ERR("IO_WRITE_FIELD_BYFIELD_X3",YFILEM,HFIPRI,YRECFM,YDIR,IGRID,LEN(YCOMMENT),IRESP) + CALL FM_WRIT_ERR("IO_WRITE_FIELD_BYFIELD_X3",YFILEM,HFIPRI,YRECFM,YDIR,TPFIELD%NGRID,LEN(TPFIELD%CCOMMENT),IRESP) END IF IF (GALLOC) DEALLOCATE(ZFIELDP) IF (GALLOC_ll) DEALLOCATE(ZSLIDE_ll) @@ -1747,29 +1722,16 @@ CONTAINS ! !* 0.2 Declarations of local variables ! - CHARACTER(LEN=28) :: YFILEM ! FM-file name - CHARACTER(LEN=16) :: YRECFM ! name of the article to write - CHARACTER(LEN=2) :: YDIR ! field form - CHARACTER(LEN=JPFINL) :: YFNLFI - CHARACTER(LEN=100) :: YCOMMENT ! comment string - INTEGER :: IGRID ! C-grid indicator (u,v,w,T) INTEGER :: IERR TYPE(FD_ll), POINTER :: TZFD INTEGER :: IRESP - TYPE(FMHEADER) :: TZFMH !JUANZIO - INTEGER :: IK_FILE,IK_rank + INTEGER :: IK_FILE,IK_RANK CHARACTER(len=5) :: YK_FILE CHARACTER(len=128) :: YFILE_IOZ TYPE(FD_ll), POINTER :: TZFD_IOZ INTEGER,DIMENSION(1) :: IDIMS ! - YFILEM = TPFILE%CNAME - YRECFM = TPFIELD%CMNHNAME - YDIR = TPFIELD%CDIR - YCOMMENT = TPFIELD%CCOMMENT - IGRID = TPFIELD%NGRID - ! IDIMS(1) = 0 ! !JUANZIO @@ -1778,42 +1740,30 @@ CONTAINS !* 1.1 THE NAME OF LFIFM ! IRESP = 0 - YFNLFI=TRIM(ADJUSTL(YFILEM))//'.lfi' - !print * , ' Writing Article N0 ' , YRECFM !------------------------------------------------------------------ - TZFD=>GETFD(YFNLFI) + TZFD=>GETFD(TRIM(ADJUSTL(TPFILE%CNAME))//'.lfi') IF (ASSOCIATED(TZFD)) THEN IF (GSMONOPROC) THEN ! sequential execution - TZFMH%GRID=IGRID - TZFMH%COMLEN=LEN(YCOMMENT) - TZFMH%COMMENT=YCOMMENT - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,YRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP) - IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFIELD,TZFD%CDF,IRESP,KFIELD) + IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFIELD,TZFD%FLU,KFIELD,IRESP) + IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFIELD,TZFD%CDF,KFIELD,IRESP) ELSE IF (ISP == TZFD%OWNER) THEN - TZFMH%GRID=IGRID - TZFMH%COMLEN=LEN(YCOMMENT) - TZFMH%COMMENT=YCOMMENT - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,YRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,YRECFM,YDIR,KFIELD,TZFMH,IRESP) + IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFIELD,TZFD%FLU,KFIELD,IRESP) + IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFIELD,TZFD%CDF,KFIELD,IRESP) END IF ! CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) - END IF ! multiprocessor execution IF (TZFD%nb_procio.gt.1) THEN ! write the data in all Z files DO IK_FILE=1,TZFD%nb_procio write(YK_FILE ,'(".Z",i3.3)') IK_FILE - YFILE_IOZ = TRIM(YFILEM)//YK_FILE//".lfi" + YFILE_IOZ = TRIM(TPFILE%CNAME)//YK_FILE//".lfi" TZFD_IOZ => GETFD(YFILE_IOZ) IK_RANK = TZFD_IOZ%OWNER IF ( ISP == IK_RANK ) THEN - TZFMH%GRID=IGRID - TZFMH%COMLEN=LEN(YCOMMENT) - TZFMH%COMMENT=YCOMMENT - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD_IOZ%FLU,YRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD_IOZ%CDF,YRECFM,YDIR,KFIELD,TZFMH,IRESP) + IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFIELD,TZFD_IOZ%FLU,KFIELD,IRESP) + IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFIELD,TZFD_IOZ%CDF,KFIELD,IRESP) END IF END DO ENDIF @@ -1822,8 +1772,8 @@ CONTAINS END IF !---------------------------------------------------------------- IF (IRESP.NE.0) THEN - CALL FM_WRIT_ERR("IO_WRITE_FIELD_BYFIELD_N0",YFILEM,HFIPRI,YRECFM,YDIR,IGRID,LEN(YCOMMENT)& - & ,IRESP) + CALL FM_WRIT_ERR("IO_WRITE_FIELD_BYFIELD_N0",TPFILE%CNAME,HFIPRI,TPFIELD%CMNHNAME,TPFIELD%CDIR,TPFIELD%NGRID,& + LEN(TPFIELD%CCOMMENT) ,IRESP) END IF KRESP = IRESP END SUBROUTINE IO_WRITE_FIELD_BYFIELD_N0 diff --git a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 b/src/LIB/SURCOUCHE/src/mode_netcdf.f90 index 8b175f8de40d76fbb913d60375865fc3ff9c8d22..2598b7f305d83576f9c23f8b3d0a201b99091181 100644 --- a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 +++ b/src/LIB/SURCOUCHE/src/mode_netcdf.f90 @@ -17,7 +17,8 @@ IMPLICIT NONE PRIVATE INTERFACE IO_WRITE_FIELD_NC4 - MODULE PROCEDURE IO_WRITE_FIELD_NC4_X3, IO_WRITE_FIELD_NC4_N0 + MODULE PROCEDURE IO_WRITE_FIELD_NC4_X2,IO_WRITE_FIELD_NC4_X3, & + IO_WRITE_FIELD_NC4_N0 END INTERFACE IO_WRITE_FIELD_NC4 INTERFACE NCWRIT @@ -139,7 +140,7 @@ END FUNCTION str_replace SUBROUTINE IO_WRITE_HEADER_NC4(TPFILE,HFIPRI) ! -USE MODD_IO_ll, ONLY: TFILEDATA +USE MODD_IO_ll, ONLY: ISP,TFILEDATA ! USE MODE_FD_ll ! @@ -153,8 +154,9 @@ IF (TRIM(TPFILE%CFORMAT)/='NETCDF4' .AND. TRIM(TPFILE%CFORMAT)/='LFICDF4') RETUR ! TZFD=>GETFD(TRIM(ADJUSTL(TPFILE%CNAME))//'.lfi') ! -ISTATUS = NF90_PUT_ATT(TZFD%CDF%NCID, NF90_GLOBAL, 'Conventions', 'CF-1.6') -IF (ISTATUS /= NF90_NOERR) CALL HANDLE_ERR(ISTATUS,__LINE__,'IO_FILE_WRITE_HEADER[NF90_PUT_ATT]') +IF (ISP == TZFD%OWNER) THEN + ISTATUS = NF90_PUT_ATT(TZFD%CDF%NCID, NF90_GLOBAL, 'Conventions', 'CF-1.6') + IF (ISTATUS /= NF90_NOERR) CALL HANDLE_ERR(ISTATUS,__LINE__,'IO_FILE_WRITE_HEADER[NF90_PUT_ATT]') !title @@ -167,7 +169,8 @@ IF (ISTATUS /= NF90_NOERR) CALL HANDLE_ERR(ISTATUS,__LINE__,'IO_FILE_WRITE_HEADE !comment !references - +END IF +! END SUBROUTINE IO_WRITE_HEADER_NC4 SUBROUTINE WRITATTR(KNCID, KVARID, TPFMH) @@ -544,6 +547,62 @@ IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX2[NF90_PUT_VAR KRESP = IRESP END SUBROUTINE NCWRITX2 +SUBROUTINE IO_WRITE_FIELD_NC4_X2(TPFIELD,PZCDF,PFIELD,KRESP,KVERTLEVEL) +! +USE MODD_FM, ONLY : FMHEADER +USE MODD_IO_ll, ONLY : TFIELDDATA +! +TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +TYPE(IOCDF), POINTER :: PZCDF +REAL,DIMENSION(:,:), INTENT(IN) :: PFIELD ! array containing the data field +INTEGER, INTENT(OUT):: KRESP +INTEGER,OPTIONAL, INTENT(IN) :: KVERTLEVEL ! Number of the vertical level (needed for Z-level splitted files) +! +INTEGER(KIND=IDCDF_KIND) :: STATUS +INTEGER(KIND=IDCDF_KIND) :: INCID +CHARACTER(LEN=4) :: YSUFFIX +CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)+4) :: YVARNAME +INTEGER(KIND=IDCDF_KIND) :: IVARID +INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS +INTEGER :: IRESP +! +IRESP = 0 + +IF (PRESENT(KVERTLEVEL)) THEN + WRITE(YSUFFIX,'(I4.4)') KVERTLEVEL + YVARNAME = TRIM(TPFIELD%CMNHNAME)//YSUFFIX +ELSE + YVARNAME = TRIM(TPFIELD%CMNHNAME) +ENDIF + +! Get the Netcdf file ID +INCID = PZCDF%NCID + +! NetCDF var names can't contain '%' nor '.' +YVARNAME = str_replace(YVARNAME, '%', '__') +YVARNAME = str_replace(YVARNAME, '.', '--') + +! The variable should not already exist but who knows ? +STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID) +IF (STATUS /= NF90_NOERR) THEN + ! Get the netcdf dimensions + CALL FILLVDIMS(PZCDF, INT(SHAPE(PFIELD),KIND=IDCDF_KIND), TPFIELD%CDIR, IVDIMS) + + ! Define the variable + STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_DOUBLE, IVDIMS, IVARID) + IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X2[NF90_DEF_VAR]') + CALL IO_WRITE_FIELD_ATTR_NC4(TPFIELD,INCID,IVARID) +ELSE + PRINT *,'IO_WRITE_FIELD_NC4_X2: ', TRIM(YVARNAME), ' already defined !' +END IF + +! Write the data +STATUS = NF90_PUT_VAR(INCID, IVARID, PFIELD) +IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X2[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP) + +KRESP = IRESP +END SUBROUTINE IO_WRITE_FIELD_NC4_X2 + SUBROUTINE NCWRITX3(PZCDF, HVARNAME, HDIR, PFIELD, TPFMH, KRESP) USE MODD_FM, ONLY : FMHEADER TYPE(IOCDF), POINTER :: PZCDF @@ -555,7 +614,7 @@ INTEGER, INTENT(OUT):: KRESP INTEGER(KIND=IDCDF_KIND) :: STATUS INTEGER(KIND=IDCDF_KIND) :: INCID -CHARACTER(LEN=30) :: YVARNAME +CHARACTER(LEN=30) :: YVARNAME INTEGER(KIND=IDCDF_KIND) :: IVARID INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS INTEGER :: IRESP @@ -589,21 +648,21 @@ IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX3[NF90_PUT_VAR KRESP = IRESP END SUBROUTINE NCWRITX3 -SUBROUTINE IO_WRITE_FIELD_NC4_X3(TPFIELD,PZCDF,KRESP,PFIELD) +SUBROUTINE IO_WRITE_FIELD_NC4_X3(TPFIELD,PZCDF,PFIELD,KRESP) ! USE MODD_FM, ONLY : FMHEADER USE MODD_IO_ll, ONLY : TFIELDDATA ! TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD TYPE(IOCDF), POINTER :: PZCDF -INTEGER, INTENT(OUT):: KRESP REAL,DIMENSION(:,:,:), INTENT(IN) :: PFIELD ! array containing the data field +INTEGER, INTENT(OUT):: KRESP ! INTEGER(KIND=IDCDF_KIND) :: STATUS INTEGER(KIND=IDCDF_KIND) :: INCID -CHARACTER(LEN=30) :: YVARNAME +CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)) :: YVARNAME INTEGER(KIND=IDCDF_KIND) :: IVARID -INTEGER(KIND=IDCDF_KIND), DIMENSION(3) :: IVDIMS +INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS INTEGER :: IRESP ! IRESP = 0 @@ -832,7 +891,7 @@ IF (YVARNAME == 'KMAX' .AND. .NOT. ASSOCIATED(PZCDF%DIMZ)) PZCDF%DIMZ=>GETDIMCDF KRESP = IRESP END SUBROUTINE NCWRITN0 -SUBROUTINE IO_WRITE_FIELD_NC4_N0(TPFIELD,PZCDF,KRESP,KFIELD) +SUBROUTINE IO_WRITE_FIELD_NC4_N0(TPFIELD,PZCDF,KFIELD,KRESP) ! USE MODD_FM, ONLY : FMHEADER USE MODD_IO_ll, ONLY : TFIELDDATA @@ -844,12 +903,12 @@ USE MODD_IO_ll, ONLY : LPACK,L1D,L2D ! TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD TYPE(IOCDF), POINTER :: PZCDF -INTEGER, INTENT(OUT):: KRESP INTEGER, INTENT(IN) :: KFIELD +INTEGER, INTENT(OUT):: KRESP ! INTEGER(KIND=IDCDF_KIND) :: STATUS INTEGER(KIND=IDCDF_KIND) :: INCID -CHARACTER(LEN=30) :: YVARNAME +CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)) :: YVARNAME INTEGER(KIND=IDCDF_KIND) :: IVARID INTEGER :: IRESP !