SURFEX v8.1
General documentation of Surfex
mode_write_surf_nc.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
6 !
7 INTERFACE write_surf0_nc
8  MODULE PROCEDURE write_surfx0_nc
9  MODULE PROCEDURE write_surfn0_nc
10  MODULE PROCEDURE write_surfc0_nc
11  MODULE PROCEDURE write_surfl0_nc
12 END INTERFACE
13 INTERFACE write_surfn_nc
14  MODULE PROCEDURE write_surfx1_nc
15  MODULE PROCEDURE write_surfn1_nc
16  MODULE PROCEDURE write_surfn2_nc
17  MODULE PROCEDURE write_surfl1_nc
18  MODULE PROCEDURE write_surfx2_nc
19  MODULE PROCEDURE write_surfx3_nc
20 END INTERFACE
21 INTERFACE write_surft_nc
22  MODULE PROCEDURE write_surft0_nc
23  MODULE PROCEDURE write_surft1_nc
24  MODULE PROCEDURE write_surft2_nc
25 END INTERFACE
26 !
27 CONTAINS
28 !
29 ! #############################################################
30  SUBROUTINE write_surfx0_nc (HSELECT,HREC,PFIELD,KRESP,HCOMMENT)
31 ! #############################################################
32 !
33 !!**** *WRITEX0* - routine to read a real scalar
34 !
35 !
36 USE modd_io_surf_nc, ONLY : nid_nc, ldef
37 !
38 USE modi_io_buff
39 !
40 USE modi_def_var_netcdf
41 !
42 USE yomhook ,ONLY : lhook, dr_hook
43 USE parkind1 ,ONLY : jprb
44 !
45 USE netcdf
46 !
47 IMPLICIT NONE
48 !
49 !
50 !* 0.1 Declarations of arguments
51 !
52  CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: HSELECT
53 !
54  CHARACTER(LEN=12), INTENT(IN) :: HREC ! name of the article to be read
55 REAL, INTENT(IN) :: PFIELD ! the real scalar to be read
56 INTEGER, INTENT(OUT) :: KRESP ! KRESP : return-code if a problem appears
57  CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT
58 !
59 !* 0.2 Declarations of local variables
60 !
61 LOGICAL :: GFOUND
62  CHARACTER(LEN=100), DIMENSION(1) :: YATT_TITLE, YATT
63 INTEGER, DIMENSION(0) :: IDIMS
64 INTEGER :: IRET
65 INTEGER :: IVAR_ID,JRET
66 REAL(KIND=JPRB) :: ZHOOK_HANDLE
67 !
68 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFX0_NC',0,zhook_handle)
69 !
70 kresp=0
71 iret=0
72 !
73 yatt_title(1) = "comment"
74 yatt(1) = hcomment
75 !
76  CALL io_buff(hrec,'W',gfound)
77 IF (gfound .AND. lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFX0_NC',1,zhook_handle)
78 IF (gfound) RETURN
79 !
80 IF (nid_nc /= 0) THEN
81  ! 1. Define the variable
82  !----------------------------
83  IF (ldef) THEN
84  !
85  CALL def_var_netcdf(hselect, nid_nc, hrec, hrec, idims, yatt_title, yatt, ivar_id, nf90_double)
86  !
87  ELSE
88  ! 2. Put variable
89  !----------------------------
90  iret = nf90_inq_varid(nid_nc,hrec,ivar_id)
91  iret = nf90_put_var(nid_nc,ivar_id,pfield)
92  ENDIF
93 ENDIF
94 !
95 ! 3. Check for errors
96 !--------------------
97 IF (nid_nc==0 .OR. iret.NE.nf90_noerr) kresp=1
98 !
99 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFX0_NC',1,zhook_handle)
100 !
101 END SUBROUTINE write_surfx0_nc
102 !
103 ! #############################################################
104  SUBROUTINE write_surfn0_nc ( HSELECT, HREC,KFIELD,KRESP,HCOMMENT)
105 ! #############################################################
106 !
107 !!**** *WRITEN0* - routine to read an integer
108 !
109 !
110 !
111 !
112 USE modd_io_surf_nc, ONLY : nid_nc,ldef
113 !
114 USE modi_io_buff
115 !
116 USE modi_def_var_netcdf
117 !
118 USE yomhook ,ONLY : lhook, dr_hook
119 USE parkind1 ,ONLY : jprb
120 !
121 USE netcdf
122 !
123 IMPLICIT NONE
124 !
125 !
126 !* 0.1 Declarations of arguments
127 !
128 !
129  CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: HSELECT
130 !
131  CHARACTER(LEN=12), INTENT(IN) :: HREC ! name of the article to be read
132 INTEGER, INTENT(IN) :: KFIELD ! the integer scalar to be read
133 INTEGER, INTENT(OUT) :: KRESP ! KRESP : return-code if a problem appears
134  CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT
135 !
136 !* 0.2 Declarations of local variables
137 !
138 LOGICAL :: GFOUND
139  CHARACTER(LEN=100), DIMENSION(1) :: YATT_TITLE, YATT
140 INTEGER, DIMENSION(0) :: IDIMS
141 INTEGER :: IVAR_ID, JRET
142 INTEGER :: IRET
143 REAL(KIND=JPRB) :: ZHOOK_HANDLE
144 !
145 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFN0_NC',0,zhook_handle)
146 !
147 iret = 0
148 kresp= 0
149 !
150 yatt_title(1) = "comment"
151 yatt(1) = hcomment
152 !
153  CALL io_buff(hrec,'W',gfound)
154 IF (gfound .AND. lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFN0_NC',1,zhook_handle)
155 IF (gfound) RETURN
156 !
157 ! 0. find filename
158 ! -----------------
159 !
160 IF (nid_nc /= 0) THEN
161  ! 1. Find id of the variable
162  !----------------------------
163  IF (ldef) THEN
164  CALL def_var_netcdf(hselect, nid_nc, hrec, hrec, idims, yatt_title, yatt, ivar_id, nf90_int)
165  !
166  ! 2. Get variable
167  !----------------------------
168  ELSE
169  iret=nf90_inq_varid(nid_nc,hrec,ivar_id)
170  iret=nf90_put_var(nid_nc,ivar_id,kfield)
171  ENDIF
172 ENDIF
173 !
174 ! 3. Check for errors
175 !--------------------
176 IF (nid_nc==0 .OR. iret.NE.nf90_noerr) kresp=1
177 !
178 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFN0_NC',1,zhook_handle)
179 !
180 END SUBROUTINE write_surfn0_nc
181 !
182 ! #############################################################
183  SUBROUTINE write_surfc0_nc ( HSELECT, HREC,HFIELD,KRESP,HCOMMENT)
184 ! #############################################################
185 !
186 !!**** *WRITEC0* - routine to read a STRING
187 !
188 !
189 !
190 !
191 USE modd_io_surf_nc, ONLY : nid_nc, ldef
192 !
193 USE modi_io_buff
194 !
195 USE modi_def_var_netcdf
196 !
197 USE yomhook ,ONLY : lhook, dr_hook
198 USE parkind1 ,ONLY : jprb
199 !
200 USE netcdf
201 !
202 IMPLICIT NONE
203 !
204 !
205 !* 0.1 Declarations of arguments
206 !
207 !
208  CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: HSELECT
209 !
210  CHARACTER(LEN=12), INTENT(IN) :: HREC ! name of the article to be read
211  CHARACTER(LEN=40), INTENT(IN) :: HFIELD ! the integer scalar to be read
212 INTEGER, INTENT(OUT) :: KRESP ! KRESP : return-code if a problem appears
213  CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT
214 !
215 !* 0.2 Declarations of local variables
216 !
217 LOGICAL :: GFOUND
218  CHARACTER(LEN=100), DIMENSION(1) :: YATT_TITLE, YATT
219 INTEGER, DIMENSION(1) :: IDIMS, ISTART, ICOUNT
220  CHARACTER(LEN=1), DIMENSION(:), ALLOCATABLE :: YFIELD
221 INTEGER :: IVAR_ID, JRET
222 INTEGER :: IRET, J
223 REAL(KIND=JPRB) :: ZHOOK_HANDLE
224 !
225 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFC0_NC',0,zhook_handle)
226 !
227 kresp=0
228 !
229 yatt_title(1) = "comment"
230 yatt(1) = hcomment
231 !
232  CALL io_buff(hrec,'W',gfound)
233 IF (gfound .AND. lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFC0_NC',1,zhook_handle)
234 IF (gfound) RETURN
235 !
236 IF (nid_nc /= 0) THEN
237  ! 1. Find id of the variable
238  !----------------------------
239  IF (ldef) THEN
240  iret = nf90_inq_dimid(nid_nc,'char_len',idims(1))
241  !
242  CALL def_var_netcdf(hselect, nid_nc, hrec, hrec, idims, yatt_title, yatt, ivar_id, nf90_char,len_trim(hfield))
243  !
244  ELSE
245  iret = nf90_inq_varid(nid_nc,hrec,ivar_id)
246  ! 2. Get variable
247  !----------------------------
248  ALLOCATE(yfield(len(hfield)))
249  DO j=1,len(hfield)
250  yfield(j) = hfield(j:j)
251  ENDDO
252  istart(1) = 1
253  icount(1) = len(hfield)
254  iret=nf90_put_var(nid_nc,ivar_id,yfield,istart,icount)
255  ENDIF
256 ENDIF
257 !
258 ! 3. Check for errors
259 !--------------------
260 IF (nid_nc==0 .OR. iret.NE.nf90_noerr) kresp=1
261 !
262 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFC0_NC',1,zhook_handle)
263 !
264 END SUBROUTINE write_surfc0_nc
265 !
266 ! #############################################################
267  SUBROUTINE write_surfl0_nc ( HSELECT, HREC,OFIELD,KRESP,HCOMMENT)
268 ! #############################################################
269 !
270 !!**** *WRITEL0* - routine to read a logical
271 !
272 !
273 !
274 !
275 USE modd_io_surf_nc, ONLY : nid_nc,ldef
276 !
277 USE modi_io_buff
278 !
279 USE modi_def_var_netcdf
280 !
281 USE modi_handle_err
282 !
283 USE yomhook ,ONLY : lhook, dr_hook
284 USE parkind1 ,ONLY : jprb
285 !
286 USE netcdf
287 !
288 IMPLICIT NONE
289 !
290 !
291 !* 0.1 Declarations of arguments
292 !
293 !
294  CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: HSELECT
295 !
296  CHARACTER(LEN=12), INTENT(IN) :: HREC ! name of the article to be read
297 LOGICAL, INTENT(IN) :: OFIELD ! array containing the data field
298 INTEGER, INTENT(OUT):: KRESP ! KRESP : return-code if a problem appears
299  CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT
300 !
301 !* 0.2 Declarations of local variables
302 !
303 LOGICAL :: GFOUND
304  CHARACTER(LEN=100), DIMENSION(1) :: YATT_TITLE, YATT
305 INTEGER, DIMENSION(0) :: IDIMS
306  CHARACTER(LEN=1) :: YFIELD ! work array read in the file
307 INTEGER :: IVAR_ID
308 INTEGER :: IRET
309 REAL(KIND=JPRB) :: ZHOOK_HANDLE
310 !
311 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFL0_NC',0,zhook_handle)
312 !
313 IF (ofield) THEN
314  yfield = 'T'
315 ELSE
316  yfield = 'F'
317 ENDIF
318 !
319 iret=0
320 kresp=0
321 !
322  CALL io_buff(hrec,'W',gfound)
323 IF (gfound .AND. lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFL0_NC',1,zhook_handle)
324 IF (gfound) RETURN
325 !
326 yatt_title(1) = "comment"
327 yatt(1) = hcomment
328 !
329 IF (nid_nc /= 0) THEN
330  !
331  IF (ldef) THEN
332  CALL def_var_netcdf(hselect, nid_nc, hrec, hrec, idims, yatt_title, yatt, ivar_id, nf90_char)
333  !
334  ELSE
335  !
336  iret = nf90_inq_varid(nid_nc,hrec,ivar_id)
337  ! 2. Put variable
338  !----------------------------
339  !
340  iret=nf90_put_var(nid_nc,ivar_id,yfield)
341  !
342  CALL handle_err(iret,hrec)
343  ENDIF
344  !
345 ENDIF
346 !
347 ! 3. Check for errors
348 !--------------------
349 IF (nid_nc==0 .OR. iret.NE.nf90_noerr) kresp=1
350 !
351 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFL0_NC',1,zhook_handle)
352 !
353 END SUBROUTINE write_surfl0_nc
354 !
355 !
356 ! #############################################################
357  SUBROUTINE write_surfx1_nc ( HSELECT, HREC,PFIELD,KRESP,HCOMMENT,HDIR,HNAM_DIM)
358 ! #############################################################
359 !
360 !!**** *WRITEX1* - routine to fill a real 1D array for the externalised surface
361 !
362 USE modd_surfex_mpi, ONLY : nrank, npio, nproc, ncomm
363 !
364 !
366 !
367 USE modi_def_var_netcdf
368 !
369 USE modi_io_buff
370 !
371 USE yomhook ,ONLY : lhook, dr_hook
372 USE parkind1 ,ONLY : jprb
373 !
374 USE netcdf
375 !
376 IMPLICIT NONE
377 !
378 !
379 #ifdef SFX_MPI
380 include "mpif.h"
381 #endif
382 !
383 !* 0.1 Declarations of arguments
384 !
385 !
386  CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: HSELECT
387 !
388  CHARACTER(LEN=12), INTENT(IN) :: HREC ! name of the article to be read
389 REAL, DIMENSION(:), INTENT(IN) :: PFIELD ! array containing the data field
390 INTEGER, INTENT(OUT):: KRESP ! KRESP : return-code if a problem appears
391  CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT
392  CHARACTER(LEN=1), INTENT(IN) :: HDIR ! type of field :
393  ! 'H' : field with
394  ! horizontal spatial dim.
395  ! '-' : no horizontal dim.
396  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: HNAM_DIM
397 !* 0.2 Declarations of local variables
398 !
399 INTEGER :: IRET0
400 LOGICAL :: GFOUND
401  CHARACTER(LEN=100), DIMENSION(1) :: YATT_TITLE, YATT
402 INTEGER, DIMENSION(2) :: IDIMIDS
403 INTEGER, DIMENSION(2) :: IDIMLEN
404  CHARACTER(LEN=100) :: YNAME
405  CHARACTER(LEN=16) :: YNAM_DIM
406 INTEGER :: IVAR_ID, JDIM, INDIMS
407 INTEGER :: JRET
408 INTEGER :: INFOMPI
409 INTEGER,DIMENSION(5) :: IRET
410 REAL(KIND=JPRB) :: ZHOOK_HANDLE
411 !
412 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFX1_NC',0,zhook_handle)
413 !
414 kresp = 0
415 !
416 iret(:) = 0
417 !
418 yatt_title(1) = "comment"
419 yatt(1) = hcomment
420 !
421 IF (PRESENT(hnam_dim)) THEN
422  ynam_dim = hnam_dim
423 ELSE
424  ynam_dim = "Number_of_points"
425 ENDIF
426 !
427 indims = 0
428 idimlen(:) = 0
429 yname = ""
430 !
431  CALL io_buff(hrec,'W',gfound)
432 !
433 IF (gfound .AND. lhook) CALL dr_hook("WRITE_SURF_NC:WRITE_SURFX1_NC",1,zhook_handle)
434 IF (gfound) RETURN
435 !
436 IF (nrank==npio) THEN
437  !
438  IF (nid_nc /= 0) THEN
439  !
440  ! 0. find filename
441  ! -----------------
442  !
443  iret(1) = nf90_inquire(nid_nc,ndimensions=indims)
444  iret(2) = nf90_inq_dimid(nid_nc,trim(ynam_dim),idimids(1))
445  IF (iret(2)/=0) THEN
446  iret(2) = nf90_inq_dimid(nid_nc,'lon',idimids(1))
447  IF (iret(2)/=0) THEN
448  iret(2) = nf90_inq_dimid(nid_nc,'xx',idimids(1))
449  iret(3) = nf90_inq_dimid(nid_nc,'yy',idimids(2))
450  ELSE
451  iret(3) = nf90_inq_dimid(nid_nc,'lat',idimids(2))
452  ENDIF
453  iret0=nf90_inquire_dimension(nid_nc,idimids(2),len=idimlen(2))
454  ENDIF
455  iret0=nf90_inquire_dimension(nid_nc,idimids(1),len=idimlen(1))
456  !
457  iret(4)=nf90_inquire_dimension(nid_nc,idimids(1),name=yname)
458  !
459  DO jret=1,4
460  IF (iret0==0 .OR. iret(jret).NE.nf90_noerr) kresp=1
461  ENDDO
462  !
463  ELSE
464  indims = 0
465  idimids(:) = 0
466  idimlen(:) = 0
467  yname = ""
468  ENDIF
469  !
470 ELSE
471  indims = 0
472  idimids(:) = 0
473  idimlen(:) = 0
474  yname = ""
475 ENDIF
476 !
477 #ifdef SFX_MPI
478 IF (nproc>1) THEN
479  CALL mpi_bcast(yname,len(yname),mpi_character,npio,ncomm,infompi)
480  CALL mpi_bcast(indims,kind(indims)/4,mpi_integer,npio,ncomm,infompi)
481  CALL mpi_bcast(idimlen,kind(idimlen)*SIZE(idimlen)/4,mpi_integer,npio,ncomm,infompi)
482 ENDIF
483 #endif
484 !
485 IF (yname.NE.'lon' .AND. yname.NE.'xx') THEN
486  IF (ldef) THEN
487  IF (nrank==npio) THEN
488  CALL def_var_netcdf( hselect, nid_nc, hrec, hrec, idimids(1:1), yatt_title, yatt, ivar_id, nf90_double,1)
489  ENDIF
490  ELSE
491  jret = nf90_inq_varid(nid_nc,hrec,ivar_id)
492  CALL write_datax1_nc(idimlen(1),indims)
493  ENDIF
494 ELSE
495  IF (ldef) THEN
496  IF (nrank==npio) THEN
497  CALL def_var_netcdf( hselect, nid_nc, hrec, hrec, idimids(1:2), yatt_title, yatt, ivar_id, nf90_double)
498  ENDIF
499  ELSE
500  jret = nf90_inq_varid(nid_nc,hrec,ivar_id)
501  CALL write_datax1_nc(idimlen(1)*idimlen(2),indims)
502  ENDIF
503 ENDIF
504 !
505 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFX1_NC',1,zhook_handle)
506 !
507 CONTAINS
508 !
509 SUBROUTINE write_datax1_nc(KDIM,KNDIMS)
510 !
511 USE modd_surf_par, ONLY : xundef
512 !
515 USE modi_handle_err
516 !
517 USE netcdf
518 !
519 IMPLICIT NONE
520 !
521 INTEGER, INTENT(IN) :: KDIM
522 INTEGER, INTENT(IN) :: KNDIMS
523 !
524 REAL, DIMENSION(KDIM) :: ZTAB1D
525 REAL, DIMENSION(KDIM) :: ZWORK_IGN
526 !
527 INTEGER, DIMENSION(2) :: ISTART, ICOUNT
528 !
529 REAL(KIND=JPRB) :: ZHOOK_HANDLE
530 !
531 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFX1_NC:WRITE_DATAX1_NC',0,zhook_handle)
532 !
533 ztab1d(:) = xundef
534 !
535 IF (hdir=='-') THEN
536  IF (nrank==npio) ztab1d(1:SIZE(pfield)) = pfield(:)
537 ELSEIF(.NOT.ALLOCATED(nmask_ign))THEN
538  IF (lmask) THEN
539  CALL gather_and_write_mpi(pfield,ztab1d,nmask)
540  ELSE
541  CALL gather_and_write_mpi(pfield,ztab1d)
542  ENDIF
543 ELSE
544  !ign grid
545  IF (lmask) THEN
546  CALL gather_and_write_mpi(pfield,zwork_ign(1:SIZE(nmask_ign)),nmask)
547  ELSE
548  CALL gather_and_write_mpi(pfield,zwork_ign(1:SIZE(nmask_ign)))
549  ENDIF
550  CALL unpack_same_rank(nmask_ign,zwork_ign(1:SIZE(nmask_ign)),ztab1d)
551 ENDIF
552 !
553 IF (nrank==npio) THEN
554  istart(:) = 1
555  icount(:) = idimlen(1:2)
556  iret(5)=nf90_put_var(nid_nc,ivar_id,ztab1d,istart,icount)
557  CALL handle_err(iret(5),hrec)
558 ENDIF
559 
560 !
561 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFX1_NC:WRITE_DATAX1_NC',1,zhook_handle)
562 !
563 END SUBROUTINE write_datax1_nc
564 !
565 END SUBROUTINE write_surfx1_nc
566 !
567 ! #############################################################
568  SUBROUTINE write_surfx2_nc ( HSELECT, HREC,PFIELD,KRESP,HCOMMENT,HDIR,HNAM_DIM)
569 ! #############################################################
570 !
571 !!**** *WRITEX2* - routine to fill a real 2D array for the externalised surface
572 !
573 !
574 !
575 !
576 USE modd_surfex_mpi, ONLY : nrank, npio, nproc, ncomm
577 !
579 !
580 USE modi_io_buff
581 !
582 USE modi_def_var_netcdf
583 !
584 USE yomhook ,ONLY : lhook, dr_hook
585 USE parkind1 ,ONLY : jprb
586 !
587 USE netcdf
588 !
589 IMPLICIT NONE
590 !
591 !
592 #ifdef SFX_MPI
593 include "mpif.h"
594 #endif
595 !
596 !* 0.1 Declarations of arguments
597 !
598 !
599  CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: HSELECT
600 !
601  CHARACTER(LEN=12), INTENT(IN) :: HREC ! name of the article to be read
602 REAL, DIMENSION(:,:), INTENT(IN) :: PFIELD ! array containing the data field
603 INTEGER, INTENT(OUT):: KRESP ! KRESP : return-code if a problem appears
604  CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT
605  CHARACTER(LEN=1), INTENT(IN) :: HDIR ! type of field :
606  ! 'H' : field with
607  ! horizontal spatial dim.
608  ! '-' : no horizontal dim.
609  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: HNAM_DIM
610 !* 0.2 Declarations of local variables
611 !
612 INTEGER :: IRET0
613 LOGICAL :: GFOUND
614  CHARACTER(LEN=100), DIMENSION(1) :: YATT_TITLE, YATT
615 INTEGER, DIMENSION(3) :: IDIMIDS
616 INTEGER, DIMENSION(3) :: IDIMLEN
617  CHARACTER(LEN=100) :: YNAME
618  CHARACTER(LEN=18) :: YNAM_DIM
619 INTEGER :: IVAR_ID, JDIM, INDIMS
620 INTEGER :: JRET
621 INTEGER :: INFOMPI
622 INTEGER, DIMENSION(5) :: IRET
623 REAL(KIND=JPRB) :: ZHOOK_HANDLE
624 !
625 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFX2_NC',0,zhook_handle)
626 !
627 kresp = 0
628 !
629 iret(:) = 0
630 !
631 indims = 0
632 idimlen(:) = 0
633 yname = ""
634 kresp=0
635 !
636  CALL io_buff(hrec,'W',gfound)
637 !
638 yatt_title(1) = "comment"
639 yatt(1) = hcomment
640 !
641 IF (gfound .AND. lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFX2_NC',1,zhook_handle)
642 IF (gfound) RETURN
643 !
644 IF (PRESENT(hnam_dim)) THEN
645  ynam_dim = hnam_dim
646 ELSE
647  ynam_dim = "Number_of_Patches"
648 ENDIF
649 !
650 IF (nrank==npio) THEN
651  !
652  IF (nid_nc /= 0) THEN
653  !
654  ! 0. find filename
655  ! -----------------
656  !
657  iret(1) = nf90_inquire(nid_nc,ndimensions=indims)
658  IF ( trim(ynam_dim) == "Nemis_snap" ) THEN
659  iret(2) = nf90_inq_dimid(nid_nc,"Nsnap_temp",idimids(1))
660  ELSE
661  iret(2) = nf90_inq_dimid(nid_nc,"Number_of_points",idimids(1))
662  ENDIF
663  IF (iret(2)==0) THEN
664  iret(3) = nf90_inq_dimid(nid_nc,trim(ynam_dim),idimids(2))
665  ELSE
666  iret(2) = nf90_inq_dimid(nid_nc,'lon',idimids(1))
667  IF (iret(2)/=0) THEN
668  iret(2) = nf90_inq_dimid(nid_nc,'xx',idimids(1))
669  iret(3) = nf90_inq_dimid(nid_nc,'yy',idimids(2))
670  ELSE
671  iret(3) = nf90_inq_dimid(nid_nc,'lat',idimids(2))
672  ENDIF
673  iret(4) = nf90_inq_dimid(nid_nc,trim(ynam_dim),idimids(3))
674  iret0=nf90_inquire_dimension(nid_nc,idimids(3),len=idimlen(3))
675  ENDIF
676  DO jdim=1,2
677  iret0=nf90_inquire_dimension(nid_nc,idimids(jdim),len=idimlen(jdim))
678  ENDDO
679  !
680  iret(5)=nf90_inquire_dimension(nid_nc,idimids(1),name=yname)
681  !
682  DO jret=1,5
683  IF (iret0==0 .OR. iret(jret).NE.nf90_noerr) kresp=1
684  ENDDO
685  !
686  ELSE
687  indims = 0
688  idimids(:) = 0
689  idimlen(:) = 0
690  yname = ""
691  ENDIF
692  !
693 ELSE
694  indims = 0
695  idimids(:) = 0
696  idimlen(:) = SIZE(pfield,2)
697  yname = ""
698 ENDIF
699 !
700 #ifdef SFX_MPI
701 IF (nproc>1) THEN
702  CALL mpi_bcast(yname,len(yname),mpi_character,npio,ncomm,infompi)
703  CALL mpi_bcast(indims,kind(indims)/4,mpi_integer,npio,ncomm,infompi)
704  CALL mpi_bcast(idimlen,kind(idimlen)*SIZE(idimlen)/4,mpi_integer,npio,ncomm,infompi)
705 ENDIF
706 #endif
707 !
708 IF (yname .NE. 'lon' .AND. yname .NE. 'xx') THEN
709  IF (ldef) THEN
710  IF (nrank==npio) THEN
711  CALL def_var_netcdf( hselect, &
712  nid_nc, hrec, hrec, idimids(1:2), yatt_title, yatt, ivar_id, nf90_double)
713  ENDIF
714  ELSE
715  jret = nf90_inq_varid(nid_nc,hrec,ivar_id)
716  CALL write_datax2_nc(idimlen(1),idimlen(2),indims)
717  ENDIF
718 ELSE
719  IF (ldef) THEN
720  IF (nrank==npio) THEN
721  CALL def_var_netcdf( hselect, &
722  nid_nc, hrec, hrec, idimids(1:3), yatt_title, yatt, ivar_id, nf90_double)
723  ENDIF
724  ELSE
725  jret = nf90_inq_varid(nid_nc,hrec,ivar_id)
726  CALL write_datax2_nc(idimlen(1)*idimlen(2),idimlen(3),indims)
727  ENDIF
728 ENDIF
729 !
730 !
731 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFX2_NC',1,zhook_handle)
732 !
733 CONTAINS
734 !
735 SUBROUTINE write_datax2_nc(KDIM1,KDIM2,KNDIMS)
736 !
737 USE modd_surf_par, ONLY : xundef
738 !
741 USE modi_handle_err
742 !
743 USE netcdf
744 !
745 IMPLICIT NONE
746 !
747 INTEGER, INTENT(IN) :: KDIM1
748 INTEGER, INTENT(IN) :: KDIM2
749 INTEGER, INTENT(IN) :: KNDIMS
750 !
751 REAL, DIMENSION(KDIM1,KDIM2) :: ZTAB2D ! work array read in the file
752 REAL, DIMENSION(KDIM1,SIZE(PFIELD,2)) :: ZWORK_IGN ! work array read in the file
753 !
754 INTEGER, DIMENSION(3) :: ISTART, ICOUNT
755 !
756 REAL(KIND=JPRB) :: ZHOOK_HANDLE
757 !
758 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFX2_NC:WRITE_DATAX2_NC',0,zhook_handle)
759 !
760 ztab2d = xundef
761 !
762 IF (hdir=='-') THEN
763  IF (nrank==npio) ztab2d(1:SIZE(pfield,1),1:SIZE(pfield,2)) = pfield(:,:)
764 ELSEIF(.NOT.ALLOCATED(nmask_ign))THEN
765  IF (lmask) THEN
766  CALL gather_and_write_mpi(pfield,ztab2d(:,1:SIZE(pfield,2)),nmask)
767  ELSE
768  CALL gather_and_write_mpi(pfield,ztab2d(:,1:SIZE(pfield,2)))
769  ENDIF
770 ELSE
771  !ign grid
772  IF (lmask) THEN
773  CALL gather_and_write_mpi(pfield,zwork_ign(1:SIZE(nmask_ign),:),nmask)
774  ELSE
775  CALL gather_and_write_mpi(pfield,zwork_ign(1:SIZE(nmask_ign),:))
776  ENDIF
777  CALL unpack_same_rank(nmask_ign,zwork_ign(1:SIZE(nmask_ign),:),ztab2d(:,1:SIZE(pfield,2)))
778 ENDIF
779 !
780 IF (nrank==npio) THEN
781  istart(:) = 1
782  icount(:) = idimlen(1:3)
783  iret(5)=nf90_put_var(nid_nc,ivar_id,ztab2d,istart,icount)
784  CALL handle_err(iret(5),hrec)
785 ENDIF
786 !
787 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFX2_NC:WRITE_DATAX2_NC',1,zhook_handle)
788 !
789 END SUBROUTINE write_datax2_nc
790 !
791 END SUBROUTINE write_surfx2_nc
792 !
793 ! #############################################################
794  SUBROUTINE write_surfx3_nc ( HSELECT, HREC,PFIELD,KRESP,HCOMMENT,HDIR,HNAM_DIM)
795 ! #############################################################
796 !
797 !!**** *WRITEX2* - routine to fill a real 2D array for the externalised surface
798 !
799 !
800 !
801 !
802 USE modd_surfex_mpi, ONLY : nrank, npio, nproc, ncomm
803 !
805 !
806 USE modi_io_buff
807 !
808 USE modi_def_var_netcdf
809 USE modi_abor1_sfx
810 !
811 USE yomhook ,ONLY : lhook, dr_hook
812 USE parkind1 ,ONLY : jprb
813 !
814 USE netcdf
815 !
816 IMPLICIT NONE
817 !
818 !
819 #ifdef SFX_MPI
820 include "mpif.h"
821 #endif
822 !
823 !* 0.1 Declarations of arguments
824 !
825 !
826  CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: HSELECT
827 !
828  CHARACTER(LEN=12), INTENT(IN) :: HREC ! name of the article to be read
829 REAL, DIMENSION(:,:,:), INTENT(IN) :: PFIELD ! array containing the data field
830 INTEGER, INTENT(OUT):: KRESP ! KRESP : return-code if a problem appears
831  CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT
832  CHARACTER(LEN=1), INTENT(IN) :: HDIR ! type of field :
833  ! 'H' : field with
834  ! horizontal spatial dim.
835  ! '-' : no horizontal dim.
836  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: HNAM_DIM
837 !* 0.2 Declarations of local variables
838 !
839 INTEGER :: IRET0
840 LOGICAL :: GFOUND
841  CHARACTER(LEN=100), DIMENSION(1) :: YATT_TITLE, YATT
842 INTEGER, DIMENSION(4) :: IDIMIDS
843 INTEGER, DIMENSION(4) :: IDIMLEN
844  CHARACTER(LEN=100) :: YNAME
845  CHARACTER(LEN=18) :: YNAM_DIM
846 INTEGER :: IVAR_ID, JDIM, INDIMS
847 INTEGER :: JRET
848 INTEGER :: INFOMPI
849 INTEGER, DIMENSION(5) :: IRET
850 REAL(KIND=JPRB) :: ZHOOK_HANDLE
851 !
852 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFX3_NC',0,zhook_handle)
853 !
854 kresp = 0
855 !
856 iret(:) = 0
857 !
858 indims = 0
859 idimlen(:) = 0
860 yname = ""
861 kresp=0
862 !
863  CALL io_buff(hrec,'W',gfound)
864 !
865 yatt_title(1) = "comment"
866 yatt(1) = hcomment
867 !
868 IF (gfound .AND. lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFX3_NC',1,zhook_handle)
869 IF (gfound) RETURN
870 !
871 IF (PRESENT(hnam_dim)) THEN
872  ynam_dim = hnam_dim
873 ELSE
874  CALL abor1_sfx("WRITE_SURFX3_NC: TO WRITE A 3D FIELD, HNAM_DIM IS NEEDED")
875 ENDIF
876 !
877 IF (nrank==npio) THEN
878  !
879  IF (nid_nc /= 0) THEN
880  !
881  ! 0. find filename
882  ! -----------------
883  !
884  iret(1) = nf90_inquire(nid_nc,ndimensions=indims)
885  iret(2) = nf90_inq_dimid(nid_nc,"Number_of_points",idimids(1))
886  IF (iret(2)==0) THEN
887  iret(3) = nf90_inq_dimid(nid_nc,trim(ynam_dim),idimids(2))
888  iret(4) = nf90_inq_dimid(nid_nc,"Number_of_Patches",idimids(3))
889  ELSE
890  iret(2) = nf90_inq_dimid(nid_nc,'lon',idimids(1))
891  IF (iret(2)/=0) THEN
892  iret(2) = nf90_inq_dimid(nid_nc,'xx',idimids(1))
893  iret(3) = nf90_inq_dimid(nid_nc,'yy',idimids(2))
894  ELSE
895  iret(3) = nf90_inq_dimid(nid_nc,'lat',idimids(2))
896  ENDIF
897  iret(4) = nf90_inq_dimid(nid_nc,trim(ynam_dim),idimids(3))
898  iret0=nf90_inquire_dimension(nid_nc,idimids(3),len=idimlen(3))
899  iret(5) = nf90_inq_dimid(nid_nc,"Number_of_Patches",idimids(4))
900  iret0=nf90_inquire_dimension(nid_nc,idimids(4),len=idimlen(4))
901  ENDIF
902  DO jdim=1,2
903  iret0=nf90_inquire_dimension(nid_nc,idimids(jdim),len=idimlen(jdim))
904  ENDDO
905  !
906  iret(5)=nf90_inquire_dimension(nid_nc,idimids(1),name=yname)
907  !
908  DO jret=1,5
909  IF (iret0==0 .OR. iret(jret).NE.nf90_noerr) kresp=1
910  ENDDO
911  !
912  ELSE
913  indims = 0
914  idimids(:) = 0
915  idimlen(:) = 0
916  yname = ""
917  ENDIF
918  !
919 ELSE
920  indims = 0
921  idimids(:) = 0
922  idimlen(:) = SIZE(pfield,2)
923  yname = ""
924 ENDIF
925 !
926 #ifdef SFX_MPI
927 IF (nproc>1) THEN
928  CALL mpi_bcast(yname,len(yname),mpi_character,npio,ncomm,infompi)
929  CALL mpi_bcast(indims,kind(indims)/4,mpi_integer,npio,ncomm,infompi)
930  CALL mpi_bcast(idimlen,kind(idimlen)*SIZE(idimlen)/4,mpi_integer,npio,ncomm,infompi)
931 ENDIF
932 #endif
933 !
934 IF (yname .NE. 'lon' .AND. yname .NE. 'xx') THEN
935  IF (ldef) THEN
936  IF (nrank==npio) THEN
937  CALL def_var_netcdf( hselect, &
938  nid_nc, hrec, hrec, idimids(1:3), yatt_title, yatt, ivar_id, nf90_double)
939  ENDIF
940  ELSE
941  jret = nf90_inq_varid(nid_nc,hrec,ivar_id)
942  CALL write_datax3_nc(idimlen(1),idimlen(2),idimlen(3),indims)
943  ENDIF
944 ELSE
945  IF (ldef) THEN
946  IF (nrank==npio) THEN
947  CALL def_var_netcdf( hselect, &
948  nid_nc, hrec, hrec, idimids(1:4), yatt_title, yatt, ivar_id, nf90_double)
949  ENDIF
950  ELSE
951  jret = nf90_inq_varid(nid_nc,hrec,ivar_id)
952  CALL write_datax3_nc(idimlen(1)*idimlen(2),idimlen(3),idimlen(4),indims)
953  ENDIF
954 ENDIF
955 !
956 !
957 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFX2_NC',1,zhook_handle)
958 !
959 CONTAINS
960 !
961 SUBROUTINE write_datax3_nc(KDIM1,KDIM2,KDIM3,KNDIMS)
962 !
963 USE modd_surf_par, ONLY : xundef
964 !
967 USE modi_handle_err
968 !
969 USE netcdf
970 !
971 IMPLICIT NONE
972 !
973 INTEGER, INTENT(IN) :: KDIM1
974 INTEGER, INTENT(IN) :: KDIM2
975 INTEGER, INTENT(IN) :: KDIM3
976 INTEGER, INTENT(IN) :: KNDIMS
977 !
978 REAL, DIMENSION(KDIM1,KDIM2,KDIM3) :: ZTAB3D ! work array read in the file
979 REAL, DIMENSION(KDIM1,SIZE(PFIELD,2),SIZE(PFIELD,3)) :: ZWORK_IGN ! work array read in the file
980 !
981 INTEGER, DIMENSION(4) :: ISTART, ICOUNT
982 !
983 REAL(KIND=JPRB) :: ZHOOK_HANDLE
984 !
985 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFX2_NC:WRITE_DATAX2_NC',0,zhook_handle)
986 !
987 ztab3d = xundef
988 !
989 IF (hdir=='-') THEN
990  IF (nrank==npio) ztab3d(1:SIZE(pfield,1),1:SIZE(pfield,2),1:SIZE(pfield,3)) = pfield(:,:,:)
991 ELSEIF(.NOT.ALLOCATED(nmask_ign))THEN
992  IF (lmask) THEN
993  CALL gather_and_write_mpi(pfield,ztab3d(:,1:SIZE(pfield,2),1:SIZE(pfield,3)),nmask)
994  ELSE
995  CALL gather_and_write_mpi(pfield,ztab3d(:,1:SIZE(pfield,2),1:SIZE(pfield,3)))
996  ENDIF
997 ELSE
998  !ign grid
999  IF (lmask) THEN
1000  CALL gather_and_write_mpi(pfield,zwork_ign(1:SIZE(nmask_ign),:,:),nmask)
1001  ELSE
1002  CALL gather_and_write_mpi(pfield,zwork_ign(1:SIZE(nmask_ign),:,:))
1003  ENDIF
1004  CALL unpack_same_rank(nmask_ign,zwork_ign(1:SIZE(nmask_ign),:,:),ztab3d(:,1:SIZE(pfield,2),1:SIZE(pfield,3)))
1005 ENDIF
1006 !
1007 IF (nrank==npio) THEN
1008  istart(:) = 1
1009  icount(:) = idimlen(1:4)
1010  iret(5)=nf90_put_var(nid_nc,ivar_id,ztab3d,istart,icount)
1011  CALL handle_err(iret(5),hrec)
1012 ENDIF
1013 !
1014 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFX3_NC:WRITE_DATAX3_NC',1,zhook_handle)
1015 !
1016 END SUBROUTINE write_datax3_nc
1017 !
1018 END SUBROUTINE write_surfx3_nc
1019 !
1020 ! #############################################################
1021  SUBROUTINE write_surfn1_nc ( HSELECT, HREC,KFIELD,KRESP,HCOMMENT,HDIR,HNAM_DIM)
1022 ! #############################################################
1023 !
1024 !!**** *WRITEN0* - routine to read an integer
1025 !
1026 !
1027 !
1028 !
1029 USE modd_surfex_mpi, ONLY : nrank, npio, nproc, ncomm
1030 !
1032 !
1033 USE modi_def_var_netcdf
1034 !
1035 USE modi_io_buff
1036 !
1037 USE yomhook ,ONLY : lhook, dr_hook
1038 USE parkind1 ,ONLY : jprb
1039 !
1040 USE netcdf
1041 !
1042 IMPLICIT NONE
1043 !
1044 !
1045 #ifdef SFX_MPI
1046 include "mpif.h"
1047 #endif
1048 !
1049 !* 0.1 Declarations of arguments
1050 !
1051 !
1052  CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: HSELECT
1053 !
1054  CHARACTER(LEN=12), INTENT(IN) :: HREC ! name of the article to be read
1055 INTEGER, DIMENSION(:), INTENT(IN) :: KFIELD ! the integer scalar to be read
1056 INTEGER, INTENT(OUT) :: KRESP ! KRESP : return-code if a problem appears
1057  CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT
1058  CHARACTER(LEN=1), INTENT(IN) :: HDIR ! type of field :
1059  ! 'H' : field with
1060  ! horizontal spatial dim.
1061  ! '-' : no horizontal dim.
1062  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: HNAM_DIM
1063 !
1064 !* 0.2 Declarations of local variables
1065 !
1066 INTEGER :: IRET0
1067 LOGICAL :: GFOUND
1068  CHARACTER(LEN=100), DIMENSION(1) :: YATT_TITLE, YATT
1069 INTEGER, DIMENSION(2) :: IDIMIDS
1070 INTEGER, DIMENSION(2) :: IDIMLEN
1071  CHARACTER(LEN=100) :: YNAME
1072  CHARACTER(LEN=16) :: YNAM_DIM
1073 INTEGER :: IVAR_ID, JDIM
1074 INTEGER :: JRET
1075 INTEGER :: INFOMPI
1076 INTEGER,DIMENSION(5) :: IRET
1077 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1078 !
1079 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFN1_NC',0,zhook_handle)
1080 !
1081 kresp = 0
1082 !
1083 iret(:) = 0
1084 !
1085 yatt_title(1) = "comment"
1086 yatt(1) = hcomment
1087 !
1088 IF (PRESENT(hnam_dim)) THEN
1089  ynam_dim = hnam_dim
1090 ELSE
1091  ynam_dim = "Number_of_points"
1092 ENDIF
1093 !
1094 !
1095 idimlen(:) = 0
1096 yname = ""
1097 kresp=0
1098 !
1099  CALL io_buff(hrec,'W',gfound)
1100 !
1101 IF (gfound .AND. lhook) CALL dr_hook("WRITE_SURF_NC:WRITE_SURFN1_NC",1,zhook_handle)
1102 IF (gfound) RETURN
1103 !
1104 IF (nrank==npio) THEN
1105  !
1106  IF (nid_nc /= 0) THEN
1107  !
1108  ! 0. find filename
1109  ! -----------------
1110  !
1111  iret(2) = nf90_inq_dimid(nid_nc,trim(ynam_dim),idimids(1))
1112  IF (iret(2)/=0) THEN
1113  iret(2) = nf90_inq_dimid(nid_nc,'lon',idimids(1))
1114  IF (iret(2)/=0) THEN
1115  iret(2) = nf90_inq_dimid(nid_nc,'xx',idimids(1))
1116  iret(3) = nf90_inq_dimid(nid_nc,'yy',idimids(2))
1117  ELSE
1118  iret(3) = nf90_inq_dimid(nid_nc,'lat',idimids(2))
1119  ENDIF
1120  iret0=nf90_inquire_dimension(nid_nc,idimids(2),len=idimlen(2))
1121  ENDIF
1122  iret0=nf90_inquire_dimension(nid_nc,idimids(1),len=idimlen(1))
1123  !
1124  iret(4)=nf90_inquire_dimension(nid_nc,idimids(1),name=yname)
1125  !
1126  DO jret=1,4
1127  IF (iret0==0 .OR. iret(jret).NE.nf90_noerr) kresp=1
1128  ENDDO
1129  !
1130  ELSE
1131  idimids(:) = 0
1132  idimlen(:) = 0
1133  yname = ""
1134  ENDIF
1135  !
1136 ELSE
1137  idimids(:) = 0
1138  idimlen(:) = 0
1139  yname = ""
1140 ENDIF
1141 !
1142 #ifdef SFX_MPI
1143 IF (nproc>1) THEN
1144  CALL mpi_bcast(yname,len(yname),mpi_character,npio,ncomm,infompi)
1145  CALL mpi_bcast(idimlen,kind(idimlen)*SIZE(idimlen)/4,mpi_integer,npio,ncomm,infompi)
1146 ENDIF
1147 #endif
1148 !
1149 IF (yname.NE.'lon' .AND. yname.NE.'xx') THEN
1150  IF (ldef) THEN
1151  IF (nrank==npio) THEN
1152  CALL def_var_netcdf(hselect, nid_nc, hrec, hrec, idimids(1:1), yatt_title, yatt, ivar_id, nf90_int)
1153  ENDIF
1154  ELSE
1155  jret = nf90_inq_varid(nid_nc,hrec,ivar_id)
1156  CALL write_datan1_nc(idimlen(1))
1157  ENDIF
1158 ELSE
1159  IF (ldef) THEN
1160  IF (nrank==npio) THEN
1161  CALL def_var_netcdf(hselect, nid_nc, hrec, hrec, idimids(1:2), yatt_title, yatt, ivar_id, nf90_int)
1162  ENDIF
1163  ELSE
1164  jret = nf90_inq_varid(nid_nc,hrec,ivar_id)
1165  CALL write_datan1_nc(idimlen(1)*idimlen(2))
1166  ENDIF
1167 ENDIF
1168 !
1169 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFN1_NC',1,zhook_handle)
1170 !
1171 CONTAINS
1172 !
1173 SUBROUTINE write_datan1_nc(KDIM)
1175 USE modd_surf_par, ONLY : nundef
1176 !
1179 USE modi_handle_err
1180 !
1181 USE netcdf
1182 !
1183 IMPLICIT NONE
1184 !
1185 INTEGER, INTENT(IN) :: KDIM
1186 !
1187 INTEGER, DIMENSION(KDIM) :: ITAB1D
1188 INTEGER, DIMENSION(KDIM) :: IWORK_IGN
1189 !
1190 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1191 !
1192 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFN1_NC:WRITE_DATAN1_NC',0,zhook_handle)
1193 !
1194 itab1d(:) = nundef
1195 !
1196 IF (hdir=='-') THEN
1197  IF ( nrank==npio ) itab1d(1:SIZE(kfield)) = kfield(:)
1198 ELSEIF(.NOT.ALLOCATED(nmask_ign))THEN
1199  IF (lmask) THEN
1200  CALL gather_and_write_mpi(kfield,itab1d,nmask)
1201  ELSE
1202  CALL gather_and_write_mpi(kfield,itab1d)
1203  ENDIF
1204 ELSE
1205  !ign grid
1206  IF (lmask) THEN
1207  CALL gather_and_write_mpi(kfield,iwork_ign(1:SIZE(nmask_ign)),nmask)
1208  ELSE
1209  CALL gather_and_write_mpi(kfield,iwork_ign(1:SIZE(nmask_ign)))
1210  ENDIF
1211  CALL unpack_same_rank(nmask_ign,iwork_ign(1:SIZE(nmask_ign)),itab1d)
1212 ENDIF
1213 !
1214 IF (nrank==npio) THEN
1215  iret(5)=nf90_put_var(nid_nc,ivar_id,itab1d)
1216  CALL handle_err(iret(5),hrec)
1217 ENDIF
1218 !
1219 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFN1_NC:WRITE_DATAN1_NC',1,zhook_handle)
1220 !
1221 END SUBROUTINE write_datan1_nc
1222 !
1223 END SUBROUTINE write_surfn1_nc
1224 !
1225 
1226 ! #############################################################
1227  SUBROUTINE write_surfn2_nc ( HSELECT, HREC,KFIELD,KRESP,HCOMMENT,HDIR,HNAM_DIM)
1228 ! #############################################################
1229 !
1230 !!**** *WRITEN0* - routine to read an integer
1231 !
1232 !
1233 !
1234 !
1235 USE modd_surfex_mpi, ONLY : nrank, npio, nproc, ncomm
1236 !
1238 !
1239 USE modi_io_buff
1240 !
1241 USE modi_def_var_netcdf
1242 !
1243 USE yomhook ,ONLY : lhook, dr_hook
1244 USE parkind1 ,ONLY : jprb
1245 !
1246 USE netcdf
1247 !
1248 IMPLICIT NONE
1249 !
1250 !
1251 #ifdef SFX_MPI
1252 include "mpif.h"
1253 #endif
1254 !
1255 !* 0.1 Declarations of arguments
1256 !
1257 !
1258  CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: HSELECT
1259 !
1260  CHARACTER(LEN=12), INTENT(IN) :: HREC ! name of the article to be read
1261 INTEGER, DIMENSION(:,:), INTENT(IN) :: KFIELD ! the integer scalar to be read
1262 INTEGER, INTENT(OUT) :: KRESP ! KRESP : return-code if a problem appears
1263  CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT
1264  CHARACTER(LEN=1), INTENT(IN) :: HDIR ! type of field :
1265  ! 'H' : field with
1266  ! horizontal spatial dim.
1267  ! '-' : no horizontal dim.
1268  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: HNAM_DIM
1269 !* 0.2 Declarations of local variables
1270 !
1271 INTEGER :: IRET0
1272 LOGICAL :: GFOUND
1273  CHARACTER(LEN=100), DIMENSION(1) :: YATT_TITLE, YATT
1274 INTEGER, DIMENSION(3) :: IDIMIDS
1275 INTEGER, DIMENSION(3) :: IDIMLEN
1276  CHARACTER(LEN=100) :: YNAME
1277  CHARACTER(LEN=16) :: YNAM_DIM
1278 INTEGER :: IVAR_ID, JDIM, INDIMS
1279 INTEGER :: JRET
1280 INTEGER :: INFOMPI
1281 INTEGER, DIMENSION(5) :: IRET
1282 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1283 !
1284 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFN2_NC',0,zhook_handle)
1285 !
1286 kresp = 0
1287 !
1288 iret(:) = 0
1289 !
1290 indims = 0
1291 idimlen(:) = 0
1292 yname = ""
1293 kresp=0
1294 !
1295  CALL io_buff(hrec,'W',gfound)
1296 !
1297 yatt_title(1) = "comment"
1298 yatt(1) = hcomment
1299 !
1300 IF (gfound .AND. lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFN2_NC',1,zhook_handle)
1301 IF (gfound) RETURN
1302 !
1303 IF (PRESENT(hnam_dim)) THEN
1304  ynam_dim = hnam_dim
1305 ELSE
1306  ynam_dim = "Number_of_points"
1307 ENDIF
1308 !
1309 IF (nrank==npio) THEN
1310  !
1311  IF (nid_nc /= 0) THEN
1312  !
1313  ! 0. find filename
1314  ! -----------------
1315  !
1316  iret(1) = nf90_inquire(nid_nc,ndimensions=indims)
1317  iret(2) = nf90_inq_dimid(nid_nc,trim(ynam_dim),idimids(1))
1318  IF (iret(2)==0) THEN
1319  iret(3) = nf90_inq_dimid(nid_nc,'Number_of_Tile',idimids(2))
1320  ELSE
1321  iret(2) = nf90_inq_dimid(nid_nc,'lon',idimids(1))
1322  IF (iret(2)/=0) THEN
1323  iret(2) = nf90_inq_dimid(nid_nc,'xx',idimids(1))
1324  iret(3) = nf90_inq_dimid(nid_nc,'yy',idimids(2))
1325  ELSE
1326  iret(3) = nf90_inq_dimid(nid_nc,'lat',idimids(2))
1327  ENDIF
1328  iret(4) = nf90_inq_dimid(nid_nc,'Number_of_Tile',idimids(3))
1329  iret0=nf90_inquire_dimension(nid_nc,idimids(3),len=idimlen(3))
1330  ENDIF
1331  DO jdim=1,2
1332  iret0=nf90_inquire_dimension(nid_nc,idimids(jdim),len=idimlen(jdim))
1333  ENDDO
1334  !
1335  iret(5)=nf90_inquire_dimension(nid_nc,idimids(1),name=yname)
1336  !
1337  DO jret=1,5
1338  IF (iret0==0 .OR. iret(jret).NE.nf90_noerr) kresp=1
1339  ENDDO
1340  !
1341  ELSE
1342  indims = 0
1343  idimids(:) = 0
1344  idimlen(:) = 0
1345  yname = ""
1346  ENDIF
1347  !
1348 ELSE
1349  indims = 0
1350  idimids(:) = 0
1351  idimlen(:) = SIZE(kfield,2)
1352  yname = ""
1353 ENDIF
1354 !
1355 #ifdef SFX_MPI
1356 IF (nproc>1) THEN
1357  CALL mpi_bcast(yname,len(yname),mpi_character,npio,ncomm,infompi)
1358  CALL mpi_bcast(indims,kind(indims)/4,mpi_integer,npio,ncomm,infompi)
1359  CALL mpi_bcast(idimlen,kind(idimlen)*SIZE(idimlen)/4,mpi_integer,npio,ncomm,infompi)
1360 ENDIF
1361 #endif
1362 !
1363 IF (yname .NE. 'lon' .AND. yname .NE. 'xx') THEN
1364  IF (ldef) THEN
1365  IF (nrank==npio) THEN
1366  CALL def_var_netcdf(hselect, nid_nc, hrec, hrec, idimids(1:2), yatt_title, yatt, ivar_id, nf90_int)
1367  ENDIF
1368  ELSE
1369  jret = nf90_inq_varid(nid_nc,hrec,ivar_id)
1370  CALL write_datan2_nc(idimlen(1),idimlen(2),indims)
1371  ENDIF
1372 ELSE
1373  IF (ldef) THEN
1374  IF (nrank==npio) THEN
1375  CALL def_var_netcdf(hselect, nid_nc, hrec, hrec, idimids(1:3), yatt_title, yatt, ivar_id, nf90_int)
1376  ENDIF
1377  ELSE
1378  jret = nf90_inq_varid(nid_nc,hrec,ivar_id)
1379  CALL write_datan2_nc(idimlen(1)*idimlen(2),idimlen(3),indims)
1380  ENDIF
1381 ENDIF
1382 !
1383 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFN2_NC',1,zhook_handle)
1384 !
1385 CONTAINS
1386 !
1387 SUBROUTINE write_datan2_nc(KDIM1,KDIM2,KNDIMS)
1389 USE modd_surf_par, ONLY : nundef
1390 !
1393 USE modi_handle_err
1394 !
1395 USE netcdf
1396 !
1397 IMPLICIT NONE
1398 !
1399 INTEGER, INTENT(IN) :: KDIM1
1400 INTEGER, INTENT(IN) :: KDIM2
1401 INTEGER, INTENT(IN) :: KNDIMS
1402 !
1403 INTEGER, DIMENSION(KDIM1,KDIM2) :: ITAB2D ! work array read in the file
1404 INTEGER, DIMENSION(KDIM1,KDIM2) :: IWORK_IGN ! work array read in the file
1405 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1406 !
1407 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFN2_NC:WRITE_DATAN2_NC',0,zhook_handle)
1408 !
1409 itab2d(:,:) = nundef
1410 !
1411 IF(.NOT.ALLOCATED(nmask_ign))THEN
1412  IF (lmask) THEN
1413  CALL gather_and_write_mpi(kfield,itab2d(:,1:SIZE(kfield,2)),nmask)
1414  ELSE
1415  CALL gather_and_write_mpi(kfield,itab2d(:,1:SIZE(kfield,2)))
1416  ENDIF
1417 ELSE
1418  !ign grid
1419  IF (lmask) THEN
1420  CALL gather_and_write_mpi(kfield,iwork_ign(1:SIZE(nmask_ign),:),nmask)
1421  ELSE
1422  CALL gather_and_write_mpi(kfield,iwork_ign(1:SIZE(nmask_ign),:))
1423  ENDIF
1424  CALL unpack_same_rank(nmask_ign,iwork_ign(1:SIZE(nmask_ign),:),itab2d(:,1:SIZE(kfield,2)))
1425 ENDIF
1426 !
1427 IF (nrank==npio) THEN
1428  iret(5)=nf90_put_var(nid_nc,ivar_id,itab2d)
1429  CALL handle_err(iret(5),hrec)
1430 ENDIF
1431 !
1432 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFN2_NC:WRITE_DATAN2_NC',1,zhook_handle)
1433 !
1434 END SUBROUTINE write_datan2_nc
1435 !
1436 END SUBROUTINE write_surfn2_nc
1437 !
1438 ! #############################################################
1439  SUBROUTINE write_surfl1_nc ( HSELECT, HREC,OFIELD,KRESP,HCOMMENT,HDIR)
1440 ! #############################################################
1441 !
1442 !!**** *WRITEL1* - routine to read a logical array
1443 !
1444 !
1445 !
1446 !
1447 USE modd_surfex_mpi, ONLY : nrank, npio
1448 !
1450 !
1451 USE modi_io_buff
1452 !
1453 USE modi_def_var_netcdf
1454 !
1455 USE modi_handle_err
1456 !
1457 USE yomhook ,ONLY : lhook, dr_hook
1458 USE parkind1 ,ONLY : jprb
1459 !
1460 USE netcdf
1461 !
1462 IMPLICIT NONE
1463 !
1464 !
1465 #ifdef SFX_MPI
1466 include "mpif.h"
1467 #endif
1468 !
1469 !* 0.1 Declarations of arguments
1470 !
1471 !
1472  CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: HSELECT
1473 !
1474  CHARACTER(LEN=*), INTENT(IN) :: HREC ! name of the article to be read
1475 LOGICAL, DIMENSION(:), INTENT(IN) :: OFIELD ! array containing the data field
1476 INTEGER, INTENT(OUT):: KRESP ! KRESP : return-code if a problem appears
1477  CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT
1478  CHARACTER(LEN=1), INTENT(IN) :: HDIR ! type of field :
1479  ! 'H' : field with
1480  ! horizontal spatial dim.
1481  ! '-' : no horizontal dim.
1482 !* 0.2 Declarations of local variables
1483 !
1484 LOGICAL :: GFOUND
1485  CHARACTER(LEN=100), DIMENSION(1) :: YATT_TITLE, YATT
1486 INTEGER, DIMENSION(1) :: IDIMIDS
1487 INTEGER, DIMENSION(1) :: IDIMLEN
1488 INTEGER :: IVAR_ID, JDIM, INDIMS
1489 INTEGER :: JRET
1490 INTEGER, DIMENSION(3) :: IRET
1491 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1492 !
1493 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFL1_NC',0,zhook_handle)
1494 !
1495 iret(:) = 0
1496 !
1497 yatt_title(1) = "comment"
1498 yatt(1) = hcomment
1499 !
1500 kresp=0
1501 !
1502  CALL io_buff(hrec,'W',gfound)
1503 IF (gfound .AND. lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFL1_NC',1,zhook_handle)
1504 IF (gfound) RETURN
1505 !
1506 IF (nid_nc /= 0) THEN
1507  !
1508  IF (nrank==npio) THEN
1509  !
1510  ! 0. find filename
1511  ! -----------------
1512  !
1513  IF (hrec(1:2)=='L_') THEN
1514  iret(1) = nf90_inq_dimid(nid_nc,'Nb_of_input_data',idimids(1))
1515  ELSE
1516  iret(1) = nf90_inq_dimid(nid_nc,'Number_of_covers',idimids(1))
1517  ENDIF
1518  iret(2) = nf90_inquire_dimension(nid_nc,idimids(1),len=idimlen(1))
1519  !
1520  IF (ldef) THEN
1521  CALL def_var_netcdf(hselect, nid_nc, hrec, hrec, idimids(1:1), yatt_title, yatt, ivar_id, nf90_char, 1)
1522  !
1523  ELSE
1524  jret = nf90_inq_varid(nid_nc, hrec, ivar_id)
1525  CALL write_datal1_nc(idimlen(1))
1526  ENDIF
1527  !
1528  ENDIF
1529  !
1530 ENDIF
1531 !
1532 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFL1_NC',1,zhook_handle)
1533 !
1534 CONTAINS
1535 !
1536 SUBROUTINE write_datal1_nc(KDIM)
1538 INTEGER, INTENT(IN) :: KDIM
1539 !
1540  CHARACTER(LEN=1), DIMENSION(KDIM) :: YTAB1D ! work array read in the file
1541 INTEGER, DIMENSION(1) :: ISTART, ICOUNT
1542 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1543 !
1544 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFL1_NC:WRITE_DATAL1_NC',0,zhook_handle)
1545 !
1546 ytab1d(:) = ""
1547 !
1548 DO jret=1,min(SIZE(ofield),SIZE(ytab1d))
1549  IF (ofield(jret)) THEN
1550  ytab1d(jret) ='T'
1551  ELSE
1552  ytab1d(jret) ='F'
1553  ENDIF
1554 ENDDO
1555 !
1556 ! 2. Put variable
1557 !-----------------
1558 istart(1) = 1
1559 icount(1) = kdim
1560 iret(3)=nf90_put_var(nid_nc,ivar_id,ytab1d,istart,icount)
1561 !
1562  CALL handle_err(iret(3),hrec)
1563 !
1564 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFL1_NC:WRITE_DATAL1_NC',1,zhook_handle)
1565 END SUBROUTINE write_datal1_nc
1566 !
1567 END SUBROUTINE write_surfl1_nc
1568 !
1569 !
1570 ! #############################################################
1571  SUBROUTINE write_surft0_nc ( HSELECT, HREC,KYEAR,KMONTH,KDAY,PTIME,KRESP,HCOMMENT)
1572 ! #############################################################
1573 !
1574 !!**** *WRITET0* - routine to read a NETCDF date_time scalar
1575 !
1576 !
1577 !
1578 !
1580 !
1581 USE modi_io_buff
1582 !
1583 USE modi_def_var_netcdf
1584 !
1585 USE yomhook ,ONLY : lhook, dr_hook
1586 USE parkind1 ,ONLY : jprb
1587 !
1588 USE netcdf
1589 !
1590 IMPLICIT NONE
1591 !
1592 !
1593 !* 0.1 Declarations of arguments
1594 !
1595 !
1596  CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: HSELECT
1597 !
1598  CHARACTER(LEN=12), INTENT(IN) :: HREC ! name of the article to be read
1599 INTEGER, INTENT(IN) :: KYEAR ! year
1600 INTEGER, INTENT(IN) :: KMONTH ! month
1601 INTEGER, INTENT(IN) :: KDAY ! day
1602 REAL, INTENT(IN) :: PTIME ! time
1603 INTEGER, INTENT(OUT) :: KRESP ! KRESP : return-code if a problem appears
1604  CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT
1605 !
1606 !* 0.2 Declarations of local variables
1607 !
1608 LOGICAL :: GFOUND
1609  CHARACTER(LEN=100), DIMENSION(1) :: YATT_TITLE, YATT
1610 INTEGER, DIMENSION(0) :: IDIMIDS
1611  CHARACTER(LEN=12) :: YRECFM ! Name of the article to be written
1612 INTEGER :: IVAR_ID, JRET, JWRK
1613 INTEGER :: JLEN
1614 INTEGER,DIMENSION(4) :: IRET
1615 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1616 !
1617 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFT0_NC',0,zhook_handle)
1618 !
1619 kresp=0
1620 !
1621 yatt_title(1) = "comment"
1622 yatt(1) = hcomment
1623 !
1624  CALL io_buff(hrec,'W',gfound)
1625 IF (gfound .AND. lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFT0_NC',1,zhook_handle)
1626 IF (gfound) RETURN
1627 !
1628 DO jwrk=1,4
1629  !
1630  IF (jwrk == 1) THEN
1631  yrecfm = trim(hrec)//'-YEAR'
1632  ELSEIF (jwrk == 2) THEN
1633  yrecfm = trim(hrec)//'-MONTH'
1634  ELSEIF (jwrk == 3) THEN
1635  yrecfm = trim(hrec)//'-DAY'
1636  ELSEIF (jwrk == 4) THEN
1637  yrecfm=trim(hrec)//'-TIME'
1638  ENDIF
1639  ! 0. find filename
1640  ! -----------------
1641  !
1642  IF (nid_nc /= 0) THEN
1643  !
1644  !
1645  IF (jwrk==1) THEN
1646  IF (ldef) THEN
1647  CALL def_var_netcdf(hselect, nid_nc, yrecfm, yrecfm, idimids, yatt_title, yatt, ivar_id,nf90_int)
1648  ELSE
1649  jret = nf90_inq_varid(nid_nc,yrecfm,ivar_id)
1650  iret(jwrk)=nf90_put_var(nid_nc,ivar_id,kyear)
1651  ENDIF
1652  ELSEIF (jwrk==2) THEN
1653  IF (ldef) THEN
1654  CALL def_var_netcdf(hselect, nid_nc, yrecfm, yrecfm, idimids, yatt_title, yatt, ivar_id,nf90_int)
1655  ELSE
1656  jret = nf90_inq_varid(nid_nc,yrecfm,ivar_id)
1657  iret(jwrk)=nf90_put_var(nid_nc,ivar_id,kmonth)
1658  ENDIF
1659  ELSEIF (jwrk==3) THEN
1660  IF (ldef) THEN
1661  CALL def_var_netcdf(hselect, nid_nc, yrecfm, yrecfm, idimids, yatt_title, yatt, ivar_id,nf90_int)
1662  ELSE
1663  jret = nf90_inq_varid(nid_nc,yrecfm,ivar_id)
1664  iret(jwrk)=nf90_put_var(nid_nc,ivar_id,kday)
1665  ENDIF
1666  ELSEIF (jwrk==4) THEN
1667  IF (ldef) THEN
1668  CALL def_var_netcdf(hselect, nid_nc, yrecfm, yrecfm, idimids, yatt_title, yatt, ivar_id,nf90_double)
1669  ELSE
1670  jret = nf90_inq_varid(nid_nc,yrecfm,ivar_id)
1671  iret(jwrk)=nf90_put_var(nid_nc,ivar_id,ptime)
1672  ENDIF
1673  ENDIF
1674  ENDIF
1675 ENDDO
1676 !
1677 ! 3. Check for errors
1678 !--------------------
1679 DO jret=1,4
1680  IF (nid_nc==0.OR.iret(jret).NE.nf90_noerr) kresp=1
1681 ENDDO
1682 !
1683 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFT0_NC',1,zhook_handle)
1684 !
1685 END SUBROUTINE write_surft0_nc
1686 !
1687 ! #############################################################
1688  SUBROUTINE write_surft1_nc ( HSELECT, HREC,KYEAR,KMONTH,KDAY,PTIME,KRESP,HCOMMENT)
1689 ! #############################################################
1690 !
1691 !!**** *WRITET0* - routine to read a NETCDF date_time scalar
1692 !
1694 !
1695 USE yomhook ,ONLY : lhook, dr_hook
1696 USE parkind1 ,ONLY : jprb
1697 !
1698 USE netcdf
1699 !
1700 IMPLICIT NONE
1701 !
1702 !
1703 !* 0.1 Declarations of arguments
1704 !
1705  CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: HSELECT
1706 !
1707  CHARACTER(LEN=12), INTENT(IN) :: HREC ! name of the article to be read
1708 INTEGER, DIMENSION(:), INTENT(IN) :: KYEAR ! year
1709 INTEGER, DIMENSION(:), INTENT(IN) :: KMONTH ! month
1710 INTEGER, DIMENSION(:), INTENT(IN) :: KDAY ! day
1711 REAL, DIMENSION(:), INTENT(IN) :: PTIME ! time
1712 INTEGER, INTENT(OUT) :: KRESP ! KRESP : return-code if a problem appears
1713  CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT
1714 !
1715 !* 0.2 Declarations of local variables
1716 !
1717  CHARACTER(LEN=100) :: YNAME
1718  CHARACTER(LEN=12) :: YRECFM ! Name of the article to be written
1719 INTEGER :: JRET, JWRK, IDIMID
1720 INTEGER,DIMENSION(4) :: IRET
1721 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1722 !
1723 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFT1_NC',0,zhook_handle)
1724 !
1725 kresp=0
1726 !
1727 DO jwrk=1,4
1728  !
1729  IF (jwrk == 1) THEN
1730  yrecfm = trim(hrec)//'-YEAR'
1731  ELSEIF (jwrk == 2) THEN
1732  yrecfm = trim(hrec)//'-MONTH'
1733  ELSEIF (jwrk == 3) THEN
1734  yrecfm = trim(hrec)//'-DAY'
1735  ELSEIF (jwrk == 4) THEN
1736  yrecfm=trim(hrec)//'-TIME'
1737  ENDIF
1738  !
1739  jret = nf90_inq_dimid(nid_nc,'Number_of_dates ',idimid)
1740  !
1741  IF (jret==0) THEN
1742  IF (jwrk==1) THEN
1743  CALL write_surfn1_nc(hselect, yrecfm,kyear,iret(jwrk),hcomment,'-','Number_of_dates ')
1744  ELSEIF (jwrk==2) THEN
1745  CALL write_surfn1_nc(hselect, yrecfm,kmonth,iret(jwrk),hcomment,'-','Number_of_dates ')
1746  ELSEIF (jwrk==3) THEN
1747  CALL write_surfn1_nc(hselect, yrecfm,kday,iret(jwrk),hcomment,'-','Number_of_dates ')
1748  ELSEIF (jwrk==4) THEN
1749  CALL write_surfx1_nc(hselect, yrecfm,ptime,iret(jwrk),hcomment,'-','Number_of_dates ')
1750  ENDIF
1751  ELSE
1752  IF (jwrk==1) THEN
1753  CALL write_surfn1_nc(hselect, yrecfm,kyear,iret(jwrk),hcomment,'-')
1754  ELSEIF (jwrk==2) THEN
1755  CALL write_surfn1_nc(hselect, yrecfm,kmonth,iret(jwrk),hcomment,'-')
1756  ELSEIF (jwrk==3) THEN
1757  CALL write_surfn1_nc(hselect, yrecfm,kday,iret(jwrk),hcomment,'-')
1758  ELSEIF (jwrk==4) THEN
1759  CALL write_surfx1_nc(hselect, yrecfm,ptime,iret(jwrk),hcomment,'-')
1760  ENDIF
1761  ENDIF
1762  !
1763 ENDDO
1764 !
1765 ! 3. Check for errors
1766 !--------------------
1767 DO jret=1,4
1768  IF (nid_nc==0.OR.iret(jret).NE.nf90_noerr) kresp=1
1769 ENDDO
1770 !
1771 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFT1_NC',1,zhook_handle)
1772 !
1773 END SUBROUTINE write_surft1_nc
1774 !
1775 ! #############################################################
1776  SUBROUTINE write_surft2_nc ( HSELECT, HREC,KYEAR,KMONTH,KDAY,PTIME,KRESP,HCOMMENT)
1777 ! #############################################################
1778 !
1779 !!**** *WRITET0* - routine to read a NETCDF date_time scalar
1780 !
1782 !
1783 USE yomhook ,ONLY : lhook, dr_hook
1784 USE parkind1 ,ONLY : jprb
1785 !
1786 USE netcdf
1787 !
1788 IMPLICIT NONE
1789 !
1790 !
1791 !* 0.1 Declarations of arguments
1792 !
1793  CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: HSELECT
1794 !
1795  CHARACTER(LEN=12), INTENT(IN) :: HREC ! name of the article to be read
1796 INTEGER, DIMENSION(:,:), INTENT(IN) :: KYEAR ! year
1797 INTEGER, DIMENSION(:,:), INTENT(IN) :: KMONTH ! month
1798 INTEGER, DIMENSION(:,:), INTENT(IN) :: KDAY ! day
1799 REAL, DIMENSION(:,:), INTENT(IN) :: PTIME ! time
1800 INTEGER, INTENT(OUT) :: KRESP ! KRESP : return-code if a problem appears
1801  CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT
1802 !
1803 !* 0.2 Declarations of local variables
1804 !
1805  CHARACTER(LEN=100) :: YNAME
1806  CHARACTER(LEN=12) :: YRECFM ! Name of the article to be written
1807 INTEGER :: JRET, JWRK, IDIMID
1808 INTEGER,DIMENSION(4) :: IRET
1809 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1810 !
1811 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFT2_NC',0,zhook_handle)
1812 !
1813 kresp=0
1814 !
1815 DO jwrk=1,4
1816  !
1817  IF (jwrk == 1) THEN
1818  yrecfm = trim(hrec)//'-YEAR'
1819  ELSEIF (jwrk == 2) THEN
1820  yrecfm = trim(hrec)//'-MONTH'
1821  ELSEIF (jwrk == 3) THEN
1822  yrecfm = trim(hrec)//'-DAY'
1823  ELSEIF (jwrk == 4) THEN
1824  yrecfm=trim(hrec)//'-TIME'
1825  ENDIF
1826  !
1827  jret = nf90_inq_dimid(nid_nc,'Number_of_dates ',idimid)
1828  !
1829  IF (jret==0) THEN
1830  IF (jwrk==1) THEN
1831  CALL write_surfn2_nc(hselect, yrecfm,kyear,iret(jwrk),hcomment,'-','Number_of_dates ')
1832  ELSEIF (jwrk==2) THEN
1833  CALL write_surfn2_nc(hselect, yrecfm,kmonth,iret(jwrk),hcomment,'-','Number_of_dates ')
1834  ELSEIF (jwrk==3) THEN
1835  CALL write_surfn2_nc(hselect, yrecfm,kday,iret(jwrk),hcomment,'-','Number_of_dates ')
1836  ELSEIF (jwrk==4) THEN
1837  CALL write_surfx2_nc(hselect, yrecfm,ptime,iret(jwrk),hcomment,'-','Number_of_dates ')
1838  ENDIF
1839  ELSE
1840  IF (jwrk==1) THEN
1841  CALL write_surfn2_nc(hselect, yrecfm,kyear,iret(jwrk),hcomment,'-')
1842  ELSEIF (jwrk==2) THEN
1843  CALL write_surfn2_nc(hselect, yrecfm,kmonth,iret(jwrk),hcomment,'-')
1844  ELSEIF (jwrk==3) THEN
1845  CALL write_surfn2_nc(hselect, yrecfm,kday,iret(jwrk),hcomment,'-')
1846  ELSEIF (jwrk==4) THEN
1847  CALL write_surfx2_nc(hselect, yrecfm,ptime,iret(jwrk),hcomment,'-')
1848  ENDIF
1849  ENDIF
1850  !
1851 ENDDO
1852 !
1853 ! 3. Check for errors
1854 !--------------------
1855 DO jret=1,4
1856  IF (nid_nc==0.OR.iret(jret).NE.nf90_noerr) kresp=1
1857 ENDDO
1858 !
1859 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_NC:WRITE_SURFT2_NC',1,zhook_handle)
1860 !
1861 END SUBROUTINE write_surft2_nc
1862 !
1863 END MODULE mode_write_surf_nc
subroutine write_surfn0_nc(HSELECT, HREC, KFIELD, KRESP, HCOMMENT)
subroutine write_surfx0_nc(HSELECT, HREC, PFIELD, KRESP, HCOMMENT)
character(len=28), save cfileout_nc
subroutine handle_err(IRET, HNAME)
Definition: handle_err.F90:7
subroutine write_surfx2_nc(HSELECT, HREC, PFIELD, KRESP, HCOMMENT, HDIR, HNAM_DIM)
subroutine write_surfx3_nc(HSELECT, HREC, PFIELD, KRESP, HCOMMENT, HDIR, HNAM_DIM)
subroutine write_surfl1_nc(HSELECT, HREC, OFIELD, KRESP, HCOMMENT, HDIR)
logical, save lmask
quick &counting sorts only inumt inumt name
subroutine write_surft2_nc(HSELECT, HREC, KYEAR, KMONTH, KDAY, PTIME, KRESP, HCOMMENT)
subroutine write_surfl0_nc(HSELECT, HREC, OFIELD, KRESP, HCOMMENT)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
real, parameter xundef
subroutine write_datan1_nc(KDIM)
integer, parameter jprb
Definition: parkind1.F90:32
subroutine write_surft0_nc(HSELECT, HREC, KYEAR, KMONTH, KDAY, PTIME, KRESP, HCOMMENT)
subroutine write_datax1_nc(KDIM, KNDIMS)
integer, parameter nundef
subroutine write_datan2_nc(KDIM1, KDIM2, KNDIMS)
subroutine def_var_netcdf(HSELECT, KFILE_ID, HNAME, HLONG_NAME, KDIM_ID, H
subroutine write_surft1_nc(HSELECT, HREC, KYEAR, KMONTH, KDAY, PTIME, KRESP, HCOMMENT)
subroutine write_surfc0_nc(HSELECT, HREC, HFIELD, KRESP, HCOMMENT)
subroutine write_surfn1_nc(HSELECT, HREC, KFIELD, KRESP, HCOMMENT, HDIR, HNAM_DIM)
integer, dimension(:), pointer nmask
logical lhook
Definition: yomhook.F90:15
subroutine io_buff(HREC, HACTION, OKNOWN)
Definition: io_buff.F90:8
subroutine write_datax2_nc(KDIM1, KDIM2, KNDIMS)
subroutine write_surfn2_nc(HSELECT, HREC, KFIELD, KRESP, HCOMMENT, HDIR, HNAM_DIM)
integer, dimension(:), allocatable nmask_ign
subroutine write_datal1_nc(KDIM)
subroutine write_surfx1_nc(HSELECT, HREC, PFIELD, KRESP, HCOMMENT, HDIR, HNAM_DIM)
subroutine write_datax3_nc(KDIM1, KDIM2, KDIM3, KNDIMS)