SURFEX v8.1
General documentation of Surfex
mode_trip_netcdf.F90
Go to the documentation of this file.
1 !######################
3 !######################
4 !
5 !!**** *MODE_TRIP_NETCDF*
6 !!
7 !! PURPOSE
8 !! -------
9 !
10 ! The purpose of this routine is to store here all routines
11 ! used by TRIP for read/store variables in netcdf.
12 !
13 !!
14 !!** IMPLICIT ARGUMENTS
15 !! ------------------
16 !! NONE
17 !!
18 !! REFERENCE
19 !! ---------
20 !!
21 !!
22 !! AUTHOR
23 !! ------
24 !! B. Decharme * Meteo France *
25 !!
26 !! MODIFICATIONS
27 !! -------------
28 !! Original 25/04/08
29 !--------------------------------------------------------------------------------
30 !
31 !* 0. DECLARATIONS
32 ! ------------
33 !
34 USE modd_trip_par,ONLY : xundef
35 !
36 USE modi_abort_trip
37 !
38 USE yomhook ,ONLY : lhook, dr_hook
39 USE parkind1 ,ONLY : jprb
40 !
41 USE netcdf
42 !
43 INTERFACE ncread
44  MODULE PROCEDURE ncread_x
45  MODULE PROCEDURE ncread_xy
46  MODULE PROCEDURE ncread_xyz
47 END INTERFACE
48 !
49 !-------------------------------------------------------------------------------
50 !
51  CONTAINS
52 !
53 !-------------------------------------------------------------------------------
54 !
55 !######################################################
56 SUBROUTINE ncopen(KLISTING,ORW,OVERBOSE,HFILENAME,KNCID)
57 !######################################################
58 !
59 !! PURPOSE
60 !! -------
61 !
62 ! Open a netcdf file name YFILENAME
63 !
64 IMPLICIT NONE
65 !
66 !* declarations of arguments
67 !
68  CHARACTER(LEN=NF90_MAX_NAME), INTENT(IN) :: HFILENAME
69 !
70 LOGICAL, INTENT(IN) :: ORW, OVERBOSE
71 !
72 INTEGER, INTENT(IN) :: KLISTING
73 !
74 INTEGER, INTENT(OUT) :: KNCID
75 !
76 !* declarations of local variables
77 !
78  CHARACTER(LEN=NF90_MAX_NAME) :: YFNAME
79 !
80 INTEGER :: IC
81 REAL(KIND=JPRB) :: ZHOOK_HANDLE
82 !
83 !* procedure
84 !
85 IF (lhook) CALL dr_hook('MODE_TRIP_NETCDF:NCOPEN',0,zhook_handle)
86 !
87 yfname = hfilename(1:len_trim(hfilename))
88 !
89 IF(orw)THEN
90  ic = nf90_open(yfname,nf90_write,kncid)
91 ELSE
92  ic = nf90_open(yfname,nf90_nowrite,kncid)
93 ENDIF
94 !
95 IF(ic/=nf90_noerr)THEN
96  WRITE(klisting,*)'NCOPEN for TRIP : Error opening file ',hfilename(1:len_trim(hfilename))
97  WRITE(klisting,*)nf90_strerror(ic)
98  CALL abort_trip('NCOPEN for TRIP : Error opening file')
99 ELSEIF(overbose)THEN
100  WRITE(klisting,*)'NCOPEN for TRIP : Opening file ',hfilename(1:len_trim(hfilename))
101 ENDIF
102 !
103 IF (lhook) CALL dr_hook('MODE_TRIP_NETCDF:NCOPEN',1,zhook_handle)
104 !
105 END SUBROUTINE ncopen
106 !
107 !-------------------------------------------------------------------------------
108 !
109 !###################################################
110 SUBROUTINE ncclose(KLISTING,OVERBOSE,HFILENAME,KNCID)
111 !###################################################
112 !
113 !! PURPOSE
114 !! -------
115 !
116 ! Close a netcdf file
117 !
118 IMPLICIT NONE
119 !
120 !* declarations of arguments
121 !
122  CHARACTER(LEN=NF90_MAX_NAME), INTENT(IN) :: HFILENAME
123 !
124 LOGICAL, INTENT(IN) :: OVERBOSE
125 INTEGER, INTENT(IN) :: KLISTING
126 INTEGER, INTENT(IN) :: KNCID
127 !
128 !* declarations of local variables
129 !
130 INTEGER :: IC
131 REAL(KIND=JPRB) :: ZHOOK_HANDLE
132 !
133 !* procedure
134 !
135 IF (lhook) CALL dr_hook('MODE_TRIP_NETCDF:NCCLOSE',0,zhook_handle)
136 !
137 ic = nf90_close(kncid)
138 IF(overbose)WRITE(klisting,*)'NCCLOSE for TRIP : Close file ',hfilename(1:len_trim(hfilename))
139 !
140 IF (lhook) CALL dr_hook('MODE_TRIP_NETCDF:NCCLOSE',1,zhook_handle)
141 !
142 END SUBROUTINE ncclose
143 !
144 !-------------------------------------------------------------------------------
145 !
146 !#########################################################################
147 SUBROUTINE ncread_x(KLISTING,KNCID,HVNAME,PVECT,OVERBOSE)
148 !#########################################################################
149 !
150 !! PURPOSE
151 !! -------
152 !
153 ! Read a XY variable in a netcdf file
154 !
155 IMPLICIT NONE
156 !
157 !* declarations of arguments
158 !
159  CHARACTER(LEN=NF90_MAX_NAME), INTENT(IN) :: HVNAME
160 !
161 INTEGER, INTENT(IN) :: KLISTING
162 INTEGER, INTENT(IN) :: KNCID
163 !
164 LOGICAL, INTENT(IN) :: OVERBOSE
165 !
166 REAL, DIMENSION(:), INTENT(OUT) :: PVECT
167 !
168 !* declarations of local variables
169 !
170  CHARACTER(LEN=NF90_MAX_NAME) :: YVNAME
171 !
172 REAL*4, DIMENSION(SIZE(PVECT)) :: ZVECT
173 INTEGER, DIMENSION(SIZE(PVECT)) :: IVECT
174 !
175 REAL :: ZMISS
176 REAL*4 :: ZMISS4
177 !
178 INTEGER :: IC, ID, IVAR_TYPE
179 !
180 REAL(KIND=JPRB) :: ZHOOK_HANDLE
181 !
182 !* procedure
183 !
184 IF (lhook) CALL dr_hook('MODE_TRIP_NETCDF:NCREAD_X',0,zhook_handle)
185 !
186 yvname = hvname(1:len_trim(hvname))
187 !
188 ic = nf90_inq_varid(kncid,yvname,id)
189 IF(ic/=nf90_noerr)THEN
190  WRITE(klisting,*)'NCREAD_X for TRIP : Error reading id for variable ',hvname(1:len_trim(hvname))
191  WRITE(klisting,*)nf90_strerror(ic)
192  CALL abort_trip('NCREAD_X for TRIP : Error reading id variable ')
193 ENDIF
194 !
195 ic = nf90_inquire_variable(kncid,id,xtype=ivar_type)
196 IF(ic/=nf90_noerr)THEN
197  WRITE(klisting,*)'NCREAD_X for TRIP : Error reading type for variable ',hvname(1:len_trim(hvname))
198  WRITE(klisting,*)nf90_strerror(ic)
199  CALL abort_trip('NCREAD_X for TRIP : Error reading type variable ')
200 ENDIF
201 !
202 IF(ivar_type==nf90_double)THEN
203  ic=nf90_get_att(kncid,id,'missing_value',zmiss)
204  IF(ic/=nf90_noerr) ic=nf90_get_att(kncid,id,'_FillValue',zmiss)
205  ic=nf90_get_var(kncid,id,pvect)
206  WHERE(pvect(:)==zmiss)
207  pvect(:)=xundef
208  ENDWHERE
209 ELSEIF(ivar_type==nf90_float)THEN
210  ic=nf90_get_att(kncid,id,'missing_value',zmiss4)
211  IF(ic/=nf90_noerr) ic=nf90_get_att(kncid,id,'_FillValue',zmiss4)
212  ic=nf90_get_var(kncid,id,zvect)
213  WHERE(zvect(:)/=zmiss4)
214  pvect(:)=zvect(:)
215  ELSEWHERE
216  pvect(:)=xundef
217  ENDWHERE
218 ELSEIF(ivar_type==nf90_int)THEN
219  ic=nf90_get_var(kncid,id,ivect)
220  pvect(:)=REAL(ivect(:))
221 ELSE
222  WRITE(klisting,*)'NCREAD_X for TRIP : type of the variable must be integer, float or double ',hvname(1:len_trim(hvname))
223  CALL abort_trip('NCREAD_X for TRIP : type of the variable not good')
224 ENDIF
225 IF(ic/=nf90_noerr)THEN
226  WRITE(klisting,*)'NCREAD_X for TRIP : Error reading variable ',hvname(1:len_trim(hvname))
227  WRITE(klisting,*)nf90_strerror(ic)
228  CALL abort_trip('NCREAD_X for TRIP : Error reading variable')
229 ELSEIF(overbose)THEN
230  WRITE(klisting,*)'NCREAD_X for TRIP : Success in reading variable ',hvname(1:len_trim(hvname))
231 ENDIF
232 !
233 IF (lhook) CALL dr_hook('MODE_TRIP_NETCDF:NCREAD_X',1,zhook_handle)
234 !
235 END SUBROUTINE ncread_x
236 !-------------------------------------------------------------------------------
237 !
238 !#########################################################################
239 SUBROUTINE ncread_xy(KLISTING,KNCID,HVNAME,PVECT,OVERBOSE)
240 !#########################################################################
241 !
242 !! PURPOSE
243 !! -------
244 !
245 ! Read a XY variable in a netcdf file
246 !
247 IMPLICIT NONE
248 !
249 !* declarations of arguments
250 !
251  CHARACTER(LEN=NF90_MAX_NAME), INTENT(IN) :: HVNAME
252 !
253 INTEGER, INTENT(IN) :: KLISTING
254 INTEGER, INTENT(IN) :: KNCID
255 !
256 LOGICAL, INTENT(IN) :: OVERBOSE
257 !
258 REAL, DIMENSION(:,:), INTENT(OUT) :: PVECT
259 !
260 !* declarations of local variables
261 !
262  CHARACTER(LEN=NF90_MAX_NAME) :: YVNAME
263 !
264 REAL*4, DIMENSION(SIZE(PVECT,1),SIZE(PVECT,2)) :: ZVECT
265 !
266 REAL :: ZMISS
267 REAL*4 :: ZMISS4
268 !
269 INTEGER :: IC, ID, IVAR_TYPE
270 !
271 REAL(KIND=JPRB) :: ZHOOK_HANDLE
272 !
273 !* procedure
274 !
275 IF (lhook) CALL dr_hook('MODE_TRIP_NETCDF:NCREAD_XY',0,zhook_handle)
276 !
277 yvname = hvname(1:len_trim(hvname))
278 !
279 ic = nf90_inq_varid(kncid,yvname,id)
280 IF(ic/=nf90_noerr)THEN
281  WRITE(klisting,*)'NCREAD_XY for TRIP : Error reading id for variable ',hvname(1:len_trim(hvname))
282  WRITE(klisting,*)nf90_strerror(ic)
283  CALL abort_trip('NCREAD_XY for TRIP : Error reading id variable ')
284 ENDIF
285 !
286 ic = nf90_inquire_variable(kncid,id,xtype=ivar_type)
287 IF(ic/=nf90_noerr)THEN
288  WRITE(klisting,*)'NCREAD_XY for TRIP : Error reading type for variable ',hvname(1:len_trim(hvname))
289  WRITE(klisting,*)nf90_strerror(ic)
290  CALL abort_trip('NCREAD_XY for TRIP : Error reading type variable ')
291 ENDIF
292 !
293 IF(ivar_type==nf90_double)THEN
294  ic=nf90_get_att(kncid,id,'missing_value',zmiss)
295  IF(ic/=nf90_noerr) ic=nf90_get_att(kncid,id,'_FillValue',zmiss)
296  ic=nf90_get_var(kncid,id,pvect)
297  WHERE(pvect(:,:)==zmiss)
298  pvect(:,:)=xundef
299  ENDWHERE
300 ELSEIF(ivar_type==nf90_float)THEN
301  ic=nf90_get_att(kncid,id,'missing_value',zmiss4)
302  IF(ic/=nf90_noerr) ic=nf90_get_att(kncid,id,'_FillValue',zmiss4)
303  ic=nf90_get_var(kncid,id,zvect)
304  WHERE(zvect(:,:)/=zmiss4)
305  pvect(:,:)=zvect(:,:)
306  ELSEWHERE
307  pvect(:,:)=xundef
308  ENDWHERE
309 ELSE
310  WRITE(klisting,*)'NCREAD_XY for TRIP : type of the variable must be float or double ',hvname(1:len_trim(hvname))
311  CALL abort_trip('NCREAD_XY for TRIP : type of the variable not good')
312 ENDIF
313 !
314 IF(ic/=nf90_noerr)THEN
315  WRITE(klisting,*)'NCREAD_XY for TRIP : Error reading variable ',hvname(1:len_trim(hvname))
316  WRITE(klisting,*)nf90_strerror(ic)
317  CALL abort_trip('NCREAD_XY for TRIP : Error reading variable')
318 ELSEIF(overbose)THEN
319  WRITE(klisting,*)'NCREAD_XY for TRIP : Success in reading variable ',hvname(1:len_trim(hvname))
320 ENDIF
321 !
322 IF (lhook) CALL dr_hook('MODE_TRIP_NETCDF:NCREAD_XY',1,zhook_handle)
323 !
324 END SUBROUTINE ncread_xy
325 !-------------------------------------------------------------------------------
326 !
327 !#########################################################################
328 SUBROUTINE ncread_xyz(KLISTING,KNCID,HVNAME,PVECT,OVERBOSE)
329 !#########################################################################
330 !
331 !! PURPOSE
332 !! -------
333 !
334 ! Read a XYZ variable in a netcdf file
335 !
336 IMPLICIT NONE
337 !
338 !* declarations of arguments
339 !
340  CHARACTER(LEN=NF90_MAX_NAME), INTENT(IN) :: HVNAME
341 !
342 INTEGER, INTENT(IN) :: KLISTING
343 INTEGER, INTENT(IN) :: KNCID
344 !
345 LOGICAL, INTENT(IN) :: OVERBOSE
346 !
347 REAL, DIMENSION(:,:,:), INTENT(OUT) :: PVECT
348 !
349 !* declarations of local variables
350 !
351  CHARACTER(LEN=NF90_MAX_NAME) :: YVNAME
352 !
353 REAL*4, DIMENSION(SIZE(PVECT,1),SIZE(PVECT,2),SIZE(PVECT,3)) :: ZVECT
354 !
355 REAL :: ZMISS
356 REAL*4 :: ZMISS4
357 !
358 INTEGER :: IC, ID, IVAR_TYPE
359 !
360 REAL(KIND=JPRB) :: ZHOOK_HANDLE
361 !
362 !* procedure
363 !
364 IF (lhook) CALL dr_hook('MODE_TRIP_NETCDF:NCREAD_XYZ',0,zhook_handle)
365 yvname = hvname(1:len_trim(hvname))
366 !
367 ic = nf90_inq_varid(kncid,yvname,id)
368 !
369 ic = nf90_inq_varid(kncid,yvname,id)
370 IF(ic/=nf90_noerr)THEN
371  WRITE(klisting,*)'NCREAD_XYZ for TRIP : Error reading id for variable ',hvname(1:len_trim(hvname))
372  WRITE(klisting,*)nf90_strerror(ic)
373  CALL abort_trip('NCREAD_XYZ for TRIP : Error reading id variable ')
374 ENDIF
375 !
376 ic = nf90_inquire_variable(kncid,id,xtype=ivar_type)
377 IF(ic/=nf90_noerr)THEN
378  WRITE(klisting,*)'NCREAD_XYZ for TRIP : Error reading type for variable ',hvname(1:len_trim(hvname))
379  WRITE(klisting,*)nf90_strerror(ic)
380  CALL abort_trip('NCREAD_XYZ for TRIP : Error reading type variable ')
381 ENDIF
382 !
383 IF(ivar_type==nf90_double)THEN
384  ic=nf90_get_att(kncid,id,'missing_value',zmiss)
385  IF(ic/=nf90_noerr) ic=nf90_get_att(kncid,id,'_FillValue',zmiss)
386  ic=nf90_get_var(kncid,id,pvect)
387  WHERE(pvect(:,:,:)==zmiss)
388  pvect(:,:,:)=xundef
389  ENDWHERE
390 ELSEIF(ivar_type==nf90_float)THEN
391  ic=nf90_get_att(kncid,id,'missing_value',zmiss4)
392  IF(ic/=nf90_noerr) ic=nf90_get_att(kncid,id,'_FillValue',zmiss4)
393  ic=nf90_get_var(kncid,id,zvect)
394  WHERE(zvect(:,:,:)/=zmiss4)
395  pvect(:,:,:)=zvect(:,:,:)
396  ELSEWHERE
397  pvect(:,:,:)=xundef
398  ENDWHERE
399 ELSE
400  WRITE(klisting,*)'NCREAD_XYZ for TRIP : type of the variable must be float or double ',hvname(1:len_trim(hvname))
401  CALL abort_trip('NCREAD_XYZ for TRIP : type of the variable not good')
402 ENDIF
403 IF(ic/=nf90_noerr)THEN
404  WRITE(klisting,*)'NCREAD_XYZ for TRIP : Error reading variable ',hvname(1:len_trim(hvname))
405  WRITE(klisting,*)nf90_strerror(ic)
406  CALL abort_trip('NCREAD_XYZ for TRIP : Error reading variable')
407 ELSEIF(overbose)THEN
408  WRITE(klisting,*)'NCREAD_XYZ for TRIP : Success in reading variable ',hvname(1:len_trim(hvname))
409 ENDIF
410 !
411 IF (lhook) CALL dr_hook('MODE_TRIP_NETCDF:NCREAD_XYZ',1,zhook_handle)
412 !
413 END SUBROUTINE ncread_xyz
414 !
415 !-------------------------------------------------------------------------------
416 !
417 !########################################################
418 SUBROUTINE nccreate(KLISTING,HFILENAME,HTITLE,HTIMEUNIT, &
419  HVNAME,HVLNAME,HUNIT,PLON,PLAT, &
420  PMISSVAL,OVERBOSE,KNCID,OTIME, &
421  KZLEN,OVARZDIM,ODOUBLE)
422 !########################################################
423 !
424 !! PURPOSE
425 !! -------
426 !
427 ! Open a netcdf file name YFILENAME
428 !
429 IMPLICIT NONE
430 !
431 !* declarations of arguments
432 !
433  CHARACTER(LEN=NF90_MAX_NAME), INTENT(IN) :: HFILENAME, HTITLE, HTIMEUNIT
434 !
435  CHARACTER(LEN=NF90_MAX_NAME), DIMENSION(:), INTENT(IN) :: HVNAME, HVLNAME, HUNIT
436 !
437 REAL, DIMENSION(:), INTENT(IN) :: PLON
438 REAL, DIMENSION(:), INTENT(IN) :: PLAT
439 !
440 LOGICAL, INTENT(IN) :: OVERBOSE
441 !
442 REAL, INTENT(IN) :: PMISSVAL
443 !
444 INTEGER, INTENT(IN) :: KLISTING
445 !
446 INTEGER, INTENT(OUT) :: KNCID
447 !
448 LOGICAL, INTENT(IN) :: OTIME
449 !
450 INTEGER, INTENT(IN), OPTIONAL :: KZLEN
451 LOGICAL, DIMENSION(:), INTENT(IN), OPTIONAL :: OVARZDIM
452 LOGICAL, DIMENSION(:), INTENT(IN), OPTIONAL :: ODOUBLE
453 !
454 !* declarations of local variables
455 !
456  CHARACTER(LEN=NF90_MAX_NAME) :: YWORK
457 !
458 REAL*4, DIMENSION(:), ALLOCATABLE :: ZWORK
459 !
460 REAL*4, DIMENSION(SIZE(PLON)) :: ZLON
461 REAL*4, DIMENSION(SIZE(PLAT)) :: ZLAT
462 !
463 LOGICAL, DIMENSION(SIZE(HVNAME)) :: LDOUBLE
464 !
465 REAL*4 :: ZMISSVAL
466 !
467 INTEGER :: ILONDIM, ILATDIM, ILEVDIM, ITIMEDIM
468 INTEGER :: ILON_ID, ILAT_ID, ILEV_ID, ITIME_ID, VAR_ID
469 INTEGER :: IC, IWORK, INVAR
470 INTEGER :: JVAR
471 !
472 REAL(KIND=JPRB) :: ZHOOK_HANDLE
473 !
474 !* procedure
475 !
476 IF (lhook) CALL dr_hook('MODE_TRIP_NETCDF:NCCREATE',0,zhook_handle)
477 !
478 IF(PRESENT(odouble))THEN
479  ldouble(:)=odouble(:)
480 ELSE
481  ldouble(:)=.false.
482 ENDIF
483 !
484 !Creation
485 !
486 ywork = hfilename(1:len_trim(hfilename))
487 !
488 ic = nf90_create(ywork,nf90_64bit_offset,kncid)
489 IF(ic/=nf90_noerr)THEN
490  WRITE(klisting,*)'NCCREATE for TRIP : Error create file ',hfilename(1:len_trim(hfilename))
491  WRITE(klisting,*)nf90_strerror(ic)
492  CALL abort_trip('NCCREATE for TRIP : Error create file')
493 ELSEIF(overbose)THEN
494  WRITE(klisting,*)'NCCREATE for TRIP : Success in creating file ',hfilename(1:len_trim(hfilename))
495 ENDIF
496 !
497 !Attributs
498 ywork = htitle(1:len_trim(htitle))
499 ic = nf90_put_att(kncid,nf90_global,'title',ywork)
500 ywork = 'COARDS'
501 ic = nf90_put_att(kncid,nf90_global,'Conventions',ywork)
502 !
503 !Dimensions
504 iwork = SIZE(plon)
505 ic = nf90_def_dim(kncid,'longitude',iwork,ilondim)
506 iwork = SIZE(plat)
507 ic = nf90_def_dim(kncid,'latitude',iwork,ilatdim)
508 IF(PRESENT(kzlen)) ic = nf90_def_dim(kncid,'level',kzlen,ilevdim)
509 IF(otime) ic = nf90_def_dim(kncid,'time',nf90_unlimited,itimedim)
510 !
511 !Variable attributs
512 !
513 ic = nf90_def_var(kncid,'longitude',nf90_float,ilondim,ilon_id)
514 ic = nf90_def_var(kncid,'latitude' ,nf90_float,ilatdim,ilat_id)
515 ywork = 'degrees_east'
516 ic = nf90_put_att(kncid,ilon_id,'units',ywork)
517 ywork = 'degrees_north'
518 ic = nf90_put_att(kncid,ilat_id,'units',ywork)
519 IF(PRESENT(kzlen))THEN
520  ic = nf90_def_var(kncid,'level',nf90_float,ilevdim,ilev_id)
521  ywork = 'level'
522  ic = nf90_put_att(kncid,ilev_id,'units',ywork)
523 ENDIF
524 !
525 IF(otime)THEN
526  ywork = htimeunit(1:len_trim(htimeunit))
527  ic = nf90_def_var(kncid,'time',nf90_int,itimedim,itime_id)
528  ic = nf90_put_att(kncid,itime_id,'units',ywork)
529 ENDIF
530 !
531 !Variables parametres
532 !
533 zmissval = REAL(pmissval)
534 !
535 invar = SIZE(hvname)
536 !
537 DO jvar=1,invar
538  ywork = hvname(jvar)(1:len_trim(hvname(jvar)))
539  IF(PRESENT(kzlen))THEN
540  IF(otime)THEN
541  IF(ovarzdim(jvar))THEN
542  IF(ldouble(jvar))THEN
543  ic = nf90_def_var(kncid,ywork,nf90_double,(/ilondim,ilatdim,ilevdim,itimedim/),var_id)
544  ELSE
545  ic = nf90_def_var(kncid,ywork,nf90_float,(/ilondim,ilatdim,ilevdim,itimedim/),var_id)
546  ENDIF
547  ELSE
548  IF(ldouble(jvar))THEN
549  ic = nf90_def_var(kncid,ywork,nf90_double,(/ilondim,ilatdim,itimedim/),var_id)
550  ELSE
551  ic = nf90_def_var(kncid,ywork,nf90_float,(/ilondim,ilatdim,itimedim/),var_id)
552  ENDIF
553  ENDIF
554  ELSE
555  IF(ovarzdim(jvar))THEN
556  IF(ldouble(jvar))THEN
557  ic = nf90_def_var(kncid,ywork,nf90_double,(/ilondim,ilatdim,ilevdim/),var_id)
558  ELSE
559  ic = nf90_def_var(kncid,ywork,nf90_float,(/ilondim,ilatdim,ilevdim/),var_id)
560  ENDIF
561  ELSE
562  IF(ldouble(jvar))THEN
563  ic = nf90_def_var(kncid,ywork,nf90_double,(/ilondim,ilatdim/),var_id)
564  ELSE
565  ic = nf90_def_var(kncid,ywork,nf90_float,(/ilondim,ilatdim/),var_id)
566  ENDIF
567  ENDIF
568  ENDIF
569  ELSE
570  IF(otime)THEN
571  IF(ldouble(jvar))THEN
572  ic = nf90_def_var(kncid,ywork,nf90_double,(/ilondim,ilatdim,itimedim/),var_id)
573  ELSE
574  ic = nf90_def_var(kncid,ywork,nf90_float,(/ilondim,ilatdim,itimedim/),var_id)
575  ENDIF
576  ELSE
577  IF(ldouble(jvar))THEN
578  ic = nf90_def_var(kncid,ywork,nf90_double,(/ilondim,ilatdim/),var_id)
579  ELSE
580  ic = nf90_def_var(kncid,ywork,nf90_float,(/ilondim,ilatdim/),var_id)
581  ENDIF
582  ENDIF
583  ENDIF
584  !
585  ywork = hvlname(jvar)(1:len_trim(hvlname(jvar)))
586  ic = nf90_put_att(kncid,var_id,'long_name',ywork)
587  ywork = hunit(jvar)(1:len_trim(hunit(jvar)))
588  ic = nf90_put_att(kncid,var_id,'units',ywork)
589  IF(ldouble(jvar))THEN
590  ic = nf90_put_att(kncid,var_id,'_FillValue',pmissval)
591  ELSE
592  ic = nf90_put_att(kncid,var_id,'_FillValue',zmissval)
593  ENDIF
594  !
595 ENDDO
596 !
597 ic = nf90_enddef(kncid)
598 IF(ic/=nf90_noerr)THEN
599  WRITE(klisting,*)'NCCREATE for TRIP : Error file definition'
600  WRITE(klisting,*)nf90_strerror(ic)
601  CALL abort_trip('NCCREATE for TRIP : Error file definition')
602 ELSEIF(overbose)THEN
603  WRITE(klisting,*)'NCCREATE for TRIP : file definition is ok'
604 ENDIF
605 !
606 !Write dimensions
607 !
608 zlon(:)=plon(:)
609 zlat(:)=plat(:)
610 !
611 ic = nf90_put_var(kncid,ilon_id,zlon)
612 ic = nf90_put_var(kncid,ilat_id,zlat)
613 IF(PRESENT(kzlen))THEN
614  ALLOCATE(zwork(kzlen))
615  DO jvar = 1,kzlen
616  zwork(jvar)=jvar
617  ENDDO
618  ic = nf90_put_var(kncid,ilev_id,zwork)
619  DEALLOCATE(zwork)
620 ENDIF
621 !
622 IF(overbose)THEN
623  WRITE(klisting,*)'NCCREATE ',hfilename(1:len_trim(hfilename)),' for TRIP OK !'
624 ENDIF
625 !
626 IF (lhook) CALL dr_hook('MODE_TRIP_NETCDF:NCCREATE',1,zhook_handle)
627 !
628 END SUBROUTINE nccreate
629 !
630 !-------------------------------------------------------------------------------
631 !
632 !################################################
633 SUBROUTINE ncstore(KLISTING,KNCID,HVNAME,PWRITE, &
634  OVERBOSE,KTIMENUM,KTIMEVAL, &
635  KLEVEL,OVARZDIM,ODOUBLE )
636 !################################################
637 !
638 !! PURPOSE
639 !! -------
640 !
641 ! Write in a netcdf file with illimited time if this this the case
642 !
643 IMPLICIT NONE
644 !
645 !* declarations of arguments
646 !
647  CHARACTER(LEN=NF90_MAX_NAME), INTENT(IN) :: HVNAME
648 !
649 REAL, DIMENSION(:,:), INTENT(IN) :: PWRITE
650 !
651 INTEGER, INTENT(IN) :: KLISTING, KNCID
652 !
653 LOGICAL, INTENT(IN) :: OVERBOSE
654 !
655 INTEGER, INTENT(IN), OPTIONAL :: KTIMENUM
656 INTEGER, INTENT(IN), OPTIONAL :: KTIMEVAL
657 
658 INTEGER, INTENT(IN), OPTIONAL :: KLEVEL
659 LOGICAL, INTENT(IN), OPTIONAL :: OVARZDIM
660 LOGICAL, INTENT(IN), OPTIONAL :: ODOUBLE
661 !
662 !* declarations of local variables
663 !
664  CHARACTER(LEN=NF90_MAX_NAME) :: YWORK
665 !
666 REAL*4, DIMENSION(SIZE(PWRITE,1),SIZE(PWRITE,2)) :: ZWRITE
667 !
668 INTEGER, DIMENSION(4) :: ISTART, ICOUNT
669 !
670 INTEGER :: IUNLIMID, ITIMEID, ILENGHT, INDIM
671 INTEGER :: IC, IVAR_ID
672 LOGICAL :: LDOUBLE
673 !
674 REAL(KIND=JPRB) :: ZHOOK_HANDLE
675 !
676 !* procedure
677 !
678 IF (lhook) CALL dr_hook('MODE_TRIP_NETCDF:NCSTORE',0,zhook_handle)
679 !
680 IF(PRESENT(odouble))THEN
681  ldouble=odouble
682 ELSE
683  ldouble=.false.
684 ENDIF
685 !
686 IF(PRESENT(klevel).AND..NOT.PRESENT(ovarzdim))THEN
687  WRITE(klisting,*)'NCSTORE for TRIP : Error writing variable dimenssion ',hvname(1:len_trim(hvname))
688  WRITE(klisting,*)'ILEVEL present but not LVARZDIM'
689  WRITE(klisting,*)nf90_strerror(ic)
690  CALL abort_trip('NCSTORE for TRIP : Error writing variable dimenssion')
691 ENDIF
692 !
693 IF(PRESENT(ktimenum).AND.PRESENT(ktimeval))THEN
694  ic = nf90_inquire(kncid,unlimiteddimid=iunlimid)
695  IF(iunlimid/=-1)THEN
696  ic = nf90_inquire_dimension(kncid,iunlimid,len=ilenght)
697  IF(ktimenum/=ilenght)THEN
698  ic = nf90_inq_varid(kncid,'time',itimeid)
699  ic = nf90_put_var(kncid,itimeid,ktimeval,start=(/ktimenum/))
700  IF(overbose)THEN
701  WRITE(klisting,*)'NCSTORE : re-writing of time variable number=',&
702  ktimenum,' and value=',ktimeval
703  ENDIF
704  ENDIF
705  ENDIF
706 ENDIF
707 !
708 ywork = hvname(1:len_trim(hvname))
709 !
710 ic = nf90_inq_varid(kncid,ywork,ivar_id)
711 ic = nf90_inquire_variable(kncid,ivar_id,ndims=indim)
712 !
713 icount(1) = SIZE(pwrite,1)
714 icount(2) = SIZE(pwrite,2)
715 icount(3) = 1
716 icount(4) = 1
717 !
718 istart(1) = 1
719 istart(2) = 1
720 !
721 zwrite(:,:) = pwrite(:,:)
722 !
723 IF(PRESENT(klevel).AND.ovarzdim)THEN
724  istart(3) = klevel
725  IF(PRESENT(ktimenum).AND.PRESENT(ktimeval))THEN
726  istart(4) = ktimenum
727  IF(ldouble)THEN
728  ic = nf90_put_var(kncid,ivar_id,pwrite,start=istart(1:4),count=icount(1:4))
729  ELSE
730  ic = nf90_put_var(kncid,ivar_id,zwrite,start=istart(1:4),count=icount(1:4))
731  ENDIF
732  ELSE
733  IF(ldouble)THEN
734  ic = nf90_put_var(kncid,ivar_id,pwrite,start=istart(1:3),count=icount(1:3))
735  ELSE
736  ic = nf90_put_var(kncid,ivar_id,zwrite,start=istart(1:3),count=icount(1:3))
737  ENDIF
738  ENDIF
739 ELSE
740  IF(PRESENT(ktimenum).AND.PRESENT(ktimeval))THEN
741  istart(3) = ktimenum
742  IF(ldouble)THEN
743  ic = nf90_put_var(kncid,ivar_id,pwrite,start=istart(1:3),count=icount(1:3))
744  ELSE
745  ic = nf90_put_var(kncid,ivar_id,zwrite,start=istart(1:3),count=icount(1:3))
746  ENDIF
747  ELSE
748  IF(ldouble)THEN
749  ic = nf90_put_var(kncid,ivar_id,pwrite,start=istart(1:2),count=icount(1:2))
750  ELSE
751  ic = nf90_put_var(kncid,ivar_id,zwrite,start=istart(1:2),count=icount(1:2))
752  ENDIF
753  ENDIF
754 ENDIF
755 !
756 IF(ic/=nf90_noerr)THEN
757  WRITE(klisting,*)'NCSTORE for TRIP : Error writing variable ',hvname(1:len_trim(hvname))
758  WRITE(klisting,*)nf90_strerror(ic)
759  CALL abort_trip('NCSTORE for TRIP : Error writing variable')
760 ELSEIF(overbose)THEN
761  WRITE(klisting,*)'NCSTORE for TRIP : Success in writing variable ',hvname(1:len_trim(hvname))
762  IF(PRESENT(klevel))WRITE(klisting,*)' level: ',klevel
763 ENDIF
764 !
765 IF (lhook) CALL dr_hook('MODE_TRIP_NETCDF:NCSTORE',1,zhook_handle)
766 !
767 END SUBROUTINE ncstore
768 !
769 !-------------------------------------------------------------------------------
770 !
771 !#####################################################################
772 SUBROUTINE ncdate(KLISTING,KNCID,KYEAR,KMONTH,KDAY,PTIME,OVERBOSE)
773 !#####################################################################
774 !
775 !! PURPOSE
776 !! -------
777 !
778 ! Open a netcdf file name YFILENAME
779 !
780 IMPLICIT NONE
781 !
782 !* declarations of arguments
783 !
784 INTEGER, INTENT(IN) :: KLISTING
785 INTEGER, INTENT(IN) :: KNCID
786 INTEGER, INTENT(IN) :: KYEAR
787 INTEGER, INTENT(IN) :: KMONTH
788 INTEGER, INTENT(IN) :: KDAY
789 REAL, INTENT(IN) :: PTIME
790 !
791 LOGICAL, INTENT(IN) :: OVERBOSE
792 !
793 !* declarations of local variables
794 !
795  CHARACTER(LEN=NF90_MAX_NAME) :: YDATE, YWORK
796 !
797 REAL*4, DIMENSION(4) :: ZDATE
798 REAL*4 :: ZMISSVAL
799 !
800 INTEGER :: IC, IWORK, ISIZE, IDATEID
801 !
802 REAL(KIND=JPRB) :: ZHOOK_HANDLE
803 !
804 !* procedure
805 !
806 IF (lhook) CALL dr_hook('MODE_TRIP_NETCDF:NCDATE',0,zhook_handle)
807 !
808 ydate = 'date'
809 !
810 zdate(1) = REAL(kyear)
811 zdate(2) = REAL(kmonth)
812 zdate(3) = REAL(kday)
813 zdate(4) = REAL(ptime)
814 !
815 zmissval = xundef
816 !
817 ic = nf90_redef(kncid)
818 !
819 !Dimensions
820 iwork=4
821 ic = nf90_def_dim(kncid,ydate,iwork,isize)
822 IF(ic/=nf90_noerr)THEN
823  WRITE(klisting,*)'NCDATE for TRIP : Error creating date dimension '
824  WRITE(klisting,*)nf90_strerror(ic)
825  CALL abort_trip('NCDATE for TRIP : Error creating date dimension')
826 ENDIF
827 !
828 !Variable attributs
829 ic = nf90_def_var(kncid,ydate,nf90_float,isize,idateid)
830 ywork = 'current date: year month day time'
831 ic = nf90_put_att(kncid,idateid,'long_name',ywork)
832 IF(ic/=nf90_noerr)THEN
833  WRITE(klisting,*)'NCDATE for TRIP : Error creating date attributs'
834  WRITE(klisting,*)nf90_strerror(ic)
835  CALL abort_trip('NCDATE for TRIP : Error creating date attributs')
836 ENDIF
837 ic = nf90_put_att(kncid,idateid,'_FillValue',zmissval)
838 IF(ic/=nf90_noerr)THEN
839  WRITE(klisting,*)'NCDATE for TRIP : Error creating date attributs'
840  WRITE(klisting,*)nf90_strerror(ic)
841  CALL abort_trip('NCDATE for TRIP : Error creating date attributs')
842 ENDIF
843 !
844 ic = nf90_enddef(kncid)
845 !
846 ic = nf90_put_var(kncid,idateid,zdate)
847 !
848 IF(overbose)THEN
849  WRITE(klisting,*)'NCDATE for TRIP : Sucess in writting current date'
850 ENDIF
851 !
852 IF (lhook) CALL dr_hook('MODE_TRIP_NETCDF:NCDATE',1,zhook_handle)
853 !
854 END SUBROUTINE ncdate
855 !
856 !-------------------------------------------------------------------------------
857 !
858 END MODULE mode_trip_netcdf
subroutine ncstore(KLISTING, KNCID, HVNAME, PWRITE, OVERBOSE, KTIMENUM, KTIMEVAL, KLEVEL, OVARZDIM, ODOUBLE)
integer, parameter jprb
Definition: parkind1.F90:32
subroutine ncread_xy(KLISTING, KNCID, HVNAME, PVECT, OVERBOSE)
subroutine ncread_xyz(KLISTING, KNCID, HVNAME, PVECT, OVERBOSE)
subroutine ncclose(KLISTING, OVERBOSE, HFILENAME, KNCID)
subroutine ncdate(KLISTING, KNCID, KYEAR, KMONTH, KDAY, PTIME, OVERBOSE)
subroutine ncread_x(KLISTING, KNCID, HVNAME, PVECT, OVERBOSE)
logical lhook
Definition: yomhook.F90:15
subroutine nccreate(KLISTING, HFILENAME, HTITLE, HTIMEUNIT, HVNAME, HVLNAME, HUNIT, PLON, PLAT, PMISSVAL, OVERBOSE, KNCID, OTIME, KZLEN, OVARZDIM, ODOUBLE)
subroutine abort_trip(YTEXT)
Definition: abort_trip.F90:3
real, save xundef
static int count
Definition: memory_hook.c:21
subroutine ncopen(KLISTING, ORW, OVERBOSE, HFILENAME, KNCID)