Skip to content
Snippets Groups Projects
mode_read_netcdf_mercator.F90 51.1 KiB
Newer Older
!SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
!SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
!SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
!SFX_LIC for details. version 1.
!!
!!      Modified    09/2013 : S. Senesi : adapt READ_NETCDF_SST to read 2D fields other than SST
!!
MODULE MODE_READ_NETCDF_MERCATOR
!!!=============================================================================
!!      Modified    03/2014 : M.N. Bouin  ! possibility of wave parameters
!!                                        ! from external source 
!!                                        ! + correction of 2 bugs
!-------------------------------------------------------------------------------
!
!
USE MODI_ABOR1_SFX
!
USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
USE PARKIND1  ,ONLY : JPRB
!
CONTAINS
!-------------------------------------------------------------------
!-------------------------------------------------------------------
!     ####################
      SUBROUTINE HANDLE_ERR_MER(status,line)
!     ####################
USE NETCDF
!
IMPLICIT NONE
INTEGER, INTENT(IN)           :: status
 CHARACTER(LEN=80), INTENT(IN) :: line
REAL(KIND=JPRB) :: ZHOOK_HANDLE
!
!
IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:HANDLE_ERR_MER',0,ZHOOK_HANDLE)
IF (status /= NF90_NOERR) THEN
  CALL ABOR1_SFX('MODE_READ_NETCDF_MERCATOR: HANDLE_ERR_MER')
END IF
IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:HANDLE_ERR_MER',1,ZHOOK_HANDLE)
END SUBROUTINE HANDLE_ERR_MER
!-------------------------------------------------------------------
!-------------------------------------------------------------------
!     ####################
      SUBROUTINE GET1DCDF(KCDF_ID,IDVAR,PMISSVALUE,PVALU1D)
!     ####################
!
USE NETCDF
!
IMPLICIT NONE
!
INTEGER,INTENT(IN) :: KCDF_ID !netcdf file identifiant
INTEGER,INTENT(IN) :: IDVAR   !variable to read identifiant
REAL, INTENT(OUT) ::  PMISSVALUE !undefined value
REAL,DIMENSION(:),INTENT(OUT) :: PVALU1D !value array
!
integer :: status
character(len=80) :: HACTION
integer,save :: NDIMS=1
integer :: KVARTYPE
integer,DIMENSION(:),ALLOCATABLE :: NVARDIMID,NVARDIMLEN
character(len=80),DIMENSION(:),ALLOCATABLE :: NVARDIMNAM
integer :: JLOOP
integer :: NGATTS   
integer, dimension(1) :: NDIMID
character(len=80),DIMENSION(:),ALLOCATABLE :: HNAME
REAL,DIMENSION(:),ALLOCATABLE :: ZVALU1D !value array
REAL(KIND=JPRB) :: ZHOOK_HANDLE
!
!
IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:GET1DCDF',0,ZHOOK_HANDLE)
PMISSVALUE=-9999.9
ALLOCATE(NVARDIMID (NDIMS))
ALLOCATE(NVARDIMLEN(NDIMS))
ALLOCATE(NVARDIMNAM(NDIMS))
NVARDIMID (:)=0
NVARDIMLEN(:)=0
NVARDIMNAM(:)=' '
!
HACTION='get variable type'
status=nf90_inquire_variable(KCDF_ID,IDVAR,XTYPE=KVARTYPE)
if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
status=nf90_inquire_variable(KCDF_ID,IDVAR,DIMIDS=NDIMID)
HACTION='get variable dimensions name'
status=nf90_inquire_dimension(KCDF_ID,NDIMID(NDIMS),NAME=NVARDIMNAM(NDIMS))
if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
!
HACTION='get variable dimensions length'
status=nf90_inquire_dimension(KCDF_ID,NDIMID(NDIMS),LEN=NVARDIMLEN(NDIMS))
if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
!     &'has a length of',NVARDIMLEN(NDIMS)
!!
HACTION='get attributs'
status=nf90_inquire_variable(KCDF_ID,IDVAR,NATTS=NGATTS)
if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
allocate(hname(1:NGATTS))
!
ALLOCATE(ZVALU1D(1:NVARDIMLEN(NDIMS)))
ZVALU1D=0.
!
IF (KVARTYPE>=5) then
  HACTION='get variable values (1D)'
  status=nf90_get_var(KCDF_ID,IDVAR,ZVALU1D(:))
  if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
ENDIF
!
PVALU1D(:)=ZVALU1D(:)
!
IF (ALLOCATED(ZVALU1D  ))  DEALLOCATE(ZVALU1D)
IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:GET1DCDF',1,ZHOOK_HANDLE)
!
END SUBROUTINE GET1DCDF
!-------------------------------------------------------------------
!-------------------------------------------------------------------
!     ####################
      SUBROUTINE GET2DCDF(KCDF_ID,IDVAR,PDIM1,HDIM1NAME,PDIM2,HDIM2NAME,&
             PMISSVALUE,PVALU2D)  
!     ####################
USE MODD_SURF_PAR,         ONLY : XUNDEF
!
IMPLICIT NONE
!
INTEGER,INTENT(IN) :: KCDF_ID !netcdf file identifiant
INTEGER,INTENT(IN) :: IDVAR   !variable to read identifiant
REAL,DIMENSION(:),INTENT(OUT) :: PDIM1,PDIM2 !dimensions for PVALU2D array
 CHARACTER(len=80),INTENT(OUT) :: HDIM1NAME,HDIM2NAME     !dimensions names
