diff --git a/src/LIB/SURCOUCHE/src/fmreadwrit.f90 b/src/LIB/SURCOUCHE/src/fmreadwrit.f90 index e423bf89c443643fd1b8df0eb51abfabdabf6fd6..ac0992cf311a2087f0f924b9ee230a474e1b6cee 100644 --- a/src/LIB/SURCOUCHE/src/fmreadwrit.f90 +++ b/src/LIB/SURCOUCHE/src/fmreadwrit.f90 @@ -278,6 +278,7 @@ INTERFACE IO_WRITE_FIELD_LFI IO_WRITE_FIELD_LFI_X6, & IO_WRITE_FIELD_LFI_N0,IO_WRITE_FIELD_LFI_N1, & IO_WRITE_FIELD_LFI_N2,IO_WRITE_FIELD_LFI_N3, & + IO_WRITE_FIELD_LFI_L0,IO_WRITE_FIELD_LFI_L1, & IO_WRITE_FIELD_LFI_C0, & IO_WRITE_FIELD_LFI_T0 END INTERFACE IO_WRITE_FIELD_LFI @@ -724,6 +725,100 @@ IF (ALLOCATED(IWORK)) DEALLOCATE(IWORK) ! END SUBROUTINE IO_WRITE_FIELD_LFI_N3 ! +SUBROUTINE IO_WRITE_FIELD_LFI_L0(TPFIELD,KFLU,OFIELD,KRESP) +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments +! +TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +INTEGER, INTENT(IN) :: KFLU ! Fortran Logical Unit +LOGICAL, INTENT(IN) :: OFIELD ! array containing the data field +INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised +! +!* 0.2 Declarations of local variables +! +INTEGER :: IFIELD +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_L0','writing '//TRIM(TPFIELD%CMNHNAME)) +! +ILENG = 1 +! +!Convert LOGICAL to INTEGER (LOGICAL format not supported by LFI files) +IF (OFIELD) THEN + IFIELD = 1 +ELSE + IFIELD = 0 +END IF +! +CALL WRITE_PREPARE(TPFIELD,ILENG,IWORK,ITOTAL,IRESP) +! +IF (IRESP==0) THEN + IWORK(LEN_TRIM(TPFIELD%CCOMMENT)+3)=IFIELD + YRECFM=TRIM(TPFIELD%CMNHNAME) + IF( LEN_TRIM(TPFIELD%CMNHNAME) > LEN(YRECFM) ) & + CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_LFI_L0','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_L0 +! +SUBROUTINE IO_WRITE_FIELD_LFI_L1(TPFIELD,KFLU,OFIELD,KRESP) +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments +! +TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +INTEGER, INTENT(IN) :: KFLU ! Fortran Logical Unit +LOGICAL,DIMENSION(:), INTENT(IN) :: OFIELD ! array containing the data field +INTEGER, INTENT(OUT):: KRESP ! return-code if problems araised +! +!* 0.2 Declarations of local variables +! +INTEGER, DIMENSION(SIZE(OFIELD)) :: IFIELD +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_L1','writing '//TRIM(TPFIELD%CMNHNAME)) +! +ILENG = SIZE(OFIELD) +! +!Convert LOGICAL to INTEGER (LOGICAL format not supported by LFI files) +WHERE (OFIELD) + IFIELD = 1 +ELSEWHERE + IFIELD = 0 +END WHERE +! +CALL WRITE_PREPARE(TPFIELD,ILENG,IWORK,ITOTAL,IRESP) +! +IF (IRESP==0) THEN + IWORK(LEN_TRIM(TPFIELD%CCOMMENT)+3:) = IFIELD(:) + YRECFM=TRIM(TPFIELD%CMNHNAME) + IF( LEN_TRIM(TPFIELD%CMNHNAME) > LEN(YRECFM) ) & + CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_LFI_L1','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_L1 +! SUBROUTINE IO_WRITE_FIELD_LFI_C0(TPFIELD,KFLU,HFIELD,KRESP) ! IMPLICIT NONE diff --git a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 index e8ec742ef31312c486cb505cee4e216f7de1079e..81e95d60ace139656f5f3a5f59d1aa91b1edecb8 100644 --- a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 +++ b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 @@ -3298,6 +3298,9 @@ CONTAINS SUBROUTINE IO_WRITE_FIELD_BYFIELD_L0(TPFILE,TPFIELD,HFIPRI,KRESP,OFIELD) USE MODD_IO_ll + USE MODD_FM + USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL + USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_FIND_BYNAME !* 0. DECLARATIONS ! ------------ ! @@ -3312,21 +3315,67 @@ CONTAINS ! !* 0.2 Declarations of local variables ! - INTEGER :: IFIELD + INTEGER :: IERR + TYPE(FD_ll), POINTER :: TZFD + INTEGER :: IRESP + !JUANZIO + 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 ! CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_BYFIELD_L0','writing '//TRIM(TPFIELD%CMNHNAME)) ! ! - IF (OFIELD) THEN - IFIELD = 1 + IRESP = 0 + !------------------------------------------------------------------ + TZFD=>GETFD(TRIM(ADJUSTL(TPFILE%CNAME))//'.lfi') + IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFIELD,TZFD%FLU,OFIELD,IRESP) + IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,OFIELD,IRESP) + ELSE + IF (ISP == TZFD%OWNER) THEN + IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFIELD,TZFD%FLU,OFIELD,IRESP) + IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,OFIELD,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(TPFILE%CNAME)//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,OFIELD,IRESP) + IF (LIOCDF4) THEN + CALL IO_FILE_FIND_BYNAME(TRIM(TPFILE%CNAME)//YK_FILE,TZFILE,IRESP) + IF (IRESP/=0) THEN + CALL PRINT_MSG(NVERB_FATAL,'IO','IO_WRITE_FIELD_BYFIELD_L0','file '//TRIM(TRIM(TPFILE%CNAME)//YK_FILE)//& + ' not found in list') + END IF + CALL IO_WRITE_FIELD_NC4(TZFILE,TPFIELD,TZFD_IOZ%CDF,OFIELD,IRESP) + END IF + END IF + END DO + ENDIF ELSE - IFIELD = 0 + IRESP = -61 END IF - ! - CALL IO_WRITE_FIELD(TPFILE,TPFIELD,HFIPRI,KRESP,IFIELD) - ! + !---------------------------------------------------------------- + IF (IRESP.NE.0) THEN + CALL FM_WRIT_ERR("IO_WRITE_FIELD_BYFIELD_L0",TPFILE%CNAME,HFIPRI,TPFIELD%CMNHNAME,TPFIELD%CDIR,TPFIELD%NGRID,& + LEN(TPFIELD%CCOMMENT) ,IRESP) + END IF + KRESP = IRESP END SUBROUTINE IO_WRITE_FIELD_BYFIELD_L0 + + SUBROUTINE FMWRITL1_ll(HFILEM,HRECFM,HFIPRI,HDIR,OFIELD,KGRID,& KLENCH,HCOMMENT,KRESP) USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT @@ -3356,9 +3405,9 @@ CONTAINS TYPE(FD_ll), POINTER :: TZFD INTEGER :: IRESP TYPE(FMHEADER) :: TZFMH - ! CALL PRINT_MSG(NVERB_DEBUG,'IO','FMWRITL1_ll','writing '//TRIM(HRECFM)) + ! !---------------------------------------------------------------- ! !* 1.1 THE NAME OF LFIFM @@ -3402,59 +3451,109 @@ CONTAINS KRESP = IRESP END SUBROUTINE FMWRITL1_ll - SUBROUTINE IO_WRITE_FIELD_BYFIELD_L1(TPFILE,TPFIELD,HFIPRI,KRESP,OFIELD) - USE MODD_IO_ll - !* 0. DECLARATIONS - ! ------------ + SUBROUTINE IO_WRITE_FIELD_BYNAME_L1(TPFILE,HNAME,HFIPRI,KRESP,OFIELD) ! + USE MODD_IO_ll, ONLY : TFILEDATA ! !* 0.1 Declarations of arguments ! TYPE(TFILEDATA), INTENT(IN) :: TPFILE - TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD + 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 LOGICAL,DIMENSION(:), INTENT(IN) :: OFIELD ! array containing the data field ! !* 0.2 Declarations of local variables ! - INTEGER, DIMENSION(SIZE(OFIELD)) :: IFIELD + INTEGER :: ID ! Index of the field ! - CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_BYFIELD_L1','writing '//TRIM(TPFIELD%CMNHNAME)) + CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_BYNAME_L1','writing '//TRIM(HNAME)) ! - WHERE (OFIELD) - IFIELD = 1 - ELSEWHERE - IFIELD = 0 - END WHERE + CALL FIND_FIELD_ID_FROM_MNHNAME(HNAME,ID,KRESP) ! - CALL IO_WRITE_FIELD(TPFILE,TPFIELD,HFIPRI,KRESP,IFIELD) + IF(KRESP==0) CALL IO_WRITE_FIELD(TPFILE,TFIELDLIST(ID),HFIPRI,KRESP,OFIELD) ! - END SUBROUTINE IO_WRITE_FIELD_BYFIELD_L1 + END SUBROUTINE IO_WRITE_FIELD_BYNAME_L1 - SUBROUTINE IO_WRITE_FIELD_BYNAME_L1(TPFILE,HNAME,HFIPRI,KRESP,OFIELD) + SUBROUTINE IO_WRITE_FIELD_BYFIELD_L1(TPFILE,TPFIELD,HFIPRI,KRESP,OFIELD) ! - USE MODD_IO_ll, ONLY : TFILEDATA + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT,TFILEDATA + USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL + USE MODE_ALLOCBUFFER_ll + USE MODE_GATHER_ll + ! + IMPLICIT NONE ! !* 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 - LOGICAL,DIMENSION(:), INTENT(IN) :: OFIELD ! array containing the data field + 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 + LOGICAL,DIMENSION(:),TARGET, INTENT(IN) :: OFIELD ! array containing the data field ! !* 0.2 Declarations of local variables ! - INTEGER :: ID ! Index of the field + 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 + LOGICAL,DIMENSION(:),POINTER :: GFIELDP + LOGICAL :: GALLOC ! - CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_BYNAME_L1','writing '//TRIM(HNAME)) + YFILEM = TPFILE%CNAME + YRECFM = TPFIELD%CMNHNAME + YDIR = TPFIELD%CDIR ! - CALL FIND_FIELD_ID_FROM_MNHNAME(HNAME,ID,KRESP) + CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_BYFIELD_L1','writing '//TRIM(YRECFM)) ! - IF(KRESP==0) CALL IO_WRITE_FIELD(TPFILE,TFIELDLIST(ID),HFIPRI,KRESP,OFIELD) ! - END SUBROUTINE IO_WRITE_FIELD_BYNAME_L1 + !* 1.1 THE NAME OF LFIFM + ! + IRESP = 0 + GALLOC = .FALSE. + 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,OFIELD,IRESP) + IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,OFIELD,IRESP) + ELSE ! multiprocessor execution + IF (ISP == TZFD%OWNER) THEN + CALL ALLOCBUFFER_ll(GFIELDP,OFIELD,YDIR,GALLOC) + ELSE + ALLOCATE(GFIELDP(0)) + GALLOC = .TRUE. + END IF + ! + IF (YDIR == 'XX' .OR. YDIR =='YY') THEN + CALL GATHER_XXFIELD(YDIR,OFIELD,GFIELDP,TZFD%OWNER,TZFD%COMM) + END IF + ! + IF (ISP == TZFD%OWNER) THEN + IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFIELD,TZFD%FLU,GFIELDP,IRESP) + IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,GFIELDP,IRESP) + END IF + ! + CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) + END IF + ELSE + IRESP = -61 + END IF + !---------------------------------------------------------------- + IF (IRESP.NE.0) THEN + CALL FM_WRIT_ERR("IO_WRITE_FIELD_BYFIELD_L1",YFILEM,HFIPRI,YRECFM,YDIR,TPFIELD%NGRID,LEN(TPFIELD%CCOMMENT),IRESP) + END IF + IF (GALLOC) DEALLOCATE(GFIELDP) + KRESP = IRESP + IF (ASSOCIATED(TZFD)) CALL MPI_BARRIER(TZFD%COMM,IERR) + ! + END SUBROUTINE IO_WRITE_FIELD_BYFIELD_L1 + SUBROUTINE FMWRITC0_ll(HFILEM,HRECFM,HFIPRI,HDIR,HFIELD,KGRID,& KLENCH,HCOMMENT,KRESP) diff --git a/src/LIB/SURCOUCHE/src/mode_allocbuff.f90 b/src/LIB/SURCOUCHE/src/mode_allocbuff.f90 index 0268af27c3136ca2b0e7de2c161fd580a0abf16e..995ecc320e4667503a6865a179462a3a3119d5d0 100644 --- a/src/LIB/SURCOUCHE/src/mode_allocbuff.f90 +++ b/src/LIB/SURCOUCHE/src/mode_allocbuff.f90 @@ -23,7 +23,8 @@ PRIVATE INTERFACE ALLOCBUFFER_ll MODULE PROCEDURE ALLOCBUFFER_X1,ALLOCBUFFER_X2,ALLOCBUFFER_X3,& & ALLOCBUFFER_X4,ALLOCBUFFER_X5,ALLOCBUFFER_X6,& - & ALLOCBUFFER_N1,ALLOCBUFFER_N2,ALLOCBUFFER_N3 + & ALLOCBUFFER_N1,ALLOCBUFFER_N2,ALLOCBUFFER_N3,& + & ALLOCBUFFER_L1 END INTERFACE PUBLIC ALLOCBUFFER_ll @@ -122,6 +123,30 @@ CASE default END SELECT END SUBROUTINE ALLOCBUFFER_N3 +SUBROUTINE ALLOCBUFFER_L1(LTAB_P,LTAB,HDIR,OALLOC) +! +LOGICAL,DIMENSION(:),POINTER :: LTAB_P +LOGICAL,DIMENSION(:),TARGET,INTENT(IN) :: LTAB +CHARACTER(LEN=*), INTENT(IN) :: HDIR +LOGICAL, INTENT(OUT):: OALLOC + +INTEGER :: IIMAX,IJMAX + +SELECT CASE(HDIR) +CASE('XX') + CALL GET_GLOBALDIMS_ll(IIMAX,IJMAX) + ALLOCATE(LTAB_P(IIMAX+2*JPHEXT)) + OALLOC = .TRUE. +CASE('YY') + CALL GET_GLOBALDIMS_ll(IIMAX,IJMAX) + ALLOCATE(LTAB_P(IJMAX+2*JPHEXT)) + OALLOC = .TRUE. +CASE default + LTAB_P=>LTAB + OALLOC = .FALSE. +END SELECT +END SUBROUTINE ALLOCBUFFER_L1 + SUBROUTINE ALLOCBUFFER_X1(PTAB_P,PTAB,HDIR,OALLOC, KIMAX_ll, KJMAX_ll) ! REAL,DIMENSION(:),POINTER :: PTAB_P diff --git a/src/LIB/SURCOUCHE/src/mode_gather.f90 b/src/LIB/SURCOUCHE/src/mode_gather.f90 index 9be905a4c873bb6206afccbf13db322ae65a96ea..e8afb0c5c0b7aaa67d63112153eb83a8895d7b2d 100644 --- a/src/LIB/SURCOUCHE/src/mode_gather.f90 +++ b/src/LIB/SURCOUCHE/src/mode_gather.f90 @@ -44,7 +44,7 @@ END INTERFACE INTERFACE GATHER_XXFIELD MODULE PROCEDURE GATHERXX_X1,GATHERXX_X2,GATHERXX_X3,GATHERXX_X4,GATHERXX_X5,& - & GATHERXX_X6,GATHERXX_N1,GATHERXX_N2,GATHERXX_N3 + & GATHERXX_X6,GATHERXX_N1,GATHERXX_N2,GATHERXX_N3,GATHERXX_L1 END INTERFACE INTERFACE GATHER_XYFIELD @@ -768,6 +768,70 @@ END IF END SUBROUTINE GATHERXX_N3 +SUBROUTINE GATHERXX_L1(HDIR,OSEND,ORECV,KROOT,KCOMM) +USE MODD_IO_ll, ONLY : ISP, ISNPROC + +CHARACTER(LEN=*), INTENT(IN) :: HDIR +LOGICAL,DIMENSION(:),TARGET,INTENT(IN) :: OSEND +LOGICAL,DIMENSION(:),TARGET,INTENT(INOUT) :: ORECV +INTEGER, INTENT(IN) :: KROOT +INTEGER, INTENT(IN) :: KCOMM + +!INCLUDE 'mpif.h' + +INTEGER :: JI +INTEGER :: IXO,IXE,IYO,IYE +INTEGER :: IGXO,IGXE,IGYO,IGYE +LOGICAL, DIMENSION(:), POINTER :: GTP +INTEGER :: IERR +INTEGER :: IXM, IYM +!INTEGER, DIMENSION(MPI_STATUS_SIZE):: STATUS + +CALL GET_DOMWRITE_ll(KROOT,'global',IGXO,IGXE,IGYO,IGYE) + +IXM = (IGXE+IGXO)/2 +IYM = (IGYE+IGYO)/2 + +IF (ISP == KROOT) THEN + ! I/O proc case + DO JI=1,ISNPROC + CALL GET_DOMWRITE_ll(JI,'global',IGXO,IGXE,IGYO,IGYE) + CALL GET_DOMWRITE_ll(JI,'local',IXO,IXE,IYO,IYE) + + IF (HDIR == 'XX' .AND. IYM <= IGYE .AND. IYM >= IGYO) THEN + GTP=>ORECV(IGXO:IGXE) + IF (JI == KROOT) THEN + GTP = OSEND(IXO:IXE) + ELSE + CALL MPI_RECV(GTP,SIZE(GTP),MPI_LOGICAL,JI-1,99+KROOT,KCOMM,MPI_STATUS_IGNORE,IERR) + END IF + + ELSE IF (HDIR == 'YY' .AND. IXM <= IGXE .AND. IXM >= IGXO) THEN + GTP=>ORECV(IGYO:IGYE) + IF (JI==KROOT) THEN + GTP = OSEND(IYO:IYE) + ELSE + CALL MPI_RECV(GTP,SIZE(GTP),MPI_LOGICAL,JI-1,99+KROOT,KCOMM,MPI_STATUS_IGNORE,IERR) + END IF + END IF + END DO + +ELSE + ! Other processors + CALL GET_DOMWRITE_ll(ISP,'global',IGXO,IGXE,IGYO,IGYE) + CALL GET_DOMWRITE_ll(ISP,'local',IXO,IXE,IYO,IYE) + + IF (HDIR == 'XX' .AND. IYM <= IGYE .AND. IYM >= IGYO) THEN + GTP=>OSEND(IXO:IXE) + CALL MPI_BSEND(GTP,SIZE(GTP),MPI_LOGICAL,KROOT-1,99+KROOT,KCOMM,IERR) + ELSE IF (HDIR == 'YY' .AND. IXM <= IGXE .AND. IXM >= IGXO) THEN + GTP=>OSEND(IYO:IYE) + CALL MPI_BSEND(GTP,SIZE(GTP),MPI_LOGICAL,KROOT-1,99+KROOT,KCOMM,IERR) + END IF +END IF + +END SUBROUTINE GATHERXX_L1 + ! ! Gather des champs XY ! diff --git a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 b/src/LIB/SURCOUCHE/src/mode_netcdf.f90 index 8e327759721b03048c82b5b5e20f7c3472d99609..33cfd1c96b5229859a79fbfd5e7cadbcf9b9cc93 100644 --- a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 +++ b/src/LIB/SURCOUCHE/src/mode_netcdf.f90 @@ -28,6 +28,7 @@ INTERFACE IO_WRITE_FIELD_NC4 IO_WRITE_FIELD_NC4_X4,IO_WRITE_FIELD_NC4_X5, & IO_WRITE_FIELD_NC4_X6, & IO_WRITE_FIELD_NC4_N0,IO_WRITE_FIELD_NC4_N1, & + IO_WRITE_FIELD_NC4_L0,IO_WRITE_FIELD_NC4_L1, & IO_WRITE_FIELD_NC4_N2,IO_WRITE_FIELD_NC4_N3, & IO_WRITE_FIELD_NC4_C0,IO_WRITE_FIELD_NC4_C1, & IO_WRITE_FIELD_NC4_T0 @@ -1570,6 +1571,117 @@ IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_N3 KRESP = IRESP END SUBROUTINE IO_WRITE_FIELD_NC4_N3 +SUBROUTINE IO_WRITE_FIELD_NC4_L0(TPFILE,TPFIELD,PZCDF,OFIELD,KRESP) +! +USE MODD_PARAMETERS_ll, ONLY : JPVEXT +! +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +TYPE(IOCDF), POINTER :: PZCDF +LOGICAL, INTENT(IN) :: OFIELD +INTEGER, INTENT(OUT):: KRESP +! +INTEGER :: IFIELD +INTEGER(KIND=IDCDF_KIND) :: STATUS +INTEGER(KIND=IDCDF_KIND) :: INCID +CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)) :: YVARNAME +INTEGER(KIND=IDCDF_KIND) :: IVARID +INTEGER :: IRESP +! +CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_NC4_L0','writing '//TRIM(TPFIELD%CMNHNAME)) +! +IRESP = 0 +! Get the Netcdf file ID +INCID = TPFILE%NNCID + +CALL CLEANMNHNAME(TPFIELD%CMNHNAME,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 + ! Use of NF90_INT1 datatype (=NF90_BYTE) that is enough to store a boolean + STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_INT1, IVARID) + IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_L0[NF90_DEF_VAR]') + CALL IO_WRITE_FIELD_ATTR_NC4(TPFIELD,INCID,IVARID) +ELSE + CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_L0',TRIM(YVARNAME)//' already defined') +END IF + +!Convert LOGICAL to INTEGER (LOGICAL format not supported by netCDF files) +IF (OFIELD) THEN + IFIELD = 1 +ELSE + IFIELD = 0 +END IF + +! Write the data +STATUS = NF90_PUT_VAR(INCID, IVARID, IFIELD) +IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_L0[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP) + +KRESP = IRESP +END SUBROUTINE IO_WRITE_FIELD_NC4_L0 + +SUBROUTINE IO_WRITE_FIELD_NC4_L1(TPFILE,TPFIELD,PZCDF,OFIELD,KRESP) +! +USE MODD_PARAMETERS_ll, ONLY : JPVEXT +! +TYPE(TFILEDATA), INTENT(IN) :: TPFILE +TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD +TYPE(IOCDF), POINTER :: PZCDF +LOGICAL, DIMENSION(:), INTENT(IN) :: OFIELD +INTEGER, INTENT(OUT):: KRESP +! +INTEGER, DIMENSION(SIZE(OFIELD)) :: IFIELD +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(OFIELD))) :: IVDIMS +INTEGER :: IRESP +! +CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_NC4_L1','writing '//TRIM(TPFIELD%CMNHNAME)) +! +IRESP = 0 +! Get the Netcdf file ID +INCID = TPFILE%NNCID + +CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME) + +! The variable should not already exist but who knows ? +STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID) +IF (STATUS /= NF90_NOERR) THEN + IF (SIZE(OFIELD)==0) THEN + CALL PRINT_MSG(NVERB_INFO,'IO','IO_WRITE_FIELD_NC4_L1','ignoring variable with a zero size ('//TRIM(YVARNAME)//')') + RETURN + END IF + + ! Get the netcdf dimensions + CALL FILLVDIMS(PZCDF, INT(SHAPE(OFIELD),KIND=IDCDF_KIND), TPFIELD%CDIR, IVDIMS) + + ! Define the variable + ! Use of NF90_INT1 datatype (=NF90_BYTE) that is enough to store a boolean + STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_INT1, IVDIMS, IVARID) + IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_L1[NF90_DEF_VAR]') + CALL IO_WRITE_FIELD_ATTR_NC4(TPFIELD,INCID,IVARID) +ELSE + CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_L1',TRIM(YVARNAME)//' already defined') +END IF + +!Convert LOGICAL to INTEGER (LOGICAL format not supported by netCDF files) +WHERE (OFIELD) + IFIELD = 1 +ELSEWHERE + IFIELD = 0 +END WHERE + +! Write the data +STATUS = NF90_PUT_VAR(INCID, IVARID, IFIELD) +IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_L1[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP) + +KRESP = IRESP +END SUBROUTINE IO_WRITE_FIELD_NC4_L1 + SUBROUTINE NCWRITC0(PZCDF, HVARNAME, HDIR, HFIELD, TPFMH, KRESP) USE MODD_FM, ONLY : FMHEADER TYPE(IOCDF), POINTER :: PZCDF