From d9fe06325b7d1ebb412b69351ac1d665529a4a5d Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Tue, 21 Feb 2017 10:34:59 +0100 Subject: [PATCH] Philippe 21/02/2017: IO: added support for LB fields in TFIELDLIST * added IO_WRITE_FIELD_LB interface * added IO_WRITE_FIELD_BYNAME_LB and IO_WRITE_FIELD_BYFIELD_LB subroutines to IO_WRITE_FIELD_LB interface --- src/LIB/SURCOUCHE/src/fmwrit_ll.f90 | 178 ++++++++++++++++++++++- src/LIB/SURCOUCHE/src/io_write_field.f90 | 50 ++++++- src/LIB/SURCOUCHE/src/mode_field.f90 | 2 + 3 files changed, 221 insertions(+), 9 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 index 811ac25c6..4490bdcfb 100644 --- a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 +++ b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 @@ -193,6 +193,10 @@ MODULE MODE_FMWRIT IO_WRITE_FIELD_BYFIELD_T0 END INTERFACE + INTERFACE IO_WRITE_FIELD_LB + MODULE PROCEDURE IO_WRITE_FIELD_BYNAME_LB, IO_WRITE_FIELD_BYFIELD_LB + END INTERFACE + INTERFACE FMWRIT MODULE PROCEDURE FMWRITX0_ll,FMWRITX1_ll,FMWRITX2_ll,FMWRITX3_ll,& & FMWRITX4_ll,FMWRITX5_ll,FMWRITX6_ll,& @@ -210,7 +214,7 @@ MODULE MODE_FMWRIT & 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 - PUBLIC IO_WRITE_FIELD + PUBLIC IO_WRITE_FIELD, IO_WRITE_FIELD_LB !INCLUDE 'mpif.h' @@ -3275,6 +3279,178 @@ CONTAINS KRESP = IRESP END SUBROUTINE FMWRIT_LB + SUBROUTINE IO_WRITE_FIELD_BYNAME_LB(TPFILE,HNAME,HFIPRI,KL3D,KRESP,PLB) + ! + USE MODD_IO_ll, ONLY : TFILEDATA + ! + !* 0.1 Declarations of arguments + ! + TYPE(TFILEDATA), INTENT(IN) :: TPFILE + CHARACTER(LEN=*), INTENT(IN) :: HNAME ! name of the field to write + CHARACTER(LEN=*), INTENT(IN) :: HFIPRI ! output file for error messages + INTEGER, INTENT(IN) :: KL3D ! size of the LB array in FM + INTEGER, INTENT(OUT):: KRESP ! return-code + REAL,DIMENSION(:,:,:), INTENT(IN) :: PLB ! array containing the LB field + ! + !* 0.2 Declarations of local variables + ! + INTEGER :: ID ! Index of the field + ! + CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_BYNAME_LB','writing '//TRIM(HNAME)) + ! + CALL FIND_FIELD_ID_FROM_MNHNAME(HNAME,ID,KRESP) + ! + IF(KRESP==0) CALL IO_WRITE_FIELD_LB(TPFILE,TFIELDLIST(ID),HFIPRI,KL3D,KRESP,PLB) + ! + END SUBROUTINE IO_WRITE_FIELD_BYNAME_LB + + SUBROUTINE IO_WRITE_FIELD_BYFIELD_LB(TPFILE,TPFIELD,HFIPRI,KL3D,KRESP,PLB) + ! + USE MODD_IO_ll + 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 + ! + USE MODD_VAR_ll, ONLY : MNH_STATUSES_IGNORE + ! + !* 0.1 Declarations of arguments + ! + TYPE(TFILEDATA), INTENT(IN) :: TPFILE + TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD + CHARACTER(LEN=*), INTENT(IN) :: HFIPRI ! file for prints in FM + INTEGER, INTENT(IN) :: KL3D ! size of the LB array in FM + INTEGER, INTENT(OUT) :: KRESP ! return-code + REAL,DIMENSION(:,:,:),TARGET,INTENT(IN) :: PLB ! array containing the LB field + ! + !* 0.2 Declarations of local variables + ! + CHARACTER(LEN=28) :: YFILEM ! FM-file name + CHARACTER(LEN=NMNHNAMELGTMAX) :: YRECFM ! name of the article to write + CHARACTER(LEN=4) :: YLBTYPE ! 'LBX','LBXU','LBY' or 'LBYV' + CHARACTER(LEN=JPFINL) :: YFNLFI + INTEGER :: IRIM ! size of the LB area + INTEGER :: IERR + TYPE(FD_ll), POINTER :: TZFD + INTEGER :: IRESP + REAL,DIMENSION(:,:,:),ALLOCATABLE,TARGET :: Z3D + REAL,DIMENSION(:,:,:), POINTER :: TX3DP + 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 + ! + YFILEM = TPFILE%CNAME + YRECFM = TPFIELD%CMNHNAME + YLBTYPE = TPFIELD%CLBTYPE + ! + CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_BYFIELD_LB','writing '//TRIM(YRECFM)) + ! + IF (YLBTYPE/='LBX' .AND. YLBTYPE/='LBXU' .AND. YLBTYPE/='LBY' .AND. YLBTYPE/='LBYV') THEN + CALL PRINT_MSG(NVERB_ERROR,'IO','IO_WRITE_FIELD_BYFIELD_LB','unknown LBTYPE ('//YLBTYPE//')') + RETURN + END IF + ! + IF (TPFIELD%CDIR/='XY') THEN + CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_BYFIELD_LB','CDIR was not set to "XY" for '//TRIM(YRECFM)) + TPFIELD%CDIR='XY' + END IF + ! + !* 1.1 THE NAME OF LFIFM + ! + IRESP = 0 + YFNLFI=TRIM(ADJUSTL(YFILEM))//'.lfi' + ! + IRIM = (KL3D-2*JPHEXT)/2 + IF (KL3D /= 2*(IRIM+JPHEXT)) THEN + IRESP = -30 + GOTO 1000 + END IF + ! + TZFD=>GETFD(YFNLFI) + IF (ASSOCIATED(TZFD)) THEN + IF (GSMONOPROC) THEN ! sequential execution + IF (LPACK .AND. L2D) THEN + TX3DP=>PLB(:,JPHEXT+1:JPHEXT+1,:) + IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFIELD,TZFD%FLU,TX3DP,IRESP) + IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,TX3DP,IRESP) + ELSE + IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFIELD,TZFD%FLU,PLB,IRESP) + IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,PLB,IRESP) + END IF + ELSE + IF (ISP == TZFD%OWNER) THEN + ! I/O proc case + CALL GET_GLOBALDIMS_ll(IIMAX_ll,IJMAX_ll) + IF (YLBTYPE == 'LBX' .OR. YLBTYPE == 'LBXU') THEN + ALLOCATE(Z3D((IRIM+JPHEXT)*2,IJMAX_ll+2*JPHEXT,SIZE(PLB,3))) + ELSE ! YLBTYPE == 'LBY' .OR. YLBTYPE == 'LBYV' + ALLOCATE(Z3D(IIMAX_ll+2*JPHEXT,(IRIM+JPHEXT)*2,SIZE(PLB,3))) + END IF + DO JI = 1,ISNPROC + CALL GET_DISTRIB_LB(YLBTYPE,JI,'FM','WRITE',IRIM,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(YLBTYPE,JI,'LOC','WRITE',IRIM,IIB,IIE,IJB,IJE) + TX3DP = PLB(IIB:IIE,IJB:IJE,:) + END IF + END IF + END DO + IF (LPACK .AND. L2D) THEN + TX3DP=>Z3D(:,JPHEXT+1:JPHEXT+1,:) + ELSE + TX3DP=>Z3D + END IF + IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFIELD,TZFD%FLU,TX3DP,IRESP) + IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,TX3DP,IRESP) + ELSE + NB_REQ=0 + ALLOCATE(REQ_TAB(1)) + ALLOCATE(T_TX3DP(1)) + IKU = SIZE(PLB,3) + ! Other processors + CALL GET_DISTRIB_LB(YLBTYPE,ISP,'LOC','WRITE',IRIM,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("IO_WRITE_FIELD_BYFIELD_LB",YFILEM,HFIPRI,YRECFM,YLBTYPE,TPFIELD%NGRID,LEN(TPFIELD%CCOMMENT),IRESP) + END IF + ! + IF (ALLOCATED(Z3D)) DEALLOCATE(Z3D) + KRESP = IRESP + END SUBROUTINE IO_WRITE_FIELD_BYFIELD_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 diff --git a/src/LIB/SURCOUCHE/src/io_write_field.f90 b/src/LIB/SURCOUCHE/src/io_write_field.f90 index c6a87e78c..9d3cdd4a6 100644 --- a/src/LIB/SURCOUCHE/src/io_write_field.f90 +++ b/src/LIB/SURCOUCHE/src/io_write_field.f90 @@ -44,7 +44,11 @@ DO JI = 1,SIZE(TPOUTPUT%NFIELDLIST) PRINT *,'FATAL: IO_WRITE_FIELDLIST: TFIELD_C0D%DATA is not associated for ',TRIM(TFIELDLIST(IDX)%CMNHNAME) STOP END IF - CALL IO_WRITE_FIELD(TPOUTPUT%TFILE,TFIELDLIST(IDX),HFIPRI,IRESP,TFIELDLIST(IDX)%TFIELD_C0D(IMI)%DATA) + IF ( TFIELDLIST(IDX)%CLBTYPE == 'NONE' ) THEN + CALL IO_WRITE_FIELD(TPOUTPUT%TFILE,TFIELDLIST(IDX),HFIPRI,IRESP,TFIELDLIST(IDX)%TFIELD_C0D(IMI)%DATA) + ELSE + CALL PRINT_MSG(NVERB_ERROR,'IO','IO_WRITE_FIELDLIST','CLBTYPE/=NONE not allowed for 0D character fields') + END IF ! !0D logical ! @@ -57,7 +61,11 @@ DO JI = 1,SIZE(TPOUTPUT%NFIELDLIST) PRINT *,'FATAL: IO_WRITE_FIELDLIST: TFIELD_L0D%DATA is not associated for ',TRIM(TFIELDLIST(IDX)%CMNHNAME) STOP END IF - CALL IO_WRITE_FIELD(TPOUTPUT%TFILE,TFIELDLIST(IDX),HFIPRI,IRESP,TFIELDLIST(IDX)%TFIELD_L0D(IMI)%DATA) + IF ( TFIELDLIST(IDX)%CLBTYPE == 'NONE' ) THEN + CALL IO_WRITE_FIELD(TPOUTPUT%TFILE,TFIELDLIST(IDX),HFIPRI,IRESP,TFIELDLIST(IDX)%TFIELD_L0D(IMI)%DATA) + ELSE + CALL PRINT_MSG(NVERB_ERROR,'IO','IO_WRITE_FIELDLIST','CLBTYPE/=NONE not allowed for 0D logical fields') + END IF ! !0D real ! @@ -70,7 +78,11 @@ DO JI = 1,SIZE(TPOUTPUT%NFIELDLIST) PRINT *,'FATAL: IO_WRITE_FIELDLIST: TFIELD_X0D%DATA is not associated for ',TRIM(TFIELDLIST(IDX)%CMNHNAME) STOP END IF - CALL IO_WRITE_FIELD(TPOUTPUT%TFILE,TFIELDLIST(IDX),HFIPRI,IRESP,TFIELDLIST(IDX)%TFIELD_X0D(IMI)%DATA) + IF ( TFIELDLIST(IDX)%CLBTYPE == 'NONE' ) THEN + CALL IO_WRITE_FIELD(TPOUTPUT%TFILE,TFIELDLIST(IDX),HFIPRI,IRESP,TFIELDLIST(IDX)%TFIELD_X0D(IMI)%DATA) + ELSE + CALL PRINT_MSG(NVERB_ERROR,'IO','IO_WRITE_FIELDLIST','CLBTYPE/=NONE not allowed for 0D logical fields') + END IF ! !0D date/time ! @@ -83,7 +95,11 @@ DO JI = 1,SIZE(TPOUTPUT%NFIELDLIST) PRINT *,'FATAL: IO_WRITE_FIELDLIST: TFIELD_T0D%DATA is not associated for ',TRIM(TFIELDLIST(IDX)%CMNHNAME) STOP END IF - CALL IO_WRITE_FIELD(TPOUTPUT%TFILE,TFIELDLIST(IDX),HFIPRI,IRESP,TFIELDLIST(IDX)%TFIELD_T0D(IMI)%DATA) + IF ( TFIELDLIST(IDX)%CLBTYPE == 'NONE' ) THEN + CALL IO_WRITE_FIELD(TPOUTPUT%TFILE,TFIELDLIST(IDX),HFIPRI,IRESP,TFIELDLIST(IDX)%TFIELD_T0D(IMI)%DATA) + ELSE + CALL PRINT_MSG(NVERB_ERROR,'IO','IO_WRITE_FIELDLIST','CLBTYPE/=NONE not allowed for 0D date/time fields') + END IF ! !0D other types ! @@ -108,7 +124,11 @@ DO JI = 1,SIZE(TPOUTPUT%NFIELDLIST) PRINT *,'FATAL: IO_WRITE_FIELDLIST: TFIELD_X1D%DATA is not associated for ',TRIM(TFIELDLIST(IDX)%CMNHNAME) STOP END IF - CALL IO_WRITE_FIELD(TPOUTPUT%TFILE,TFIELDLIST(IDX),HFIPRI,IRESP,TFIELDLIST(IDX)%TFIELD_X1D(IMI)%DATA) + IF ( TFIELDLIST(IDX)%CLBTYPE == 'NONE' ) THEN + CALL IO_WRITE_FIELD(TPOUTPUT%TFILE,TFIELDLIST(IDX),HFIPRI,IRESP,TFIELDLIST(IDX)%TFIELD_X1D(IMI)%DATA) + ELSE + CALL PRINT_MSG(NVERB_ERROR,'IO','IO_WRITE_FIELDLIST','CLBTYPE/=NONE not allowed for 1D real fields') + END IF ! !1D other types ! @@ -133,7 +153,11 @@ DO JI = 1,SIZE(TPOUTPUT%NFIELDLIST) PRINT *,'FATAL: IO_WRITE_FIELDLIST: TFIELD_X2D%DATA is not associated for ',TRIM(TFIELDLIST(IDX)%CMNHNAME) STOP END IF - CALL IO_WRITE_FIELD(TPOUTPUT%TFILE,TFIELDLIST(IDX),HFIPRI,IRESP,TFIELDLIST(IDX)%TFIELD_X2D(IMI)%DATA) + IF ( TFIELDLIST(IDX)%CLBTYPE == 'NONE' ) THEN + CALL IO_WRITE_FIELD(TPOUTPUT%TFILE,TFIELDLIST(IDX),HFIPRI,IRESP,TFIELDLIST(IDX)%TFIELD_X2D(IMI)%DATA) + ELSE + CALL PRINT_MSG(NVERB_ERROR,'IO','IO_WRITE_FIELDLIST','CLBTYPE/=NONE not allowed for 2D real fields') + END IF ! !2D integer ! @@ -146,7 +170,11 @@ DO JI = 1,SIZE(TPOUTPUT%NFIELDLIST) PRINT *,'FATAL: IO_WRITE_FIELDLIST: TFIELD_N2D%DATA is not associated for ',TRIM(TFIELDLIST(IDX)%CMNHNAME) STOP END IF - CALL IO_WRITE_FIELD(TPOUTPUT%TFILE,TFIELDLIST(IDX),HFIPRI,IRESP,TFIELDLIST(IDX)%TFIELD_N2D(IMI)%DATA) + IF ( TFIELDLIST(IDX)%CLBTYPE == 'NONE' ) THEN + CALL IO_WRITE_FIELD(TPOUTPUT%TFILE,TFIELDLIST(IDX),HFIPRI,IRESP,TFIELDLIST(IDX)%TFIELD_N2D(IMI)%DATA) + ELSE + CALL PRINT_MSG(NVERB_ERROR,'IO','IO_WRITE_FIELDLIST','CLBTYPE/=NONE not allowed for 2D integer fields') + END IF ! !2D other types ! @@ -171,7 +199,13 @@ DO JI = 1,SIZE(TPOUTPUT%NFIELDLIST) PRINT *,'FATAL: IO_WRITE_FIELDLIST: TFIELD_X3D%DATA is not associated for ',TRIM(TFIELDLIST(IDX)%CMNHNAME) STOP END IF - CALL IO_WRITE_FIELD(TPOUTPUT%TFILE,TFIELDLIST(IDX),HFIPRI,IRESP,TFIELDLIST(IDX)%TFIELD_X3D(IMI)%DATA) + IF ( TFIELDLIST(IDX)%CLBTYPE == 'NONE' ) THEN + CALL IO_WRITE_FIELD(TPOUTPUT%TFILE,TFIELDLIST(IDX),HFIPRI,IRESP,TFIELDLIST(IDX)%TFIELD_X3D(IMI)%DATA) + ELSE + CALL PRINT_MSG(NVERB_ERROR,'IO','IO_WRITE_FIELDLIST','CLBTYPE/=NONE not (yet) allowed for 3D real fields') + !PW: TODO?: add missing field in TFIELDLIST? + !CALL IO_WRITE_FIELD_LB(TPOUTPUT%TFILE,TFIELDLIST(IDX),HFIPRI,***,IRESP,TFIELDLIST(IDX)%TFIELD_X3D(IMI)%DATA) + END IF ! !3D other types ! diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90 index 5ae0f6218..cf54dacdd 100644 --- a/src/LIB/SURCOUCHE/src/mode_field.f90 +++ b/src/LIB/SURCOUCHE/src/mode_field.f90 @@ -59,6 +59,7 @@ TYPE TFIELDDATA CHARACTER(LEN=32) :: CLONGNAME = '' !Long name (CF convention) CHARACTER(LEN=40) :: CUNITS = '' !Canonical units (CF convention) CHARACTER(LEN=2) :: CDIR = '' !Type of the data field (XX,XY,--...) + CHARACTER(LEN=4) :: CLBTYPE = 'NONE' !Type of the lateral boundary (LBX,LBY,LBXU,LBYV) CHARACTER(LEN=100) :: CCOMMENT = '' !Comment (for MesoNH, non CF convention) INTEGER :: NGRID = -1 !Localization on the model grid INTEGER :: NTYPE = TYPEUNDEF !Datatype @@ -1518,6 +1519,7 @@ TFIELDLIST(IDX)%CSTDNAME = '' TFIELDLIST(IDX)%CLONGNAME = 'MesoNH: ' TFIELDLIST(IDX)%CUNITS = '' TFIELDLIST(IDX)%CDIR = '' +TFIELDLIST(IDX)%CLBTYPE = '' TFIELDLIST(IDX)%CCOMMENT = '' TFIELDLIST(IDX)%NGRID = TFIELDLIST(IDX)%NTYPE = -- GitLab