REAL, INTENT(OUT) :: PMISSVALUE
REAL,DIMENSION(:,:),INTENT(OUT) :: PVALU2D !value array
!
integer :: status
character(len=80) :: HACTION
integer,save :: NDIMS=2
integer :: KVARTYPE
integer,DIMENSION(:),ALLOCATABLE :: NVARDIMID,NVARDIMLEN
character(len=80),DIMENSION(:),ALLOCATABLE :: NVARDIMNAM
integer :: JLOOP2, JLOOP, J1, J2
integer :: NGATTS   
character(len=80),DIMENSION(:),ALLOCATABLE :: HNAME
real :: ZMISS1,ZMISS2
real :: ZSCFA, ZOFFS
REAL,DIMENSION(:,:),ALLOCATABLE :: ZVALU2D !value array
INTEGER,DIMENSION(:,:),ALLOCATABLE :: IVALU2D
REAL(KIND=JPRB) :: ZHOOK_HANDLE
!
!
IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:GET2DCDF',0,ZHOOK_HANDLE)
PMISSVALUE=-9999.9 
ALLOCATE(NVARDIMID (NDIMS))
ALLOCATE(NVARDIMLEN(NDIMS))
ALLOCATE(NVARDIMNAM(NDIMS))
NVARDIMID (:)=0
NVARDIMLEN(:)=0
NVARDIMNAM(:)=' '
!
HACTION='get variable type'
status=nf90_inquire_variable(KCDF_ID,IDVAR,XTYPE=KVARTYPE)
if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
!
HACTION='get variable dimensions identifiant'
status=nf90_inquire_variable(KCDF_ID,IDVAR,DIMIDS=NVARDIMID)
if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
!
HACTION='get attributs'
status=nf90_inquire_variable(KCDF_ID,IDVAR,NATTS=NGATTS)
if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
allocate(hname(1:NGATTS))
!
ZSCFA=1.
ZOFFS=0.
DO JLOOP=1,NGATTS
  status=nf90_inq_attname(KCDF_ID,IDVAR,JLOOP,hname(JLOOP))
  if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
  if (TRIM(hname(JLOOP))=='missing_value') then
    HACTION='get missing value'
    status=nf90_get_att(KCDF_ID,IDVAR,"missing_value",PMISSVALUE)
    if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
  else
    if (TRIM(hname(JLOOP))=='_FillValue') then
      HACTION='get _FillValue'
      status=nf90_get_att(KCDF_ID,IDVAR,"_FillValue",PMISSVALUE)
      if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
    endif    
  endif
  if (TRIM(hname(JLOOP))=='scale_factor') then
    HACTION='get scale factor'
    status=nf90_get_att(KCDF_ID,IDVAR,"scale_factor",ZSCFA)
    if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
  endif   
  if (TRIM(hname(JLOOP))=='add_offset') then
    HACTION='get offset'
    status=nf90_get_att(KCDF_ID,IDVAR,"add_offset",ZOFFS)
    if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
  endif    
ENDDO
!
!
DO JLOOP2=1,NDIMS
  HACTION='get variable dimensions name'
  status=nf90_inquire_dimension(KCDF_ID,NVARDIMID(JLOOP2),NAME=NVARDIMNAM(JLOOP2))
  if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
  HACTION='get variable dimensions length'
  status=nf90_inquire_dimension(KCDF_ID,NVARDIMID(JLOOP2),LEN=NVARDIMLEN(JLOOP2))
  if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
ENDDO
! 
IF (KVARTYPE>=5) then
  ALLOCATE(ZVALU2D(1:NVARDIMLEN(1),1:NVARDIMLEN(2)))
  ZVALU2D=0.        
  HACTION='get variable values (2D)'
  status=nf90_get_var(KCDF_ID,IDVAR,ZVALU2D(:,:))
  if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
ELSE
  ALLOCATE(IVALU2D(1:NVARDIMLEN(1),1:NVARDIMLEN(2)))
  IVALU2D=0.         
  HACTION='get variable values (2D)'
  status=nf90_get_var(KCDF_ID,IDVAR,IVALU2D(:,:))
  if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)  
ENDIF
PVALU2D(:,:)=XUNDEF
DO J1=1,NVARDIMLEN(1)
  DO J2=1,NVARDIMLEN(2)
    IF (KVARTYPE>=5) THEN
      IF (ZVALU2D(J1,J2)/=PMISSVALUE) PVALU2D(J1,J2)=ZVALU2D(J1,J2)*ZSCFA+ZOFFS
    ELSE
      IF (ZVALU2D(J1,J2)/=PMISSVALUE) PVALU2D(J1,J2)=IVALU2D(J1,J2)*ZSCFA+ZOFFS
    ENDIF
  ENDDO
ENDDO
!
 CALL GET1DCDF(KCDF_ID,NVARDIMID(1),ZMISS1,PDIM1)
 CALL GET1DCDF(KCDF_ID,NVARDIMID(2),ZMISS2,PDIM2)
HDIM1NAME=NVARDIMNAM(1)
HDIM2NAME=NVARDIMNAM(2)
IF (ALLOCATED(ZVALU2D  ))  DEALLOCATE(ZVALU2D)
IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:GET2DCDF',1,ZHOOK_HANDLE)
!
END SUBROUTINE GET2DCDF
!-------------------------------------------------------------------
!-------------------------------------------------------------------
!     ####################
      SUBROUTINE GET3DCDF(KCDF_ID,IDVAR,PDIM1,HDIM1NAME,PDIM2,HDIM2NAME,&
             PDIM3,HDIM3NAME,PMISSVALUE,PVALU3D)  
