diff --git a/src/LIB/SURCOUCHE/src/fmreadwrit.f90 b/src/LIB/SURCOUCHE/src/fmreadwrit.f90 index 8c8976f740f969c736367f2855d84426f3d4813f..559073125266aedff0a830ff751078db5f0e0899 100644 --- a/src/LIB/SURCOUCHE/src/fmreadwrit.f90 +++ b/src/LIB/SURCOUCHE/src/fmreadwrit.f90 @@ -263,7 +263,8 @@ IMPLICIT NONE PRIVATE ! INTERFACE IO_WRITE_FIELD_LFI - MODULE PROCEDURE IO_WRITE_FIELD_LFI_X2,IO_WRITE_FIELD_LFI_X3, & + MODULE PROCEDURE IO_WRITE_FIELD_LFI_X0, & + IO_WRITE_FIELD_LFI_X2,IO_WRITE_FIELD_LFI_X3, & IO_WRITE_FIELD_LFI_N0, & IO_WRITE_FIELD_LFI_C0 END INTERFACE IO_WRITE_FIELD_LFI @@ -272,6 +273,38 @@ PUBLIC IO_WRITE_FIELD_LFI ! CONTAINS ! +SUBROUTINE IO_WRITE_FIELD_LFI_X0(TPFIELD,KFLU,PFIELD,KRESP) +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments +! +TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +INTEGER, INTENT(IN) :: KFLU ! Fortran Logical Unit +REAL, 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 = 1 +! +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,TRIM(TPFIELD%CMNHNAME),IWORK,ITOTAL) +ENDIF +! +KRESP=IRESP +! +IF (ALLOCATED(IWORK)) DEALLOCATE(IWORK) +! +END SUBROUTINE IO_WRITE_FIELD_LFI_X0 +! SUBROUTINE IO_WRITE_FIELD_LFI_X2(TPFIELD,KFLU,PFIELD,KRESP,KVERTLEVEL) ! IMPLICIT NONE diff --git a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 index da8e13754df116692fb27a2c74d0b5a3ae926817..263f74c4e3a173374739a7100c23abbabf5ca42e 100644 --- a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 +++ b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 @@ -179,10 +179,12 @@ MODULE MODE_FMWRIT PRIVATE INTERFACE IO_WRITE_FIELD - MODULE PROCEDURE IO_WRITE_FIELD_BYNAME_X2, IO_WRITE_FIELD_BYNAME_X3, & + MODULE PROCEDURE IO_WRITE_FIELD_BYNAME_X0, & + IO_WRITE_FIELD_BYNAME_X2, IO_WRITE_FIELD_BYNAME_X3, & IO_WRITE_FIELD_BYNAME_N0, & IO_WRITE_FIELD_BYNAME_L0, & IO_WRITE_FIELD_BYNAME_C0, & + IO_WRITE_FIELD_BYFIELD_X0, & IO_WRITE_FIELD_BYFIELD_X2,IO_WRITE_FIELD_BYFIELD_X3, & IO_WRITE_FIELD_BYFIELD_N0, & IO_WRITE_FIELD_BYFIELD_L0, & @@ -332,6 +334,112 @@ CONTAINS KRESP = IRESP END SUBROUTINE FMWRITX0_ll + SUBROUTINE IO_WRITE_FIELD_BYNAME_X0(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, INTENT(IN) :: PFIELD ! array containing the data field + ! + !* 0.2 Declarations of local variables + ! + INTEGER :: ID ! Index of the field + ! + 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_X0 + + SUBROUTINE IO_WRITE_FIELD_BYFIELD_X0(TPFILE,TPFIELD,HFIPRI,KRESP,PFIELD) + USE MODD_IO_ll + USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL + USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_FIND_BYNAME + ! + IMPLICIT NONE + ! + !* 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,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 + ! + INTEGER :: IK_FILE,IK_RANK + CHARACTER(len=5) :: YK_FILE + CHARACTER(len=128) :: YFILE_IOZ + TYPE(FD_ll), POINTER :: TZFD_IOZ + TYPE(TFILEDATA),POINTER :: TZFILE + ! + YFILEM = TPFILE%CNAME + YRECFM = TPFIELD%CMNHNAME + YDIR = TPFIELD%CDIR + ! + ! + !* 1.1 THE NAME OF LFIFM + ! + IRESP = 0 + YFNLFI=TRIM(ADJUSTL(YFILEM))//'.lfi' + !------------------------------------------------------------------ + TZFD=>GETFD(YFNLFI) + IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + 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) + ELSE ! multiprocessor execution + IF (ISP == TZFD%OWNER) THEN + 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 + ! + 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" + TZFD_IOZ => GETFD(YFILE_IOZ) + IK_RANK = TZFD_IOZ%OWNER + IF ( ISP == IK_RANK ) THEN + IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFIELD,TZFD_IOZ%FLU,PFIELD,IRESP) + IF (LIOCDF4) THEN + CALL IO_FILE_FIND_BYNAME(TRIM(TPFILE%CNAME)//YK_FILE,TZFILE,IRESP) + IF (IRESP/=0) THEN + PRINT *,'FATAL: IO_WRITE_FIELD_BYFIELD_X0: file ',TRIM(TRIM(TPFILE%CNAME)//YK_FILE),' not found in list' + STOP + END IF + CALL IO_WRITE_FIELD_NC4(TZFILE,TPFIELD,TZFD_IOZ%CDF,PFIELD,IRESP) + END IF + END IF + END DO + ENDIF + ELSE + IRESP = -61 + END IF + !---------------------------------------------------------------- + IF (IRESP.NE.0) THEN + CALL FM_WRIT_ERR("IO_WRITE_FIELD_BYFIELD_X0",YFILEM,HFIPRI,YRECFM,YDIR,TPFIELD%NGRID,LEN(TPFIELD%CCOMMENT),IRESP) + END IF + KRESP = IRESP + END SUBROUTINE IO_WRITE_FIELD_BYFIELD_X0 + SUBROUTINE FMWRITX1_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& KLENCH,HCOMMENT,KRESP) USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT diff --git a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 b/src/LIB/SURCOUCHE/src/mode_netcdf.f90 index d38186aa84daecda17fbc92f34d358d610e5d2d0..72b21af17624dccd2d9528e627655d99a87931eb 100644 --- a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 +++ b/src/LIB/SURCOUCHE/src/mode_netcdf.f90 @@ -22,7 +22,8 @@ INTEGER(KIND=IDCDF_KIND),PARAMETER :: SHUFFLE = 1 !Set to 1 for (usually) better INTEGER(KIND=IDCDF_KIND),PARAMETER :: DEFLATE = 1 INTERFACE IO_WRITE_FIELD_NC4 - MODULE PROCEDURE IO_WRITE_FIELD_NC4_X2,IO_WRITE_FIELD_NC4_X3, & + MODULE PROCEDURE IO_WRITE_FIELD_NC4_X0, & + IO_WRITE_FIELD_NC4_X2,IO_WRITE_FIELD_NC4_X3, & IO_WRITE_FIELD_NC4_N0, & IO_WRITE_FIELD_NC4_C0 END INTERFACE IO_WRITE_FIELD_NC4 @@ -451,6 +452,49 @@ IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX0[NF90_PUT_VAR KRESP = IRESP END SUBROUTINE NCWRITX0 +SUBROUTINE IO_WRITE_FIELD_NC4_X0(TPFILE,TPFIELD,PZCDF,PFIELD,KRESP) +! +USE MODD_FM, ONLY : FMHEADER +USE MODD_PARAMETERS_ll, ONLY : JPVEXT +! +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +TYPE(IOCDF), POINTER :: PZCDF +REAL, INTENT(IN) :: PFIELD +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 :: IRESP +! +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 + ! Define the scalar variable + STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_DOUBLE, IVARID) + IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X0[NF90_DEF_VAR]') + CALL IO_WRITE_FIELD_ATTR_NC4(TPFIELD,INCID,IVARID) +ELSE + PRINT *,'IO_WRITE_FIELD_NC4_X0: ', 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_X0[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP) + +KRESP = IRESP +END SUBROUTINE IO_WRITE_FIELD_NC4_X0 + SUBROUTINE NCWRITX1(PZCDF, HVARNAME, HDIR, PFIELD, TPFMH, KRESP) USE MODD_FM, ONLY : FMHEADER TYPE(IOCDF), POINTER :: PZCDF