diff --git a/src/LIB/SURCOUCHE/src/fmread_ll.f90 b/src/LIB/SURCOUCHE/src/fmread_ll.f90 index b4edb578eb3051f90ed0ac17b7bdffc2ab8e9fca..e980fb9dbdd89bca6c401bd01a533ac73ea8a1e9 100644 --- a/src/LIB/SURCOUCHE/src/fmread_ll.f90 +++ b/src/LIB/SURCOUCHE/src/fmread_ll.f90 @@ -1,2035 +1,2046 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -!--------------- special set of characters for CVS information -!----------------------------------------------------------------- -! $Source$ -! $Name$ -! $Revision$ -! $Date$ -!----------------------------------------------------------------- -!----------------------------------------------------------------- - -#ifdef MNH_MPI_DOUBLE_PRECISION -#define MPI_FLOAT MPI_DOUBLE_PRECISION -#else -#define MPI_FLOAT MPI_REAL -#endif - -MODULE MODE_FMREAD -! -!Correction : -! J.Escobar : 22/08/2005 : BUG : manque un "GOTO 1000" si champs -! lue non trouvé !!! -! J.Escobar : 13/01/2015 : remove comment on BCAST(IRESP in FMREADX2_ll -! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -! D.Gazen : avril 2016 bug dimensions 2D cases in netcdf -! -USE MODD_MPIF -#if defined(MNH_IOCDF4) -USE MODE_NETCDF -#endif -IMPLICIT NONE - -PRIVATE - -INTERFACE FMREAD - MODULE PROCEDURE FMREADX0_ll,FMREADX1_ll,FMREADX2_ll,FMREADX3_ll,& - & FMREADX4_ll,FMREADX5_ll,FMREADX6_ll,& - & FMREADN0_ll,FMREADN1_ll,FMREADN2_ll,& - & FMREADL0_ll,FMREADL1_ll,FMREADC0_ll,FMREADT0_ll -END INTERFACE -! - -PUBLIC FMREAD_LB,FMREAD,FMREADX0_ll,FMREADX1_ll,FMREADX2_ll,FMREADX3_ll,& - & FMREADX4_ll,FMREADX5_ll,FMREADX6_ll,& - & FMREADN0_ll,FMREADN1_ll,FMREADN2_ll,& - & FMREADL0_ll,FMREADL1_ll,FMREADC0_ll,FMREADT0_ll - -!INCLUDE 'mpif.h' - -CONTAINS -SUBROUTINE FM_READ_ERR(HFUNC,HFILEM,HFIPRI,HRECFM,HDIR,KRESP) -USE MODE_FM, ONLY : FMLOOK_ll - -CHARACTER(LEN=*) :: HFUNC -CHARACTER(LEN=*) :: HFILEM -CHARACTER(LEN=*) :: HFIPRI -CHARACTER(LEN=*) :: HRECFM -CHARACTER(LEN=*) :: HDIR -INTEGER :: KRESP - -INTEGER :: ILUPRI -INTEGER :: IRESP - -CALL FMLOOK_ll(HFIPRI,HFIPRI,ILUPRI,IRESP) -WRITE (ILUPRI,*) ' exit from ',HFUNC, ' with RESP:',KRESP -!STOP "fmread_ll.f90:: FM_READ_ERR" - -WRITE (ILUPRI,*) ' | HFILEM = ',HFILEM -WRITE (ILUPRI,*) ' | HRECFM = ',HRECFM -WRITE (ILUPRI,*) ' | HDIR = ',HDIR - -END SUBROUTINE FM_READ_ERR - - -SUBROUTINE BCAST_HEADER(TPFD,TPFMH) -USE MODE_FD_ll, ONLY : FD_ll -USE MODD_FM -TYPE(FD_ll), POINTER :: TPFD -TYPE(FMHEADER), INTENT(IN) :: TPFMH - -INTEGER :: ierr - -CALL MPI_BCAST(TPFMH%GRID,1,MPI_INTEGER,TPFD%OWNER-1,TPFD%COMM,IERR) -CALL MPI_BCAST(TPFMH%COMLEN,1,MPI_INTEGER,TPFD%OWNER-1,TPFD%COMM,IERR) -CALL MPI_BCAST(TPFMH%COMMENT,TPFMH%COMLEN,MPI_CHARACTER,TPFD%OWNER-1,TPFD%COMM,IERR) - -END SUBROUTINE BCAST_HEADER - -SUBROUTINE FMREADX0_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& - KLENCH,HCOMMENT,KRESP) -USE MODD_IO_ll, ONLY : ISP,GSMONOPROC -USE MODD_FM -USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL -! -!* 0. DECLARATIONS -! ------------ -! -! -!* 0.1 Declarations of arguments -! -CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name -CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read -CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages -CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form -REAL, INTENT(INOUT)::PFIELD ! array containing the data field -INTEGER, INTENT(INOUT)::KGRID ! C-grid indicator (u,v,w,T) -INTEGER, INTENT(INOUT)::KLENCH ! length of comment string -CHARACTER(LEN=*), INTENT(INOUT)::HCOMMENT ! comment string -INTEGER, INTENT(INOUT)::KRESP ! return-code -! -!* 0.2 Declarations of local variables -! -!---------------------------------------------------------------- -CHARACTER(LEN=JPFINL) :: YFNLFI -INTEGER :: IERR -TYPE(FD_ll), POINTER :: TZFD -INTEGER :: IRESP -TYPE(FMHEADER) :: TZFMH -! -!* 1.1 THE NAME OF LFIFM -! -IRESP = 0 -YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' -!------------------------------------------------------------------ -TZFD=>GETFD(YFNLFI) -IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC) THEN ! sequential execution - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,PFIELD,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP) - END IF - IF (IRESP /= 0) GOTO 1000 - ELSE ! multiprocessor execution - IF (ISP == TZFD%OWNER) THEN - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,PFIELD,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP) - END IF - END IF - ! - CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) - IF (IRESP /= 0) GOTO 1000 - ! - CALL BCAST_HEADER(TZFD,TZFMH) - ! - CALL MPI_BCAST(PFIELD,1,MPI_FLOAT,TZFD%OWNER-1,TZFD%COMM,IERR) - END IF - KGRID = TZFMH%GRID - KLENCH = TZFMH%COMLEN - HCOMMENT = TZFMH%COMMENT(1:TZFMH%COMLEN) -ELSE - IRESP = -61 -END IF -!---------------------------------------------------------------- -1000 CONTINUE -!! Error handler -IF (IRESP.NE.0) THEN - CALL FM_READ_ERR("FMREADX0_ll",HFILEM,HFIPRI,HRECFM,HDIR,IRESP) -ENDIF -KRESP = IRESP -RETURN - -END SUBROUTINE FMREADX0_ll - -SUBROUTINE FMREADX1_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& - KLENCH,HCOMMENT,KRESP, KIMAX_ll, KJMAX_ll, TPSPLITTING) -USE MODD_IO_ll, ONLY : ISP,GSMONOPROC, ISNPROC -USE MODD_FM -USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL -USE MODE_SCATTER_ll -USE MODE_ALLOCBUFFER_ll -USE MODD_STRUCTURE_ll, ONLY : ZONE_ll -! -!* 0. DECLARATIONS -! ------------ -! -! -!* 0.1 Declarations of arguments -! -CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name -CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read -CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages -CHARACTER(LEN=*), INTENT(IN) ::HDIR ! Field form -REAL,DIMENSION(:),TARGET,INTENT(INOUT)::PFIELD ! array containing the data field -INTEGER, INTENT(INOUT)::KGRID ! C-grid indicator (u,v,w,T) -INTEGER, INTENT(INOUT)::KLENCH ! length of comment string -CHARACTER(LEN=*), INTENT(INOUT)::HCOMMENT ! comment string -INTEGER, INTENT(INOUT)::KRESP ! return-code -INTEGER, OPTIONAL, INTENT(IN) ::KIMAX_ll -INTEGER, OPTIONAL, INTENT(IN) ::KJMAX_ll -TYPE(ZONE_ll), DIMENSION(ISNPROC), OPTIONAL :: TPSPLITTING ! splitting of the domain -! -!* 0.2 Declarations of local variables -! -!---------------------------------------------------------------- -CHARACTER(LEN=JPFINL) :: YFNLFI -INTEGER :: IERR -TYPE(FD_ll), POINTER :: TZFD -INTEGER :: IRESP -REAL,DIMENSION(:),POINTER :: ZFIELDP -LOGICAL :: GALLOC -TYPE(FMHEADER) :: TZFMH -! -!* 1.1 THE NAME OF LFIFM -! -GALLOC = .FALSE. -IRESP = 0 -YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' -!------------------------------------------------------------------ -TZFD=>GETFD(YFNLFI) -IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC) THEN ! sequential execution - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,PFIELD,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) - END IF - IF (IRESP /= 0) GOTO 1000 - ELSE ! multiprocessor execution - IF (ISP == TZFD%OWNER) THEN - IF( PRESENT(KIMAX_ll) .AND. PRESENT(KJMAX_ll) ) THEN - CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC, KIMAX_ll, KJMAX_ll) - ELSE - CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC) - ENDIF - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& - & ,IRESP) - END IF - ELSE - ALLOCATE(ZFIELDP(0)) - GALLOC = .TRUE. - END IF - - ! - CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) - IF (IRESP /= 0) GOTO 1000 - ! - CALL BCAST_HEADER(TZFD,TZFMH) - ! - IF (HDIR /= 'XX' .AND. HDIR /='YY') THEN - ! Broadcast Field - CALL MPI_BCAST(PFIELD,SIZE(PFIELD),MPI_FLOAT,TZFD%OWNER-1,TZFD%COMM,IERR) - ELSE - !Scatter Field - IF( PRESENT(TPSPLITTING) ) THEN - CALL SCATTER_XXFIELD(HDIR,ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM,TPSPLITTING) - ELSE - CALL SCATTER_XXFIELD(HDIR,ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM) - ENDIF - END IF - END IF !(GSMONOPROC) - - KGRID = TZFMH%GRID - KLENCH = TZFMH%COMLEN - HCOMMENT = TZFMH%COMMENT(1:TZFMH%COMLEN) -ELSE - IRESP = -61 -END IF -!---------------------------------------------------------------- -1000 CONTINUE -!! Error handler -IF (IRESP.NE.0) THEN - CALL FM_READ_ERR("FMREADX1_ll",HFILEM,HFIPRI,HRECFM,HDIR,IRESP) -ENDIF - -IF (GALLOC) DEALLOCATE (ZFIELDP) -KRESP = IRESP -RETURN -!------------------------------------------------------------------ -END SUBROUTINE FMREADX1_ll - -SUBROUTINE FMREADX2_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& - KLENCH,HCOMMENT,KRESP, KIMAX_ll, KJMAX_ll, TPSPLITTING) -USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LPACK,L1D,L2D , ISNPROC -USE MODD_PARAMETERS_ll,ONLY : JPHEXT -USE MODD_FM -USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL -USE MODE_SCATTER_ll -USE MODE_ALLOCBUFFER_ll -!JUANZ -USE MODD_TIMEZ, ONLY : TIMEZ -USE MODE_MNH_TIMING, ONLY : SECOND_MNH2 -!JUANZ -USE MODD_STRUCTURE_ll, ONLY : ZONE_ll -#ifdef MNH_GA - USE MODE_GA -#endif - -IMPLICIT NONE - -CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name -CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read -CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages -CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form -REAL,DIMENSION(:,:),TARGET, INTENT(INOUT)::PFIELD ! array containing the data field -INTEGER, INTENT(INOUT)::KGRID ! C-grid indicator (u,v,w,T) -INTEGER, INTENT(INOUT)::KLENCH ! length of comment string -CHARACTER(LEN=*), INTENT(INOUT)::HCOMMENT ! comment string -INTEGER, INTENT(INOUT)::KRESP ! return-code -INTEGER, OPTIONAL, INTENT(IN) ::KIMAX_ll -INTEGER, OPTIONAL, INTENT(IN) ::KJMAX_ll -TYPE(ZONE_ll), DIMENSION(ISNPROC), OPTIONAL :: TPSPLITTING ! splitting of the domain -! -! -!* 0.2 Declarations of local variables -! -CHARACTER(LEN=JPFINL) :: YFNLFI -INTEGER :: IERR -TYPE(FD_ll), POINTER :: TZFD -INTEGER :: IRESP -REAL,DIMENSION(:,:), POINTER :: ZFIELDP -LOGICAL :: GALLOC -TYPE(FMHEADER) :: TZFMH -!JUANZ -REAL*8,DIMENSION(2) :: T0,T1,T2 -REAL*8,DIMENSION(2) :: T11,T22 -!JUANZ -#ifdef MNH_GA -REAL,DIMENSION(:,:),POINTER :: ZFIELD_GA -#endif -! -!* 1.1 THE NAME OF LFIFM -! -CALL SECOND_MNH2(T11) -GALLOC = .FALSE. -IRESP = 0 -YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' - -!------------------------------------------------------------------ - -TZFD=>GETFD(YFNLFI) -IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC) THEN ! sequential execution -! IF (LPACK .AND. L1D .AND. HDIR=='XY') THEN - IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==2*JPHEXT+1 .AND. SIZE(PFIELD,2)==2*JPHEXT+1) THEN - ZFIELDP=>PFIELD(2:2,2:2) - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - END IF - PFIELD(:,:)=SPREAD(SPREAD(PFIELD(2,2),DIM=1,NCOPIES=3),DIM=2,NCOPIES=3) -! ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN - ELSE IF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==2*JPHEXT+1) THEN - ZFIELDP=>PFIELD(:,2:2) - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - END IF - PFIELD(:,:)=SPREAD(PFIELD(:,2),DIM=2,NCOPIES=3) - ELSE - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,PFIELD,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) - END IF - END IF - IF (IRESP /= 0) GOTO 1000 - ELSE ! multiprocessor execution - CALL SECOND_MNH2(T0) - IF (ISP == TZFD%OWNER) THEN - ! I/O processor case - IF( PRESENT(KIMAX_ll) .AND. PRESENT(KJMAX_ll) ) THEN - CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC, KIMAX_ll, KJMAX_ll) - ELSE - CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC) - ENDIF - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& - & ,IRESP) - END IF - ELSE - ALLOCATE(ZFIELDP(0,0)) - GALLOC = .TRUE. - END IF - CALL SECOND_MNH2(T1) - TIMEZ%T_READ2D_READ=TIMEZ%T_READ2D_READ + T1 - T0 - ! - CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) - IF (IRESP /= 0) GOTO 1000 - ! - CALL BCAST_HEADER(TZFD,TZFMH) - ! - IF (HDIR == 'XX' .OR. HDIR =='YY') THEN - ! XX or YY Scatter Field - IF( PRESENT(TPSPLITTING) ) THEN - CALL SCATTER_XXFIELD(HDIR,ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM,TPSPLITTING) - ELSE - CALL SCATTER_XXFIELD(HDIR,ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM) - ENDIF - ELSE IF (HDIR == 'XY') THEN - IF (LPACK .AND. L2D) THEN - ! 2D compact case - IF( PRESENT(TPSPLITTING) ) THEN - CALL SCATTER_XXFIELD('XX',ZFIELDP(:,1),PFIELD(:,2),TZFD%OWNER,TZFD%COMM,TPSPLITTING) - ELSE - CALL SCATTER_XXFIELD('XX',ZFIELDP(:,1),PFIELD(:,2),TZFD%OWNER,TZFD%COMM) - ENDIF - PFIELD(:,:) = SPREAD(PFIELD(:,2),DIM=2,NCOPIES=3) - ELSE -#ifdef MNH_GA - ! - ! init/create the ga , dim3 = 1 - ! - CALL MNH_INIT_GA(SIZE(PFIELD,1),SIZE(PFIELD,2),1,HRECFM,"READ") - IF (ISP == TZFD%OWNER) THEN - ! - ! put the data in the g_a , this proc get this 1 slide - ! - lo_zplan(JPIZ) = 1 - hi_zplan(JPIZ) = 1 - call nga_put(g_a, lo_zplan, hi_zplan,ZFIELDP, ld_zplan) - END IF - call ga_sync - ! - ! get the columun data in this proc - ! - ! temp buf to avoid problem with none stride PFIELDS buffer with HALO - ALLOCATE (ZFIELD_GA (SIZE(PFIELD,1),SIZE(PFIELD,2))) - call nga_get(g_a, lo_col, hi_col,ZFIELD_GA(1,1) , ld_col) - PFIELD = ZFIELD_GA - DEALLOCATE(ZFIELD_GA) -#else - ! XY Scatter Field - CALL SCATTER_XYFIELD(ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM) -#endif - END IF - ELSE - CALL MPI_BCAST(PFIELD,SIZE(PFIELD),MPI_FLOAT,TZFD%OWNER-1,TZFD%COMM,IERR) - END IF - CALL SECOND_MNH2(T2) - TIMEZ%T_READ2D_SCAT=TIMEZ%T_READ2D_SCAT + T2 - T1 - END IF !(GSMONOPROC) - - KGRID = TZFMH%GRID - KLENCH = TZFMH%COMLEN - HCOMMENT = TZFMH%COMMENT(1:TZFMH%COMLEN) -ELSE - IRESP = -61 -END IF -!---------------------------------------------------------------- -1000 CONTINUE -!! Error handler -IF (IRESP.NE.0) THEN - CALL FM_READ_ERR("FMREADX2_ll",HFILEM,HFIPRI,HRECFM,HDIR,IRESP) -ENDIF -IF (GALLOC) DEALLOCATE (ZFIELDP) -KRESP = IRESP -!------------------------------------------------------------------ - -CALL SECOND_MNH2(T22) -TIMEZ%T_READ2D_ALL=TIMEZ%T_READ2D_ALL + T22 - T11 - -END SUBROUTINE FMREADX2_ll - -SUBROUTINE FMREADX3_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& - KLENCH,HCOMMENT,KRESP) -USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LPACK,L1D,L2D -USE MODD_PARAMETERS_ll,ONLY : JPHEXT -USE MODD_FM -USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL -USE MODE_SCATTER_ll -USE MODE_ALLOCBUFFER_ll -!JUANZ -USE MODD_IO_ll, ONLY : ISNPROC -USE MODE_IO_ll, ONLY : io_file,io_rank -USE MODD_TIMEZ, ONLY : TIMEZ -USE MODE_MNH_TIMING, ONLY : SECOND_MNH2 -!JUANZ -#ifdef MNH_GA - USE MODE_GA -#endif -USE MODD_VAR_ll, ONLY : MNH_STATUSES_IGNORE - -IMPLICIT NONE - -CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name -CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read -CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages -CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form -REAL, DIMENSION(:,:,:),TARGET,INTENT(INOUT)::PFIELD ! array containing the data field -INTEGER, INTENT(INOUT)::KGRID ! C-grid indicator (u,v,w,T) -INTEGER, INTENT(INOUT)::KLENCH ! length of comment string -CHARACTER(LEN=*), INTENT(INOUT)::HCOMMENT ! comment string -INTEGER, INTENT(INOUT)::KRESP ! return-code -! -#ifdef MNH_GA -REAL,DIMENSION(:,:,:),POINTER :: ZFIELD_GA -#endif -! -! -!* 0.2 Declarations of local variables -! -CHARACTER(LEN=JPFINL) :: YFNLFI -INTEGER :: IERR -TYPE(FD_ll), POINTER :: TZFD -INTEGER :: IRESP -REAL,DIMENSION(:,:,:),POINTER :: ZFIELDP -LOGICAL :: GALLOC -TYPE(FMHEADER) :: TZFMH -!JUAN -INTEGER :: JK,JKK -CHARACTER(LEN=LEN(HRECFM)) :: YK,YRECZSLIDE -REAL,DIMENSION(:,:),POINTER :: ZSLIDE_ll,ZSLIDE -INTEGER :: IK_FILE,IK_rank,inb_proc_real,JK_MAX -CHARACTER(len=5) :: YK_FILE -CHARACTER(len=128) :: YFILE_IOZ -TYPE(FD_ll), POINTER :: TZFD_IOZ -INTEGER :: JI,IXO,IXE,IYO,IYE -REAL,DIMENSION(:,:),POINTER :: TX2DP -INTEGER, DIMENSION(MPI_STATUS_SIZE) :: STATUS -LOGICAL :: GALLOC_ll - -INTEGER,ALLOCATABLE,DIMENSION(:) :: REQ_TAB -INTEGER :: NB_REQ -TYPE TX_2DP - REAL,DIMENSION(:,:), POINTER :: X -END TYPE TX_2DP -TYPE(TX_2DP),ALLOCATABLE,DIMENSION(:) :: T_TX2DP -REAL*8,DIMENSION(2) :: T0,T1,T2 -REAL*8,DIMENSION(2) :: T11,T22 -!JUAN -! -!* 1.1 THE NAME OF LFIFM -! -CALL SECOND_MNH2(T11) -GALLOC = .FALSE. -GALLOC_ll = .FALSE. -IRESP = 0 -YFNLFI = TRIM(ADJUSTL(HFILEM))//'.lfi' -!------------------------------------------------------------------ -TZFD=>GETFD(YFNLFI) -IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC .AND. (TZFD%nb_procio.eq.1) ) THEN ! sequential execution -! IF (LPACK .AND. L1D .AND. HDIR=='XY') THEN - IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==2*JPHEXT+1 .AND. SIZE(PFIELD,2)==2*JPHEXT+1) THEN - ZFIELDP=>PFIELD(2:2,2:2,:) - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - END IF - PFIELD(:,:,:)=SPREAD(SPREAD(PFIELD(2,2,:),DIM=1,NCOPIES=3),DIM=2,NCOPIES=3) -! ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN - ELSE IF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==2*JPHEXT+1) THEN - ALLOCATE (ZFIELDP(SIZE(PFIELD,1),1,SIZE(PFIELD,3))) - GALLOC = .TRUE. - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - END IF - PFIELD(:,:,:)=SPREAD(ZFIELDP(:,1,:),DIM=2,NCOPIES=3) - ELSE - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,PFIELD,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) - END IF - END IF - IF (IRESP /= 0) GOTO 1000 - ELSEIF ( (TZFD%nb_procio .eq. 1 ) .OR. ( HDIR == '--' ) ) THEN ! multiprocessor execution & 1 IO proc - ! read 3D field for graphique - IF (ISP == TZFD%OWNER) THEN - CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC) - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& - & ,IRESP) - END IF - ELSE - ALLOCATE(ZFIELDP(0,0,0)) - GALLOC = .TRUE. - END IF - ! - CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) - IF (IRESP /= 0) GOTO 1000 - ! - CALL BCAST_HEADER(TZFD,TZFMH) - ! - IF (HDIR == 'XX' .OR. HDIR =='YY') THEN - ! XX or YY Scatter Field - CALL SCATTER_XXFIELD(HDIR,ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM) - ELSE IF (HDIR == 'XY') THEN - IF (LPACK .AND. L2D) THEN - ! 2D compact case - CALL SCATTER_XXFIELD('XX',ZFIELDP(:,1,:),PFIELD(:,2,:),TZFD%OWNER,TZFD%COMM) - PFIELD(:,:,:) = SPREAD(PFIELD(:,2,:),DIM=2,NCOPIES=3) - ELSE - ! XY Scatter Field - CALL SCATTER_XYFIELD(ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM) - END IF - ELSE - ! Broadcast Field - CALL MPI_BCAST(PFIELD,SIZE(PFIELD),MPI_FLOAT,TZFD%OWNER-1,TZFD%COMM,IERR) - END IF - ELSE ! multiprocessor execution & // IO -! -!JUAN BG Z SLIDE -! -#ifdef MNH_GA - ! - ! init/create the ga - ! - CALL SECOND_MNH2(T0) - CALL MNH_INIT_GA(SIZE(PFIELD,1),SIZE(PFIELD,2),SIZE(PFIELD,3),HRECFM,"READ") - ! - ! read the data - ! - ALLOCATE(ZSLIDE_ll(0,0)) ! to avoid bug on test of size - GALLOC_ll = .TRUE. - DO JKK=1,IKU_ll - IK_FILE = io_file(JKK,TZFD%nb_procio) - write(YK_FILE ,'(".Z",i3.3)') IK_FILE+1 - YFILE_IOZ = TRIM(HFILEM)//YK_FILE//".lfi" - TZFD_IOZ => GETFD(YFILE_IOZ) - ! - IK_RANK = TZFD_IOZ%OWNER - ! - IF (ISP == IK_RANK ) THEN - IF ( SIZE(ZSLIDE_ll) .EQ. 0 ) THEN - DEALLOCATE(ZSLIDE_ll) - CALL ALLOCBUFFER_ll(ZSLIDE_ll,ZSLIDE,HDIR,GALLOC_ll) - END IF - ! - CALL SECOND_MNH2(T0) - WRITE(YK,'(I4.4)') JKK - YRECZSLIDE = TRIM(HRECFM)//YK - IF (ASSOCIATED(TZFD_IOZ%CDF)) THEN - CALL NCREAD(TZFD_IOZ%CDF%NCID,YRECZSLIDE,ZSLIDE_ll,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD_IOZ%FLU,YRECZSLIDE,.TRUE.,SIZE(ZSLIDE_ll),ZSLIDE_ll,TZFMH& - & ,IRESP) - END IF - CALL SECOND_MNH2(T1) - TIMEZ%T_READ3D_READ=TIMEZ%T_READ3D_READ + T1 - T0 - ! - ! put the data in the g_a , this proc get this JKK slide - ! - lo_zplan(JPIZ) = JKK - hi_zplan(JPIZ) = JKK - call nga_put(g_a, lo_zplan, hi_zplan,ZSLIDE_ll, ld_zplan) - END IF - END DO - call ga_sync - ! - ! get the columun data in this proc - ! - ! temp buf to avoid problem with none stride PFIELDS buffer with HALO - ALLOCATE (ZFIELD_GA (SIZE(PFIELD,1),SIZE(PFIELD,2),SIZE(PFIELD,3))) - call nga_get(g_a, lo_col, hi_col,ZFIELD_GA(1,1,1) , ld_col) - PFIELD = ZFIELD_GA - DEALLOCATE(ZFIELD_GA) -#else - ALLOCATE(ZSLIDE_ll(0,0)) - GALLOC_ll = .TRUE. - inb_proc_real = min(TZFD%nb_procio,ISNPROC) - Z_SLIDE: DO JK=1,SIZE(PFIELD,3),inb_proc_real - ! - ! read the data - ! - JK_MAX=min(SIZE(PFIELD,3),JK+inb_proc_real-1) - ! - NB_REQ=0 - ALLOCATE(REQ_TAB(ISNPROC-1)) - ALLOCATE(T_TX2DP(ISNPROC-1)) - DO JKK=JK,JK_MAX - IF (TZFD%NB_PROCIO .GT. 1 ) THEN - IK_FILE = io_file(JKK,TZFD%nb_procio) - write(YK_FILE ,'(".Z",i3.3)') IK_FILE+1 - YFILE_IOZ = TRIM(HFILEM)//YK_FILE//".lfi" - TZFD_IOZ => GETFD(YFILE_IOZ) - ELSE - TZFD_IOZ => TZFD - ENDIF - IK_RANK = TZFD_IOZ%OWNER - IF (ISP == IK_RANK ) THEN - IF ( SIZE(ZSLIDE_ll) .EQ. 0 ) THEN - DEALLOCATE(ZSLIDE_ll) - CALL ALLOCBUFFER_ll(ZSLIDE_ll,ZSLIDE,HDIR,GALLOC_ll) - END IF - !JUAN - CALL SECOND_MNH2(T0) - WRITE(YK,'(I4.4)') JKK - YRECZSLIDE = TRIM(HRECFM)//YK - IF (ASSOCIATED(TZFD_IOZ%CDF)) THEN - CALL NCREAD(TZFD_IOZ%CDF%NCID,YRECZSLIDE,ZSLIDE_ll,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD_IOZ%FLU,YRECZSLIDE,.TRUE.,SIZE(ZSLIDE_ll),ZSLIDE_ll,TZFMH& - & ,IRESP) - END IF - !JUANIOZ - CALL SECOND_MNH2(T1) - TIMEZ%T_READ3D_READ=TIMEZ%T_READ3D_READ + T1 - T0 - DO JI = 1,ISNPROC - CALL GET_DOMREAD_ll(JI,IXO,IXE,IYO,IYE) - TX2DP=>ZSLIDE_ll(IXO:IXE,IYO:IYE) - IF (ISP /= JI) THEN - NB_REQ = NB_REQ + 1 - ALLOCATE(T_TX2DP(NB_REQ)%X(IXO:IXE,IYO:IYE)) - T_TX2DP(NB_REQ)%X=TX2DP - CALL MPI_ISEND(T_TX2DP(NB_REQ)%X,SIZE(TX2DP),MPI_FLOAT,JI-1,199+IK_RANK & - & ,TZFD_IOZ%COMM,REQ_TAB(NB_REQ),IERR) - !CALL MPI_BSEND(TX2DP,SIZE(TX2DP),MPI_FLOAT,JI-1,199+IK_RANK,TZFD_IOZ%COMM,IERR) - ELSE - PFIELD(:,:,JKK) = TX2DP(:,:) - END IF - END DO - CALL SECOND_MNH2(T2) - TIMEZ%T_READ3D_SEND=TIMEZ%T_READ3D_SEND + T2 - T1 - !JUANIOZ - END IF - END DO - ! - ! brodcast the data - ! - IF (HDIR == 'XX' .OR. HDIR =='YY') THEN - ! XX or YY Scatter Field - STOP " XX ou YY NON PREVU SUR BG POUR LE MOMENT " - CALL SCATTER_XXFIELD(HDIR,ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM) - ELSE IF (HDIR == 'XY') THEN - IF (LPACK .AND. L2D) THEN - ! 2D compact case - STOP " L2D NON PREVU SUR BG POUR LE MOMENT " - CALL SCATTER_XXFIELD('XX',ZFIELDP(:,1,:),PFIELD(:,2,:),TZFD%OWNER,TZFD%COMM) - PFIELD(:,:,:) = SPREAD(PFIELD(:,2,:),DIM=2,NCOPIES=3) - ELSE - ! - ! XY Scatter Field - ! - CALL SECOND_MNH2(T0) - DO JKK=JK,JK_MAX - ! - ! get the file & rank - ! - IF (TZFD%NB_PROCIO .GT. 1 ) THEN - IK_FILE = io_file(JKK,TZFD%nb_procio) - write(YK_FILE ,'(".Z",i3.3)') IK_FILE+1 - YFILE_IOZ = TRIM(HFILEM)//YK_FILE//".lfi" - TZFD_IOZ => GETFD(YFILE_IOZ) - ELSE - TZFD_IOZ => TZFD - END IF - ! - !IK_RANK = 1 + io_rank(IK_FILE,ISNPROC,TZFD%nb_procio) - IK_RANK = TZFD_IOZ%OWNER - ! - ZSLIDE => PFIELD(:,:,JKK) -!JUANIOZ - !CALL SCATTER_XYFIELD(ZSLIDE_ll,ZSLIDE,TZFD_IOZ%OWNER,TZFD_IOZ%COMM) - IF (ISP .NE. IK_RANK) THEN - CALL MPI_RECV(ZSLIDE,SIZE(ZSLIDE),MPI_FLOAT,IK_RANK-1,199+IK_RANK,TZFD_IOZ%COMM& - & ,STATUS,IERR) - END IF -!JUAN IOZ - END DO - CALL SECOND_MNH2(T1) - TIMEZ%T_READ3D_RECV=TIMEZ%T_READ3D_RECV + T1 - T0 - END IF - ELSE - ! Broadcast Field - STOP " Broadcast Field NON PREVU SUR BG POUR LE MOMENT " - CALL MPI_BCAST(PFIELD,SIZE(PFIELD),MPI_FLOAT,TZFD%OWNER-1,TZFD%COMM,IERR) - END IF - CALL SECOND_MNH2(T0) - IF (NB_REQ .GT.0 ) THEN - CALL MPI_WAITALL(NB_REQ,REQ_TAB,MNH_STATUSES_IGNORE,IERR) - DO JI=1,NB_REQ ; DEALLOCATE(T_TX2DP(JI)%X) ; ENDDO - END IF - DEALLOCATE(T_TX2DP) - DEALLOCATE(REQ_TAB) - CALL SECOND_MNH2(T1) - TIMEZ%T_READ3D_WAIT=TIMEZ%T_READ3D_WAIT + T1 - T0 - END DO Z_SLIDE - ! - CALL BCAST_HEADER(TZFD,TZFMH) - ! -#endif -!JUAN BG Z SLIDE - END IF !(GSMONOPROC) - - KGRID = TZFMH%GRID - KLENCH = TZFMH%COMLEN - HCOMMENT = TZFMH%COMMENT(1:TZFMH%COMLEN) -ELSE - IRESP = -61 -END IF -!---------------------------------------------------------------- -1000 CONTINUE -!! Error handler -IF (IRESP.NE.0) THEN - CALL FM_READ_ERR("FMREADX3_ll",HFILEM,HFIPRI,HRECFM,HDIR,IRESP) -ENDIF -IF (GALLOC) DEALLOCATE (ZFIELDP) -IF (GALLOC_ll) DEALLOCATE (ZSLIDE_ll) -!IF (ASSOCIATED(ZSLIDE_ll)) DEALLOCATE (ZSLIDE_ll) -KRESP = IRESP -CALL MPI_BARRIER(TZFD%COMM,IERR) -CALL SECOND_MNH2(T22) -TIMEZ%T_READ3D_ALL=TIMEZ%T_READ3D_ALL + T22 - T11 - -!------------------------------------------------------------------ -END SUBROUTINE FMREADX3_ll - -SUBROUTINE FMREADX4_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& - KLENCH,HCOMMENT,KRESP) -USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LPACK,L1D,L2D -USE MODD_PARAMETERS_ll,ONLY : JPHEXT -USE MODD_FM -USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL -USE MODE_SCATTER_ll -USE MODE_ALLOCBUFFER_ll - -CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name -CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read -CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages -CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form -REAL,DIMENSION(:,:,:,:),TARGET,INTENT(INOUT)::PFIELD ! array containing the data field -INTEGER, INTENT(INOUT)::KGRID ! C-grid indicator (u,v,w,T) -INTEGER, INTENT(INOUT)::KLENCH ! length of comment string -CHARACTER(LEN=*), INTENT(INOUT)::HCOMMENT ! comment string -INTEGER, INTENT(INOUT)::KRESP ! return-code if -! -! -!* 0.2 Declarations of local variables -! -CHARACTER(LEN=JPFINL) :: YFNLFI -INTEGER :: IERR -TYPE(FD_ll), POINTER :: TZFD -INTEGER :: IRESP -REAL,DIMENSION(:,:,:,:),POINTER :: ZFIELDP -LOGICAL :: GALLOC -TYPE(FMHEADER) :: TZFMH -! -!* 1.1 THE NAME OF LFIFM -! -GALLOC = .FALSE. -IRESP = 0 -YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' -!------------------------------------------------------------------ -TZFD=>GETFD(YFNLFI) -IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC) THEN ! sequential execution -! IF (LPACK .AND. L1D .AND. HDIR=='XY') THEN - IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==2*JPHEXT+1 .AND. SIZE(PFIELD,2)==2*JPHEXT+1) THEN - ZFIELDP=>PFIELD(2:2,2:2,:,:) - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - END IF - PFIELD(:,:,:,:)=SPREAD(SPREAD(PFIELD(2,2,:,:),DIM=1,NCOPIES=3),DIM=2,NCOPIES=3) -! ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN - ELSE IF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==2*JPHEXT+1) THEN - ZFIELDP=>PFIELD(:,2:2,:,:) - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - END IF - PFIELD(:,:,:,:)=SPREAD(PFIELD(:,2,:,:),DIM=2,NCOPIES=3) - ELSE - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,PFIELD,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) - END IF - END IF - IF (IRESP /= 0) GOTO 1000 - ELSE - IF (ISP == TZFD%OWNER) THEN - CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC) - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& - & ,IRESP) - END IF - ELSE - ALLOCATE(ZFIELDP(0,0,0,0)) - GALLOC = .TRUE. - END IF - ! - CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) - IF (IRESP /= 0) GOTO 1000 - ! - CALL BCAST_HEADER(TZFD,TZFMH) - ! - IF (HDIR == 'XX' .OR. HDIR =='YY') THEN - ! XX or YY Scatter Field - CALL SCATTER_XXFIELD(HDIR,ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM) - ELSE IF (HDIR == 'XY') THEN - IF (LPACK .AND. L2D) THEN - ! 2D compact case - CALL SCATTER_XXFIELD('XX',ZFIELDP(:,1,:,:),PFIELD(:,2,:,:),TZFD%OWNER,TZFD%COMM) - PFIELD(:,:,:,:) = SPREAD(PFIELD(:,2,:,:),DIM=2,NCOPIES=3) - ELSE - ! XY Scatter Field - CALL SCATTER_XYFIELD(ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM) - END IF - ELSE - ! Broadcast Field - CALL MPI_BCAST(PFIELD,SIZE(PFIELD),MPI_FLOAT,TZFD%OWNER-1,TZFD%COMM,IERR) - END IF - END IF - KGRID = TZFMH%GRID - KLENCH = TZFMH%COMLEN - HCOMMENT = TZFMH%COMMENT(1:TZFMH%COMLEN) -ELSE - IRESP = -61 -END IF -!---------------------------------------------------------------- -1000 CONTINUE -!! Error handler -IF (IRESP.NE.0) THEN - CALL FM_READ_ERR("FMREADX4_ll",HFILEM,HFIPRI,HRECFM,HDIR,IRESP) -ENDIF - -IF (GALLOC) DEALLOCATE (ZFIELDP) -KRESP = IRESP -RETURN -!------------------------------------------------------------------ -END SUBROUTINE FMREADX4_ll - -SUBROUTINE FMREADX5_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& - KLENCH,HCOMMENT,KRESP) -USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LPACK,L1D,L2D -USE MODD_PARAMETERS_ll,ONLY : JPHEXT -USE MODD_FM -USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL -USE MODE_SCATTER_ll -USE MODE_ALLOCBUFFER_ll - -CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name -CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read -CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages -CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form -REAL,DIMENSION(:,:,:,:,:),TARGET,INTENT(INOUT)::PFIELD ! array containing the data field -INTEGER, INTENT(INOUT)::KGRID ! C-grid indicator (u,v,w,T) -INTEGER, INTENT(INOUT)::KLENCH ! length of comment string -CHARACTER(LEN=*), INTENT(INOUT)::HCOMMENT ! comment string -INTEGER, INTENT(INOUT)::KRESP ! return-code -! -! -!* 0.2 Declarations of local variables -! -CHARACTER(LEN=JPFINL) :: YFNLFI -INTEGER :: IERR -TYPE(FD_ll), POINTER :: TZFD -INTEGER :: IRESP -REAL,DIMENSION(:,:,:,:,:),POINTER :: ZFIELDP -LOGICAL :: GALLOC -TYPE(FMHEADER) :: TZFMH -! -!* 1.1 THE NAME OF LFIFM -! -GALLOC = .FALSE. -IRESP = 0 -YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' -!------------------------------------------------------------------ -TZFD=>GETFD(YFNLFI) -IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC) THEN ! sequential execution -! IF (LPACK .AND. L1D .AND. HDIR=='XY') THEN - IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==2*JPHEXT+1 .AND. SIZE(PFIELD,2)==2*JPHEXT+1) THEN - ZFIELDP=>PFIELD(2:2,2:2,:,:,:) - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - END IF - PFIELD(:,:,:,:,:)=SPREAD(SPREAD(PFIELD(2,2,:,:,:),DIM=1,NCOPIES=3),DIM=2,NCOPIES=3) -! ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN - ELSE IF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==2*JPHEXT+1) THEN - ZFIELDP=>PFIELD(:,2:2,:,:,:) - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - END IF - PFIELD(:,:,:,:,:)=SPREAD(PFIELD(:,2,:,:,:),DIM=2,NCOPIES=3) - ELSE - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,PFIELD,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) - END IF - END IF - IF (IRESP /= 0) GOTO 1000 - ELSE ! multiprocessor execution - IF (ISP == TZFD%OWNER) THEN - CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC) - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& - & ,IRESP) - END IF - ELSE - ALLOCATE(ZFIELDP(0,0,0,0,0)) - GALLOC = .TRUE. - END IF - ! - CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) - IF (IRESP /= 0) GOTO 1000 - ! - CALL BCAST_HEADER(TZFD,TZFMH) - ! - IF (HDIR == 'XX' .OR. HDIR =='YY') THEN - ! XX or YY Scatter Field - CALL SCATTER_XXFIELD(HDIR,ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM) - ELSE IF (HDIR == 'XY') THEN - IF (LPACK .AND. L2D) THEN - ! 2D compact case - CALL SCATTER_XXFIELD('XX',ZFIELDP(:,1,:,:,:),PFIELD(:,2,:,:,:),& - & TZFD%OWNER,TZFD%COMM) - PFIELD(:,:,:,:,:) = SPREAD(PFIELD(:,2,:,:,:),DIM=2,NCOPIES=3) - ELSE - ! XY Scatter Field - CALL SCATTER_XYFIELD(ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM) - END IF - ELSE - ! Broadcast Field - CALL MPI_BCAST(PFIELD,SIZE(PFIELD),MPI_FLOAT,TZFD%OWNER-1,TZFD%COMM,IERR) - END IF - END IF - KGRID = TZFMH%GRID - KLENCH = TZFMH%COMLEN - HCOMMENT = TZFMH%COMMENT(1:TZFMH%COMLEN) -ELSE - IRESP = -61 -END IF -!---------------------------------------------------------------- -1000 CONTINUE -!! Error handler -IF (IRESP.NE.0) THEN - CALL FM_READ_ERR("FMREADX5_ll",HFILEM,HFIPRI,HRECFM,HDIR,IRESP) -ENDIF -IF (GALLOC) DEALLOCATE (ZFIELDP) -KRESP = IRESP -RETURN -!------------------------------------------------------------------ -END SUBROUTINE FMREADX5_ll - -SUBROUTINE FMREADX6_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& - KLENCH,HCOMMENT,KRESP) -USE MODD_IO_ll, ONLY : ISP,GSMONOPROC -USE MODD_FM -USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL -USE MODE_SCATTER_ll -USE MODE_ALLOCBUFFER_ll - -CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name -CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read -CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages -CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form -REAL,DIMENSION(:,:,:,:,:,:),TARGET,INTENT(INOUT)::PFIELD ! array containing the data field -INTEGER, INTENT(INOUT)::KGRID ! C-grid indicator (u,v,w,T) -INTEGER, INTENT(INOUT)::KLENCH ! length of comment string -CHARACTER(LEN=*), INTENT(INOUT)::HCOMMENT ! comment string -INTEGER, INTENT(INOUT)::KRESP ! return-code -! -! -!* 0.2 Declarations of local variables -! -CHARACTER(LEN=JPFINL) :: YFNLFI -INTEGER :: IERR -TYPE(FD_ll), POINTER :: TZFD -INTEGER :: IRESP -REAL,DIMENSION(:,:,:,:,:,:),POINTER :: ZFIELDP -LOGICAL :: GALLOC -TYPE(FMHEADER) :: TZFMH -! -!* 1.1 THE NAME OF LFIFM -! -GALLOC = .FALSE. -IRESP = 0 -YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' -!------------------------------------------------------------------ -TZFD=>GETFD(YFNLFI) -IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC) THEN ! sequential execution - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,PFIELD,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) - END IF - IF (IRESP /= 0) GOTO 1000 - ELSE ! multiprocessor execution - IF (ISP == TZFD%OWNER) THEN - CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC) - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& - & ,IRESP) - END IF - ELSE - ALLOCATE(ZFIELDP(0,0,0,0,0,0)) - GALLOC = .TRUE. - END IF - ! - CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) - IF (IRESP /= 0) GOTO 1000 - ! - CALL BCAST_HEADER(TZFD,TZFMH) - ! - IF (HDIR == 'XX' .OR. HDIR =='YY') THEN - ! XX or YY Scatter Field - CALL SCATTER_XXFIELD(HDIR,ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM) - ELSE IF (HDIR == 'XY') THEN - ! XY Scatter Field - CALL SCATTER_XYFIELD(ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM) - ELSE - ! Broadcast Field - CALL MPI_BCAST(PFIELD,SIZE(PFIELD),MPI_FLOAT,TZFD%OWNER-1,TZFD%COMM,IERR) - END IF - END IF - KGRID = TZFMH%GRID - KLENCH = TZFMH%COMLEN - HCOMMENT = TZFMH%COMMENT(1:TZFMH%COMLEN) -ELSE - IRESP = -61 -END IF -!---------------------------------------------------------------- -1000 CONTINUE -!! Error handler -IF (IRESP.NE.0) THEN - CALL FM_READ_ERR("FMREADX6_ll",HFILEM,HFIPRI,HRECFM,HDIR,IRESP) -ENDIF -IF (GALLOC) DEALLOCATE (ZFIELDP) -KRESP = IRESP -RETURN -!------------------------------------------------------------------ -END SUBROUTINE FMREADX6_ll - -SUBROUTINE FMREADN0_ll(HFILEM,HRECFM,HFIPRI,HDIR,KFIELD,KGRID,& - KLENCH,HCOMMENT,KRESP) -USE MODD_IO_ll, ONLY : ISP,GSMONOPROC -USE MODD_FM -USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL - -! -!* 0. DECLARATIONS -! ------------ -! -! -!* 0.1 Declarations of arguments -! -CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name -CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read -CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages -CHARACTER(LEN=*), INTENT(IN) ::HDIR ! Field form -INTEGER, INTENT(INOUT)::KFIELD ! array containing the data field -INTEGER, INTENT(INOUT)::KGRID ! C-grid indicator (u,v,w,T) -INTEGER, INTENT(INOUT)::KLENCH ! length of comment string -CHARACTER(LEN=*), INTENT(INOUT)::HCOMMENT ! comment string -INTEGER, INTENT(INOUT)::KRESP ! return-code -! -!* 0.2 Declarations of local variables -! -CHARACTER(LEN=JPFINL) :: YFNLFI -INTEGER :: IERR -TYPE(FD_ll), POINTER :: TZFD -INTEGER :: IRESP -TYPE(FMHEADER) :: TZFMH - -! -!* 1.1 THE NAME OF LFIFM -! -IRESP = 0 -YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' -! -TZFD=>GETFD(YFNLFI) -IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC) THEN ! sequential execution - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,KFIELD,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP) - END IF - IF (IRESP /= 0) GOTO 1000 - ELSE - IF (ISP == TZFD%OWNER) THEN - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,KFIELD,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP) - END IF - END IF - ! - CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) - IF (IRESP /= 0) GOTO 1000 - ! - CALL BCAST_HEADER(TZFD,TZFMH) - ! - CALL MPI_BCAST(KFIELD,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) - END IF - KGRID = TZFMH%GRID - KLENCH = TZFMH%COMLEN - HCOMMENT = TZFMH%COMMENT(1:TZFMH%COMLEN) -ELSE - IRESP = -61 -END IF -!---------------------------------------------------------------- -1000 CONTINUE -!! Error handler -IF (IRESP.NE.0) THEN - CALL FM_READ_ERR("FMREADN0_ll",HFILEM,HFIPRI,HRECFM,HDIR,IRESP) -ENDIF -KRESP = IRESP -RETURN - -END SUBROUTINE FMREADN0_ll - -SUBROUTINE FMREADN1_ll(HFILEM,HRECFM,HFIPRI,HDIR,KFIELD,KGRID,& - KLENCH,HCOMMENT,KRESP) -USE MODD_IO_ll, ONLY : ISP,GSMONOPROC -USE MODD_FM -USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL -USE MODE_SCATTER_ll -USE MODE_ALLOCBUFFER_ll - -!* 0. DECLARATIONS -! ------------ -! -! -!* 0.1 Declarations of arguments -! -CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name -CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read -CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages -CHARACTER(LEN=*), INTENT(IN) ::HDIR ! Field form -INTEGER,DIMENSION(:),TARGET,INTENT(INOUT)::KFIELD ! array containing the data field -INTEGER, INTENT(INOUT)::KGRID ! C-grid indicator (u,v,w,T) -INTEGER, INTENT(INOUT)::KLENCH ! length of comment string -CHARACTER(LEN=*), INTENT(INOUT)::HCOMMENT ! comment string -INTEGER, INTENT(INOUT)::KRESP ! return-code -! -!* 0.2 Declarations of local variables -! -CHARACTER(LEN=JPFINL) :: YFNLFI -INTEGER :: IERR -TYPE(FD_ll), POINTER :: TZFD -INTEGER :: IRESP -INTEGER,DIMENSION(:),POINTER :: IFIELDP -LOGICAL :: GALLOC -TYPE(FMHEADER) :: TZFMH -! -!* 1.1 THE NAME OF LFIFM -! -GALLOC = .FALSE. -IRESP = 0 -YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' -!------------------------------------------------------------------ -TZFD=>GETFD(YFNLFI) -IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC) THEN ! sequential execution - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,KFIELD,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(KFIELD),KFIELD,TZFMH,IRESP) - END IF - IF (IRESP /= 0) GOTO 1000 - ELSE - IF (ISP == TZFD%OWNER) THEN - CALL ALLOCBUFFER_ll(IFIELDP,KFIELD,HDIR,GALLOC) - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,IFIELDP,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH& - & ,IRESP) - END IF - ELSE - ALLOCATE(IFIELDP(0)) - GALLOC = .TRUE. - END IF - ! - CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) - IF (IRESP /= 0) GOTO 1000 - ! - CALL BCAST_HEADER(TZFD,TZFMH) - ! - IF (HDIR /= 'XX' .AND. HDIR /='YY') THEN - ! Broadcast Field - CALL MPI_BCAST(KFIELD,SIZE(KFIELD),MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) - ELSE - !Scatter Field - CALL SCATTER_XXFIELD(HDIR,IFIELDP,KFIELD,TZFD%OWNER,TZFD%COMM) - END IF - END IF - KGRID = TZFMH%GRID - KLENCH = TZFMH%COMLEN - HCOMMENT = TZFMH%COMMENT(1:TZFMH%COMLEN) -ELSE - IRESP = -61 -END IF -!---------------------------------------------------------------- -1000 CONTINUE -!! Error handler -IF (IRESP.NE.0) THEN - CALL FM_READ_ERR("FMREADN1_ll",HFILEM,HFIPRI,HRECFM,HDIR,IRESP) -ENDIF -IF (GALLOC) DEALLOCATE (IFIELDP) -KRESP = IRESP -RETURN - -END SUBROUTINE FMREADN1_ll - -SUBROUTINE FMREADN2_ll(HFILEM,HRECFM,HFIPRI,HDIR,KFIELD,KGRID,& - KLENCH,HCOMMENT,KRESP) -USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LPACK,L1D,L2D -USE MODD_PARAMETERS_ll,ONLY : JPHEXT -USE MODD_FM -USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL -USE MODE_SCATTER_ll -USE MODE_ALLOCBUFFER_ll - -CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name -CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read -CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages -CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form -INTEGER, DIMENSION(:,:),TARGET,INTENT(INOUT)::KFIELD ! array containing the data field -INTEGER, INTENT(INOUT)::KGRID ! C-grid indicator (u,v,w,T) -INTEGER, INTENT(INOUT)::KLENCH ! length of comment string -CHARACTER(LEN=*), INTENT(INOUT)::HCOMMENT ! comment string -INTEGER, INTENT(INOUT)::KRESP ! return-code -! -! -!* 0.2 Declarations of local variables -! -CHARACTER(LEN=JPFINL) :: YFNLFI -INTEGER :: IERR -TYPE(FD_ll), POINTER :: TZFD -INTEGER :: IRESP -INTEGER,DIMENSION(:,:),POINTER :: IFIELDP -LOGICAL :: GALLOC -TYPE(FMHEADER) :: TZFMH -! -!* 1.1 THE NAME OF LFIFM -! -GALLOC = .FALSE. -IRESP = 0 -YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' -!------------------------------------------------------------------ -TZFD=>GETFD(YFNLFI) -IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC) THEN ! sequential execution -! IF (LPACK .AND. L1D .AND. HDIR=='XY') THEN - IF (LPACK .AND. L1D .AND. SIZE(KFIELD,1)==2*JPHEXT+1 .AND. SIZE(KFIELD,2)==2*JPHEXT+1) THEN - IFIELDP=>KFIELD(2:2,2:2) - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,IFIELDP,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH,IRESP) - END IF - KFIELD(:,:)=SPREAD(SPREAD(KFIELD(2,2),DIM=1,NCOPIES=3),DIM=2,NCOPIES=3) -! ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN - ELSE IF (LPACK .AND. L2D .AND. SIZE(KFIELD,2)==2*JPHEXT+1) THEN - IFIELDP=>KFIELD(:,2:2) - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,IFIELDP,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH,IRESP) - END IF - KFIELD(:,:)=SPREAD(KFIELD(:,2),DIM=2,NCOPIES=3) - ELSE - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,KFIELD,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(KFIELD),KFIELD,TZFMH,IRESP) - END IF - END IF - IF (IRESP /= 0) GOTO 1000 - ELSE - IF (ISP == TZFD%OWNER) THEN - CALL ALLOCBUFFER_ll(IFIELDP,KFIELD,HDIR,GALLOC) - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,IFIELDP,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP& - & ,TZFMH,IRESP) - END IF - ELSE - ALLOCATE(IFIELDP(0,0)) - GALLOC = .TRUE. - END IF - ! - CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) - IF (IRESP /= 0) GOTO 1000 - ! - CALL BCAST_HEADER(TZFD,TZFMH) - ! - IF (HDIR == 'XX' .OR. HDIR =='YY') THEN - ! XX or YY Scatter Field - CALL SCATTER_XXFIELD(HDIR,IFIELDP,KFIELD,TZFD%OWNER,TZFD& - & %COMM) - ELSE IF (HDIR == 'XY') THEN - IF (LPACK .AND. L2D) THEN - ! 2D compact case - CALL SCATTER_XXFIELD('XX',IFIELDP(:,1),KFIELD(:,2),TZFD%OWNER,TZFD%COMM) - KFIELD(:,:) = SPREAD(KFIELD(:,2),DIM=2,NCOPIES=3) - ELSE - ! XY Scatter Field - CALL SCATTER_XYFIELD(IFIELDP,KFIELD,TZFD%OWNER,TZFD%COMM) - END IF - ELSE - ! Broadcast Field - IF (ISP == TZFD%OWNER) KFIELD = IFIELDP - CALL MPI_BCAST(KFIELD,SIZE(KFIELD),MPI_INTEGER,TZFD%OWNER-1& - & ,TZFD%COMM,IERR) - END IF - END IF - KGRID = TZFMH%GRID - KLENCH = TZFMH%COMLEN - HCOMMENT = TZFMH%COMMENT(1:TZFMH%COMLEN) -ELSE - IRESP = -61 -END IF -!---------------------------------------------------------------- -1000 CONTINUE -!! Error handler -IF (IRESP.NE.0) THEN - CALL FM_READ_ERR("FMREADN2_ll",HFILEM,HFIPRI,HRECFM,HDIR,IRESP) -ENDIF -! -IF (GALLOC) DEALLOCATE (IFIELDP) -KRESP = IRESP -RETURN -!------------------------------------------------------------------ -END SUBROUTINE FMREADN2_ll - - -SUBROUTINE FMREADL0_ll(HFILEM,HRECFM,HFIPRI,HDIR,OFIELD,KGRID,& - KLENCH,HCOMMENT,KRESP) -USE MODD_IO_ll, ONLY : ISP,GSMONOPROC -USE MODD_FM -USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL - -!* 0. DECLARATIONS -! ------------ -! -! -!* 0.1 Declarations of arguments -! -CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name -CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read -CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages -CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form -LOGICAL, INTENT(INOUT)::OFIELD ! array containing the data field -INTEGER, INTENT(INOUT)::KGRID ! C-grid indicator (u,v,w,T) -INTEGER, INTENT(INOUT)::KLENCH ! length of comment string -CHARACTER(LEN=*), INTENT(INOUT)::HCOMMENT ! comment string -INTEGER, INTENT(INOUT)::KRESP ! return-code -! -!* 0.2 Declarations of local variables -! -CHARACTER(LEN=JPFINL) :: YFNLFI -INTEGER :: IERR -TYPE(FD_ll), POINTER :: TZFD -INTEGER :: IRESP -INTEGER :: IFIELD -TYPE(FMHEADER) :: TZFMH - -! -!* 1.1 THE NAME OF LFIFM -! -IRESP = 0 -YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' -!------------------------------------------------------------------ -TZFD=>GETFD(YFNLFI) -IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC) THEN ! sequential execution - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,IFIELD,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,1,IFIELD,TZFMH,IRESP) - END IF - IF (IRESP /= 0) GOTO 1000 - ELSE - IF (ISP == TZFD%OWNER) THEN - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,IFIELD,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,1,IFIELD,TZFMH,IRESP) - END IF - END IF - ! - CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) - IF (IRESP /= 0) GOTO 1000 - ! - CALL BCAST_HEADER(TZFD,TZFMH) - ! - CALL MPI_BCAST(IFIELD,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,& - & IERR) - END IF - IF (IFIELD==1) THEN - OFIELD=.TRUE. - ELSE - OFIELD=.FALSE. - END IF - KGRID = TZFMH%GRID - KLENCH = TZFMH%COMLEN - HCOMMENT = TZFMH%COMMENT(1:TZFMH%COMLEN) -ELSE - IRESP = -61 -END IF -!---------------------------------------------------------------- -1000 CONTINUE -!! Error handler -IF (IRESP.NE.0) THEN - CALL FM_READ_ERR("FMREADL0_ll",HFILEM,HFIPRI,HRECFM,HDIR,IRESP) -ENDIF -KRESP = IRESP -RETURN - -END SUBROUTINE FMREADL0_ll - -SUBROUTINE FMREADL1_ll(HFILEM,HRECFM,HFIPRI,HDIR,OFIELD,KGRID,& - KLENCH,HCOMMENT,KRESP) -USE MODD_IO_ll, ONLY : ISP,GSMONOPROC -USE MODD_FM -USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL -! -!* 0. DECLARATIONS -! ------------ -! -IMPLICIT NONE -! -!* 0.1 Declarations of arguments -! -CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name -CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read -CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages -CHARACTER(LEN=*), INTENT(IN) ::HDIR ! Field form -LOGICAL, DIMENSION(:), INTENT(INOUT)::OFIELD ! array containing the data field -INTEGER, INTENT(INOUT)::KGRID ! C-grid indicator (u,v,w,T) -INTEGER, INTENT(INOUT)::KLENCH ! length of comment string -CHARACTER(LEN=*), INTENT(INOUT)::HCOMMENT ! comment string -INTEGER, INTENT(INOUT)::KRESP ! return-code -! -!* 0.2 Declarations of local variables -! - -CHARACTER(LEN=JPFINL) :: YFNLFI -INTEGER :: IERR -TYPE(FD_ll), POINTER :: TZFD -INTEGER :: IRESP -INTEGER, DIMENSION(SIZE(OFIELD)) :: IFIELD -TYPE(FMHEADER) :: TZFMH - -! -!* 1.1 THE NAME OF LFIFM -! -IRESP = 0 -YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' -! -TZFD=>GETFD(YFNLFI) -IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC) THEN ! sequential execution - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,IFIELD,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELD),IFIELD,TZFMH& - & ,IRESP) - END IF - IF (IRESP /= 0) GOTO 1000 - ELSE - IF (ISP == TZFD%OWNER) THEN - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,IFIELD,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELD),IFIELD,TZFMH& - & ,IRESP) - END IF - END IF - ! - CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) - IF (IRESP /= 0) GOTO 1000 - ! - CALL BCAST_HEADER(TZFD,TZFMH) - ! - CALL MPI_BCAST(IFIELD,SIZE(IFIELD),MPI_INTEGER,TZFD%OWNER-1,TZFD& - & %COMM,IERR) - END IF - WHERE (IFIELD==1) - OFIELD=.TRUE. - ELSEWHERE - OFIELD=.FALSE. - END WHERE - KGRID = TZFMH%GRID - KLENCH = TZFMH%COMLEN - HCOMMENT = TZFMH%COMMENT(1:TZFMH%COMLEN) -ELSE - IRESP = -61 -END IF -!---------------------------------------------------------------- -1000 CONTINUE -!! Error handler -IF (IRESP.NE.0) THEN - CALL FM_READ_ERR("FMREADL1_ll",HFILEM,HFIPRI,HRECFM,HDIR,IRESP) -ENDIF -KRESP = IRESP -RETURN - -END SUBROUTINE FMREADL1_ll - -SUBROUTINE FMREADC0_ll(HFILEM,HRECFM,HFIPRI,HDIR,HFIELD,KGRID,& - KLENCH,HCOMMENT,KRESP) -USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIREAD -USE MODD_FM -USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL -! -!* 0. DECLARATIONS -! ------------ -! -! -!* 0.1 Declarations of arguments -! -CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name -CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read -CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages -CHARACTER(LEN=*), INTENT(IN) ::HDIR ! Field form -CHARACTER(LEN=*), INTENT(INOUT)::HFIELD ! array containing the data field -INTEGER, INTENT(INOUT)::KGRID ! C-grid indicator (u,v,w,T) -INTEGER, INTENT(INOUT)::KLENCH ! length of comment string -CHARACTER(LEN=*), INTENT(INOUT)::HCOMMENT ! comment string -INTEGER, INTENT(INOUT)::KRESP ! return-code -! -!* 0.2 Declarations of local variables -! -CHARACTER(LEN=JPFINL) :: YFNLFI -INTEGER :: IERR -TYPE(FD_ll), POINTER :: TZFD -INTEGER :: IRESP -INTEGER :: JLOOP -INTEGER, DIMENSION(LEN(HFIELD)) :: IFIELD -CHARACTER(LEN(HFIELD)) :: YFIELD -INTEGER :: ILENG -TYPE(FMHEADER) :: TZFMH - -! -!* 1.1 THE NAME OF LFIFM -! -IRESP = 0 -YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' -ILENG=LEN(HFIELD) -! -TZFD=>GETFD(YFNLFI) -IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC) THEN ! sequential execution - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,YFIELD,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,IRESP) - END IF - IF (IRESP /= 0) GOTO 1000 - ELSE ! parallel execution - IF (ISP == TZFD%OWNER) THEN - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,YFIELD,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,IRESP) - END IF - END IF - ! - CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) - IF (IRESP /= 0) GOTO 1000 - ! - CALL BCAST_HEADER(TZFD,TZFMH) - ! - IF (LIOCDF4 .AND. .NOT. LLFIREAD) THEN - ! NetCDF - CALL MPI_BCAST(YFIELD,ILENG,MPI_CHARACTER,TZFD%OWNER-1,TZFD%COMM,& - &IERR) - ELSE - ! LFI - CALL MPI_BCAST(IFIELD,ILENG,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,& - & IERR) - END IF - END IF ! parallel execution - ! - IF (LIOCDF4 .AND. .NOT. LLFIREAD) THEN - ! NetCDF - HFIELD = YFIELD - ELSE - ! LFI Case - DO JLOOP=1,ILENG - HFIELD(JLOOP:JLOOP)=ACHAR(IFIELD(JLOOP)) - END DO - END IF - KGRID = TZFMH%GRID - KLENCH = TZFMH%COMLEN - HCOMMENT = TZFMH%COMMENT(1:TZFMH%COMLEN) -ELSE - IRESP = -61 -END IF -!---------------------------------------------------------------- -1000 CONTINUE -!! Error handler -IF (IRESP.NE.0) THEN - CALL FM_READ_ERR("FMREADC0_ll",HFILEM,HFIPRI,HRECFM,HDIR,IRESP) -ENDIF -KRESP = IRESP -RETURN - -END SUBROUTINE FMREADC0_ll - -SUBROUTINE FMREADT0_ll(HFILEM,HRECFM,HFIPRI,HDIR,TFIELD,KGRID,& - KLENCH,HCOMMENT,KRESP) -!* 0. DECLARATIONS -! ------------ -! -USE MODD_IO_ll, ONLY : ISP,GSMONOPROC -USE MODD_TYPE_DATE -USE MODD_FM -USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL -! -!* 0.1 Declarations of arguments -! -CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name -CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read -CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages -CHARACTER(LEN=*), INTENT(IN) ::HDIR ! Field form -TYPE (DATE_TIME), INTENT(INOUT)::TFIELD ! array containing the data field -INTEGER, INTENT(INOUT)::KGRID ! C-grid indicator (u,v,w,T) -INTEGER, INTENT(INOUT)::KLENCH ! length of comment string -CHARACTER(LEN=*), INTENT(INOUT)::HCOMMENT ! comment string -INTEGER, INTENT(INOUT)::KRESP ! return-code -! -! -!* 0.2 Declarations of local variables -! -!------------------------------------------------------------------------------- - - -CHARACTER(LEN=JPFINL) :: YFNLFI -INTEGER :: IERR -TYPE(FD_ll), POINTER :: TZFD -INTEGER :: IRESP -INTEGER,DIMENSION(3) :: ITDATE -REAL :: ZTIME -TYPE(FMHEADER) :: TZFMH - -! -!* 1.1 THE NAME OF LFIFM -! -IRESP = 0 - -YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' - -TZFD=>GETFD(YFNLFI) -IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC) THEN ! sequential execution - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,TRIM(HRECFM)//'%TDATE',ITDATE,TZFMH,IRESP) - CALL NCREAD(TZFD%CDF%NCID,TRIM(HRECFM)//'%TIME',ZTIME,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,TRIM(HRECFM)//'%TDATE',.FALSE.,3,ITDATE& - & ,TZFMH,IRESP) - CALL FM_READ_ll(TZFD%FLU,TRIM(HRECFM)//'%TIME',.TRUE.,1,ZTIME& - & ,TZFMH,IRESP) - END IF - IF (IRESP /= 0) GOTO 1000 - ELSE - IF (ISP == TZFD%OWNER) THEN - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,TRIM(HRECFM)//'%TDATE',ITDATE,TZFMH,IRESP) - CALL NCREAD(TZFD%CDF%NCID,TRIM(HRECFM)//'%TIME',ZTIME,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,TRIM(HRECFM)//'%TDATE',.FALSE.,3,ITDATE& - & ,TZFMH,IRESP) - CALL FM_READ_ll(TZFD%FLU,TRIM(HRECFM)//'%TIME',.TRUE.,1,ZTIME& - & ,TZFMH,IRESP) - - END IF - END IF - ! - CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) - IF (IRESP /= 0) GOTO 1000 - ! Last header is significant - CALL BCAST_HEADER(TZFD,TZFMH) - ! - CALL MPI_BCAST(ITDATE,3,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) - CALL MPI_BCAST(ZTIME,1,MPI_FLOAT,TZFD%OWNER-1,TZFD%COMM,IERR) - END IF - TFIELD%TDATE = DATE(ITDATE(1),ITDATE(2),ITDATE(3)) - TFIELD%TIME = ZTIME - KGRID = TZFMH%GRID - KLENCH = TZFMH%COMLEN - HCOMMENT = TZFMH%COMMENT(1:TZFMH%COMLEN) -ELSE - IRESP = -61 -END IF -!---------------------------------------------------------------- -1000 CONTINUE -!! Error handler -IF (IRESP.NE.0) THEN - CALL FM_READ_ERR("FMREADT0_ll",HFILEM,HFIPRI,HRECFM,HDIR,IRESP) -ENDIF -KRESP = IRESP -RETURN - -END SUBROUTINE FMREADT0_ll - -SUBROUTINE FMREAD_LB(HFILEM,HRECFM,HFIPRI,HLBTYPE,PLB,KRIM,KL3D,& - & KGRID,KLENCH,HCOMMENT,KRESP) -USE MODD_FM -USE MODD_IO_ll, ONLY : ISP,ISNPROC,GSMONOPROC,LPACK,L2D -USE MODD_PARAMETERS_ll,ONLY : JPHEXT -USE MODE_DISTRIB_LB -USE MODE_TOOLS_ll, ONLY : GET_GLOBALDIMS_ll -USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL -!JUANZ -USE MODD_TIMEZ, ONLY : TIMEZ -USE MODE_MNH_TIMING, ONLY : SECOND_MNH2 -!JUANZ -USE MODD_VAR_ll, ONLY : MNH_STATUSES_IGNORE - -CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! file name -CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to be written -CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! file for prints -CHARACTER(LEN=*), INTENT(IN) ::HLBTYPE ! 'LBX','LBXU','LBY' or 'LBYV' -REAL, DIMENSION(:,:,:),TARGET, INTENT(INOUT)::PLB ! array containing the LB field -INTEGER, INTENT(IN) :: KRIM ! size of the LB area -INTEGER, INTENT(IN) :: KL3D ! size of the LB array in FM -INTEGER, INTENT(INOUT)::KGRID ! C-grid indicator (u,v,w,T) -INTEGER, INTENT(INOUT)::KLENCH ! length of comment string -CHARACTER(LEN=*), INTENT(INOUT)::HCOMMENT ! comment string -INTEGER, INTENT(INOUT)::KRESP ! return-code -! -!* 0.2 Declarations of local variables -! -CHARACTER(LEN=JPFINL) :: YFNLFI -INTEGER :: IERR -TYPE(FD_ll), POINTER :: TZFD -INTEGER :: IRESP -REAL,DIMENSION(:,:,:),ALLOCATABLE,TARGET :: Z3D -REAL,DIMENSION(:,:,:), POINTER :: TX3DP -TYPE(FMHEADER) :: TZFMH -INTEGER :: IIMAX_ll,IJMAX_ll -INTEGER :: IIB,IIE,IJB,IJE -INTEGER :: JI -INTEGER, DIMENSION(MPI_STATUS_SIZE) :: STATUS -INTEGER, ALLOCATABLE,DIMENSION(:,:) :: STATUSES -!JUANZIO -!JUAN INTEGER,SAVE,DIMENSION(100000) :: REQ_TAB -INTEGER,ALLOCATABLE,DIMENSION(:) :: REQ_TAB -INTEGER :: NB_REQ,IKU -TYPE TX_3DP -REAL,DIMENSION(:,:,:), POINTER :: X -END TYPE -TYPE(TX_3DP),ALLOCATABLE,DIMENSION(:) :: T_TX3DP -REAL*8,DIMENSION(2) :: T0,T1,T2,T3 -REAL*8,DIMENSION(2) :: T11,T22 -!JUANZIO - -! -!* 1.1 THE NAME OF LFIFM -! -CALL SECOND_MNH2(T11) -IRESP = 0 -YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' -!------------------------------------------------------------------ -TZFD=>GETFD(YFNLFI) -IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC) THEN ! sequential execution - IF (HLBTYPE == 'LBX' .OR. HLBTYPE == 'LBXU') THEN - ALLOCATE(Z3D(KL3D,SIZE(PLB,2),SIZE(PLB,3))) - Z3D = 0.0 - IF (LPACK .AND. L2D) THEN - TX3DP=>Z3D(:,JPHEXT+1:JPHEXT+1,:) - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,TX3DP,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(TX3DP),TX3DP,TZFMH,IRESP) - END IF - Z3D(:,:,:) = SPREAD(Z3D(:,JPHEXT+1,:),DIM=2,NCOPIES=2*JPHEXT+1) - ELSE - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,Z3D,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(Z3D),Z3D,TZFMH,IRESP) - END IF - END IF - PLB(1:KRIM+JPHEXT,:,:) = Z3D(1:KRIM+JPHEXT,:,:) - PLB(KRIM+JPHEXT+1:2*(KRIM+JPHEXT),:,:) = Z3D(KL3D-KRIM-JPHEXT+1:KL3D,:,:) - ELSE !(HLBTYPE == 'LBY' .OR. HLBTYPE == 'LBYV') - ALLOCATE(Z3D(SIZE(PLB,1),KL3D,SIZE(PLB,3))) - Z3D = 0.0 - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,Z3D,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(Z3D),Z3D,TZFMH,IRESP) - END IF - PLB(:,1:KRIM+JPHEXT,:) = Z3D(:,1:KRIM+JPHEXT,:) - PLB(:,KRIM+JPHEXT+1:2*(KRIM+JPHEXT),:) = Z3D(:,KL3D-KRIM-JPHEXT+1:KL3D,:) - END IF - IF (IRESP /= 0) GOTO 1000 - ELSE ! multiprocessor execution - IF (ISP == TZFD%OWNER) THEN - CALL SECOND_MNH2(T0) - CALL GET_GLOBALDIMS_ll(IIMAX_ll,IJMAX_ll) - IF (HLBTYPE == 'LBX' .OR. HLBTYPE == 'LBXU') THEN - ALLOCATE(Z3D(KL3D,IJMAX_ll+2*JPHEXT,SIZE(PLB,3))) - Z3D = 0.0 - IF (LPACK .AND. L2D) THEN - TX3DP=>Z3D(:,JPHEXT+1:JPHEXT+1,:) - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,TX3DP,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(TX3DP),TX3DP,TZFMH,IRESP) - END IF - Z3D(:,:,:) = SPREAD(Z3D(:,JPHEXT+1,:),DIM=2,NCOPIES=2*JPHEXT+1) - ELSE - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,Z3D,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(Z3D),Z3D,TZFMH,IRESP) - END IF - END IF - ! erase gap in LB field - Z3D(KRIM+JPHEXT+1:2*(KRIM+JPHEXT),:,:) = Z3D(KL3D-KRIM-JPHEXT+1:KL3D,:,:) - ELSE !(HLBTYPE == 'LBY' .OR. HLBTYPE == 'LBYV') - ALLOCATE(Z3D(IIMAX_ll+2*JPHEXT,KL3D,SIZE(PLB,3))) - Z3D = 0.0 - IF (ASSOCIATED(TZFD%CDF)) THEN - CALL NCREAD(TZFD%CDF%NCID,HRECFM,Z3D,TZFMH,IRESP) - ELSE - CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(Z3D),Z3D,TZFMH,IRESP) - END IF - ! erase gap in LB field - Z3D(:,KRIM+JPHEXT+1:2*(KRIM+JPHEXT),:) = Z3D(:,KL3D-KRIM-JPHEXT+1:KL3D,:) - END IF - CALL SECOND_MNH2(T1) - TIMEZ%T_READLB_READ=TIMEZ%T_READLB_READ + T1 - T0 - END IF - ! - CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) - IF (IRESP /= 0) GOTO 1000 - ! - CALL BCAST_HEADER(TZFD,TZFMH) - ! - NB_REQ=0 - ALLOCATE(REQ_TAB(ISNPROC-1)) - !REQ_TAB=MPI_REQUEST_NULL - IF (ISP == TZFD%OWNER) THEN - CALL SECOND_MNH2(T1) - !ALLOCATE(REQ_TAB(ISNPROC-1)) - !REQ_TAB=MPI_REQUEST_NULL - ALLOCATE(T_TX3DP(ISNPROC-1)) - IKU = SIZE(Z3D,3) - DO JI = 1,ISNPROC - CALL GET_DISTRIB_LB(HLBTYPE,JI,'FM','READ',KRIM,IIB,IIE,IJB,IJE) - IF (IIB /= 0) THEN - TX3DP=>Z3D(IIB:IIE,IJB:IJE,:) - IF (ISP /= JI) THEN - NB_REQ = NB_REQ + 1 - ALLOCATE(T_TX3DP(NB_REQ)%X(IIB:IIE,IJB:IJE,IKU)) - T_TX3DP(NB_REQ)%X=Z3D(IIB:IIE,IJB:IJE,:) - CALL MPI_ISEND(T_TX3DP(NB_REQ)%X,SIZE(TX3DP),MPI_FLOAT,JI-1,99,TZFD%COMM,REQ_TAB(NB_REQ),IERR) - !CALL MPI_BSEND(T_TX3DP(NB_REQ)%X,SIZE(TX3DP),MPI_FLOAT,JI-1,99,TZFD%COMM,IERR) - ELSE - CALL GET_DISTRIB_LB(HLBTYPE,JI,'LOC','READ',KRIM,IIB,IIE,IJB,IJE) - PLB(IIB:IIE,IJB:IJE,:) = TX3DP(:,:,:) - END IF - END IF - END DO - CALL SECOND_MNH2(T2) - TIMEZ%T_READLB_SEND=TIMEZ%T_READLB_SEND + T2 - T1 - IF (NB_REQ .GT.0 ) THEN - !ALLOCATE(STATUSES(MPI_STATUS_SIZE,NB_REQ)) - !CALL MPI_WAITALL(NB_REQ,REQ_TAB,STATUSES,IERR) - CALL MPI_WAITALL(NB_REQ,REQ_TAB,MNH_STATUSES_IGNORE,IERR) - !DEALLOCATE(STATUSES) - DO JI=1,NB_REQ ; DEALLOCATE(T_TX3DP(JI)%X) ; ENDDO - END IF - DEALLOCATE(T_TX3DP) - !DEALLOCATE(REQ_TAB) - CALL SECOND_MNH2(T3) - TIMEZ%T_READLB_WAIT=TIMEZ%T_READLB_WAIT + T3 - T2 - ELSE - CALL SECOND_MNH2(T0) - !ALLOCATE(REQ_TAB(1)) - !REQ_TAB=MPI_REQUEST_NULL - CALL GET_DISTRIB_LB(HLBTYPE,ISP,'LOC','READ',KRIM,IIB,IIE,IJB,IJE) - IF (IIB /= 0) THEN - TX3DP=>PLB(IIB:IIE,IJB:IJE,:) - CALL MPI_RECV(TX3DP,SIZE(TX3DP),MPI_FLOAT,TZFD%OWNER-1,99,TZFD%COMM,STATUS,IERR) - !NB_REQ = NB_REQ + 1 - !CALL MPI_IRECV(TX3DP,SIZE(TX3DP),MPI_FLOAT,TZFD%OWNER-1,99,TZFD%COMM,REQ_TAB(NB_REQ),IERR) - !IF (NB_REQ .GT.0 ) CALL MPI_WAITALL(NB_REQ,REQ_TAB,MNH_STATUSES_IGNORE,IERR) - END IF - CALL SECOND_MNH2(T1) - TIMEZ%T_READLB_RECV=TIMEZ%T_READLB_RECV + T1 - T0 - END IF - DEALLOCATE(REQ_TAB) - END IF !(GSMONOPROC) - KGRID = TZFMH%GRID - KLENCH = TZFMH%COMLEN - HCOMMENT = TZFMH%COMMENT(1:TZFMH%COMLEN) -ELSE - IRESP = -61 -END IF -!---------------------------------------------------------------- -1000 CONTINUE -!! Error handler -IF (IRESP.NE.0) THEN - CALL FM_READ_ERR("FMREAD_LB",HFILEM,HFIPRI,HRECFM,HLBTYPE,IRESP) -ENDIF -! -IF (ALLOCATED(Z3D)) DEALLOCATE (Z3D) -KRESP = IRESP -! -!CALL MPI_BARRIER(TZFD%COMM,IERR) -CALL SECOND_MNH2(T22) -TIMEZ%T_READLB_ALL=TIMEZ%T_READLB_ALL + T22 - T11 -END SUBROUTINE FMREAD_LB - -END MODULE MODE_FMREAD - - -! +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for CVS information +!----------------------------------------------------------------- +! $Source$ +! $Name$ +! $Revision$ +! $Date$ +!----------------------------------------------------------------- +!----------------------------------------------------------------- + +#ifdef MNH_MPI_DOUBLE_PRECISION +#define MPI_FLOAT MPI_DOUBLE_PRECISION +#else +#define MPI_FLOAT MPI_REAL +#endif + +MODULE MODE_FMREAD +! +!Correction : +! J.Escobar : 22/08/2005 : BUG : manque un "GOTO 1000" si champs +! lue non trouvé !!! +! J.Escobar : 13/01/2015 : remove comment on BCAST(IRESP in FMREADX2_ll +! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +! +USE MODD_MPIF +#if defined(MNH_IOCDF4) +USE MODE_NETCDF +#endif +IMPLICIT NONE + +PRIVATE + +INTERFACE FMREAD + MODULE PROCEDURE FMREADX0_ll,FMREADX1_ll,FMREADX2_ll,FMREADX3_ll,& + & FMREADX4_ll,FMREADX5_ll,FMREADX6_ll,& + & FMREADN0_ll,FMREADN1_ll,FMREADN2_ll,& + & FMREADL0_ll,FMREADL1_ll,FMREADC0_ll,FMREADT0_ll +END INTERFACE +! + +PUBLIC FMREAD_LB,FMREAD,FMREADX0_ll,FMREADX1_ll,FMREADX2_ll,FMREADX3_ll,& + & FMREADX4_ll,FMREADX5_ll,FMREADX6_ll,& + & FMREADN0_ll,FMREADN1_ll,FMREADN2_ll,& + & FMREADL0_ll,FMREADL1_ll,FMREADC0_ll,FMREADT0_ll + +!INCLUDE 'mpif.h' + +CONTAINS +SUBROUTINE FM_READ_ERR(HFUNC,HFILEM,HFIPRI,HRECFM,HDIR,KRESP) +USE MODE_FM, ONLY : FMLOOK_ll + +CHARACTER(LEN=*) :: HFUNC +CHARACTER(LEN=*) :: HFILEM +CHARACTER(LEN=*) :: HFIPRI +CHARACTER(LEN=*) :: HRECFM +CHARACTER(LEN=*) :: HDIR +INTEGER :: KRESP + +INTEGER :: ILUPRI +INTEGER :: IRESP + +CALL FMLOOK_ll(HFIPRI,HFIPRI,ILUPRI,IRESP) +WRITE (ILUPRI,*) ' exit from ',HFUNC, ' with RESP:',KRESP +!STOP "fmread_ll.f90:: FM_READ_ERR" + +WRITE (ILUPRI,*) ' | HFILEM = ',HFILEM +WRITE (ILUPRI,*) ' | HRECFM = ',HRECFM +WRITE (ILUPRI,*) ' | HDIR = ',HDIR + +END SUBROUTINE FM_READ_ERR + + +SUBROUTINE BCAST_HEADER(TPFD,TPFMH) +USE MODE_FD_ll, ONLY : FD_ll +USE MODD_FM +TYPE(FD_ll), POINTER :: TPFD +TYPE(FMHEADER), INTENT(IN) :: TPFMH + +INTEGER :: ierr + +CALL MPI_BCAST(TPFMH%GRID,1,MPI_INTEGER,TPFD%OWNER-1,TPFD%COMM,IERR) +CALL MPI_BCAST(TPFMH%COMLEN,1,MPI_INTEGER,TPFD%OWNER-1,TPFD%COMM,IERR) +CALL MPI_BCAST(TPFMH%COMMENT,TPFMH%COMLEN,MPI_CHARACTER,TPFD%OWNER-1,TPFD%COMM,IERR) + +END SUBROUTINE BCAST_HEADER + +SUBROUTINE FMREADX0_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& + KLENCH,HCOMMENT,KRESP) +USE MODD_IO_ll, ONLY : ISP,GSMONOPROC +USE MODD_FM +USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL +! +!* 0. DECLARATIONS +! ------------ +! +! +!* 0.1 Declarations of arguments +! +CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name +CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read +CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages +CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form +REAL, INTENT(INOUT)::PFIELD ! array containing the data field +INTEGER, INTENT(INOUT)::KGRID ! C-grid indicator (u,v,w,T) +INTEGER, INTENT(INOUT)::KLENCH ! length of comment string +CHARACTER(LEN=*), INTENT(INOUT)::HCOMMENT ! comment string +INTEGER, INTENT(INOUT)::KRESP ! return-code +! +!* 0.2 Declarations of local variables +! +!---------------------------------------------------------------- +CHARACTER(LEN=JPFINL) :: YFNLFI +INTEGER :: IERR +TYPE(FD_ll), POINTER :: TZFD +INTEGER :: IRESP +TYPE(FMHEADER) :: TZFMH +! +!* 1.1 THE NAME OF LFIFM +! +IRESP = 0 +YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' +!------------------------------------------------------------------ +TZFD=>GETFD(YFNLFI) +IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,PFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP) + END IF + IF (IRESP /= 0) GOTO 1000 + ELSE ! multiprocessor execution + IF (ISP == TZFD%OWNER) THEN + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,PFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP) + END IF + END IF + ! + CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) + IF (IRESP /= 0) GOTO 1000 + ! + CALL BCAST_HEADER(TZFD,TZFMH) + ! + CALL MPI_BCAST(PFIELD,1,MPI_FLOAT,TZFD%OWNER-1,TZFD%COMM,IERR) + END IF + KGRID = TZFMH%GRID + KLENCH = TZFMH%COMLEN + HCOMMENT = TZFMH%COMMENT(1:TZFMH%COMLEN) +ELSE + IRESP = -61 +END IF +!---------------------------------------------------------------- +1000 CONTINUE +!! Error handler +IF (IRESP.NE.0) THEN + CALL FM_READ_ERR("FMREADX0_ll",HFILEM,HFIPRI,HRECFM,HDIR,IRESP) +ENDIF +KRESP = IRESP +RETURN + +END SUBROUTINE FMREADX0_ll + +SUBROUTINE FMREADX1_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& + KLENCH,HCOMMENT,KRESP, KIMAX_ll, KJMAX_ll, TPSPLITTING) +USE MODD_IO_ll, ONLY : ISP,GSMONOPROC, ISNPROC +USE MODD_FM +USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL +USE MODE_SCATTER_ll +USE MODE_ALLOCBUFFER_ll +USE MODD_STRUCTURE_ll, ONLY : ZONE_ll +! +!* 0. DECLARATIONS +! ------------ +! +! +!* 0.1 Declarations of arguments +! +CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name +CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read +CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages +CHARACTER(LEN=*), INTENT(IN) ::HDIR ! Field form +REAL,DIMENSION(:),TARGET,INTENT(INOUT)::PFIELD ! array containing the data field +INTEGER, INTENT(INOUT)::KGRID ! C-grid indicator (u,v,w,T) +INTEGER, INTENT(INOUT)::KLENCH ! length of comment string +CHARACTER(LEN=*), INTENT(INOUT)::HCOMMENT ! comment string +INTEGER, INTENT(INOUT)::KRESP ! return-code +INTEGER, OPTIONAL, INTENT(IN) ::KIMAX_ll +INTEGER, OPTIONAL, INTENT(IN) ::KJMAX_ll +TYPE(ZONE_ll), DIMENSION(ISNPROC), OPTIONAL :: TPSPLITTING ! splitting of the domain +! +!* 0.2 Declarations of local variables +! +!---------------------------------------------------------------- +CHARACTER(LEN=JPFINL) :: YFNLFI +INTEGER :: IERR +TYPE(FD_ll), POINTER :: TZFD +INTEGER :: IRESP +REAL,DIMENSION(:),POINTER :: ZFIELDP +LOGICAL :: GALLOC +TYPE(FMHEADER) :: TZFMH +! +!* 1.1 THE NAME OF LFIFM +! +GALLOC = .FALSE. +IRESP = 0 +YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' +!------------------------------------------------------------------ +TZFD=>GETFD(YFNLFI) +IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,PFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + END IF + IF (IRESP /= 0) GOTO 1000 + ELSE ! multiprocessor execution + IF (ISP == TZFD%OWNER) THEN + IF( PRESENT(KIMAX_ll) .AND. PRESENT(KJMAX_ll) ) THEN + CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC, KIMAX_ll, KJMAX_ll) + ELSE + CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC) + ENDIF + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + & ,IRESP) + END IF + ELSE + ALLOCATE(ZFIELDP(0)) + GALLOC = .TRUE. + END IF + + ! + CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) + IF (IRESP /= 0) GOTO 1000 + ! + CALL BCAST_HEADER(TZFD,TZFMH) + ! + IF (HDIR /= 'XX' .AND. HDIR /='YY') THEN + ! Broadcast Field + CALL MPI_BCAST(PFIELD,SIZE(PFIELD),MPI_FLOAT,TZFD%OWNER-1,TZFD%COMM,IERR) + ELSE + !Scatter Field + IF( PRESENT(TPSPLITTING) ) THEN + CALL SCATTER_XXFIELD(HDIR,ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM,TPSPLITTING) + ELSE + CALL SCATTER_XXFIELD(HDIR,ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM) + ENDIF + END IF + END IF !(GSMONOPROC) + + KGRID = TZFMH%GRID + KLENCH = TZFMH%COMLEN + HCOMMENT = TZFMH%COMMENT(1:TZFMH%COMLEN) +ELSE + IRESP = -61 +END IF +!---------------------------------------------------------------- +1000 CONTINUE +!! Error handler +IF (IRESP.NE.0) THEN + CALL FM_READ_ERR("FMREADX1_ll",HFILEM,HFIPRI,HRECFM,HDIR,IRESP) +ENDIF + +IF (GALLOC) DEALLOCATE (ZFIELDP) +KRESP = IRESP +RETURN +!------------------------------------------------------------------ +END SUBROUTINE FMREADX1_ll + +SUBROUTINE FMREADX2_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& + KLENCH,HCOMMENT,KRESP, KIMAX_ll, KJMAX_ll, TPSPLITTING) +USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LPACK,L1D,L2D , ISNPROC +USE MODD_PARAMETERS_ll,ONLY : JPHEXT +USE MODD_FM +USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL +USE MODE_SCATTER_ll +USE MODE_ALLOCBUFFER_ll +!JUANZ +USE MODD_TIMEZ, ONLY : TIMEZ +USE MODE_MNH_TIMING, ONLY : SECOND_MNH2 +!JUANZ +USE MODD_STRUCTURE_ll, ONLY : ZONE_ll +#ifdef MNH_GA + USE MODE_GA +#endif + +IMPLICIT NONE + +CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name +CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read +CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages +CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form +REAL,DIMENSION(:,:),TARGET, INTENT(INOUT)::PFIELD ! array containing the data field +INTEGER, INTENT(INOUT)::KGRID ! C-grid indicator (u,v,w,T) +INTEGER, INTENT(INOUT)::KLENCH ! length of comment string +CHARACTER(LEN=*), INTENT(INOUT)::HCOMMENT ! comment string +INTEGER, INTENT(INOUT)::KRESP ! return-code +INTEGER, OPTIONAL, INTENT(IN) ::KIMAX_ll +INTEGER, OPTIONAL, INTENT(IN) ::KJMAX_ll +TYPE(ZONE_ll), DIMENSION(ISNPROC), OPTIONAL :: TPSPLITTING ! splitting of the domain +! +! +!* 0.2 Declarations of local variables +! +CHARACTER(LEN=JPFINL) :: YFNLFI + +INTEGER :: IERR +TYPE(FD_ll), POINTER :: TZFD +INTEGER :: IRESP +REAL,DIMENSION(:,:), POINTER :: ZFIELDP +LOGICAL :: GALLOC +TYPE(FMHEADER) :: TZFMH +!JUANZ +REAL*8,DIMENSION(2) :: T0,T1,T2 +REAL*8,DIMENSION(2) :: T11,T22 +!JUANZ +#ifdef MNH_GA +REAL,DIMENSION(:,:),POINTER :: ZFIELD_GA +#endif +INTEGER :: IHEXTOT +! +!* 1.1 THE NAME OF LFIFM +! +CALL SECOND_MNH2(T11) +GALLOC = .FALSE. +IRESP = 0 +YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' + +!------------------------------------------------------------------ +IHEXTOT = 2*JPHEXT+1 +TZFD=>GETFD(YFNLFI) +IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution +! IF (LPACK .AND. L1D .AND. HDIR=='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 (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + END IF + PFIELD(:,:)=SPREAD(SPREAD(PFIELD(JPHEXT+1,JPHEXT+1),DIM=1,NCOPIES=IHEXTOT),DIM=2,NCOPIES=IHEXTOT) +! ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN + ELSE IF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + ZFIELDP=>PFIELD(:,JPHEXT+1:JPHEXT+1) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + END IF + PFIELD(:,:)=SPREAD(PFIELD(:,JPHEXT+1),DIM=2,NCOPIES=IHEXTOT) + ELSE + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,PFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + END IF + END IF + IF (IRESP /= 0) GOTO 1000 + ELSE ! multiprocessor execution + CALL SECOND_MNH2(T0) + IF (ISP == TZFD%OWNER) THEN + ! I/O processor case + IF( PRESENT(KIMAX_ll) .AND. PRESENT(KJMAX_ll) ) THEN + CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC, KIMAX_ll, KJMAX_ll) + ELSE + CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC) + ENDIF + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + & ,IRESP) + END IF + ELSE + ALLOCATE(ZFIELDP(0,0)) + GALLOC = .TRUE. + END IF + CALL SECOND_MNH2(T1) + TIMEZ%T_READ2D_READ=TIMEZ%T_READ2D_READ + T1 - T0 + ! + CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) + IF (IRESP /= 0) GOTO 1000 + ! + CALL BCAST_HEADER(TZFD,TZFMH) + ! + IF (HDIR == 'XX' .OR. HDIR =='YY') THEN + ! XX or YY Scatter Field + IF( PRESENT(TPSPLITTING) ) THEN + CALL SCATTER_XXFIELD(HDIR,ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM,TPSPLITTING) + ELSE + CALL SCATTER_XXFIELD(HDIR,ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM) + ENDIF + ELSE IF (HDIR == 'XY') THEN + IF (LPACK .AND. L2D) THEN + ! 2D compact case + IF( PRESENT(TPSPLITTING) ) THEN + CALL SCATTER_XXFIELD('XX',ZFIELDP(:,1),PFIELD(:,JPHEXT+1),TZFD%OWNER,TZFD%COMM,TPSPLITTING) + ELSE + CALL SCATTER_XXFIELD('XX',ZFIELDP(:,1),PFIELD(:,JPHEXT+1),TZFD%OWNER,TZFD%COMM) + ENDIF + PFIELD(:,:) = SPREAD(PFIELD(:,JPHEXT+1),DIM=2,NCOPIES=IHEXTOT) + ELSE +#ifdef MNH_GA + ! + ! init/create the ga , dim3 = 1 + ! + CALL MNH_INIT_GA(SIZE(PFIELD,1),SIZE(PFIELD,2),1,HRECFM,"READ") + IF (ISP == TZFD%OWNER) THEN + ! + ! put the data in the g_a , this proc get this 1 slide + ! + lo_zplan(JPIZ) = 1 + hi_zplan(JPIZ) = 1 + call nga_put(g_a, lo_zplan, hi_zplan,ZFIELDP, ld_zplan) + END IF + call ga_sync + ! + ! get the columun data in this proc + ! + ! temp buf to avoid problem with none stride PFIELDS buffer with HALO + ALLOCATE (ZFIELD_GA (SIZE(PFIELD,1),SIZE(PFIELD,2))) + call nga_get(g_a, lo_col, hi_col,ZFIELD_GA(1,1) , ld_col) + PFIELD = ZFIELD_GA + DEALLOCATE(ZFIELD_GA) +#else + ! XY Scatter Field + CALL SCATTER_XYFIELD(ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM) +#endif + END IF + ELSE + CALL MPI_BCAST(PFIELD,SIZE(PFIELD),MPI_FLOAT,TZFD%OWNER-1,TZFD%COMM,IERR) + END IF + CALL SECOND_MNH2(T2) + TIMEZ%T_READ2D_SCAT=TIMEZ%T_READ2D_SCAT + T2 - T1 + END IF !(GSMONOPROC) + + KGRID = TZFMH%GRID + KLENCH = TZFMH%COMLEN + HCOMMENT = TZFMH%COMMENT(1:TZFMH%COMLEN) +ELSE + IRESP = -61 +END IF +!---------------------------------------------------------------- +1000 CONTINUE +!! Error handler +IF (IRESP.NE.0) THEN + CALL FM_READ_ERR("FMREADX2_ll",HFILEM,HFIPRI,HRECFM,HDIR,IRESP) +ENDIF +IF (GALLOC) DEALLOCATE (ZFIELDP) +KRESP = IRESP +!------------------------------------------------------------------ + +CALL SECOND_MNH2(T22) +TIMEZ%T_READ2D_ALL=TIMEZ%T_READ2D_ALL + T22 - T11 + +END SUBROUTINE FMREADX2_ll + +SUBROUTINE FMREADX3_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& + KLENCH,HCOMMENT,KRESP) +USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LPACK,L1D,L2D +USE MODD_PARAMETERS_ll,ONLY : JPHEXT +USE MODD_FM +USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL +USE MODE_SCATTER_ll +USE MODE_ALLOCBUFFER_ll +!JUANZ +USE MODD_IO_ll, ONLY : ISNPROC +USE MODE_IO_ll, ONLY : io_file,io_rank +USE MODD_TIMEZ, ONLY : TIMEZ +USE MODE_MNH_TIMING, ONLY : SECOND_MNH2 +!JUANZ +#ifdef MNH_GA + USE MODE_GA +#endif +USE MODD_VAR_ll, ONLY : MNH_STATUSES_IGNORE + +IMPLICIT NONE + +CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name +CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read +CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages +CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form +REAL, DIMENSION(:,:,:),TARGET,INTENT(INOUT)::PFIELD ! array containing the data field +INTEGER, INTENT(INOUT)::KGRID ! C-grid indicator (u,v,w,T) +INTEGER, INTENT(INOUT)::KLENCH ! length of comment string +CHARACTER(LEN=*), INTENT(INOUT)::HCOMMENT ! comment string +INTEGER, INTENT(INOUT)::KRESP ! return-code +! +#ifdef MNH_GA +REAL,DIMENSION(:,:,:),POINTER :: ZFIELD_GA +#endif +! +! +!* 0.2 Declarations of local variables +! +CHARACTER(LEN=JPFINL) :: YFNLFI +INTEGER :: IERR +TYPE(FD_ll), POINTER :: TZFD +INTEGER :: IRESP +REAL,DIMENSION(:,:,:),POINTER :: ZFIELDP +LOGICAL :: GALLOC +TYPE(FMHEADER) :: TZFMH +!JUAN +INTEGER :: JK,JKK +CHARACTER(LEN=LEN(HRECFM)) :: YK,YRECZSLIDE +REAL,DIMENSION(:,:),POINTER :: ZSLIDE_ll,ZSLIDE +INTEGER :: IK_FILE,IK_rank,inb_proc_real,JK_MAX +CHARACTER(len=5) :: YK_FILE +CHARACTER(len=128) :: YFILE_IOZ +TYPE(FD_ll), POINTER :: TZFD_IOZ +INTEGER :: JI,IXO,IXE,IYO,IYE +REAL,DIMENSION(:,:),POINTER :: TX2DP +INTEGER, DIMENSION(MPI_STATUS_SIZE) :: STATUS +LOGICAL :: GALLOC_ll + +INTEGER,ALLOCATABLE,DIMENSION(:) :: REQ_TAB +INTEGER :: NB_REQ +TYPE TX_2DP + REAL,DIMENSION(:,:), POINTER :: X +END TYPE TX_2DP +TYPE(TX_2DP),ALLOCATABLE,DIMENSION(:) :: T_TX2DP +REAL*8,DIMENSION(2) :: T0,T1,T2 +REAL*8,DIMENSION(2) :: T11,T22 +INTEGER :: IHEXTOT +!JUAN +! +!* 1.1 THE NAME OF LFIFM +! +CALL SECOND_MNH2(T11) +GALLOC = .FALSE. +GALLOC_ll = .FALSE. +IRESP = 0 +YFNLFI = TRIM(ADJUSTL(HFILEM))//'.lfi' +!------------------------------------------------------------------ +IHEXTOT = 2*JPHEXT+1 +TZFD=>GETFD(YFNLFI) +IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC .AND. (TZFD%nb_procio.eq.1) ) THEN ! sequential execution +! IF (LPACK .AND. L1D .AND. HDIR=='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 (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + END IF + PFIELD(:,:,:)=SPREAD(SPREAD(PFIELD(JPHEXT+1,JPHEXT+1,:),DIM=1,NCOPIES=IHEXTOT),DIM=2,NCOPIES=IHEXTOT) +! ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN + ELSE IF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + ALLOCATE (ZFIELDP(SIZE(PFIELD,1),1,SIZE(PFIELD,3))) + GALLOC = .TRUE. + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + END IF + PFIELD(:,:,:)=SPREAD(ZFIELDP(:,1,:),DIM=2,NCOPIES=IHEXTOT) + ELSE + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,PFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + END IF + END IF + IF (IRESP /= 0) GOTO 1000 + ELSEIF ( (TZFD%nb_procio .eq. 1 ) .OR. ( HDIR == '--' ) ) THEN ! multiprocessor execution & 1 IO proc + ! read 3D field for graphique + IF (ISP == TZFD%OWNER) THEN + CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + & ,IRESP) + END IF + ELSE + ALLOCATE(ZFIELDP(0,0,0)) + GALLOC = .TRUE. + END IF + ! + CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) + IF (IRESP /= 0) GOTO 1000 + ! + CALL BCAST_HEADER(TZFD,TZFMH) + ! + IF (HDIR == 'XX' .OR. HDIR =='YY') THEN + ! XX or YY Scatter Field + CALL SCATTER_XXFIELD(HDIR,ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM) + ELSE IF (HDIR == 'XY') THEN + IF (LPACK .AND. L2D) THEN + ! 2D compact case + CALL SCATTER_XXFIELD('XX',ZFIELDP(:,1,:),PFIELD(:,JPHEXT+1,:),TZFD%OWNER,TZFD%COMM) + PFIELD(:,:,:) = SPREAD(PFIELD(:,JPHEXT+1,:),DIM=2,NCOPIES=IHEXTOT) + ELSE + ! XY Scatter Field + CALL SCATTER_XYFIELD(ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM) + END IF + ELSE + ! Broadcast Field + CALL MPI_BCAST(PFIELD,SIZE(PFIELD),MPI_FLOAT,TZFD%OWNER-1,TZFD%COMM,IERR) + END IF + ELSE ! multiprocessor execution & // IO +! +!JUAN BG Z SLIDE +! +#ifdef MNH_GA + ! + ! init/create the ga + ! + CALL SECOND_MNH2(T0) + CALL MNH_INIT_GA(SIZE(PFIELD,1),SIZE(PFIELD,2),SIZE(PFIELD,3),HRECFM,"READ") + ! + ! read the data + ! + ALLOCATE(ZSLIDE_ll(0,0)) ! to avoid bug on test of size + GALLOC_ll = .TRUE. + DO JKK=1,IKU_ll + IK_FILE = io_file(JKK,TZFD%nb_procio) + write(YK_FILE ,'(".Z",i3.3)') IK_FILE+1 + YFILE_IOZ = TRIM(HFILEM)//YK_FILE//".lfi" + TZFD_IOZ => GETFD(YFILE_IOZ) + ! + IK_RANK = TZFD_IOZ%OWNER + ! + IF (ISP == IK_RANK ) THEN + IF ( SIZE(ZSLIDE_ll) .EQ. 0 ) THEN + DEALLOCATE(ZSLIDE_ll) + CALL ALLOCBUFFER_ll(ZSLIDE_ll,ZSLIDE,HDIR,GALLOC_ll) + END IF + ! + CALL SECOND_MNH2(T0) + WRITE(YK,'(I4.4)') JKK + YRECZSLIDE = TRIM(HRECFM)//YK + IF (ASSOCIATED(TZFD_IOZ%CDF)) THEN + CALL NCREAD(TZFD_IOZ%CDF%NCID,YRECZSLIDE,ZSLIDE_ll,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD_IOZ%FLU,YRECZSLIDE,.TRUE.,SIZE(ZSLIDE_ll),ZSLIDE_ll,TZFMH& + & ,IRESP) + END IF + CALL SECOND_MNH2(T1) + TIMEZ%T_READ3D_READ=TIMEZ%T_READ3D_READ + T1 - T0 + ! + ! put the data in the g_a , this proc get this JKK slide + ! + lo_zplan(JPIZ) = JKK + hi_zplan(JPIZ) = JKK + call nga_put(g_a, lo_zplan, hi_zplan,ZSLIDE_ll, ld_zplan) + END IF + END DO + call ga_sync + ! + ! get the columun data in this proc + ! + ! temp buf to avoid problem with none stride PFIELDS buffer with HALO + ALLOCATE (ZFIELD_GA (SIZE(PFIELD,1),SIZE(PFIELD,2),SIZE(PFIELD,3))) + call nga_get(g_a, lo_col, hi_col,ZFIELD_GA(1,1,1) , ld_col) + PFIELD = ZFIELD_GA + DEALLOCATE(ZFIELD_GA) +#else + ALLOCATE(ZSLIDE_ll(0,0)) + GALLOC_ll = .TRUE. + inb_proc_real = min(TZFD%nb_procio,ISNPROC) + Z_SLIDE: DO JK=1,SIZE(PFIELD,3),inb_proc_real + ! + ! read the data + ! + JK_MAX=min(SIZE(PFIELD,3),JK+inb_proc_real-1) + ! + NB_REQ=0 + ALLOCATE(REQ_TAB(ISNPROC-1)) + ALLOCATE(T_TX2DP(ISNPROC-1)) + DO JKK=JK,JK_MAX + IF (TZFD%NB_PROCIO .GT. 1 ) THEN + IK_FILE = io_file(JKK,TZFD%nb_procio) + write(YK_FILE ,'(".Z",i3.3)') IK_FILE+1 + YFILE_IOZ = TRIM(HFILEM)//YK_FILE//".lfi" + TZFD_IOZ => GETFD(YFILE_IOZ) + ELSE + TZFD_IOZ => TZFD + ENDIF + IK_RANK = TZFD_IOZ%OWNER + IF (ISP == IK_RANK ) THEN + IF ( SIZE(ZSLIDE_ll) .EQ. 0 ) THEN + DEALLOCATE(ZSLIDE_ll) + CALL ALLOCBUFFER_ll(ZSLIDE_ll,ZSLIDE,HDIR,GALLOC_ll) + END IF + !JUAN + CALL SECOND_MNH2(T0) + WRITE(YK,'(I4.4)') JKK + YRECZSLIDE = TRIM(HRECFM)//YK + IF (ASSOCIATED(TZFD_IOZ%CDF)) THEN + CALL NCREAD(TZFD_IOZ%CDF%NCID,YRECZSLIDE,ZSLIDE_ll,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD_IOZ%FLU,YRECZSLIDE,.TRUE.,SIZE(ZSLIDE_ll),ZSLIDE_ll,TZFMH& + & ,IRESP) + END IF + !JUANIOZ + CALL SECOND_MNH2(T1) + TIMEZ%T_READ3D_READ=TIMEZ%T_READ3D_READ + T1 - T0 + DO JI = 1,ISNPROC + CALL GET_DOMREAD_ll(JI,IXO,IXE,IYO,IYE) + TX2DP=>ZSLIDE_ll(IXO:IXE,IYO:IYE) + IF (ISP /= JI) THEN + NB_REQ = NB_REQ + 1 + ALLOCATE(T_TX2DP(NB_REQ)%X(IXO:IXE,IYO:IYE)) + T_TX2DP(NB_REQ)%X=TX2DP + CALL MPI_ISEND(T_TX2DP(NB_REQ)%X,SIZE(TX2DP),MPI_FLOAT,JI-1,199+IK_RANK & + & ,TZFD_IOZ%COMM,REQ_TAB(NB_REQ),IERR) + !CALL MPI_BSEND(TX2DP,SIZE(TX2DP),MPI_FLOAT,JI-1,199+IK_RANK,TZFD_IOZ%COMM,IERR) + ELSE + PFIELD(:,:,JKK) = TX2DP(:,:) + END IF + END DO + CALL SECOND_MNH2(T2) + TIMEZ%T_READ3D_SEND=TIMEZ%T_READ3D_SEND + T2 - T1 + !JUANIOZ + END IF + END DO + ! + ! brodcast the data + ! + IF (HDIR == 'XX' .OR. HDIR =='YY') THEN + ! XX or YY Scatter Field + STOP " XX ou YY NON PREVU SUR BG POUR LE MOMENT " + CALL SCATTER_XXFIELD(HDIR,ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM) + ELSE IF (HDIR == 'XY') THEN + IF (LPACK .AND. L2D) THEN + ! 2D compact case + STOP " L2D NON PREVU SUR BG POUR LE MOMENT " + CALL SCATTER_XXFIELD('XX',ZFIELDP(:,1,:),PFIELD(:,JPHEXT+1,:),TZFD%OWNER,TZFD%COMM) + PFIELD(:,:,:) = SPREAD(PFIELD(:,JPHEXT+1,:),DIM=2,NCOPIES=IHEXTOT) + ELSE + ! + ! XY Scatter Field + ! + CALL SECOND_MNH2(T0) + DO JKK=JK,JK_MAX + ! + ! get the file & rank + ! + IF (TZFD%NB_PROCIO .GT. 1 ) THEN + IK_FILE = io_file(JKK,TZFD%nb_procio) + write(YK_FILE ,'(".Z",i3.3)') IK_FILE+1 + YFILE_IOZ = TRIM(HFILEM)//YK_FILE//".lfi" + TZFD_IOZ => GETFD(YFILE_IOZ) + ELSE + TZFD_IOZ => TZFD + END IF + ! + !IK_RANK = 1 + io_rank(IK_FILE,ISNPROC,TZFD%nb_procio) + IK_RANK = TZFD_IOZ%OWNER + ! + ZSLIDE => PFIELD(:,:,JKK) +!JUANIOZ + !CALL SCATTER_XYFIELD(ZSLIDE_ll,ZSLIDE,TZFD_IOZ%OWNER,TZFD_IOZ%COMM) + IF (ISP .NE. IK_RANK) THEN + CALL MPI_RECV(ZSLIDE,SIZE(ZSLIDE),MPI_FLOAT,IK_RANK-1,199+IK_RANK,TZFD_IOZ%COMM& + & ,STATUS,IERR) + END IF +!JUAN IOZ + END DO + CALL SECOND_MNH2(T1) + TIMEZ%T_READ3D_RECV=TIMEZ%T_READ3D_RECV + T1 - T0 + END IF + ELSE + ! Broadcast Field + STOP " Broadcast Field NON PREVU SUR BG POUR LE MOMENT " + CALL MPI_BCAST(PFIELD,SIZE(PFIELD),MPI_FLOAT,TZFD%OWNER-1,TZFD%COMM,IERR) + END IF + CALL SECOND_MNH2(T0) + IF (NB_REQ .GT.0 ) THEN + CALL MPI_WAITALL(NB_REQ,REQ_TAB,MNH_STATUSES_IGNORE,IERR) + DO JI=1,NB_REQ ; DEALLOCATE(T_TX2DP(JI)%X) ; ENDDO + END IF + DEALLOCATE(T_TX2DP) + DEALLOCATE(REQ_TAB) + CALL SECOND_MNH2(T1) + TIMEZ%T_READ3D_WAIT=TIMEZ%T_READ3D_WAIT + T1 - T0 + END DO Z_SLIDE + ! + CALL BCAST_HEADER(TZFD,TZFMH) + ! +#endif +!JUAN BG Z SLIDE + END IF !(GSMONOPROC) + + KGRID = TZFMH%GRID + KLENCH = TZFMH%COMLEN + HCOMMENT = TZFMH%COMMENT(1:TZFMH%COMLEN) +ELSE + IRESP = -61 +END IF +!---------------------------------------------------------------- +1000 CONTINUE +!! Error handler +IF (IRESP.NE.0) THEN + CALL FM_READ_ERR("FMREADX3_ll",HFILEM,HFIPRI,HRECFM,HDIR,IRESP) +ENDIF +IF (GALLOC) DEALLOCATE (ZFIELDP) +IF (GALLOC_ll) DEALLOCATE (ZSLIDE_ll) +!IF (ASSOCIATED(ZSLIDE_ll)) DEALLOCATE (ZSLIDE_ll) +KRESP = IRESP +CALL MPI_BARRIER(TZFD%COMM,IERR) +CALL SECOND_MNH2(T22) +TIMEZ%T_READ3D_ALL=TIMEZ%T_READ3D_ALL + T22 - T11 + +!------------------------------------------------------------------ +END SUBROUTINE FMREADX3_ll + +SUBROUTINE FMREADX4_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& + KLENCH,HCOMMENT,KRESP) +USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LPACK,L1D,L2D +USE MODD_PARAMETERS_ll,ONLY : JPHEXT +USE MODD_FM +USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL +USE MODE_SCATTER_ll +USE MODE_ALLOCBUFFER_ll + +CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name +CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read +CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages +CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form +REAL,DIMENSION(:,:,:,:),TARGET,INTENT(INOUT)::PFIELD ! array containing the data field +INTEGER, INTENT(INOUT)::KGRID ! C-grid indicator (u,v,w,T) +INTEGER, INTENT(INOUT)::KLENCH ! length of comment string +CHARACTER(LEN=*), INTENT(INOUT)::HCOMMENT ! comment string +INTEGER, INTENT(INOUT)::KRESP ! return-code if +! +! +!* 0.2 Declarations of local variables +! +CHARACTER(LEN=JPFINL) :: YFNLFI +INTEGER :: IERR +TYPE(FD_ll), POINTER :: TZFD +INTEGER :: IRESP +REAL,DIMENSION(:,:,:,:),POINTER :: ZFIELDP +LOGICAL :: GALLOC +TYPE(FMHEADER) :: TZFMH +INTEGER :: IHEXTOT +! +!* 1.1 THE NAME OF LFIFM +! +GALLOC = .FALSE. +IRESP = 0 +YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' +!------------------------------------------------------------------ +IHEXTOT = 2*JPHEXT+1 +TZFD=>GETFD(YFNLFI) +IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution +! IF (LPACK .AND. L1D .AND. HDIR=='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 (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + END IF + PFIELD(:,:,:,:)=SPREAD(SPREAD(PFIELD(JPHEXT+1,JPHEXT+1,:,:),DIM=1,NCOPIES=IHEXTOT),DIM=2,NCOPIES=IHEXTOT) +! ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN + ELSE IF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + ZFIELDP=>PFIELD(:,JPHEXT+1:JPHEXT+1,:,:) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + END IF + PFIELD(:,:,:,:)=SPREAD(PFIELD(:,JPHEXT+1,:,:),DIM=2,NCOPIES=IHEXTOT) + ELSE + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,PFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + END IF + END IF + IF (IRESP /= 0) GOTO 1000 + ELSE + IF (ISP == TZFD%OWNER) THEN + CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + & ,IRESP) + END IF + ELSE + ALLOCATE(ZFIELDP(0,0,0,0)) + GALLOC = .TRUE. + END IF + ! + CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) + IF (IRESP /= 0) GOTO 1000 + ! + CALL BCAST_HEADER(TZFD,TZFMH) + ! + IF (HDIR == 'XX' .OR. HDIR =='YY') THEN + ! XX or YY Scatter Field + CALL SCATTER_XXFIELD(HDIR,ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM) + ELSE IF (HDIR == 'XY') THEN + IF (LPACK .AND. L2D) THEN + ! 2D compact case + CALL SCATTER_XXFIELD('XX',ZFIELDP(:,1,:,:),PFIELD(:,JPHEXT+1,:,:),TZFD%OWNER,TZFD%COMM) + PFIELD(:,:,:,:) = SPREAD(PFIELD(:,JPHEXT+1,:,:),DIM=2,NCOPIES=IHEXTOT) + ELSE + ! XY Scatter Field + CALL SCATTER_XYFIELD(ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM) + END IF + ELSE + ! Broadcast Field + CALL MPI_BCAST(PFIELD,SIZE(PFIELD),MPI_FLOAT,TZFD%OWNER-1,TZFD%COMM,IERR) + END IF + END IF + KGRID = TZFMH%GRID + KLENCH = TZFMH%COMLEN + HCOMMENT = TZFMH%COMMENT(1:TZFMH%COMLEN) +ELSE + IRESP = -61 +END IF +!---------------------------------------------------------------- +1000 CONTINUE +!! Error handler +IF (IRESP.NE.0) THEN + CALL FM_READ_ERR("FMREADX4_ll",HFILEM,HFIPRI,HRECFM,HDIR,IRESP) +ENDIF + +IF (GALLOC) DEALLOCATE (ZFIELDP) +KRESP = IRESP +RETURN +!------------------------------------------------------------------ +END SUBROUTINE FMREADX4_ll + +SUBROUTINE FMREADX5_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& + KLENCH,HCOMMENT,KRESP) +USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LPACK,L1D,L2D +USE MODD_PARAMETERS_ll,ONLY : JPHEXT +USE MODD_FM +USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL +USE MODE_SCATTER_ll +USE MODE_ALLOCBUFFER_ll + +CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name +CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read +CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages +CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form +REAL,DIMENSION(:,:,:,:,:),TARGET,INTENT(INOUT)::PFIELD ! array containing the data field +INTEGER, INTENT(INOUT)::KGRID ! C-grid indicator (u,v,w,T) +INTEGER, INTENT(INOUT)::KLENCH ! length of comment string +CHARACTER(LEN=*), INTENT(INOUT)::HCOMMENT ! comment string +INTEGER, INTENT(INOUT)::KRESP ! return-code +! +! +!* 0.2 Declarations of local variables +! +CHARACTER(LEN=JPFINL) :: YFNLFI +INTEGER :: IERR +TYPE(FD_ll), POINTER :: TZFD +INTEGER :: IRESP +REAL,DIMENSION(:,:,:,:,:),POINTER :: ZFIELDP +LOGICAL :: GALLOC +TYPE(FMHEADER) :: TZFMH +INTEGER :: IHEXTOT +! +!* 1.1 THE NAME OF LFIFM +! +GALLOC = .FALSE. +IRESP = 0 +YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' +!------------------------------------------------------------------ +IHEXTOT = 2*JPHEXT+1 +TZFD=>GETFD(YFNLFI) +IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution +! IF (LPACK .AND. L1D .AND. HDIR=='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 (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + END IF + PFIELD(:,:,:,:,:)=SPREAD(SPREAD(PFIELD(JPHEXT+1,JPHEXT+1,:,:,:),DIM=1,NCOPIES=IHEXTOT),DIM=2,NCOPIES=IHEXTOT) +! ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN + ELSE IF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + ZFIELDP=>PFIELD(:,JPHEXT+1:JPHEXT+1,:,:,:) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + END IF + PFIELD(:,:,:,:,:)=SPREAD(PFIELD(:,JPHEXT+1,:,:,:),DIM=2,NCOPIES=IHEXTOT) + ELSE + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,PFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + END IF + END IF + IF (IRESP /= 0) GOTO 1000 + ELSE ! multiprocessor execution + IF (ISP == TZFD%OWNER) THEN + CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + & ,IRESP) + END IF + ELSE + ALLOCATE(ZFIELDP(0,0,0,0,0)) + GALLOC = .TRUE. + END IF + ! + CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) + IF (IRESP /= 0) GOTO 1000 + ! + CALL BCAST_HEADER(TZFD,TZFMH) + ! + IF (HDIR == 'XX' .OR. HDIR =='YY') THEN + ! XX or YY Scatter Field + CALL SCATTER_XXFIELD(HDIR,ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM) + ELSE IF (HDIR == 'XY') THEN + IF (LPACK .AND. L2D) THEN + ! 2D compact case + CALL SCATTER_XXFIELD('XX',ZFIELDP(:,1,:,:,:),PFIELD(:,JPHEXT+1,:,:,:),& + & TZFD%OWNER,TZFD%COMM) + PFIELD(:,:,:,:,:) = SPREAD(PFIELD(:,JPHEXT+1,:,:,:),DIM=2,NCOPIES=IHEXTOT) + ELSE + ! XY Scatter Field + CALL SCATTER_XYFIELD(ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM) + END IF + ELSE + ! Broadcast Field + CALL MPI_BCAST(PFIELD,SIZE(PFIELD),MPI_FLOAT,TZFD%OWNER-1,TZFD%COMM,IERR) + END IF + END IF + KGRID = TZFMH%GRID + KLENCH = TZFMH%COMLEN + HCOMMENT = TZFMH%COMMENT(1:TZFMH%COMLEN) +ELSE + IRESP = -61 +END IF +!---------------------------------------------------------------- +1000 CONTINUE +!! Error handler +IF (IRESP.NE.0) THEN + CALL FM_READ_ERR("FMREADX5_ll",HFILEM,HFIPRI,HRECFM,HDIR,IRESP) +ENDIF +IF (GALLOC) DEALLOCATE (ZFIELDP) +KRESP = IRESP +RETURN +!------------------------------------------------------------------ +END SUBROUTINE FMREADX5_ll + +SUBROUTINE FMREADX6_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& + KLENCH,HCOMMENT,KRESP) +USE MODD_IO_ll, ONLY : ISP,GSMONOPROC +USE MODD_FM +USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL +USE MODE_SCATTER_ll +USE MODE_ALLOCBUFFER_ll + +CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name +CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read +CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages +CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form +REAL,DIMENSION(:,:,:,:,:,:),TARGET,INTENT(INOUT)::PFIELD ! array containing the data field +INTEGER, INTENT(INOUT)::KGRID ! C-grid indicator (u,v,w,T) +INTEGER, INTENT(INOUT)::KLENCH ! length of comment string +CHARACTER(LEN=*), INTENT(INOUT)::HCOMMENT ! comment string +INTEGER, INTENT(INOUT)::KRESP ! return-code +! +! +!* 0.2 Declarations of local variables +! +CHARACTER(LEN=JPFINL) :: YFNLFI +INTEGER :: IERR +TYPE(FD_ll), POINTER :: TZFD +INTEGER :: IRESP +REAL,DIMENSION(:,:,:,:,:,:),POINTER :: ZFIELDP +LOGICAL :: GALLOC +TYPE(FMHEADER) :: TZFMH +! +!* 1.1 THE NAME OF LFIFM +! +GALLOC = .FALSE. +IRESP = 0 +YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' +!------------------------------------------------------------------ +TZFD=>GETFD(YFNLFI) +IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,PFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + END IF + IF (IRESP /= 0) GOTO 1000 + ELSE ! multiprocessor execution + IF (ISP == TZFD%OWNER) THEN + CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + & ,IRESP) + END IF + ELSE + ALLOCATE(ZFIELDP(0,0,0,0,0,0)) + GALLOC = .TRUE. + END IF + ! + CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) + IF (IRESP /= 0) GOTO 1000 + ! + CALL BCAST_HEADER(TZFD,TZFMH) + ! + IF (HDIR == 'XX' .OR. HDIR =='YY') THEN + ! XX or YY Scatter Field + CALL SCATTER_XXFIELD(HDIR,ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM) + ELSE IF (HDIR == 'XY') THEN + ! XY Scatter Field + CALL SCATTER_XYFIELD(ZFIELDP,PFIELD,TZFD%OWNER,TZFD%COMM) + ELSE + ! Broadcast Field + CALL MPI_BCAST(PFIELD,SIZE(PFIELD),MPI_FLOAT,TZFD%OWNER-1,TZFD%COMM,IERR) + END IF + END IF + KGRID = TZFMH%GRID + KLENCH = TZFMH%COMLEN + HCOMMENT = TZFMH%COMMENT(1:TZFMH%COMLEN) +ELSE + IRESP = -61 +END IF +!---------------------------------------------------------------- +1000 CONTINUE +!! Error handler +IF (IRESP.NE.0) THEN + CALL FM_READ_ERR("FMREADX6_ll",HFILEM,HFIPRI,HRECFM,HDIR,IRESP) +ENDIF +IF (GALLOC) DEALLOCATE (ZFIELDP) +KRESP = IRESP +RETURN +!------------------------------------------------------------------ +END SUBROUTINE FMREADX6_ll + +SUBROUTINE FMREADN0_ll(HFILEM,HRECFM,HFIPRI,HDIR,KFIELD,KGRID,& + KLENCH,HCOMMENT,KRESP) +USE MODD_IO_ll, ONLY : ISP,GSMONOPROC +USE MODD_FM +USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL + +! +!* 0. DECLARATIONS +! ------------ +! +! +!* 0.1 Declarations of arguments +! +CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name +CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read +CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages +CHARACTER(LEN=*), INTENT(IN) ::HDIR ! Field form +INTEGER, INTENT(INOUT)::KFIELD ! array containing the data field +INTEGER, INTENT(INOUT)::KGRID ! C-grid indicator (u,v,w,T) +INTEGER, INTENT(INOUT)::KLENCH ! length of comment string +CHARACTER(LEN=*), INTENT(INOUT)::HCOMMENT ! comment string +INTEGER, INTENT(INOUT)::KRESP ! return-code +! +!* 0.2 Declarations of local variables +! +CHARACTER(LEN=JPFINL) :: YFNLFI +INTEGER :: IERR +TYPE(FD_ll), POINTER :: TZFD +INTEGER :: IRESP +TYPE(FMHEADER) :: TZFMH + +! +!* 1.1 THE NAME OF LFIFM +! +IRESP = 0 +YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' +! +TZFD=>GETFD(YFNLFI) +IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,KFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP) + END IF + IF (IRESP /= 0) GOTO 1000 + ELSE + IF (ISP == TZFD%OWNER) THEN + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,KFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP) + END IF + END IF + ! + CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) + IF (IRESP /= 0) GOTO 1000 + ! + CALL BCAST_HEADER(TZFD,TZFMH) + ! + CALL MPI_BCAST(KFIELD,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) + END IF + KGRID = TZFMH%GRID + KLENCH = TZFMH%COMLEN + HCOMMENT = TZFMH%COMMENT(1:TZFMH%COMLEN) +ELSE + IRESP = -61 +END IF +!---------------------------------------------------------------- +1000 CONTINUE +!! Error handler +IF (IRESP.NE.0) THEN + CALL FM_READ_ERR("FMREADN0_ll",HFILEM,HFIPRI,HRECFM,HDIR,IRESP) +ENDIF +KRESP = IRESP +RETURN + +END SUBROUTINE FMREADN0_ll + +SUBROUTINE FMREADN1_ll(HFILEM,HRECFM,HFIPRI,HDIR,KFIELD,KGRID,& + KLENCH,HCOMMENT,KRESP) +USE MODD_IO_ll, ONLY : ISP,GSMONOPROC +USE MODD_FM +USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL +USE MODE_SCATTER_ll +USE MODE_ALLOCBUFFER_ll + +!* 0. DECLARATIONS +! ------------ +! +! +!* 0.1 Declarations of arguments +! +CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name +CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read +CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages +CHARACTER(LEN=*), INTENT(IN) ::HDIR ! Field form +INTEGER,DIMENSION(:),TARGET,INTENT(INOUT)::KFIELD ! array containing the data field +INTEGER, INTENT(INOUT)::KGRID ! C-grid indicator (u,v,w,T) +INTEGER, INTENT(INOUT)::KLENCH ! length of comment string +CHARACTER(LEN=*), INTENT(INOUT)::HCOMMENT ! comment string +INTEGER, INTENT(INOUT)::KRESP ! return-code +! +!* 0.2 Declarations of local variables +! +CHARACTER(LEN=JPFINL) :: YFNLFI +INTEGER :: IERR +TYPE(FD_ll), POINTER :: TZFD +INTEGER :: IRESP +INTEGER,DIMENSION(:),POINTER :: IFIELDP +LOGICAL :: GALLOC +TYPE(FMHEADER) :: TZFMH +! +!* 1.1 THE NAME OF LFIFM +! +GALLOC = .FALSE. +IRESP = 0 +YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' +!------------------------------------------------------------------ +TZFD=>GETFD(YFNLFI) +IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,KFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(KFIELD),KFIELD,TZFMH,IRESP) + END IF + IF (IRESP /= 0) GOTO 1000 + ELSE + IF (ISP == TZFD%OWNER) THEN + CALL ALLOCBUFFER_ll(IFIELDP,KFIELD,HDIR,GALLOC) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,IFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH& + & ,IRESP) + END IF + ELSE + ALLOCATE(IFIELDP(0)) + GALLOC = .TRUE. + END IF + ! + CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) + IF (IRESP /= 0) GOTO 1000 + ! + CALL BCAST_HEADER(TZFD,TZFMH) + ! + IF (HDIR /= 'XX' .AND. HDIR /='YY') THEN + ! Broadcast Field + CALL MPI_BCAST(KFIELD,SIZE(KFIELD),MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) + ELSE + !Scatter Field + CALL SCATTER_XXFIELD(HDIR,IFIELDP,KFIELD,TZFD%OWNER,TZFD%COMM) + END IF + END IF + KGRID = TZFMH%GRID + KLENCH = TZFMH%COMLEN + HCOMMENT = TZFMH%COMMENT(1:TZFMH%COMLEN) +ELSE + IRESP = -61 +END IF +!---------------------------------------------------------------- +1000 CONTINUE +!! Error handler +IF (IRESP.NE.0) THEN + CALL FM_READ_ERR("FMREADN1_ll",HFILEM,HFIPRI,HRECFM,HDIR,IRESP) +ENDIF +IF (GALLOC) DEALLOCATE (IFIELDP) +KRESP = IRESP +RETURN + +END SUBROUTINE FMREADN1_ll + +SUBROUTINE FMREADN2_ll(HFILEM,HRECFM,HFIPRI,HDIR,KFIELD,KGRID,& + KLENCH,HCOMMENT,KRESP) +USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LPACK,L1D,L2D +USE MODD_PARAMETERS_ll,ONLY : JPHEXT +USE MODD_FM +USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL +USE MODE_SCATTER_ll +USE MODE_ALLOCBUFFER_ll + +CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name +CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read +CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages +CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form +INTEGER, DIMENSION(:,:),TARGET,INTENT(INOUT)::KFIELD ! array containing the data field +INTEGER, INTENT(INOUT)::KGRID ! C-grid indicator (u,v,w,T) +INTEGER, INTENT(INOUT)::KLENCH ! length of comment string +CHARACTER(LEN=*), INTENT(INOUT)::HCOMMENT ! comment string +INTEGER, INTENT(INOUT)::KRESP ! return-code +! +! +!* 0.2 Declarations of local variables +! +CHARACTER(LEN=JPFINL) :: YFNLFI +INTEGER :: IERR +TYPE(FD_ll), POINTER :: TZFD +INTEGER :: IRESP +INTEGER,DIMENSION(:,:),POINTER :: IFIELDP +LOGICAL :: GALLOC +TYPE(FMHEADER) :: TZFMH +INTEGER :: IHEXTOT +! +!* 1.1 THE NAME OF LFIFM +! +GALLOC = .FALSE. +IRESP = 0 +YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' +!------------------------------------------------------------------ +IHEXTOT = 2*JPHEXT+1 +TZFD=>GETFD(YFNLFI) +IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution +! IF (LPACK .AND. L1D .AND. HDIR=='XY') THEN + IF (LPACK .AND. L1D .AND. SIZE(KFIELD,1)==IHEXTOT .AND. SIZE(KFIELD,2)==IHEXTOT) THEN + IFIELDP=>KFIELD(JPHEXT+1:JPHEXT+1,JPHEXT+1:JPHEXT+1) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,IFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH,IRESP) + END IF + KFIELD(:,:)=SPREAD(SPREAD(KFIELD(JPHEXT+1,JPHEXT+1),DIM=1,NCOPIES=IHEXTOT),DIM=2,NCOPIES=IHEXTOT) +! ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN + ELSE IF (LPACK .AND. L2D .AND. SIZE(KFIELD,2)==IHEXTOT) THEN + IFIELDP=>KFIELD(:,JPHEXT+1:JPHEXT+1) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,IFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH,IRESP) + END IF + KFIELD(:,:)=SPREAD(KFIELD(:,JPHEXT+1),DIM=2,NCOPIES=IHEXTOT) + ELSE + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,KFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(KFIELD),KFIELD,TZFMH,IRESP) + END IF + END IF + IF (IRESP /= 0) GOTO 1000 + ELSE + IF (ISP == TZFD%OWNER) THEN + CALL ALLOCBUFFER_ll(IFIELDP,KFIELD,HDIR,GALLOC) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,IFIELDP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP& + & ,TZFMH,IRESP) + END IF + ELSE + ALLOCATE(IFIELDP(0,0)) + GALLOC = .TRUE. + END IF + ! + CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) + IF (IRESP /= 0) GOTO 1000 + ! + CALL BCAST_HEADER(TZFD,TZFMH) + ! + IF (HDIR == 'XX' .OR. HDIR =='YY') THEN + ! XX or YY Scatter Field + CALL SCATTER_XXFIELD(HDIR,IFIELDP,KFIELD,TZFD%OWNER,TZFD& + & %COMM) + ELSE IF (HDIR == 'XY') THEN + IF (LPACK .AND. L2D) THEN + ! 2D compact case + CALL SCATTER_XXFIELD('XX',IFIELDP(:,1),KFIELD(:,JPHEXT+1),TZFD%OWNER,TZFD%COMM) + KFIELD(:,:) = SPREAD(KFIELD(:,JPHEXT+1),DIM=2,NCOPIES=IHEXTOT) + ELSE + ! XY Scatter Field + CALL SCATTER_XYFIELD(IFIELDP,KFIELD,TZFD%OWNER,TZFD%COMM) + END IF + ELSE + ! Broadcast Field + IF (ISP == TZFD%OWNER) KFIELD = IFIELDP + CALL MPI_BCAST(KFIELD,SIZE(KFIELD),MPI_INTEGER,TZFD%OWNER-1& + & ,TZFD%COMM,IERR) + END IF + END IF + KGRID = TZFMH%GRID + KLENCH = TZFMH%COMLEN + HCOMMENT = TZFMH%COMMENT(1:TZFMH%COMLEN) +ELSE + IRESP = -61 +END IF +!---------------------------------------------------------------- +1000 CONTINUE +!! Error handler +IF (IRESP.NE.0) THEN + CALL FM_READ_ERR("FMREADN2_ll",HFILEM,HFIPRI,HRECFM,HDIR,IRESP) +ENDIF +! +IF (GALLOC) DEALLOCATE (IFIELDP) +KRESP = IRESP +RETURN +!------------------------------------------------------------------ +END SUBROUTINE FMREADN2_ll + + +SUBROUTINE FMREADL0_ll(HFILEM,HRECFM,HFIPRI,HDIR,OFIELD,KGRID,& + KLENCH,HCOMMENT,KRESP) +USE MODD_IO_ll, ONLY : ISP,GSMONOPROC +USE MODD_FM +USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL + +!* 0. DECLARATIONS +! ------------ +! +! +!* 0.1 Declarations of arguments +! +CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name +CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read +CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages +CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form +LOGICAL, INTENT(INOUT)::OFIELD ! array containing the data field +INTEGER, INTENT(INOUT)::KGRID ! C-grid indicator (u,v,w,T) +INTEGER, INTENT(INOUT)::KLENCH ! length of comment string +CHARACTER(LEN=*), INTENT(INOUT)::HCOMMENT ! comment string +INTEGER, INTENT(INOUT)::KRESP ! return-code +! +!* 0.2 Declarations of local variables +! +CHARACTER(LEN=JPFINL) :: YFNLFI +INTEGER :: IERR +TYPE(FD_ll), POINTER :: TZFD +INTEGER :: IRESP +INTEGER :: IFIELD +TYPE(FMHEADER) :: TZFMH + +! +!* 1.1 THE NAME OF LFIFM +! +IRESP = 0 +YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' +!------------------------------------------------------------------ +TZFD=>GETFD(YFNLFI) +IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,IFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,1,IFIELD,TZFMH,IRESP) + END IF + IF (IRESP /= 0) GOTO 1000 + ELSE + IF (ISP == TZFD%OWNER) THEN + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,IFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,1,IFIELD,TZFMH,IRESP) + END IF + END IF + ! + CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) + IF (IRESP /= 0) GOTO 1000 + ! + CALL BCAST_HEADER(TZFD,TZFMH) + ! + CALL MPI_BCAST(IFIELD,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,& + & IERR) + END IF + IF (IFIELD==1) THEN + OFIELD=.TRUE. + ELSE + OFIELD=.FALSE. + END IF + KGRID = TZFMH%GRID + KLENCH = TZFMH%COMLEN + HCOMMENT = TZFMH%COMMENT(1:TZFMH%COMLEN) +ELSE + IRESP = -61 +END IF +!---------------------------------------------------------------- +1000 CONTINUE +!! Error handler +IF (IRESP.NE.0) THEN + CALL FM_READ_ERR("FMREADL0_ll",HFILEM,HFIPRI,HRECFM,HDIR,IRESP) +ENDIF +KRESP = IRESP +RETURN + +END SUBROUTINE FMREADL0_ll + +SUBROUTINE FMREADL1_ll(HFILEM,HRECFM,HFIPRI,HDIR,OFIELD,KGRID,& + KLENCH,HCOMMENT,KRESP) +USE MODD_IO_ll, ONLY : ISP,GSMONOPROC +USE MODD_FM +USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL +! +!* 0. DECLARATIONS +! ------------ +! +IMPLICIT NONE +! +!* 0.1 Declarations of arguments +! +CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name +CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read +CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages +CHARACTER(LEN=*), INTENT(IN) ::HDIR ! Field form +LOGICAL, DIMENSION(:), INTENT(INOUT)::OFIELD ! array containing the data field +INTEGER, INTENT(INOUT)::KGRID ! C-grid indicator (u,v,w,T) +INTEGER, INTENT(INOUT)::KLENCH ! length of comment string +CHARACTER(LEN=*), INTENT(INOUT)::HCOMMENT ! comment string +INTEGER, INTENT(INOUT)::KRESP ! return-code +! +!* 0.2 Declarations of local variables +! + +CHARACTER(LEN=JPFINL) :: YFNLFI +INTEGER :: IERR +TYPE(FD_ll), POINTER :: TZFD +INTEGER :: IRESP +INTEGER, DIMENSION(SIZE(OFIELD)) :: IFIELD +TYPE(FMHEADER) :: TZFMH + +! +!* 1.1 THE NAME OF LFIFM +! +IRESP = 0 +YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' +! +TZFD=>GETFD(YFNLFI) +IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,IFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELD),IFIELD,TZFMH& + & ,IRESP) + END IF + IF (IRESP /= 0) GOTO 1000 + ELSE + IF (ISP == TZFD%OWNER) THEN + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,IFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELD),IFIELD,TZFMH& + & ,IRESP) + END IF + END IF + ! + CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) + IF (IRESP /= 0) GOTO 1000 + ! + CALL BCAST_HEADER(TZFD,TZFMH) + ! + CALL MPI_BCAST(IFIELD,SIZE(IFIELD),MPI_INTEGER,TZFD%OWNER-1,TZFD& + & %COMM,IERR) + END IF + WHERE (IFIELD==1) + OFIELD=.TRUE. + ELSEWHERE + OFIELD=.FALSE. + END WHERE + KGRID = TZFMH%GRID + KLENCH = TZFMH%COMLEN + HCOMMENT = TZFMH%COMMENT(1:TZFMH%COMLEN) +ELSE + IRESP = -61 +END IF +!---------------------------------------------------------------- +1000 CONTINUE +!! Error handler +IF (IRESP.NE.0) THEN + CALL FM_READ_ERR("FMREADL1_ll",HFILEM,HFIPRI,HRECFM,HDIR,IRESP) +ENDIF +KRESP = IRESP +RETURN + +END SUBROUTINE FMREADL1_ll + +SUBROUTINE FMREADC0_ll(HFILEM,HRECFM,HFIPRI,HDIR,HFIELD,KGRID,& + KLENCH,HCOMMENT,KRESP) +USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIREAD +USE MODD_FM +USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL +! +!* 0. DECLARATIONS +! ------------ +! +! +!* 0.1 Declarations of arguments +! +CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name +CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read +CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages +CHARACTER(LEN=*), INTENT(IN) ::HDIR ! Field form +CHARACTER(LEN=*), INTENT(INOUT)::HFIELD ! array containing the data field +INTEGER, INTENT(INOUT)::KGRID ! C-grid indicator (u,v,w,T) +INTEGER, INTENT(INOUT)::KLENCH ! length of comment string +CHARACTER(LEN=*), INTENT(INOUT)::HCOMMENT ! comment string +INTEGER, INTENT(INOUT)::KRESP ! return-code +! +!* 0.2 Declarations of local variables +! +CHARACTER(LEN=JPFINL) :: YFNLFI +INTEGER :: IERR +TYPE(FD_ll), POINTER :: TZFD +INTEGER :: IRESP +INTEGER :: JLOOP +INTEGER, DIMENSION(LEN(HFIELD)) :: IFIELD +CHARACTER(LEN(HFIELD)) :: YFIELD +INTEGER :: ILENG +TYPE(FMHEADER) :: TZFMH + +! +!* 1.1 THE NAME OF LFIFM +! +IRESP = 0 +YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' +ILENG=LEN(HFIELD) +! +TZFD=>GETFD(YFNLFI) +IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,YFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,IRESP) + END IF + IF (IRESP /= 0) GOTO 1000 + ELSE ! parallel execution + IF (ISP == TZFD%OWNER) THEN + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,YFIELD,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,IRESP) + END IF + END IF + ! + CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) + IF (IRESP /= 0) GOTO 1000 + ! + CALL BCAST_HEADER(TZFD,TZFMH) + ! + IF (LIOCDF4 .AND. .NOT. LLFIREAD) THEN + ! NetCDF + CALL MPI_BCAST(YFIELD,ILENG,MPI_CHARACTER,TZFD%OWNER-1,TZFD%COMM,& + &IERR) + ELSE + ! LFI + CALL MPI_BCAST(IFIELD,ILENG,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,& + & IERR) + END IF + END IF ! parallel execution + ! + IF (LIOCDF4 .AND. .NOT. LLFIREAD) THEN + ! NetCDF + HFIELD = YFIELD + ELSE + ! LFI Case + DO JLOOP=1,ILENG + HFIELD(JLOOP:JLOOP)=ACHAR(IFIELD(JLOOP)) + END DO + END IF + KGRID = TZFMH%GRID + KLENCH = TZFMH%COMLEN + HCOMMENT = TZFMH%COMMENT(1:TZFMH%COMLEN) +ELSE + IRESP = -61 +END IF +!---------------------------------------------------------------- +1000 CONTINUE +!! Error handler +IF (IRESP.NE.0) THEN + CALL FM_READ_ERR("FMREADC0_ll",HFILEM,HFIPRI,HRECFM,HDIR,IRESP) +ENDIF +KRESP = IRESP +RETURN + +END SUBROUTINE FMREADC0_ll + +SUBROUTINE FMREADT0_ll(HFILEM,HRECFM,HFIPRI,HDIR,TFIELD,KGRID,& + KLENCH,HCOMMENT,KRESP) +!* 0. DECLARATIONS +! ------------ +! +USE MODD_IO_ll, ONLY : ISP,GSMONOPROC +USE MODD_TYPE_DATE +USE MODD_FM +USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL +! +!* 0.1 Declarations of arguments +! +CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name +CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read +CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages +CHARACTER(LEN=*), INTENT(IN) ::HDIR ! Field form +TYPE (DATE_TIME), INTENT(INOUT)::TFIELD ! array containing the data field +INTEGER, INTENT(INOUT)::KGRID ! C-grid indicator (u,v,w,T) +INTEGER, INTENT(INOUT)::KLENCH ! length of comment string +CHARACTER(LEN=*), INTENT(INOUT)::HCOMMENT ! comment string +INTEGER, INTENT(INOUT)::KRESP ! return-code +! +! +!* 0.2 Declarations of local variables +! +!------------------------------------------------------------------------------- + + +CHARACTER(LEN=JPFINL) :: YFNLFI +INTEGER :: IERR +TYPE(FD_ll), POINTER :: TZFD +INTEGER :: IRESP +INTEGER,DIMENSION(3) :: ITDATE +REAL :: ZTIME +TYPE(FMHEADER) :: TZFMH + +! +!* 1.1 THE NAME OF LFIFM +! +IRESP = 0 + +YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' + +TZFD=>GETFD(YFNLFI) +IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,TRIM(HRECFM)//'%TDATE',ITDATE,TZFMH,IRESP) + CALL NCREAD(TZFD%CDF%NCID,TRIM(HRECFM)//'%TIME',ZTIME,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,TRIM(HRECFM)//'%TDATE',.FALSE.,3,ITDATE& + & ,TZFMH,IRESP) + CALL FM_READ_ll(TZFD%FLU,TRIM(HRECFM)//'%TIME',.TRUE.,1,ZTIME& + & ,TZFMH,IRESP) + END IF + IF (IRESP /= 0) GOTO 1000 + ELSE + IF (ISP == TZFD%OWNER) THEN + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,TRIM(HRECFM)//'%TDATE',ITDATE,TZFMH,IRESP) + CALL NCREAD(TZFD%CDF%NCID,TRIM(HRECFM)//'%TIME',ZTIME,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,TRIM(HRECFM)//'%TDATE',.FALSE.,3,ITDATE& + & ,TZFMH,IRESP) + CALL FM_READ_ll(TZFD%FLU,TRIM(HRECFM)//'%TIME',.TRUE.,1,ZTIME& + & ,TZFMH,IRESP) + + END IF + END IF + ! + CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) + IF (IRESP /= 0) GOTO 1000 + ! Last header is significant + CALL BCAST_HEADER(TZFD,TZFMH) + ! + CALL MPI_BCAST(ITDATE,3,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) + CALL MPI_BCAST(ZTIME,1,MPI_FLOAT,TZFD%OWNER-1,TZFD%COMM,IERR) + END IF + TFIELD%TDATE = DATE(ITDATE(1),ITDATE(2),ITDATE(3)) + TFIELD%TIME = ZTIME + KGRID = TZFMH%GRID + KLENCH = TZFMH%COMLEN + HCOMMENT = TZFMH%COMMENT(1:TZFMH%COMLEN) +ELSE + IRESP = -61 +END IF +!---------------------------------------------------------------- +1000 CONTINUE +!! Error handler +IF (IRESP.NE.0) THEN + CALL FM_READ_ERR("FMREADT0_ll",HFILEM,HFIPRI,HRECFM,HDIR,IRESP) +ENDIF +KRESP = IRESP +RETURN + +END SUBROUTINE FMREADT0_ll + +SUBROUTINE FMREAD_LB(HFILEM,HRECFM,HFIPRI,HLBTYPE,PLB,KRIM,KL3D,& + & KGRID,KLENCH,HCOMMENT,KRESP) +USE MODD_FM +USE MODD_IO_ll, ONLY : ISP,ISNPROC,GSMONOPROC,LPACK,L2D +USE MODD_PARAMETERS_ll,ONLY : JPHEXT +USE MODE_DISTRIB_LB +USE MODE_TOOLS_ll, ONLY : GET_GLOBALDIMS_ll +USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL +!JUANZ +USE MODD_TIMEZ, ONLY : TIMEZ +USE MODE_MNH_TIMING, ONLY : SECOND_MNH2 +!JUANZ +USE MODD_VAR_ll, ONLY : MNH_STATUSES_IGNORE + +CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! file name +CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to be written +CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! file for prints +CHARACTER(LEN=*), INTENT(IN) ::HLBTYPE ! 'LBX','LBXU','LBY' or 'LBYV' +REAL, DIMENSION(:,:,:),TARGET, INTENT(INOUT)::PLB ! array containing the LB field +INTEGER, INTENT(IN) :: KRIM ! size of the LB area +INTEGER, INTENT(IN) :: KL3D ! size of the LB array in FM +INTEGER, INTENT(INOUT)::KGRID ! C-grid indicator (u,v,w,T) +INTEGER, INTENT(INOUT)::KLENCH ! length of comment string +CHARACTER(LEN=*), INTENT(INOUT)::HCOMMENT ! comment string +INTEGER, INTENT(INOUT)::KRESP ! return-code +! +!* 0.2 Declarations of local variables +! +CHARACTER(LEN=JPFINL) :: YFNLFI +INTEGER :: IERR +TYPE(FD_ll), POINTER :: TZFD +INTEGER :: IRESP +REAL,DIMENSION(:,:,:),ALLOCATABLE,TARGET :: Z3D +REAL,DIMENSION(:,:,:), POINTER :: TX3DP +TYPE(FMHEADER) :: TZFMH +INTEGER :: IIMAX_ll,IJMAX_ll +INTEGER :: IIB,IIE,IJB,IJE +INTEGER :: JI +INTEGER, DIMENSION(MPI_STATUS_SIZE) :: STATUS +INTEGER, ALLOCATABLE,DIMENSION(:,:) :: STATUSES +!JUANZIO +!JUAN INTEGER,SAVE,DIMENSION(100000) :: REQ_TAB +INTEGER,ALLOCATABLE,DIMENSION(:) :: REQ_TAB +INTEGER :: NB_REQ,IKU +TYPE TX_3DP +REAL,DIMENSION(:,:,:), POINTER :: X +END TYPE +TYPE(TX_3DP),ALLOCATABLE,DIMENSION(:) :: T_TX3DP +REAL*8,DIMENSION(2) :: T0,T1,T2,T3 +REAL*8,DIMENSION(2) :: T11,T22 +!JUANZIO +INTEGER :: IHEXTOT + +! +!* 1.1 THE NAME OF LFIFM +! +CALL SECOND_MNH2(T11) +IRESP = 0 +YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' +!------------------------------------------------------------------ +IHEXTOT = 2*JPHEXT+1 +TZFD=>GETFD(YFNLFI) +IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + IF (HLBTYPE == 'LBX' .OR. HLBTYPE == 'LBXU') THEN + ALLOCATE(Z3D(KL3D,SIZE(PLB,2),SIZE(PLB,3))) + Z3D = 0.0 + IF (LPACK .AND. L2D) THEN + TX3DP=>Z3D(:,JPHEXT+1:JPHEXT+1,:) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,TX3DP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(TX3DP),TX3DP,TZFMH,IRESP) + END IF + Z3D(:,:,:) = SPREAD(Z3D(:,JPHEXT+1,:),DIM=2,NCOPIES=IHEXTOT) + ELSE + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,Z3D,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(Z3D),Z3D,TZFMH,IRESP) + END IF + END IF + PLB(1:KRIM+JPHEXT,:,:) = Z3D(1:KRIM+JPHEXT,:,:) + PLB(KRIM+JPHEXT+1:2*(KRIM+JPHEXT),:,:) = Z3D(KL3D-KRIM-JPHEXT+1:KL3D,:,:) + ELSE !(HLBTYPE == 'LBY' .OR. HLBTYPE == 'LBYV') + ALLOCATE(Z3D(SIZE(PLB,1),KL3D,SIZE(PLB,3))) + Z3D = 0.0 + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,Z3D,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(Z3D),Z3D,TZFMH,IRESP) + END IF + PLB(:,1:KRIM+JPHEXT,:) = Z3D(:,1:KRIM+JPHEXT,:) + PLB(:,KRIM+JPHEXT+1:2*(KRIM+JPHEXT),:) = Z3D(:,KL3D-KRIM-JPHEXT+1:KL3D,:) + END IF + IF (IRESP /= 0) GOTO 1000 + ELSE ! multiprocessor execution + IF (ISP == TZFD%OWNER) THEN + CALL SECOND_MNH2(T0) + CALL GET_GLOBALDIMS_ll(IIMAX_ll,IJMAX_ll) + IF (HLBTYPE == 'LBX' .OR. HLBTYPE == 'LBXU') THEN + ALLOCATE(Z3D(KL3D,IJMAX_ll+2*JPHEXT,SIZE(PLB,3))) + Z3D = 0.0 + IF (LPACK .AND. L2D) THEN + TX3DP=>Z3D(:,JPHEXT+1:JPHEXT+1,:) + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,TX3DP,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(TX3DP),TX3DP,TZFMH,IRESP) + END IF + Z3D(:,:,:) = SPREAD(Z3D(:,JPHEXT+1,:),DIM=2,NCOPIES=IHEXTOT) + ELSE + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,Z3D,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(Z3D),Z3D,TZFMH,IRESP) + END IF + END IF + ! erase gap in LB field + Z3D(KRIM+JPHEXT+1:2*(KRIM+JPHEXT),:,:) = Z3D(KL3D-KRIM-JPHEXT+1:KL3D,:,:) + ELSE !(HLBTYPE == 'LBY' .OR. HLBTYPE == 'LBYV') + ALLOCATE(Z3D(IIMAX_ll+2*JPHEXT,KL3D,SIZE(PLB,3))) + Z3D = 0.0 + IF (ASSOCIATED(TZFD%CDF)) THEN + CALL NCREAD(TZFD%CDF%NCID,HRECFM,Z3D,TZFMH,IRESP) + ELSE + CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(Z3D),Z3D,TZFMH,IRESP) + END IF + ! erase gap in LB field + Z3D(:,KRIM+JPHEXT+1:2*(KRIM+JPHEXT),:) = Z3D(:,KL3D-KRIM-JPHEXT+1:KL3D,:) + END IF + CALL SECOND_MNH2(T1) + TIMEZ%T_READLB_READ=TIMEZ%T_READLB_READ + T1 - T0 + END IF + ! + CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR) + IF (IRESP /= 0) GOTO 1000 + ! + CALL BCAST_HEADER(TZFD,TZFMH) + ! + NB_REQ=0 + ALLOCATE(REQ_TAB(ISNPROC-1)) + !REQ_TAB=MPI_REQUEST_NULL + IF (ISP == TZFD%OWNER) THEN + CALL SECOND_MNH2(T1) + !ALLOCATE(REQ_TAB(ISNPROC-1)) + !REQ_TAB=MPI_REQUEST_NULL + ALLOCATE(T_TX3DP(ISNPROC-1)) + IKU = SIZE(Z3D,3) + DO JI = 1,ISNPROC + CALL GET_DISTRIB_LB(HLBTYPE,JI,'FM','READ',KRIM,IIB,IIE,IJB,IJE) + IF (IIB /= 0) THEN + TX3DP=>Z3D(IIB:IIE,IJB:IJE,:) + IF (ISP /= JI) THEN + NB_REQ = NB_REQ + 1 + ALLOCATE(T_TX3DP(NB_REQ)%X(IIB:IIE,IJB:IJE,IKU)) + T_TX3DP(NB_REQ)%X=Z3D(IIB:IIE,IJB:IJE,:) + CALL MPI_ISEND(T_TX3DP(NB_REQ)%X,SIZE(TX3DP),MPI_FLOAT,JI-1,99,TZFD%COMM,REQ_TAB(NB_REQ),IERR) + !CALL MPI_BSEND(T_TX3DP(NB_REQ)%X,SIZE(TX3DP),MPI_FLOAT,JI-1,99,TZFD%COMM,IERR) + ELSE + CALL GET_DISTRIB_LB(HLBTYPE,JI,'LOC','READ',KRIM,IIB,IIE,IJB,IJE) + PLB(IIB:IIE,IJB:IJE,:) = TX3DP(:,:,:) + END IF + END IF + END DO + CALL SECOND_MNH2(T2) + TIMEZ%T_READLB_SEND=TIMEZ%T_READLB_SEND + T2 - T1 + IF (NB_REQ .GT.0 ) THEN + !ALLOCATE(STATUSES(MPI_STATUS_SIZE,NB_REQ)) + !CALL MPI_WAITALL(NB_REQ,REQ_TAB,STATUSES,IERR) + CALL MPI_WAITALL(NB_REQ,REQ_TAB,MNH_STATUSES_IGNORE,IERR) + !DEALLOCATE(STATUSES) + DO JI=1,NB_REQ ; DEALLOCATE(T_TX3DP(JI)%X) ; ENDDO + END IF + DEALLOCATE(T_TX3DP) + !DEALLOCATE(REQ_TAB) + CALL SECOND_MNH2(T3) + TIMEZ%T_READLB_WAIT=TIMEZ%T_READLB_WAIT + T3 - T2 + ELSE + CALL SECOND_MNH2(T0) + !ALLOCATE(REQ_TAB(1)) + !REQ_TAB=MPI_REQUEST_NULL + CALL GET_DISTRIB_LB(HLBTYPE,ISP,'LOC','READ',KRIM,IIB,IIE,IJB,IJE) + IF (IIB /= 0) THEN + TX3DP=>PLB(IIB:IIE,IJB:IJE,:) + CALL MPI_RECV(TX3DP,SIZE(TX3DP),MPI_FLOAT,TZFD%OWNER-1,99,TZFD%COMM,STATUS,IERR) + !NB_REQ = NB_REQ + 1 + !CALL MPI_IRECV(TX3DP,SIZE(TX3DP),MPI_FLOAT,TZFD%OWNER-1,99,TZFD%COMM,REQ_TAB(NB_REQ),IERR) + !IF (NB_REQ .GT.0 ) CALL MPI_WAITALL(NB_REQ,REQ_TAB,MNH_STATUSES_IGNORE,IERR) + END IF + CALL SECOND_MNH2(T1) + TIMEZ%T_READLB_RECV=TIMEZ%T_READLB_RECV + T1 - T0 + END IF + DEALLOCATE(REQ_TAB) + END IF !(GSMONOPROC) + KGRID = TZFMH%GRID + KLENCH = TZFMH%COMLEN + HCOMMENT = TZFMH%COMMENT(1:TZFMH%COMLEN) +ELSE + IRESP = -61 +END IF +!---------------------------------------------------------------- +1000 CONTINUE +!! Error handler +IF (IRESP.NE.0) THEN + CALL FM_READ_ERR("FMREAD_LB",HFILEM,HFIPRI,HRECFM,HLBTYPE,IRESP) +ENDIF +! +IF (ALLOCATED(Z3D)) DEALLOCATE (Z3D) +KRESP = IRESP +! +!CALL MPI_BARRIER(TZFD%COMM,IERR) +CALL SECOND_MNH2(T22) +TIMEZ%T_READLB_ALL=TIMEZ%T_READLB_ALL + T22 - T11 +END SUBROUTINE FMREAD_LB + +END MODULE MODE_FMREAD + + +! diff --git a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 index 6e2feec89534ccd852c8a8d2feb433104994c261..70025f66f6af237edb1a5ccb7a3a535e1bd1eadc 100644 --- a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 +++ b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 @@ -1,3229 +1,3237 @@ -!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier -!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence -!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt -!MNH_LIC for details. version 1. -!----------------------------------------------------------------- -!--------------- special set of characters for CVS information -!----------------------------------------------------------------- -! $Source$ -! $Name$ -! $Revision$ -! $Date$ -!----------------------------------------------------------------- -!Correction : -! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 -! D.Gazen : avril 2016 bug dimensions 2D cases -!----------------------------------------------------------------- - -#ifdef MNH_MPI_DOUBLE_PRECISION -#define MPI_FLOAT MPI_DOUBLE_PRECISION -#else -#define MPI_FLOAT MPI_REAL -#endif - -#ifdef MNH_GA -MODULE MODE_GA -#include "mafdecls.fh" -#include "global.fh" - ! - ! Global Array Variables - ! - INTEGER, PARAMETER :: jpix=1 , jpiy = 2 , jpiz = 3 - ! - INTEGER :: NIMAX_ll,NJMAX_ll, IIU_ll,IJU_ll,IKU_ll - integer :: heap=5*10**6, stack - logical :: gstatus_ga - INTEGER, PARAMETER :: ndim_GA = 3 - INTEGER, DIMENSION(ndim_GA) :: dims_GA , chunk_GA - INTEGER,PARAMETER :: CI=1 ,CJ=-1 ,CK=-1 - INTEGER :: g_a - integer, DIMENSION(ndim_GA) :: lo_col, hi_col , ld_col - integer, DIMENSION(ndim_GA) :: lo_zplan , hi_zplan , ld_zplan - INTEGER :: NIXO_L,NIXE_L,NIYO_L,NIYE_L - INTEGER :: NIXO_G,NIXE_G,NIYO_G,NIYE_G - - LOGICAL,SAVE :: GFIRST_GA = .TRUE. - INTEGER :: IIU_ll_MAX = -1, IJU_ll_MAX = -1, IKU_ll_MAX = -1 - - CONTAINS - - SUBROUTINE MNH_INIT_GA(MY_NI,MY_NJ,MY_NK,HRECFM,HRW_MODE) - -! -! Modification -! J.Escobar 5/02/2015 : use JPHEXT from MODD_PARAMETERS_ll - - USE MODE_TOOLS_ll, ONLY : GET_GLOBALDIMS_ll - USE MODD_PARAMETERS_ll, ONLY : JPHEXT - USE MODD_IO_ll, ONLY : ISP - USE MODE_GATHER_ll, ONLY : GET_DOMWRITE_ll - USE MODE_SCATTER_ll, ONLY : GET_DOMREAD_ll - - IMPLICIT NONE - - INTEGER, INTENT(IN) :: MY_NI,MY_NJ,MY_NK - CHARACTER(LEN=*), INTENT(IN) :: HRECFM ! name of the article to write - CHARACTER(LEN=*), INTENT(IN) :: HRW_MODE - - IF ( GFIRST_GA ) THEN - GFIRST_GA = .FALSE. - ! - ! Allocate memory for GA library - ! - stack = heap - !gstatus_ga = ma_init(MT_F_DBL, stack/ISNPROC, heap/ISNPROC) - gstatus_ga = ma_init(MT_F_DBL, stack, heap) - if ( .not. gstatus_ga ) STOP " MA_INIT FAILED " - ! - ! Initialize GA library - ! - !call ga_initialize_ltd(100000000) - call ga_initialize() - END IF - - CALL GET_GLOBALDIMS_ll (NIMAX_ll,NJMAX_ll) - IIU_ll = NIMAX_ll + 2*JPHEXT - IJU_ll = NJMAX_ll + 2*JPHEXT - IKU_ll = MY_NK - ! - ! configure Global array dimensions - ! - dims_GA(JPIX) = IIU_ll - dims_GA(JPIY) = IJU_ll - dims_GA(JPIZ) = IKU_ll - chunk_GA(JPIX) = CI - chunk_GA(JPIY) = CJ - chunk_GA(JPIZ) = CK - IF ( CI .EQ. 1 ) chunk_GA(JPIX) = dims_GA(JPIX) ! 1 block in X direction - IF ( CJ .EQ. 1 ) chunk_GA(JPIY) = dims_GA(JPIY) ! 1 block in Y direction - IF ( CK .EQ. 1 ) chunk_GA(JPIZ) = dims_GA(JPIZ) ! 1 block in Z direction - ! - ! (re)create global array g_a ( if to small create it ... ) - ! - IF ( ( IIU_ll .GT. IIU_ll_MAX ) .OR. ( IJU_ll .GT. IJU_ll_MAX ) .OR. ( IKU_ll .GT. IKU_ll_MAX ) ) THEN - ! - ! reallocate the g_a , if need with bigger Z size - ! - IF ( IKU_ll_MAX .NE. -1 ) gstatus_ga = ga_destroy(g_a) - IIU_ll_MAX = IIU_ll - IJU_ll_MAX = IJU_ll - IKU_ll_MAX = IKU_ll - gstatus_ga = nga_create(MT_F_DBL, ndim_GA, dims_GA, HRECFM ,chunk_GA, g_a) - call ga_sync() - END IF - !----------------------------------------------------------------------! - ! ! - ! Define/describe local column data owned by this processor to write ! - ! ! - !----------------------------------------------------------------------! - IF ( HRW_MODE .EQ. "WRITE" ) THEN - CALL GET_DOMWRITE_ll(ISP,'local',NIXO_L,NIXE_L,NIYO_L,NIYE_L) - CALL GET_DOMWRITE_ll(ISP,'global',NIXO_G,NIXE_G,NIYO_G,NIYE_G) - ELSE - CALL GET_DOMREAD_ll(ISP,NIXO_L,NIXE_L,NIYO_L,NIYE_L) - CALL GET_DOMREAD_ll(ISP,NIXO_G,NIXE_G,NIYO_G,NIYE_G) - END IF - ! - ! portion of data to write/put | read/get by this proc - ! - lo_col(JPIX) = NIXO_G - hi_col(JPIX) = NIXE_G - - lo_col(JPIY) = NIYO_G - hi_col(JPIY) = NIYE_G - - lo_col(JPIZ) = 1 - hi_col(JPIZ) = IKU_ll - ! - ! declaration size of this local input column array - ! - ld_col(JPIX) = MY_NI - ld_col(JPIY) = MY_NJ - ld_col(JPIZ) = MY_NK - ! - !-----------------------------------------------------! - ! ! - ! Size of local ZSLIDE_ll Write buffer on I/O proc ! - ! ! - !-----------------------------------------------------! - ! - ! declared dimension - ! - ld_zplan(JPIX) = IIU_ll - ld_zplan(JPIY) = IJU_ll - ld_zplan(JPIZ) = 1 - ! - ! write data by Z slide by I/O proc - ! - lo_zplan(JPIX:JPIY) = 1 - hi_zplan(JPIX) = IIU_ll - hi_zplan(JPIY) = IJU_ll - !call ga_sync() - ! - END SUBROUTINE MNH_INIT_GA - -END MODULE MODE_GA - -#endif - -MODULE MODE_FMWRIT - - USE MODD_MPIF -#if defined(MNH_IOCDF4) - USE MODE_NETCDF -#endif - - IMPLICIT NONE - - PRIVATE - - INTERFACE FMWRIT - MODULE PROCEDURE FMWRITX0_ll,FMWRITX1_ll,FMWRITX2_ll,FMWRITX3_ll,& - & FMWRITX4_ll,FMWRITX5_ll,FMWRITX6_ll,& - & FMWRITN0_ll,FMWRITN1_ll,FMWRITN2_ll,& - & FMWRITL0_ll,FMWRITL1_ll,FMWRITC0_ll,& - & FMWRITC1_ll,FMWRITT0_ll - END INTERFACE - - INTERFACE FMWRITBOX - MODULE PROCEDURE FMWRITBOXX2_ll,FMWRITBOXX3_ll,FMWRITBOXX4_ll,& - & FMWRITBOXX5_ll,FMWRITBOXX6_ll - END INTERFACE - - PUBLIC FMWRIT_LB,FMWRITBOX,FMWRIT,FMWRITX0_ll,FMWRITX1_ll,FMWRITX2_ll,FMWRITX3_ll,& - & FMWRITX4_ll,FMWRITX5_ll,FMWRITX6_ll,FMWRITN0_ll,FMWRITN1_ll,FMWRITN2_ll,& - & FMWRITL0_ll,FMWRITL1_ll,FMWRITC0_ll,FMWRITC1_ll,FMWRITT0_ll,FMWRITBOXX2_ll,& - & FMWRITBOXX3_ll,FMWRITBOXX4_ll,FMWRITBOXX5_ll,FMWRITBOXX6_ll - - !INCLUDE 'mpif.h' - -CONTAINS - - SUBROUTINE FM_WRIT_ERR(HFUNC,HFILEM,HFIPRI,HRECFM,HDIR,KGRID,KLENCH& - & ,KRESP) - USE MODE_FM, ONLY : FMLOOK_ll - - CHARACTER(LEN=*) :: HFUNC - CHARACTER(LEN=*) :: HFILEM - CHARACTER(LEN=*) :: HFIPRI - CHARACTER(LEN=*) :: HRECFM - CHARACTER(LEN=*) :: HDIR - INTEGER :: KGRID - INTEGER :: KLENCH - INTEGER :: KRESP - - INTEGER :: ILUPRI - INTEGER :: IRESP - - CALL FMLOOK_ll(HFIPRI,HFIPRI,ILUPRI,IRESP) - WRITE (ILUPRI,*) ' exit from ',HFUNC,' with RESP:',KRESP - WRITE (ILUPRI,*) ' | HFILEM = ',HFILEM - WRITE (ILUPRI,*) ' | HRECFM = ',HRECFM - WRITE (ILUPRI,*) ' | HDIR = ',HDIR - WRITE (ILUPRI,*) ' | KGRID = ',KGRID - WRITE (ILUPRI,*) ' | KLENCH = ',KLENCH - - END SUBROUTINE FM_WRIT_ERR - - - - SUBROUTINE FMWRITX0_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& - KLENCH,HCOMMENT,KRESP) -! -! Modification -! J.Escobar 15/04/2014 : add write to all Z files for all FMWRITX0_ll variables -! J.Escobar 23/06/2014 : bug , replace .FALSE. to .TRUE. = OREAL type transmetted to FM_WRIT_ll -! - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT - USE MODD_FM - USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL -#ifdef MNH_NCWRIT - USE MODD_GRID - USE MODD_DIM_n, ONLY: NIMAX - USE MODD_NCOUT - USE MODE_UTIL -#endif - ! - !* 0. DECLARATIONS - ! ------------ - ! - !* 0.1 Declarations of arguments - ! - CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name - CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to write - CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages - CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form - REAL, INTENT(IN) ::PFIELD ! array containing the data field - INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) - INTEGER, INTENT(IN) ::KLENCH ! length of comment string - CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT! comment string - INTEGER, INTENT(OUT)::KRESP ! return-code - ! - !* 0.2 Declarations of local variables - ! - !---------------------------------------------------------------- - CHARACTER(LEN=JPFINL) :: YFNLFI - INTEGER :: IERR - TYPE(FD_ll), POINTER :: TZFD - INTEGER :: IRESP - TYPE(FMHEADER) :: TZFMH - !JUANZIO - INTEGER :: IK_FILE,IK_rank - CHARACTER(len=5) :: YK_FILE - CHARACTER(len=128) :: YFILE_IOZ - TYPE(FD_ll), POINTER :: TZFD_IOZ - !JUANZIO - ! - !* 1.1 THE NAME OF LFIFM - ! - IRESP = 0 - YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' - !print * , ' Writing Article 0 ' , HRECFM - ! - TZFD=>GETFD(YFNLFI) - IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC) THEN ! sequential execution - TZFMH%GRID=KGRID - TZFMH%COMLEN=KLENCH - TZFMH%COMMENT=HCOMMENT -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP) - END IF - IF ( LNETCDF .AND. NIMAX == 0 ) THEN -! PRINT * , ' SAVE MAP PARAMETER IF PGD ' - IF ( trim(hrecfm) == "RPK" ) THEN - XRPK=PFIELD - ELSEIF ( trim(hrecfm) == "BETA" ) THEN - XBETA=PFIELD - ELSEIF (trim(hrecfm) == "LATORI" ) THEN - XLATORI=PFIELD - ELSEIF (trim(hrecfm) == "LONORI" ) THEN - XLONORI=PFIELD - ELSEIF (trim(hrecfm) == "LAT0" ) THEN - XLAT0=PFIELD - ELSEIF (trim(hrecfm) == "LON0" ) THEN - XLON0=PFIELD - END IF - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP) -#endif - ELSE - IF (ISP == TZFD%OWNER) THEN - TZFMH%GRID=KGRID - TZFMH%COMLEN=KLENCH - TZFMH%COMMENT=HCOMMENT -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP) - END IF - IF ( LNETCDF .AND. NIMAX == 0 ) THEN -! print * , ' SAVE MAP PARAMETER IF PGD ' - IF ( trim(hrecfm) == "RPK" ) THEN - XRPK=PFIELD - ELSEIF ( trim(hrecfm) == "BETA" ) THEN - XBETA=PFIELD - ELSEIF (trim(hrecfm) == "LATORI" ) THEN - XLATORI=PFIELD - ELSEIF (trim(hrecfm) == "LONORI" ) THEN - XLONORI=PFIELD - ELSEIF (trim(hrecfm) == "LAT0" ) THEN - XLAT0=PFIELD - ELSEIF (trim(hrecfm) == "LON0" ) THEN - XLON0=PFIELD - END IF - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP) -#endif - 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(HFILEM)//YK_FILE//".lfi" - TZFD_IOZ => GETFD(YFILE_IOZ) - IK_RANK = TZFD_IOZ%OWNER - IF ( ISP == IK_RANK ) THEN - TZFMH%GRID=KGRID - TZFMH%COMLEN=KLENCH - TZFMH%COMMENT=HCOMMENT -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD_IOZ%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD_IOZ%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD_IOZ%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP) -#endif - END IF - END DO - ENDIF - ELSE - IRESP = -61 - END IF - !---------------------------------------------------------------- - IF (IRESP.NE.0) THEN - CALL FM_WRIT_ERR("FMWRITX0_ll",HFILEM,HFIPRI,HRECFM,HDIR,KGRID,KLENCH,IRESP) - END IF - KRESP = IRESP - END SUBROUTINE FMWRITX0_ll - - SUBROUTINE FMWRITX1_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& - KLENCH,HCOMMENT,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT - USE MODD_FM - USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL - USE MODE_ALLOCBUFFER_ll - USE MODE_GATHER_ll -#ifdef MNH_NCWRIT - USE MODE_UTIL - USE MODE_DIMLIST - USE MODD_DIM_n, ONLY: NIMAX - USE MODD_NCOUT -#endif - ! - !* 0. DECLARATIONS - ! ------------ - ! - !* 0.1 Declarations of arguments - ! - CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name - CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to write - CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages - CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form - REAL,DIMENSION(:),TARGET,INTENT(IN) ::PFIELD ! array containing the data field - INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) - INTEGER, INTENT(IN) ::KLENCH ! length of comment string - CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT ! comment string - INTEGER, INTENT(OUT)::KRESP ! return-code - ! - !* 0.2 Declarations of local variables - ! - !---------------------------------------------------------------- - CHARACTER(LEN=JPFINL) :: YFNLFI - INTEGER :: IERR - TYPE(FD_ll), POINTER :: TZFD - INTEGER :: IRESP - TYPE(FMHEADER) :: TZFMH - REAL,DIMENSION(:),POINTER :: ZFIELDP - LOGICAL :: GALLOC -#ifdef MNH_NCWRIT - TYPE(workfield), DIMENSION(:), POINTER :: TZRECLIST - INTEGER,DIMENSION(6) :: TABDIM -#endif - ! - !* 1.1 THE NAME OF LFIFM - ! - IRESP = 0 - GALLOC = .FALSE. - YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' -#ifdef MNH_NCWRIT - TABDIM(:)=1 - TABDIM(1)=SIZE(PFIELD,1) - !print * , ' Writing Article 1 ' , HRECFM -#endif - !------------------------------------------------------------------ - TZFD=>GETFD(YFNLFI) - IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC) THEN ! sequential execution - TZFMH%GRID=KGRID - TZFMH%COMLEN=KLENCH - TZFMH%COMMENT=HCOMMENT -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) - END IF - ! ------- WRITE NETCDF - IF ( LNETCDF .AND. NC_WRITE ) THEN - CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,PFIELD,.TRUE.,TZRECLIST, & -! CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,PFIELD, & - & KLENCH,HCOMMENT) - IF ( NC_FILE == 'phy' ) THEN -!!!!! CAS WRITE_PHYS_PARAM ... l'ecriture lfi ne peut pas se faire en meme temps - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE., & - SIZE(PFIELD),PFIELD,TZFMH,IRESP) - END IF - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP) -#endif - ELSE - IF (ISP == TZFD%OWNER) THEN - CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC) - ELSE - ALLOCATE(ZFIELDP(0)) - GALLOC = .TRUE. - END IF - ! - IF (HDIR == 'XX' .OR. HDIR =='YY') THEN - CALL GATHER_XXFIELD(HDIR,PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM) - END IF - ! - IF (ISP == TZFD%OWNER) THEN - TZFMH%GRID=KGRID - TZFMH%COMLEN=KLENCH - TZFMH%COMMENT=HCOMMENT -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& - & ,IRESP) - END IF - IF ( LNETCDF .AND. NC_WRITE ) THEN - TABDIM(1)=SIZE(ZFIELDP,1) - CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,ZFIELDP,.TRUE.,TZRECLIST, & - & KLENCH,HCOMMENT) - IF ( NC_FILE == 'phy' ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& - & ,IRESP) - END IF - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& - & ,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) -#endif - 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("FMWRITX1_ll",HFILEM,HFIPRI,HRECFM,HDIR,KGRID,KLENCH,IRESP) - END IF - IF (GALLOC) DEALLOCATE(ZFIELDP) - KRESP = IRESP - END SUBROUTINE FMWRITX1_ll - - SUBROUTINE FMWRITX2_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& - KLENCH,HCOMMENT,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT,LPACK,L1D,L2D - 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 - !JUANZ - USE MODD_TIMEZ, ONLY : TIMEZ - USE MODE_MNH_TIMING, ONLY : SECOND_MNH2 - !JUANZ -#ifdef MNH_NCWRIT - USE MODE_UTIL - USE MODE_DIMLIST - USE MODD_DIM_n, ONLY: NIMAX - USE MODD_NCOUT -#endif -#ifdef MNH_GA - !JUAN_IOGA - USE MODE_GA -#endif - ! - IMPLICIT NONE - ! - !* 0.1 Declarations of arguments - ! - CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name - CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to write - CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages - CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form - REAL,DIMENSION(:,:),TARGET,INTENT(IN) ::PFIELD ! array containing the data field - INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) - INTEGER, INTENT(IN) ::KLENCH ! length of comment string - CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT ! comment string - INTEGER, INTENT(OUT)::KRESP ! return-code - ! - !* 0.2 Declarations of local variables - ! - CHARACTER(LEN=JPFINL) :: YFNLFI - INTEGER :: IERR - TYPE(FD_ll), POINTER :: TZFD - INTEGER :: IRESP - REAL,DIMENSION(:,:),POINTER :: ZFIELDP - TYPE(FMHEADER) :: TZFMH - LOGICAL :: GALLOC -#ifdef MNH_NCWRIT - TYPE(workfield), DIMENSION(:), POINTER :: TZRECLIST - INTEGER,DIMENSION(6) :: TABDIM - LOGICAL :: NCWR - INTEGER :: LHREC_BEG,LHRECFM -#endif - ! - !JUANZ - REAL*8,DIMENSION(2) :: T0,T1,T2 - REAL*8,DIMENSION(2) :: T11,T22 - !JUANZ -#ifdef MNH_GA - REAL,DIMENSION(:,:),POINTER :: ZFIELDP_GA , ZFIELD_GA - REAL :: ERROR - INTEGER :: JI -#endif - ! - !* 1.1 THE NAME OF LFIFM - ! - CALL SECOND_MNH2(T11) - IRESP = 0 - GALLOC = .FALSE. - YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' -#ifdef MNH_NCWRIT - NCWR=.TRUE. - TABDIM(:)=1 - TABDIM(1)=SIZE(PFIELD,1) - TABDIM(2)=SIZE(PFIELD,2) - !print * , ' Writing Article 2 ' , HRECFM -#endif - !------------------------------------------------------------------ - TZFD=>GETFD(YFNLFI) - IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC) THEN ! sequential execution - TZFMH%GRID=KGRID - TZFMH%COMLEN=KLENCH - TZFMH%COMMENT=HCOMMENT - ! IF (LPACK .AND. L1D .AND. HDIR=='XY') THEN - IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==2*JPHEXT+1 .AND. SIZE(PFIELD,2)==2*JPHEXT+1) THEN - ZFIELDP=>PFIELD(2:2,2:2) -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - END IF - IF ( LNETCDF .AND. NC_WRITE ) THEN - TABDIM(1)=1 - TABDIM(2)=1 - CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,ZFIELDP,.TRUE.,TZRECLIST,& - & KLENCH,HCOMMENT) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) -#endif - ! ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN - ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==2*JPHEXT+1) THEN - ZFIELDP=>PFIELD(:,2:2) -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - END IF - LHRECFM = LEN_TRIM(ADJUSTL(HRECFM)) - IF ( LHRECFM > 5 ) THEN - LHREC_BEG =LHRECFM-4 - IF ( ADJUSTL(HRECFM(LHREC_BEG:LHRECFM)) == 'DATIM') THEN - NCWR = .FALSE. - END IF - END IF - IF ( LNETCDF .AND. NC_WRITE .AND. NCWR ) THEN - TABDIM(2)=1 - IF ( NC_FILE == 'phy' ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE., & - SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - END IF - CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,ZFIELDP,.TRUE.,TZRECLIST,& - & KLENCH,HCOMMENT) - END IF - NCWR = .TRUE. -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) -#endif - ELSE -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) - END IF - LHRECFM = LEN_TRIM(ADJUSTL(HRECFM)) - IF ( LHRECFM > 5 ) THEN - LHREC_BEG =LHRECFM-4 - IF ( ADJUSTL(HRECFM(LHREC_BEG:LHRECFM)) == 'DATIM') THEN - NCWR = .FALSE. - END IF - END IF -! IF ( NIMAX /= 0 ) THEN - IF ( LNETCDF .AND. NC_WRITE .AND. NCWR ) THEN - IF ( NC_FILE == 'phy' ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE., & - SIZE(PFIELD),PFIELD,TZFMH,IRESP) - END IF - CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,PFIELD,.TRUE.,TZRECLIST, & - & KLENCH,HCOMMENT) - END IF - NCWR = .TRUE. -! END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP) -#endif - END IF - ELSE ! multiprocessor execution - CALL SECOND_MNH2(T0) - IF (ISP == TZFD%OWNER) THEN - ! I/O processor case - CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC) - ELSE - ALLOCATE(ZFIELDP(0,0)) - GALLOC = .TRUE. - END IF - ! - IF (HDIR == 'XX' .OR. HDIR =='YY') THEN - CALL GATHER_XXFIELD(HDIR,PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM) - ELSEIF (HDIR == 'XY') THEN - IF (LPACK .AND. L2D) THEN - CALL GATHER_XXFIELD('XX',PFIELD(:,2),ZFIELDP(:,1),TZFD%OWNER,TZFD%COMM) - ELSE -#ifdef MNH_GA - ! - ! init/create the ga , dim3 = 1 - ! - CALL MNH_INIT_GA(SIZE(PFIELD,1),SIZE(PFIELD,2),1,HRECFM,"WRITE") - ! - ! copy columun data to global arrays g_a - ! - ALLOCATE (ZFIELD_GA (SIZE(PFIELD,1),SIZE(PFIELD,2))) - ZFIELD_GA = PFIELD - call nga_put(g_a, lo_col, hi_col,ZFIELD_GA(NIXO_L,NIYO_L) , ld_col) -!!$ print*," nga_put =",HRECFM,g_a," lo_col=",lo_col," hi_col=",hi_col,ZFIELD_GA(NIXO_L,NIYO_L), & -!!$ " NIXO_L=",NIXO_L,"NIYO_L=",NIYO_L," ld_col=",ld_col," ISP=",ISP - call ga_sync - DEALLOCATE (ZFIELD_GA) - IF (ISP == TZFD%OWNER) THEN - ! - ! this proc get the Z slide to write - ! - lo_zplan(JPIZ) = 1 - hi_zplan(JPIZ) = 1 -!!$ ALLOCATE (ZFIELDP_GA(IIU_ll,IJU_ll)) - call nga_get(g_a, lo_zplan, hi_zplan,ZFIELDP, ld_zplan) -!!$ print*,"nga_get=",HRECFM,g_a," lo_zplan=",lo_zplan," hi_zplan=",hi_zplan & -!!$ ,ZFIELDP(1,1)," ld_zplan=",ld_zplan - END IF -!!$ call ga_sync -#else - CALL GATHER_XYFIELD(PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM) -!!$ IF (ISP == TZFD%OWNER) THEN -!!$ print*,HRECFM, "ERR=", MAXVAL (ZFIELDP_GA - ZFIELDP) -!!$ DO JI=1,IJU_ll -!!$ !print*,HRECFM, "ERR=", ZFIELDP_GA(:,JI) - ZFIELDP(:,JI) -!!$ print*,HRECFM, "WX2::GA =", ZFIELDP_GA(:,JI) -!!$ print*,HRECFM, "WX2::MNH=", ZFIELDP(:,JI) -!!$ END DO -!!$ END IF -#endif - END IF - END IF - CALL SECOND_MNH2(T1) - TIMEZ%T_WRIT2D_GATH=TIMEZ%T_WRIT2D_GATH + T1 - T0 - ! - IF (ISP == TZFD%OWNER) THEN - TZFMH%GRID=KGRID - TZFMH%COMLEN=KLENCH - TZFMH%COMMENT=HCOMMENT -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& - & ,IRESP) - END IF - LHRECFM = LEN_TRIM(ADJUSTL(HRECFM)) - IF ( LHRECFM > 5 ) THEN - LHREC_BEG =LHRECFM-4 - IF ( ADJUSTL(HRECFM(LHREC_BEG:LHRECFM)) == 'DATIM') THEN - NCWR = .FALSE. - END IF - END IF - IF ( LNETCDF .AND. NC_WRITE .AND. NCWR ) THEN - TABDIM(1)=SIZE(ZFIELDP,1) - TABDIM(2)=SIZE(ZFIELDP,2) - CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,ZFIELDP,.TRUE.,TZRECLIST, & -! CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,ZFIELDP, & - & KLENCH,HCOMMENT) - END IF - NCWR=.TRUE. -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& - & ,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) -#endif - END IF -#ifdef MNH_GA -!!$ IF (ISP .EQ. 1 ) THEN -!!$ call ga_print_stats() -!!$ call ga_summarize(1) -!!$ ENDIF - call ga_sync -!!$ gstatus_ga = ga_destroy(g_a) -#endif - CALL SECOND_MNH2(T2) - TIMEZ%T_WRIT2D_WRIT=TIMEZ%T_WRIT2D_WRIT + T2 - T1 - ! - 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("FMWRITX2_ll",HFILEM,HFIPRI,HRECFM,HDIR,KGRID,KLENCH,IRESP) - END IF - IF (GALLOC) DEALLOCATE(ZFIELDP) - KRESP = IRESP - IF (ASSOCIATED(TZFD)) CALL MPI_BARRIER(TZFD%COMM,IERR) - CALL SECOND_MNH2(T22) - TIMEZ%T_WRIT2D_ALL=TIMEZ%T_WRIT2D_ALL + T22 - T11 - END SUBROUTINE FMWRITX2_ll - - SUBROUTINE FMWRITX3_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& - KLENCH,HCOMMENT,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT,LPACK,L1D,L2D - 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 - !JUANZ - USE MODD_IO_ll, ONLY : ISNPROC - USE MODE_IO_ll, ONLY : io_file,io_rank - USE MODD_TIMEZ, ONLY : TIMEZ - USE MODE_MNH_TIMING, ONLY : SECOND_MNH2 - !JUANZ -#ifdef MNH_NCWRIT - USE MODE_UTIL - USE MODD_DIM_n, ONLY: NIMAX - USE MODD_NCOUT -#endif -#ifdef MNH_GA - USE MODE_GA -#endif - USE MODD_VAR_ll, ONLY : MNH_STATUSES_IGNORE - ! - ! - !* 0.1 Declarations of arguments - ! - CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name - CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to write - CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages - CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form - REAL,DIMENSION(:,:,:),TARGET,INTENT(IN) ::PFIELD ! array containing the data field - INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) - INTEGER, INTENT(IN) ::KLENCH ! length of comment string - CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT ! comment string - INTEGER, INTENT(OUT)::KRESP ! return-code - ! - !* 0.2 Declarations of local variables - ! - CHARACTER(LEN=JPFINL) :: YFNLFI - 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(HRECFM)) :: YK,YRECZSLIDE - REAL,DIMENSION(:,:),POINTER :: ZSLIDE_ll,ZSLIDE - INTEGER :: IK_FILE,IK_rank,inb_proc_real,JK_MAX - CHARACTER(len=5) :: YK_FILE - CHARACTER(len=128) :: YFILE_IOZ - TYPE(FD_ll), POINTER :: TZFD_IOZ - INTEGER :: JI,IXO,IXE,IYO,IYE - REAL,DIMENSION(:,:),POINTER :: TX2DP - INTEGER, DIMENSION(MPI_STATUS_SIZE) :: STATUS - INTEGER, ALLOCATABLE,DIMENSION(:,:) :: STATUSES - LOGICAL :: GALLOC_ll - !JUANZIO - !INTEGER,SAVE,DIMENSION(100000) :: REQ_TAB - INTEGER,ALLOCATABLE,DIMENSION(:) :: REQ_TAB - INTEGER :: NB_REQ - TYPE TX_2DP - REAL,DIMENSION(:,:), POINTER :: X - END TYPE TX_2DP - TYPE(TX_2DP),ALLOCATABLE,DIMENSION(:) :: T_TX2DP - REAL*8,DIMENSION(2) :: T0,T1,T2 - REAL*8,DIMENSION(2) :: T11,T22 - !JUANZIO - !JUAN -#ifdef MNH_NCWRIT - TYPE(workfield), DIMENSION(:), POINTER :: TZRECLIST - INTEGER,DIMENSION(6) :: TABDIM - CHARACTER(LEN=LEN(HRECFM)) :: HRECT - INTEGER :: LHRECT -#endif -#ifdef MNH_GA - REAL,DIMENSION(:,:,:),POINTER :: ZFIELD_GA -#endif - ! - !* 1.1 THE NAME OF LFIFM - ! - CALL SECOND_MNH2(T11) - IRESP = 0 - GALLOC = .FALSE. - GALLOC_ll = .FALSE. - YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' - !print * , ' Writing Article 3 ' , HRECFM -! -#ifdef MNH_NCWRIT - HRECT=TRIM(HRECFM) - LHRECT=LEN(TRIM(HRECT)) - TABDIM(:)=1 - TABDIM(1)=SIZE(PFIELD,1) - TABDIM(2)=SIZE(PFIELD,2) - TABDIM(3)=SIZE(PFIELD,3) - IF ( LHRECT .gt. 4 ) THEN - IF ( HRECT(LHRECT-4:LHRECT) == 'TRAJZ' ) THEN - TABDIM(3)=SIZE(PFIELD,1) - TABDIM(1)=1 - END IF - END IF - IF ( TRIM(HRECFM) == 'AVION.TRAJX' ) THEN - TABDIM(1)=SIZE(PFIELD,2) - TABDIM(2)=1 - ELSEIF ( TRIM(HRECFM) == 'AVION.TRAJY' ) THEN - TABDIM(1)=SIZE(PFIELD,2) - TABDIM(2)=1 - ELSEIF ( TRIM(HRECFM) == 'AVION.TRAJZ' ) THEN - TABDIM(1)=SIZE(PFIELD,2) - TABDIM(2)=1 - END IF -#endif - !------------------------------------------------------------------ - TZFD=>GETFD(YFNLFI) - IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC .AND. (TZFD%nb_procio.eq.1) ) THEN ! sequential execution - TZFMH%GRID=KGRID - TZFMH%COMLEN=KLENCH - TZFMH%COMMENT=HCOMMENT - ! IF (LPACK .AND. L1D .AND. HDIR=='XY') THEN - IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==2*JPHEXT+1 .AND. SIZE(PFIELD,2)==2*JPHEXT+1) THEN - ZFIELDP=>PFIELD(2:2,2:2,:) -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - END IF - IF ( LNETCDF .AND. NC_WRITE ) THEN - TABDIM(1)=1 - TABDIM(2)=1 - CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,ZFIELDP,.TRUE.,TZRECLIST, & - & KLENCH,HCOMMENT) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) -#endif - ! ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN - ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==2*JPHEXT+1) THEN - ZFIELDP=>PFIELD(:,2:2,:) -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - END IF - IF ( LNETCDF .AND. NC_WRITE ) THEN - TABDIM(2)=1 - IF ( NC_FILE == 'phy' ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - END IF - CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,ZFIELDP,.TRUE.,TZRECLIST, & -! CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,ZFIELDP, & - & KLENCH,HCOMMENT) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) -#endif - ELSE -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) - END IF - IF ( LNETCDF .AND. NC_WRITE ) THEN - IF ( NC_FILE == 'phy' ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) - END IF - CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,PFIELD,.TRUE.,TZRECLIST, & -! CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,PFIELD, & - & KLENCH,HCOMMENT) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP) -#endif - END IF - ELSEIF ( (TZFD%nb_procio .eq. 1 ) .OR. ( HDIR == '--' ) ) THEN ! multiprocessor execution & 1 proc IO - ! write 3D field in 1 time = output for graphique - IF (ISP == TZFD%OWNER) THEN - CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC) - ELSE - ALLOCATE(ZFIELDP(0,0,0)) - GALLOC = .TRUE. - END IF - ! - IF (HDIR == 'XX' .OR. HDIR =='YY') THEN - CALL GATHER_XXFIELD(HDIR,PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM) - ELSEIF (HDIR == 'XY') THEN - IF (LPACK .AND. L2D) THEN - CALL GATHER_XXFIELD('XX',PFIELD(:,2,:),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 - TZFMH%GRID=KGRID - TZFMH%COMLEN=KLENCH - TZFMH%COMMENT=HCOMMENT -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& - & ,IRESP) - END IF - IF ( LNETCDF .AND. NC_WRITE ) THEN - TABDIM(1)=SIZE(ZFIELDP,1) - TABDIM(2)=SIZE(ZFIELDP,2) - TABDIM(3)=SIZE(ZFIELDP,3) - IF ( NC_FILE == ' phy' ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& - & ,IRESP) - END IF - CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,ZFIELDP,.TRUE.,TZRECLIST, & -! CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,ZFIELDP, & - & KLENCH,HCOMMENT) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& - & ,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) -#endif - END IF - ! - CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD& - & %COMM,IERR) - ! - ELSE ! multiprocessor execution & // IO - ! - !JUAN BG Z SLIDE - ! - ! -#ifdef MNH_GA - ! - ! init/create the ga - ! - CALL SECOND_MNH2(T0) - CALL MNH_INIT_GA(SIZE(PFIELD,1),SIZE(PFIELD,2),SIZE(PFIELD,3),HRECFM,"WRITE") - ! - ! copy columun data to global arrays g_a - ! - ALLOCATE (ZFIELD_GA (SIZE(PFIELD,1),SIZE(PFIELD,2),SIZE(PFIELD,3))) - ZFIELD_GA = PFIELD - call nga_put(g_a, lo_col, hi_col,ZFIELD_GA(NIXO_L,NIYO_L,1) , ld_col) - DEALLOCATE(ZFIELD_GA) -!!$ print*," nga_put =",HRECFM,g_a," lo_col=",lo_col," hi_col=",hi_col,PFIELD(NIXO_L,NIYO_L,1) & -!!$ ," ld_col=",ld_col - call ga_sync - CALL SECOND_MNH2(T1) - TIMEZ%T_WRIT3D_SEND=TIMEZ%T_WRIT3D_SEND + T1 - T0 - ! - ! write the data - ! - ALLOCATE(ZSLIDE_ll(0,0)) ! to avoid bug on test of size - GALLOC_ll = .TRUE. - ! - DO JKK=1,IKU_ll - ! - IK_FILE = io_file(JKK,TZFD%nb_procio) - write(YK_FILE ,'(".Z",i3.3)') IK_FILE+1 - YFILE_IOZ = TRIM(HFILEM)//YK_FILE//".lfi" - TZFD_IOZ => GETFD(YFILE_IOZ) - ! - IK_RANK = TZFD_IOZ%OWNER - !IK_RANK = 1 + io_rank(IK_FILE,ISNPROC,TZFD%nb_procio) - ! - IF (ISP == IK_RANK ) THEN - CALL SECOND_MNH2(T0) - TZFMH%GRID=KGRID - TZFMH%COMLEN=KLENCH - TZFMH%COMMENT=HCOMMENT - WRITE(YK,'(I4.4)') JKK - YRECZSLIDE = TRIM(HRECFM)//YK - ! - IF ( SIZE(ZSLIDE_ll) .EQ. 0 ) THEN - DEALLOCATE(ZSLIDE_ll) - CALL ALLOCBUFFER_ll(ZSLIDE_ll,ZSLIDE,HDIR,GALLOC_ll) - END IF - ! - ! this proc get this JKK slide - ! - lo_zplan(JPIZ) = JKK - hi_zplan(JPIZ) = JKK - call nga_get(g_a, lo_zplan, hi_zplan,ZSLIDE_ll, ld_zplan) - 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,HDIR,ZSLIDE_ll,TZFMH,IRESP) - CALL SECOND_MNH2(T2) - TIMEZ%T_WRIT3D_WRIT=TIMEZ%T_WRIT3D_WRIT + T2 - T1 - END IF - END DO - !call ga_sync - ! - ! destroy the global array - ! -!!$ IF (ISP .EQ. 1 ) THEN -!!$ call ga_print_stats() -!!$ call ga_summarize(1) -!!$ ENDIF - CALL SECOND_MNH2(T0) - call ga_sync -!!$ gstatus_ga = ga_destroy(g_a) - CALL SECOND_MNH2(T1) - TIMEZ%T_WRIT3D_WAIT=TIMEZ%T_WRIT3D_WAIT + T1 - T0 -#else - ! - ALLOCATE(ZSLIDE_ll(0,0)) - GALLOC_ll = .TRUE. - inb_proc_real = min(TZFD%nb_procio,ISNPROC) - Z_SLIDE: DO JK=1,SIZE(PFIELD,3),inb_proc_real - ! - ! collecte the data - ! - JK_MAX=min(SIZE(PFIELD,3),JK+inb_proc_real-1) - ! - NB_REQ=0 - ALLOCATE(REQ_TAB(inb_proc_real)) - ALLOCATE(T_TX2DP(inb_proc_real)) - DO JKK=JK,JK_MAX - ! - ! get the file & rank to write this level - ! - IF (TZFD%NB_PROCIO .GT. 1 ) THEN - IK_FILE = io_file(JKK,TZFD%nb_procio) - write(YK_FILE ,'(".Z",i3.3)') IK_FILE+1 - YFILE_IOZ = TRIM(HFILEM)//YK_FILE//".lfi" - TZFD_IOZ => GETFD(YFILE_IOZ) - ELSE - TZFD_IOZ => TZFD - END IF - ! - !IK_RANK = 1 + io_rank(IK_FILE,ISNPROC,TZFD%nb_procio) - IK_RANK = TZFD_IOZ%OWNER - ! - IF (HDIR == 'XX' .OR. HDIR =='YY') THEN - STOP " XX NON PREVU SUR BG POUR LE MOMENT " - CALL GATHER_XXFIELD(HDIR,PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM) - ELSEIF (HDIR == 'XY') THEN - IF (LPACK .AND. L2D) THEN - STOP " L2D NON PREVU SUR BG POUR LE MOMENT " - CALL GATHER_XXFIELD('XX',PFIELD(:,2,:),ZFIELDP(:,1,:),TZFD%OWNER,TZFD%COMM) - ELSE - !CALL GATHER_XYFIELD(ZSLIDE,ZSLIDE_ll,TZFD_IOZ%OWNER,TZFD_IOZ%COMM) - !JUANIOZ - CALL SECOND_MNH2(T0) - IF ( ISP /= IK_RANK ) THEN - ! Other processors - CALL GET_DOMWRITE_ll(ISP,'local',IXO,IXE,IYO,IYE) - IF (IXO /= 0) THEN ! intersection is not empty - NB_REQ = NB_REQ + 1 - ALLOCATE(T_TX2DP(NB_REQ)%X(IXO:IXE,IYO:IYE)) - ZSLIDE => PFIELD(:,:,JKK) - TX2DP=>ZSLIDE(IXO:IXE,IYO:IYE) - T_TX2DP(NB_REQ)%X=ZSLIDE(IXO:IXE,IYO:IYE) - CALL MPI_ISEND(T_TX2DP(NB_REQ)%X,SIZE(TX2DP),MPI_FLOAT,IK_RANK-1,99+IK_RANK & - & ,TZFD_IOZ%COMM,REQ_TAB(NB_REQ),IERR) - !CALL MPI_BSEND(TX2DP,SIZE(TX2DP),MPI_FLOAT,IK_RANK-1,99+IK_RANK,TZFD_IOZ%COMM,IERR) - END IF - END IF - CALL SECOND_MNH2(T1) - TIMEZ%T_WRIT3D_SEND=TIMEZ%T_WRIT3D_SEND + T1 - T0 - !JUANIOZ - END IF - END IF - END DO - ! - ! write the data - ! - DO JKK=JK,JK_MAX - IF (TZFD%NB_PROCIO .GT. 1 ) THEN - IK_FILE = io_file(JKK,TZFD%nb_procio) - write(YK_FILE ,'(".Z",i3.3)') IK_FILE+1 - YFILE_IOZ = TRIM(HFILEM)//YK_FILE//".lfi" - TZFD_IOZ => GETFD(YFILE_IOZ) - ELSE - TZFD_IOZ => TZFD - ENDIF - IK_RANK = TZFD_IOZ%OWNER - !IK_RANK = 1 + io_rank(IK_FILE,ISNPROC,TZFD%nb_procio) - ! - IF (ISP == IK_RANK ) THEN - !JUANIOZ - CALL SECOND_MNH2(T0) - ! I/O proc case - IF ( SIZE(ZSLIDE_ll) .EQ. 0 ) THEN - DEALLOCATE(ZSLIDE_ll) - CALL ALLOCBUFFER_ll(ZSLIDE_ll,ZSLIDE,HDIR,GALLOC_ll) - END IF - DO JI=1,ISNPROC - CALL GET_DOMWRITE_ll(JI,'global',IXO,IXE,IYO,IYE) - IF (IXO /= 0) THEN ! intersection is not empty - TX2DP=>ZSLIDE_ll(IXO:IXE,IYO:IYE) - IF (ISP == JI) THEN - CALL GET_DOMWRITE_ll(JI,'local',IXO,IXE,IYO,IYE) - ZSLIDE => PFIELD(:,:,JKK) - TX2DP = ZSLIDE(IXO:IXE,IYO:IYE) - ELSE - CALL MPI_RECV(TX2DP,SIZE(TX2DP),MPI_FLOAT,JI-1,99+IK_RANK,TZFD_IOZ%COMM,STATUS,IERR) - END IF - END IF - END DO - CALL SECOND_MNH2(T1) - TIMEZ%T_WRIT3D_RECV=TIMEZ%T_WRIT3D_RECV + T1 - T0 - !JUANIOZ - TZFMH%GRID=KGRID - TZFMH%COMLEN=KLENCH - TZFMH%COMMENT=HCOMMENT - WRITE(YK,'(I4.4)') JKK - YRECZSLIDE = TRIM(HRECFM)//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,HDIR,ZSLIDE_ll,TZFMH,IRESP) - CALL SECOND_MNH2(T2) - TIMEZ%T_WRIT3D_WRIT=TIMEZ%T_WRIT3D_WRIT + T2 - T1 - END IF -!!$ CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD_IOZ%OWNER-1,TZFD_IOZ%COMM,IERR) - END DO - !CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD_IOZ%OWNER-1,TZFD_IOZ%COMM,IERR) - !CALL MPI_BARRIER(TZFD_IOZ%COMM,IERR) - ! - CALL SECOND_MNH2(T0) - IF (NB_REQ .GT.0 ) THEN - !ALLOCATE(STATUSES(MPI_STATUS_SIZE,NB_REQ)) - CALL MPI_WAITALL(NB_REQ,REQ_TAB,MNH_STATUSES_IGNORE,IERR) - !CALL MPI_WAITALL(NB_REQ,REQ_TAB,STATUSES,IERR) - !DEALLOCATE(STATUSES) - DO JI=1,NB_REQ ; DEALLOCATE(T_TX2DP(JI)%X) ; ENDDO - END IF - DEALLOCATE(T_TX2DP) - DEALLOCATE(REQ_TAB) - CALL SECOND_MNH2(T1) - TIMEZ%T_WRIT3D_WAIT=TIMEZ%T_WRIT3D_WAIT + T1 - T0 - END DO Z_SLIDE - !JUAN BG Z SLIDE -! end of MNH_GA -#endif - END IF ! multiprocessor execution - ELSE - IRESP = -61 - END IF - !---------------------------------------------------------------- - IF (IRESP.NE.0) THEN - CALL FM_WRIT_ERR("FMWRITX3_ll",HFILEM,HFIPRI,HRECFM,HDIR,KGRID,KLENCH,IRESP) - END IF - IF (GALLOC) DEALLOCATE(ZFIELDP) - IF (GALLOC_ll) DEALLOCATE(ZSLIDE_ll) - !IF (Associated(ZSLIDE_ll)) DEALLOCATE(ZSLIDE_ll) - KRESP = IRESP - IF (ASSOCIATED(TZFD)) CALL MPI_BARRIER(TZFD%COMM,IERR) - CALL SECOND_MNH2(T22) - TIMEZ%T_WRIT3D_ALL=TIMEZ%T_WRIT3D_ALL + T22 - T11 - END SUBROUTINE FMWRITX3_ll - - SUBROUTINE FMWRITX4_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& - KLENCH,HCOMMENT,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT,LPACK,L1D,L2D - 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 -!!!!! MOD SB -#ifdef MNH_NCWRIT - USE MODD_NCOUT - USE MODE_UTIL -#endif -!!!!! MOD SB - ! - ! - !* 0.1 Declarations of arguments - ! - CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name - CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to write - CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages - CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form - REAL,DIMENSION(:,:,:,:),TARGET,INTENT(IN) ::PFIELD ! array containing the data field - INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) - INTEGER, INTENT(IN) ::KLENCH ! length of comment string - CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT ! comment string - INTEGER, INTENT(OUT)::KRESP ! return-code - ! - !* 0.2 Declarations of local variables - ! - CHARACTER(LEN=JPFINL) :: YFNLFI - INTEGER :: IERR - TYPE(FD_ll), POINTER :: TZFD - INTEGER :: IRESP - REAL,DIMENSION(:,:,:,:),POINTER :: ZFIELDP - TYPE(FMHEADER) :: TZFMH - LOGICAL :: GALLOC - ! - !* 1.1 THE NAME OF LFIFM - ! - IRESP = 0 - GALLOC = .FALSE. - YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' - !print * , ' Writing Article 4 ' , HRECFM - !------------------------------------------------------------------ - TZFD=>GETFD(YFNLFI) - IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC) THEN ! sequential execution - TZFMH%GRID=KGRID - TZFMH%COMLEN=KLENCH - TZFMH%COMMENT=HCOMMENT - ! IF (LPACK .AND. L1D .AND. HDIR=='XY') THEN - IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==2*JPHEXT+1 .AND. SIZE(PFIELD,2)==2*JPHEXT+1) THEN - ZFIELDP=>PFIELD(2:2,2:2,:,:) -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) -#endif - ! ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN - ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==2*JPHEXT+1) THEN - ZFIELDP=>PFIELD(:,2:2,:,:) -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) -#endif - ELSE -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP) -#endif - END IF - ELSE - IF (ISP == TZFD%OWNER) THEN - CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC) - ELSE - ALLOCATE(ZFIELDP(0,0,0,0)) - GALLOC = .TRUE. - END IF - ! - IF (HDIR == 'XX' .OR. HDIR =='YY') THEN - CALL GATHER_XXFIELD(HDIR,PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM) - ELSEIF (HDIR == 'XY') THEN - IF (LPACK .AND. L2D) THEN - CALL GATHER_XXFIELD('XX',PFIELD(:,2,:,:),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 - TZFMH%GRID=KGRID - TZFMH%COMLEN=KLENCH - TZFMH%COMMENT=HCOMMENT -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) -#endif - 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("FMWRITX4_ll",HFILEM,HFIPRI,HRECFM,HDIR,KGRID,KLENCH,IRESP) - END IF - IF (GALLOC) DEALLOCATE(ZFIELDP) - KRESP = IRESP - END SUBROUTINE FMWRITX4_ll - - SUBROUTINE FMWRITX5_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& - KLENCH,HCOMMENT,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT,LPACK,L1D,L2D - 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 -#ifdef MNH_NCWRIT - USE MODE_UTIL - USE MODD_DIM_n - USE MODD_NCOUT -#endif - ! - ! - !* 0.1 Declarations of arguments - ! - CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name - CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to write - CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages - CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form - REAL,DIMENSION(:,:,:,:,:),TARGET,INTENT(IN) ::PFIELD ! array containing the data field - INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) - INTEGER, INTENT(IN) ::KLENCH ! length of comment string - CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT ! comment string - INTEGER, INTENT(OUT)::KRESP ! return-code - ! - !* 0.2 Declarations of local variables - ! - CHARACTER(LEN=JPFINL) :: YFNLFI - INTEGER :: IERR - TYPE(FD_ll), POINTER :: TZFD - INTEGER :: IRESP - REAL,DIMENSION(:,:,:,:,:),POINTER :: ZFIELDP - TYPE(FMHEADER) :: TZFMH - LOGICAL :: GALLOC -#ifdef MNH_NCWRIT - TYPE(workfield), DIMENSION(:), POINTER :: TZRECLIST - INTEGER,DIMENSION(6) :: TABDIM -#endif - ! - !* 1.1 THE NAME OF LFIFM - ! - IRESP = 0 - GALLOC = .FALSE. - YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' -#ifdef MNH_NCWRIT - TABDIM(:)=1 - TABDIM(1)=SIZE(PFIELD,1) - TABDIM(2)=SIZE(PFIELD,2) - TABDIM(3)=SIZE(PFIELD,3) - TABDIM(4)=SIZE(PFIELD,4) - TABDIM(5)=SIZE(PFIELD,5) - !print * , ' Writing Article 5 ' , HRECFM -#endif - !------------------------------------------------------------------ - TZFD=>GETFD(YFNLFI) - IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC) THEN ! sequential execution - TZFMH%GRID=KGRID - TZFMH%COMLEN=KLENCH - TZFMH%COMMENT=HCOMMENT - ! IF (LPACK .AND. L1D .AND. HDIR=='XY') THEN - IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==2*JPHEXT+1 .AND. SIZE(PFIELD,2)==2*JPHEXT+1) THEN - ZFIELDP=>PFIELD(2:2,2:2,:,:,:) -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) -#endif - ! ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN - ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==2*JPHEXT+1) THEN - ZFIELDP=>PFIELD(:,2:2,:,:,:) -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - END IF - IF ( LNETCDF .AND. NC_WRITE ) THEN - TABDIM(2)=1 - IF ( NC_FILE == 'phy' ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP), & - ZFIELDP,TZFMH,IRESP) - END IF - CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,ZFIELDP,.TRUE.,TZRECLIST, & -! CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,ZFIELDP, & - & KLENCH,HCOMMENT) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) -#endif - ELSE -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) - END IF - IF ( LNETCDF .AND. NC_WRITE ) THEN - IF ( NC_FILE == 'phy' ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD), & - PFIELD,TZFMH,IRESP) - END IF - CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,PFIELD,.TRUE.,TZRECLIST, & -! CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,PFIELD, & - & KLENCH,HCOMMENT) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP) -#endif - END IF - ELSE - IF (ISP == TZFD%OWNER) THEN - CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC) - ELSE - ALLOCATE(ZFIELDP(0,0,0,0,0)) - GALLOC = .TRUE. - END IF - ! - IF (HDIR == 'XX' .OR. HDIR =='YY') THEN - CALL GATHER_XXFIELD(HDIR,PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM) - ELSEIF (HDIR == 'XY') THEN - IF (LPACK .AND. L2D) THEN - CALL GATHER_XXFIELD('XX',PFIELD(:,2,:,:,:),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 - TZFMH%GRID=KGRID - TZFMH%COMLEN=KLENCH - TZFMH%COMMENT=HCOMMENT -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& - & ,IRESP) - END IF - IF ( LNETCDF .AND. NC_WRITE ) THEN - IF ( NC_FILE == 'phy' ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& - & ,IRESP) - END IF - CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,ZFIELDP,.TRUE.,TZRECLIST, & -! CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,ZFIELDP, & - & KLENCH,HCOMMENT) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& - & ,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) -#endif - 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("FMWRITX5_ll",HFILEM,HFIPRI,HRECFM,HDIR,KGRID,KLENCH,IRESP) - END IF - IF (GALLOC) DEALLOCATE(ZFIELDP) - KRESP = IRESP - END SUBROUTINE FMWRITX5_ll - - SUBROUTINE FMWRITX6_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& - KLENCH,HCOMMENT,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT - USE MODD_FM - USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL - USE MODE_ALLOCBUFFER_ll - USE MODE_GATHER_ll - ! -!!!! MOD SB -#ifdef MNH_NCWRIT - USE MODD_NCOUT - USE MODE_UTIL -#endif -!!!! MOD SB - ! - !* 0.1 Declarations of arguments - ! - CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name - CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to write - CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages - CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form - REAL,DIMENSION(:,:,:,:,:,:),TARGET,INTENT(IN) ::PFIELD ! array containing the data field - INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) - INTEGER, INTENT(IN) ::KLENCH ! length of comment string - CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT ! comment string - INTEGER, INTENT(OUT)::KRESP ! return-code - ! - !* 0.2 Declarations of local variables - ! - CHARACTER(LEN=JPFINL) :: YFNLFI - INTEGER :: IERR - TYPE(FD_ll), POINTER :: TZFD - INTEGER :: IRESP - REAL,DIMENSION(:,:,:,:,:,:),POINTER :: ZFIELDP - TYPE(FMHEADER) :: TZFMH - LOGICAL :: GALLOC - ! - !* 1.1 THE NAME OF LFIFM - ! - IRESP = 0 - GALLOC = .FALSE. - YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' - !print * , ' Writing Article 6 ' , HRECFM - !------------------------------------------------------------------ - TZFD=>GETFD(YFNLFI) - IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC) THEN ! sequential execution - TZFMH%GRID=KGRID - TZFMH%COMLEN=KLENCH - TZFMH%COMMENT=HCOMMENT -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP) -#endif - ELSE ! multiprocessor execution - IF (ISP == TZFD%OWNER) THEN - CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC) - ELSE - ALLOCATE(ZFIELDP(0,0,0,0,0,0)) - GALLOC = .TRUE. - END IF - ! - IF (HDIR == 'XX' .OR. HDIR =='YY') THEN - CALL GATHER_XXFIELD(HDIR,PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM) - ELSEIF (HDIR == 'XY') THEN - CALL GATHER_XYFIELD(PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM) - END IF - ! - IF (ISP == TZFD%OWNER) THEN - TZFMH%GRID=KGRID - TZFMH%COMLEN=KLENCH - TZFMH%COMMENT=HCOMMENT -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& - & ,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& - & ,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) -#endif - 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("FMWRITX6_ll",HFILEM,HFIPRI,HRECFM,HDIR,KGRID,KLENCH,IRESP) - END IF - IF (GALLOC) DEALLOCATE(ZFIELDP) - KRESP = IRESP - END SUBROUTINE FMWRITX6_ll - - SUBROUTINE FMWRITN0_ll(HFILEM,HRECFM,HFIPRI,HDIR,KFIELD,KGRID,& - KLENCH,HCOMMENT,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT - USE MODD_FM - USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL - !* 0. DECLARATIONS - ! ------------ -!!!! MOD SB -#ifdef MNH_NCWRIT - USE MODD_NCOUT - USE MODE_UTIL -#endif -!!!! MOD SB - ! - ! - !* 0.1 Declarations of arguments - ! - CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name - CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read - CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages - CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form - INTEGER, INTENT(IN) ::KFIELD ! array containing the data field - INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) - INTEGER, INTENT(IN) ::KLENCH ! length of comment string - CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT! comment string - INTEGER, INTENT(OUT)::KRESP ! return-code - ! - !* 0.2 Declarations of local variables - ! - CHARACTER(LEN=JPFINL) :: YFNLFI - INTEGER :: IERR - TYPE(FD_ll), POINTER :: TZFD - INTEGER :: IRESP - TYPE(FMHEADER) :: TZFMH - - !JUANZIO - INTEGER :: IK_FILE,IK_rank - CHARACTER(len=5) :: YK_FILE - CHARACTER(len=128) :: YFILE_IOZ - TYPE(FD_ll), POINTER :: TZFD_IOZ - !JUANZIO - !---------------------------------------------------------------- - ! - !* 1.1 THE NAME OF LFIFM - ! - IRESP = 0 - YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' - !print * , ' Writing Article N0 ' , HRECFM - !------------------------------------------------------------------ - TZFD=>GETFD(YFNLFI) - IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC) THEN ! sequential execution - TZFMH%GRID=KGRID - TZFMH%COMLEN=KLENCH - TZFMH%COMMENT=HCOMMENT -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,KFIELD,TZFMH,IRESP) -#endif - ELSE - IF (ISP == TZFD%OWNER) THEN - TZFMH%GRID=KGRID - TZFMH%COMLEN=KLENCH - TZFMH%COMMENT=HCOMMENT -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,KFIELD,TZFMH,IRESP) -#endif - 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(HFILEM)//YK_FILE//".lfi" - TZFD_IOZ => GETFD(YFILE_IOZ) - IK_RANK = TZFD_IOZ%OWNER - IF ( ISP == IK_RANK ) THEN - TZFMH%GRID=KGRID - TZFMH%COMLEN=KLENCH - TZFMH%COMMENT=HCOMMENT -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD_IOZ%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD_IOZ%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD_IOZ%CDF,HRECFM,HDIR,KFIELD,TZFMH,IRESP) -#endif - END IF - END DO - ENDIF - ELSE - IRESP = -61 - END IF - !---------------------------------------------------------------- - IF (IRESP.NE.0) THEN - CALL FM_WRIT_ERR("FMWRITN0_ll",HFILEM,HFIPRI,HRECFM,HDIR,KGRID,KLENCH& - & ,IRESP) - END IF - KRESP = IRESP - END SUBROUTINE FMWRITN0_ll - - SUBROUTINE FMWRITN1_ll(HFILEM,HRECFM,HFIPRI,HDIR,KFIELD,KGRID,& - KLENCH,HCOMMENT,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT - USE MODD_FM - USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL - USE MODE_ALLOCBUFFER_ll - USE MODE_GATHER_ll - !* 0. DECLARATIONS - ! ------------ -!!!! MOD SB -#ifdef MNH_NCWRIT - USE MODD_NCOUT - USE MODE_UTIL -#endif -!!!! MOD SB - ! - ! - !* 0.1 Declarations of arguments - ! - CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name - CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to write - CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages - CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form - INTEGER,DIMENSION(:),TARGET,INTENT(IN) ::KFIELD ! array containing the data field - INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) - INTEGER, INTENT(IN) ::KLENCH ! length of comment string - CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT ! comment string - INTEGER, INTENT(OUT)::KRESP ! return-code - ! - !* 0.2 Declarations of local variables - ! - CHARACTER(LEN=JPFINL) :: YFNLFI - INTEGER :: IERR - TYPE(FD_ll), POINTER :: TZFD - INTEGER :: IRESP - TYPE(FMHEADER) :: TZFMH - INTEGER,DIMENSION(:),POINTER :: IFIELDP - LOGICAL :: GALLOC -#ifdef MNH_NCWRIT - REAL,DIMENSION(SIZE(KFIELD)) ::WFIELD - TYPE(workfield), DIMENSION(:), POINTER :: TZRECLIST - INTEGER,DIMENSION(6) :: TABDIM -#endif - !---------------------------------------------------------------- - ! - !* 1.1 THE NAME OF LFIFM - ! - IRESP = 0 - GALLOC = .FALSE. - YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' - !print * , ' Writing Article N1 ' , HRECFM -#ifdef MNH_NCWRIT - WFIELD = KFIELD - TABDIM(:)=1 -#endif - !------------------------------------------------------------------ - TZFD=>GETFD(YFNLFI) - IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC) THEN ! sequential execution - TZFMH%GRID=KGRID - TZFMH%COMLEN=KLENCH - TZFMH%COMMENT=HCOMMENT -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(KFIELD),KFIELD,TZFMH,IRESP) - END IF - IF ( LNETCDF .AND. NC_WRITE ) THEN - CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,WFIELD, & - & .TRUE.,TZRECLIST,KLENCH,HCOMMENT) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(KFIELD),KFIELD,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,KFIELD,TZFMH,IRESP) -#endif - ELSE - IF (ISP == TZFD%OWNER) THEN - CALL ALLOCBUFFER_ll(IFIELDP,KFIELD,HDIR,GALLOC) - ELSE - ALLOCATE(IFIELDP(0)) - GALLOC = .TRUE. - END IF - ! - IF (HDIR == 'XX' .OR. HDIR =='YY') THEN - CALL GATHER_XXFIELD(HDIR,KFIELD,IFIELDP,TZFD%OWNER,TZFD%COMM) - END IF - ! - IF (ISP == TZFD%OWNER) THEN - TZFMH%GRID=KGRID - TZFMH%COMLEN=KLENCH - TZFMH%COMMENT=HCOMMENT -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH& - & ,IRESP) - END IF - IF ( LNETCDF .AND. NC_WRITE ) THEN - CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,WFIELD, & - .TRUE.,TZRECLIST,& - & KLENCH,HCOMMENT) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH& - & ,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,IFIELDP,TZFMH,IRESP) -#endif - 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("FMWRITN1_ll",HFILEM,HFIPRI,HRECFM,HDIR,KGRID,KLENCH& - & ,IRESP) - END IF - IF (GALLOC) DEALLOCATE(IFIELDP) - KRESP = IRESP - END SUBROUTINE FMWRITN1_ll - - SUBROUTINE FMWRITN2_ll(HFILEM,HRECFM,HFIPRI,HDIR,KFIELD,KGRID,& - KLENCH,HCOMMENT,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT,LPACK,L1D,L2D - 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 - ! -!!!! MOD SB -#ifdef MNH_NCWRIT - USE MODD_NCOUT - USE MODE_UTIL -#endif -!!!! MOD SB - ! - !* 0.1 Declarations of arguments - ! - CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name - CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to write - CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages - CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form - INTEGER,DIMENSION(:,:),TARGET,INTENT(IN) ::KFIELD ! array containing the data field - INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) - INTEGER, INTENT(IN) ::KLENCH ! length of comment string - CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT ! comment string - INTEGER, INTENT(OUT)::KRESP ! return-code - ! - !* 0.2 Declarations of local variables - ! - CHARACTER(LEN=JPFINL) :: YFNLFI - INTEGER :: IERR - TYPE(FD_ll), POINTER :: TZFD - INTEGER :: IRESP - INTEGER,DIMENSION(:,:),POINTER :: IFIELDP - TYPE(FMHEADER) :: TZFMH - LOGICAL :: GALLOC - - ! - !* 1.1 THE NAME OF LFIFM - ! - IRESP = 0 - GALLOC = .FALSE. - YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' - !print * , ' Writing Article N2 ' , HRECFM - ! - TZFD=>GETFD(YFNLFI) -! IF (ASSOCIATED(TZFD) .OR. .not.LLFIFM) THEN - IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC) THEN ! sequential execution - TZFMH%GRID=KGRID - TZFMH%COMLEN=KLENCH - TZFMH%COMMENT=HCOMMENT - ! IF (LPACK .AND. L1D .AND. HDIR=='XY') THEN - IF (LPACK .AND. L1D .AND. SIZE(KFIELD,1)==2*JPHEXT+1 .AND. SIZE(KFIELD,2)==2*JPHEXT+1) THEN - IFIELDP=>KFIELD(2:2,2:2) -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,IFIELDP,TZFMH,IRESP) -#endif - ! ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN - ELSEIF (LPACK .AND. L2D .AND. SIZE(KFIELD,2)==2*JPHEXT+1) THEN - IFIELDP=>KFIELD(:,2:2) -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,IFIELDP,TZFMH,IRESP) -#endif - ELSE -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(KFIELD),KFIELD,TZFMH,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(KFIELD),KFIELD,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,KFIELD,TZFMH,IRESP) -#endif - END IF - ELSE - IF (ISP == TZFD%OWNER) THEN - CALL ALLOCBUFFER_ll(IFIELDP,KFIELD,HDIR,GALLOC) - ELSE - ALLOCATE(IFIELDP(0,0)) - GALLOC = .TRUE. - END IF - ! - IF (HDIR == 'XX' .OR. HDIR =='YY') THEN - CALL GATHER_XXFIELD(HDIR,KFIELD,IFIELDP,TZFD%OWNER,TZFD%COMM) - ELSEIF (HDIR == 'XY') THEN - IF (LPACK .AND. L2D) THEN - CALL GATHER_XXFIELD('XX',KFIELD(:,2),IFIELDP(:,1),TZFD%OWNER,TZFD%COMM) - ELSE - CALL GATHER_XYFIELD(KFIELD,IFIELDP,TZFD%OWNER,TZFD%COMM) - END IF - END IF - ! - IF (ISP == TZFD%OWNER) THEN - TZFMH%GRID=KGRID - TZFMH%COMLEN=KLENCH - TZFMH%COMMENT=HCOMMENT -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH& - & ,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH& - & ,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,IFIELDP,TZFMH,IRESP) -#endif - 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("FMWRITN2_ll",HFILEM,HFIPRI,HRECFM,HDIR,KGRID,KLENCH,IRESP) - END IF - IF (GALLOC) DEALLOCATE(IFIELDP) - KRESP = IRESP - END SUBROUTINE FMWRITN2_ll - - - SUBROUTINE FMWRITL0_ll(HFILEM,HRECFM,HFIPRI,HDIR,OFIELD,KGRID,& - KLENCH,HCOMMENT,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT - USE MODD_FM - USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL - -!!!! MOD SB -#ifdef MNH_NCWRIT - USE MODD_NCOUT - USE MODE_UTIL -#endif -!!!! MOD SB - ! - !* 0. DECLARATIONS - ! ------------ - ! - ! - !* 0.1 Declarations of arguments - ! - CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name - CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read - CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages - CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form - LOGICAL, INTENT(IN) ::OFIELD ! array containing the data field - INTEGER, INTENT(IN)::KGRID ! C-grid indicator (u,v,w,T) - INTEGER, INTENT(IN)::KLENCH ! length of comment string - CHARACTER(LEN=*), INTENT(IN)::HCOMMENT ! comment string - INTEGER, INTENT(OUT)::KRESP ! return-code - ! - !* 0.2 Declarations of local variables - ! - INTEGER :: IFIELD - CHARACTER(LEN=JPFINL) :: YFNLFI - INTEGER :: IERR - TYPE(FD_ll), POINTER :: TZFD - INTEGER :: IRESP - TYPE(FMHEADER) :: TZFMH - - !---------------------------------------------------------------- - ! - !* 1.1 THE NAME OF LFIFM - ! - IRESP = 0 - YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' - !print * , ' Writing Article L0 ' , HRECFM - IF (OFIELD) THEN - IFIELD=1 - ELSE - IFIELD=0 - END IF - !---------------------------------------------------------------- - TZFD=>GETFD(YFNLFI) -! IF (ASSOCIATED(TZFD) .OR. .not.LLFIFM) THEN - IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC) THEN ! sequential execution - TZFMH%GRID=KGRID - TZFMH%COMLEN=KLENCH - TZFMH%COMMENT=HCOMMENT -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,IFIELD,TZFMH,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,IFIELD,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,IFIELD,TZFMH,IRESP) -#endif - ELSE - IF (ISP == TZFD%OWNER) THEN - TZFMH%GRID=KGRID - TZFMH%COMLEN=KLENCH - TZFMH%COMMENT=HCOMMENT -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,IFIELD,TZFMH,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,IFIELD,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,IFIELD,TZFMH,IRESP) -#endif - 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("FMWRITL0_ll",HFILEM,HFIPRI,HRECFM,HDIR,KGRID,KLENCH& - & ,IRESP) - END IF - KRESP = IRESP - END SUBROUTINE FMWRITL0_ll - - SUBROUTINE FMWRITL1_ll(HFILEM,HRECFM,HFIPRI,HDIR,OFIELD,KGRID,& - KLENCH,HCOMMENT,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT - USE MODD_FM - USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL - - !* 0. DECLARATIONS - ! ------------ -!!!! MOD SB -#ifdef MNH_NCWRIT - USE MODD_NCOUT - USE MODE_UTIL -#endif -!!!! MOD SB - ! - !* 0.1 Declarations of arguments - ! - CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name - CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read - CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages - CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form - LOGICAL,DIMENSION(:),INTENT(IN) ::OFIELD ! array containing the data field - INTEGER, INTENT(IN)::KGRID ! C-grid indicator (u,v,w,T) - INTEGER, INTENT(IN)::KLENCH ! length of comment string - CHARACTER(LEN=*), INTENT(IN)::HCOMMENT ! comment string - INTEGER, INTENT(OUT)::KRESP ! return-code - ! - !* 0.2 Declarations of local variables - ! - INTEGER, DIMENSION(SIZE(OFIELD)) :: IFIELD - CHARACTER(LEN=JPFINL) :: YFNLFI - INTEGER :: IERR - TYPE(FD_ll), POINTER :: TZFD - INTEGER :: IRESP - TYPE(FMHEADER) :: TZFMH - - !---------------------------------------------------------------- - ! - !* 1.1 THE NAME OF LFIFM - ! - IRESP = 0 - YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' - !print * , ' Writing Article L1 ' , HRECFM - WHERE (OFIELD) - IFIELD=1 - ELSEWHERE - IFIELD=0 - END WHERE - !---------------------------------------------------------------- - TZFD=>GETFD(YFNLFI) -! IF (ASSOCIATED(TZFD) .OR. .not.LLFIFM) THEN - IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC) THEN ! sequential execution - TZFMH%GRID=KGRID - TZFMH%COMLEN=KLENCH - TZFMH%COMMENT=HCOMMENT -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELD),IFIELD,TZFMH,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELD),IFIELD,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,IFIELD,TZFMH,IRESP) -#endif - ELSE - IF (ISP == TZFD%OWNER) THEN - TZFMH%GRID=KGRID - TZFMH%COMLEN=KLENCH - TZFMH%COMMENT=HCOMMENT -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELD),IFIELD,TZFMH,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELD),IFIELD,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,IFIELD,TZFMH,IRESP) -#endif - 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("FMWRITL1_ll",HFILEM,HFIPRI,HRECFM,HDIR,KGRID,KLENCH& - & ,IRESP) - END IF - KRESP = IRESP - END SUBROUTINE FMWRITL1_ll - - SUBROUTINE FMWRITC0_ll(HFILEM,HRECFM,HFIPRI,HDIR,HFIELD,KGRID,& - KLENCH,HCOMMENT,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT - USE MODD_FM - USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL - ! - !* 0. DECLARATIONS - ! ------------ - ! -!!!! MOD SB -#ifdef MNH_NCWRIT - USE MODD_NCOUT - USE MODE_UTIL -#endif -!!! MOD SB - ! - !* 0.1 Declarations of arguments - ! - CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name - CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read - CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages - CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form - CHARACTER(LEN=*), INTENT(IN) ::HFIELD ! array containing the data field - INTEGER, INTENT(IN)::KGRID ! C-grid indicator (u,v,w,T) - INTEGER, INTENT(IN)::KLENCH ! length of comment string - CHARACTER(LEN=*), INTENT(IN)::HCOMMENT ! comment string - INTEGER, INTENT(OUT)::KRESP ! return-code - ! - !* 0.2 Declarations of local variables - ! - INTEGER :: JLOOP - INTEGER,DIMENSION(:),ALLOCATABLE :: IFIELD - INTEGER :: ILENG - CHARACTER(LEN=JPFINL) :: YFNLFI - INTEGER :: IERR - TYPE(FD_ll), POINTER :: TZFD - INTEGER :: IRESP - TYPE(FMHEADER) :: TZFMH -#ifdef MNH_NCWRIT - TYPE(workfield), DIMENSION(:), POINTER :: TZRECLIST - INTEGER,DIMENSION(6) :: TABDIM -#endif - - !---------------------------------------------------------------- - !* 1.1 THE NAME OF LFIFM - ! - IRESP = 0 - YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' - !print * , ' Writing Article C0 ' , HRECFM - ILENG=LEN(HFIELD) -#ifdef MNH_NCWRIT - TABDIM(:)=1 - TABDIM(1)=ILENG -#endif - ! - IF (ILENG==0) THEN - ILENG=1 - ALLOCATE(IFIELD(1)) - IFIELD(1)=IACHAR(' ') - ELSE - ALLOCATE(IFIELD(ILENG)) - DO JLOOP=1,ILENG - IFIELD(JLOOP)=IACHAR(HFIELD(JLOOP:JLOOP)) - END DO - END IF - !---------------------------------------------------------------- - TZFD=>GETFD(YFNLFI) - IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC) THEN ! sequential execution - TZFMH%GRID=KGRID - TZFMH%COMLEN=KLENCH - TZFMH%COMMENT=HCOMMENT -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,KRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,HFIELD,TZFMH,IRESP) -#endif - ELSE - IF (ISP == TZFD%OWNER) THEN - TZFMH%GRID=KGRID - TZFMH%COMLEN=KLENCH - TZFMH%COMMENT=HCOMMENT -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,KRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,HFIELD,TZFMH,IRESP) -#endif - 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("FMWRITC0_ll",HFILEM,HFIPRI,HRECFM,HDIR,KGRID,KLENCH& - & ,IRESP) - END IF - IF (ALLOCATED(IFIELD)) DEALLOCATE(IFIELD) - KRESP = IRESP - END SUBROUTINE FMWRITC0_ll - - SUBROUTINE FMWRITC1_ll(HFILEM,HRECFM,HFIPRI,HDIR,HFIELD,KGRID,& - KLENCH,HCOMMENT,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT - USE MODD_FM - USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL - ! - !* 0. DECLARATIONS - ! ------------ - ! - ! - !* 0.1 Declarations of arguments - ! - CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name - CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read - CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages - CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form - CHARACTER(LEN=*),DIMENSION(:),INTENT(IN) ::HFIELD ! array containing the data field - INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) - INTEGER, INTENT(IN) ::KLENCH ! length of comment string - CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT ! comment string - INTEGER, INTENT(OUT)::KRESP ! return-code - ! - !* 0.2 Declarations of local variables - ! - INTEGER :: J,JJ - INTEGER :: ILE, IP - INTEGER,DIMENSION(:),ALLOCATABLE :: IFIELD - INTEGER :: ILENG - CHARACTER(LEN=JPFINL) :: YFNLFI - INTEGER :: IERR - TYPE(FD_ll), POINTER :: TZFD - INTEGER :: IRESP - TYPE(FMHEADER) :: TZFMH - !---------------------------------------------------------------- - !* 1.1 THE NAME OF LFIFM - ! - IRESP = 0 - YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' - !print * , ' Writing Article C1 ' , HRECFM - ILE=LEN(HFIELD) - IP=SIZE(HFIELD) - ILENG=ILE*IP - ! - IF (ILENG==0) THEN - IP=1 - ILE=1 - ILENG=1 - ALLOCATE(IFIELD(1)) - IFIELD(1)=IACHAR(' ') - ELSE - ALLOCATE(IFIELD(ILENG)) - DO JJ=1,IP - DO J=1,ILE - IFIELD(ILE*(JJ-1)+J)=IACHAR(HFIELD(JJ)(J:J)) - END DO - END DO - END IF - !---------------------------------------------------------------- - TZFD=>GETFD(YFNLFI) - IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC) THEN ! sequential execution - TZFMH%GRID=KGRID - TZFMH%COMLEN=KLENCH - TZFMH%COMMENT=HCOMMENT - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,HFIELD,TZFMH,IRESP) - ELSE - IF (ISP == TZFD%OWNER) THEN - TZFMH%GRID=KGRID - TZFMH%COMLEN=KLENCH - TZFMH%COMMENT=HCOMMENT - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,HFIELD,TZFMH,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("FMWRITC1_ll",HFILEM,HFIPRI,HRECFM,HDIR,KGRID,KLENCH& - & ,IRESP) - END IF - IF (ALLOCATED(IFIELD)) DEALLOCATE(IFIELD) - KRESP = IRESP - END SUBROUTINE FMWRITC1_ll - - SUBROUTINE FMWRITT0_ll(HFILEM,HRECFM,HFIPRI,HDIR,TFIELD,KGRID,& - KLENCH,HCOMMENT,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT - USE MODD_TYPE_DATE - USE MODD_FM - USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL - ! -!!!! MOD SB -#ifdef MNH_NCWRIT - USE MODD_NCOUT - USE MODE_UTIL -#endif -!!!! MOD SB - !* 0.1 Declarations of arguments - ! - CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name - CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read - CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages - CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form - TYPE (DATE_TIME), INTENT(IN) ::TFIELD ! array containing the data field - INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) - INTEGER, INTENT(IN) ::KLENCH ! length of comment string - CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT ! comment string - INTEGER, INTENT(OUT)::KRESP ! return-code - !-------------------------------------------------------------------- - ! - !* 0.2 Declarations of local variables - ! - CHARACTER(LEN=JPFINL) :: YFNLFI - INTEGER :: IERR - TYPE(FD_ll), POINTER :: TZFD - INTEGER :: IRESP - TYPE(FMHEADER) :: TZFMH - INTEGER, DIMENSION(3) :: ITDATE ! date array - ! - !------------------------------------------------------------------------------- - IRESP = 0 - YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' - !print * , ' Writing Article T0 ' , HRECFM - ITDATE(1)=TFIELD%TDATE%YEAR - ITDATE(2)=TFIELD%TDATE%MONTH - ITDATE(3)=TFIELD%TDATE%DAY - !------------------------------------------------------------------------------- - TZFD=>GETFD(YFNLFI) -! IF (ASSOCIATED(TZFD) .OR. .not.LLFIFM) THEN - IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC) THEN ! sequential execution - TZFMH%GRID=KGRID - TZFMH%COMMENT='YYYYMMDD' - TZFMH%COMLEN=LEN_TRIM(TZFMH%COMMENT) -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,TRIM(HRECFM)//'%TDATE',.FALSE.,3,ITDATE& - & ,TZFMH,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,TRIM(HRECFM)//'%TDATE',.FALSE.,3,ITDATE& - & ,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,TRIM(HRECFM)//'%TDATE',HDIR,ITDATE,TZFMH,IRESP) -#endif - TZFMH%COMMENT='SECONDS' - TZFMH%COMLEN=LEN_TRIM(TZFMH%COMMENT) -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,TRIM(HRECFM)//'%TIME',.TRUE.,1,TFIELD%TIME& - & ,TZFMH,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,TRIM(HRECFM)//'%TIME',.TRUE.,1,TFIELD%TIME& - & ,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,TRIM(HRECFM)//'%TIME',HDIR,TFIELD%TIME,TZFMH,IRESP) -#endif - ELSE - IF (ISP == TZFD%OWNER) THEN - TZFMH%GRID=KGRID - TZFMH%COMMENT='YYYYMMDD' - TZFMH%COMLEN=LEN_TRIM(TZFMH%COMMENT) -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,TRIM(HRECFM)//'%TDATE',.FALSE.,3,ITDATE& - & ,TZFMH,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,TRIM(HRECFM)//'%TDATE',.FALSE.,3,ITDATE& - & ,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,TRIM(HRECFM)//'%TDATE',HDIR,ITDATE,TZFMH,IRESP) -#endif - TZFMH%COMMENT='SECONDS' - TZFMH%COMLEN=LEN_TRIM(TZFMH%COMMENT) -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,TRIM(HRECFM)//'%TIME',.TRUE.,1,TFIELD%TIME& - & ,TZFMH,IRESP) - END IF -#else - - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,TRIM(HRECFM)//'%TIME',.TRUE.,1,TFIELD%TIME& - & ,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,TRIM(HRECFM)//'%TIME',HDIR,TFIELD%TIME,TZFMH,IRESP) -#endif - 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("FMWRITT0_ll",HFILEM,HFIPRI,HRECFM,HDIR,KGRID,KLENCH& - & ,IRESP) - END IF - KRESP = IRESP - END SUBROUTINE FMWRITT0_ll - - SUBROUTINE FMWRIT_LB(HFILEM,HRECFM,HFIPRI,HLBTYPE,PLB,KRIM,KL3D,& - & KGRID,KLENCH,HCOMMENT,KRESP) - USE MODD_IO_ll, ONLY : ISP,ISNPROC,GSMONOPROC,LIOCDF4,LLFIOUT,LPACK,L2D - USE MODD_PARAMETERS_ll,ONLY : JPHEXT - USE MODD_FM - USE MODE_DISTRIB_LB - USE MODE_TOOLS_ll, ONLY : GET_GLOBALDIMS_ll - USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL - ! -!!!! MOD SB -#ifdef MNH_NCWRIT - USE MODD_NCOUT - USE MODE_UTIL -#endif -!!!! MOD SB - USE MODD_VAR_ll, ONLY : MNH_STATUSES_IGNORE - ! - !* 0.1 Declarations of arguments - ! - CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! file name - CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to be written - CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! file for prints in FM - CHARACTER(LEN=*), INTENT(IN) ::HLBTYPE! 'LBX','LBXU','LBY' or 'LBYV' - REAL,DIMENSION(:,:,:),TARGET,INTENT(IN) ::PLB ! array containing the LB field - INTEGER, INTENT(IN) ::KRIM ! size of the LB area - INTEGER, INTENT(IN) ::KL3D ! size of the LB array in FM - INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) - INTEGER, INTENT(IN) ::KLENCH ! length of comment string - CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT ! comment string - INTEGER, INTENT(OUT)::KRESP ! return-code - ! - !* 0.2 Declarations of local variables - ! - CHARACTER(LEN=JPFINL) :: YFNLFI - INTEGER :: IERR - TYPE(FD_ll), POINTER :: TZFD - INTEGER :: IRESP - REAL,DIMENSION(:,:,:),ALLOCATABLE,TARGET :: Z3D - REAL,DIMENSION(:,:,:), POINTER :: TX3DP - TYPE(FMHEADER) :: TZFMH - INTEGER :: IIMAX_ll,IJMAX_ll - INTEGER :: JI - INTEGER :: IIB,IIE,IJB,IJE - INTEGER, DIMENSION(MPI_STATUS_SIZE) :: STATUS - INTEGER,ALLOCATABLE,DIMENSION(:) :: REQ_TAB - INTEGER :: NB_REQ,IKU - TYPE TX_3DP - REAL,DIMENSION(:,:,:), POINTER :: X - END TYPE TX_3DP - TYPE(TX_3DP),ALLOCATABLE,DIMENSION(:) :: T_TX3DP - ! - !* 1.1 THE NAME OF LFIFM - ! - IRESP = 0 - YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' - !print * , ' Writing Article LB ' , HRECFM - IF (KL3D /= 2*(KRIM+JPHEXT)) THEN - IRESP = -30 - GOTO 1000 - END IF - ! - TZFD=>GETFD(YFNLFI) -! IF (ASSOCIATED(TZFD) .OR. .not.LLFIFM) THEN - IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC) THEN ! sequential execution - TZFMH%GRID=KGRID - TZFMH%COMLEN=KLENCH - TZFMH%COMMENT=HCOMMENT - IF (LPACK .AND. L2D) THEN - TX3DP=>PLB(:,JPHEXT+1:JPHEXT+1,:) -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(TX3DP),TX3DP,TZFMH,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(TX3DP),TX3DP,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',TX3DP,TZFMH,IRESP) -#endif - ELSE -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PLB),PLB,TZFMH,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PLB),PLB,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',PLB,TZFMH,IRESP) -#endif - END IF - ELSE - IF (ISP == TZFD%OWNER) THEN - ! I/O proc case - CALL GET_GLOBALDIMS_ll(IIMAX_ll,IJMAX_ll) - IF (HLBTYPE == 'LBX' .OR. HLBTYPE == 'LBXU') THEN - ALLOCATE(Z3D((KRIM+JPHEXT)*2,IJMAX_ll+2*JPHEXT,SIZE(PLB,3))) - ELSE ! HLBTYPE == 'LBY' .OR. HLBTYPE == 'LBYV' - ALLOCATE(Z3D(IIMAX_ll+2*JPHEXT,(KRIM+JPHEXT)*2,SIZE(PLB,3))) - END IF - DO JI = 1,ISNPROC - CALL GET_DISTRIB_LB(HLBTYPE,JI,'FM','WRITE',KRIM,IIB,IIE,IJB,IJE) - IF (IIB /= 0) THEN - TX3DP=>Z3D(IIB:IIE,IJB:IJE,:) - IF (ISP /= JI) THEN - CALL MPI_RECV(TX3DP,SIZE(TX3DP),MPI_FLOAT,JI-1,99,TZFD%COMM,STATUS,IERR) - ELSE - CALL GET_DISTRIB_LB(HLBTYPE,JI,'LOC','WRITE',KRIM,IIB,IIE,IJB,IJE) - TX3DP = PLB(IIB:IIE,IJB:IJE,:) - END IF - END IF - END DO - TZFMH%GRID=KGRID - TZFMH%COMLEN=KLENCH - TZFMH%COMMENT=HCOMMENT - IF (LPACK .AND. L2D) THEN - TX3DP=>Z3D(:,2:2,:) - ELSE - TX3DP=>Z3D - END IF -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(TX3DP),TX3DP,TZFMH,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(TX3DP),TX3DP,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',TX3DP,TZFMH,IRESP) -#endif - ELSE - NB_REQ=0 - ALLOCATE(REQ_TAB(1)) - ALLOCATE(T_TX3DP(1)) - IKU = SIZE(PLB,3) - ! Other processors - CALL GET_DISTRIB_LB(HLBTYPE,ISP,'LOC','WRITE',KRIM,IIB,IIE,IJB,IJE) - IF (IIB /= 0) THEN - TX3DP=>PLB(IIB:IIE,IJB:IJE,:) - NB_REQ = NB_REQ + 1 - ALLOCATE(T_TX3DP(NB_REQ)%X(IIB:IIE,IJB:IJE,IKU)) - T_TX3DP(NB_REQ)%X=PLB(IIB:IIE,IJB:IJE,:) - CALL MPI_ISEND(T_TX3DP(NB_REQ)%X,SIZE(TX3DP),MPI_FLOAT,TZFD%OWNER-1,99,TZFD%COMM,REQ_TAB(NB_REQ),IERR) - !CALL MPI_BSEND(TX3DP,SIZE(TX3DP),MPI_FLOAT,TZFD%OWNER-1,99,TZFD%COMM,IERR) - END IF - IF (NB_REQ .GT.0 ) THEN - CALL MPI_WAITALL(NB_REQ,REQ_TAB,MNH_STATUSES_IGNORE,IERR) - DEALLOCATE(T_TX3DP(1)%X) - END IF - DEALLOCATE(T_TX3DP,REQ_TAB) - END IF - ! - CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD& - & %COMM,IERR) - END IF !(GSMONOPROC) - ELSE - IRESP = -61 - END IF - !---------------------------------------------------------------- -1000 CONTINUE - IF (IRESP.NE.0) THEN - CALL FM_WRIT_ERR("FMWRIT_LB",HFILEM,HFIPRI,HRECFM,HLBTYPE,KGRID,KLENCH,IRESP) - END IF - ! - IF (ALLOCATED(Z3D)) DEALLOCATE(Z3D) - KRESP = IRESP - END SUBROUTINE FMWRIT_LB - - SUBROUTINE FMWRITBOXX2_ll(HFILEM,HRECFM,HFIPRI,HBUDGET,PFIELD,KGRID,& - HCOMMENT,KXOBOX,KXEBOX,KYOBOX,KYEBOX,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT - USE MODD_FM - USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL - USE MODE_GATHER_ll - ! -!!!! MOD SB -#ifdef MNH_NCWRIT - USE MODD_NCOUT - USE MODE_UTIL -#endif -!!!! MOD SB - ! - !* 0.1 Declarations of arguments - ! - CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name - CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to write - CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages - CHARACTER(LEN=*), INTENT(IN) ::HBUDGET ! 'BUDGET' (budget) or 'OTHER' (MesoNH field) - REAL,DIMENSION(:,:),TARGET, INTENT(IN) ::PFIELD ! array containing the data field - INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) - CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT ! comment string - INTEGER, INTENT(IN) ::KXOBOX ! - INTEGER, INTENT(IN) ::KXEBOX ! Global coordinates of the box - INTEGER, INTENT(IN) ::KYOBOX ! - INTEGER, INTENT(IN) ::KYEBOX ! - INTEGER, INTENT(OUT)::KRESP ! return-code - ! - !* 0.2 Declarations of local variables - ! - CHARACTER(LEN=JPFINL) :: YFNLFI - INTEGER :: IERR - TYPE(FD_ll), POINTER :: TZFD - INTEGER :: IRESP - REAL,DIMENSION(:,:),POINTER :: ZFIELDP - TYPE(FMHEADER) :: TZFMH - LOGICAL :: GALLOC - - ! - !* 1.1 THE NAME OF LFIFM - ! - IRESP = 0 - GALLOC = .FALSE. - YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' - !print * , ' Writing Article BOXX2 ' , HRECFM - !------------------------------------------------------------------ - TZFD=>GETFD(YFNLFI) -! IF (ASSOCIATED(TZFD) .OR. .not.LLFIFM) THEN - IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC) THEN ! sequential execution - TZFMH%GRID = KGRID - TZFMH%COMLEN = LEN_TRIM(HCOMMENT) - TZFMH%COMMENT = HCOMMENT - IF (HBUDGET /= 'BUDGET') THEN - ! take the sub-section of PFIELD defined by the box - ZFIELDP=>PFIELD(KXOBOX:KXEBOX,KYOBOX:KYEBOX) - ELSE - ! take the field as a budget - ZFIELDP=>PFIELD - END IF -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP) -#endif - ELSE ! multiprocessor execution - IF (ISP == TZFD%OWNER) THEN - ! Allocate the box - ALLOCATE(ZFIELDP(KXEBOX-KXOBOX+1,KYEBOX-KYOBOX+1)) - GALLOC = .TRUE. - ELSE - ALLOCATE(ZFIELDP(0,0)) - GALLOC = .TRUE. - END IF - ! - CALL GATHER_XYFIELD(PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM,& - & KXOBOX,KXEBOX,KYOBOX,KYEBOX,HBUDGET) - ! - IF (ISP == TZFD%OWNER) THEN - TZFMH%GRID = KGRID - TZFMH%COMLEN = LEN_TRIM(HCOMMENT) - TZFMH%COMMENT = HCOMMENT -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& - & ,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& - & ,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP) -#endif - 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("FMWRITBOXX2_ll",HFILEM,HFIPRI,HRECFM,'XY',KGRID,LEN(HCOMMENT),IRESP) - END IF - IF (GALLOC) DEALLOCATE(ZFIELDP) - KRESP = IRESP - END SUBROUTINE FMWRITBOXX2_ll - - SUBROUTINE FMWRITBOXX3_ll(HFILEM,HRECFM,HFIPRI,HBUDGET,PFIELD,KGRID,& - HCOMMENT,KXOBOX,KXEBOX,KYOBOX,KYEBOX,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT - USE MODD_FM - USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL - USE MODE_GATHER_ll - ! -!!!! MOD SB -#ifdef MNH_NCWRIT - USE MODD_NCOUT - USE MODE_UTIL -#endif -!!!! MOD SB - ! - !* 0.1 Declarations of arguments - ! - CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name - CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to write - CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages - CHARACTER(LEN=*), INTENT(IN) ::HBUDGET ! 'BUDGET' (budget) or 'OTHER' (MesoNH field) - REAL,DIMENSION(:,:,:),TARGET,INTENT(IN) ::PFIELD ! array containing the data field - INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) - CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT ! comment string - INTEGER, INTENT(IN) ::KXOBOX ! - INTEGER, INTENT(IN) ::KXEBOX ! Global coordinates of the box - INTEGER, INTENT(IN) ::KYOBOX ! - INTEGER, INTENT(IN) ::KYEBOX ! - INTEGER, INTENT(OUT)::KRESP ! return-code - ! - !* 0.2 Declarations of local variables - ! - CHARACTER(LEN=JPFINL) :: YFNLFI - INTEGER :: IERR - TYPE(FD_ll), POINTER :: TZFD - INTEGER :: IRESP - REAL,DIMENSION(:,:,:),POINTER :: ZFIELDP - TYPE(FMHEADER) :: TZFMH - LOGICAL :: GALLOC - - ! - !* 1.1 THE NAME OF LFIFM - ! - IRESP = 0 - GALLOC = .FALSE. - YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' - !print * , ' Writing Article BOXX3 ' , HRECFM - !------------------------------------------------------------------ - TZFD=>GETFD(YFNLFI) -! IF (ASSOCIATED(TZFD) .OR. .not.LLFIFM) THEN - IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC) THEN ! sequential execution - TZFMH%GRID = KGRID - TZFMH%COMLEN = LEN_TRIM(HCOMMENT) - TZFMH%COMMENT = HCOMMENT - IF (HBUDGET /= 'BUDGET') THEN - ! take the sub-section of PFIELD defined by the box - ZFIELDP=>PFIELD(KXOBOX:KXEBOX,KYOBOX:KYEBOX,:) - ELSE - ! take the field as a budget - ZFIELDP=>PFIELD - END IF -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP) -#endif - ELSE ! multiprocessor execution - IF (ISP == TZFD%OWNER) THEN - ! Allocate the box - ALLOCATE(ZFIELDP(KXEBOX-KXOBOX+1,KYEBOX-KYOBOX+1,SIZE(PFIELD,3))) - GALLOC = .TRUE. - ELSE - ALLOCATE(ZFIELDP(0,0,0)) - GALLOC = .TRUE. - END IF - ! - CALL GATHER_XYFIELD(PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM,& - & KXOBOX,KXEBOX,KYOBOX,KYEBOX,HBUDGET) - ! - IF (ISP == TZFD%OWNER) THEN - TZFMH%GRID = KGRID - TZFMH%COMLEN = LEN_TRIM(HCOMMENT) - TZFMH%COMMENT = HCOMMENT -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& - & ,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& - & ,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP) -#endif - 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("FMWRITBOXX3_ll",HFILEM,HFIPRI,HRECFM,'XY',KGRID,LEN(HCOMMENT),IRESP) - END IF - IF (GALLOC) DEALLOCATE(ZFIELDP) - KRESP = IRESP - END SUBROUTINE FMWRITBOXX3_ll - - SUBROUTINE FMWRITBOXX4_ll(HFILEM,HRECFM,HFIPRI,HBUDGET,PFIELD,KGRID,& - HCOMMENT,KXOBOX,KXEBOX,KYOBOX,KYEBOX,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT - USE MODD_FM - USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL - USE MODE_GATHER_ll - ! -!!!! MOD SB -#ifdef MNH_NCWRIT - USE MODD_NCOUT - USE MODE_UTIL -#endif -!!!! MOD SB - ! - !* 0.1 Declarations of arguments - ! - CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name - CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to write - CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages - CHARACTER(LEN=*), INTENT(IN) ::HBUDGET ! 'BUDGET' (budget) or 'OTHER' (MesoNH field) - REAL,DIMENSION(:,:,:,:),TARGET,INTENT(IN) ::PFIELD ! array containing the data field - INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) - CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT ! comment string - INTEGER, INTENT(IN) ::KXOBOX ! - INTEGER, INTENT(IN) ::KXEBOX ! Global coordinates of the box - INTEGER, INTENT(IN) ::KYOBOX ! - INTEGER, INTENT(IN) ::KYEBOX ! - INTEGER, INTENT(OUT)::KRESP ! return-code - ! - !* 0.2 Declarations of local variables - ! - CHARACTER(LEN=JPFINL) :: YFNLFI - INTEGER :: IERR - TYPE(FD_ll), POINTER :: TZFD - INTEGER :: IRESP - REAL,DIMENSION(:,:,:,:),POINTER :: ZFIELDP - TYPE(FMHEADER) :: TZFMH - LOGICAL :: GALLOC - - ! - !* 1.1 THE NAME OF LFIFM - ! - IRESP = 0 - GALLOC = .FALSE. - YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' - !print * , ' Writing Article BOXX4 ' , HRECFM - !------------------------------------------------------------------ - TZFD=>GETFD(YFNLFI) -! IF (ASSOCIATED(TZFD) .OR. .not.LLFIFM) THEN - IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC) THEN ! sequential execution - TZFMH%GRID = KGRID - TZFMH%COMLEN = LEN_TRIM(HCOMMENT) - TZFMH%COMMENT = HCOMMENT - IF (HBUDGET /= 'BUDGET') THEN - ! take the sub-section of PFIELD defined by the box - ZFIELDP=>PFIELD(KXOBOX:KXEBOX,KYOBOX:KYEBOX,:,:) - ELSE - ! take the field as a budget - ZFIELDP=>PFIELD - END IF -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP) -#endif - ELSE ! multiprocessor execution - IF (ISP == TZFD%OWNER) THEN - ! Allocate the box - ALLOCATE(ZFIELDP(KXEBOX-KXOBOX+1,KYEBOX-KYOBOX+1,SIZE(PFIELD,3),SIZE(PFIELD,4))) - GALLOC = .TRUE. - ELSE - ALLOCATE(ZFIELDP(0,0,0,0)) - GALLOC = .TRUE. - END IF - ! - CALL GATHER_XYFIELD(PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM,& - & KXOBOX,KXEBOX,KYOBOX,KYEBOX,HBUDGET) - ! - IF (ISP == TZFD%OWNER) THEN - TZFMH%GRID = KGRID - TZFMH%COMLEN = LEN_TRIM(HCOMMENT) - TZFMH%COMMENT = HCOMMENT -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& - & ,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& - & ,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP) -#endif - 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("FMWRITBOXX4_ll",HFILEM,HFIPRI,HRECFM,'XY',KGRID,LEN(HCOMMENT),IRESP) - END IF - IF (GALLOC) DEALLOCATE(ZFIELDP) - KRESP = IRESP - END SUBROUTINE FMWRITBOXX4_ll - - SUBROUTINE FMWRITBOXX5_ll(HFILEM,HRECFM,HFIPRI,HBUDGET,PFIELD,KGRID,& - HCOMMENT,KXOBOX,KXEBOX,KYOBOX,KYEBOX,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT - USE MODD_FM - USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL - USE MODE_GATHER_ll - ! -!!!! MOD SB -#ifdef MNH_NCWRIT - USE MODD_NCOUT - USE MODE_UTIL -#endif -!!!! MOD SB - ! - !* 0.1 Declarations of arguments - ! - CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name - CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to write - CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages - CHARACTER(LEN=*), INTENT(IN) ::HBUDGET ! 'BUDGET' (budget) or 'OTHER' (MesoNH field) - REAL,DIMENSION(:,:,:,:,:),TARGET,INTENT(IN) ::PFIELD ! array containing the data field - INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) - CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT ! comment string - INTEGER, INTENT(IN) ::KXOBOX ! - INTEGER, INTENT(IN) ::KXEBOX ! Global coordinates of the box - INTEGER, INTENT(IN) ::KYOBOX ! - INTEGER, INTENT(IN) ::KYEBOX ! - INTEGER, INTENT(OUT)::KRESP ! return-code - ! - !* 0.2 Declarations of local variables - ! - CHARACTER(LEN=JPFINL) :: YFNLFI - INTEGER :: IERR - TYPE(FD_ll), POINTER :: TZFD - INTEGER :: IRESP - REAL,DIMENSION(:,:,:,:,:),POINTER :: ZFIELDP - TYPE(FMHEADER) :: TZFMH - LOGICAL :: GALLOC - - ! - !* 1.1 THE NAME OF LFIFM - ! - IRESP = 0 - GALLOC = .FALSE. - YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' - !print * , ' Writing Article BOXX5 ' , HRECFM - !------------------------------------------------------------------ - TZFD=>GETFD(YFNLFI) -! IF (ASSOCIATED(TZFD) .OR. .not.LLFIFM) THEN - IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC) THEN ! sequential execution - TZFMH%GRID = KGRID - TZFMH%COMLEN = LEN_TRIM(HCOMMENT) - TZFMH%COMMENT = HCOMMENT - IF (HBUDGET /= 'BUDGET') THEN - ! take the sub-section of PFIELD defined by the box - ZFIELDP=>PFIELD(KXOBOX:KXEBOX,KYOBOX:KYEBOX,:,:,:) - ELSE - ! take the field as a budget - ZFIELDP=>PFIELD - END IF -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP) -#endif - ELSE ! multiprocessor execution - IF (ISP == TZFD%OWNER) THEN - ! Allocate the box - ALLOCATE(ZFIELDP(KXEBOX-KXOBOX+1,KYEBOX-KYOBOX+1,SIZE(PFIELD,3),& - & SIZE(PFIELD,4),SIZE(PFIELD,5))) - GALLOC = .TRUE. - ELSE - ALLOCATE(ZFIELDP(0,0,0,0,0)) - GALLOC = .TRUE. - END IF - ! - CALL GATHER_XYFIELD(PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM,& - & KXOBOX,KXEBOX,KYOBOX,KYEBOX,HBUDGET) - ! - IF (ISP == TZFD%OWNER) THEN - TZFMH%GRID = KGRID - TZFMH%COMLEN = LEN_TRIM(HCOMMENT) - TZFMH%COMMENT = HCOMMENT -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& - & ,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& - & ,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP) -#endif - 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("FMWRITBOXX5_ll",HFILEM,HFIPRI,HRECFM,'XY',KGRID,LEN(HCOMMENT),IRESP) - END IF - IF (GALLOC) DEALLOCATE(ZFIELDP) - KRESP = IRESP - END SUBROUTINE FMWRITBOXX5_ll - - SUBROUTINE FMWRITBOXX6_ll(HFILEM,HRECFM,HFIPRI,HBUDGET,PFIELD,KGRID,& - HCOMMENT,KXOBOX,KXEBOX,KYOBOX,KYEBOX,KRESP) - USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT - USE MODD_FM - USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL - USE MODE_GATHER_ll - ! -!!!! MOD SB -#ifdef MNH_NCWRIT - USE MODD_NCOUT - USE MODE_UTIL -#endif -!!!! MOD SB - ! - !* 0.1 Declarations of arguments - ! - CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name - CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to write - CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages - CHARACTER(LEN=*), INTENT(IN) ::HBUDGET ! 'BUDGET' (budget) or 'OTHER' (MesoNH field) - REAL,DIMENSION(:,:,:,:,:,:),TARGET,INTENT(IN) ::PFIELD ! array containing the data field - INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) - CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT ! comment string - INTEGER, INTENT(IN) ::KXOBOX ! - INTEGER, INTENT(IN) ::KXEBOX ! Global coordinates of the box - INTEGER, INTENT(IN) ::KYOBOX ! - INTEGER, INTENT(IN) ::KYEBOX ! - INTEGER, INTENT(OUT)::KRESP ! return-code - ! - !* 0.2 Declarations of local variables - ! - CHARACTER(LEN=JPFINL) :: YFNLFI - INTEGER :: IERR - TYPE(FD_ll), POINTER :: TZFD - INTEGER :: IRESP - REAL,DIMENSION(:,:,:,:,:,:),POINTER :: ZFIELDP - TYPE(FMHEADER) :: TZFMH - LOGICAL :: GALLOC - - ! - !* 1.1 THE NAME OF LFIFM - ! - IRESP = 0 - GALLOC = .FALSE. - YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' - !print * , ' Writing Article BOXX6 ' , HRECFM - !------------------------------------------------------------------ - TZFD=>GETFD(YFNLFI) -! IF (ASSOCIATED(TZFD) .OR. .not.LLFIFM) THEN - IF (ASSOCIATED(TZFD)) THEN - IF (GSMONOPROC) THEN ! sequential execution - TZFMH%GRID = KGRID - TZFMH%COMLEN = LEN_TRIM(HCOMMENT) - TZFMH%COMMENT = HCOMMENT - IF (HBUDGET /= 'BUDGET') THEN - ! take the sub-section of PFIELD defined by the box - ZFIELDP=>PFIELD(KXOBOX:KXEBOX,KYOBOX:KYEBOX,:,:,:,:) - ELSE - ! take the field as a budget - ZFIELDP=>PFIELD - END IF -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP) -#endif - ELSE ! multiprocessor execution - IF (ISP == TZFD%OWNER) THEN - ! Allocate the box - ALLOCATE(ZFIELDP(KXEBOX-KXOBOX+1,KYEBOX-KYOBOX+1,SIZE(PFIELD,3),& - & SIZE(PFIELD,4),SIZE(PFIELD,5),SIZE(PFIELD,6))) - GALLOC = .TRUE. - ELSE - ALLOCATE(ZFIELDP(0,0,0,0,0,0)) - GALLOC = .TRUE. - END IF - ! - CALL GATHER_XYFIELD(PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM,& - & KXOBOX,KXEBOX,KYOBOX,KYEBOX,HBUDGET) - ! - IF (ISP == TZFD%OWNER) THEN - TZFMH%GRID = KGRID - TZFMH%COMLEN = LEN_TRIM(HCOMMENT) - TZFMH%COMMENT = HCOMMENT -#ifdef MNH_NCWRIT - IF ( DEF_NC .AND. LLFIFM ) THEN - CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& - & ,IRESP) - END IF -#else - IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& - & ,IRESP) - IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP) -#endif - 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("FMWRITBOXX6_ll",HFILEM,HFIPRI,HRECFM,'XY',KGRID,LEN(HCOMMENT),IRESP) - END IF - IF (GALLOC) DEALLOCATE(ZFIELDP) - KRESP = IRESP - END SUBROUTINE FMWRITBOXX6_ll - -END MODULE MODE_FMWRIT - - +!MNH_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier +!MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence +!MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt +!MNH_LIC for details. version 1. +!----------------------------------------------------------------- +!--------------- special set of characters for CVS information +!----------------------------------------------------------------- +! $Source$ +! $Name$ +! $Revision$ +! $Date$ +!----------------------------------------------------------------- +!Correction : +! J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 +!----------------------------------------------------------------- + +#ifdef MNH_MPI_DOUBLE_PRECISION +#define MPI_FLOAT MPI_DOUBLE_PRECISION +#else +#define MPI_FLOAT MPI_REAL +#endif + +#ifdef MNH_GA +MODULE MODE_GA +#include "mafdecls.fh" +#include "global.fh" + ! + ! Global Array Variables + ! + INTEGER, PARAMETER :: jpix=1 , jpiy = 2 , jpiz = 3 + ! + INTEGER :: NIMAX_ll,NJMAX_ll, IIU_ll,IJU_ll,IKU_ll + integer :: heap=5*10**6, stack + logical :: gstatus_ga + INTEGER, PARAMETER :: ndim_GA = 3 + INTEGER, DIMENSION(ndim_GA) :: dims_GA , chunk_GA + INTEGER,PARAMETER :: CI=1 ,CJ=-1 ,CK=-1 + INTEGER :: g_a + integer, DIMENSION(ndim_GA) :: lo_col, hi_col , ld_col + integer, DIMENSION(ndim_GA) :: lo_zplan , hi_zplan , ld_zplan + INTEGER :: NIXO_L,NIXE_L,NIYO_L,NIYE_L + INTEGER :: NIXO_G,NIXE_G,NIYO_G,NIYE_G + + LOGICAL,SAVE :: GFIRST_GA = .TRUE. + INTEGER :: IIU_ll_MAX = -1, IJU_ll_MAX = -1, IKU_ll_MAX = -1 + + CONTAINS + + SUBROUTINE MNH_INIT_GA(MY_NI,MY_NJ,MY_NK,HRECFM,HRW_MODE) + +! +! Modification +! J.Escobar 5/02/2015 : use JPHEXT from MODD_PARAMETERS_ll + + USE MODE_TOOLS_ll, ONLY : GET_GLOBALDIMS_ll + USE MODD_PARAMETERS_ll, ONLY : JPHEXT + USE MODD_IO_ll, ONLY : ISP + USE MODE_GATHER_ll, ONLY : GET_DOMWRITE_ll + USE MODE_SCATTER_ll, ONLY : GET_DOMREAD_ll + + IMPLICIT NONE + + INTEGER, INTENT(IN) :: MY_NI,MY_NJ,MY_NK + CHARACTER(LEN=*), INTENT(IN) :: HRECFM ! name of the article to write + CHARACTER(LEN=*), INTENT(IN) :: HRW_MODE + + IF ( GFIRST_GA ) THEN + GFIRST_GA = .FALSE. + ! + ! Allocate memory for GA library + ! + stack = heap + !gstatus_ga = ma_init(MT_F_DBL, stack/ISNPROC, heap/ISNPROC) + gstatus_ga = ma_init(MT_F_DBL, stack, heap) + if ( .not. gstatus_ga ) STOP " MA_INIT FAILED " + ! + ! Initialize GA library + ! + !call ga_initialize_ltd(100000000) + call ga_initialize() + END IF + + CALL GET_GLOBALDIMS_ll (NIMAX_ll,NJMAX_ll) + IIU_ll = NIMAX_ll + 2*JPHEXT + IJU_ll = NJMAX_ll + 2*JPHEXT + IKU_ll = MY_NK + ! + ! configure Global array dimensions + ! + dims_GA(JPIX) = IIU_ll + dims_GA(JPIY) = IJU_ll + dims_GA(JPIZ) = IKU_ll + chunk_GA(JPIX) = CI + chunk_GA(JPIY) = CJ + chunk_GA(JPIZ) = CK + IF ( CI .EQ. 1 ) chunk_GA(JPIX) = dims_GA(JPIX) ! 1 block in X direction + IF ( CJ .EQ. 1 ) chunk_GA(JPIY) = dims_GA(JPIY) ! 1 block in Y direction + IF ( CK .EQ. 1 ) chunk_GA(JPIZ) = dims_GA(JPIZ) ! 1 block in Z direction + ! + ! (re)create global array g_a ( if to small create it ... ) + ! + IF ( ( IIU_ll .GT. IIU_ll_MAX ) .OR. ( IJU_ll .GT. IJU_ll_MAX ) .OR. ( IKU_ll .GT. IKU_ll_MAX ) ) THEN + ! + ! reallocate the g_a , if need with bigger Z size + ! + IF ( IKU_ll_MAX .NE. -1 ) gstatus_ga = ga_destroy(g_a) + IIU_ll_MAX = IIU_ll + IJU_ll_MAX = IJU_ll + IKU_ll_MAX = IKU_ll + gstatus_ga = nga_create(MT_F_DBL, ndim_GA, dims_GA, HRECFM ,chunk_GA, g_a) + call ga_sync() + END IF + !----------------------------------------------------------------------! + ! ! + ! Define/describe local column data owned by this processor to write ! + ! ! + !----------------------------------------------------------------------! + IF ( HRW_MODE .EQ. "WRITE" ) THEN + CALL GET_DOMWRITE_ll(ISP,'local',NIXO_L,NIXE_L,NIYO_L,NIYE_L) + CALL GET_DOMWRITE_ll(ISP,'global',NIXO_G,NIXE_G,NIYO_G,NIYE_G) + ELSE + CALL GET_DOMREAD_ll(ISP,NIXO_L,NIXE_L,NIYO_L,NIYE_L) + CALL GET_DOMREAD_ll(ISP,NIXO_G,NIXE_G,NIYO_G,NIYE_G) + END IF + ! + ! portion of data to write/put | read/get by this proc + ! + lo_col(JPIX) = NIXO_G + hi_col(JPIX) = NIXE_G + + lo_col(JPIY) = NIYO_G + hi_col(JPIY) = NIYE_G + + lo_col(JPIZ) = 1 + hi_col(JPIZ) = IKU_ll + ! + ! declaration size of this local input column array + ! + ld_col(JPIX) = MY_NI + ld_col(JPIY) = MY_NJ + ld_col(JPIZ) = MY_NK + ! + !-----------------------------------------------------! + ! ! + ! Size of local ZSLIDE_ll Write buffer on I/O proc ! + ! ! + !-----------------------------------------------------! + ! + ! declared dimension + ! + ld_zplan(JPIX) = IIU_ll + ld_zplan(JPIY) = IJU_ll + ld_zplan(JPIZ) = 1 + ! + ! write data by Z slide by I/O proc + ! + lo_zplan(JPIX:JPIY) = 1 + hi_zplan(JPIX) = IIU_ll + hi_zplan(JPIY) = IJU_ll + !call ga_sync() + ! + END SUBROUTINE MNH_INIT_GA + +END MODULE MODE_GA + +#endif + +MODULE MODE_FMWRIT + + USE MODD_MPIF +#if defined(MNH_IOCDF4) + USE MODE_NETCDF +#endif + + IMPLICIT NONE + + PRIVATE + + INTERFACE FMWRIT + MODULE PROCEDURE FMWRITX0_ll,FMWRITX1_ll,FMWRITX2_ll,FMWRITX3_ll,& + & FMWRITX4_ll,FMWRITX5_ll,FMWRITX6_ll,& + & FMWRITN0_ll,FMWRITN1_ll,FMWRITN2_ll,& + & FMWRITL0_ll,FMWRITL1_ll,FMWRITC0_ll,& + & FMWRITC1_ll,FMWRITT0_ll + END INTERFACE + + INTERFACE FMWRITBOX + MODULE PROCEDURE FMWRITBOXX2_ll,FMWRITBOXX3_ll,FMWRITBOXX4_ll,& + & FMWRITBOXX5_ll,FMWRITBOXX6_ll + END INTERFACE + + PUBLIC FMWRIT_LB,FMWRITBOX,FMWRIT,FMWRITX0_ll,FMWRITX1_ll,FMWRITX2_ll,FMWRITX3_ll,& + & FMWRITX4_ll,FMWRITX5_ll,FMWRITX6_ll,FMWRITN0_ll,FMWRITN1_ll,FMWRITN2_ll,& + & FMWRITL0_ll,FMWRITL1_ll,FMWRITC0_ll,FMWRITC1_ll,FMWRITT0_ll,FMWRITBOXX2_ll,& + & FMWRITBOXX3_ll,FMWRITBOXX4_ll,FMWRITBOXX5_ll,FMWRITBOXX6_ll + + !INCLUDE 'mpif.h' + +CONTAINS + + SUBROUTINE FM_WRIT_ERR(HFUNC,HFILEM,HFIPRI,HRECFM,HDIR,KGRID,KLENCH& + & ,KRESP) + USE MODE_FM, ONLY : FMLOOK_ll + + CHARACTER(LEN=*) :: HFUNC + CHARACTER(LEN=*) :: HFILEM + CHARACTER(LEN=*) :: HFIPRI + CHARACTER(LEN=*) :: HRECFM + CHARACTER(LEN=*) :: HDIR + INTEGER :: KGRID + INTEGER :: KLENCH + INTEGER :: KRESP + + INTEGER :: ILUPRI + INTEGER :: IRESP + + CALL FMLOOK_ll(HFIPRI,HFIPRI,ILUPRI,IRESP) + WRITE (ILUPRI,*) ' exit from ',HFUNC,' with RESP:',KRESP + WRITE (ILUPRI,*) ' | HFILEM = ',HFILEM + WRITE (ILUPRI,*) ' | HRECFM = ',HRECFM + WRITE (ILUPRI,*) ' | HDIR = ',HDIR + WRITE (ILUPRI,*) ' | KGRID = ',KGRID + WRITE (ILUPRI,*) ' | KLENCH = ',KLENCH + + END SUBROUTINE FM_WRIT_ERR + + + + SUBROUTINE FMWRITX0_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& + KLENCH,HCOMMENT,KRESP) +! +! Modification +! J.Escobar 15/04/2014 : add write to all Z files for all FMWRITX0_ll variables +! J.Escobar 23/06/2014 : bug , replace .FALSE. to .TRUE. = OREAL type transmetted to FM_WRIT_ll +! + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT + USE MODD_FM + USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL +#ifdef MNH_NCWRIT + USE MODD_GRID + USE MODD_DIM_n, ONLY: NIMAX + USE MODD_NCOUT + USE MODE_UTIL +#endif + ! + !* 0. DECLARATIONS + ! ------------ + ! + !* 0.1 Declarations of arguments + ! + CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name + CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to write + CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages + CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form + REAL, INTENT(IN) ::PFIELD ! array containing the data field + INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) + INTEGER, INTENT(IN) ::KLENCH ! length of comment string + CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT! comment string + INTEGER, INTENT(OUT)::KRESP ! return-code + ! + !* 0.2 Declarations of local variables + ! + !---------------------------------------------------------------- + CHARACTER(LEN=JPFINL) :: YFNLFI + INTEGER :: IERR + TYPE(FD_ll), POINTER :: TZFD + INTEGER :: IRESP + TYPE(FMHEADER) :: TZFMH + !JUANZIO + INTEGER :: IK_FILE,IK_rank + CHARACTER(len=5) :: YK_FILE + CHARACTER(len=128) :: YFILE_IOZ + TYPE(FD_ll), POINTER :: TZFD_IOZ + !JUANZIO + ! + !* 1.1 THE NAME OF LFIFM + ! + IRESP = 0 + YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' + !print * , ' Writing Article 0 ' , HRECFM + ! + TZFD=>GETFD(YFNLFI) + IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP) + END IF + IF ( LNETCDF .AND. NIMAX == 0 ) THEN +! PRINT * , ' SAVE MAP PARAMETER IF PGD ' + IF ( trim(hrecfm) == "RPK" ) THEN + XRPK=PFIELD + ELSEIF ( trim(hrecfm) == "BETA" ) THEN + XBETA=PFIELD + ELSEIF (trim(hrecfm) == "LATORI" ) THEN + XLATORI=PFIELD + ELSEIF (trim(hrecfm) == "LONORI" ) THEN + XLONORI=PFIELD + ELSEIF (trim(hrecfm) == "LAT0" ) THEN + XLAT0=PFIELD + ELSEIF (trim(hrecfm) == "LON0" ) THEN + XLON0=PFIELD + END IF + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP) +#endif + ELSE + IF (ISP == TZFD%OWNER) THEN + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP) + END IF + IF ( LNETCDF .AND. NIMAX == 0 ) THEN +! print * , ' SAVE MAP PARAMETER IF PGD ' + IF ( trim(hrecfm) == "RPK" ) THEN + XRPK=PFIELD + ELSEIF ( trim(hrecfm) == "BETA" ) THEN + XBETA=PFIELD + ELSEIF (trim(hrecfm) == "LATORI" ) THEN + XLATORI=PFIELD + ELSEIF (trim(hrecfm) == "LONORI" ) THEN + XLONORI=PFIELD + ELSEIF (trim(hrecfm) == "LAT0" ) THEN + XLAT0=PFIELD + ELSEIF (trim(hrecfm) == "LON0" ) THEN + XLON0=PFIELD + END IF + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP) +#endif + 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(HFILEM)//YK_FILE//".lfi" + TZFD_IOZ => GETFD(YFILE_IOZ) + IK_RANK = TZFD_IOZ%OWNER + IF ( ISP == IK_RANK ) THEN + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD_IOZ%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD_IOZ%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD_IOZ%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP) +#endif + END IF + END DO + ENDIF + ELSE + IRESP = -61 + END IF + !---------------------------------------------------------------- + IF (IRESP.NE.0) THEN + CALL FM_WRIT_ERR("FMWRITX0_ll",HFILEM,HFIPRI,HRECFM,HDIR,KGRID,KLENCH,IRESP) + END IF + KRESP = IRESP + END SUBROUTINE FMWRITX0_ll + + SUBROUTINE FMWRITX1_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& + KLENCH,HCOMMENT,KRESP) + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT + USE MODD_FM + USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL + USE MODE_ALLOCBUFFER_ll + USE MODE_GATHER_ll +#ifdef MNH_NCWRIT + USE MODE_UTIL + USE MODE_DIMLIST + USE MODD_DIM_n, ONLY: NIMAX + USE MODD_NCOUT +#endif + ! + !* 0. DECLARATIONS + ! ------------ + ! + !* 0.1 Declarations of arguments + ! + CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name + CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to write + CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages + CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form + REAL,DIMENSION(:),TARGET,INTENT(IN) ::PFIELD ! array containing the data field + INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) + INTEGER, INTENT(IN) ::KLENCH ! length of comment string + CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT ! comment string + INTEGER, INTENT(OUT)::KRESP ! return-code + ! + !* 0.2 Declarations of local variables + ! + !---------------------------------------------------------------- + CHARACTER(LEN=JPFINL) :: YFNLFI + INTEGER :: IERR + TYPE(FD_ll), POINTER :: TZFD + INTEGER :: IRESP + TYPE(FMHEADER) :: TZFMH + REAL,DIMENSION(:),POINTER :: ZFIELDP + LOGICAL :: GALLOC +#ifdef MNH_NCWRIT + TYPE(workfield), DIMENSION(:), POINTER :: TZRECLIST + INTEGER,DIMENSION(6) :: TABDIM +#endif + ! + !* 1.1 THE NAME OF LFIFM + ! + IRESP = 0 + GALLOC = .FALSE. + YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' +#ifdef MNH_NCWRIT + TABDIM(:)=1 + TABDIM(1)=SIZE(PFIELD,1) + !print * , ' Writing Article 1 ' , HRECFM +#endif + !------------------------------------------------------------------ + TZFD=>GETFD(YFNLFI) + IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + END IF + ! ------- WRITE NETCDF + IF ( LNETCDF .AND. NC_WRITE ) THEN + CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,PFIELD,.TRUE.,TZRECLIST, & +! CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,PFIELD, & + & KLENCH,HCOMMENT) + IF ( NC_FILE == 'phy' ) THEN +!!!!! CAS WRITE_PHYS_PARAM ... l'ecriture lfi ne peut pas se faire en meme temps + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE., & + SIZE(PFIELD),PFIELD,TZFMH,IRESP) + END IF + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP) +#endif + ELSE + IF (ISP == TZFD%OWNER) THEN + CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC) + ELSE + ALLOCATE(ZFIELDP(0)) + GALLOC = .TRUE. + END IF + ! + IF (HDIR == 'XX' .OR. HDIR =='YY') THEN + CALL GATHER_XXFIELD(HDIR,PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM) + END IF + ! + IF (ISP == TZFD%OWNER) THEN + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + & ,IRESP) + END IF + IF ( LNETCDF .AND. NC_WRITE ) THEN + TABDIM(1)=SIZE(ZFIELDP,1) + CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,ZFIELDP,.TRUE.,TZRECLIST, & + & KLENCH,HCOMMENT) + IF ( NC_FILE == 'phy' ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + & ,IRESP) + END IF + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + & ,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) +#endif + 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("FMWRITX1_ll",HFILEM,HFIPRI,HRECFM,HDIR,KGRID,KLENCH,IRESP) + END IF + IF (GALLOC) DEALLOCATE(ZFIELDP) + KRESP = IRESP + END SUBROUTINE FMWRITX1_ll + + SUBROUTINE FMWRITX2_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& + KLENCH,HCOMMENT,KRESP) + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT,LPACK,L1D,L2D + 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 + !JUANZ + USE MODD_TIMEZ, ONLY : TIMEZ + USE MODE_MNH_TIMING, ONLY : SECOND_MNH2 + !JUANZ +#ifdef MNH_NCWRIT + USE MODE_UTIL + USE MODE_DIMLIST + USE MODD_DIM_n, ONLY: NIMAX + USE MODD_NCOUT +#endif +#ifdef MNH_GA + !JUAN_IOGA + USE MODE_GA +#endif + ! + IMPLICIT NONE + ! + !* 0.1 Declarations of arguments + ! + CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name + CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to write + CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages + CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form + REAL,DIMENSION(:,:),TARGET,INTENT(IN) ::PFIELD ! array containing the data field + INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) + INTEGER, INTENT(IN) ::KLENCH ! length of comment string + CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT ! comment string + INTEGER, INTENT(OUT)::KRESP ! return-code + ! + !* 0.2 Declarations of local variables + ! + CHARACTER(LEN=JPFINL) :: YFNLFI + INTEGER :: IERR + TYPE(FD_ll), POINTER :: TZFD + INTEGER :: IRESP + REAL,DIMENSION(:,:),POINTER :: ZFIELDP + TYPE(FMHEADER) :: TZFMH + LOGICAL :: GALLOC +#ifdef MNH_NCWRIT + TYPE(workfield), DIMENSION(:), POINTER :: TZRECLIST + INTEGER,DIMENSION(6) :: TABDIM + LOGICAL :: NCWR + INTEGER :: LHREC_BEG,LHRECFM +#endif + ! + !JUANZ + REAL*8,DIMENSION(2) :: T0,T1,T2 + REAL*8,DIMENSION(2) :: T11,T22 + !JUANZ +#ifdef MNH_GA + REAL,DIMENSION(:,:),POINTER :: ZFIELDP_GA , ZFIELD_GA + REAL :: ERROR + INTEGER :: JI +#endif + INTEGER :: IHEXTOT + ! + !* 1.1 THE NAME OF LFIFM + ! + CALL SECOND_MNH2(T11) + IRESP = 0 + GALLOC = .FALSE. + YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' +#ifdef MNH_NCWRIT + NCWR=.TRUE. + TABDIM(:)=1 + TABDIM(1)=SIZE(PFIELD,1) + TABDIM(2)=SIZE(PFIELD,2) + !print * , ' Writing Article 2 ' , HRECFM +#endif + !------------------------------------------------------------------ + IHEXTOT = 2*JPHEXT+1 + TZFD=>GETFD(YFNLFI) + IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT + ! IF (LPACK .AND. L1D .AND. HDIR=='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) +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + END IF + IF ( LNETCDF .AND. NC_WRITE ) THEN + TABDIM(1)=1 + TABDIM(2)=1 + CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,ZFIELDP,.TRUE.,TZRECLIST,& + & KLENCH,HCOMMENT) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) +#endif + ! ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN + ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + ZFIELDP=>PFIELD(:,JPHEXT+1:JPHEXT+1) +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + END IF + LHRECFM = LEN_TRIM(ADJUSTL(HRECFM)) + IF ( LHRECFM > 5 ) THEN + LHREC_BEG =LHRECFM-4 + IF ( ADJUSTL(HRECFM(LHREC_BEG:LHRECFM)) == 'DATIM') THEN + NCWR = .FALSE. + END IF + END IF + IF ( LNETCDF .AND. NC_WRITE .AND. NCWR ) THEN + TABDIM(2)=1 + IF ( NC_FILE == 'phy' ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE., & + SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + END IF + CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,ZFIELDP,.TRUE.,TZRECLIST,& + & KLENCH,HCOMMENT) + END IF + NCWR = .TRUE. +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) +#endif + ELSE +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + END IF + LHRECFM = LEN_TRIM(ADJUSTL(HRECFM)) + IF ( LHRECFM > 5 ) THEN + LHREC_BEG =LHRECFM-4 + IF ( ADJUSTL(HRECFM(LHREC_BEG:LHRECFM)) == 'DATIM') THEN + NCWR = .FALSE. + END IF + END IF +! IF ( NIMAX /= 0 ) THEN + IF ( LNETCDF .AND. NC_WRITE .AND. NCWR ) THEN + IF ( NC_FILE == 'phy' ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE., & + SIZE(PFIELD),PFIELD,TZFMH,IRESP) + END IF + CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,PFIELD,.TRUE.,TZRECLIST, & + & KLENCH,HCOMMENT) + END IF + NCWR = .TRUE. +! END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP) +#endif + END IF + ELSE ! multiprocessor execution + CALL SECOND_MNH2(T0) + IF (ISP == TZFD%OWNER) THEN + ! I/O processor case + CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC) + ELSE + ALLOCATE(ZFIELDP(0,0)) + GALLOC = .TRUE. + END IF + ! + IF (HDIR == 'XX' .OR. HDIR =='YY') THEN + CALL GATHER_XXFIELD(HDIR,PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM) + ELSEIF (HDIR == 'XY') THEN + IF (LPACK .AND. L2D) THEN + CALL GATHER_XXFIELD('XX',PFIELD(:,JPHEXT+1),ZFIELDP(:,1),TZFD%OWNER,TZFD%COMM) + ELSE +#ifdef MNH_GA + ! + ! init/create the ga , dim3 = 1 + ! + CALL MNH_INIT_GA(SIZE(PFIELD,1),SIZE(PFIELD,2),1,HRECFM,"WRITE") + ! + ! copy columun data to global arrays g_a + ! + ALLOCATE (ZFIELD_GA (SIZE(PFIELD,1),SIZE(PFIELD,2))) + ZFIELD_GA = PFIELD + call nga_put(g_a, lo_col, hi_col,ZFIELD_GA(NIXO_L,NIYO_L) , ld_col) +!!$ print*," nga_put =",HRECFM,g_a," lo_col=",lo_col," hi_col=",hi_col,ZFIELD_GA(NIXO_L,NIYO_L), & +!!$ " NIXO_L=",NIXO_L,"NIYO_L=",NIYO_L," ld_col=",ld_col," ISP=",ISP + call ga_sync + DEALLOCATE (ZFIELD_GA) + IF (ISP == TZFD%OWNER) THEN + ! + ! this proc get the Z slide to write + ! + lo_zplan(JPIZ) = 1 + hi_zplan(JPIZ) = 1 +!!$ ALLOCATE (ZFIELDP_GA(IIU_ll,IJU_ll)) + call nga_get(g_a, lo_zplan, hi_zplan,ZFIELDP, ld_zplan) +!!$ print*,"nga_get=",HRECFM,g_a," lo_zplan=",lo_zplan," hi_zplan=",hi_zplan & +!!$ ,ZFIELDP(1,1)," ld_zplan=",ld_zplan + END IF +!!$ call ga_sync +#else + CALL GATHER_XYFIELD(PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM) +!!$ IF (ISP == TZFD%OWNER) THEN +!!$ print*,HRECFM, "ERR=", MAXVAL (ZFIELDP_GA - ZFIELDP) +!!$ DO JI=1,IJU_ll +!!$ !print*,HRECFM, "ERR=", ZFIELDP_GA(:,JI) - ZFIELDP(:,JI) +!!$ print*,HRECFM, "WX2::GA =", ZFIELDP_GA(:,JI) +!!$ print*,HRECFM, "WX2::MNH=", ZFIELDP(:,JI) +!!$ END DO +!!$ END IF +#endif + END IF + END IF + CALL SECOND_MNH2(T1) + TIMEZ%T_WRIT2D_GATH=TIMEZ%T_WRIT2D_GATH + T1 - T0 + ! + IF (ISP == TZFD%OWNER) THEN + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + & ,IRESP) + END IF + LHRECFM = LEN_TRIM(ADJUSTL(HRECFM)) + IF ( LHRECFM > 5 ) THEN + LHREC_BEG =LHRECFM-4 + IF ( ADJUSTL(HRECFM(LHREC_BEG:LHRECFM)) == 'DATIM') THEN + NCWR = .FALSE. + END IF + END IF + IF ( LNETCDF .AND. NC_WRITE .AND. NCWR ) THEN + TABDIM(1)=SIZE(ZFIELDP,1) + TABDIM(2)=SIZE(ZFIELDP,2) + CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,ZFIELDP,.TRUE.,TZRECLIST, & +! CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,ZFIELDP, & + & KLENCH,HCOMMENT) + END IF + NCWR=.TRUE. +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + & ,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) +#endif + END IF +#ifdef MNH_GA +!!$ IF (ISP .EQ. 1 ) THEN +!!$ call ga_print_stats() +!!$ call ga_summarize(1) +!!$ ENDIF + call ga_sync +!!$ gstatus_ga = ga_destroy(g_a) +#endif + CALL SECOND_MNH2(T2) + TIMEZ%T_WRIT2D_WRIT=TIMEZ%T_WRIT2D_WRIT + T2 - T1 + ! + 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("FMWRITX2_ll",HFILEM,HFIPRI,HRECFM,HDIR,KGRID,KLENCH,IRESP) + END IF + IF (GALLOC) DEALLOCATE(ZFIELDP) + KRESP = IRESP + IF (ASSOCIATED(TZFD)) CALL MPI_BARRIER(TZFD%COMM,IERR) + CALL SECOND_MNH2(T22) + TIMEZ%T_WRIT2D_ALL=TIMEZ%T_WRIT2D_ALL + T22 - T11 + END SUBROUTINE FMWRITX2_ll + + SUBROUTINE FMWRITX3_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& + KLENCH,HCOMMENT,KRESP) + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT,LPACK,L1D,L2D + 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 + !JUANZ + USE MODD_IO_ll, ONLY : ISNPROC + USE MODE_IO_ll, ONLY : io_file,io_rank + USE MODD_TIMEZ, ONLY : TIMEZ + USE MODE_MNH_TIMING, ONLY : SECOND_MNH2 + !JUANZ +#ifdef MNH_NCWRIT + USE MODE_UTIL + USE MODD_DIM_n, ONLY: NIMAX + USE MODD_NCOUT +#endif +#ifdef MNH_GA + USE MODE_GA +#endif + USE MODD_VAR_ll, ONLY : MNH_STATUSES_IGNORE + ! + ! + !* 0.1 Declarations of arguments + ! + CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name + CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to write + CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages + CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form + REAL,DIMENSION(:,:,:),TARGET,INTENT(IN) ::PFIELD ! array containing the data field + INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) + INTEGER, INTENT(IN) ::KLENCH ! length of comment string + CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT ! comment string + INTEGER, INTENT(OUT)::KRESP ! return-code + ! + !* 0.2 Declarations of local variables + ! + CHARACTER(LEN=JPFINL) :: YFNLFI + 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(HRECFM)) :: YK,YRECZSLIDE + REAL,DIMENSION(:,:),POINTER :: ZSLIDE_ll,ZSLIDE + INTEGER :: IK_FILE,IK_rank,inb_proc_real,JK_MAX + CHARACTER(len=5) :: YK_FILE + CHARACTER(len=128) :: YFILE_IOZ + TYPE(FD_ll), POINTER :: TZFD_IOZ + INTEGER :: JI,IXO,IXE,IYO,IYE + REAL,DIMENSION(:,:),POINTER :: TX2DP + INTEGER, DIMENSION(MPI_STATUS_SIZE) :: STATUS + INTEGER, ALLOCATABLE,DIMENSION(:,:) :: STATUSES + LOGICAL :: GALLOC_ll + !JUANZIO + !INTEGER,SAVE,DIMENSION(100000) :: REQ_TAB + INTEGER,ALLOCATABLE,DIMENSION(:) :: REQ_TAB + INTEGER :: NB_REQ + TYPE TX_2DP + REAL,DIMENSION(:,:), POINTER :: X + END TYPE TX_2DP + TYPE(TX_2DP),ALLOCATABLE,DIMENSION(:) :: T_TX2DP + REAL*8,DIMENSION(2) :: T0,T1,T2 + REAL*8,DIMENSION(2) :: T11,T22 + !JUANZIO + !JUAN +#ifdef MNH_NCWRIT + TYPE(workfield), DIMENSION(:), POINTER :: TZRECLIST + INTEGER,DIMENSION(6) :: TABDIM + CHARACTER(LEN=LEN(HRECFM)) :: HRECT + INTEGER :: LHRECT +#endif +#ifdef MNH_GA + REAL,DIMENSION(:,:,:),POINTER :: ZFIELD_GA +#endif + INTEGER :: IHEXTOT + ! + !* 1.1 THE NAME OF LFIFM + ! + CALL SECOND_MNH2(T11) + IRESP = 0 + GALLOC = .FALSE. + GALLOC_ll = .FALSE. + YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' + !print * , ' Writing Article 3 ' , HRECFM +! +#ifdef MNH_NCWRIT + HRECT=TRIM(HRECFM) + LHRECT=LEN(TRIM(HRECT)) + TABDIM(:)=1 + TABDIM(1)=SIZE(PFIELD,1) + TABDIM(2)=SIZE(PFIELD,2) + TABDIM(3)=SIZE(PFIELD,3) + IF ( LHRECT .gt. 4 ) THEN + IF ( HRECT(LHRECT-4:LHRECT) == 'TRAJZ' ) THEN + TABDIM(3)=SIZE(PFIELD,1) + TABDIM(1)=1 + END IF + END IF + IF ( TRIM(HRECFM) == 'AVION.TRAJX' ) THEN + TABDIM(1)=SIZE(PFIELD,2) + TABDIM(2)=1 + ELSEIF ( TRIM(HRECFM) == 'AVION.TRAJY' ) THEN + TABDIM(1)=SIZE(PFIELD,2) + TABDIM(2)=1 + ELSEIF ( TRIM(HRECFM) == 'AVION.TRAJZ' ) THEN + TABDIM(1)=SIZE(PFIELD,2) + TABDIM(2)=1 + END IF +#endif + !------------------------------------------------------------------ + IHEXTOT = 2*JPHEXT+1 + TZFD=>GETFD(YFNLFI) + IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC .AND. (TZFD%nb_procio.eq.1) ) THEN ! sequential execution + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT + ! IF (LPACK .AND. L1D .AND. HDIR=='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,:) +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + END IF + IF ( LNETCDF .AND. NC_WRITE ) THEN + TABDIM(1)=1 + TABDIM(2)=1 + CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,ZFIELDP,.TRUE.,TZRECLIST, & + & KLENCH,HCOMMENT) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) +#endif + ! ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN + ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + ZFIELDP=>PFIELD(:,JPHEXT+1:JPHEXT+1,:) +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + END IF + IF ( LNETCDF .AND. NC_WRITE ) THEN + TABDIM(2)=1 + IF ( NC_FILE == 'phy' ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + END IF + CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,ZFIELDP,.TRUE.,TZRECLIST, & +! CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,ZFIELDP, & + & KLENCH,HCOMMENT) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) +#endif + ELSE +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + END IF + IF ( LNETCDF .AND. NC_WRITE ) THEN + IF ( NC_FILE == 'phy' ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + END IF + CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,PFIELD,.TRUE.,TZRECLIST, & +! CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,PFIELD, & + & KLENCH,HCOMMENT) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP) +#endif + END IF + ELSEIF ( (TZFD%nb_procio .eq. 1 ) .OR. ( HDIR == '--' ) ) THEN ! multiprocessor execution & 1 proc IO + ! write 3D field in 1 time = output for graphique + IF (ISP == TZFD%OWNER) THEN + CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC) + ELSE + ALLOCATE(ZFIELDP(0,0,0)) + GALLOC = .TRUE. + END IF + ! + IF (HDIR == 'XX' .OR. HDIR =='YY') THEN + CALL GATHER_XXFIELD(HDIR,PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM) + ELSEIF (HDIR == '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 + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + & ,IRESP) + END IF + IF ( LNETCDF .AND. NC_WRITE ) THEN + TABDIM(1)=SIZE(ZFIELDP,1) + TABDIM(2)=SIZE(ZFIELDP,2) + TABDIM(3)=SIZE(ZFIELDP,3) + IF ( NC_FILE == ' phy' ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + & ,IRESP) + END IF + CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,ZFIELDP,.TRUE.,TZRECLIST, & +! CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,ZFIELDP, & + & KLENCH,HCOMMENT) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + & ,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) +#endif + END IF + ! + CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD& + & %COMM,IERR) + ! + ELSE ! multiprocessor execution & // IO + ! + !JUAN BG Z SLIDE + ! + ! +#ifdef MNH_GA + ! + ! init/create the ga + ! + CALL SECOND_MNH2(T0) + CALL MNH_INIT_GA(SIZE(PFIELD,1),SIZE(PFIELD,2),SIZE(PFIELD,3),HRECFM,"WRITE") + ! + ! copy columun data to global arrays g_a + ! + ALLOCATE (ZFIELD_GA (SIZE(PFIELD,1),SIZE(PFIELD,2),SIZE(PFIELD,3))) + ZFIELD_GA = PFIELD + call nga_put(g_a, lo_col, hi_col,ZFIELD_GA(NIXO_L,NIYO_L,1) , ld_col) + DEALLOCATE(ZFIELD_GA) +!!$ print*," nga_put =",HRECFM,g_a," lo_col=",lo_col," hi_col=",hi_col,PFIELD(NIXO_L,NIYO_L,1) & +!!$ ," ld_col=",ld_col + call ga_sync + CALL SECOND_MNH2(T1) + TIMEZ%T_WRIT3D_SEND=TIMEZ%T_WRIT3D_SEND + T1 - T0 + ! + ! write the data + ! + ALLOCATE(ZSLIDE_ll(0,0)) ! to avoid bug on test of size + GALLOC_ll = .TRUE. + ! + DO JKK=1,IKU_ll + ! + IK_FILE = io_file(JKK,TZFD%nb_procio) + write(YK_FILE ,'(".Z",i3.3)') IK_FILE+1 + YFILE_IOZ = TRIM(HFILEM)//YK_FILE//".lfi" + TZFD_IOZ => GETFD(YFILE_IOZ) + ! + IK_RANK = TZFD_IOZ%OWNER + !IK_RANK = 1 + io_rank(IK_FILE,ISNPROC,TZFD%nb_procio) + ! + IF (ISP == IK_RANK ) THEN + CALL SECOND_MNH2(T0) + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT + WRITE(YK,'(I4.4)') JKK + YRECZSLIDE = TRIM(HRECFM)//YK + ! + IF ( SIZE(ZSLIDE_ll) .EQ. 0 ) THEN + DEALLOCATE(ZSLIDE_ll) + CALL ALLOCBUFFER_ll(ZSLIDE_ll,ZSLIDE,HDIR,GALLOC_ll) + END IF + ! + ! this proc get this JKK slide + ! + lo_zplan(JPIZ) = JKK + hi_zplan(JPIZ) = JKK + call nga_get(g_a, lo_zplan, hi_zplan,ZSLIDE_ll, ld_zplan) + 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,HDIR,ZSLIDE_ll,TZFMH,IRESP) + CALL SECOND_MNH2(T2) + TIMEZ%T_WRIT3D_WRIT=TIMEZ%T_WRIT3D_WRIT + T2 - T1 + END IF + END DO + !call ga_sync + ! + ! destroy the global array + ! +!!$ IF (ISP .EQ. 1 ) THEN +!!$ call ga_print_stats() +!!$ call ga_summarize(1) +!!$ ENDIF + CALL SECOND_MNH2(T0) + call ga_sync +!!$ gstatus_ga = ga_destroy(g_a) + CALL SECOND_MNH2(T1) + TIMEZ%T_WRIT3D_WAIT=TIMEZ%T_WRIT3D_WAIT + T1 - T0 +#else + ! + ALLOCATE(ZSLIDE_ll(0,0)) + GALLOC_ll = .TRUE. + inb_proc_real = min(TZFD%nb_procio,ISNPROC) + Z_SLIDE: DO JK=1,SIZE(PFIELD,3),inb_proc_real + ! + ! collecte the data + ! + JK_MAX=min(SIZE(PFIELD,3),JK+inb_proc_real-1) + ! + NB_REQ=0 + ALLOCATE(REQ_TAB(inb_proc_real)) + ALLOCATE(T_TX2DP(inb_proc_real)) + DO JKK=JK,JK_MAX + ! + ! get the file & rank to write this level + ! + IF (TZFD%NB_PROCIO .GT. 1 ) THEN + IK_FILE = io_file(JKK,TZFD%nb_procio) + write(YK_FILE ,'(".Z",i3.3)') IK_FILE+1 + YFILE_IOZ = TRIM(HFILEM)//YK_FILE//".lfi" + TZFD_IOZ => GETFD(YFILE_IOZ) + ELSE + TZFD_IOZ => TZFD + END IF + ! + !IK_RANK = 1 + io_rank(IK_FILE,ISNPROC,TZFD%nb_procio) + IK_RANK = TZFD_IOZ%OWNER + ! + IF (HDIR == 'XX' .OR. HDIR =='YY') THEN + STOP " XX NON PREVU SUR BG POUR LE MOMENT " + CALL GATHER_XXFIELD(HDIR,PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM) + ELSEIF (HDIR == 'XY') THEN + IF (LPACK .AND. L2D) THEN + STOP " L2D NON PREVU SUR BG POUR LE MOMENT " + CALL GATHER_XXFIELD('XX',PFIELD(:,JPHEXT+1,:),ZFIELDP(:,1,:),TZFD%OWNER,TZFD%COMM) + ELSE + !CALL GATHER_XYFIELD(ZSLIDE,ZSLIDE_ll,TZFD_IOZ%OWNER,TZFD_IOZ%COMM) + !JUANIOZ + CALL SECOND_MNH2(T0) + IF ( ISP /= IK_RANK ) THEN + ! Other processors + CALL GET_DOMWRITE_ll(ISP,'local',IXO,IXE,IYO,IYE) + IF (IXO /= 0) THEN ! intersection is not empty + NB_REQ = NB_REQ + 1 + ALLOCATE(T_TX2DP(NB_REQ)%X(IXO:IXE,IYO:IYE)) + ZSLIDE => PFIELD(:,:,JKK) + TX2DP=>ZSLIDE(IXO:IXE,IYO:IYE) + T_TX2DP(NB_REQ)%X=ZSLIDE(IXO:IXE,IYO:IYE) + CALL MPI_ISEND(T_TX2DP(NB_REQ)%X,SIZE(TX2DP),MPI_FLOAT,IK_RANK-1,99+IK_RANK & + & ,TZFD_IOZ%COMM,REQ_TAB(NB_REQ),IERR) + !CALL MPI_BSEND(TX2DP,SIZE(TX2DP),MPI_FLOAT,IK_RANK-1,99+IK_RANK,TZFD_IOZ%COMM,IERR) + END IF + END IF + CALL SECOND_MNH2(T1) + TIMEZ%T_WRIT3D_SEND=TIMEZ%T_WRIT3D_SEND + T1 - T0 + !JUANIOZ + END IF + END IF + END DO + ! + ! write the data + ! + DO JKK=JK,JK_MAX + IF (TZFD%NB_PROCIO .GT. 1 ) THEN + IK_FILE = io_file(JKK,TZFD%nb_procio) + write(YK_FILE ,'(".Z",i3.3)') IK_FILE+1 + YFILE_IOZ = TRIM(HFILEM)//YK_FILE//".lfi" + TZFD_IOZ => GETFD(YFILE_IOZ) + ELSE + TZFD_IOZ => TZFD + ENDIF + IK_RANK = TZFD_IOZ%OWNER + !IK_RANK = 1 + io_rank(IK_FILE,ISNPROC,TZFD%nb_procio) + ! + IF (ISP == IK_RANK ) THEN + !JUANIOZ + CALL SECOND_MNH2(T0) + ! I/O proc case + IF ( SIZE(ZSLIDE_ll) .EQ. 0 ) THEN + DEALLOCATE(ZSLIDE_ll) + CALL ALLOCBUFFER_ll(ZSLIDE_ll,ZSLIDE,HDIR,GALLOC_ll) + END IF + DO JI=1,ISNPROC + CALL GET_DOMWRITE_ll(JI,'global',IXO,IXE,IYO,IYE) + IF (IXO /= 0) THEN ! intersection is not empty + TX2DP=>ZSLIDE_ll(IXO:IXE,IYO:IYE) + IF (ISP == JI) THEN + CALL GET_DOMWRITE_ll(JI,'local',IXO,IXE,IYO,IYE) + ZSLIDE => PFIELD(:,:,JKK) + TX2DP = ZSLIDE(IXO:IXE,IYO:IYE) + ELSE + CALL MPI_RECV(TX2DP,SIZE(TX2DP),MPI_FLOAT,JI-1,99+IK_RANK,TZFD_IOZ%COMM,STATUS,IERR) + END IF + END IF + END DO + CALL SECOND_MNH2(T1) + TIMEZ%T_WRIT3D_RECV=TIMEZ%T_WRIT3D_RECV + T1 - T0 + !JUANIOZ + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT + WRITE(YK,'(I4.4)') JKK + YRECZSLIDE = TRIM(HRECFM)//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,HDIR,ZSLIDE_ll,TZFMH,IRESP) + CALL SECOND_MNH2(T2) + TIMEZ%T_WRIT3D_WRIT=TIMEZ%T_WRIT3D_WRIT + T2 - T1 + END IF +!!$ CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD_IOZ%OWNER-1,TZFD_IOZ%COMM,IERR) + END DO + !CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD_IOZ%OWNER-1,TZFD_IOZ%COMM,IERR) + !CALL MPI_BARRIER(TZFD_IOZ%COMM,IERR) + ! + CALL SECOND_MNH2(T0) + IF (NB_REQ .GT.0 ) THEN + !ALLOCATE(STATUSES(MPI_STATUS_SIZE,NB_REQ)) + CALL MPI_WAITALL(NB_REQ,REQ_TAB,MNH_STATUSES_IGNORE,IERR) + !CALL MPI_WAITALL(NB_REQ,REQ_TAB,STATUSES,IERR) + !DEALLOCATE(STATUSES) + DO JI=1,NB_REQ ; DEALLOCATE(T_TX2DP(JI)%X) ; ENDDO + END IF + DEALLOCATE(T_TX2DP) + DEALLOCATE(REQ_TAB) + CALL SECOND_MNH2(T1) + TIMEZ%T_WRIT3D_WAIT=TIMEZ%T_WRIT3D_WAIT + T1 - T0 + END DO Z_SLIDE + !JUAN BG Z SLIDE +! end of MNH_GA +#endif + END IF ! multiprocessor execution + ELSE + IRESP = -61 + END IF + !---------------------------------------------------------------- + IF (IRESP.NE.0) THEN + CALL FM_WRIT_ERR("FMWRITX3_ll",HFILEM,HFIPRI,HRECFM,HDIR,KGRID,KLENCH,IRESP) + END IF + IF (GALLOC) DEALLOCATE(ZFIELDP) + IF (GALLOC_ll) DEALLOCATE(ZSLIDE_ll) + !IF (Associated(ZSLIDE_ll)) DEALLOCATE(ZSLIDE_ll) + KRESP = IRESP + IF (ASSOCIATED(TZFD)) CALL MPI_BARRIER(TZFD%COMM,IERR) + CALL SECOND_MNH2(T22) + TIMEZ%T_WRIT3D_ALL=TIMEZ%T_WRIT3D_ALL + T22 - T11 + END SUBROUTINE FMWRITX3_ll + + SUBROUTINE FMWRITX4_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& + KLENCH,HCOMMENT,KRESP) + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT,LPACK,L1D,L2D + 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 +!!!!! MOD SB +#ifdef MNH_NCWRIT + USE MODD_NCOUT + USE MODE_UTIL +#endif +!!!!! MOD SB + ! + ! + !* 0.1 Declarations of arguments + ! + CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name + CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to write + CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages + CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form + REAL,DIMENSION(:,:,:,:),TARGET,INTENT(IN) ::PFIELD ! array containing the data field + INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) + INTEGER, INTENT(IN) ::KLENCH ! length of comment string + CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT ! comment string + INTEGER, INTENT(OUT)::KRESP ! return-code + ! + !* 0.2 Declarations of local variables + ! + CHARACTER(LEN=JPFINL) :: YFNLFI + INTEGER :: IERR + TYPE(FD_ll), POINTER :: TZFD + INTEGER :: IRESP + REAL,DIMENSION(:,:,:,:),POINTER :: ZFIELDP + TYPE(FMHEADER) :: TZFMH + LOGICAL :: GALLOC + INTEGER :: IHEXTOT + ! + !* 1.1 THE NAME OF LFIFM + ! + IRESP = 0 + GALLOC = .FALSE. + YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' + !print * , ' Writing Article 4 ' , HRECFM + !------------------------------------------------------------------ + IHEXTOT = 2*JPHEXT+1 + TZFD=>GETFD(YFNLFI) + IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT + ! IF (LPACK .AND. L1D .AND. HDIR=='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,:,:) +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) +#endif + ! ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN + ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + ZFIELDP=>PFIELD(:,JPHEXT+1:JPHEXT+1,:,:) +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) +#endif + ELSE +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP) +#endif + END IF + ELSE + IF (ISP == TZFD%OWNER) THEN + CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC) + ELSE + ALLOCATE(ZFIELDP(0,0,0,0)) + GALLOC = .TRUE. + END IF + ! + IF (HDIR == 'XX' .OR. HDIR =='YY') THEN + CALL GATHER_XXFIELD(HDIR,PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM) + ELSEIF (HDIR == '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 + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) +#endif + 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("FMWRITX4_ll",HFILEM,HFIPRI,HRECFM,HDIR,KGRID,KLENCH,IRESP) + END IF + IF (GALLOC) DEALLOCATE(ZFIELDP) + KRESP = IRESP + END SUBROUTINE FMWRITX4_ll + + SUBROUTINE FMWRITX5_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& + KLENCH,HCOMMENT,KRESP) + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT,LPACK,L1D,L2D + 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 +#ifdef MNH_NCWRIT + USE MODE_UTIL + USE MODD_DIM_n + USE MODD_NCOUT +#endif + ! + ! + !* 0.1 Declarations of arguments + ! + CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name + CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to write + CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages + CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form + REAL,DIMENSION(:,:,:,:,:),TARGET,INTENT(IN) ::PFIELD ! array containing the data field + INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) + INTEGER, INTENT(IN) ::KLENCH ! length of comment string + CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT ! comment string + INTEGER, INTENT(OUT)::KRESP ! return-code + ! + !* 0.2 Declarations of local variables + ! + CHARACTER(LEN=JPFINL) :: YFNLFI + INTEGER :: IERR + TYPE(FD_ll), POINTER :: TZFD + INTEGER :: IRESP + REAL,DIMENSION(:,:,:,:,:),POINTER :: ZFIELDP + TYPE(FMHEADER) :: TZFMH + LOGICAL :: GALLOC +#ifdef MNH_NCWRIT + TYPE(workfield), DIMENSION(:), POINTER :: TZRECLIST + INTEGER,DIMENSION(6) :: TABDIM +#endif + INTEGER :: IHEXTOT + ! + !* 1.1 THE NAME OF LFIFM + ! + IRESP = 0 + GALLOC = .FALSE. + YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' +#ifdef MNH_NCWRIT + TABDIM(:)=1 + TABDIM(1)=SIZE(PFIELD,1) + TABDIM(2)=SIZE(PFIELD,2) + TABDIM(3)=SIZE(PFIELD,3) + TABDIM(4)=SIZE(PFIELD,4) + TABDIM(5)=SIZE(PFIELD,5) + !print * , ' Writing Article 5 ' , HRECFM +#endif + !------------------------------------------------------------------ + IHEXTOT = 2*JPHEXT+1 + TZFD=>GETFD(YFNLFI) + IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT + ! IF (LPACK .AND. L1D .AND. HDIR=='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,:,:,:) +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) +#endif + ! ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN + ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN + ZFIELDP=>PFIELD(:,JPHEXT+1:JPHEXT+1,:,:,:) +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + END IF + IF ( LNETCDF .AND. NC_WRITE ) THEN + TABDIM(2)=1 + IF ( NC_FILE == 'phy' ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP), & + ZFIELDP,TZFMH,IRESP) + END IF + CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,ZFIELDP,.TRUE.,TZRECLIST, & +! CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,ZFIELDP, & + & KLENCH,HCOMMENT) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) +#endif + ELSE +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + END IF + IF ( LNETCDF .AND. NC_WRITE ) THEN + IF ( NC_FILE == 'phy' ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD), & + PFIELD,TZFMH,IRESP) + END IF + CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,PFIELD,.TRUE.,TZRECLIST, & +! CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,PFIELD, & + & KLENCH,HCOMMENT) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP) +#endif + END IF + ELSE + IF (ISP == TZFD%OWNER) THEN + CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC) + ELSE + ALLOCATE(ZFIELDP(0,0,0,0,0)) + GALLOC = .TRUE. + END IF + ! + IF (HDIR == 'XX' .OR. HDIR =='YY') THEN + CALL GATHER_XXFIELD(HDIR,PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM) + ELSEIF (HDIR == '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 + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + & ,IRESP) + END IF + IF ( LNETCDF .AND. NC_WRITE ) THEN + IF ( NC_FILE == 'phy' ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + & ,IRESP) + END IF + CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,ZFIELDP,.TRUE.,TZRECLIST, & +! CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,ZFIELDP, & + & KLENCH,HCOMMENT) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + & ,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) +#endif + 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("FMWRITX5_ll",HFILEM,HFIPRI,HRECFM,HDIR,KGRID,KLENCH,IRESP) + END IF + IF (GALLOC) DEALLOCATE(ZFIELDP) + KRESP = IRESP + END SUBROUTINE FMWRITX5_ll + + SUBROUTINE FMWRITX6_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,& + KLENCH,HCOMMENT,KRESP) + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT + USE MODD_FM + USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL + USE MODE_ALLOCBUFFER_ll + USE MODE_GATHER_ll + ! +!!!! MOD SB +#ifdef MNH_NCWRIT + USE MODD_NCOUT + USE MODE_UTIL +#endif +!!!! MOD SB + ! + !* 0.1 Declarations of arguments + ! + CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name + CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to write + CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages + CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form + REAL,DIMENSION(:,:,:,:,:,:),TARGET,INTENT(IN) ::PFIELD ! array containing the data field + INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) + INTEGER, INTENT(IN) ::KLENCH ! length of comment string + CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT ! comment string + INTEGER, INTENT(OUT)::KRESP ! return-code + ! + !* 0.2 Declarations of local variables + ! + CHARACTER(LEN=JPFINL) :: YFNLFI + INTEGER :: IERR + TYPE(FD_ll), POINTER :: TZFD + INTEGER :: IRESP + REAL,DIMENSION(:,:,:,:,:,:),POINTER :: ZFIELDP + TYPE(FMHEADER) :: TZFMH + LOGICAL :: GALLOC + ! + !* 1.1 THE NAME OF LFIFM + ! + IRESP = 0 + GALLOC = .FALSE. + YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' + !print * , ' Writing Article 6 ' , HRECFM + !------------------------------------------------------------------ + TZFD=>GETFD(YFNLFI) + IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP) +#endif + ELSE ! multiprocessor execution + IF (ISP == TZFD%OWNER) THEN + CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC) + ELSE + ALLOCATE(ZFIELDP(0,0,0,0,0,0)) + GALLOC = .TRUE. + END IF + ! + IF (HDIR == 'XX' .OR. HDIR =='YY') THEN + CALL GATHER_XXFIELD(HDIR,PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM) + ELSEIF (HDIR == 'XY') THEN + CALL GATHER_XYFIELD(PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM) + END IF + ! + IF (ISP == TZFD%OWNER) THEN + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + & ,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + & ,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP) +#endif + 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("FMWRITX6_ll",HFILEM,HFIPRI,HRECFM,HDIR,KGRID,KLENCH,IRESP) + END IF + IF (GALLOC) DEALLOCATE(ZFIELDP) + KRESP = IRESP + END SUBROUTINE FMWRITX6_ll + + SUBROUTINE FMWRITN0_ll(HFILEM,HRECFM,HFIPRI,HDIR,KFIELD,KGRID,& + KLENCH,HCOMMENT,KRESP) + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT + USE MODD_FM + USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL + !* 0. DECLARATIONS + ! ------------ +!!!! MOD SB +#ifdef MNH_NCWRIT + USE MODD_NCOUT + USE MODE_UTIL +#endif +!!!! MOD SB + ! + ! + !* 0.1 Declarations of arguments + ! + CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name + CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read + CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages + CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form + INTEGER, INTENT(IN) ::KFIELD ! array containing the data field + INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) + INTEGER, INTENT(IN) ::KLENCH ! length of comment string + CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT! comment string + INTEGER, INTENT(OUT)::KRESP ! return-code + ! + !* 0.2 Declarations of local variables + ! + CHARACTER(LEN=JPFINL) :: YFNLFI + INTEGER :: IERR + TYPE(FD_ll), POINTER :: TZFD + INTEGER :: IRESP + TYPE(FMHEADER) :: TZFMH + + !JUANZIO + INTEGER :: IK_FILE,IK_rank + CHARACTER(len=5) :: YK_FILE + CHARACTER(len=128) :: YFILE_IOZ + TYPE(FD_ll), POINTER :: TZFD_IOZ + !JUANZIO + !---------------------------------------------------------------- + ! + !* 1.1 THE NAME OF LFIFM + ! + IRESP = 0 + YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' + !print * , ' Writing Article N0 ' , HRECFM + !------------------------------------------------------------------ + TZFD=>GETFD(YFNLFI) + IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,KFIELD,TZFMH,IRESP) +#endif + ELSE + IF (ISP == TZFD%OWNER) THEN + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,KFIELD,TZFMH,IRESP) +#endif + 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(HFILEM)//YK_FILE//".lfi" + TZFD_IOZ => GETFD(YFILE_IOZ) + IK_RANK = TZFD_IOZ%OWNER + IF ( ISP == IK_RANK ) THEN + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD_IOZ%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD_IOZ%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD_IOZ%CDF,HRECFM,HDIR,KFIELD,TZFMH,IRESP) +#endif + END IF + END DO + ENDIF + ELSE + IRESP = -61 + END IF + !---------------------------------------------------------------- + IF (IRESP.NE.0) THEN + CALL FM_WRIT_ERR("FMWRITN0_ll",HFILEM,HFIPRI,HRECFM,HDIR,KGRID,KLENCH& + & ,IRESP) + END IF + KRESP = IRESP + END SUBROUTINE FMWRITN0_ll + + SUBROUTINE FMWRITN1_ll(HFILEM,HRECFM,HFIPRI,HDIR,KFIELD,KGRID,& + KLENCH,HCOMMENT,KRESP) + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT + USE MODD_FM + USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL + USE MODE_ALLOCBUFFER_ll + USE MODE_GATHER_ll + !* 0. DECLARATIONS + ! ------------ +!!!! MOD SB +#ifdef MNH_NCWRIT + USE MODD_NCOUT + USE MODE_UTIL +#endif +!!!! MOD SB + ! + ! + !* 0.1 Declarations of arguments + ! + CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name + CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to write + CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages + CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form + INTEGER,DIMENSION(:),TARGET,INTENT(IN) ::KFIELD ! array containing the data field + INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) + INTEGER, INTENT(IN) ::KLENCH ! length of comment string + CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT ! comment string + INTEGER, INTENT(OUT)::KRESP ! return-code + ! + !* 0.2 Declarations of local variables + ! + CHARACTER(LEN=JPFINL) :: YFNLFI + INTEGER :: IERR + TYPE(FD_ll), POINTER :: TZFD + INTEGER :: IRESP + TYPE(FMHEADER) :: TZFMH + INTEGER,DIMENSION(:),POINTER :: IFIELDP + LOGICAL :: GALLOC +#ifdef MNH_NCWRIT + REAL,DIMENSION(SIZE(KFIELD)) ::WFIELD + TYPE(workfield), DIMENSION(:), POINTER :: TZRECLIST + INTEGER,DIMENSION(6) :: TABDIM +#endif + !---------------------------------------------------------------- + ! + !* 1.1 THE NAME OF LFIFM + ! + IRESP = 0 + GALLOC = .FALSE. + YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' + !print * , ' Writing Article N1 ' , HRECFM +#ifdef MNH_NCWRIT + WFIELD = KFIELD + TABDIM(:)=1 +#endif + !------------------------------------------------------------------ + TZFD=>GETFD(YFNLFI) + IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(KFIELD),KFIELD,TZFMH,IRESP) + END IF + IF ( LNETCDF .AND. NC_WRITE ) THEN + CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,WFIELD, & + & .TRUE.,TZRECLIST,KLENCH,HCOMMENT) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(KFIELD),KFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,KFIELD,TZFMH,IRESP) +#endif + ELSE + IF (ISP == TZFD%OWNER) THEN + CALL ALLOCBUFFER_ll(IFIELDP,KFIELD,HDIR,GALLOC) + ELSE + ALLOCATE(IFIELDP(0)) + GALLOC = .TRUE. + END IF + ! + IF (HDIR == 'XX' .OR. HDIR =='YY') THEN + CALL GATHER_XXFIELD(HDIR,KFIELD,IFIELDP,TZFD%OWNER,TZFD%COMM) + END IF + ! + IF (ISP == TZFD%OWNER) THEN + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH& + & ,IRESP) + END IF + IF ( LNETCDF .AND. NC_WRITE ) THEN + CALL NC_WRIT_ll(HRECFM,HFILEM,KGRID,TABDIM,WFIELD, & + .TRUE.,TZRECLIST,& + & KLENCH,HCOMMENT) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH& + & ,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,IFIELDP,TZFMH,IRESP) +#endif + 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("FMWRITN1_ll",HFILEM,HFIPRI,HRECFM,HDIR,KGRID,KLENCH& + & ,IRESP) + END IF + IF (GALLOC) DEALLOCATE(IFIELDP) + KRESP = IRESP + END SUBROUTINE FMWRITN1_ll + + SUBROUTINE FMWRITN2_ll(HFILEM,HRECFM,HFIPRI,HDIR,KFIELD,KGRID,& + KLENCH,HCOMMENT,KRESP) + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT,LPACK,L1D,L2D + 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 + ! +!!!! MOD SB +#ifdef MNH_NCWRIT + USE MODD_NCOUT + USE MODE_UTIL +#endif +!!!! MOD SB + ! + !* 0.1 Declarations of arguments + ! + CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name + CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to write + CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages + CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form + INTEGER,DIMENSION(:,:),TARGET,INTENT(IN) ::KFIELD ! array containing the data field + INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) + INTEGER, INTENT(IN) ::KLENCH ! length of comment string + CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT ! comment string + INTEGER, INTENT(OUT)::KRESP ! return-code + ! + !* 0.2 Declarations of local variables + ! + CHARACTER(LEN=JPFINL) :: YFNLFI + INTEGER :: IERR + TYPE(FD_ll), POINTER :: TZFD + INTEGER :: IRESP + INTEGER,DIMENSION(:,:),POINTER :: IFIELDP + TYPE(FMHEADER) :: TZFMH + LOGICAL :: GALLOC + INTEGER :: IHEXTOT + ! + !* 1.1 THE NAME OF LFIFM + ! + IRESP = 0 + GALLOC = .FALSE. + YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' + !print * , ' Writing Article N2 ' , HRECFM + ! + IHEXTOT = 2*JPHEXT+1 + TZFD=>GETFD(YFNLFI) +! IF (ASSOCIATED(TZFD) .OR. .not.LLFIFM) THEN + IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT + ! IF (LPACK .AND. L1D .AND. HDIR=='XY') THEN + IF (LPACK .AND. L1D .AND. SIZE(KFIELD,1)==IHEXTOT .AND. SIZE(KFIELD,2)==IHEXTOT) THEN + IFIELDP=>KFIELD(JPHEXT+1:JPHEXT+1,JPHEXT+1:JPHEXT+1) +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,IFIELDP,TZFMH,IRESP) +#endif + ! ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN + ELSEIF (LPACK .AND. L2D .AND. SIZE(KFIELD,2)==IHEXTOT) THEN + IFIELDP=>KFIELD(:,JPHEXT+1:JPHEXT+1) +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,IFIELDP,TZFMH,IRESP) +#endif + ELSE +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(KFIELD),KFIELD,TZFMH,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(KFIELD),KFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,KFIELD,TZFMH,IRESP) +#endif + END IF + ELSE + IF (ISP == TZFD%OWNER) THEN + CALL ALLOCBUFFER_ll(IFIELDP,KFIELD,HDIR,GALLOC) + ELSE + ALLOCATE(IFIELDP(0,0)) + GALLOC = .TRUE. + END IF + ! + IF (HDIR == 'XX' .OR. HDIR =='YY') THEN + CALL GATHER_XXFIELD(HDIR,KFIELD,IFIELDP,TZFD%OWNER,TZFD%COMM) + ELSEIF (HDIR == 'XY') THEN + IF (LPACK .AND. L2D) THEN + CALL GATHER_XXFIELD('XX',KFIELD(:,JPHEXT+1),IFIELDP(:,1),TZFD%OWNER,TZFD%COMM) + ELSE + CALL GATHER_XYFIELD(KFIELD,IFIELDP,TZFD%OWNER,TZFD%COMM) + END IF + END IF + ! + IF (ISP == TZFD%OWNER) THEN + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH& + & ,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH& + & ,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,IFIELDP,TZFMH,IRESP) +#endif + 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("FMWRITN2_ll",HFILEM,HFIPRI,HRECFM,HDIR,KGRID,KLENCH,IRESP) + END IF + IF (GALLOC) DEALLOCATE(IFIELDP) + KRESP = IRESP + END SUBROUTINE FMWRITN2_ll + + + SUBROUTINE FMWRITL0_ll(HFILEM,HRECFM,HFIPRI,HDIR,OFIELD,KGRID,& + KLENCH,HCOMMENT,KRESP) + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT + USE MODD_FM + USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL + +!!!! MOD SB +#ifdef MNH_NCWRIT + USE MODD_NCOUT + USE MODE_UTIL +#endif +!!!! MOD SB + ! + !* 0. DECLARATIONS + ! ------------ + ! + ! + !* 0.1 Declarations of arguments + ! + CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name + CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read + CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages + CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form + LOGICAL, INTENT(IN) ::OFIELD ! array containing the data field + INTEGER, INTENT(IN)::KGRID ! C-grid indicator (u,v,w,T) + INTEGER, INTENT(IN)::KLENCH ! length of comment string + CHARACTER(LEN=*), INTENT(IN)::HCOMMENT ! comment string + INTEGER, INTENT(OUT)::KRESP ! return-code + ! + !* 0.2 Declarations of local variables + ! + INTEGER :: IFIELD + CHARACTER(LEN=JPFINL) :: YFNLFI + INTEGER :: IERR + TYPE(FD_ll), POINTER :: TZFD + INTEGER :: IRESP + TYPE(FMHEADER) :: TZFMH + + !---------------------------------------------------------------- + ! + !* 1.1 THE NAME OF LFIFM + ! + IRESP = 0 + YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' + !print * , ' Writing Article L0 ' , HRECFM + IF (OFIELD) THEN + IFIELD=1 + ELSE + IFIELD=0 + END IF + !---------------------------------------------------------------- + TZFD=>GETFD(YFNLFI) +! IF (ASSOCIATED(TZFD) .OR. .not.LLFIFM) THEN + IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,IFIELD,TZFMH,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,IFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,IFIELD,TZFMH,IRESP) +#endif + ELSE + IF (ISP == TZFD%OWNER) THEN + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,IFIELD,TZFMH,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,IFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,IFIELD,TZFMH,IRESP) +#endif + 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("FMWRITL0_ll",HFILEM,HFIPRI,HRECFM,HDIR,KGRID,KLENCH& + & ,IRESP) + END IF + KRESP = IRESP + END SUBROUTINE FMWRITL0_ll + + SUBROUTINE FMWRITL1_ll(HFILEM,HRECFM,HFIPRI,HDIR,OFIELD,KGRID,& + KLENCH,HCOMMENT,KRESP) + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT + USE MODD_FM + USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL + + !* 0. DECLARATIONS + ! ------------ +!!!! MOD SB +#ifdef MNH_NCWRIT + USE MODD_NCOUT + USE MODE_UTIL +#endif +!!!! MOD SB + ! + !* 0.1 Declarations of arguments + ! + CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name + CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read + CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages + CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form + LOGICAL,DIMENSION(:),INTENT(IN) ::OFIELD ! array containing the data field + INTEGER, INTENT(IN)::KGRID ! C-grid indicator (u,v,w,T) + INTEGER, INTENT(IN)::KLENCH ! length of comment string + CHARACTER(LEN=*), INTENT(IN)::HCOMMENT ! comment string + INTEGER, INTENT(OUT)::KRESP ! return-code + ! + !* 0.2 Declarations of local variables + ! + INTEGER, DIMENSION(SIZE(OFIELD)) :: IFIELD + CHARACTER(LEN=JPFINL) :: YFNLFI + INTEGER :: IERR + TYPE(FD_ll), POINTER :: TZFD + INTEGER :: IRESP + TYPE(FMHEADER) :: TZFMH + + !---------------------------------------------------------------- + ! + !* 1.1 THE NAME OF LFIFM + ! + IRESP = 0 + YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' + !print * , ' Writing Article L1 ' , HRECFM + WHERE (OFIELD) + IFIELD=1 + ELSEWHERE + IFIELD=0 + END WHERE + !---------------------------------------------------------------- + TZFD=>GETFD(YFNLFI) +! IF (ASSOCIATED(TZFD) .OR. .not.LLFIFM) THEN + IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELD),IFIELD,TZFMH,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELD),IFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,IFIELD,TZFMH,IRESP) +#endif + ELSE + IF (ISP == TZFD%OWNER) THEN + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELD),IFIELD,TZFMH,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELD),IFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,IFIELD,TZFMH,IRESP) +#endif + 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("FMWRITL1_ll",HFILEM,HFIPRI,HRECFM,HDIR,KGRID,KLENCH& + & ,IRESP) + END IF + KRESP = IRESP + END SUBROUTINE FMWRITL1_ll + + SUBROUTINE FMWRITC0_ll(HFILEM,HRECFM,HFIPRI,HDIR,HFIELD,KGRID,& + KLENCH,HCOMMENT,KRESP) + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT + USE MODD_FM + USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL + ! + !* 0. DECLARATIONS + ! ------------ + ! +!!!! MOD SB +#ifdef MNH_NCWRIT + USE MODD_NCOUT + USE MODE_UTIL +#endif +!!! MOD SB + ! + !* 0.1 Declarations of arguments + ! + CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name + CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read + CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages + CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form + CHARACTER(LEN=*), INTENT(IN) ::HFIELD ! array containing the data field + INTEGER, INTENT(IN)::KGRID ! C-grid indicator (u,v,w,T) + INTEGER, INTENT(IN)::KLENCH ! length of comment string + CHARACTER(LEN=*), INTENT(IN)::HCOMMENT ! comment string + INTEGER, INTENT(OUT)::KRESP ! return-code + ! + !* 0.2 Declarations of local variables + ! + INTEGER :: JLOOP + INTEGER,DIMENSION(:),ALLOCATABLE :: IFIELD + INTEGER :: ILENG + CHARACTER(LEN=JPFINL) :: YFNLFI + INTEGER :: IERR + TYPE(FD_ll), POINTER :: TZFD + INTEGER :: IRESP + TYPE(FMHEADER) :: TZFMH +#ifdef MNH_NCWRIT + TYPE(workfield), DIMENSION(:), POINTER :: TZRECLIST + INTEGER,DIMENSION(6) :: TABDIM +#endif + + !---------------------------------------------------------------- + !* 1.1 THE NAME OF LFIFM + ! + IRESP = 0 + YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' + !print * , ' Writing Article C0 ' , HRECFM + ILENG=LEN(HFIELD) +#ifdef MNH_NCWRIT + TABDIM(:)=1 + TABDIM(1)=ILENG +#endif + ! + IF (ILENG==0) THEN + ILENG=1 + ALLOCATE(IFIELD(1)) + IFIELD(1)=IACHAR(' ') + ELSE + ALLOCATE(IFIELD(ILENG)) + DO JLOOP=1,ILENG + IFIELD(JLOOP)=IACHAR(HFIELD(JLOOP:JLOOP)) + END DO + END IF + !---------------------------------------------------------------- + TZFD=>GETFD(YFNLFI) + IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,KRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,HFIELD,TZFMH,IRESP) +#endif + ELSE + IF (ISP == TZFD%OWNER) THEN + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,KRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,HFIELD,TZFMH,IRESP) +#endif + 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("FMWRITC0_ll",HFILEM,HFIPRI,HRECFM,HDIR,KGRID,KLENCH& + & ,IRESP) + END IF + IF (ALLOCATED(IFIELD)) DEALLOCATE(IFIELD) + KRESP = IRESP + END SUBROUTINE FMWRITC0_ll + + SUBROUTINE FMWRITC1_ll(HFILEM,HRECFM,HFIPRI,HDIR,HFIELD,KGRID,& + KLENCH,HCOMMENT,KRESP) + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT + USE MODD_FM + USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL + ! + !* 0. DECLARATIONS + ! ------------ + ! + ! + !* 0.1 Declarations of arguments + ! + CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name + CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read + CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages + CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form + CHARACTER(LEN=*),DIMENSION(:),INTENT(IN) ::HFIELD ! array containing the data field + INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) + INTEGER, INTENT(IN) ::KLENCH ! length of comment string + CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT ! comment string + INTEGER, INTENT(OUT)::KRESP ! return-code + ! + !* 0.2 Declarations of local variables + ! + INTEGER :: J,JJ + INTEGER :: ILE, IP + INTEGER,DIMENSION(:),ALLOCATABLE :: IFIELD + INTEGER :: ILENG + CHARACTER(LEN=JPFINL) :: YFNLFI + INTEGER :: IERR + TYPE(FD_ll), POINTER :: TZFD + INTEGER :: IRESP + TYPE(FMHEADER) :: TZFMH + !---------------------------------------------------------------- + !* 1.1 THE NAME OF LFIFM + ! + IRESP = 0 + YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' + !print * , ' Writing Article C1 ' , HRECFM + ILE=LEN(HFIELD) + IP=SIZE(HFIELD) + ILENG=ILE*IP + ! + IF (ILENG==0) THEN + IP=1 + ILE=1 + ILENG=1 + ALLOCATE(IFIELD(1)) + IFIELD(1)=IACHAR(' ') + ELSE + ALLOCATE(IFIELD(ILENG)) + DO JJ=1,IP + DO J=1,ILE + IFIELD(ILE*(JJ-1)+J)=IACHAR(HFIELD(JJ)(J:J)) + END DO + END DO + END IF + !---------------------------------------------------------------- + TZFD=>GETFD(YFNLFI) + IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,HFIELD,TZFMH,IRESP) + ELSE + IF (ISP == TZFD%OWNER) THEN + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,HFIELD,TZFMH,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("FMWRITC1_ll",HFILEM,HFIPRI,HRECFM,HDIR,KGRID,KLENCH& + & ,IRESP) + END IF + IF (ALLOCATED(IFIELD)) DEALLOCATE(IFIELD) + KRESP = IRESP + END SUBROUTINE FMWRITC1_ll + + SUBROUTINE FMWRITT0_ll(HFILEM,HRECFM,HFIPRI,HDIR,TFIELD,KGRID,& + KLENCH,HCOMMENT,KRESP) + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT + USE MODD_TYPE_DATE + USE MODD_FM + USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL + ! +!!!! MOD SB +#ifdef MNH_NCWRIT + USE MODD_NCOUT + USE MODE_UTIL +#endif +!!!! MOD SB + !* 0.1 Declarations of arguments + ! + CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name + CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to read + CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages + CHARACTER(LEN=*), INTENT(IN) ::HDIR ! field form + TYPE (DATE_TIME), INTENT(IN) ::TFIELD ! array containing the data field + INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) + INTEGER, INTENT(IN) ::KLENCH ! length of comment string + CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT ! comment string + INTEGER, INTENT(OUT)::KRESP ! return-code + !-------------------------------------------------------------------- + ! + !* 0.2 Declarations of local variables + ! + CHARACTER(LEN=JPFINL) :: YFNLFI + INTEGER :: IERR + TYPE(FD_ll), POINTER :: TZFD + INTEGER :: IRESP + TYPE(FMHEADER) :: TZFMH + INTEGER, DIMENSION(3) :: ITDATE ! date array + ! + !------------------------------------------------------------------------------- + IRESP = 0 + YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' + !print * , ' Writing Article T0 ' , HRECFM + ITDATE(1)=TFIELD%TDATE%YEAR + ITDATE(2)=TFIELD%TDATE%MONTH + ITDATE(3)=TFIELD%TDATE%DAY + !------------------------------------------------------------------------------- + TZFD=>GETFD(YFNLFI) +! IF (ASSOCIATED(TZFD) .OR. .not.LLFIFM) THEN + IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + TZFMH%GRID=KGRID + TZFMH%COMMENT='YYYYMMDD' + TZFMH%COMLEN=LEN_TRIM(TZFMH%COMMENT) +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,TRIM(HRECFM)//'%TDATE',.FALSE.,3,ITDATE& + & ,TZFMH,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,TRIM(HRECFM)//'%TDATE',.FALSE.,3,ITDATE& + & ,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,TRIM(HRECFM)//'%TDATE',HDIR,ITDATE,TZFMH,IRESP) +#endif + TZFMH%COMMENT='SECONDS' + TZFMH%COMLEN=LEN_TRIM(TZFMH%COMMENT) +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,TRIM(HRECFM)//'%TIME',.TRUE.,1,TFIELD%TIME& + & ,TZFMH,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,TRIM(HRECFM)//'%TIME',.TRUE.,1,TFIELD%TIME& + & ,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,TRIM(HRECFM)//'%TIME',HDIR,TFIELD%TIME,TZFMH,IRESP) +#endif + ELSE + IF (ISP == TZFD%OWNER) THEN + TZFMH%GRID=KGRID + TZFMH%COMMENT='YYYYMMDD' + TZFMH%COMLEN=LEN_TRIM(TZFMH%COMMENT) +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,TRIM(HRECFM)//'%TDATE',.FALSE.,3,ITDATE& + & ,TZFMH,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,TRIM(HRECFM)//'%TDATE',.FALSE.,3,ITDATE& + & ,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,TRIM(HRECFM)//'%TDATE',HDIR,ITDATE,TZFMH,IRESP) +#endif + TZFMH%COMMENT='SECONDS' + TZFMH%COMLEN=LEN_TRIM(TZFMH%COMMENT) +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,TRIM(HRECFM)//'%TIME',.TRUE.,1,TFIELD%TIME& + & ,TZFMH,IRESP) + END IF +#else + + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,TRIM(HRECFM)//'%TIME',.TRUE.,1,TFIELD%TIME& + & ,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,TRIM(HRECFM)//'%TIME',HDIR,TFIELD%TIME,TZFMH,IRESP) +#endif + 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("FMWRITT0_ll",HFILEM,HFIPRI,HRECFM,HDIR,KGRID,KLENCH& + & ,IRESP) + END IF + KRESP = IRESP + END SUBROUTINE FMWRITT0_ll + + SUBROUTINE FMWRIT_LB(HFILEM,HRECFM,HFIPRI,HLBTYPE,PLB,KRIM,KL3D,& + & KGRID,KLENCH,HCOMMENT,KRESP) + USE MODD_IO_ll, ONLY : ISP,ISNPROC,GSMONOPROC,LIOCDF4,LLFIOUT,LPACK,L2D + USE MODD_PARAMETERS_ll,ONLY : JPHEXT + USE MODD_FM + USE MODE_DISTRIB_LB + USE MODE_TOOLS_ll, ONLY : GET_GLOBALDIMS_ll + USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL + ! +!!!! MOD SB +#ifdef MNH_NCWRIT + USE MODD_NCOUT + USE MODE_UTIL +#endif +!!!! MOD SB + USE MODD_VAR_ll, ONLY : MNH_STATUSES_IGNORE + ! + !* 0.1 Declarations of arguments + ! + CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! file name + CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to be written + CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! file for prints in FM + CHARACTER(LEN=*), INTENT(IN) ::HLBTYPE! 'LBX','LBXU','LBY' or 'LBYV' + REAL,DIMENSION(:,:,:),TARGET,INTENT(IN) ::PLB ! array containing the LB field + INTEGER, INTENT(IN) ::KRIM ! size of the LB area + INTEGER, INTENT(IN) ::KL3D ! size of the LB array in FM + INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) + INTEGER, INTENT(IN) ::KLENCH ! length of comment string + CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT ! comment string + INTEGER, INTENT(OUT)::KRESP ! return-code + ! + !* 0.2 Declarations of local variables + ! + CHARACTER(LEN=JPFINL) :: YFNLFI + INTEGER :: IERR + TYPE(FD_ll), POINTER :: TZFD + INTEGER :: IRESP + REAL,DIMENSION(:,:,:),ALLOCATABLE,TARGET :: Z3D + REAL,DIMENSION(:,:,:), POINTER :: TX3DP + TYPE(FMHEADER) :: TZFMH + INTEGER :: IIMAX_ll,IJMAX_ll + INTEGER :: JI + INTEGER :: IIB,IIE,IJB,IJE + INTEGER, DIMENSION(MPI_STATUS_SIZE) :: STATUS + INTEGER,ALLOCATABLE,DIMENSION(:) :: REQ_TAB + INTEGER :: NB_REQ,IKU + TYPE TX_3DP + REAL,DIMENSION(:,:,:), POINTER :: X + END TYPE TX_3DP + TYPE(TX_3DP),ALLOCATABLE,DIMENSION(:) :: T_TX3DP + ! + !* 1.1 THE NAME OF LFIFM + ! + IRESP = 0 + YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' + !print * , ' Writing Article LB ' , HRECFM + IF (KL3D /= 2*(KRIM+JPHEXT)) THEN + IRESP = -30 + GOTO 1000 + END IF + ! + TZFD=>GETFD(YFNLFI) +! IF (ASSOCIATED(TZFD) .OR. .not.LLFIFM) THEN + IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT + IF (LPACK .AND. L2D) THEN + TX3DP=>PLB(:,JPHEXT+1:JPHEXT+1,:) +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(TX3DP),TX3DP,TZFMH,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(TX3DP),TX3DP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',TX3DP,TZFMH,IRESP) +#endif + ELSE +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PLB),PLB,TZFMH,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PLB),PLB,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',PLB,TZFMH,IRESP) +#endif + END IF + ELSE + IF (ISP == TZFD%OWNER) THEN + ! I/O proc case + CALL GET_GLOBALDIMS_ll(IIMAX_ll,IJMAX_ll) + IF (HLBTYPE == 'LBX' .OR. HLBTYPE == 'LBXU') THEN + ALLOCATE(Z3D((KRIM+JPHEXT)*2,IJMAX_ll+2*JPHEXT,SIZE(PLB,3))) + ELSE ! HLBTYPE == 'LBY' .OR. HLBTYPE == 'LBYV' + ALLOCATE(Z3D(IIMAX_ll+2*JPHEXT,(KRIM+JPHEXT)*2,SIZE(PLB,3))) + END IF + DO JI = 1,ISNPROC + CALL GET_DISTRIB_LB(HLBTYPE,JI,'FM','WRITE',KRIM,IIB,IIE,IJB,IJE) + IF (IIB /= 0) THEN + TX3DP=>Z3D(IIB:IIE,IJB:IJE,:) + IF (ISP /= JI) THEN + CALL MPI_RECV(TX3DP,SIZE(TX3DP),MPI_FLOAT,JI-1,99,TZFD%COMM,STATUS,IERR) + ELSE + CALL GET_DISTRIB_LB(HLBTYPE,JI,'LOC','WRITE',KRIM,IIB,IIE,IJB,IJE) + TX3DP = PLB(IIB:IIE,IJB:IJE,:) + END IF + END IF + END DO + TZFMH%GRID=KGRID + TZFMH%COMLEN=KLENCH + TZFMH%COMMENT=HCOMMENT + IF (LPACK .AND. L2D) THEN + TX3DP=>Z3D(:,JPHEXT+1:JPHEXT+1,:) + ELSE + TX3DP=>Z3D + END IF +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(TX3DP),TX3DP,TZFMH,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(TX3DP),TX3DP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',TX3DP,TZFMH,IRESP) +#endif + ELSE + NB_REQ=0 + ALLOCATE(REQ_TAB(1)) + ALLOCATE(T_TX3DP(1)) + IKU = SIZE(PLB,3) + ! Other processors + CALL GET_DISTRIB_LB(HLBTYPE,ISP,'LOC','WRITE',KRIM,IIB,IIE,IJB,IJE) + IF (IIB /= 0) THEN + TX3DP=>PLB(IIB:IIE,IJB:IJE,:) + NB_REQ = NB_REQ + 1 + ALLOCATE(T_TX3DP(NB_REQ)%X(IIB:IIE,IJB:IJE,IKU)) + T_TX3DP(NB_REQ)%X=PLB(IIB:IIE,IJB:IJE,:) + CALL MPI_ISEND(T_TX3DP(NB_REQ)%X,SIZE(TX3DP),MPI_FLOAT,TZFD%OWNER-1,99,TZFD%COMM,REQ_TAB(NB_REQ),IERR) + !CALL MPI_BSEND(TX3DP,SIZE(TX3DP),MPI_FLOAT,TZFD%OWNER-1,99,TZFD%COMM,IERR) + END IF + IF (NB_REQ .GT.0 ) THEN + CALL MPI_WAITALL(NB_REQ,REQ_TAB,MNH_STATUSES_IGNORE,IERR) + DEALLOCATE(T_TX3DP(1)%X) + END IF + DEALLOCATE(T_TX3DP,REQ_TAB) + END IF + ! + CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD& + & %COMM,IERR) + END IF !(GSMONOPROC) + ELSE + IRESP = -61 + END IF + !---------------------------------------------------------------- +1000 CONTINUE + IF (IRESP.NE.0) THEN + CALL FM_WRIT_ERR("FMWRIT_LB",HFILEM,HFIPRI,HRECFM,HLBTYPE,KGRID,KLENCH,IRESP) + END IF + ! + IF (ALLOCATED(Z3D)) DEALLOCATE(Z3D) + KRESP = IRESP + END SUBROUTINE FMWRIT_LB + + SUBROUTINE FMWRITBOXX2_ll(HFILEM,HRECFM,HFIPRI,HBUDGET,PFIELD,KGRID,& + HCOMMENT,KXOBOX,KXEBOX,KYOBOX,KYEBOX,KRESP) + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT + USE MODD_FM + USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL + USE MODE_GATHER_ll + ! +!!!! MOD SB +#ifdef MNH_NCWRIT + USE MODD_NCOUT + USE MODE_UTIL +#endif +!!!! MOD SB + ! + !* 0.1 Declarations of arguments + ! + CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name + CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to write + CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages + CHARACTER(LEN=*), INTENT(IN) ::HBUDGET ! 'BUDGET' (budget) or 'OTHER' (MesoNH field) + REAL,DIMENSION(:,:),TARGET, INTENT(IN) ::PFIELD ! array containing the data field + INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) + CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT ! comment string + INTEGER, INTENT(IN) ::KXOBOX ! + INTEGER, INTENT(IN) ::KXEBOX ! Global coordinates of the box + INTEGER, INTENT(IN) ::KYOBOX ! + INTEGER, INTENT(IN) ::KYEBOX ! + INTEGER, INTENT(OUT)::KRESP ! return-code + ! + !* 0.2 Declarations of local variables + ! + CHARACTER(LEN=JPFINL) :: YFNLFI + INTEGER :: IERR + TYPE(FD_ll), POINTER :: TZFD + INTEGER :: IRESP + REAL,DIMENSION(:,:),POINTER :: ZFIELDP + TYPE(FMHEADER) :: TZFMH + LOGICAL :: GALLOC + + ! + !* 1.1 THE NAME OF LFIFM + ! + IRESP = 0 + GALLOC = .FALSE. + YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' + !print * , ' Writing Article BOXX2 ' , HRECFM + !------------------------------------------------------------------ + TZFD=>GETFD(YFNLFI) +! IF (ASSOCIATED(TZFD) .OR. .not.LLFIFM) THEN + IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + TZFMH%GRID = KGRID + TZFMH%COMLEN = LEN_TRIM(HCOMMENT) + TZFMH%COMMENT = HCOMMENT + IF (HBUDGET /= 'BUDGET') THEN + ! take the sub-section of PFIELD defined by the box + ZFIELDP=>PFIELD(KXOBOX:KXEBOX,KYOBOX:KYEBOX) + ELSE + ! take the field as a budget + ZFIELDP=>PFIELD + END IF +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP) +#endif + ELSE ! multiprocessor execution + IF (ISP == TZFD%OWNER) THEN + ! Allocate the box + ALLOCATE(ZFIELDP(KXEBOX-KXOBOX+1,KYEBOX-KYOBOX+1)) + GALLOC = .TRUE. + ELSE + ALLOCATE(ZFIELDP(0,0)) + GALLOC = .TRUE. + END IF + ! + CALL GATHER_XYFIELD(PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM,& + & KXOBOX,KXEBOX,KYOBOX,KYEBOX,HBUDGET) + ! + IF (ISP == TZFD%OWNER) THEN + TZFMH%GRID = KGRID + TZFMH%COMLEN = LEN_TRIM(HCOMMENT) + TZFMH%COMMENT = HCOMMENT +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + & ,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + & ,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP) +#endif + 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("FMWRITBOXX2_ll",HFILEM,HFIPRI,HRECFM,'XY',KGRID,LEN(HCOMMENT),IRESP) + END IF + IF (GALLOC) DEALLOCATE(ZFIELDP) + KRESP = IRESP + END SUBROUTINE FMWRITBOXX2_ll + + SUBROUTINE FMWRITBOXX3_ll(HFILEM,HRECFM,HFIPRI,HBUDGET,PFIELD,KGRID,& + HCOMMENT,KXOBOX,KXEBOX,KYOBOX,KYEBOX,KRESP) + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT + USE MODD_FM + USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL + USE MODE_GATHER_ll + ! +!!!! MOD SB +#ifdef MNH_NCWRIT + USE MODD_NCOUT + USE MODE_UTIL +#endif +!!!! MOD SB + ! + !* 0.1 Declarations of arguments + ! + CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name + CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to write + CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages + CHARACTER(LEN=*), INTENT(IN) ::HBUDGET ! 'BUDGET' (budget) or 'OTHER' (MesoNH field) + REAL,DIMENSION(:,:,:),TARGET,INTENT(IN) ::PFIELD ! array containing the data field + INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) + CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT ! comment string + INTEGER, INTENT(IN) ::KXOBOX ! + INTEGER, INTENT(IN) ::KXEBOX ! Global coordinates of the box + INTEGER, INTENT(IN) ::KYOBOX ! + INTEGER, INTENT(IN) ::KYEBOX ! + INTEGER, INTENT(OUT)::KRESP ! return-code + ! + !* 0.2 Declarations of local variables + ! + CHARACTER(LEN=JPFINL) :: YFNLFI + INTEGER :: IERR + TYPE(FD_ll), POINTER :: TZFD + INTEGER :: IRESP + REAL,DIMENSION(:,:,:),POINTER :: ZFIELDP + TYPE(FMHEADER) :: TZFMH + LOGICAL :: GALLOC + + ! + !* 1.1 THE NAME OF LFIFM + ! + IRESP = 0 + GALLOC = .FALSE. + YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' + !print * , ' Writing Article BOXX3 ' , HRECFM + !------------------------------------------------------------------ + TZFD=>GETFD(YFNLFI) +! IF (ASSOCIATED(TZFD) .OR. .not.LLFIFM) THEN + IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + TZFMH%GRID = KGRID + TZFMH%COMLEN = LEN_TRIM(HCOMMENT) + TZFMH%COMMENT = HCOMMENT + IF (HBUDGET /= 'BUDGET') THEN + ! take the sub-section of PFIELD defined by the box + ZFIELDP=>PFIELD(KXOBOX:KXEBOX,KYOBOX:KYEBOX,:) + ELSE + ! take the field as a budget + ZFIELDP=>PFIELD + END IF +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP) +#endif + ELSE ! multiprocessor execution + IF (ISP == TZFD%OWNER) THEN + ! Allocate the box + ALLOCATE(ZFIELDP(KXEBOX-KXOBOX+1,KYEBOX-KYOBOX+1,SIZE(PFIELD,3))) + GALLOC = .TRUE. + ELSE + ALLOCATE(ZFIELDP(0,0,0)) + GALLOC = .TRUE. + END IF + ! + CALL GATHER_XYFIELD(PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM,& + & KXOBOX,KXEBOX,KYOBOX,KYEBOX,HBUDGET) + ! + IF (ISP == TZFD%OWNER) THEN + TZFMH%GRID = KGRID + TZFMH%COMLEN = LEN_TRIM(HCOMMENT) + TZFMH%COMMENT = HCOMMENT +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + & ,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + & ,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP) +#endif + 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("FMWRITBOXX3_ll",HFILEM,HFIPRI,HRECFM,'XY',KGRID,LEN(HCOMMENT),IRESP) + END IF + IF (GALLOC) DEALLOCATE(ZFIELDP) + KRESP = IRESP + END SUBROUTINE FMWRITBOXX3_ll + + SUBROUTINE FMWRITBOXX4_ll(HFILEM,HRECFM,HFIPRI,HBUDGET,PFIELD,KGRID,& + HCOMMENT,KXOBOX,KXEBOX,KYOBOX,KYEBOX,KRESP) + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT + USE MODD_FM + USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL + USE MODE_GATHER_ll + ! +!!!! MOD SB +#ifdef MNH_NCWRIT + USE MODD_NCOUT + USE MODE_UTIL +#endif +!!!! MOD SB + ! + !* 0.1 Declarations of arguments + ! + CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name + CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to write + CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages + CHARACTER(LEN=*), INTENT(IN) ::HBUDGET ! 'BUDGET' (budget) or 'OTHER' (MesoNH field) + REAL,DIMENSION(:,:,:,:),TARGET,INTENT(IN) ::PFIELD ! array containing the data field + INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) + CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT ! comment string + INTEGER, INTENT(IN) ::KXOBOX ! + INTEGER, INTENT(IN) ::KXEBOX ! Global coordinates of the box + INTEGER, INTENT(IN) ::KYOBOX ! + INTEGER, INTENT(IN) ::KYEBOX ! + INTEGER, INTENT(OUT)::KRESP ! return-code + ! + !* 0.2 Declarations of local variables + ! + CHARACTER(LEN=JPFINL) :: YFNLFI + INTEGER :: IERR + TYPE(FD_ll), POINTER :: TZFD + INTEGER :: IRESP + REAL,DIMENSION(:,:,:,:),POINTER :: ZFIELDP + TYPE(FMHEADER) :: TZFMH + LOGICAL :: GALLOC + + ! + !* 1.1 THE NAME OF LFIFM + ! + IRESP = 0 + GALLOC = .FALSE. + YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' + !print * , ' Writing Article BOXX4 ' , HRECFM + !------------------------------------------------------------------ + TZFD=>GETFD(YFNLFI) +! IF (ASSOCIATED(TZFD) .OR. .not.LLFIFM) THEN + IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + TZFMH%GRID = KGRID + TZFMH%COMLEN = LEN_TRIM(HCOMMENT) + TZFMH%COMMENT = HCOMMENT + IF (HBUDGET /= 'BUDGET') THEN + ! take the sub-section of PFIELD defined by the box + ZFIELDP=>PFIELD(KXOBOX:KXEBOX,KYOBOX:KYEBOX,:,:) + ELSE + ! take the field as a budget + ZFIELDP=>PFIELD + END IF +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP) +#endif + ELSE ! multiprocessor execution + IF (ISP == TZFD%OWNER) THEN + ! Allocate the box + ALLOCATE(ZFIELDP(KXEBOX-KXOBOX+1,KYEBOX-KYOBOX+1,SIZE(PFIELD,3),SIZE(PFIELD,4))) + GALLOC = .TRUE. + ELSE + ALLOCATE(ZFIELDP(0,0,0,0)) + GALLOC = .TRUE. + END IF + ! + CALL GATHER_XYFIELD(PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM,& + & KXOBOX,KXEBOX,KYOBOX,KYEBOX,HBUDGET) + ! + IF (ISP == TZFD%OWNER) THEN + TZFMH%GRID = KGRID + TZFMH%COMLEN = LEN_TRIM(HCOMMENT) + TZFMH%COMMENT = HCOMMENT +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + & ,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + & ,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP) +#endif + 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("FMWRITBOXX4_ll",HFILEM,HFIPRI,HRECFM,'XY',KGRID,LEN(HCOMMENT),IRESP) + END IF + IF (GALLOC) DEALLOCATE(ZFIELDP) + KRESP = IRESP + END SUBROUTINE FMWRITBOXX4_ll + + SUBROUTINE FMWRITBOXX5_ll(HFILEM,HRECFM,HFIPRI,HBUDGET,PFIELD,KGRID,& + HCOMMENT,KXOBOX,KXEBOX,KYOBOX,KYEBOX,KRESP) + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT + USE MODD_FM + USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL + USE MODE_GATHER_ll + ! +!!!! MOD SB +#ifdef MNH_NCWRIT + USE MODD_NCOUT + USE MODE_UTIL +#endif +!!!! MOD SB + ! + !* 0.1 Declarations of arguments + ! + CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name + CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to write + CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages + CHARACTER(LEN=*), INTENT(IN) ::HBUDGET ! 'BUDGET' (budget) or 'OTHER' (MesoNH field) + REAL,DIMENSION(:,:,:,:,:),TARGET,INTENT(IN) ::PFIELD ! array containing the data field + INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) + CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT ! comment string + INTEGER, INTENT(IN) ::KXOBOX ! + INTEGER, INTENT(IN) ::KXEBOX ! Global coordinates of the box + INTEGER, INTENT(IN) ::KYOBOX ! + INTEGER, INTENT(IN) ::KYEBOX ! + INTEGER, INTENT(OUT)::KRESP ! return-code + ! + !* 0.2 Declarations of local variables + ! + CHARACTER(LEN=JPFINL) :: YFNLFI + INTEGER :: IERR + TYPE(FD_ll), POINTER :: TZFD + INTEGER :: IRESP + REAL,DIMENSION(:,:,:,:,:),POINTER :: ZFIELDP + TYPE(FMHEADER) :: TZFMH + LOGICAL :: GALLOC + + ! + !* 1.1 THE NAME OF LFIFM + ! + IRESP = 0 + GALLOC = .FALSE. + YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' + !print * , ' Writing Article BOXX5 ' , HRECFM + !------------------------------------------------------------------ + TZFD=>GETFD(YFNLFI) +! IF (ASSOCIATED(TZFD) .OR. .not.LLFIFM) THEN + IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + TZFMH%GRID = KGRID + TZFMH%COMLEN = LEN_TRIM(HCOMMENT) + TZFMH%COMMENT = HCOMMENT + IF (HBUDGET /= 'BUDGET') THEN + ! take the sub-section of PFIELD defined by the box + ZFIELDP=>PFIELD(KXOBOX:KXEBOX,KYOBOX:KYEBOX,:,:,:) + ELSE + ! take the field as a budget + ZFIELDP=>PFIELD + END IF +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP) +#endif + ELSE ! multiprocessor execution + IF (ISP == TZFD%OWNER) THEN + ! Allocate the box + ALLOCATE(ZFIELDP(KXEBOX-KXOBOX+1,KYEBOX-KYOBOX+1,SIZE(PFIELD,3),& + & SIZE(PFIELD,4),SIZE(PFIELD,5))) + GALLOC = .TRUE. + ELSE + ALLOCATE(ZFIELDP(0,0,0,0,0)) + GALLOC = .TRUE. + END IF + ! + CALL GATHER_XYFIELD(PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM,& + & KXOBOX,KXEBOX,KYOBOX,KYEBOX,HBUDGET) + ! + IF (ISP == TZFD%OWNER) THEN + TZFMH%GRID = KGRID + TZFMH%COMLEN = LEN_TRIM(HCOMMENT) + TZFMH%COMMENT = HCOMMENT +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + & ,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + & ,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP) +#endif + 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("FMWRITBOXX5_ll",HFILEM,HFIPRI,HRECFM,'XY',KGRID,LEN(HCOMMENT),IRESP) + END IF + IF (GALLOC) DEALLOCATE(ZFIELDP) + KRESP = IRESP + END SUBROUTINE FMWRITBOXX5_ll + + SUBROUTINE FMWRITBOXX6_ll(HFILEM,HRECFM,HFIPRI,HBUDGET,PFIELD,KGRID,& + HCOMMENT,KXOBOX,KXEBOX,KYOBOX,KYEBOX,KRESP) + USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT + USE MODD_FM + USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL + USE MODE_GATHER_ll + ! +!!!! MOD SB +#ifdef MNH_NCWRIT + USE MODD_NCOUT + USE MODE_UTIL +#endif +!!!! MOD SB + ! + !* 0.1 Declarations of arguments + ! + CHARACTER(LEN=*), INTENT(IN) ::HFILEM ! FM-file name + CHARACTER(LEN=*), INTENT(IN) ::HRECFM ! name of the article to write + CHARACTER(LEN=*), INTENT(IN) ::HFIPRI ! output file for error messages + CHARACTER(LEN=*), INTENT(IN) ::HBUDGET ! 'BUDGET' (budget) or 'OTHER' (MesoNH field) + REAL,DIMENSION(:,:,:,:,:,:),TARGET,INTENT(IN) ::PFIELD ! array containing the data field + INTEGER, INTENT(IN) ::KGRID ! C-grid indicator (u,v,w,T) + CHARACTER(LEN=*), INTENT(IN) ::HCOMMENT ! comment string + INTEGER, INTENT(IN) ::KXOBOX ! + INTEGER, INTENT(IN) ::KXEBOX ! Global coordinates of the box + INTEGER, INTENT(IN) ::KYOBOX ! + INTEGER, INTENT(IN) ::KYEBOX ! + INTEGER, INTENT(OUT)::KRESP ! return-code + ! + !* 0.2 Declarations of local variables + ! + CHARACTER(LEN=JPFINL) :: YFNLFI + INTEGER :: IERR + TYPE(FD_ll), POINTER :: TZFD + INTEGER :: IRESP + REAL,DIMENSION(:,:,:,:,:,:),POINTER :: ZFIELDP + TYPE(FMHEADER) :: TZFMH + LOGICAL :: GALLOC + + ! + !* 1.1 THE NAME OF LFIFM + ! + IRESP = 0 + GALLOC = .FALSE. + YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi' + !print * , ' Writing Article BOXX6 ' , HRECFM + !------------------------------------------------------------------ + TZFD=>GETFD(YFNLFI) +! IF (ASSOCIATED(TZFD) .OR. .not.LLFIFM) THEN + IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + TZFMH%GRID = KGRID + TZFMH%COMLEN = LEN_TRIM(HCOMMENT) + TZFMH%COMMENT = HCOMMENT + IF (HBUDGET /= 'BUDGET') THEN + ! take the sub-section of PFIELD defined by the box + ZFIELDP=>PFIELD(KXOBOX:KXEBOX,KYOBOX:KYEBOX,:,:,:,:) + ELSE + ! take the field as a budget + ZFIELDP=>PFIELD + END IF +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP) +#endif + ELSE ! multiprocessor execution + IF (ISP == TZFD%OWNER) THEN + ! Allocate the box + ALLOCATE(ZFIELDP(KXEBOX-KXOBOX+1,KYEBOX-KYOBOX+1,SIZE(PFIELD,3),& + & SIZE(PFIELD,4),SIZE(PFIELD,5),SIZE(PFIELD,6))) + GALLOC = .TRUE. + ELSE + ALLOCATE(ZFIELDP(0,0,0,0,0,0)) + GALLOC = .TRUE. + END IF + ! + CALL GATHER_XYFIELD(PFIELD,ZFIELDP,TZFD%OWNER,TZFD%COMM,& + & KXOBOX,KXEBOX,KYOBOX,KYEBOX,HBUDGET) + ! + IF (ISP == TZFD%OWNER) THEN + TZFMH%GRID = KGRID + TZFMH%COMLEN = LEN_TRIM(HCOMMENT) + TZFMH%COMMENT = HCOMMENT +#ifdef MNH_NCWRIT + IF ( DEF_NC .AND. LLFIFM ) THEN + CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + & ,IRESP) + END IF +#else + IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH& + & ,IRESP) + IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP) +#endif + 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("FMWRITBOXX6_ll",HFILEM,HFIPRI,HRECFM,'XY',KGRID,LEN(HCOMMENT),IRESP) + END IF + IF (GALLOC) DEALLOCATE(ZFIELDP) + KRESP = IRESP + END SUBROUTINE FMWRITBOXX6_ll + +END MODULE MODE_FMWRIT + +