!     ####################
USE MODD_SURF_PAR,         ONLY : XUNDEF
!
IMPLICIT NONE
!
INTEGER,INTENT(IN) :: KCDF_ID !netcdf file identifiant
INTEGER,INTENT(IN) :: IDVAR   !variable to read identifiant
REAL,DIMENSION(:),INTENT(OUT) :: PDIM1,PDIM2,PDIM3 !dimensions for PVALU2D array
 CHARACTER(len=80),INTENT(OUT) :: HDIM1NAME,HDIM2NAME,HDIM3NAME    !dimensions names
REAL, INTENT(OUT) :: PMISSVALUE
REAL,DIMENSION(:,:,:),INTENT(OUT) :: PVALU3D !value array
!
integer :: status
character(len=80) :: HACTION
integer,save :: NDIMS=3
integer :: KVARTYPE
integer,DIMENSION(:),ALLOCATABLE :: NVARDIMID,NVARDIMLEN
character(len=80),DIMENSION(:),ALLOCATABLE :: NVARDIMNAM
integer :: JLOOP2, JLOOP
integer :: J1,J2,J3
integer :: NGATTS   
character(len=80),DIMENSION(:),ALLOCATABLE :: HNAME
real :: ZMISS1,ZMISS2,ZMISS3
real :: ZSCFA, ZOFFS
REAL,DIMENSION(:,:,:),ALLOCATABLE :: ZVALU3D !value array
INTEGER,DIMENSION(:,:,:),ALLOCATABLE :: IVALU3D
REAL(KIND=JPRB) :: ZHOOK_HANDLE
!
!
IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:GET3DCDF',0,ZHOOK_HANDLE)
PMISSVALUE=-9999.9 
ALLOCATE(NVARDIMID (NDIMS))
ALLOCATE(NVARDIMLEN(NDIMS))
ALLOCATE(NVARDIMNAM(NDIMS))
NVARDIMID (:)=0
NVARDIMLEN(:)=0
NVARDIMNAM(:)=' '
!
HACTION='get variable type'
status=nf90_inquire_variable(KCDF_ID,IDVAR,XTYPE=KVARTYPE)
if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
!
HACTION='get variable dimensions identifiant'
status=nf90_inquire_variable(KCDF_ID,IDVAR,DIMIDS=NVARDIMID)
if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
!
HACTION='get attributs'
status=nf90_inquire_variable(KCDF_ID,IDVAR,NATTS=NGATTS)
if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
allocate(hname(1:NGATTS))
!
ZSCFA=1.
ZOFFS=0.
DO JLOOP=1,NGATTS
  status=nf90_inq_attname(KCDF_ID,IDVAR,JLOOP,hname(JLOOP))
  if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
  if (TRIM(hname(JLOOP))=='missing_value') then
    HACTION='get missing value'
    status=nf90_get_att(KCDF_ID,IDVAR,"missing_value",PMISSVALUE)
    if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
  else
    if (TRIM(hname(JLOOP))=='_FillValue') then
      HACTION='get _FillValue'
      status=nf90_get_att(KCDF_ID,IDVAR,"_FillValue",PMISSVALUE)
      if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
    endif
  endif
  if (TRIM(hname(JLOOP))=='scale_factor') then
    HACTION='get scale factor'
    status=nf90_get_att(KCDF_ID,IDVAR,"scale_factor",ZSCFA)
    if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
  endif  
  if (TRIM(hname(JLOOP))=='add_offset') then
    HACTION='get offset'
    status=nf90_get_att(KCDF_ID,IDVAR,"add_offset",ZOFFS)
    if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
  endif 
ENDDO
!
!
DO JLOOP2=1,NDIMS
  HACTION='get variable dimensions name'
  status=nf90_inquire_dimension(KCDF_ID,NVARDIMID(JLOOP2),NAME=NVARDIMNAM(JLOOP2))
  if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
  HACTION='get variable dimensions length'
  status=nf90_inquire_dimension(KCDF_ID,NVARDIMID(JLOOP2),LEN=NVARDIMLEN(JLOOP2))
  if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
ENDDO
! 
IF (KVARTYPE>=5) then
  ALLOCATE(ZVALU3D(1:NVARDIMLEN(1),1:NVARDIMLEN(2),1:NVARDIMLEN(3)))
  ZVALU3D=0.        
  HACTION='get variable values (3D)'
  status=nf90_get_var(KCDF_ID,IDVAR,ZVALU3D(:,:,:))
  if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
ELSE
  ALLOCATE(IVALU3D(1:NVARDIMLEN(1),1:NVARDIMLEN(2),1:NVARDIMLEN(3)))
  IVALU3D=0.         
  HACTION='get variable values (3D)'
  status=nf90_get_var(KCDF_ID,IDVAR,IVALU3D(:,:,:))
  if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
ENDIF
!
PVALU3D(:,:,:)=XUNDEF
DO J1=1,NVARDIMLEN(1)
  DO J2=1,NVARDIMLEN(2)
    DO J3=1,NVARDIMLEN(3)
      IF (KVARTYPE>=5) THEN
        IF (ZVALU3D(J1,J2,J3)/=PMISSVALUE) PVALU3D(J1,J2,J3)=ZVALU3D(J1,J2,J3)*ZSCFA+ZOFFS
      ELSE
        IF (IVALU3D(J1,J2,J3)/=PMISSVALUE) PVALU3D(J1,j2,J3)=IVALU3D(J1,J2,J3)*ZSCFA+ZOFFS
      ENDIF
    ENDDO
  ENDDO
