D.Gazen & J.Escobar 24/03/2107:mode_netcdf.f90, Correction for compilation of netcdf4...
[MNH-git_open_source-lfs.git] / src / LIB / SURCOUCHE / src / mode_netcdf.f90
index 8a98a29..7f87881 100644 (file)
@@ -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