From 6806bd4399c18338924420529921482aa8bffa0b Mon Sep 17 00:00:00 2001 From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr> Date: Thu, 18 Jan 2018 16:30:31 +0100 Subject: [PATCH] Philippe 18/01/2018: IO: modify FILLVDIMS to choose right coordinate variables for fields --- src/LIB/SURCOUCHE/src/modd_netcdf.f90 | 11 ++- src/LIB/SURCOUCHE/src/mode_netcdf.f90 | 124 ++++++++++++++------------ 2 files changed, 75 insertions(+), 60 deletions(-) diff --git a/src/LIB/SURCOUCHE/src/modd_netcdf.f90 b/src/LIB/SURCOUCHE/src/modd_netcdf.f90 index 0eb3ac71a..688797691 100644 --- a/src/LIB/SURCOUCHE/src/modd_netcdf.f90 +++ b/src/LIB/SURCOUCHE/src/modd_netcdf.f90 @@ -18,10 +18,13 @@ TYPE IOCDF END TYPE IOCDF TYPE DIMCDF - CHARACTER(LEN=8) :: NAME - INTEGER(KIND=IDCDF_KIND) :: LEN - INTEGER(KIND=IDCDF_KIND) :: ID - TYPE(DIMCDF), POINTER :: NEXT + CHARACTER(LEN=8) :: NAME = '' + INTEGER(KIND=IDCDF_KIND) :: LEN = 0 + INTEGER(KIND=IDCDF_KIND) :: ID = -1 + TYPE(DIMCDF), POINTER :: NEXT => NULL() END TYPE DIMCDF +TYPE(DIMCDF),DIMENSION(3,0:4) :: NCOORDID !X,Y,Z coordinates for the 4 Arakawa points + !0 2nd-dimension is to treat NGRID=0 case without crash + END MODULE MODD_NETCDF diff --git a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 b/src/LIB/SURCOUCHE/src/mode_netcdf.f90 index 9609697ee..b11e4b0a2 100644 --- a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 +++ b/src/LIB/SURCOUCHE/src/mode_netcdf.f90 @@ -140,6 +140,24 @@ IF (.NOT. ASSOCIATED(PIOCDF%DIM_LEVEL_W)) PIOCDF%DIM_LEVEL_W => GETDIMCDF(TPFILE IF (.NOT. ASSOCIATED(PIOCDF%DIMTIME)) PIOCDF%DIMTIME => GETDIMCDF(TPFILE, NF90_UNLIMITED, 'time') +! Store X,Y,Z coordinates for the 4 Arakawa points +! Mass point +NCOORDID(1,1) = PIOCDF%DIM_NI +NCOORDID(2,1) = PIOCDF%DIM_NJ +NCOORDID(3,1) = PIOCDF%DIM_LEVEL +! u point +NCOORDID(1,2) = PIOCDF%DIM_NI_U +NCOORDID(2,2) = PIOCDF%DIM_NJ_U +NCOORDID(3,2) = PIOCDF%DIM_LEVEL +! v point +NCOORDID(1,3) = PIOCDF%DIM_NI_V +NCOORDID(2,3) = PIOCDF%DIM_NJ_V +NCOORDID(3,3) = PIOCDF%DIM_LEVEL +! w point +NCOORDID(1,4) = PIOCDF%DIM_NI +NCOORDID(2,4) = PIOCDF%DIM_NJ +NCOORDID(3,4) = PIOCDF%DIM_LEVEL_W + END SUBROUTINE IO_SET_KNOWNDIMS_NC4 @@ -597,66 +615,60 @@ TYPE(TFILEDATA), INTENT(IN) :: TPFILE TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD INTEGER(KIND=IDCDF_KIND),DIMENSION(:),INTENT(IN) :: KSHAPE INTEGER(KIND=IDCDF_KIND),DIMENSION(:),INTENT(OUT) :: KVDIMS - -INTEGER :: II +! +INTEGER :: IGRID +INTEGER :: JI +CHARACTER(LEN=32) :: YINT CHARACTER(LEN=2) :: YDIR TYPE(DIMCDF), POINTER :: PTDIM -TYPE(IOCDF), POINTER :: PIOCDF - -CALL PRINT_MSG(NVERB_DEBUG,'IO','FILLVDIMS','called') - +! +CALL PRINT_MSG(NVERB_DEBUG,'IO','FILLVDIMS','called for '//TRIM(TPFIELD%CMNHNAME)) +! IF (SIZE(KSHAPE) < 1) CALL PRINT_MSG(NVERB_FATAL,'IO','FILLVDIMS','empty KSHAPE') - -YDIR = TPFIELD%CDIR -PIOCDF => TPFILE%TNCDIMS - -DO II=1, SIZE(KSHAPE) - - IF (II == 1) THEN - IF (YDIR == 'XX' .OR. YDIR == 'XY') THEN - IF (KSHAPE(II) == PIOCDF%DIM_NI%LEN) THEN - PTDIM => PIOCDF%DIM_NI - ELSE - PTDIM => GETDIMCDF(TPFILE, KSHAPE(II)) - END IF - ELSE IF (YDIR == 'YY') THEN - IF (KSHAPE(II) == PIOCDF%DIM_NJ%LEN) THEN - PTDIM => PIOCDF%DIM_NJ - ELSE - PTDIM => GETDIMCDF(TPFILE, KSHAPE(II)) - END IF - ELSE - PTDIM => GETDIMCDF(TPFILE, KSHAPE(II)) - KVDIMS(II) = PTDIM%ID - END IF - ELSE IF (II == 2) THEN - IF (YDIR == 'XY') THEN - IF (KSHAPE(II) == PIOCDF%DIM_NJ%LEN) THEN - PTDIM => PIOCDF%DIM_NJ - ELSE - PTDIM => GETDIMCDF(TPFILE, KSHAPE(II)) - END IF - ELSE - PTDIM => GETDIMCDF(TPFILE, KSHAPE(II)) - END IF - ELSE IF (II == 3) THEN - IF (YDIR == 'XY') THEN - IF (KSHAPE(II) == PIOCDF%DIM_LEVEL%LEN) THEN - PTDIM => PIOCDF%DIM_LEVEL - ELSE - PTDIM => GETDIMCDF(TPFILE, KSHAPE(II)) - END IF - ELSE - PTDIM => GETDIMCDF(TPFILE, KSHAPE(II)) - END IF - ELSE - PTDIM => GETDIMCDF(TPFILE, KSHAPE(II)) - END IF - - KVDIMS(II) = PTDIM%ID - +! +IGRID = TPFIELD%NGRID +YDIR = TPFIELD%CDIR +! +IF(SIZE(KSHAPE)/=TPFIELD%NDIMS) THEN + WRITE(YINT,'( I0,"/",I0 )') SIZE(KSHAPE),TPFIELD%NDIMS + CALL PRINT_MSG(NVERB_FATAL,'IO','FILLVDIMS','SIZE(KSHAPE)/=TPFIELD%NDIMS ('//TRIM(YINT)//') for field '//TRIM(TPFIELD%CMNHNAME)) +END IF +! +IF(IGRID<0 .OR. IGRID>4) THEN + WRITE(YINT,'( I0 )') IGRID + CALL PRINT_MSG(NVERB_FATAL,'IO','FILLVDIMS','invalid NGRID ('//TRIM(YINT)//') for field '//TRIM(TPFIELD%CMNHNAME)) +END IF +! +IF(IGRID==0 .AND. YDIR/='--' .AND. YDIR/='' ) THEN + CALL PRINT_MSG(NVERB_FATAL,'IO','FILLVDIMS','invalid YDIR ('//TRIM(YDIR)//') with NGRID=0 for field '//TRIM(TPFIELD%CMNHNAME)) +END IF +! +DO JI=1,TPFIELD%NDIMS + IF (JI == 1) THEN + IF ( (YDIR == 'XX' .OR. YDIR == 'XY') .AND. KSHAPE(1)==NCOORDID(1,IGRID)%LEN) THEN + KVDIMS(1) = NCOORDID(1,IGRID)%ID + ELSE IF ( YDIR == 'YY' .AND. KSHAPE(1)==NCOORDID(1,IGRID)%LEN) THEN + KVDIMS(1) = NCOORDID(2,IGRID)%ID + ELSE + PTDIM => GETDIMCDF(TPFILE, KSHAPE(1)); KVDIMS(1) = PTDIM%ID + END IF + ELSE IF (JI == 2) THEN + IF ( YDIR == 'XY' .AND. KSHAPE(2)==NCOORDID(2,IGRID)%LEN) THEN + KVDIMS(2) = NCOORDID(2,IGRID)%ID + ELSE + PTDIM => GETDIMCDF(TPFILE, KSHAPE(2)); KVDIMS(2) = PTDIM%ID + END IF + ELSE IF (JI == 3) THEN + IF ( YDIR == 'XY' .AND. KSHAPE(3)==NCOORDID(3,IGRID)%LEN) THEN + KVDIMS(3) = NCOORDID(3,IGRID)%ID + ELSE + PTDIM => GETDIMCDF(TPFILE, KSHAPE(3)); KVDIMS(3) = PTDIM%ID + END IF + ELSE + PTDIM => GETDIMCDF(TPFILE, KSHAPE(JI)); KVDIMS(JI) = PTDIM%ID + END IF END DO - +! END SUBROUTINE FILLVDIMS -- GitLab