ENDDO
!
 CALL GET1DCDF(KCDF_ID,NVARDIMID(1),ZMISS1,PDIM1)
 CALL GET1DCDF(KCDF_ID,NVARDIMID(2),ZMISS2,PDIM2)
 CALL GET1DCDF(KCDF_ID,NVARDIMID(3),ZMISS3,PDIM3)
HDIM1NAME=NVARDIMNAM(1)
HDIM2NAME=NVARDIMNAM(2)
HDIM3NAME=NVARDIMNAM(3)
IF (ALLOCATED(ZVALU3D  ))  DEALLOCATE(ZVALU3D)
IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:GET3DCDF',1,ZHOOK_HANDLE)
!
END SUBROUTINE GET3DCDF
!--------------------------------------------------------------------
!-------------------------------------------------------------------
!------------------------------------------------------------------------------
!==============================================================================
!     ####################
       SUBROUTINE READ_DIM_CDF(HFILENAME,HNCVARNAME,KDIM)
!     ####################
!
IMPLICIT NONE
!
 CHARACTER(LEN=28), INTENT(IN) :: HFILENAME   ! Name of the field file.
 CHARACTER(LEN=28), INTENT(IN) :: HNCVARNAME  ! Name of variable to read in netcdf file
INTEGER,           INTENT(OUT):: KDIM        ! value of dimension to get
!
integer :: status
integer :: kcdf_id
integer :: NBVARS
character(len=80) :: HACTION
character(len=80),DIMENSION(:),ALLOCATABLE :: YVARNAME
integer ::JLOOP1,JLOOP
integer ::ID_VARTOGET,ID_VARTOGET1,ID_VARTOGET2
integer ::NVARDIMS
INTEGER, DIMENSION(1) :: NDIMID
integer,DIMENSION(2) ::NLEN2D, NDIMID2D
REAL(KIND=JPRB) :: ZHOOK_HANDLE
!
!
!*    1.      Open the netcdf file 
!             --------------------
IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:READ_DIM_CDF',0,ZHOOK_HANDLE)
HACTION='open netcdf'
status=NF90_OPEN(HFILENAME,nf90_nowrite,kcdf_id)
if (status/=NF90_NOERR) then 
  CALL HANDLE_ERR_MER(status,HACTION)
endif
!
!-----------
!
!*    2.      get the number of variables in netcdf file 
!             ------------------------------------------
HACTION='get number of variables'
status=NF90_INQUIRE(kcdf_id,NVARIABLES=NBVARS)
if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
ALLOCATE(YVARNAME(NBVARS))
!
!-----------
!
!*    3.      get the variables names in netcdf file 
!             --------------------------------------
ID_VARTOGET1=0
ID_VARTOGET2=0
DO JLOOP1=1,NBVARS
  HACTION='get variables  names'
  status=NF90_INQUIRE_VARIABLE(kcdf_id,JLOOP1,NAME=YVARNAME(JLOOP1))
  if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
  if (YVARNAME(JLOOP1)==HNCVARNAME) then
    ID_VARTOGET1=JLOOP1
  endif
  if (YVARNAME(JLOOP1)/=HNCVARNAME) then
    if((LGT(TRIM(YVARNAME(JLOOP1)),TRIM(HNCVARNAME))).AND.&
           (SCAN(TRIM(YVARNAME(JLOOP1)),TRIM(HNCVARNAME))==1)) then  
      ID_VARTOGET2=JLOOP1
    endif
  endif
ENDDO
if (ID_VARTOGET1/=0) then
  ID_VARTOGET=ID_VARTOGET1
else
  ID_VARTOGET=ID_VARTOGET2
endif
if (ID_VARTOGET==0) then
  HACTION='close netcdf'
  status=nf90_close(kcdf_id)
  if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
  CALL ABOR1_SFX('MODE_READ_NETCDF_MERCATOR: READ_DIM_CDF')
endif
!-----------
!
!*    4.      get the total dimension of HNCVARNAME 
!             -------------------------------------
!
!     4.1      get the variable dimensions number
!             -----------------------------------
!
HACTION='get variable dimensions number'
status=nf90_inquire_variable(kcdf_id,ID_VARTOGET,NDIMS=NVARDIMS)
if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
!
!     4.2      get the variable dimensions length
!              ----------------------------------
SELECT CASE (NVARDIMS)
!CAS 1D
  CASE (1) 
    HACTION='get variable dimensions length'
    status=nf90_inquire_variable(kcdf_id,ID_VARTOGET,DIMIDS=NDIMID)
    status=nf90_inquire_dimension(kcdf_id,NDIMID(1),LEN=KDIM)
    if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
!
!CAS 2D
  CASE (2)
    KDIM=1
    status=nf90_inquire_variable(kcdf_id,ID_VARTOGET,DIMIDS=NDIMID2D)
    DO JLOOP=1,NVARDIMS
      HACTION='get variable dimensions length'
      status=nf90_inquire_dimension(kcdf_id,NDIMID2D(JLOOP),LEN=NLEN2D(JLOOP))
      if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
      KDIM=KDIM*NLEN2D(JLOOP)
    ENDDO
END SELECT
!-----------
!*    10.     Close the netcdf file 
!             ---------------------
HACTION='close netcdf'
status=nf90_close(kcdf_id)
if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
!
!-----------
!*    11.     Deallocate 
!             ----------
IF (ALLOCATED(YVARNAME     ))  DEALLOCATE(YVARNAME)
IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:READ_DIM_CDF',1,ZHOOK_HANDLE)
!
END SUBROUTINE READ_DIM_CDF
!-------------------------------------------------------------------
!-------------------------------------------------------------------
!     ####################
       SUBROUTINE PREP_NETCDF_GRID(HFILENAME,HNCVARNAME)
