diff --git a/src/LIB/SURCOUCHE/src/modd_netcdf.f90 b/src/LIB/SURCOUCHE/src/modd_netcdf.f90 index 81850b10faaceebba13ec3ef2abf929b34949398..58fa97adf15f51e86fc405fbcc6554b1753bd423 100644 --- a/src/LIB/SURCOUCHE/src/modd_netcdf.f90 +++ b/src/LIB/SURCOUCHE/src/modd_netcdf.f90 @@ -4,7 +4,6 @@ IMPLICIT NONE INTEGER,PARAMETER :: IDCDF_KIND = SELECTED_INT_KIND(8) TYPE IOCDF - INTEGER(KIND=IDCDF_KIND) :: NCID TYPE(DIMCDF), POINTER :: DIMX TYPE(DIMCDF), POINTER :: DIMY TYPE(DIMCDF), POINTER :: DIMZ diff --git a/src/LIB/SURCOUCHE/src/mode_fm.f90 b/src/LIB/SURCOUCHE/src/mode_fm.f90 index 2a7d97bd0dea403d82a635b222a5e6d2f841aeb8..ff77129ff1868a64a8939d01f755899435b16025 100644 --- a/src/LIB/SURCOUCHE/src/mode_fm.f90 +++ b/src/LIB/SURCOUCHE/src/mode_fm.f90 @@ -331,7 +331,6 @@ IF (TPFILE%LMASTER) THEN PRINT *, 'Error in opening (FMOPEN_ll/NF90_OPEN) ', TRIM(YFILEM)//'.nc', ' : ', NF90_STRERROR(INCERR) STOP END IF - TPFILE%TNCDIMS%NCID = TPFILE%NNCID END IF IF (YACTION == 'WRITE') THEN @@ -344,7 +343,6 @@ IF (TPFILE%LMASTER) THEN PRINT *, 'Error in opening (FMOPEN_ll/NF90_CREATE) ', TRIM(YFILEM)//'.nc', ' : ', NF90_STRERROR(INCERR) STOP END IF - TPFILE%TNCDIMS%NCID = TPFILE%NNCID END IF END IF #endif diff --git a/src/LIB/SURCOUCHE/src/mode_io.f90 b/src/LIB/SURCOUCHE/src/mode_io.f90 index 8c2d65a50bde08bd1ef53d676c49e1fb0d2de77c..8cfa6aefb8b510f8749fb38376fb5e388e4224ba 100644 --- a/src/LIB/SURCOUCHE/src/mode_io.f90 +++ b/src/LIB/SURCOUCHE/src/mode_io.f90 @@ -645,7 +645,6 @@ CONTAINS TZSPLITFILE%TNCDIMS => NEWIOCDF() CALL PRINT_MSG(NVERB_DEBUG,'IO','OPEN_ll','NF90_OPEN(IO_ZSPLIT) for '//TRIM(TPFILE%CNAME)//CFILE//'.nc') IOSCDF = NF90_OPEN(TRIM(TPFILE%CNAME)//CFILE//".nc", NF90_NOWRITE, TZSPLITFILE%NNCID) - TZSPLITFILE%TNCDIMS%NCID = TZSPLITFILE%NNCID IF (IOSCDF /= NF90_NOERR) THEN PRINT *, 'Error in opening (NF90_OPEN) ', TRIM(TPFILE%CNAME)//CFILE//'.nc', ' : ', NF90_STRERROR(IOSCDF) STOP @@ -661,7 +660,6 @@ CONTAINS CALL PRINT_MSG(NVERB_DEBUG,'IO','OPEN_ll','NF90_CREATE(IO_ZSPLIT) for '//TRIM(TPFILE%CNAME)//CFILE//'.nc') IOSCDF = NF90_CREATE(TRIM(TPFILE%CNAME)//CFILE//".nc", & &IOR(NF90_CLOBBER,NF90_NETCDF4), TZSPLITFILE%NNCID) - TZSPLITFILE%TNCDIMS%NCID = TZSPLITFILE%NNCID IF (IOSCDF /= NF90_NOERR) THEN PRINT *, 'Error in opening (NF90_CREATE) ', TRIM(TPFILE%CNAME)//CFILE//'.nc', ' : ', NF90_STRERROR(IOSCDF) STOP diff --git a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 b/src/LIB/SURCOUCHE/src/mode_netcdf.f90 index 61b4ce68b6d76b6a268ff02cca88a0d209420d17..b7f2835b30bc1807e6ac0b5e03f716a5f9a9f913 100644 --- a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 +++ b/src/LIB/SURCOUCHE/src/mode_netcdf.f90 @@ -74,7 +74,6 @@ IF (IRESP > 0) THEN STOP END IF -TZIOCDF%NCID = -1 NULLIFY(TZIOCDF%DIMX) NULLIFY(TZIOCDF%DIMY) NULLIFY(TZIOCDF%DIMZ) @@ -255,8 +254,8 @@ ENDIF ! END SUBROUTINE IO_WRITE_FIELD_ATTR_NC4 -FUNCTION GETDIMCDF(PIOCDF, KLEN, HDIMNAME) -TYPE(IOCDF), POINTER :: PIOCDF +FUNCTION GETDIMCDF(TPFILE, KLEN, HDIMNAME) +TYPE(TFILEDATA), INTENT(IN) :: TPFILE INTEGER(KIND=IDCDF_KIND),INTENT(IN) :: KLEN CHARACTER(LEN=*), OPTIONAL :: HDIMNAME ! When provided don't search but ! simply create with name HDIMNAME @@ -268,6 +267,9 @@ CHARACTER(LEN=7) :: YSUFFIX CHARACTER(LEN=8) :: YDIMNAME CHARACTER(LEN=20) :: YLEN INTEGER(KIND=IDCDF_KIND) :: STATUS +TYPE(IOCDF), POINTER :: PIOCDF + +PIOCDF => TPFILE%TNCDIMS IF (KLEN < 1) THEN WRITE(YLEN,*) KLEN @@ -295,7 +297,7 @@ IF (.NOT. ASSOCIATED(TMP)) THEN ALLOCATE(TMP) TMP%NAME = YDIMNAME TMP%LEN = KLEN - STATUS = NF90_DEF_DIM(PIOCDF%NCID, TMP%NAME, KLEN, TMP%ID) + STATUS = NF90_DEF_DIM(TPFILE%NNCID, TMP%NAME, KLEN, TMP%ID) IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'GETDIMCDF[NF90_DEF_DIM]') NULLIFY(TMP%NEXT) TMP%NEXT => PIOCDF%DIMLIST @@ -306,8 +308,8 @@ GETDIMCDF => TMP END FUNCTION GETDIMCDF -FUNCTION GETSTRDIMID(PIOCDF, KLEN) -TYPE(IOCDF), POINTER :: PIOCDF +FUNCTION GETSTRDIMID(TPFILE,KLEN) +TYPE(TFILEDATA), INTENT(IN) :: TPFILE INTEGER(KIND=IDCDF_KIND),INTENT(IN) :: KLEN INTEGER(KIND=IDCDF_KIND) :: GETSTRDIMID @@ -323,7 +325,7 @@ IF (KLEN < 1) THEN END IF ! Search string dimension with KLEN length -TMP => PIOCDF%DIMSTR +TMP => TPFILE%TNCDIMS%DIMSTR DO WHILE(ASSOCIATED(TMP)) IF (TMP%LEN == KLEN) EXIT TMP=>TMP%NEXT @@ -336,73 +338,76 @@ IF (.NOT. ASSOCIATED(TMP)) THEN ALLOCATE(TMP) TMP%NAME = YDIMNAME TMP%LEN = KLEN - STATUS = NF90_DEF_DIM(PIOCDF%NCID, TMP%NAME, KLEN, TMP%ID) + STATUS = NF90_DEF_DIM(TPFILE%NNCID, TMP%NAME, KLEN, TMP%ID) IF (STATUS /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'GETSTRDIMID[NF90_DEF_DIM]') NULLIFY(TMP%NEXT) - TMP%NEXT => PIOCDF%DIMSTR - PIOCDF%DIMSTR => TMP + TMP%NEXT => TPFILE%TNCDIMS%DIMSTR + TPFILE%TNCDIMS%DIMSTR => TMP END IF GETSTRDIMID = TMP%ID END FUNCTION GETSTRDIMID -SUBROUTINE FILLVDIMS(PIOCDF, KSHAPE, HDIR, KVDIMS) -TYPE(IOCDF), POINTER :: PIOCDF +SUBROUTINE FILLVDIMS(TPFILE, KSHAPE, HDIR, KVDIMS) +TYPE(TFILEDATA), INTENT(IN) :: TPFILE INTEGER(KIND=IDCDF_KIND), DIMENSION(:), INTENT(IN) :: KSHAPE CHARACTER(LEN=*), INTENT(IN) :: HDIR INTEGER(KIND=IDCDF_KIND),DIMENSION(:), INTENT(OUT) :: KVDIMS INTEGER :: II TYPE(DIMCDF), POINTER :: PTDIM +TYPE(IOCDF), POINTER :: PIOCDF IF (SIZE(KSHAPE) < 1) CALL PRINT_MSG(NVERB_FATAL,'IO','FILLVDIMS','empty KSHAPE') +PIOCDF => TPFILE%TNCDIMS + DO II=1, SIZE(KSHAPE) IF (II == 1) THEN IF (HDIR == 'XX' .OR. HDIR == 'XY') THEN - IF (.NOT. ASSOCIATED(PIOCDF%DIMX)) PIOCDF%DIMX => GETDIMCDF(PIOCDF, KSHAPE(II), 'X') + IF (.NOT. ASSOCIATED(PIOCDF%DIMX)) PIOCDF%DIMX => GETDIMCDF(TPFILE, KSHAPE(II), 'X') IF (KSHAPE(II) == PIOCDF%DIMX%LEN) THEN PTDIM => PIOCDF%DIMX ELSE - PTDIM => GETDIMCDF(PIOCDF, KSHAPE(II)) + PTDIM => GETDIMCDF(TPFILE, KSHAPE(II)) END IF ELSE IF (HDIR == 'YY') THEN - IF (.NOT. ASSOCIATED(PIOCDF%DIMY)) PIOCDF%DIMY => GETDIMCDF(PIOCDF, KSHAPE(II), 'Y') + IF (.NOT. ASSOCIATED(PIOCDF%DIMY)) PIOCDF%DIMY => GETDIMCDF(TPFILE, KSHAPE(II), 'Y') IF (KSHAPE(II) == PIOCDF%DIMY%LEN) THEN PTDIM => PIOCDF%DIMY ELSE - PTDIM => GETDIMCDF(PIOCDF, KSHAPE(II)) + PTDIM => GETDIMCDF(TPFILE, KSHAPE(II)) END IF ELSE - PTDIM => GETDIMCDF(PIOCDF, KSHAPE(II)) + PTDIM => GETDIMCDF(TPFILE, KSHAPE(II)) KVDIMS(II) = PTDIM%ID END IF ELSE IF (II == 2) THEN IF (HDIR == 'XY') THEN - IF (.NOT. ASSOCIATED(PIOCDF%DIMY)) PIOCDF%DIMY => GETDIMCDF(PIOCDF, KSHAPE(II), 'Y') + IF (.NOT. ASSOCIATED(PIOCDF%DIMY)) PIOCDF%DIMY => GETDIMCDF(TPFILE, KSHAPE(II), 'Y') IF (KSHAPE(II) == PIOCDF%DIMY%LEN) THEN PTDIM => PIOCDF%DIMY ELSE - PTDIM => GETDIMCDF(PIOCDF, KSHAPE(II)) + PTDIM => GETDIMCDF(TPFILE, KSHAPE(II)) END IF ELSE - PTDIM => GETDIMCDF(PIOCDF, KSHAPE(II)) + PTDIM => GETDIMCDF(TPFILE, KSHAPE(II)) END IF ELSE IF (II == 3) THEN IF (HDIR == 'XY') THEN - IF (.NOT. ASSOCIATED(PIOCDF%DIMZ)) PIOCDF%DIMZ => GETDIMCDF(PIOCDF, KSHAPE(II), 'Z') + IF (.NOT. ASSOCIATED(PIOCDF%DIMZ)) PIOCDF%DIMZ => GETDIMCDF(TPFILE, KSHAPE(II), 'Z') IF (KSHAPE(II) == PIOCDF%DIMZ%LEN) THEN PTDIM => PIOCDF%DIMZ ELSE - PTDIM => GETDIMCDF(PIOCDF, KSHAPE(II)) + PTDIM => GETDIMCDF(TPFILE, KSHAPE(II)) END IF ELSE - PTDIM => GETDIMCDF(PIOCDF, KSHAPE(II)) + PTDIM => GETDIMCDF(TPFILE, KSHAPE(II)) END IF ELSE - PTDIM => GETDIMCDF(PIOCDF, KSHAPE(II)) + PTDIM => GETDIMCDF(TPFILE, KSHAPE(II)) END IF KVDIMS(II) = PTDIM%ID @@ -485,7 +490,7 @@ IF (STATUS /= NF90_NOERR) THEN END IF ! Get the netcdf dimensions - CALL FILLVDIMS(TPFILE%TNCDIMS, INT(SHAPE(PFIELD),KIND=IDCDF_KIND), TPFIELD%CDIR, IVDIMS) + CALL FILLVDIMS(TPFILE, INT(SHAPE(PFIELD),KIND=IDCDF_KIND), TPFIELD%CDIR, IVDIMS) ! Define the variable IF (TPFILE%LNCREDUCE_FLOAT_PRECISION) THEN @@ -564,7 +569,7 @@ IF (STATUS /= NF90_NOERR) THEN END IF ! Get the netcdf dimensions - CALL FILLVDIMS(TZFILE%TNCDIMS, INT(SHAPE(PFIELD),KIND=IDCDF_KIND), TPFIELD%CDIR, IVDIMS) + CALL FILLVDIMS(TZFILE, INT(SHAPE(PFIELD),KIND=IDCDF_KIND), TPFIELD%CDIR, IVDIMS) ! Define the variable IF (TZFILE%LNCREDUCE_FLOAT_PRECISION) THEN @@ -625,7 +630,7 @@ IF (STATUS /= NF90_NOERR) THEN END IF ! Get the netcdf dimensions - CALL FILLVDIMS(TPFILE%TNCDIMS, INT(SHAPE(PFIELD),KIND=IDCDF_KIND), TPFIELD%CDIR, IVDIMS) + CALL FILLVDIMS(TPFILE, INT(SHAPE(PFIELD),KIND=IDCDF_KIND), TPFIELD%CDIR, IVDIMS) ! Define the variable IF (TPFILE%LNCREDUCE_FLOAT_PRECISION) THEN @@ -686,7 +691,7 @@ IF (STATUS /= NF90_NOERR) THEN END IF ! Get the netcdf dimensions - CALL FILLVDIMS(TPFILE%TNCDIMS, INT(SHAPE(PFIELD),KIND=IDCDF_KIND), TPFIELD%CDIR, IVDIMS) + CALL FILLVDIMS(TPFILE, INT(SHAPE(PFIELD),KIND=IDCDF_KIND), TPFIELD%CDIR, IVDIMS) ! Define the variable IF (TPFILE%LNCREDUCE_FLOAT_PRECISION) THEN @@ -747,7 +752,7 @@ IF (STATUS /= NF90_NOERR) THEN END IF ! Get the netcdf dimensions - CALL FILLVDIMS(TPFILE%TNCDIMS, INT(SHAPE(PFIELD),KIND=IDCDF_KIND), TPFIELD%CDIR, IVDIMS) + CALL FILLVDIMS(TPFILE, INT(SHAPE(PFIELD),KIND=IDCDF_KIND), TPFIELD%CDIR, IVDIMS) ! Define the variable IF (TPFILE%LNCREDUCE_FLOAT_PRECISION) THEN @@ -808,7 +813,7 @@ IF (STATUS /= NF90_NOERR) THEN END IF ! Get the netcdf dimensions - CALL FILLVDIMS(TPFILE%TNCDIMS, INT(SHAPE(PFIELD),KIND=IDCDF_KIND), TPFIELD%CDIR, IVDIMS) + CALL FILLVDIMS(TPFILE, INT(SHAPE(PFIELD),KIND=IDCDF_KIND), TPFIELD%CDIR, IVDIMS) ! Define the variable IF (TPFILE%LNCREDUCE_FLOAT_PRECISION) THEN @@ -891,14 +896,14 @@ IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_N0 IF (YVARNAME == 'IMAX' .AND. .NOT. ASSOCIATED(TPFILE%TNCDIMS%DIMX)) TPFILE%TNCDIMS%DIMX=>GETDIMCDF(TPFILE%TNCDIMS,KFIELD+2*JPHEXT,'X') IF (YVARNAME == 'JMAX' .AND. .NOT. ASSOCIATED(TPFILE%TNCDIMS%DIMY)) THEN IF (LPACK .AND. L2D) THEN - TPFILE%TNCDIMS%DIMY=>GETDIMCDF(TPFILE%TNCDIMS, 1,'Y') + TPFILE%TNCDIMS%DIMY=>GETDIMCDF(TPFILE, 1,'Y') ELSE - TPFILE%TNCDIMS%DIMY=>GETDIMCDF(TPFILE%TNCDIMS, KFIELD+2*JPHEXT, 'Y') + TPFILE%TNCDIMS%DIMY=>GETDIMCDF(TPFILE, KFIELD+2*JPHEXT, 'Y') END IF END IF #endif IF (YVARNAME == 'KMAX' .AND. .NOT. ASSOCIATED(TPFILE%TNCDIMS%DIMZ)) & - TPFILE%TNCDIMS%DIMZ=>GETDIMCDF(TPFILE%TNCDIMS,INT(KFIELD+2*JPVEXT,KIND=IDCDF_KIND),'Z') + TPFILE%TNCDIMS%DIMZ=>GETDIMCDF(TPFILE,INT(KFIELD+2*JPVEXT,KIND=IDCDF_KIND),'Z') KRESP = IRESP END SUBROUTINE IO_WRITE_FIELD_NC4_N0 @@ -942,7 +947,7 @@ IF (STATUS /= NF90_NOERR) THEN END IF ! Get the netcdf dimensions - CALL FILLVDIMS(TPFILE%TNCDIMS, INT(SHAPE(KFIELD),KIND=IDCDF_KIND), TPFIELD%CDIR, IVDIMS) + CALL FILLVDIMS(TPFILE, INT(SHAPE(KFIELD),KIND=IDCDF_KIND), TPFIELD%CDIR, IVDIMS) ! Define the variable #ifndef MNH_INT8 @@ -998,7 +1003,7 @@ IF (STATUS /= NF90_NOERR) THEN END IF ! Get the netcdf dimensions - CALL FILLVDIMS(TPFILE%TNCDIMS, INT(SHAPE(KFIELD),KIND=IDCDF_KIND), TPFIELD%CDIR, IVDIMS) + CALL FILLVDIMS(TPFILE, INT(SHAPE(KFIELD),KIND=IDCDF_KIND), TPFIELD%CDIR, IVDIMS) ! Define the variable #ifndef MNH_INT8 @@ -1058,7 +1063,7 @@ IF (STATUS /= NF90_NOERR) THEN END IF ! Get the netcdf dimensions - CALL FILLVDIMS(TPFILE%TNCDIMS, INT(SHAPE(KFIELD),KIND=IDCDF_KIND), TPFIELD%CDIR, IVDIMS) + CALL FILLVDIMS(TPFILE, INT(SHAPE(KFIELD),KIND=IDCDF_KIND), TPFIELD%CDIR, IVDIMS) ! Define the variable #ifndef MNH_INT8 @@ -1171,7 +1176,7 @@ IF (STATUS /= NF90_NOERR) THEN END IF ! Get the netcdf dimensions - CALL FILLVDIMS(TPFILE%TNCDIMS, INT(SHAPE(OFIELD),KIND=IDCDF_KIND), TPFIELD%CDIR, IVDIMS) + CALL FILLVDIMS(TPFILE, INT(SHAPE(OFIELD),KIND=IDCDF_KIND), TPFIELD%CDIR, IVDIMS) ! Define the variable ! Use of NF90_INT1 datatype (=NF90_BYTE) that is enough to store a boolean @@ -1234,7 +1239,7 @@ CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME) STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID) IF (STATUS /= NF90_NOERR) THEN ! Get the netcdf string dimensions id - IVDIMS(1) = GETSTRDIMID(TPFILE%TNCDIMS,INT(ILEN,KIND=IDCDF_KIND)) + IVDIMS(1) = GETSTRDIMID(TPFILE,INT(ILEN,KIND=IDCDF_KIND)) ! Define the variable STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_CHAR, IVDIMS, IVARID) IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_C0[NF90_DEF_VAR]') @@ -1288,8 +1293,8 @@ CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME) STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID) IF (STATUS /= NF90_NOERR) THEN ! Get the netcdf string dimensions id - IVDIMS(1) = GETSTRDIMID(TPFILE%TNCDIMS,ILEN) - CALL FILLVDIMS(TPFILE%TNCDIMS, (/ISIZE/), TPFIELD%CDIR, IVDIMS(2:2)) + IVDIMS(1) = GETSTRDIMID(TPFILE,ILEN) + CALL FILLVDIMS(TPFILE, (/ISIZE/), TPFIELD%CDIR, IVDIMS(2:2)) ! Define the variable STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_CHAR, IVDIMS, IVARID) IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_C1[NF90_DEF_VAR]') @@ -1381,7 +1386,7 @@ TZFIELD%CCOMMENT = 'YYYYMMDD' STATUS = NF90_INQ_VARID(INCID, TZFIELD%CMNHNAME, IVARID) IF (STATUS /= NF90_NOERR) THEN ! Get the netcdf dimensions - CALL FILLVDIMS(TPFILE%TNCDIMS, INT(SHAPE(ITDATE),KIND=IDCDF_KIND), TPFIELD%CDIR, IVDIMS) + CALL FILLVDIMS(TPFILE, INT(SHAPE(ITDATE),KIND=IDCDF_KIND), TPFIELD%CDIR, IVDIMS) ! Define the variable STATUS = NF90_DEF_VAR(INCID, TZFIELD%CMNHNAME, NF90_INT, IVDIMS, IVARID)