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