!     ####################
!
USE MODD_SURFEX_MPI, ONLY : WLOG_MPI, NRANK, NPIO, NPROC, NCOMM
USE MODD_HORIBL, ONLY : LGLOBLON, LGLOBS, LGLOBN, XILO1H, XILO2H, NINLOH, &
                        XLA, XOLA, XOLO, NP, XLOPH, NO
USE MODD_PREP,       ONLY : XLAT_OUT, XLON_OUT, LINTERP, XX_OUT, XY_OUT
!
USE MODD_GRID_LATLONREGUL
USE MODD_SURF_PAR
!
USE MODI_HORIBL_SURF_INIT
USE MODI_HORIBL_SURF_COEF
!
USE NETCDF
!
IMPLICIT NONE
!
#ifdef SFX_MPI
INCLUDE "mpif.h"
#endif
!
 CHARACTER(LEN=28), INTENT(IN) :: HFILENAME   ! Name of the field file.
 CHARACTER(LEN=28), INTENT(IN) :: HNCVARNAME  ! Name of variable to read in netcdf file
!
integer :: status
integer :: kcdf_id
integer :: INBVARS
character(len=80) :: HACTION
character(len=80),DIMENSION(:),ALLOCATABLE :: YVARNAME
integer,DIMENSION(:),ALLOCATABLE :: NVARDIMID
integer ::JLOOP1,JLOOP
integer ::ID_VARTOGET,ID_VARTOGET1,ID_VARTOGET2
integer ::INVARDIMS
integer,DIMENSION(3) ::INDIMLEN
character(LEN=80),DIMENSION(3) :: NDIMNAM
integer :: IDIM
integer :: INLON
INTEGER :: IINLA, INO
real :: ZZLAMISS,ZZLOMISS
INTEGER :: INFOMPI
REAL(KIND=JPRB) :: ZHOOK_HANDLE
!
!
IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:PREP_NETCDF_GRID',0,ZHOOK_HANDLE)
NINLAT  =-NUNDEF
NINDEPTH=-NUNDEF
NILENGTH=-NUNDEF
!
XILAT1=XUNDEF
XILON1=XUNDEF
XILAT2=XUNDEF
XILON2=XUNDEF
!*    1.      Open the netcdf file 
!             --------------------
IF (NRANK==NPIO) THEN

  HACTION='open netcdf'
  status=NF90_OPEN(HFILENAME,nf90_nowrite,kcdf_id)
  !write(0,*) 'identifiant de ',HFILENAME,'=',kcdf_id
  if (status/=NF90_NOERR) then 
    CALL HANDLE_ERR_MER(status,HACTION)
 !else
  !   write(0,*) 'netcdf file opened: ',HFILENAME
  !
  !-----------
  !
  !*    2.      get the number of variables in netcdf file 
  !             ------------------------------------------
  HACTION='get number of variables'
  status=NF90_INQUIRE(kcdf_id,NVARIABLES=INBVARS)
  if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
  !write(0,*) 'nb vars', INBVARS
  ALLOCATE(YVARNAME(INBVARS))
  !
  !-----------
  !
  !*    3.      get the variables names in netcdf file 
  !             --------------------------------------
  ID_VARTOGET1=0
  ID_VARTOGET2=0
  DO JLOOP1=1,INBVARS
    HACTION='get variables  names'
    status=NF90_INQUIRE_VARIABLE(kcdf_id,JLOOP1,NAME=YVARNAME(JLOOP1))
    if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
    !write(0,*) 'var',JLOOP1,' name: ',YVARNAME(JLOOP1)
    if (YVARNAME(JLOOP1)==HNCVARNAME) then
      !write(0,*) 'var',JLOOP1,' corresponding to variable required'
      ID_VARTOGET1=JLOOP1
    endif
    if (YVARNAME(JLOOP1)/=HNCVARNAME) then
      if((LGT(TRIM(YVARNAME(JLOOP1)),TRIM(HNCVARNAME))).AND.&
             (SCAN(TRIM(YVARNAME(JLOOP1)),TRIM(HNCVARNAME))==1)) then  
        !write(0,*) 'var',JLOOP1,YVARNAME(JLOOP1),' could correspond to variable required ?'
        !write(0,*) HNCVARNAME,' is variable required; only ',YVARNAME(JLOOP1),' found'
        ID_VARTOGET2=JLOOP1
      endif
  ENDDO
  DEALLOCATE(YVARNAME)
  if (ID_VARTOGET1/=0) then
    ID_VARTOGET=ID_VARTOGET1
  else
    ID_VARTOGET=ID_VARTOGET2
  !
  if (ID_VARTOGET==0) then
    HACTION='close netcdf'
    status=nf90_close(kcdf_id)
    if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
  endif
  !  
ENDIF
!
IF (NPROC>1) THEN
#ifdef SFX_MPI
  CALL MPI_BCAST(ID_VARTOGET,KIND(ID_VARTOGET)/4,MPI_INTEGER,NPIO,NCOMM,INFOMPI)
#endif
ENDIF
!
if (ID_VARTOGET==0) then
  IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:PREP_NETCDF_GRID',1,ZHOOK_HANDLE)
  RETURN
