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

Philippe 17/03/2017: IO: added writing of 5D array of real

* added IO_WRITE_FIELD_BYNAME_X5 and IO_WRITE_FIELD_BYFIELD_X5 subroutines
  to IO_WRITE_FIELD procedure
* added IO_WRITE_FIELD_LFI_X5 subroutine to IO_WRITE_FIELD_LFI procedure
* added IO_WRITE_FIELD_NC4_X5 subroutine to IO_WRITE_FIELD_NC4 procedure
parent f14bdeac
No related branches found
No related tags found
No related merge requests found
...@@ -274,6 +274,7 @@ PRIVATE ...@@ -274,6 +274,7 @@ PRIVATE
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, &
IO_WRITE_FIELD_LFI_X5, &
IO_WRITE_FIELD_LFI_N0,IO_WRITE_FIELD_LFI_N1, & IO_WRITE_FIELD_LFI_N0,IO_WRITE_FIELD_LFI_N1, &
IO_WRITE_FIELD_LFI_N2, & IO_WRITE_FIELD_LFI_N2, &
IO_WRITE_FIELD_LFI_C0, & IO_WRITE_FIELD_LFI_C0, &
...@@ -449,6 +450,45 @@ IF (ALLOCATED(IWORK)) DEALLOCATE(IWORK) ...@@ -449,6 +450,45 @@ IF (ALLOCATED(IWORK)) DEALLOCATE(IWORK)
! !
END SUBROUTINE IO_WRITE_FIELD_LFI_X3 END SUBROUTINE IO_WRITE_FIELD_LFI_X3
! !
SUBROUTINE IO_WRITE_FIELD_LFI_X5(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
CHARACTER(LEN=16) :: YRECFM
!
CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_LFI_X5','writing '//TRIM(TPFIELD%CMNHNAME))
!
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)
YRECFM=TRIM(TPFIELD%CMNHNAME)
IF( LEN_TRIM(TPFIELD%CMNHNAME) > LEN(YRECFM) ) &
CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_LFI_X5','field name was truncated to '&
//YRECFM//' for '//TRIM(TPFIELD%CMNHNAME))
CALL LFIECR(IRESP,KFLU,YRECFM,IWORK,ITOTAL)
ENDIF
!
KRESP=IRESP
!
IF (ALLOCATED(IWORK)) DEALLOCATE(IWORK)
!
END SUBROUTINE IO_WRITE_FIELD_LFI_X5
!
SUBROUTINE IO_WRITE_FIELD_LFI_N0(TPFIELD,KFLU,KFIELD,KRESP) SUBROUTINE IO_WRITE_FIELD_LFI_N0(TPFIELD,KFLU,KFIELD,KRESP)
! !
IMPLICIT NONE IMPLICIT NONE
......
...@@ -181,6 +181,7 @@ MODULE MODE_FMWRIT ...@@ -181,6 +181,7 @@ MODULE MODE_FMWRIT
INTERFACE IO_WRITE_FIELD INTERFACE IO_WRITE_FIELD
MODULE PROCEDURE IO_WRITE_FIELD_BYNAME_X0, IO_WRITE_FIELD_BYNAME_X1, & MODULE PROCEDURE IO_WRITE_FIELD_BYNAME_X0, IO_WRITE_FIELD_BYNAME_X1, &
IO_WRITE_FIELD_BYNAME_X2, IO_WRITE_FIELD_BYNAME_X3, & IO_WRITE_FIELD_BYNAME_X2, IO_WRITE_FIELD_BYNAME_X3, &
IO_WRITE_FIELD_BYNAME_X5, &
IO_WRITE_FIELD_BYNAME_N0, IO_WRITE_FIELD_BYNAME_N1, & IO_WRITE_FIELD_BYNAME_N0, IO_WRITE_FIELD_BYNAME_N1, &
IO_WRITE_FIELD_BYNAME_N2, & IO_WRITE_FIELD_BYNAME_N2, &
IO_WRITE_FIELD_BYNAME_L0, IO_WRITE_FIELD_BYNAME_L1, & IO_WRITE_FIELD_BYNAME_L0, IO_WRITE_FIELD_BYNAME_L1, &
...@@ -188,6 +189,7 @@ MODULE MODE_FMWRIT ...@@ -188,6 +189,7 @@ MODULE MODE_FMWRIT
IO_WRITE_FIELD_BYNAME_T0, & IO_WRITE_FIELD_BYNAME_T0, &
IO_WRITE_FIELD_BYFIELD_X0,IO_WRITE_FIELD_BYFIELD_X1, & IO_WRITE_FIELD_BYFIELD_X0,IO_WRITE_FIELD_BYFIELD_X1, &
IO_WRITE_FIELD_BYFIELD_X2,IO_WRITE_FIELD_BYFIELD_X3, & IO_WRITE_FIELD_BYFIELD_X2,IO_WRITE_FIELD_BYFIELD_X3, &
IO_WRITE_FIELD_BYFIELD_X5, &
IO_WRITE_FIELD_BYFIELD_N0,IO_WRITE_FIELD_BYFIELD_N1, & IO_WRITE_FIELD_BYFIELD_N0,IO_WRITE_FIELD_BYFIELD_N1, &
IO_WRITE_FIELD_BYFIELD_N2, & IO_WRITE_FIELD_BYFIELD_N2, &
IO_WRITE_FIELD_BYFIELD_L0,IO_WRITE_FIELD_BYFIELD_L1, & IO_WRITE_FIELD_BYFIELD_L0,IO_WRITE_FIELD_BYFIELD_L1, &
...@@ -1948,6 +1950,129 @@ CONTAINS ...@@ -1948,6 +1950,129 @@ CONTAINS
KRESP = IRESP KRESP = IRESP
END SUBROUTINE FMWRITX5_ll END SUBROUTINE FMWRITX5_ll
SUBROUTINE IO_WRITE_FIELD_BYNAME_X5(TPFILE,HNAME,HFIPRI,KRESP,PFIELD)
!
USE MODD_IO_ll, ONLY : TFILEDATA
!
!* 0.1 Declarations of arguments
!
TYPE(TFILEDATA), INTENT(IN) :: TPFILE
CHARACTER(LEN=*), INTENT(IN) :: HNAME ! name of the field to write
CHARACTER(LEN=*), INTENT(IN) :: HFIPRI ! output file for error messages
INTEGER, INTENT(OUT):: KRESP ! return-code
REAL,DIMENSION(:,:,:,:,:), INTENT(IN) :: PFIELD ! array containing the data field
!
!* 0.2 Declarations of local variables
!
INTEGER :: ID ! Index of the field
!
CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_BYNAME_X5','writing '//TRIM(HNAME))
!
CALL FIND_FIELD_ID_FROM_MNHNAME(HNAME,ID,KRESP)
!
IF(KRESP==0) CALL IO_WRITE_FIELD(TPFILE,TFIELDLIST(ID),HFIPRI,KRESP,PFIELD)
!
END SUBROUTINE IO_WRITE_FIELD_BYNAME_X5
SUBROUTINE IO_WRITE_FIELD_BYFIELD_X5(TPFILE,TPFIELD,HFIPRI,KRESP,PFIELD)
USE MODD_IO_ll
USE MODD_PARAMETERS_ll,ONLY : JPHEXT
USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL
USE MODE_ALLOCBUFFER_ll
USE MODE_GATHER_ll
!JUANZ
USE MODE_IO_ll, ONLY : io_file,io_rank
USE MODD_TIMEZ, ONLY : TIMEZ
USE MODE_MNH_TIMING, ONLY : SECOND_MNH2
!JUANZ
USE MODD_VAR_ll, ONLY : MNH_STATUSES_IGNORE
!
!
!* 0.1 Declarations of arguments
!
TYPE(TFILEDATA), INTENT(IN) :: TPFILE
TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD
CHARACTER(LEN=*), INTENT(IN) :: HFIPRI ! output file for error messages
INTEGER, INTENT(OUT):: KRESP ! return-code
REAL,DIMENSION(:,:,:,:,:),TARGET,INTENT(IN) :: PFIELD ! array containing the data field
!
!* 0.2 Declarations of local variables
!
CHARACTER(LEN=28) :: YFILEM ! FM-file name
CHARACTER(LEN=NMNHNAMELGTMAX) :: YRECFM ! name of the article to write
CHARACTER(LEN=2) :: YDIR ! field form
CHARACTER(LEN=JPFINL) :: YFNLFI
INTEGER :: IERR
TYPE(FD_ll), POINTER :: TZFD
INTEGER :: IRESP
REAL,DIMENSION(:,:,:,:,:),POINTER :: ZFIELDP
LOGICAL :: GALLOC
INTEGER :: IHEXTOT
!
YFILEM = TPFILE%CNAME
YRECFM = TPFIELD%CMNHNAME
YDIR = TPFIELD%CDIR
!
CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_BYFIELD_X5','writing '//TRIM(YRECFM))
!
IRESP = 0
GALLOC = .FALSE.
YFNLFI=TRIM(ADJUSTL(YFILEM))//'.lfi'
!
!------------------------------------------------------------------
IHEXTOT = 2*JPHEXT+1
TZFD=>GETFD(YFNLFI)
IF (ASSOCIATED(TZFD)) THEN
IF (GSMONOPROC) THEN ! sequential execution
! 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,:,:,:)
! 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 IO_WRITE_FIELD_LFI(TPFIELD,TZFD%FLU,ZFIELDP,IRESP)
IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,ZFIELDP,IRESP)
ELSE
IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFIELD,TZFD%FLU,PFIELD,IRESP)
IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,PFIELD,IRESP)
END IF
ELSE
IF (ISP == TZFD%OWNER) THEN
CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,YDIR,GALLOC)
ELSE
ALLOCATE(ZFIELDP(0,0,0,0,0))
GALLOC = .TRUE.
END IF
!
IF (YDIR == 'XX' .OR. YDIR =='YY') THEN
CALL GATHER_XXFIELD(YDIR,PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM)
ELSEIF (YDIR == 'XY') THEN
IF (LPACK .AND. L2D) THEN
CALL GATHER_XXFIELD('XX',PFIELD(:,JPHEXT+1,:,:,:),ZFIELDP(:,1,:,:,:),&
& TZFD%OWNER,TZFD%COMM)
ELSE
CALL GATHER_XYFIELD(PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM)
END IF
END IF
!
IF (ISP == TZFD%OWNER) THEN
IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFIELD,TZFD%FLU,ZFIELDP,IRESP)
IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,ZFIELDP,IRESP)
END IF
!
CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
END IF ! multiprocessor execution
ELSE
IRESP = -61
END IF
!----------------------------------------------------------------
IF (IRESP.NE.0) THEN
CALL FM_WRIT_ERR("IO_WRITE_FIELD_BYFIELD_X5",YFILEM,HFIPRI,YRECFM,YDIR,TPFIELD%NGRID,LEN(TPFIELD%CCOMMENT),IRESP)
END IF
IF (GALLOC) DEALLOCATE(ZFIELDP)
KRESP = IRESP
END SUBROUTINE IO_WRITE_FIELD_BYFIELD_X5
SUBROUTINE FMWRITX6_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& SUBROUTINE FMWRITX6_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,&
KLENCH,HCOMMENT,KRESP) KLENCH,HCOMMENT,KRESP)
USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT
......
...@@ -25,6 +25,7 @@ INTEGER(KIND=IDCDF_KIND),PARAMETER :: DEFLATE = 1 ...@@ -25,6 +25,7 @@ INTEGER(KIND=IDCDF_KIND),PARAMETER :: DEFLATE = 1
INTERFACE IO_WRITE_FIELD_NC4 INTERFACE IO_WRITE_FIELD_NC4
MODULE PROCEDURE IO_WRITE_FIELD_NC4_X0,IO_WRITE_FIELD_NC4_X1, & MODULE PROCEDURE IO_WRITE_FIELD_NC4_X0,IO_WRITE_FIELD_NC4_X1, &
IO_WRITE_FIELD_NC4_X2,IO_WRITE_FIELD_NC4_X3, & IO_WRITE_FIELD_NC4_X2,IO_WRITE_FIELD_NC4_X3, &
IO_WRITE_FIELD_NC4_X5, &
IO_WRITE_FIELD_NC4_N0,IO_WRITE_FIELD_NC4_N1, & IO_WRITE_FIELD_NC4_N0,IO_WRITE_FIELD_NC4_N1, &
IO_WRITE_FIELD_NC4_N2, & IO_WRITE_FIELD_NC4_N2, &
IO_WRITE_FIELD_NC4_C0,IO_WRITE_FIELD_NC4_C1, & IO_WRITE_FIELD_NC4_C0,IO_WRITE_FIELD_NC4_C1, &
...@@ -953,6 +954,67 @@ IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX5[NF90_PUT_VAR ...@@ -953,6 +954,67 @@ IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX5[NF90_PUT_VAR
KRESP = IRESP KRESP = IRESP
END SUBROUTINE NCWRITX5 END SUBROUTINE NCWRITX5
SUBROUTINE IO_WRITE_FIELD_NC4_X5(TPFILE,TPFIELD,PZCDF,PFIELD,KRESP)
!
TYPE(TFILEDATA), INTENT(IN) :: TPFILE
TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD
TYPE(IOCDF), POINTER :: PZCDF
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=LEN(TPFIELD%CMNHNAME)) :: YVARNAME
INTEGER(KIND=IDCDF_KIND) :: IVARID
INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS
INTEGER :: IRESP
!
!
CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_NC4_X5','writing '//TRIM(TPFIELD%CMNHNAME))
!
IRESP = 0
! Get the Netcdf file ID
INCID = TPFILE%NNCID
! NetCDF var names can't contain '%' nor '.'
YVARNAME = str_replace(TPFIELD%CMNHNAME, '%', '__')
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
IF (SIZE(PFIELD)==0) THEN
CALL PRINT_MSG(NVERB_INFO,'IO','IO_WRITE_FIELD_NC4_X5','ignoring variable with a zero size ('//TRIM(YVARNAME)//')')
RETURN
END IF
! Get the netcdf dimensions
CALL FILLVDIMS(PZCDF, INT(SHAPE(PFIELD),KIND=IDCDF_KIND), TPFIELD%CDIR, IVDIMS)
! Define the variable
IF (TPFILE%LNCREDUCE_FLOAT_PRECISION) THEN
STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_FLOAT, IVDIMS, IVARID)
ELSE
STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_DOUBLE, IVDIMS, IVARID)
END IF
! Add compression if asked for
IF (TPFILE%LNCCOMPRESS) THEN
STATUS = NF90_DEF_VAR_DEFLATE(INCID, IVARID, SHUFFLE, DEFLATE, TPFILE%NNCCOMPRESS_LEVEL)
IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X5[NF90_DEF_VAR_DEFLATE]')
END IF
IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X5[NF90_DEF_VAR]')
CALL IO_WRITE_FIELD_ATTR_NC4(TPFIELD,INCID,IVARID)
ELSE
CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_X5',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_X5[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP)
KRESP = IRESP
END SUBROUTINE IO_WRITE_FIELD_NC4_X5
SUBROUTINE NCWRITX6(PZCDF, HVARNAME, HDIR, PFIELD, TPFMH, KRESP) SUBROUTINE NCWRITX6(PZCDF, HVARNAME, HDIR, PFIELD, TPFMH, KRESP)
USE MODD_FM, ONLY : FMHEADER USE MODD_FM, ONLY : FMHEADER
TYPE(IOCDF), POINTER :: PZCDF TYPE(IOCDF), POINTER :: PZCDF
......
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