diff --git a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 b/src/LIB/SURCOUCHE/src/mode_netcdf.f90 index 8a98a298dbb861027bec45c5cbee21b394bd26c3..7f87881d4c9d8e29eb8d5294d1aa7b685b0094d3 100644 --- a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 +++ b/src/LIB/SURCOUCHE/src/mode_netcdf.f90 @@ -1,5 +1,9 @@ #if defined(MNH_IOCDF4) MODULE MODE_NETCDF +!! +!! Original 14/04/2015 D. Gazen +!! D.Gazen & J.Escobar 24/03/2107 : Correction for compilation of netcdf4IO in REAL*4 <=> MNH_REAL=R4 +!! USE MODD_NETCDF IMPLICIT NONE @@ -316,6 +320,7 @@ INTEGER(KIND=IDCDF_KIND) :: INCID CHARACTER(LEN=30) :: YVARNAME INTEGER(KIND=IDCDF_KIND) :: IVARID INTEGER(KIND=IDCDF_KIND),PARAMETER :: IZERO = 0 +REAL(KIND=8) :: ZFIELD8 INTEGER :: IRESP IRESP = 0 @@ -338,7 +343,14 @@ ELSE END IF ! Write the data +#if defined(MNH_MPI_DOUBLE_PRECISION) +! PFIELD REAL(KIND=8) STATUS = NF_PUT_VAR_DOUBLE(INCID, IVARID, PFIELD) +#else +!! PFIELD REAL(KIND=4) saved as REAL(KIND=8) +ZFIELD8 = PFIELD +STATUS = NF_PUT_VAR_DOUBLE(INCID, IVARID, ZFIELD8) +#endif IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX0[NF_PUT_VAR_DOUBLE]',IRESP) KRESP = IRESP @@ -358,6 +370,7 @@ INTEGER(KIND=IDCDF_KIND) :: INCID CHARACTER(LEN=30) :: YVARNAME INTEGER(KIND=IDCDF_KIND) :: IVARID INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS +REAL(KIND=8), DIMENSION(:), ALLOCATABLE :: ZFIELD8 INTEGER :: IRESP IRESP = 0 @@ -383,7 +396,16 @@ ELSE END IF ! Write the data +#if defined(MNH_MPI_DOUBLE_PRECISION) +! PFIELD REAL(KIND=8) STATUS = NF_PUT_VAR_DOUBLE(INCID, IVARID, PFIELD) +#else +!! PFIELD REAL(KIND=4) saved as REAL(KIND=8) +ALLOCATE(ZFIELD8(SIZE(PFIELD))) +ZFIELD8 = PFIELD +STATUS = NF_PUT_VAR_DOUBLE(INCID, IVARID, ZFIELD8) +DEALLOCATE(ZFIELD8) +#endif IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX1[NF_PUT_VAR_DOUBLE]',IRESP) KRESP = IRESP @@ -408,6 +430,7 @@ INTEGER(KIND=IDCDF_KIND) :: INCID CHARACTER(LEN=30) :: YVARNAME INTEGER(KIND=IDCDF_KIND) :: IVARID INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS +REAL(KIND=8),DIMENSION(:,:),ALLOCATABLE :: ZFIELD8 INTEGER :: IRESP IRESP = 0 @@ -438,7 +461,16 @@ ELSE END IF ! Write the data +#if defined(MNH_MPI_DOUBLE_PRECISION) +! PFIELD REAL(KIND=8) STATUS = NF_PUT_VAR_DOUBLE(INCID, IVARID, PFIELD) +#else +!! PFIELD REAL(KIND=4) saved as REAL(KIND=8) +ALLOCATE(ZFIELD8(SIZE(PFIELD,1),SIZE(PFIELD,2))) +ZFIELD8 = PFIELD +STATUS = NF_PUT_VAR_DOUBLE(INCID, IVARID, ZFIELD8) +DEALLOCATE(ZFIELD8) +#endif IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX2[NF_PUT_VAR_DOUBLE]',IRESP) KRESP = IRESP @@ -458,6 +490,7 @@ INTEGER(KIND=IDCDF_KIND) :: INCID CHARACTER(LEN=30) :: YVARNAME INTEGER(KIND=IDCDF_KIND) :: IVARID INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS +REAL(KIND=8),DIMENSION(:,:,:),ALLOCATABLE :: ZFIELD8 INTEGER :: IRESP IRESP = 0 @@ -483,7 +516,16 @@ ELSE END IF ! Write the data +#if defined(MNH_MPI_DOUBLE_PRECISION) +! PFIELD REAL(KIND=8) STATUS = NF_PUT_VAR_DOUBLE(INCID, IVARID, PFIELD) +#else +!! PFIELD REAL(KIND=4) saved as REAL(KIND=8) +ALLOCATE(ZFIELD8(SIZE(PFIELD,1),SIZE(PFIELD,2),SIZE(PFIELD,3))) +ZFIELD8 = PFIELD +STATUS = NF_PUT_VAR_DOUBLE(INCID, IVARID, ZFIELD8) +DEALLOCATE(ZFIELD8) +#endif IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX3[NF_PUT_VAR_DOUBLE] '//TRIM(HVARNAME),IRESP) KRESP = IRESP @@ -503,6 +545,7 @@ INTEGER(KIND=IDCDF_KIND) :: INCID CHARACTER(LEN=30) :: YVARNAME INTEGER(KIND=IDCDF_KIND) :: IVARID INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS +REAL(KIND=8),DIMENSION(:,:,:,:),ALLOCATABLE :: ZFIELD8 INTEGER :: IRESP IRESP = 0 @@ -528,7 +571,17 @@ ELSE END IF ! Write the data +#if defined(MNH_MPI_DOUBLE_PRECISION) +! PFIELD REAL(KIND=8) STATUS = NF_PUT_VAR_DOUBLE(INCID, IVARID, PFIELD) +#else +!! PFIELD REAL(KIND=4) saved as REAL(KIND=8) +ALLOCATE(ZFIELD8(SIZE(PFIELD,1),SIZE(PFIELD,2),SIZE(PFIELD,3),& + &SIZE(PFIELD,4))) +ZFIELD8 = PFIELD +STATUS = NF_PUT_VAR_DOUBLE(INCID, IVARID, ZFIELD8) +DEALLOCATE(ZFIELD8) +#endif IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX4[NF_PUT_VAR_DOUBLE]',IRESP) KRESP = IRESP @@ -548,6 +601,7 @@ INTEGER(KIND=IDCDF_KIND) :: INCID CHARACTER(LEN=30) :: YVARNAME INTEGER(KIND=IDCDF_KIND) :: IVARID INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS +REAL(KIND=8),DIMENSION(:,:,:,:,:),ALLOCATABLE :: ZFIELD8 INTEGER :: IRESP IRESP = 0 @@ -573,7 +627,17 @@ ELSE END IF ! Write the data +#if defined(MNH_MPI_DOUBLE_PRECISION) +! PFIELD REAL(KIND=8) STATUS = NF_PUT_VAR_DOUBLE(INCID, IVARID, PFIELD) +#else +!! PFIELD REAL(KIND=4) saved as REAL(KIND=8) +ALLOCATE(ZFIELD8(SIZE(PFIELD,1),SIZE(PFIELD,2),SIZE(PFIELD,3),& + &SIZE(PFIELD,4),SIZE(PFIELD,5))) +ZFIELD8 = PFIELD +STATUS = NF_PUT_VAR_DOUBLE(INCID, IVARID, ZFIELD8) +DEALLOCATE(ZFIELD8) +#endif IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX5[NF_PUT_VAR_DOUBLE]',IRESP) KRESP = IRESP @@ -593,6 +657,7 @@ INTEGER(KIND=IDCDF_KIND) :: INCID CHARACTER(LEN=30) :: YVARNAME INTEGER(KIND=IDCDF_KIND) :: IVARID INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS +REAL(KIND=8),DIMENSION(:,:,:,:,:,:),ALLOCATABLE :: ZFIELD8 INTEGER :: IRESP IRESP = 0 @@ -618,7 +683,17 @@ ELSE END IF ! Write the data +#if defined(MNH_MPI_DOUBLE_PRECISION) +! PFIELD REAL(KIND=8) STATUS = NF_PUT_VAR_DOUBLE(INCID, IVARID, PFIELD) +#else +!! PFIELD REAL(KIND=4) saved as REAL(KIND=8) +ALLOCATE(ZFIELD8(SIZE(PFIELD,1),SIZE(PFIELD,2),SIZE(PFIELD,3),& + &SIZE(PFIELD,4),SIZE(PFIELD,5),SIZE(PFIELD,6))) +ZFIELD8 = PFIELD +STATUS = NF_PUT_VAR_DOUBLE(INCID, IVARID, ZFIELD8) +DEALLOCATE(ZFIELD8) +#endif IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX6[NF_PUT_VAR_DOUBLE]',IRESP) KRESP = IRESP @@ -947,6 +1022,7 @@ INTEGER(KIND=IDCDF_KIND) :: IVARID INTEGER(KIND=IDCDF_KIND) :: ITYPE ! variable type INTEGER(KIND=IDCDF_KIND) :: IDIMS ! number of dimensions INTEGER(KIND=IDCDF_KIND) :: ICOMLEN ! comment length +REAL(KIND=8) :: ZFIELD8 INTEGER :: IRESP IRESP = 0 @@ -968,7 +1044,12 @@ IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADX0[NF_INQ_VARTYPE IF (IDIMS == 0 .AND. ITYPE == NF_DOUBLE) THEN ! Read variable +#if defined(MNH_MPI_DOUBLE_PRECISION) STATUS = NF_GET_VAR_DOUBLE(KNCID, IVARID, PFIELD) +#else + STATUS = NF_GET_VAR_DOUBLE(KNCID, IVARID, ZFIELD8) + PFIELD = ZFIELD8 +#endif IF (STATUS /= NF_NOERR) THEN CALL HANDLE_ERR(status,__LINE__,'NCREADX0[NF_GET_VAR_DOUBLE] '//TRIM(YVARNAME),IRESP) GOTO 1000 @@ -999,6 +1080,7 @@ INTEGER(KIND=IDCDF_KIND) :: IVARID INTEGER(KIND=IDCDF_KIND) :: ITYPE ! variable type INTEGER(KIND=IDCDF_KIND) :: IDIMS ! number of dimensions INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS +REAL(KIND=8), DIMENSION(:), ALLOCATABLE :: ZFIELD8 INTEGER(KIND=IDCDF_KIND) :: ICOMLEN ! comment length INTEGER :: IVARSIZE INTEGER(KIND=IDCDF_KIND) :: IDIMLEN @@ -1035,7 +1117,14 @@ IF (IDIMS == SIZE(SHAPE(PFIELD)) .AND. ITYPE == NF_DOUBLE) THEN IF (IVARSIZE == SIZE(PFIELD)) THEN ! Read variable +#if defined(MNH_MPI_DOUBLE_PRECISION) STATUS = NF_GET_VAR_DOUBLE(KNCID, IVARID, PFIELD) +#else + ALLOCATE(ZFIELD8(SIZE(PFIELD))) + STATUS = NF_GET_VAR_DOUBLE(KNCID, IVARID, ZFIELD8) + PFIELD = ZFIELD8 + DEALLOCATE(ZFIELD8) +#endif IF (STATUS /= NF_NOERR) THEN CALL HANDLE_ERR(status,__LINE__,'NCREADX1[NF_GET_VAR_DOUBLE] '//TRIM(YVARNAME),IRESP) GOTO 1000 @@ -1070,6 +1159,7 @@ INTEGER(KIND=IDCDF_KIND) :: IVARID INTEGER(KIND=IDCDF_KIND) :: ITYPE ! variable type INTEGER(KIND=IDCDF_KIND) :: IDIMS ! number of dimensions INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS +REAL(KIND=8), DIMENSION(:,:), ALLOCATABLE :: ZFIELD8 INTEGER(KIND=IDCDF_KIND) :: ICOMLEN ! comment length INTEGER :: IVARSIZE INTEGER(KIND=IDCDF_KIND) :: IDIMLEN @@ -1106,7 +1196,15 @@ IF (IDIMS == SIZE(SHAPE(PFIELD)) .AND. ITYPE == NF_DOUBLE) THEN IF (IVARSIZE == SIZE(PFIELD)) THEN ! Read variable +#if defined(MNH_MPI_DOUBLE_PRECISION) STATUS = NF_GET_VAR_DOUBLE(KNCID, IVARID, PFIELD) +#else + ! REAL(KIND=4) was stored as REAL(KIND=8) + ALLOCATE(ZFIELD8(SIZE(PFIELD,1),SIZE(PFIELD,2))) + STATUS = NF_GET_VAR_DOUBLE(KNCID, IVARID, ZFIELD8) + PFIELD = ZFIELD8 + DEALLOCATE(ZFIELD8) +#endif IF (STATUS /= NF_NOERR) THEN CALL HANDLE_ERR(status,__LINE__,'NCREADX2[NF_GET_VAR_DOUBLE] '//TRIM(YVARNAME),IRESP) GOTO 1000 @@ -1141,6 +1239,7 @@ INTEGER(KIND=IDCDF_KIND) :: IVARID INTEGER(KIND=IDCDF_KIND) :: ITYPE ! variable type INTEGER(KIND=IDCDF_KIND) :: IDIMS ! number of dimensions INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS +REAL(KIND=8), DIMENSION(:,:,:), ALLOCATABLE :: ZFIELD8 INTEGER(KIND=IDCDF_KIND) :: ICOMLEN ! comment length INTEGER :: IVARSIZE INTEGER(KIND=IDCDF_KIND) :: IDIMLEN @@ -1177,7 +1276,15 @@ IF (IDIMS == SIZE(SHAPE(PFIELD)) .AND. ITYPE == NF_DOUBLE) THEN IF (IVARSIZE == SIZE(PFIELD)) THEN ! Read variable +#if defined(MNH_MPI_DOUBLE_PRECISION) STATUS = NF_GET_VAR_DOUBLE(KNCID, IVARID, PFIELD) +#else + ! REAL(KIND=4) was stored as REAL(KIND=8) + ALLOCATE(ZFIELD8(SIZE(PFIELD,1),SIZE(PFIELD,2),SIZE(PFIELD,3))) + STATUS = NF_GET_VAR_DOUBLE(KNCID, IVARID, ZFIELD8) + PFIELD = ZFIELD8 + DEALLOCATE(ZFIELD8) +#endif IF (STATUS /= NF_NOERR) THEN CALL HANDLE_ERR(status,__LINE__,'NCREADX3[NF_GET_VAR_DOUBLE] '//TRIM(YVARNAME),IRESP) GOTO 1000 @@ -1212,6 +1319,7 @@ INTEGER(KIND=IDCDF_KIND) :: IVARID INTEGER(KIND=IDCDF_KIND) :: ITYPE ! variable type INTEGER(KIND=IDCDF_KIND) :: IDIMS ! number of dimensions INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS +REAL(KIND=8), DIMENSION(:,:,:,:), ALLOCATABLE :: ZFIELD8 INTEGER(KIND=IDCDF_KIND) :: ICOMLEN ! comment length INTEGER :: IVARSIZE INTEGER(KIND=IDCDF_KIND) :: IDIMLEN @@ -1248,7 +1356,16 @@ IF (IDIMS == SIZE(SHAPE(PFIELD)) .AND. ITYPE == NF_DOUBLE) THEN IF (IVARSIZE == SIZE(PFIELD)) THEN ! Read variable +#if defined(MNH_MPI_DOUBLE_PRECISION) STATUS = NF_GET_VAR_DOUBLE(KNCID, IVARID, PFIELD) +#else + ! REAL(KIND=4) was stored as REAL(KIND=8) + ALLOCATE(ZFIELD8(SIZE(PFIELD,1),SIZE(PFIELD,2),SIZE(PFIELD,3),& + &SIZE(PFIELD,4))) + STATUS = NF_GET_VAR_DOUBLE(KNCID, IVARID, ZFIELD8) + PFIELD = ZFIELD8 + DEALLOCATE(ZFIELD8) +#endif IF (STATUS /= NF_NOERR) THEN CALL HANDLE_ERR(status,__LINE__,'NCREADX4[NF_GET_VAR_DOUBLE] '//TRIM(YVARNAME),IRESP) GOTO 1000 @@ -1283,6 +1400,7 @@ INTEGER(KIND=IDCDF_KIND) :: IVARID INTEGER(KIND=IDCDF_KIND) :: ITYPE ! variable type INTEGER(KIND=IDCDF_KIND) :: IDIMS ! number of dimensions INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS +REAL(KIND=8), DIMENSION(:,:,:,:,:), ALLOCATABLE :: ZFIELD8 INTEGER(KIND=IDCDF_KIND) :: ICOMLEN ! comment length INTEGER :: IVARSIZE INTEGER(KIND=IDCDF_KIND) :: IDIMLEN @@ -1319,7 +1437,16 @@ IF (IDIMS == SIZE(SHAPE(PFIELD)) .AND. ITYPE == NF_DOUBLE) THEN IF (IVARSIZE == SIZE(PFIELD)) THEN ! Read variable +#if defined(MNH_MPI_DOUBLE_PRECISION) STATUS = NF_GET_VAR_DOUBLE(KNCID, IVARID, PFIELD) +#else + ! REAL(KIND=4) was stored as REAL(KIND=8) + ALLOCATE(ZFIELD8(SIZE(PFIELD,1),SIZE(PFIELD,2),SIZE(PFIELD,3),& + &SIZE(PFIELD,4),SIZE(PFIELD,5))) + STATUS = NF_GET_VAR_DOUBLE(KNCID, IVARID, ZFIELD8) + PFIELD = ZFIELD8 + DEALLOCATE(ZFIELD8) +#endif IF (STATUS /= NF_NOERR) THEN CALL HANDLE_ERR(status,__LINE__,'NCREADX5[NF_GET_VAR_DOUBLE] '//TRIM(YVARNAME),IRESP) GOTO 1000 @@ -1354,6 +1481,7 @@ INTEGER(KIND=IDCDF_KIND) :: IVARID INTEGER(KIND=IDCDF_KIND) :: ITYPE ! variable type INTEGER(KIND=IDCDF_KIND) :: IDIMS ! number of dimensions INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS +REAL(KIND=8), DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: ZFIELD8 INTEGER(KIND=IDCDF_KIND) :: ICOMLEN ! comment length INTEGER :: IVARSIZE INTEGER(KIND=IDCDF_KIND) :: IDIMLEN @@ -1390,7 +1518,16 @@ IF (IDIMS == SIZE(SHAPE(PFIELD)) .AND. ITYPE == NF_DOUBLE) THEN IF (IVARSIZE == SIZE(PFIELD)) THEN ! Read variable +#if defined(MNH_MPI_DOUBLE_PRECISION) STATUS = NF_GET_VAR_DOUBLE(KNCID, IVARID, PFIELD) +#else + ! REAL(KIND=4) was stored as REAL(KIND=8) + ALLOCATE(ZFIELD8(SIZE(PFIELD,1),SIZE(PFIELD,2),SIZE(PFIELD,3),& + &SIZE(PFIELD,4),SIZE(PFIELD,5),SIZE(PFIELD,6))) + STATUS = NF_GET_VAR_DOUBLE(KNCID, IVARID, ZFIELD8) + PFIELD = ZFIELD8 + DEALLOCATE(ZFIELD8) +#endif IF (STATUS /= NF_NOERR) THEN CALL HANDLE_ERR(status,__LINE__,'NCREADX6[NF_GET_VAR_DOUBLE] '//TRIM(YVARNAME),IRESP) GOTO 1000