endif
!
NILENGTH=0
IF (NRANK==NPIO) THEN
  !
  !-----------
  !
  !*    4.      get the total dimension of HNCVARNAME 
  !             -------------------------------------
  !
  !     4.1      get the variable dimensions number
  !             -----------------------------------
  !
  HACTION='get variable dimensions number'
  status=nf90_inquire_variable(kcdf_id,ID_VARTOGET,NDIMS=INVARDIMS)
  if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
  !write(0,*) 'variable dimensions number = ',INVARDIMS
  ALLOCATE(NVARDIMID(INVARDIMS))
  HACTION='get variable dimensions identifiant'
  status=nf90_inquire_variable(kcdf_id,ID_VARTOGET,DIMIDS=NVARDIMID)
  if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
  !
  !     4.2      get the variable dimensions length
  !              ----------------------------------
  SELECT CASE (INVARDIMS)
  !CAS 1D
    CASE (1) 
      HACTION='get variable dimensions length'
      status=nf90_inquire_dimension(kcdf_id,NVARDIMID(1),LEN=IDIM)
      if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
  !
  !CAS 2D,3D
    CASE (2,3)
      DO JLOOP=1,INVARDIMS
        HACTION='get variable dimensions length'
        status=nf90_inquire_dimension(kcdf_id,NVARDIMID(JLOOP),LEN=INDIMLEN(JLOOP))
        if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
        HACTION='get variable dimensions names'
        status=nf90_inquire_dimension(kcdf_id,NVARDIMID(JLOOP),NAME=NDIMNAM(JLOOP))
        if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
        if ((NDIMNAM(JLOOP)=='lat').OR.(NDIMNAM(JLOOP)=='latitude')) then
          NINLAT=INDIMLEN(JLOOP)
          if (.not.allocated(XILATARRAY)) allocate(XILATARRAY(INDIMLEN(JLOOP)))
          if (.not.allocated(NINLON)) allocate(NINLON(NINLAT))
          CALL GET1DCDF(kcdf_id,NVARDIMID(JLOOP),ZZLAMISS,XILATARRAY(:))
        endif
        if ((NDIMNAM(JLOOP)=='lon').OR.(NDIMNAM(JLOOP)=='longitude')) then
          INLON=INDIMLEN(JLOOP)
          if (.not.allocated(XILONARRAY)) allocate(XILONARRAY(INDIMLEN(JLOOP)))
          CALL GET1DCDF(kcdf_id,NVARDIMID(JLOOP),ZZLOMISS,XILONARRAY(:))
        endif
        if (NDIMNAM(JLOOP)=='depth') NINDEPTH=INDIMLEN(JLOOP)
      ENDDO
      NINLON(:)=INLON
  END SELECT
  !-----------
  !*    10.     Close the netcdf file 
  !             ---------------------
  HACTION='close netcdf'
  status=nf90_close(kcdf_id)
  if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
  !write(0,*) 'OK: netcdf file closed: ',HFILENAME
  !
ENDIF
!
IF (NPROC>1) THEN
#ifdef SFX_MPI
  CALL MPI_BCAST(NINLAT,KIND(NINLAT)/4,MPI_INTEGER,NPIO,NCOMM,INFOMPI)
  CALL MPI_BCAST(INLON,KIND(INLON)/4,MPI_INTEGER,NPIO,NCOMM,INFOMPI)
  IF (NRANK/=NPIO) THEN
    ALLOCATE(NINLON(NINLAT))
    ALLOCATE(XILATARRAY(NINLAT))
    ALLOCATE(XILONARRAY(INLON))
  ENDIF
  CALL MPI_BCAST(NINLON,SIZE(NINLON)*KIND(NINLON)/4,MPI_INTEGER,NPIO,NCOMM,INFOMPI)
  CALL MPI_BCAST(XILATARRAY,SIZE(XILATARRAY)*KIND(XILATARRAY)/4,MPI_REAL,NPIO,NCOMM,INFOMPI)
  CALL MPI_BCAST(XILONARRAY,SIZE(XILONARRAY)*KIND(XILONARRAY)/4,MPI_REAL,NPIO,NCOMM,INFOMPI)
#endif 
ENDIF
!
!-----------
!GRID PARAM FOR HORIBL_SURF
NILENGTH=0
DO JLOOP1=1,NINLAT
  NILENGTH = NILENGTH + NINLON(JLOOP1)
ENDDO
XILAT1=XILATARRAY(1)
XILON1=XILONARRAY(1)
XILAT2=XILATARRAY(SIZE(XILATARRAY))
XILON2=XILONARRAY(SIZE(XILONARRAY))
!
!*    11.     Deallocate 
!             ----------
!
IF (ALLOCATED(XLAT_OUT)) THEN
  !
  INO = SIZE(XLAT_OUT)
  !
  IF (ALLOCATED(NO)) DEALLOCATE(NO)
  IF (ALLOCATED(XLA)) DEALLOCATE(XLA)
  IF (ALLOCATED(XOLA)) DEALLOCATE(XOLA)
  IF (ALLOCATED(XOLO)) DEALLOCATE(XOLO)
  IF (ALLOCATED(NINLOH)) DEALLOCATE(NINLOH)

  ALLOCATE(NO(INO,4))
  ALLOCATE(XOLA(INO),XOLO(INO))
  ALLOCATE(XLA(INO,4))
  !
  IINLA = NINLAT
  ALLOCATE(NINLOH(IINLA+4))
  CALL HORIBL_SURF_INIT(XILAT1,XILON1,XILAT2,XILON2,NINLAT,NINLON, &
                        LGLOBN,LGLOBS,NO,NINLOH,XOLA,XOLO,XILO1H,&
                        XILO2H,XLA,XILATARRAY)
  !
  IF (ALLOCATED(NP)) DEALLOCATE(NP)
  IF (ALLOCATED(XLOPH)) DEALLOCATE(XLOPH)
  ALLOCATE(NP(INO,12))
  ALLOCATE(XLOPH(INO,12))
  
  IF (LGLOBS) IINLA = IINLA + 2
  IF (LGLOBN) IINLA = IINLA + 2
  CALL HORIBL_SURF_COEF(INO,LINTERP,LGLOBLON,XILO1H,XILO2H,XOLO,&
                        NO,NINLOH(1:IINLA),NP,XLOPH)
    !
