SURFEX v7.3
General documentation of Surfex
|
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