SURFEX v7.3
General documentation of Surfex
 All Classes Files Functions Variables Typedefs
/home/dasprezs/EXPORT_v7_3/src/SURFEX/mode_read_netcdf_mercator.F90
Go to the documentation of this file.
00001 MODULE MODE_READ_NETCDF_MERCATOR
00002 !!!=============================================================================
00003 !-------------------------------------------------------------------------------
00004 !
00005 !
00006 USE MODI_ABOR1_SFX
00007 !
00008 USE YOMHOOK   ,ONLY : LHOOK,   DR_HOOK
00009 USE PARKIND1  ,ONLY : JPRB
00010 !
00011 CONTAINS
00012 !-------------------------------------------------------------------
00013 !-------------------------------------------------------------------
00014 !     ####################
00015       SUBROUTINE HANDLE_ERR_MER(status,line)
00016 !     ####################
00017 IMPLICIT NONE
00018 INTEGER, INTENT(IN)           :: status
00019  CHARACTER(LEN=80), INTENT(IN) :: line
00020 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00021 !
00022 include 'netcdf.inc'
00023 !
00024 IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:HANDLE_ERR_MER',0,ZHOOK_HANDLE)
00025 IF (status /= NF_NOERR) THEN
00026   CALL ABOR1_SFX('MODE_READ_NETCDF_MERCATOR: HANDLE_ERR_MER')
00027 END IF
00028 IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:HANDLE_ERR_MER',1,ZHOOK_HANDLE)
00029 END SUBROUTINE HANDLE_ERR_MER
00030 !-------------------------------------------------------------------
00031 !-------------------------------------------------------------------
00032 !     ####################
00033       SUBROUTINE GET1DCDF(KCDF_ID,IDVAR,PMISSVALUE,PVALU1D)
00034 !     ####################
00035 !
00036 IMPLICIT NONE
00037 !
00038 INTEGER,INTENT(IN) :: KCDF_ID !netcdf file identifiant
00039 INTEGER,INTENT(IN) :: IDVAR   !variable to read identifiant
00040 REAL, INTENT(OUT) ::  PMISSVALUE !undefined value
00041 REAL,DIMENSION(:),INTENT(OUT) :: PVALU1D !value array
00042 !
00043 integer :: status
00044 character(len=80) :: HACTION
00045 integer,save :: NDIMS=1
00046 integer :: KVARTYPE
00047 integer,DIMENSION(:),ALLOCATABLE :: NVARDIMID,NVARDIMLEN
00048 character(len=80),DIMENSION(:),ALLOCATABLE :: NVARDIMNAM
00049 integer :: JLOOP
00050 integer :: NGATTS   
00051 character(len=80),DIMENSION(:),ALLOCATABLE :: HNAME
00052 REAL,DIMENSION(:),ALLOCATABLE :: ZVALU1D !value array
00053 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00054 !
00055 include 'netcdf.inc'
00056 !
00057 IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:GET1DCDF',0,ZHOOK_HANDLE)
00058 PMISSVALUE=-9999.9
00059 ALLOCATE(NVARDIMID (NDIMS))
00060 ALLOCATE(NVARDIMLEN(NDIMS))
00061 ALLOCATE(NVARDIMNAM(NDIMS))
00062 NVARDIMID (:)=0
00063 NVARDIMLEN(:)=0
00064 NVARDIMNAM(:)=' '
00065 !
00066 HACTION='get variable type'
00067 status=nf_inq_vartype(KCDF_ID,IDVAR,KVARTYPE)
00068 if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00069 !write(0,*) 'variable type = ',KVARTYPE
00070 !
00071 HACTION='get variable dimensions name'
00072 status=nf_inq_dimname(KCDF_ID,IDVAR,NVARDIMNAM(NDIMS))
00073 if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00074 !
00075 HACTION='get variable dimensions length'
00076 status=nf_inq_dimlen(KCDF_ID,IDVAR,NVARDIMLEN(NDIMS))
00077 if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00078 !write(0,*) 'variable dimension ',NDIMS,' named ',NVARDIMNAM(NDIMS),&
00079 !     &'has a length of',NVARDIMLEN(NDIMS)
00080 !!
00081 HACTION='get attributs'
00082 status=nf_inq_varnatts(KCDF_ID,IDVAR,NGATTS)
00083 if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00084 !write(0,*) 'number of attributes = ',NGATTS
00085 allocate(hname(1:NGATTS))
00086 !
00087 ALLOCATE(ZVALU1D(1:NVARDIMLEN(NDIMS)))
00088 ZVALU1D=0.
00089 !
00090 IF (KVARTYPE>=5) then
00091   HACTION='get variable values (1D)'
00092   status=nf_get_var_double(KCDF_ID,IDVAR,ZVALU1D(:))
00093   if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00094 ENDIF
00095 !
00096 PVALU1D(:)=ZVALU1D(:)
00097 !
00098 IF (ALLOCATED(ZVALU1D  ))  DEALLOCATE(ZVALU1D)
00099 IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:GET1DCDF',1,ZHOOK_HANDLE)
00100 !
00101 END SUBROUTINE GET1DCDF
00102 !-------------------------------------------------------------------
00103 !-------------------------------------------------------------------
00104 !     ####################
00105       SUBROUTINE GET2DCDF(KCDF_ID,IDVAR,PDIM1,HDIM1NAME,PDIM2,HDIM2NAME,&
00106              PMISSVALUE,PVALU2D)  
00107 !     ####################
00108 USE MODD_SURF_PAR,         ONLY : XUNDEF
00109 !
00110 IMPLICIT NONE
00111 !
00112 INTEGER,INTENT(IN) :: KCDF_ID !netcdf file identifiant
00113 INTEGER,INTENT(IN) :: IDVAR   !variable to read identifiant
00114 REAL,DIMENSION(:),INTENT(OUT) :: PDIM1,PDIM2 !dimensions for PVALU2D array
00115  CHARACTER(len=80),INTENT(OUT) :: HDIM1NAME,HDIM2NAME     !dimensions names
00116 REAL, INTENT(OUT) :: PMISSVALUE
00117 REAL,DIMENSION(:,:),INTENT(OUT) :: PVALU2D !value array
00118 !
00119 integer :: status
00120 character(len=80) :: HACTION
00121 integer,save :: NDIMS=2
00122 integer :: KVARTYPE
00123 integer,DIMENSION(:),ALLOCATABLE :: NVARDIMID,NVARDIMLEN
00124 character(len=80),DIMENSION(:),ALLOCATABLE :: NVARDIMNAM
00125 integer :: JLOOP2, JLOOP, J1, J2
00126 integer :: NGATTS   
00127 character(len=80),DIMENSION(:),ALLOCATABLE :: HNAME
00128 real :: ZMISS1,ZMISS2
00129 real :: ZSCFA, ZOFFS
00130 REAL,DIMENSION(:,:),ALLOCATABLE :: ZVALU2D !value array
00131 INTEGER,DIMENSION(:,:),ALLOCATABLE :: IVALU2D
00132 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00133 !
00134 include 'netcdf.inc'
00135 !
00136 IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:GET2DCDF',0,ZHOOK_HANDLE)
00137 PMISSVALUE=-9999.9 
00138 ALLOCATE(NVARDIMID (NDIMS))
00139 ALLOCATE(NVARDIMLEN(NDIMS))
00140 ALLOCATE(NVARDIMNAM(NDIMS))
00141 NVARDIMID (:)=0
00142 NVARDIMLEN(:)=0
00143 NVARDIMNAM(:)=' '
00144 !
00145 HACTION='get variable type'
00146 status=nf_inq_vartype(KCDF_ID,IDVAR,KVARTYPE)
00147 if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00148 !write(0,*) 'variable type = ',KVARTYPE
00149 !
00150 HACTION='get variable dimensions identifiant'
00151 status=nf_inq_vardimid(KCDF_ID,IDVAR,NVARDIMID)
00152 if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00153 !
00154 HACTION='get attributs'
00155 status=nf_inq_varnatts(KCDF_ID,IDVAR,NGATTS)
00156 if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00157 !write(0,*) 'number of attributes = ',NGATTS
00158 allocate(hname(1:NGATTS))
00159 !
00160 ZSCFA=1.
00161 ZOFFS=0.
00162 DO JLOOP=1,NGATTS
00163   status=nf_inq_attname(KCDF_ID,IDVAR,JLOOP,hname(JLOOP))
00164   if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00165   !write(0,*) 'attributes names = ', hname(JLOOP)
00166   if (TRIM(hname(JLOOP))=='missing_value') then
00167     !write(0,*) 'missing value search '
00168     HACTION='get missing value'
00169     status=nf_get_att_double(KCDF_ID,IDVAR,"missing_value",PMISSVALUE)
00170     if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00171     !write(0,*) 'missing value = ',PMISSVALUE
00172   else
00173     if (TRIM(hname(JLOOP))=='_FillValue') then
00174       !write(0,*) 'missing value found '
00175       HACTION='get _FillValue'
00176       status=nf_get_att_double(KCDF_ID,IDVAR,"_FillValue",PMISSVALUE)
00177       if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00178       !write(0,*) 'missing value = ',PMISSVALUE
00179     endif    
00180   endif
00181   if (TRIM(hname(JLOOP))=='scale_factor') then
00182     !write(0,*) 'missing value found '
00183     HACTION='get scale factor'
00184     status=nf_get_att_double(KCDF_ID,IDVAR,"scale_factor",ZSCFA)
00185     if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00186     !write(0,*) 'missing value = ',PMISSVALUE
00187   endif   
00188   if (TRIM(hname(JLOOP))=='add_offset') then
00189     !write(0,*) 'missing value found '
00190     HACTION='get offset'
00191     status=nf_get_att_double(KCDF_ID,IDVAR,"add_offset",ZOFFS)
00192     if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00193     !write(0,*) 'missing value = ',PMISSVALUE
00194   endif    
00195 ENDDO
00196 !
00197 !
00198 DO JLOOP2=1,NDIMS
00199   HACTION='get variable dimensions name'
00200   status=nf_inq_dimname(KCDF_ID,NVARDIMID(JLOOP2),NVARDIMNAM(JLOOP2))
00201   if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00202   HACTION='get variable dimensions length'
00203   status=nf_inq_dimlen(KCDF_ID,NVARDIMID(JLOOP2),NVARDIMLEN(JLOOP2))
00204   if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00205   !write(0,*) 'variable dimension ',JLOOP2,' named ',NVARDIMNAM(JLOOP2),&
00206   !     &'has a length of',NVARDIMLEN(JLOOP2)
00207 ENDDO
00208 ! 
00209 IF (KVARTYPE>=5) then
00210   ALLOCATE(ZVALU2D(1:NVARDIMLEN(1),1:NVARDIMLEN(2)))
00211   ZVALU2D=0.        
00212   HACTION='get variable values (2D)'
00213   status=nf_get_var_double(KCDF_ID,IDVAR,ZVALU2D(:,:))
00214   if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00215 ELSE
00216   ALLOCATE(IVALU2D(1:NVARDIMLEN(1),1:NVARDIMLEN(2)))
00217   IVALU2D=0.         
00218   HACTION='get variable values (2D)'
00219   status=nf_get_var_int(KCDF_ID,IDVAR,IVALU2D(:,:))
00220   if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)  
00221 ENDIF
00222 PVALU2D(:,:)=XUNDEF
00223 DO J1=1,NVARDIMLEN(1)
00224   DO J2=1,NVARDIMLEN(2)
00225     IF (KVARTYPE>=5) THEN
00226       IF (ZVALU2D(J1,J2)/=PMISSVALUE) PVALU2D(J1,J2)=ZVALU2D(J1,J2)*ZSCFA+ZOFFS
00227     ELSE
00228       IF (ZVALU2D(J1,J2)/=PMISSVALUE) PVALU2D(J1,J2)=IVALU2D(J1,J2)*ZSCFA+ZOFFS
00229     ENDIF
00230   ENDDO
00231 ENDDO
00232 !
00233  CALL GET1DCDF(KCDF_ID,NVARDIMID(1),ZMISS1,PDIM1)
00234  CALL GET1DCDF(KCDF_ID,NVARDIMID(2),ZMISS2,PDIM2)
00235 HDIM1NAME=NVARDIMNAM(1)
00236 HDIM2NAME=NVARDIMNAM(2)
00237 IF (ALLOCATED(ZVALU2D  ))  DEALLOCATE(ZVALU2D)
00238 IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:GET2DCDF',1,ZHOOK_HANDLE)
00239 !
00240 END SUBROUTINE GET2DCDF
00241 !-------------------------------------------------------------------
00242 !-------------------------------------------------------------------
00243 !     ####################
00244       SUBROUTINE GET3DCDF(KCDF_ID,IDVAR,PDIM1,HDIM1NAME,PDIM2,HDIM2NAME,&
00245              PDIM3,HDIM3NAME,PMISSVALUE,PVALU3D)  
00246 !     ####################
00247 USE MODD_SURF_PAR,         ONLY : XUNDEF
00248 !
00249 IMPLICIT NONE
00250 !
00251 INTEGER,INTENT(IN) :: KCDF_ID !netcdf file identifiant
00252 INTEGER,INTENT(IN) :: IDVAR   !variable to read identifiant
00253 REAL,DIMENSION(:),INTENT(OUT) :: PDIM1,PDIM2,PDIM3 !dimensions for PVALU2D array
00254  CHARACTER(len=80),INTENT(OUT) :: HDIM1NAME,HDIM2NAME,HDIM3NAME    !dimensions names
00255 REAL, INTENT(OUT) :: PMISSVALUE
00256 REAL,DIMENSION(:,:,:),INTENT(OUT) :: PVALU3D !value array
00257 !
00258 integer :: status
00259 character(len=80) :: HACTION
00260 integer,save :: NDIMS=3
00261 integer :: KVARTYPE
00262 integer,DIMENSION(:),ALLOCATABLE :: NVARDIMID,NVARDIMLEN
00263 character(len=80),DIMENSION(:),ALLOCATABLE :: NVARDIMNAM
00264 integer :: JLOOP2, JLOOP
00265 integer :: J1,J2,J3
00266 integer :: NGATTS   
00267 character(len=80),DIMENSION(:),ALLOCATABLE :: HNAME
00268 real :: ZMISS1,ZMISS2,ZMISS3
00269 real :: ZSCFA, ZOFFS
00270 REAL,DIMENSION(:,:,:),ALLOCATABLE :: ZVALU3D !value array
00271 INTEGER,DIMENSION(:,:,:),ALLOCATABLE :: IVALU3D
00272 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00273 !
00274 include 'netcdf.inc'
00275 !
00276 IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:GET3DCDF',0,ZHOOK_HANDLE)
00277 PMISSVALUE=-9999.9 
00278 ALLOCATE(NVARDIMID (NDIMS))
00279 ALLOCATE(NVARDIMLEN(NDIMS))
00280 ALLOCATE(NVARDIMNAM(NDIMS))
00281 NVARDIMID (:)=0
00282 NVARDIMLEN(:)=0
00283 NVARDIMNAM(:)=' '
00284 !
00285 HACTION='get variable type'
00286 status=nf_inq_vartype(KCDF_ID,IDVAR,KVARTYPE)
00287 if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00288 !write(0,*) 'variable type = ',KVARTYPE
00289 !
00290 HACTION='get variable dimensions identifiant'
00291 status=nf_inq_vardimid(KCDF_ID,IDVAR,NVARDIMID)
00292 if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00293 !write(0,*) 'variable dimension identifiant ',NVARDIMID
00294 !
00295 HACTION='get attributs'
00296 status=nf_inq_varnatts(KCDF_ID,IDVAR,NGATTS)
00297 if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00298 !write(0,*) 'number of attributes = ',NGATTS
00299 allocate(hname(1:NGATTS))
00300 !
00301 ZSCFA=1.
00302 ZOFFS=0.
00303 DO JLOOP=1,NGATTS
00304   status=nf_inq_attname(KCDF_ID,IDVAR,JLOOP,hname(JLOOP))
00305   if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00306   !write(0,*) 'attributes names = ', hname(JLOOP)
00307   if (TRIM(hname(JLOOP))=='missing_value') then
00308     !write(0,*) 'missing value found '
00309     HACTION='get missing value'
00310     status=nf_get_att_double(KCDF_ID,IDVAR,"missing_value",PMISSVALUE)
00311     if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00312     !write(0,*) 'missing value = ',PMISSVALUE
00313   else
00314     if (TRIM(hname(JLOOP))=='_FillValue') then
00315       !write(0,*) 'missing value found '
00316       HACTION='get _FillValue'
00317       status=nf_get_att_double(KCDF_ID,IDVAR,"_FillValue",PMISSVALUE)
00318       if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00319       !write(0,*) 'missing value = ',PMISSVALUE
00320     endif
00321   endif
00322   if (TRIM(hname(JLOOP))=='scale_factor') then
00323     !write(0,*) 'missing value found '
00324     HACTION='get scale factor'
00325     status=nf_get_att_double(KCDF_ID,IDVAR,"scale_factor",ZSCFA)
00326     if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00327     !write(0,*) 'missing value = ',PMISSVALUE
00328   endif  
00329   if (TRIM(hname(JLOOP))=='add_offset') then
00330     !write(0,*) 'missing value found '
00331     HACTION='get offset'
00332     status=nf_get_att_double(KCDF_ID,IDVAR,"add_offset",ZOFFS)
00333     if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00334     !write(0,*) 'missing value = ',PMISSVALUE
00335   endif 
00336 ENDDO
00337 !
00338 !
00339 DO JLOOP2=1,NDIMS
00340   HACTION='get variable dimensions name'
00341   status=nf_inq_dimname(KCDF_ID,NVARDIMID(JLOOP2),NVARDIMNAM(JLOOP2))
00342   if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00343   HACTION='get variable dimensions length'
00344   status=nf_inq_dimlen(KCDF_ID,NVARDIMID(JLOOP2),NVARDIMLEN(JLOOP2))
00345   if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00346   !write(0,*) 'variable dimension ',JLOOP2,' named ',NVARDIMNAM(JLOOP2),&
00347   !     &'has a length of',NVARDIMLEN(JLOOP2)
00348 ENDDO
00349 ! 
00350 IF (KVARTYPE>=5) then
00351   ALLOCATE(ZVALU3D(1:NVARDIMLEN(1),1:NVARDIMLEN(2),1:NVARDIMLEN(3)))
00352   ZVALU3D=0.        
00353   HACTION='get variable values (3D)'
00354   status=nf_get_var_double(KCDF_ID,IDVAR,ZVALU3D(:,:,:))
00355   if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00356 ELSE
00357   ALLOCATE(IVALU3D(1:NVARDIMLEN(1),1:NVARDIMLEN(2),1:NVARDIMLEN(3)))
00358   IVALU3D=0.         
00359   HACTION='get variable values (3D)'
00360   status=nf_get_var_int(KCDF_ID,IDVAR,IVALU3D(:,:,:))
00361   if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00362 ENDIF
00363 !
00364 PVALU3D(:,:,:)=XUNDEF
00365 DO J1=1,NVARDIMLEN(1)
00366   DO J2=1,NVARDIMLEN(2)
00367     DO J3=1,NVARDIMLEN(3)
00368       IF (KVARTYPE>=5) THEN
00369         IF (ZVALU3D(J1,J2,J3)/=PMISSVALUE) PVALU3D(J1,J2,J3)=ZVALU3D(J1,J2,J3)*ZSCFA+ZOFFS
00370       ELSE
00371         IF (IVALU3D(J1,J2,J3)/=PMISSVALUE) PVALU3D(J1,j2,J3)=IVALU3D(J1,J2,J3)*ZSCFA+ZOFFS
00372       ENDIF
00373     ENDDO
00374   ENDDO
00375 ENDDO
00376 !
00377  CALL GET1DCDF(KCDF_ID,NVARDIMID(1),ZMISS1,PDIM1)
00378  CALL GET1DCDF(KCDF_ID,NVARDIMID(2),ZMISS2,PDIM2)
00379  CALL GET1DCDF(KCDF_ID,NVARDIMID(3),ZMISS3,PDIM3)
00380 HDIM1NAME=NVARDIMNAM(1)
00381 HDIM2NAME=NVARDIMNAM(2)
00382 HDIM3NAME=NVARDIMNAM(3)
00383 IF (ALLOCATED(ZVALU3D  ))  DEALLOCATE(ZVALU3D)
00384 IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:GET3DCDF',1,ZHOOK_HANDLE)
00385 !
00386 END SUBROUTINE GET3DCDF
00387 !--------------------------------------------------------------------
00388 !-------------------------------------------------------------------
00389 !------------------------------------------------------------------------------
00390 !==============================================================================
00391 !     ####################
00392        SUBROUTINE READ_DIM_CDF(HFILENAME,HNCVARNAME,KDIM)
00393 !     ####################
00394 !
00395 IMPLICIT NONE
00396 !
00397  CHARACTER(LEN=28), INTENT(IN) :: HFILENAME   ! Name of the field file.
00398  CHARACTER(LEN=28), INTENT(IN) :: HNCVARNAME  ! Name of variable to read in netcdf file
00399 INTEGER,           INTENT(OUT):: KDIM        ! value of dimension to get
00400 !
00401 integer :: status
00402 integer :: kcdf_id
00403 integer :: NBVARS
00404 character(len=80) :: HACTION
00405 character(len=80),DIMENSION(:),ALLOCATABLE :: VARNAME
00406 integer ::JLOOP1,JLOOP
00407 integer ::ID_VARTOGET,ID_VARTOGET1,ID_VARTOGET2
00408 integer ::NVARDIMS
00409 integer,DIMENSION(2) ::NLEN2D
00410 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00411 !
00412 include 'netcdf.inc'
00413 !
00414 !*    1.      Open the netcdf file 
00415 !             --------------------
00416 IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:READ_DIM_CDF',0,ZHOOK_HANDLE)
00417 HACTION='open netcdf'
00418 status=NF_OPEN(HFILENAME,nf_nowrite,kcdf_id)
00419 !write(0,*) 'identifiant de ',HFILENAME,'=',kcdf_id
00420 if (status/=NF_NOERR) then 
00421   CALL HANDLE_ERR_MER(status,HACTION)
00422 !else
00423 !  write(0,*) 'netcdf file opened: ',HFILENAME
00424 endif
00425 !
00426 !-----------
00427 !
00428 !*    2.      get the number of variables in netcdf file 
00429 !             ------------------------------------------
00430 HACTION='get number of variables'
00431 status=NF_INQ_NVARS(kcdf_id,NBVARS)
00432 if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00433 !write(0,*) 'nb vars', NBVARS
00434 ALLOCATE(VARNAME(NBVARS))
00435 !
00436 !-----------
00437 !
00438 !*    3.      get the variables names in netcdf file 
00439 !             --------------------------------------
00440 ID_VARTOGET1=0
00441 ID_VARTOGET2=0
00442 DO JLOOP1=1,NBVARS
00443   HACTION='get variables  names'
00444   status=NF_INQ_VARNAME(kcdf_id,JLOOP1,VARNAME(JLOOP1))
00445   if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00446   !write(0,*) 'var',JLOOP1,' name: ',VARNAME(JLOOP1)
00447   if (VARNAME(JLOOP1)==HNCVARNAME) then
00448     !write(0,*) 'var',JLOOP1,' corresponding to variable required'
00449     ID_VARTOGET1=JLOOP1
00450   endif
00451   if (VARNAME(JLOOP1)/=HNCVARNAME) then
00452     if((LGT(TRIM(VARNAME(JLOOP1)),TRIM(HNCVARNAME))).AND.&
00453            (SCAN(TRIM(VARNAME(JLOOP1)),TRIM(HNCVARNAME))==1)) then  
00454       !write(0,*) 'var',JLOOP1,VARNAME(JLOOP1),' could correspond to variable required ?'
00455       !write(0,*) HNCVARNAME,' is variable required; only ',VARNAME(JLOOP1),' found'
00456       ID_VARTOGET2=JLOOP1
00457     endif
00458   endif
00459 ENDDO
00460 if (ID_VARTOGET1/=0) then
00461   ID_VARTOGET=ID_VARTOGET1
00462 else
00463   ID_VARTOGET=ID_VARTOGET2
00464 endif
00465 if (ID_VARTOGET==0) then
00466   HACTION='close netcdf'
00467   status=nf_close(kcdf_id)
00468   if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00469   CALL ABOR1_SFX('MODE_READ_NETCDF_MERCATOR: READ_DIM_CDF')
00470 endif
00471 !-----------
00472 !
00473 !*    4.      get the total dimension of HNCVARNAME 
00474 !             -------------------------------------
00475 !
00476 !     4.1      get the variable dimensions number
00477 !             -----------------------------------
00478 !
00479 HACTION='get variable dimensions number'
00480 status=nf_inq_varndims(kcdf_id,ID_VARTOGET,NVARDIMS)
00481 if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00482 !write(0,*) 'variable dimensions number = ',NVARDIMS
00483 !
00484 !     4.2      get the variable dimensions length
00485 !              ----------------------------------
00486 SELECT CASE (NVARDIMS)
00487 !CAS 1D
00488   CASE (1) 
00489     HACTION='get variable dimensions length'
00490     status=nf_inq_dimlen(kcdf_id,NVARDIMS,KDIM)
00491     if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00492 !
00493 !CAS 2D
00494   CASE (2)
00495     KDIM=1
00496     DO JLOOP=1,NVARDIMS
00497       HACTION='get variable dimensions length'
00498       status=nf_inq_dimlen(kcdf_id,JLOOP,NLEN2D(JLOOP))
00499       if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00500       KDIM=KDIM*NLEN2D(JLOOP)
00501     ENDDO
00502 END SELECT
00503 !-----------
00504 !*    10.     Close the netcdf file 
00505 !             ---------------------
00506 HACTION='close netcdf'
00507 status=nf_close(kcdf_id)
00508 if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00509 !write(0,*) 'OK: netcdf file closed: ',HFILENAME
00510 !
00511 !-----------
00512 !*    11.     Deallocate 
00513 !             ----------
00514 IF (ALLOCATED(VARNAME     ))  DEALLOCATE(VARNAME)
00515 IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:READ_DIM_CDF',1,ZHOOK_HANDLE)
00516 !
00517 END SUBROUTINE READ_DIM_CDF
00518 !-------------------------------------------------------------------
00519 !-------------------------------------------------------------------
00520 !     ####################
00521        SUBROUTINE PREP_NETCDF_GRID(HFILENAME,HNCVARNAME)
00522 !     ####################
00523 !
00524 USE MODD_GRID_LATLONREGUL
00525 USE MODD_SURF_PAR
00526 !
00527 IMPLICIT NONE
00528 !
00529  CHARACTER(LEN=28), INTENT(IN) :: HFILENAME   ! Name of the field file.
00530  CHARACTER(LEN=28), INTENT(IN) :: HNCVARNAME  ! Name of variable to read in netcdf file
00531 !
00532 integer :: status
00533 integer :: kcdf_id
00534 integer :: NBVARS
00535 character(len=80) :: HACTION
00536 character(len=80),DIMENSION(:),ALLOCATABLE :: VARNAME
00537 integer,DIMENSION(:),ALLOCATABLE :: NVARDIMID
00538 integer ::JLOOP1,JLOOP
00539 integer ::ID_VARTOGET,ID_VARTOGET1,ID_VARTOGET2
00540 integer ::NVARDIMS
00541 integer,DIMENSION(3) ::NDIMLEN
00542 character(LEN=80),DIMENSION(3) :: NDIMNAM
00543 integer :: IDIM
00544 integer :: INLON
00545 real :: ZZLAMISS,ZZLOMISS
00546 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00547 !
00548 include 'netcdf.inc'
00549 !
00550 IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:PREP_NETCDF_GRID',0,ZHOOK_HANDLE)
00551 NINLAT  =-NUNDEF
00552 NINDEPTH=-NUNDEF
00553 NILENGTH=-NUNDEF
00554 !
00555 XILAT1=XUNDEF
00556 XILON1=XUNDEF
00557 XILAT2=XUNDEF
00558 XILON2=XUNDEF
00559 !*    1.      Open the netcdf file 
00560 !             --------------------
00561 HACTION='open netcdf'
00562 status=NF_OPEN(HFILENAME,nf_nowrite,kcdf_id)
00563 !write(0,*) 'identifiant de ',HFILENAME,'=',kcdf_id
00564 if (status/=NF_NOERR) then 
00565   CALL HANDLE_ERR_MER(status,HACTION)
00566 !else
00567 !  write(0,*) 'netcdf file opened: ',HFILENAME
00568 endif
00569 !
00570 !-----------
00571 !
00572 !*    2.      get the number of variables in netcdf file 
00573 !             ------------------------------------------
00574 HACTION='get number of variables'
00575 status=NF_INQ_NVARS(kcdf_id,NBVARS)
00576 if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00577 !write(0,*) 'nb vars', NBVARS
00578 ALLOCATE(VARNAME(NBVARS))
00579 !
00580 !-----------
00581 !
00582 !*    3.      get the variables names in netcdf file 
00583 !             --------------------------------------
00584 ID_VARTOGET1=0
00585 ID_VARTOGET2=0
00586 DO JLOOP1=1,NBVARS
00587   HACTION='get variables  names'
00588   status=NF_INQ_VARNAME(kcdf_id,JLOOP1,VARNAME(JLOOP1))
00589   if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00590   !write(0,*) 'var',JLOOP1,' name: ',VARNAME(JLOOP1)
00591   if (VARNAME(JLOOP1)==HNCVARNAME) then
00592     !write(0,*) 'var',JLOOP1,' corresponding to variable required'
00593     ID_VARTOGET1=JLOOP1
00594   endif
00595   if (VARNAME(JLOOP1)/=HNCVARNAME) then
00596     if((LGT(TRIM(VARNAME(JLOOP1)),TRIM(HNCVARNAME))).AND.&
00597            (SCAN(TRIM(VARNAME(JLOOP1)),TRIM(HNCVARNAME))==1)) then  
00598       !write(0,*) 'var',JLOOP1,VARNAME(JLOOP1),' could correspond to variable required ?'
00599       !write(0,*) HNCVARNAME,' is variable required; only ',VARNAME(JLOOP1),' found'
00600       ID_VARTOGET2=JLOOP1
00601     endif
00602   endif
00603 ENDDO
00604 if (ID_VARTOGET1/=0) then
00605   ID_VARTOGET=ID_VARTOGET1
00606 else
00607   ID_VARTOGET=ID_VARTOGET2
00608 endif
00609 if (ID_VARTOGET==0) then
00610   HACTION='close netcdf'
00611   status=nf_close(kcdf_id)
00612   if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00613   IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:PREP_NETCDF_GRID',1,ZHOOK_HANDLE)
00614   RETURN
00615 endif
00616 NILENGTH=0
00617 !-----------
00618 !
00619 !*    4.      get the total dimension of HNCVARNAME 
00620 !             -------------------------------------
00621 !
00622 !     4.1      get the variable dimensions number
00623 !             -----------------------------------
00624 !
00625 HACTION='get variable dimensions number'
00626 status=nf_inq_varndims(kcdf_id,ID_VARTOGET,NVARDIMS)
00627 if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00628 !write(0,*) 'variable dimensions number = ',NVARDIMS
00629 ALLOCATE(NVARDIMID(NVARDIMS))
00630 HACTION='get variable dimensions identifiant'
00631 status=nf_inq_vardimid(kcdf_id,ID_VARTOGET,NVARDIMID)
00632 if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00633 !
00634 !     4.2      get the variable dimensions length
00635 !              ----------------------------------
00636 SELECT CASE (NVARDIMS)
00637 !CAS 1D
00638   CASE (1) 
00639     HACTION='get variable dimensions length'
00640     status=nf_inq_dimlen(kcdf_id,NVARDIMS,IDIM)
00641     if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00642 !
00643 !CAS 2D,3D
00644   CASE (2,3)
00645     DO JLOOP=1,NVARDIMS
00646       HACTION='get variable dimensions length'
00647       status=nf_inq_dimlen(kcdf_id,NVARDIMID(JLOOP),NDIMLEN(JLOOP))
00648       if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00649       HACTION='get variable dimensions names'
00650       status=nf_inq_dimname(kcdf_id,NVARDIMID(JLOOP),NDIMNAM(JLOOP))
00651       if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00652       if ((NDIMNAM(JLOOP)=='lat').OR.(NDIMNAM(JLOOP)=='latitude')) then
00653         NINLAT=NDIMLEN(JLOOP)
00654         if (.not.allocated(XILATARRAY)) allocate(XILATARRAY(NDIMLEN(JLOOP)))
00655         if (.not.allocated(NINLON)) allocate(NINLON(NINLAT))
00656         CALL GET1DCDF(kcdf_id,NVARDIMID(JLOOP),ZZLAMISS,XILATARRAY(:))
00657       endif
00658       if ((NDIMNAM(JLOOP)=='lon').OR.(NDIMNAM(JLOOP)=='longitude')) then
00659         INLON=NDIMLEN(JLOOP)
00660         if (.not.allocated(XILONARRAY)) allocate(XILONARRAY(NDIMLEN(JLOOP)))
00661         CALL GET1DCDF(kcdf_id,NVARDIMID(JLOOP),ZZLOMISS,XILONARRAY(:))
00662       endif
00663       if (NDIMNAM(JLOOP)=='depth') NINDEPTH=NDIMLEN(JLOOP)
00664     ENDDO
00665     NINLON(:)=INLON
00666 END SELECT
00667 !-----------
00668 !*    10.     Close the netcdf file 
00669 !             ---------------------
00670 HACTION='close netcdf'
00671 status=nf_close(kcdf_id)
00672 if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00673 !write(0,*) 'OK: netcdf file closed: ',HFILENAME
00674 !
00675 !-----------
00676 !GRID PARAM FOR HORIBL_SURF
00677 DO JLOOP1=1,NINLAT
00678   NILENGTH = NILENGTH + NINLON(JLOOP1)
00679 ENDDO
00680 XILAT1=XILATARRAY(1)
00681 XILON1=XILONARRAY(1)
00682 XILAT2=XILATARRAY(SIZE(XILATARRAY))
00683 XILON2=XILONARRAY(SIZE(XILONARRAY))
00684 !
00685 !*    11.     Deallocate 
00686 !             ----------
00687 IF (ALLOCATED(VARNAME     ))  DEALLOCATE(VARNAME)
00688 IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:PREP_NETCDF_GRID',1,ZHOOK_HANDLE)
00689 !
00690 END SUBROUTINE PREP_NETCDF_GRID
00691 !------------------------------------------------------------------------------
00692 !==============================================================================
00693 !     ####################
00694        SUBROUTINE READ_LATLONVAL_CDF(HFILENAME,HNCVARNAME,PLON,PLAT,PVAL)
00695 !     ####################
00696 !
00697 IMPLICIT NONE
00698 !
00699  CHARACTER(LEN=28), INTENT(IN) :: HFILENAME   ! Name of the field file.
00700  CHARACTER(LEN=28), INTENT(IN) :: HNCVARNAME  ! Name of variable to read in netcdf file
00701 REAL, DIMENSION(:), INTENT(OUT) :: PLON,PLAT ! Longitudes/latitudes in netcdf file 
00702 REAL, DIMENSION(:), INTENT(OUT) :: PVAL      ! value to get
00703 !
00704 integer :: status
00705 integer :: kcdf_id
00706 integer :: NBVARS
00707 character(len=80) :: HACTION
00708 character(len=80),DIMENSION(:),ALLOCATABLE :: VARNAME
00709 integer ::JLOOP1,JDIM1,JDIM2,JLOOP
00710 integer ::ID_VARTOGET,ID_VARTOGET1,ID_VARTOGET2
00711 integer ::NVARDIMS
00712 integer ::NLEN
00713 integer,DIMENSION(2) ::NLEN2D
00714 integer,DIMENSION(:),ALLOCATABLE :: NVARDIMID,NVARDIMLEN
00715 character(len=80),DIMENSION(:),ALLOCATABLE :: NVARDIMNAM
00716 real,DIMENSION(:),ALLOCATABLE   :: ZVALU
00717 real,DIMENSION(:,:),ALLOCATABLE :: ZVALU2D
00718 real :: ZMISS
00719 real,DIMENSION(:),ALLOCATABLE :: ZDIM1
00720 real,DIMENSION(:),ALLOCATABLE :: ZDIM2
00721 character(len=80) :: YDIM1NAME,YDIM2NAME
00722 integer :: ILONFOUND,ILATFOUND, IARG
00723 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00724 !
00725 include 'netcdf.inc'
00726 !
00727 !
00728 !
00729 !*    1.      Open the netcdf file 
00730 !             --------------------
00731 IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:READ_LATLONVAL_CDF',0,ZHOOK_HANDLE)
00732 status=-9999
00733 kcdf_id=-9999
00734 HACTION='open netcdf'
00735 status=NF_OPEN(HFILENAME,nf_nowrite,kcdf_id)
00736 !write(0,*) 'status=',status
00737 !write(0,*) 'identifiant de ',HFILENAME,'=',kcdf_id
00738 if (status/=NF_NOERR) then 
00739   CALL HANDLE_ERR_MER(status,HACTION)
00740 !else
00741 !  write(0,*) 'netcdf file opened: ',HFILENAME
00742 endif
00743 !
00744 !-----------
00745 !
00746 !*    2.      get the number of variables in netcdf file 
00747 !             ------------------------------------------
00748 HACTION='get number of variables'
00749 status=NF_INQ_NVARS(kcdf_id,NBVARS)
00750 if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00751 !write(0,*) 'nb vars', NBVARS
00752 ALLOCATE(VARNAME(NBVARS))
00753 !
00754 !-----------
00755 !
00756 !*    3.      get the variables names in netcdf file 
00757 !             --------------------------------------
00758 ID_VARTOGET1=0
00759 ID_VARTOGET2=0
00760 DO JLOOP1=1,NBVARS
00761   HACTION='get variables  names'
00762   status=NF_INQ_VARNAME(kcdf_id,JLOOP1,VARNAME(JLOOP1))
00763   if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00764   !write(0,*) 'var',JLOOP1,' name: ',VARNAME(JLOOP1)
00765   if (VARNAME(JLOOP1)==HNCVARNAME) then
00766     !write(0,*) 'var',JLOOP1,' corresponding to variable required'
00767     ID_VARTOGET1=JLOOP1
00768   endif
00769   if (VARNAME(JLOOP1)/=HNCVARNAME) then
00770     if((LGT(TRIM(VARNAME(JLOOP1)),TRIM(HNCVARNAME))).AND.&
00771            (SCAN(TRIM(VARNAME(JLOOP1)),TRIM(HNCVARNAME))==1)) then  
00772       !write(0,*) 'var',JLOOP1,VARNAME(JLOOP1),' could correspond to variable required ?'
00773       !write(0,*) HNCVARNAME,' is variable required; only ',VARNAME(JLOOP1),' found'
00774       ID_VARTOGET2=JLOOP1
00775     endif
00776   endif
00777 ENDDO
00778 if (ID_VARTOGET1/=0) then
00779   ID_VARTOGET=ID_VARTOGET1
00780 else
00781   ID_VARTOGET=ID_VARTOGET2
00782 endif
00783 if (ID_VARTOGET==0) then
00784   HACTION='close netcdf'
00785   status=nf_close(kcdf_id)
00786   if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00787   CALL ABOR1_SFX('MODE_READ_NETCDF_MERCATOR: READ_LATLONVAL_CDF')
00788 endif
00789 !-----------
00790 !
00791 !*    4.      get the variable in netcdf file 
00792 !             -------------------------------
00793 !
00794 !     4.1      get the variable dimensions number
00795 !             -----------------------------------
00796 !
00797 HACTION='get variable dimensions number'
00798 status=nf_inq_varndims(kcdf_id,ID_VARTOGET,NVARDIMS)
00799 if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00800 !write(0,*) 'variable dimensions number = ',NVARDIMS
00801 !
00802 !     4.2      get the variable dimensions length and values
00803 !              ----------------------------------------------
00804 SELECT CASE (NVARDIMS)
00805 !CAS 1D
00806   CASE (1) 
00807     HACTION='get variable dimensions length'
00808     status=nf_inq_dimlen(kcdf_id,NVARDIMS,NLEN)
00809     if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00810     ALLOCATE(ZVALU(NLEN))
00811     !write(0,*) 'call GET1DCDF'
00812     CALL GET1DCDF(kcdf_id,ID_VARTOGET,ZMISS,ZVALU)
00813     PVAL(:)=ZVALU(:)
00814 !CAS 2D
00815   CASE (2)
00816     DO JLOOP=1,NVARDIMS
00817       HACTION='get variable dimensions length'
00818       status=nf_inq_dimlen(kcdf_id,JLOOP,NLEN2D(JLOOP))
00819       if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00820     ENDDO
00821     ALLOCATE(ZVALU2D(NLEN2D(1),NLEN2D(2)))
00822     ALLOCATE(ZDIM1(NLEN2D(1)))
00823     ALLOCATE(ZDIM2(NLEN2D(2)))
00824     !write(0,*) 'call GET2DCDF'
00825     CALL GET2DCDF(kcdf_id,ID_VARTOGET,ZDIM1,YDIM1NAME,ZDIM2,YDIM2NAME,&
00826            ZMISS,ZVALU2D)  
00827     !write(0,*) 'YDIM1NAME: ',YDIM1NAME
00828     !write(0,*) 'YDIM2NAME: ',YDIM2NAME
00829     if ((YDIM1NAME=='lon').OR.(YDIM1NAME=='longitude')) ILONFOUND=1
00830     if ((YDIM2NAME=='lon').OR.(YDIM2NAME=='longitude')) ILONFOUND=2
00831     if ((YDIM1NAME=='lat').OR.(YDIM1NAME=='latitude'))  ILATFOUND=1
00832     if ((YDIM2NAME=='lat').OR.(YDIM2NAME=='latitude'))  ILATFOUND=2
00833     IARG=0
00834 !
00835 !     4.3      complete arrays
00836 !              ---------------
00837     IF ((ILONFOUND==1).AND.(ILATFOUND==2)) then
00838       !write(0,*) 'ILONFOUND',ILONFOUND,'ILATFOUND',ILATFOUND
00839       DO JDIM1=1,SIZE(ZDIM1)
00840         DO JDIM2=1,SIZE(ZDIM2)
00841           IARG=IARG+1
00842           PVAL(IARG)=ZVALU2D(JDIM1,JDIM2)
00843           PLON(IARG)=ZDIM1(JDIM1)
00844           PLAT(IARG)=ZDIM2(JDIM2)
00845         ENDDO
00846       ENDDO
00847     ELSEIF ((ILONFOUND==2).AND.(ILATFOUND==1)) then
00848       !write(0,*) 'ILONFOUND',ILONFOUND,'ILATFOUND',ILATFOUND
00849       DO JDIM1=1,SIZE(ZDIM1)
00850         DO JDIM2=1,SIZE(ZDIM2)
00851           IARG=IARG+1
00852           PVAL(IARG)=ZVALU2D(JDIM1,JDIM2)
00853           PLAT(IARG)=ZDIM1(JDIM1)
00854           PLON(IARG)=ZDIM2(JDIM2)
00855         ENDDO
00856       ENDDO
00857     ELSE
00858       write(0,*) '*****WARNING*****: incompatible dimensions to lat/lon/value arrays'
00859     ENDIF
00860 !
00861 END SELECT
00862 !
00863 !
00864 !-----------
00865 !*    10.     Close the netcdf file 
00866 !             ---------------------
00867 HACTION='close netcdf'
00868 status=nf_close(kcdf_id)
00869 if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00870 !write(0,*) 'OK: netcdf file closed: ',HFILENAME
00871 !
00872 !-----------
00873 !*    11.     Deallocate 
00874 !             ----------
00875 IF (ALLOCATED(VARNAME     ))  DEALLOCATE(VARNAME)
00876 IF (ALLOCATED(ZVALU       ))  DEALLOCATE(ZVALU  )
00877 IF (ALLOCATED(ZVALU2D     ))  DEALLOCATE(ZVALU2D)
00878 IF (ALLOCATED(ZDIM1       ))  DEALLOCATE(ZDIM1  )
00879 IF (ALLOCATED(ZDIM2       ))  DEALLOCATE(ZDIM2  )
00880 !
00881 !
00882 IF (ALLOCATED(NVARDIMID   ))  DEALLOCATE(NVARDIMID )
00883 IF (ALLOCATED(NVARDIMNAM  ))  DEALLOCATE(NVARDIMNAM)
00884 IF (ALLOCATED(NVARDIMLEN  ))  DEALLOCATE(NVARDIMLEN)
00885 IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:READ_LATLONVAL_CDF',1,ZHOOK_HANDLE)
00886 END SUBROUTINE READ_LATLONVAL_CDF
00887 !------------------------------------------------------------------------------
00888 !==============================================================================
00889 !     ####################
00890        SUBROUTINE READ_LATLONDEPVAL_CDF(HFILENAME,HNCVARNAME,PLON,PLAT,PDEP,PVAL)
00891 !     ####################
00892 !
00893 IMPLICIT NONE
00894 !
00895  CHARACTER(LEN=28), INTENT(IN) :: HFILENAME   ! Name of the field file.
00896  CHARACTER(LEN=28), INTENT(IN) :: HNCVARNAME  ! Name of variable to read in netcdf file
00897 REAL, DIMENSION(:), INTENT(OUT) :: PLON,PLAT ! Longitudes/latitudes in netcdf file 
00898 REAL, DIMENSION(:), INTENT(OUT) :: PDEP      ! depth in netcdf file
00899 REAL, DIMENSION(:,:), INTENT(OUT) :: PVAL      ! value to get
00900 !
00901 integer :: status
00902 integer :: kcdf_id
00903 integer :: NBVARS
00904 character(len=80) :: HACTION
00905 character(len=80),DIMENSION(:),ALLOCATABLE :: VARNAME
00906 integer ::JLOOP1,JDIM1,JDIM2,JDIM3,JLOOP
00907 !integer ::JLOOP2,JLOOP
00908 integer ::ID_VARTOGET,ID_VARTOGET1,ID_VARTOGET2
00909 integer ::NVARDIMS
00910 integer,DIMENSION(3) ::NLEN3D
00911 integer,DIMENSION(:),ALLOCATABLE :: NVARDIMID,NVARDIMLEN
00912 character(len=80),DIMENSION(:),ALLOCATABLE :: NVARDIMNAM
00913 real,DIMENSION(:,:,:),ALLOCATABLE :: ZVALU3D
00914 real :: ZMISS
00915 real,DIMENSION(:),ALLOCATABLE :: ZDIM1
00916 real,DIMENSION(:),ALLOCATABLE :: ZDIM2
00917 real,DIMENSION(:),ALLOCATABLE :: ZDIM3
00918 character(len=80) :: YDIM1NAME,YDIM2NAME,YDIM3NAME
00919 integer :: ILONFOUND,ILATFOUND,IDEPFOUND
00920 integer ::  IARG
00921 REAL(KIND=JPRB) :: ZHOOK_HANDLE
00922 !
00923 include 'netcdf.inc'
00924 !
00925 !
00926 !
00927 !*    1.      Open the netcdf file 
00928 !             --------------------
00929 IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:READ_LATLONDEPVAL_CDF',0,ZHOOK_HANDLE)
00930 HACTION='open netcdf'
00931 status=NF_OPEN(HFILENAME,nf_nowrite,kcdf_id)
00932 if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00933 !write(0,*) 'netcdf file opened: ',HFILENAME
00934 !
00935 !-----------
00936 !
00937 !*    2.      get the number of variables in netcdf file 
00938 !             ------------------------------------------
00939 HACTION='get number of variables'
00940 status=NF_INQ_NVARS(kcdf_id,NBVARS)
00941 if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00942 !write(0,*) 'nb vars', NBVARS
00943 ALLOCATE(VARNAME(NBVARS))
00944 !
00945 !-----------
00946 !
00947 !*    3.      get the variables names in netcdf file 
00948 !             --------------------------------------
00949 ID_VARTOGET1=0
00950 ID_VARTOGET2=0
00951 DO JLOOP1=1,NBVARS
00952   HACTION='get variables  names'
00953   status=NF_INQ_VARNAME(kcdf_id,JLOOP1,VARNAME(JLOOP1))
00954   if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00955   !write(0,*) 'var',JLOOP1,' name: ',VARNAME(JLOOP1)
00956   if (VARNAME(JLOOP1)==HNCVARNAME) then
00957     !write(0,*) 'var',JLOOP1,' corresponding to variable required'
00958     ID_VARTOGET1=JLOOP1
00959   endif
00960   if (VARNAME(JLOOP1)/=HNCVARNAME) then
00961     if((LGT(TRIM(VARNAME(JLOOP1)),TRIM(HNCVARNAME))).AND.&
00962            (SCAN(TRIM(VARNAME(JLOOP1)),TRIM(HNCVARNAME))==1)) then  
00963       !write(0,*) 'var',JLOOP1,VARNAME(JLOOP1),' could correspond to variable required ?'
00964       !write(0,*) HNCVARNAME,' is variable required; only ',VARNAME(JLOOP1),' found'
00965       ID_VARTOGET2=JLOOP1
00966     endif
00967   endif
00968 ENDDO
00969 if (ID_VARTOGET1/=0) then
00970   ID_VARTOGET=ID_VARTOGET1
00971 else
00972   ID_VARTOGET=ID_VARTOGET2
00973 endif
00974 if (ID_VARTOGET==0) then
00975   HACTION='close netcdf'
00976   status=nf_close(kcdf_id)
00977   if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00978   CALL ABOR1_SFX('MODE_READ_NETCDF_MERCATOR: READ_LATLONDEPVAL_CDF')
00979 endif
00980 !-----------
00981 !
00982 !*    4.      get the variable in netcdf file 
00983 !             -------------------------------
00984 !
00985 !     4.1      get the variable dimensions number
00986 !             -----------------------------------
00987 !
00988 HACTION='get variable dimensions number'
00989 status=nf_inq_varndims(kcdf_id,ID_VARTOGET,NVARDIMS)
00990 if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00991 !write(0,*) 'variable dimensions number = ',NVARDIMS
00992 ALLOCATE(NVARDIMID(NVARDIMS))
00993 HACTION='get variable dimensions identifiant'
00994 status=nf_inq_vardimid(kcdf_id,ID_VARTOGET,NVARDIMID)
00995 if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
00996 !
00997 !
00998 !     4.2      get the variable dimensions length and values
00999 !              ----------------------------------------------
01000 SELECT CASE (NVARDIMS)
01001 !CAS 1D, 2D
01002   CASE (1,2) 
01003     write(0,*) '********************************************'
01004     write(0,*) '* number of dimension to low: ',NVARDIMS,' *'
01005     write(0,*) '* you need a 3-dimension variable          *'
01006     write(0,*) '********************************************'
01007 !CAS 3D
01008   CASE (3)
01009     DO JLOOP=1,NVARDIMS
01010       HACTION='get variable dimensions length'
01011       status=nf_inq_dimlen(kcdf_id,NVARDIMID(JLOOP),NLEN3D(JLOOP))
01012       if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
01013     ENDDO
01014     ALLOCATE(ZVALU3D(NLEN3D(1),NLEN3D(2),NLEN3D(3)))
01015     ALLOCATE(ZDIM1(NLEN3D(1)))
01016     ALLOCATE(ZDIM2(NLEN3D(2)))
01017     ALLOCATE(ZDIM3(NLEN3D(3)))
01018     !write(0,*) 'call GET3DCDF'
01019     CALL GET3DCDF(kcdf_id,ID_VARTOGET,ZDIM1,YDIM1NAME,ZDIM2,YDIM2NAME,&
01020            ZDIM3,YDIM3NAME,ZMISS,ZVALU3D) 
01021     !write(0,*) 'YDIM1NAME: ',YDIM1NAME
01022     !write(0,*) 'YDIM2NAME: ',YDIM2NAME
01023     !write(0,*) 'YDIM3NAME: ',YDIM3NAME
01024     if ((YDIM1NAME=='lon').OR.(YDIM1NAME=='longitude')) ILONFOUND=1
01025     if ((YDIM2NAME=='lon').OR.(YDIM2NAME=='longitude')) ILONFOUND=2
01026     if ((YDIM3NAME=='lon').OR.(YDIM3NAME=='longitude')) ILONFOUND=3
01027     if ((YDIM1NAME=='lat').OR.(YDIM1NAME=='latitude'))  ILATFOUND=1
01028     if ((YDIM2NAME=='lat').OR.(YDIM2NAME=='latitude'))  ILATFOUND=2
01029     if ((YDIM3NAME=='lat').OR.(YDIM3NAME=='latitude'))  ILATFOUND=3
01030     if (YDIM1NAME=='depth')                             IDEPFOUND=1
01031     if (YDIM2NAME=='depth')                             IDEPFOUND=2
01032     if (YDIM3NAME=='depth')                             IDEPFOUND=3
01033     IARG=0
01034     !write(0,*) 'ILONFOUND',ILONFOUND,'ILATFOUND',ILATFOUND,'IDEPFOUND',IDEPFOUND
01035 !!
01036 !!     4.3      complete arrays
01037 !!              ---------------
01038     IF ((ILONFOUND==1).AND.(ILATFOUND==2).AND.(IDEPFOUND==3)) then
01039       !write(0,*) 'SIZE LON=',SIZE(ZDIM1),'SIZE LAT',SIZE(ZDIM2),'SIZE DEP',SIZE(ZDIM3)
01040       !write(0,*) 'SIZE PLON=',SIZE(PLON),'SIZE PLAT',SIZE(PLAT),'SIZE PDEP',SIZE(PDEP)
01041       PDEP(:)=ZDIM3(:)
01042       DO JDIM2=1,SIZE(ZDIM2)
01043         DO JDIM1=1,SIZE(ZDIM1)
01044           IARG=IARG+1
01045           PLON(IARG)=ZDIM1(JDIM1)
01046           PLAT(IARG)=ZDIM2(JDIM2)
01047           DO JDIM3=1,SIZE(ZDIM3)
01048             PVAL(IARG,JDIM3)=ZVALU3D(JDIM1,JDIM2,JDIM3)
01049           ENDDO
01050         ENDDO
01051       ENDDO
01052       !write(0,*) 'END complete arrays'
01053 !
01054     ELSEIF ((ILONFOUND==2).AND.(ILATFOUND==1).AND.(IDEPFOUND==3)) then
01055       PDEP(:)=ZDIM3(:)
01056       DO JDIM1=1,SIZE(ZDIM1)
01057         DO JDIM2=1,SIZE(ZDIM2)
01058           IARG=IARG+1
01059           PLON(IARG)=ZDIM2(JDIM2)
01060           PLAT(IARG)=ZDIM1(JDIM1)
01061           DO JDIM3=1,SIZE(ZDIM3)
01062             PVAL(IARG,JDIM3)=ZVALU3D(JDIM1,JDIM2,JDIM3)
01063           ENDDO
01064         ENDDO
01065       ENDDO
01066 !
01067     ELSEIF ((ILONFOUND==1).AND.(ILATFOUND==3).AND.(IDEPFOUND==2)) then
01068       PDEP(:)=ZDIM2(:)
01069       DO JDIM3=1,SIZE(ZDIM3)
01070         DO JDIM1=1,SIZE(ZDIM1)
01071           IARG=IARG+1
01072           PLON(IARG)=ZDIM1(JDIM1)
01073           PLAT(IARG)=ZDIM3(JDIM3)
01074           DO JDIM2=1,SIZE(ZDIM2)
01075             PVAL(IARG,JDIM2)=ZVALU3D(JDIM1,JDIM2,JDIM3)
01076           ENDDO
01077         ENDDO
01078       ENDDO
01079 !
01080     ELSEIF ((ILATFOUND==1).AND.(ILONFOUND==3).AND.(IDEPFOUND==2)) then
01081       PDEP(:)=ZDIM2(:)
01082       DO JDIM1=1,SIZE(ZDIM1)
01083         DO JDIM3=1,SIZE(ZDIM3)
01084           IARG=IARG+1
01085           PLON(IARG)=ZDIM3(JDIM3)
01086           PLAT(IARG)=ZDIM1(JDIM1)
01087           DO JDIM2=1,SIZE(ZDIM2)
01088             PVAL(IARG,JDIM2)=ZVALU3D(JDIM1,JDIM2,JDIM3)
01089           ENDDO
01090         ENDDO
01091       ENDDO
01092 !
01093     ELSEIF ((ILONFOUND==2).AND.(ILATFOUND==3).AND.(IDEPFOUND==1)) then
01094       PDEP(:)=ZDIM1(:)
01095       DO JDIM3=1,SIZE(ZDIM3)
01096         DO JDIM2=1,SIZE(ZDIM2)
01097           IARG=IARG+1
01098           PLON(IARG)=ZDIM2(JDIM2)
01099           PLAT(IARG)=ZDIM3(JDIM3)
01100           DO JDIM1=1,SIZE(ZDIM1)
01101             PVAL(IARG,JDIM1)=ZVALU3D(JDIM1,JDIM2,JDIM3)
01102           ENDDO
01103         ENDDO
01104       ENDDO
01105 !
01106     ELSEIF ((ILATFOUND==2).AND.(ILONFOUND==3).AND.(IDEPFOUND==1)) then
01107       PDEP(:)=ZDIM1(:)
01108       DO JDIM2=1,SIZE(ZDIM2)
01109         DO JDIM3=1,SIZE(ZDIM3)
01110           IARG=IARG+1
01111           PLON(IARG)=ZDIM3(JDIM3)
01112           PLAT(IARG)=ZDIM2(JDIM2)
01113           DO JDIM1=1,SIZE(ZDIM1)
01114             PVAL(IARG,JDIM1)=ZVALU3D(JDIM1,JDIM2,JDIM3)
01115           ENDDO
01116         ENDDO
01117       ENDDO
01118 !
01119     ELSE
01120       write(0,*) '*****WARNING*****: incompatible dimensions to lat/lon/value arrays'
01121     ENDIF
01122 !
01123 END SELECT
01124 !
01125 !-----------
01126 !*    10.     Close the netcdf file 
01127 !             ---------------------
01128 HACTION='close netcdf'
01129 !write(0,*) HACTION
01130 status=nf_close(kcdf_id)
01131 if (status/=NF_NOERR) CALL HANDLE_ERR_MER(status,HACTION)
01132 !write(0,*) 'OK: netcdf file closed: ',HFILENAME
01133 !
01134 !-----------
01135 !*    11.     Deallocate 
01136 !             ----------
01137 IF (ALLOCATED(VARNAME     ))  DEALLOCATE(VARNAME)
01138 IF (ALLOCATED(ZVALU3D     ))  DEALLOCATE(ZVALU3D)
01139 IF (ALLOCATED(ZDIM1       ))  DEALLOCATE(ZDIM1  )
01140 IF (ALLOCATED(ZDIM2       ))  DEALLOCATE(ZDIM2  )
01141 IF (ALLOCATED(ZDIM3       ))  DEALLOCATE(ZDIM3  )
01142 !
01143 !
01144 IF (ALLOCATED(NVARDIMID   ))  DEALLOCATE(NVARDIMID )
01145 IF (ALLOCATED(NVARDIMNAM  ))  DEALLOCATE(NVARDIMNAM)
01146 IF (ALLOCATED(NVARDIMLEN  ))  DEALLOCATE(NVARDIMLEN)
01147 201   FORMAT(4(3X,F10.4))
01148 IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:READ_LATLONDEPVAL_CDF',1,ZHOOK_HANDLE)
01149 END SUBROUTINE READ_LATLONDEPVAL_CDF
01150 !------------------------------------------------------------------------------
01151 !==============================================================================
01152 !     ####################
01153        SUBROUTINE READ_NETCDF_SST(HFILENAME,HNCVARNAME,PFIELD)
01154 !     ####################
01155 !
01156 USE MODD_GRID_LATLONREGUL, ONLY : NINDEPTH,NILENGTH
01157 USE MODD_SURF_PAR,         ONLY : XUNDEF
01158 USE MODD_CSTS,             ONLY : XTT
01159 USE MODD_PREP,       ONLY : CINTERP_TYPE
01160 !
01161 IMPLICIT NONE
01162 !
01163  CHARACTER(LEN=28), INTENT(IN) :: HFILENAME   ! Name of the field file.
01164  CHARACTER(LEN=28), INTENT(IN) :: HNCVARNAME  ! Name of variable to read in netcdf file
01165 REAL, POINTER,DIMENSION(:) :: PFIELD      ! value to get
01166 !
01167 REAL,DIMENSION(:), ALLOCATABLE :: ZLATI
01168 REAL,DIMENSION(:), ALLOCATABLE :: ZLONG
01169 REAL,TARGET,DIMENSION(:,:), ALLOCATABLE :: ZVALUE
01170 REAL,DIMENSION(:), ALLOCATABLE :: ZDEPTH
01171 REAL,TARGET,DIMENSION(:), ALLOCATABLE :: ZVAL
01172 integer :: jloop
01173 !PLM
01174 REAL :: ZUNDEF=999.
01175 REAL(KIND=JPRB) :: ZHOOK_HANDLE
01176 !
01177 !
01178 include 'netcdf.inc'
01179 !
01180 IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:READ_NETCDF_SST',0,ZHOOK_HANDLE)
01181 if (NILENGTH<0) then
01182   ALLOCATE(PFIELD(1))
01183   PFIELD(:)=XUNDEF
01184   CINTERP_TYPE='UNIF  ' !!prescribed uniform field
01185 elseif (NINDEPTH<0) then
01186   ALLOCATE(ZLATI(NILENGTH) )
01187   ALLOCATE(ZLONG(NILENGTH) )
01188   ALLOCATE(ZVAL (NILENGTH) )
01189   CALL READ_LATLONVAL_CDF(HFILENAME,HNCVARNAME,ZLONG,ZLATI,ZVAL)
01190   ALLOCATE(PFIELD(NILENGTH))
01191   PFIELD(:)=XUNDEF
01192   PFIELD(:) = ZVAL(:)
01193   WHERE (ZVAL(:)/=ZUNDEF .AND. ZVAL(:)<100.) PFIELD(:)=PFIELD(:)+XTT
01194   CINTERP_TYPE='HORIBL' !!interpolation from gaussian, legendre or regular grid
01195 !                       !!CINGRID_TYPE='GAUSS  ' ou ='AROME '
01196 !                       !!CINGRID_TYPE='LATLON '
01197 else 
01198   ALLOCATE(ZVALUE(NILENGTH,NINDEPTH))
01199   ALLOCATE(ZLATI(NILENGTH) )
01200   ALLOCATE(ZLONG(NILENGTH) )
01201   ALLOCATE(ZDEPTH(NINDEPTH))
01202 !
01203  CALL READ_LATLONDEPVAL_CDF(HFILENAME,HNCVARNAME,ZLONG,ZLATI,ZDEPTH,ZVALUE)
01204 !
01205   ALLOCATE(PFIELD(NILENGTH))
01206   PFIELD(:)=XUNDEF
01207   PFIELD(:)=ZVALUE(:,1)
01208   WHERE (ZVALUE(:,1)/=ZUNDEF .AND. ZVALUE(:,1)<100.) PFIELD(:)=PFIELD(:)+XTT
01209   CINTERP_TYPE='HORIBL' !!interpolation from gaussian, legendre or regular grid
01210 !                       !!CINGRID_TYPE='GAUSS  ' ou ='AROME '
01211 !                       !!CINGRID_TYPE='LATLON '
01212 endif
01213 !
01214 IF (ALLOCATED(ZVALUE      ))  DEALLOCATE(ZVALUE )
01215 IF (ALLOCATED(ZLONG       ))  DEALLOCATE(ZLONG  )
01216 IF (ALLOCATED(ZLATI       ))  DEALLOCATE(ZLATI  )
01217 IF (ALLOCATED(ZDEPTH      ))  DEALLOCATE(ZDEPTH )
01218 IF (ALLOCATED(ZVAL        ))  DEALLOCATE(ZVAL   )
01219 !
01220 202   FORMAT(3(3X,F10.4))
01221 IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:READ_NETCDF_SST',1,ZHOOK_HANDLE)
01222 !
01223 END SUBROUTINE READ_NETCDF_SST
01224 !------------------------------------------------------------------------------
01225 !==============================================================================
01226 !     ####################
01227        SUBROUTINE READ_NETCDF_ZS_SEA(HFILENAME,HNCVARNAME,PFIELD)
01228 !     ####################
01229 !
01230 USE MODD_GRID_LATLONREGUL, ONLY : NINLAT,NINLON,NINDEPTH,NILENGTH
01231 USE MODD_PREP,       ONLY : CINTERP_TYPE
01232 !
01233 IMPLICIT NONE
01234 !
01235  CHARACTER(LEN=28), INTENT(IN) :: HFILENAME   ! Name of the field file.
01236  CHARACTER(LEN=28), INTENT(IN) :: HNCVARNAME  ! Name of variable to read in netcdf file
01237 REAL, POINTER, DIMENSION(:)   :: PFIELD      ! value to get
01238 !
01239 REAL,DIMENSION(:), ALLOCATABLE :: ZLATI
01240 REAL,DIMENSION(:), ALLOCATABLE :: ZLONG
01241 REAL,TARGET, DIMENSION(:), ALLOCATABLE:: ZVALUE
01242 integer :: jloop
01243 REAL(KIND=JPRB) :: ZHOOK_HANDLE
01244 !
01245 !
01246 include 'netcdf.inc'
01247 !
01248 IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:READ_NETCDF_ZS_SEA',0,ZHOOK_HANDLE)
01249 if(NINDEPTH>0) then
01250   !write(0,*) '*****warning*****',HNCVARNAME,' is a 3D field'
01251   ALLOCATE(PFIELD(1))
01252   PFIELD(:)=0.
01253   CINTERP_TYPE='UNIF  ' !!prescribed uniform field
01254 elseif(NILENGTH>0) then 
01255   ALLOCATE(ZVALUE(NILENGTH))
01256   ALLOCATE(ZLATI(NILENGTH) )
01257   ALLOCATE(ZLONG(NILENGTH) )
01258 !
01259   CALL READ_LATLONVAL_CDF(HFILENAME,HNCVARNAME,ZLONG,ZLATI,ZVALUE)
01260   ALLOCATE(PFIELD(NILENGTH))
01261   PFIELD(:)=ZVALUE(:)
01262   CINTERP_TYPE='HORIBL' !!interpolation from gaussian, legendre or regular grid
01263 !                       !!CINGRID_TYPE='GAUSS  ' ou ='AROME '
01264 !                       !!CINGRID_TYPE='LATLON '
01265 else
01266   ALLOCATE(PFIELD(1))
01267   PFIELD(:)=0.
01268   CINTERP_TYPE='UNIF  ' !!prescribed uniform field
01269 endif
01270 !
01271 IF (ALLOCATED(ZVALUE      ))  DEALLOCATE(ZVALUE )
01272 IF (ALLOCATED(ZLONG       ))  DEALLOCATE(ZLONG  )
01273 IF (ALLOCATED(ZLATI       ))  DEALLOCATE(ZLATI  )
01274 !
01275 202   FORMAT(3(3X,F10.4))
01276 IF (LHOOK) CALL DR_HOOK('MODE_READ_NETCDF_MERCATOR:READ_NETCDF_ZS_SEA',1,ZHOOK_HANDLE)
01277 !
01278 END SUBROUTINE READ_NETCDF_ZS_SEA
01279 !------------------------------------------------------------------------------
01280 !==============================================================================
01281 END MODULE MODE_READ_NETCDF_MERCATOR