ENDIF
!
IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:PREP_NETCDF_GRID',1,ZHOOK_HANDLE)
!
END SUBROUTINE PREP_NETCDF_GRID
!------------------------------------------------------------------------------
!==============================================================================
!     ####################
       SUBROUTINE READ_Z1D_CDF(HFILENAME,HNCVARNAME,PVAL)
!     ####################
!
IMPLICIT NONE
!
 CHARACTER(LEN=28), INTENT(IN) :: HFILENAME   ! Name of the field file.
 CHARACTER(LEN=28), INTENT(IN) :: HNCVARNAME  ! Name of variable to read in netcdf file
REAL, DIMENSION(:), INTENT(OUT) :: PVAL      ! value to get
!
integer :: status
integer :: kcdf_id
integer :: NBVARS
character(len=80) :: HACTION
character(len=80),DIMENSION(:),ALLOCATABLE :: VARNAME
integer ::JLOOP1
integer ::ID_VARTOGET,ID_VARTOGET1,ID_VARTOGET2
integer ::NVARDIMS
INTEGER, DIMENSION(1) :: NDIMID
integer ::NLEN
real,DIMENSION(:),ALLOCATABLE   :: ZVALU
real :: ZMISS
REAL(KIND=JPRB) :: ZHOOK_HANDLE
!
!
!*    1.      Open the netcdf file 
!             --------------------
IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:READ_Z1D_CDF',0,ZHOOK_HANDLE)
status=-9999
kcdf_id=-9999
HACTION='open netcdf'
status=NF90_OPEN(HFILENAME,nf90_nowrite,kcdf_id)
if (status/=NF90_NOERR) then 
  CALL HANDLE_ERR_MER(status,HACTION)
endif
!-----------
!*    2.      get the number of variables in netcdf file 
!             ------------------------------------------
HACTION='get number of variables'
status=NF90_INQUIRE(kcdf_id,NVARIABLES=NBVARS)
if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
!write(0,*) 'nb vars', NBVARS
ALLOCATE(VARNAME(NBVARS))
!-----------
!*    3.      get the variables names in netcdf file 
!             --------------------------------------
ID_VARTOGET1=0
ID_VARTOGET2=0
DO JLOOP1=1,NBVARS
  HACTION='get variables  names'
  status=NF90_INQUIRE_VARIABLE(kcdf_id,JLOOP1,NAME=VARNAME(JLOOP1))
  if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
  if (VARNAME(JLOOP1)==HNCVARNAME) then
    ID_VARTOGET1=JLOOP1
  endif
  if (VARNAME(JLOOP1)/=HNCVARNAME) then
    if((LGT(TRIM(VARNAME(JLOOP1)),TRIM(HNCVARNAME))).AND.&
           (SCAN(TRIM(VARNAME(JLOOP1)),TRIM(HNCVARNAME))==1)) then  
      ID_VARTOGET2=JLOOP1
    endif
  endif
ENDDO
if (ID_VARTOGET1/=0) then
  ID_VARTOGET=ID_VARTOGET1
else
  ID_VARTOGET=ID_VARTOGET2
endif
if (ID_VARTOGET==0) then
  HACTION='close netcdf'
  status=nf90_close(kcdf_id)
  if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
  CALL ABOR1_SFX('MODE_READ_NETCDF_MERCATOR: READ_Z1D_CDF')
endif
!-----------
!*    4.      get the variable in netcdf file 
!             -------------------------------
!     4.1      get the variable dimensions number
!             -----------------------------------
HACTION='get variable dimensions number'
status=nf90_inquire_variable(kcdf_id,ID_VARTOGET,NDIMS=NVARDIMS)
if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
!
!     4.2      get the variable dimensions length and values
!            ----------------------------------------------
SELECT CASE (NVARDIMS)
!CAS 1D
  CASE (1) 
    HACTION='get variable dimensions length'
    status=nf90_inquire_variable(kcdf_id,ID_VARTOGET,DIMIDS=NDIMID)
    status=nf90_inquire_dimension(kcdf_id,NDIMID(1),LEN=NLEN)
    if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
    ALLOCATE(ZVALU(NLEN))
    !write(0,*) 'call GET1DCDF'
    CALL GET1DCDF(kcdf_id,ID_VARTOGET,ZMISS,ZVALU)
    PVAL(:)=ZVALU(:)
!CAS 2D
  CASE (2)
    write(0,*) 'YOU ARE TRYING TO READ A 2D FIELD FOR :', TRIM(HNCVARNAME)
    CALL ABOR1_SFX('MODE_READ_NETCDF_MERCATOR: READ_Z1D_CDF')
END SELECT
!-----------
!*    5.     Close the netcdf file 
!             ---------------------
HACTION='close netcdf'
status=nf90_close(kcdf_id)
if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
!-----------
!*    6.     Deallocate 
!             ----------
IF (ALLOCATED(VARNAME     ))  DEALLOCATE(VARNAME)
IF (ALLOCATED(ZVALU       ))  DEALLOCATE(ZVALU  )
!!
IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:READ_Z1D_CDF',1,ZHOOK_HANDLE)
END SUBROUTINE READ_Z1D_CDF
!------------------------------------------------------------------------------
!==============================================================================
!     ####################
       SUBROUTINE READ_LATLONVAL_CDF(HFILENAME,HNCVARNAME,PLON,PLAT,PVAL)
!     ####################
!
IMPLICIT NONE
!
 CHARACTER(LEN=28), INTENT(IN) :: HFILENAME   ! Name of the field file.
 CHARACTER(LEN=28), INTENT(IN) :: HNCVARNAME  ! Name of variable to read in netcdf file
REAL, DIMENSION(:), INTENT(OUT) :: PLON,PLAT ! Longitudes/latitudes in netcdf file 
REAL, DIMENSION(:), INTENT(OUT) :: PVAL      ! value to get
!
integer :: status
integer :: kcdf_id
integer :: NBVARS
character(len=80) :: HACTION
character(len=80),DIMENSION(:),ALLOCATABLE :: VARNAME
integer ::JLOOP1,JDIM1,JDIM2,JLOOP
integer ::ID_VARTOGET,ID_VARTOGET1,ID_VARTOGET2
integer ::NVARDIMS
integer ::NLEN
integer, dimension(1) :: NDIMID
integer,DIMENSION(2) ::NLEN2D, NDIMID2D
integer,DIMENSION(:),ALLOCATABLE :: NVARDIMID,NVARDIMLEN
character(len=80),DIMENSION(:),ALLOCATABLE :: NVARDIMNAM
real,DIMENSION(:),ALLOCATABLE   :: ZVALU
real,DIMENSION(:,:),ALLOCATABLE :: ZVALU2D
real :: ZMISS
real,DIMENSION(:),ALLOCATABLE :: ZDIM1
real,DIMENSION(:),ALLOCATABLE :: ZDIM2
character(len=80) :: YDIM1NAME,YDIM2NAME
integer :: ILONFOUND,ILATFOUND, IARG
REAL(KIND=JPRB) :: ZHOOK_HANDLE
!
!
!
!
!*    1.      Open the netcdf file 
!             --------------------
IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:READ_LATLONVAL_CDF',0,ZHOOK_HANDLE)
status=-9999
kcdf_id=-9999
HACTION='open netcdf'
status=NF90_OPEN(HFILENAME,nf90_nowrite,kcdf_id)
!write(0,*) 'status=',status
!write(0,*) 'identifiant de ',HFILENAME,'=',kcdf_id
if (status/=NF90_NOERR) then 
  CALL HANDLE_ERR_MER(status,HACTION)
!else
!  write(0,*) 'netcdf file opened: ',HFILENAME
endif
!
!-----------
!
!*    2.      get the number of variables in netcdf file 
!             ------------------------------------------
HACTION='get number of variables'
status=NF90_INQUIRE(kcdf_id,NVARIABLES=NBVARS)
if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
!write(0,*) 'nb vars', NBVARS
ALLOCATE(VARNAME(NBVARS))
!
!-----------
!
!*    3.      get the variables names in netcdf file 
!             --------------------------------------
ID_VARTOGET1=0
ID_VARTOGET2=0
DO JLOOP1=1,NBVARS
  HACTION='get variables  names'
  status=NF90_INQUIRE_VARIABLE(kcdf_id,JLOOP1,NAME=VARNAME(JLOOP1))
  if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
  !write(0,*) 'var',JLOOP1,' name: ',VARNAME(JLOOP1)
  if (VARNAME(JLOOP1)==HNCVARNAME) then
    !write(0,*) 'var',JLOOP1,' corresponding to variable required'
    ID_VARTOGET1=JLOOP1
  endif
  if (VARNAME(JLOOP1)/=HNCVARNAME) then
    if((LGT(TRIM(VARNAME(JLOOP1)),TRIM(HNCVARNAME))).AND.&
           (SCAN(TRIM(VARNAME(JLOOP1)),TRIM(HNCVARNAME))==1)) then  
      !write(0,*) 'var',JLOOP1,VARNAME(JLOOP1),' could correspond to variable required ?'
      !write(0,*) HNCVARNAME,' is variable required; only ',VARNAME(JLOOP1),' found'
      ID_VARTOGET2=JLOOP1
    endif
  endif
ENDDO
if (ID_VARTOGET1/=0) then
  ID_VARTOGET=ID_VARTOGET1
else
  ID_VARTOGET=ID_VARTOGET2
endif
if (ID_VARTOGET==0) then
  HACTION='close netcdf'
  status=nf90_close(kcdf_id)
  if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
  CALL ABOR1_SFX('MODE_READ_NETCDF_MERCATOR: READ_LATLONVAL_CDF')
endif
!-----------
!
!*    4.      get the variable in netcdf file 
!             -------------------------------
!
!     4.1      get the variable dimensions number
!             -----------------------------------
!
HACTION='get variable dimensions number'
status=nf90_inquire_variable(kcdf_id,ID_VARTOGET,NDIMS=NVARDIMS)
if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
!write(0,*) 'variable dimensions number = ',NVARDIMS
!
!     4.2      get the variable dimensions length and values
!              ----------------------------------------------
SELECT CASE (NVARDIMS)
!CAS 1D
  CASE (1) 
    HACTION='get variable dimensions length'
    status=nf90_inquire_variable(kcdf_id,ID_VARTOGET,DIMIDS=NDIMID)
    status=nf90_inquire_dimension(kcdf_id,NDIMID(1),LEN=NLEN)
    if (status/=NF90_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
    ALLOCATE(ZVALU(NLEN))
    !write(0,*) 'call GET1DCDF'
    CALL GET1DCDF(kcdf_id,ID_VARTOGET,ZMISS,ZVALU)
    PVAL(:)=ZVALU(:)
!CAS 2D