SURFEX v8.1
General documentation of Surfex
mode_write_surf_ol.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 get_comment
8  MODULE PROCEDURE get_comment
9 END INTERFACE
10 INTERFACE write_surf0_ol
11  MODULE PROCEDURE write_surfx0_ol
12  MODULE PROCEDURE write_surfn0_ol
13  MODULE PROCEDURE write_surfc0_ol
14  MODULE PROCEDURE write_surfl0_ol
15 END INTERFACE
17  MODULE PROCEDURE write_surfx0_time_ol
18 END INTERFACE
20  MODULE PROCEDURE write_surfx1_ol
21  MODULE PROCEDURE write_surfn1_ol
22 END INTERFACE
24  MODULE PROCEDURE write_surfl1_ol
25  MODULE PROCEDURE write_surfx2_ol
26  MODULE PROCEDURE write_surfx3_ol
27 END INTERFACE
28 INTERFACE write_surft_ol
29  MODULE PROCEDURE write_surft0_ol
30 END INTERFACE
31 !
32 CONTAINS
33 !
34 SUBROUTINE get_comment(HCOMMENT_IN, HDIM_OUT, HCOMMENT_OUT)
35 !
36 USE yomhook ,ONLY : lhook, dr_hook
37 USE parkind1 ,ONLY : jprb
38 !
39 IMPLICIT NONE
40 !
41  CHARACTER(LEN=*), INTENT(IN) :: HCOMMENT_IN
42  CHARACTER(LEN=*), INTENT(OUT) :: HCOMMENT_OUT
43  CHARACTER(LEN=*), INTENT(OUT) :: HDIM_OUT
44 !
45 INTEGER :: ILEN, JSIZE
46 REAL(KIND=JPRB) :: ZHOOK_HANDLE
47 !
48 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:GET_COMMENT',0,zhook_handle)
49 !
50 ilen = len_trim(hcomment_in)
51 IF (ilen/=0) THEN
52  IF (hcomment_in(ilen:ilen)==")") THEN
53  DO jsize = ilen,1,-1
54  IF (hcomment_in(jsize:jsize)=="(") THEN
55  hdim_out = hcomment_in(jsize+1:ilen-1)
56  hcomment_out = hcomment_in(1:jsize-1)
57  ENDIF
58  ENDDO
59  ELSE
60  hdim_out = "-"
61  hcomment_out = hcomment_in
62  ENDIF
63 ELSE
64  hcomment_out = " "
65  hdim_out = "-"
66 ENDIF
67 !
68 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:GET_COMMENT',1,zhook_handle)
69 !
70 END SUBROUTINE get_comment
71 !
72 ! #############################################################
73  SUBROUTINE write_surfx0_ol(HSELECT,HREC,PFIELD,KRESP,HCOMMENT)
74 ! #############################################################
75 !
76 !!**** *WRITEX0* - routine to read a real scalar
77 !
78 USE modd_io_surf_ol, ONLY : nid_nc, ldef
79 !
80 USE modi_def_var_netcdf
81 !
82 USE yomhook ,ONLY : lhook, dr_hook
83 USE parkind1 ,ONLY : jprb
84 !
85 USE netcdf
86 !
87 IMPLICIT NONE
88 !
89 !
90 !* 0.1 Declarations of arguments
91 !
92  CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: HSELECT
93  CHARACTER(LEN=12), INTENT(IN) :: HREC ! name of the article to be read
94 REAL, INTENT(IN) :: PFIELD ! the real scalar to be read
95 INTEGER, INTENT(OUT) :: KRESP ! KRESP : return-code if a problem appears
96  CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT
97 !
98 !* 0.2 Declarations of local variables
99 !
100  CHARACTER(LEN=100) :: YCOMMENT
101  CHARACTER(LEN=100), DIMENSION(1) :: YATT_TITLE, YATT
102 INTEGER, DIMENSION(0) :: IDIMS
103 INTEGER :: IFILE_ID, IVAR_ID, JRET
104 INTEGER,DIMENSION(2) :: IRET
105 REAL(KIND=JPRB) :: ZHOOK_HANDLE
106 !
107 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFX0_OL',0,zhook_handle)
108 !
109 IF (ldef) THEN
110  !
111  yatt_title(1) = "units"
112  CALL get_comment(hcomment,yatt(1),ycomment)
113  !
114  IF (nid_nc/=0) CALL def_var_netcdf(hselect,nid_nc,hrec,hcomment,idims,yatt_title,yatt,ivar_id,nf90_double)
115  !
116 ELSE
117  !
118  kresp=0
119  !
120  ! 0. find filename
121  ! -----------------
122  ifile_id = nid_nc
123  !
124  IF (ifile_id /= 0) THEN
125  ! 1. Find id of the variable
126  !----------------------------
127  iret(1)=nf90_inq_varid(ifile_id,hrec,ivar_id)
128  ! 2. Put variable
129  !----------------------------
130  iret(2)=nf90_put_var(ifile_id,ivar_id,pfield)
131  ENDIF
132  !
133  !
134  ! 3. Check for errors
135  !--------------------
136  DO jret=1,2
137  IF (ifile_id==0 .OR. iret(jret).NE.nf90_noerr) kresp=1
138  ENDDO
139  !
140 ENDIF
141 !
142 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFX0_OL',1,zhook_handle)
143 !
144 END SUBROUTINE write_surfx0_ol
145 !
146 ! #############################################################
147  SUBROUTINE write_surfn0_ol(HSELECT,HREC,KFIELD,KRESP,HCOMMENT)
148 ! #############################################################
149 !
150 !!**** *WRITEN0* - routine to read an integer
151 !
152 USE modd_io_surf_ol, ONLY : nid_nc, ldef
153 !
154 USE modi_def_var_netcdf
155 !
156 USE yomhook ,ONLY : lhook, dr_hook
157 USE parkind1 ,ONLY : jprb
158 !
159 USE netcdf
160 !
161 IMPLICIT NONE
162 !
163 !
164 !* 0.1 Declarations of arguments
165 !
166  CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: HSELECT
167  CHARACTER(LEN=12), INTENT(IN) :: HREC ! name of the article to be read
168 INTEGER, INTENT(IN) :: KFIELD ! the integer scalar to be read
169 INTEGER, INTENT(OUT) :: KRESP ! KRESP : return-code if a problem appears
170  CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT
171 !
172 !* 0.2 Declarations of local variables
173 !
174  CHARACTER(LEN=100) :: YCOMMENT
175  CHARACTER(LEN=100), DIMENSION(1) :: YATT_TITLE, YATT
176 INTEGER, DIMENSION(0) :: IDIMS
177 INTEGER :: IFILE_ID, IVAR_ID, JRET
178 INTEGER,DIMENSION(2) :: IRET
179 REAL(KIND=JPRB) :: ZHOOK_HANDLE
180 !
181 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFN0_OL',0,zhook_handle)
182 !
183 IF (ldef) THEN
184  !
185  yatt_title(1) = "units"
186  CALL get_comment(hcomment,yatt(1),ycomment)
187  !
188  IF (nid_nc/=0) CALL def_var_netcdf(hselect,nid_nc,hrec,hcomment,idims,yatt_title,yatt,ivar_id,nf90_int)
189  !
190 ELSE
191  !
192  kresp=0
193  !
194  ! 0. find filename
195  ! -----------------
196  ifile_id = nid_nc
197  !
198  IF (ifile_id /= 0) THEN
199  ! 1. Find id of the variable
200  !----------------------------
201  iret(1)=nf90_inq_varid(ifile_id,hrec,ivar_id)
202  ! 2. Get variable
203  !----------------------------
204  iret(2)=nf90_put_var(ifile_id,ivar_id,kfield)
205  ENDIF
206  !
207  ! 3. Check for errors
208  !--------------------
209  DO jret=1,2
210  IF (ifile_id==0 .OR. iret(jret).NE.nf90_noerr) kresp=1
211  ENDDO
212  !
213 ENDIF
214 !
215 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFN0_OL',1,zhook_handle)
216 !
217 END SUBROUTINE write_surfn0_ol
218 !
219 ! #############################################################
220  SUBROUTINE write_surfc0_ol(HSELECT,HREC,HFIELD,KRESP,HCOMMENT)
221 ! #############################################################
222 !
223 !!**** *WRITEC0* - routine to read a STRING
224 !
225 USE modd_io_surf_ol, ONLY : nid_nc, ldef
226 !
227 USE modi_def_var_netcdf
228 !
229 USE yomhook ,ONLY : lhook, dr_hook
230 USE parkind1 ,ONLY : jprb
231 !
232 USE netcdf
233 !
234 IMPLICIT NONE
235 !
236 !
237 !* 0.1 Declarations of arguments
238 !
239  CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: HSELECT
240  CHARACTER(LEN=12), INTENT(IN) :: HREC ! name of the article to be read
241  CHARACTER(LEN=40), INTENT(IN) :: HFIELD ! the integer scalar to be read
242 INTEGER, INTENT(OUT) :: KRESP ! KRESP : return-code if a problem appears
243  CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT
244 !
245 !* 0.2 Declarations of local variables
246 !
247  CHARACTER(LEN=100) :: YCOMMENT
248  CHARACTER(LEN=100), DIMENSION(1) :: YATT_TITLE, YATT
249 INTEGER, DIMENSION(0) :: IDIMS
250  CHARACTER(LEN=100) :: YFIELD
251 INTEGER :: IFILE_ID, IVAR_ID, JRET
252 INTEGER,DIMENSION(2) :: IRET
253 REAL(KIND=JPRB) :: ZHOOK_HANDLE
254 !
255 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFC0_OL',0,zhook_handle)
256 !
257 IF (ldef) THEN
258  !
259  yatt_title(1) = "units"
260  CALL get_comment(hcomment,yatt(1),ycomment)
261  !
262  IF (nid_nc/=0) CALL def_var_netcdf(hselect,nid_nc,hrec,hcomment,idims,yatt_title,yatt,&
263  ivar_id,nf90_char,len_trim(hfield))
264  !
265 ELSE
266  !
267  kresp=0
268  !
269  ! 0. find filename
270  ! -----------------
271  ifile_id = nid_nc
272  !
273  IF (ifile_id /= 0) THEN
274  ! 1. Find id of the variable
275  !----------------------------
276  iret(1)=nf90_inq_varid(ifile_id,hrec,ivar_id)
277  ! 2. Get variable
278  !----------------------------
279  yfield=hfield(:len_trim(hfield))
280  iret(2)=nf90_put_var(ifile_id,ivar_id,yfield)
281  ENDIF
282  !
283  ! 3. Check for errors
284  !--------------------
285  DO jret=1,2
286  IF (ifile_id==0 .OR. iret(jret).NE.nf90_noerr) kresp=1
287  ENDDO
288  !
289 ENDIF
290 !
291 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFC0_OL',1,zhook_handle)
292 !
293 END SUBROUTINE write_surfc0_ol
294 !
295 ! #############################################################
296  SUBROUTINE write_surfl0_ol(HSELECT,HREC,OFIELD,KRESP,HCOMMENT)
297 ! #############################################################
298 !
299 !!**** *WRITEL0* - routine to read a logical
300 !
301 USE modd_io_surf_ol, ONLY : nid_nc, ldef
302 !
303 USE modi_def_var_netcdf
304 USE modi_handle_err
305 !
306 USE yomhook ,ONLY : lhook, dr_hook
307 USE parkind1 ,ONLY : jprb
308 !
309 USE netcdf
310 !
311 IMPLICIT NONE
312 !
313 !
314 !* 0.1 Declarations of arguments
315 !
316  CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: HSELECT
317  CHARACTER(LEN=12), INTENT(IN) :: HREC ! name of the article to be read
318 LOGICAL, INTENT(IN) :: OFIELD ! array containing the data field
319 INTEGER, INTENT(OUT):: KRESP ! KRESP : return-code if a problem appears
320  CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT
321 !
322 !* 0.2 Declarations of local variables
323 !
324  CHARACTER(LEN=100) :: YCOMMENT
325  CHARACTER(LEN=100), DIMENSION(1) :: YATT_TITLE, YATT
326 INTEGER, DIMENSION(0) :: IDIMS
327  CHARACTER(LEN=1) :: YFIELD ! work array read in the file
328 INTEGER :: IFILE_ID, IVAR_ID, JRET
329 INTEGER,DIMENSION(2) :: IRET
330 REAL(KIND=JPRB) :: ZHOOK_HANDLE
331 !
332 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFL0_OL',0,zhook_handle)
333 !
334 IF (ldef) THEN
335  !
336  yatt_title(1) = "units"
337  CALL get_comment(hcomment,yatt(1),ycomment)
338  !
339  IF (nid_nc/=0) CALL def_var_netcdf(hselect,nid_nc,hrec,hcomment,idims,yatt_title,yatt,ivar_id,nf90_char)
340  !
341 ELSE
342  !
343  kresp=0
344  !
345  ! 0. find filename
346  ! -----------------
347  ifile_id = nid_nc
348  !
349  IF (ifile_id /= 0) THEN
350  ! 1. Find id of the variable
351  !----------------------------
352  iret(1)=nf90_inq_varid(ifile_id,hrec,ivar_id)
353  IF (ofield) THEN
354  yfield ='T'
355  ELSE
356  yfield ='F'
357  ENDIF
358  ! 2. Put variable
359  !----------------------------
360  iret(2)=nf90_put_var(ifile_id,ivar_id,yfield)
361  CALL handle_err(iret(1),hrec)
362  ENDIF
363  !
364  ! 3. Check for errors
365  !--------------------
366  DO jret=1,2
367  IF (ifile_id==0 .OR. iret(jret).NE.nf90_noerr) kresp=1
368  ENDDO
369  !
370 ENDIF
371 !
372 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFL0_OL',1,zhook_handle)
373 !
374 END SUBROUTINE write_surfl0_ol
375 !
376 ! #############################################################
377  SUBROUTINE write_surfx0_time_ol(PFIELD,KRESP,HCOMMENT)
378 ! #############################################################
379 !
380 !!**** *WRITEX1* - routine to fill a real 1D array for the externalised surface
381 !
382 USE modd_io_surf_ol, ONLY: xstartw
384 !
385 USE modi_handle_err
386 !
387 USE yomhook ,ONLY : lhook, dr_hook
388 USE parkind1 ,ONLY : jprb
389 !
390 USE netcdf
391 !
392 IMPLICIT NONE
393 !
394 !* 0.1 Declarations of arguments
395 !
396 REAL, INTENT(IN) :: PFIELD ! array containing the data field
397 INTEGER, INTENT(OUT):: KRESP ! KRESP : return-code if a problem appears
398  CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT
399 !
400 !* 0.2 Declarations of local variables
401 !
402 INTEGER, DIMENSION(1) :: ISTART
403 INTEGER :: IVAR_ID
404 INTEGER :: IFILE_ID, JFILE, JRET
405 REAL(KIND=JPRB) :: ZHOOK_HANDLE
406 !
407 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFX0_TIME_OL',0,zhook_handle)
408 !
409 kresp = 0
410 !
411 istart(1) = xstartw
412 !
413 DO jfile = 1,SIZE(xnetcdf_fileid_out)
414  !
415  ifile_id = xnetcdf_fileid_out(jfile)
416  !
417  IF (ifile_id/=0) THEN
418  !
419  jret = nf90_inq_varid(ifile_id,'time',ivar_id)
420  IF (jret.EQ.nf90_noerr) THEN
421  jret = nf90_put_var(ifile_id,ivar_id,pfield,istart)
422  CALL handle_err(jret,'time')
423  ENDIF
424  !
425  ENDIF
426  !
427 ENDDO
428 !
429 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFX0_TIME_OL',1,zhook_handle)
430 !
431 END SUBROUTINE write_surfx0_time_ol
432 !
433 ! #############################################################
434  SUBROUTINE write_surfx1_ol(HSELECT,HREC,PFIELD,KRESP,HCOMMENT,HDIR,HNAM_DIM)
435 ! #############################################################
436 !
437 !!**** *WRITEX1* - routine to fill a real 1D array for the externalised surface
438 !
441 !
444 !
445 USE modi_def_var_netcdf
446 !
447 USE modi_io_buff
448 !
449 USE yomhook ,ONLY : lhook, dr_hook
450 USE parkind1 ,ONLY : jprb
451 !
452 USE netcdf
453 !
454 IMPLICIT NONE
455 !
456 !
457 #ifdef SFX_MPI
458 include "mpif.h"
459 #endif
460 !
461 !* 0.1 Declarations of arguments
462 !
463  CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: HSELECT
464 !
465  CHARACTER(LEN=12), INTENT(IN) :: HREC ! name of the article to be read
466 REAL, DIMENSION(:), INTENT(IN) :: PFIELD ! array containing the data field
467 INTEGER, INTENT(OUT):: KRESP ! KRESP : return-code if a problem appears
468  CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT
469  CHARACTER(LEN=1), INTENT(IN) :: HDIR ! type of field :
470  ! 'H' : field with
471  ! horizontal spatial dim.
472  ! '-' : no horizontal dim.
473  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: HNAM_DIM
474 !
475 !* 0.2 Declarations of local variables
476 !
477  CHARACTER(LEN=100) :: YCOMMENT
478  CHARACTER(LEN=100), DIMENSION(1) :: YATT_TITLE, YATT
479 INTEGER, DIMENSION(3) :: IDIMIDS
480 INTEGER, DIMENSION(3) :: IDIMLEN
481 !
482  CHARACTER(LEN=100) :: YNAME
483  CHARACTER(LEN=16) :: YNAM_DIM
484 INTEGER,DIMENSION(5) :: IRET
485 INTEGER :: IFILE_ID, IVAR_ID, JDIM, INDIMS
486 !
487 INTEGER :: IRET0
488 LOGICAL :: GFOUND
489 INTEGER :: JRET
490 INTEGER :: INFOMPI
491 DOUBLE PRECISION :: XTIME0
492 REAL(KIND=JPRB) :: ZHOOK_HANDLE
493 !
494 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFX1_OL',0,zhook_handle)
495 !
496 iret(:) = 0
497 !
498 indims = 0
499 idimlen(:) = 0
500 yname = ""
501 !
502 kresp = 0
503 !
504  CALL io_buff(hrec,'W',gfound)
505 !
506 IF (gfound .AND. lhook) CALL dr_hook("WRITE_SURF_OL:WRITE_SURFX1_OL",1,zhook_handle)
507 IF (gfound) RETURN
508 !
509 IF (ldef) THEN
510  !
511  yatt_title(1) = "units"
512  CALL get_comment(hcomment,yatt(1),ycomment)
513  !
514  IF (PRESENT(hnam_dim)) THEN
515  ynam_dim = hnam_dim
516  ELSE
517  ynam_dim = "Number_of_points"
518  ENDIF
519  !
520  IF (nrank==npio) THEN
521  !
522  IF (nid_nc /= 0) THEN
523  !
524  indims = 1
525  iret(2) = nf90_inq_dimid(nid_nc,trim(ynam_dim),idimids(1))
526  IF (iret(2)/=0) THEN
527  indims = 2
528  iret(2) = nf90_inq_dimid(nid_nc,'lon',idimids(1))
529  IF (iret(2)/=0) THEN
530  iret(2) = nf90_inq_dimid(nid_nc,'xx',idimids(1))
531  iret(3) = nf90_inq_dimid(nid_nc,'yy',idimids(2))
532  ELSE
533  iret(3) = nf90_inq_dimid(nid_nc,'lat',idimids(2))
534  ENDIF
535  iret0 = nf90_inq_dimid(nid_nc,'time',idimids(3))
536  IF (iret0==0) indims=3
537  ELSEIF (.NOT.PRESENT(hnam_dim)) THEN
538  iret0 = nf90_inq_dimid(nid_nc,'time',idimids(2))
539  IF (iret0==0) indims=2
540  ENDIF
541  !
542  iret(4)=nf90_inquire_dimension(nid_nc,idimids(1),name=yname)
543  !
544  DO jret=1,4
545  IF (iret0==0 .OR. iret(jret).NE.nf90_noerr) kresp=1
546  ENDDO
547  !
548  IF (yname.NE.'lon' .AND. yname.NE.'xx') THEN
549  CALL def_var_netcdf(hselect,nid_nc,hrec,ycomment,idimids(1:indims),&
550  yatt_title,yatt,ivar_id,nf90_double,1)
551  ELSE
552  CALL def_var_netcdf(hselect,nid_nc,hrec,ycomment,idimids(1:indims),&
553  yatt_title,yatt,ivar_id,nf90_double)
554  ENDIF
555  !
556  jret = nf90_put_att(nid_nc,ivar_id,"grid_mapping","Projection_Type")
557  !
558  ENDIF
559  !
560  ENDIF
561  !
562 ELSE
563  !
564  IF (nrank==npio) THEN
565  !
566 #ifdef SFX_MPI
567  xtime0 = mpi_wtime()
568 #endif
569  !
570  ! 0. find filename
571  ! -----------------
572  !
573  ifile_id = nid_nc
574  !
575  IF (ifile_id /= 0) THEN
576  !
577  ! 1. Find id of the variable
578  !----------------------------
579  iret(1)=nf90_inq_varid(ifile_id,hrec,ivar_id)
580  iret(2)=nf90_inquire_variable(ifile_id,ivar_id,ndims=indims)
581  iret(3)=nf90_inquire_variable(ifile_id,ivar_id,dimids=idimids(1:indims))
582  DO jdim=1,2
583  jret=nf90_inquire_dimension(ifile_id,idimids(jdim),len=idimlen(jdim))
584  ENDDO
585  !
586  iret(4)=nf90_inquire_dimension(ifile_id,idimids(1),name=yname)
587  !
588  ! 3. Check for errors
589  !--------------------
590  DO jret=1,4
591  IF (ifile_id==0 .OR. iret(jret).NE.nf90_noerr) kresp=1
592  ENDDO
593  !
594  ENDIF
595  !
596 #ifdef SFX_MPI
597  xtime_npio_write = xtime_npio_write + (mpi_wtime() - xtime0)
598 #endif
599  !
600  ELSE
601  ivar_id = 0
602  indims = 0
603  idimids(:) = 0
604  idimlen(:) = 0
605  yname = ""
606  ENDIF
607  !
608  IF (nproc>1) THEN
609 #ifdef SFX_MPI
610  xtime0 = mpi_wtime()
611  CALL mpi_bcast(ifile_id,kind(ifile_id)/4,mpi_integer,npio,ncomm,infompi)
612  xtime_comm_write = xtime_comm_write + (mpi_wtime() - xtime0)
613 #endif
614  ENDIF
615  !
616  IF (ifile_id/=0) THEN
617  !
618  IF (yname .EQ. 'Number_of_points') THEN
619  CALL write_datax1_ol(idimlen(1),indims)
620  ELSE
621  CALL write_datax1_ol(idimlen(1)*idimlen(2),indims)
622  ENDIF
623  !
624  ENDIF
625  !
626 ENDIF
627 !
628 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFX1_OL',1,zhook_handle)
629 !
630 CONTAINS
631 !
632 SUBROUTINE write_datax1_ol(KDIM,KNDIMS)
633 !
636 USE modi_handle_err
637 !
638 USE netcdf
639 !
640 IMPLICIT NONE
641 !
642 INTEGER, INTENT(IN) :: KDIM
643 INTEGER, INTENT(IN) :: KNDIMS
644 !
645 REAL, DIMENSION(KDIM) :: ZTAB1D
646 REAL, DIMENSION(KDIM) :: ZWORK_IGN
647 !
648 INTEGER, DIMENSION(KNDIMS) :: ISTART
649 INTEGER, DIMENSION(KNDIMS) :: ICOUNT
650 INTEGER, DIMENSION(KNDIMS) :: ISTRIDE
651 REAL(KIND=JPRB) :: ZHOOK_HANDLE
652 !
653 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFX1_OL:WRITE_DATAX1_OL',0,zhook_handle)
654 !
655 IF(.NOT.ALLOCATED(nmask_ign))THEN
656  IF (lmask) THEN
657  CALL gather_and_write_mpi(pfield,ztab1d,nmask)
658  ELSE
659  CALL gather_and_write_mpi(pfield,ztab1d)
660  ENDIF
661 ELSE
662  !ign grid
663  IF (lmask) THEN
664  CALL gather_and_write_mpi(pfield,zwork_ign(1:SIZE(nmask_ign)),nmask)
665  ELSE
666  CALL gather_and_write_mpi(pfield,zwork_ign(1:SIZE(nmask_ign)))
667  ENDIF
668  CALL unpack_same_rank(nmask_ign,zwork_ign(1:SIZE(nmask_ign)),ztab1d)
669 ENDIF
670 !
671 IF (nrank==npio) THEN
672  !
673 #ifdef SFX_MPI
674  xtime0 = mpi_wtime()
675 #endif
676  !
677  IF (lpartw) THEN
678  ! write partially a time-matrix.
679  ! Have to find which of the dimension is the time dimension
680  DO jdim=1,kndims
681  jret=nf90_inquire_dimension(ifile_id,idimids(jdim),name=yname)
682  IF ((index(yname,'time') > 0).OR.(index(yname,'TIME') >0) &
683  .OR.(index(yname,'Time')>0.)) THEN
684  istart(jdim)=xstartw
685  icount(jdim)=xcountw
686  istride(jdim)=xstride
687  ELSE
688  istart(jdim)=1
689  icount(jdim)=idimlen(jdim)
690  istride(jdim)=1
691  ENDIF
692  ENDDO
693  iret(5)=nf90_put_var(ifile_id,ivar_id,ztab1d,istart,icount,istride)
694  ELSE
695  iret(5)=nf90_put_var(ifile_id,ivar_id,ztab1d)
696  ENDIF
697  !
698  CALL handle_err(iret(5),hrec)
699  !
700 #ifdef SFX_MPI
701  xtime_npio_write = xtime_npio_write + (mpi_wtime() - xtime0)
702 #endif
703  !
704 ENDIF
705 !
706 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFX1_OL:WRITE_DATAX1_OL',1,zhook_handle)
707 !
708 END SUBROUTINE write_datax1_ol
709 !
710 END SUBROUTINE write_surfx1_ol
711 !
712 ! #############################################################
713  SUBROUTINE write_surfx2_ol(HSELECT,HREC,PFIELD,KRESP,HCOMMENT,HDIR,HNAM_DIM)
714 ! #############################################################
715 !
716 !!**** *WRITEX2* - routine to fill a real 2D array for the externalised surface
717 !
720 !
723 !
724 USE modi_def_var_netcdf
725 !
726 USE yomhook ,ONLY : lhook, dr_hook
727 USE parkind1 ,ONLY : jprb
728 !
729 USE netcdf
730 !
731 IMPLICIT NONE
732 !
733 !
734 #ifdef SFX_MPI
735 include "mpif.h"
736 #endif
737 !
738 !* 0.1 Declarations of arguments
739 !
740  CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: HSELECT
741 !
742  CHARACTER(LEN=12), INTENT(IN) :: HREC ! name of the article to be read
743 REAL, DIMENSION(:,:), INTENT(IN) :: PFIELD ! array containing the data field
744 INTEGER, INTENT(OUT):: KRESP ! KRESP : return-code if a problem appears
745  CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT
746  CHARACTER(LEN=1), INTENT(IN) :: HDIR ! type of field :
747  ! 'H' : field with
748  ! horizontal spatial dim.
749  ! '-' : no horizontal dim.
750  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: HNAM_DIM
751 !
752 !* 0.2 Declarations of local variables
753 !
754  CHARACTER(LEN=100) :: YCOMMENT
755  CHARACTER(LEN=100), DIMENSION(1) :: YATT_TITLE, YATT
756 INTEGER, DIMENSION(4) :: IDIMIDS
757 INTEGER, DIMENSION(4) :: IDIMLEN
758 !
759  CHARACTER(LEN=20) :: YNAM_DIM
760  CHARACTER(LEN=100) :: YNAME
761 INTEGER,DIMENSION(5) :: IRET
762 INTEGER :: IFILE_ID, IVAR_ID, JDIM, INDIMS
763 !
764 INTEGER :: IRET0
765 LOGICAL :: GFOUND
766 INTEGER :: JRET
767 INTEGER :: INFOMPI
768 DOUBLE PRECISION :: XTIME0
769 !
770 REAL(KIND=JPRB) :: ZHOOK_HANDLE
771 !
772 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFX2_OL',0,zhook_handle)
773 !
774 !
775 iret(:) = 0
776 !
777 indims = 0
778 idimlen(:) = 0
779 yname = ""
780 !
781 kresp = 0
782 !
783  CALL io_buff(hrec,'W',gfound)
784 !
785 IF (gfound .AND. lhook) CALL dr_hook("WRITE_SURF_OL:WRITE_SURFX2_OL",1,zhook_handle)
786 IF (gfound) RETURN
787 !
788 IF (ldef) THEN
789  !
790  yatt_title(1) = "units"
791  CALL get_comment(hcomment,yatt(1),ycomment)
792  !
793  IF (PRESENT(hnam_dim)) THEN
794  ynam_dim = hnam_dim
795  ELSE
796  ynam_dim = "Number_of_Patches"
797  ENDIF
798  !
799  IF (nrank==npio) THEN
800  !
801  IF (nid_nc /= 0) THEN
802  !
803  ! 0. find filename
804  ! -----------------
805  !
806  indims = 2
807  IF ( trim(ynam_dim) == "Nemis_snap" ) THEN
808  iret(2) = nf90_inq_dimid(nid_nc,"Nsnap_temp",idimids(1))
809  ELSE
810  indims = 3
811  iret(2) = nf90_inq_dimid(nid_nc,"Number_of_points",idimids(1))
812  ENDIF
813  IF (iret(2)==0) THEN
814  iret(3) = nf90_inq_dimid(nid_nc,trim(ynam_dim),idimids(2))
815  IF (indims==3) iret0 = nf90_inq_dimid(nid_nc,'time',idimids(3))
816  ELSE
817  indims = 3
818  iret(2) = nf90_inq_dimid(nid_nc,'lon',idimids(1))
819  IF (iret(2)/=0) THEN
820  iret(2) = nf90_inq_dimid(nid_nc,'xx',idimids(1))
821  iret(3) = nf90_inq_dimid(nid_nc,'yy',idimids(2))
822  ELSE
823  iret(3) = nf90_inq_dimid(nid_nc,'lat',idimids(2))
824  ENDIF
825  iret(4) = nf90_inq_dimid(nid_nc,trim(ynam_dim),idimids(3))
826  iret0 = nf90_inq_dimid(nid_nc,'time',idimids(4))
827  IF (iret0==0) indims = 4
828  ENDIF
829  !
830  iret(5)=nf90_inquire_dimension(nid_nc,idimids(1),name=yname)
831  !
832  DO jret=1,5
833  IF (iret0==0 .OR. iret(jret).NE.nf90_noerr) kresp=1
834  ENDDO
835  !
836  IF (yname .NE. 'lon' .AND. yname .NE. 'xx') THEN
837  CALL def_var_netcdf(hselect,nid_nc,hrec,ycomment,idimids(1:indims),&
838  yatt_title,yatt,ivar_id,nf90_double)
839  ELSE
840  CALL def_var_netcdf(hselect,nid_nc,hrec,ycomment,idimids(1:indims), &
841  yatt_title,yatt,ivar_id,nf90_double)
842  ENDIF
843  !
844  jret = nf90_put_att(nid_nc,ivar_id,"grid_mapping","Projection_Type")
845  !
846  ENDIF
847  !
848  ENDIF
849  !
850 ELSE
851  !
852  IF (nrank==npio) THEN
853  !
854 #ifdef SFX_MPI
855  xtime0 = mpi_wtime()
856 #endif
857  !
858  ! 0. find filename
859  ! -----------------
860  !
861  ifile_id = nid_nc
862  !
863  IF ( ifile_id /= 0 ) THEN
864  !
865  ! 1. Find id of the variable
866  !----------------------------
867  !
868  iret(1)=nf90_inq_varid(ifile_id,hrec,ivar_id)
869  iret(2)=nf90_inquire_variable(ifile_id,ivar_id,ndims=indims)
870  iret(3)=nf90_inquire_variable(ifile_id,ivar_id,dimids=idimids(1:indims))
871  DO jdim=1,indims
872  jret=nf90_inquire_dimension(ifile_id,idimids(jdim),len=idimlen(jdim))
873  IF (jret.NE.nf90_noerr) kresp=1
874  ENDDO
875  !
876  iret(4)=nf90_inquire_dimension(ifile_id,idimids(1),name=yname)
877  !
878  ENDIF
879  !
880  DO jret=1,4
881  IF (ifile_id==0 .OR. iret(jret).NE.nf90_noerr) kresp=1
882  ENDDO
883  !
884 #ifdef SFX_MPI
885  xtime_npio_write = xtime_npio_write + (mpi_wtime() - xtime0)
886 #endif
887  !
888  ELSE
889  ivar_id = 0
890  indims = 0
891  idimids(:) = 0
892  idimlen(:) = SIZE(pfield,2)
893  yname = ""
894  ENDIF
895  !
896  IF (nproc>1) THEN
897 #ifdef SFX_MPI
898  xtime0 = mpi_wtime()
899  CALL mpi_bcast(ifile_id,kind(ifile_id)/4,mpi_integer,npio,ncomm,infompi)
900  xtime_comm_write = xtime_comm_write + (mpi_wtime() - xtime0)
901 #endif
902  ENDIF
903  !
904  IF (ifile_id/=0) THEN
905  !
906  IF (yname .EQ. 'Number_of_points') THEN
907  CALL write_datax2_ol(idimlen(1),idimlen(2),indims)
908  ELSE
909  CALL write_datax2_ol(idimlen(1)*idimlen(2),idimlen(3),indims)
910  ENDIF
911  !
912  ENDIF
913  !
914 ENDIF
915 !
916 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFX2_OL',1,zhook_handle)
917 !
918 CONTAINS
919 !
920 SUBROUTINE write_datax2_ol(KDIM1,KDIM2,KNDIMS)
921 !
922 USE modd_surf_par, ONLY : xundef
923 !
926 USE modi_handle_err
927 !
928 USE netcdf
929 !
930 IMPLICIT NONE
931 !
932 INTEGER, INTENT(IN) :: KDIM1
933 INTEGER, INTENT(IN) :: KDIM2
934 INTEGER, INTENT(IN) :: KNDIMS
935 !
936 REAL, DIMENSION(KDIM1,KDIM2) :: ZTAB2D ! work array read in the file
937 REAL, DIMENSION(KDIM1,SIZE(PFIELD,2)) :: ZWORK_IGN ! work array read in the file
938 INTEGER, DIMENSION(KNDIMS) :: ISTART
939 INTEGER, DIMENSION(KNDIMS) :: ISTRIDE
940 INTEGER, DIMENSION(KNDIMS) :: ICOUNT
941 REAL(KIND=JPRB) :: ZHOOK_HANDLE
942 !
943 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFX2_OL:WRITE_DATAX2_OL',0,zhook_handle)
944 !
945 ztab2d(:,:) = xundef
946 !
947 IF(.NOT.ALLOCATED(nmask_ign))THEN
948  IF (lmask) THEN
949  CALL gather_and_write_mpi(pfield,ztab2d(:,1:SIZE(pfield,2)),nmask)
950  ELSE
951  CALL gather_and_write_mpi(pfield,ztab2d(:,1:SIZE(pfield,2)))
952  ENDIF
953 ELSE
954  !ign grid
955  IF (lmask) THEN
956  CALL gather_and_write_mpi(pfield,zwork_ign(1:SIZE(nmask_ign),:),nmask)
957  ELSE
958  CALL gather_and_write_mpi(pfield,zwork_ign(1:SIZE(nmask_ign),:))
959  ENDIF
960  CALL unpack_same_rank(nmask_ign,zwork_ign(1:SIZE(nmask_ign),:),ztab2d(:,1:SIZE(pfield,2)))
961 ENDIF
962 !
963 IF (nrank==npio) THEN
964  !
965 #ifdef SFX_MPI
966  xtime0 = mpi_wtime()
967 #endif
968  !
969  ! 2. Put variable
970  !----------------------------
971  IF (lpartw) THEN
972  ! write partially a time-matrix.
973  ! Have to find which of the dimension is the time dimension
974  DO jdim=1,kndims
975  jret=nf90_inquire_dimension(ifile_id,idimids(jdim),name=yname)
976  IF ((index(yname,'time') > 0).OR.(index(yname,'TIME') >0) &
977  .OR.(index(yname,'Time')>0.)) THEN
978  istart(jdim)=xstartw
979  icount(jdim)=xcountw
980  istride(jdim)=xstride
981  ELSE
982  istart(jdim)=1
983  icount(jdim)=idimlen(jdim)
984  istride(jdim)=1
985  ENDIF
986  ENDDO
987  iret(5)=nf90_put_var(ifile_id,ivar_id,ztab2d,istart,icount,istride)
988  ELSE
989  iret(5)=nf90_put_var(ifile_id,ivar_id,ztab2d)
990  ENDIF
991  !
992  CALL handle_err(iret(5),hrec)
993  !
994 #ifdef SFX_MPI
995  xtime_npio_write = xtime_npio_write + (mpi_wtime() - xtime0)
996 #endif
997  !
998 ENDIF
999 !
1000 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFX2_OL:WRITE_DATAX2_OL',1,zhook_handle)
1001 !
1002 END SUBROUTINE write_datax2_ol
1003 !
1004 END SUBROUTINE write_surfx2_ol
1005 !
1006 ! #############################################################
1007  SUBROUTINE write_surfx3_ol(HSELECT,HREC,PFIELD,KRESP,HCOMMENT,HDIR,HNAM_DIM)
1008 ! #############################################################
1009 !
1010 !!**** *WRITEX2* - routine to fill a real 2D array for the externalised surface
1011 !
1014 !
1017 !
1018 USE modi_def_var_netcdf
1019 !
1020 USE modi_abor1_sfx
1021 !
1022 USE yomhook ,ONLY : lhook, dr_hook
1023 USE parkind1 ,ONLY : jprb
1024 !
1025 USE netcdf
1026 !
1027 IMPLICIT NONE
1028 !
1029 !
1030 #ifdef SFX_MPI
1031 include "mpif.h"
1032 #endif
1033 !
1034 !* 0.1 Declarations of arguments
1035 !
1036  CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: HSELECT
1037 !
1038  CHARACTER(LEN=12), INTENT(IN) :: HREC ! name of the article to be read
1039 REAL, DIMENSION(:,:,:), INTENT(IN) :: PFIELD ! array containing the data field
1040 INTEGER, INTENT(OUT):: KRESP ! KRESP : return-code if a problem appears
1041  CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT
1042  CHARACTER(LEN=1), INTENT(IN) :: HDIR ! type of field :
1043  ! 'H' : field with
1044  ! horizontal spatial dim.
1045  ! '-' : no horizontal dim.
1046  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: HNAM_DIM
1047 !
1048 !* 0.2 Declarations of local variables
1049 !
1050  CHARACTER(LEN=100) :: YCOMMENT
1051  CHARACTER(LEN=100), DIMENSION(1) :: YATT_TITLE, YATT
1052 INTEGER, DIMENSION(5) :: IDIMIDS
1053 INTEGER, DIMENSION(5) :: IDIMLEN
1054 !
1055  CHARACTER(LEN=16) :: YNAM_DIM
1056  CHARACTER(LEN=100) :: YNAME
1057 INTEGER,DIMENSION(5) :: IRET
1058 INTEGER :: IFILE_ID, IVAR_ID, JDIM, INDIMS
1059 !
1060 INTEGER :: IRET0
1061 LOGICAL :: GFOUND
1062 INTEGER :: JRET
1063 INTEGER :: INFOMPI
1064 DOUBLE PRECISION :: XTIME0
1065 !
1066 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1067 !
1068 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFX3_OL',0,zhook_handle)
1069 !
1070 iret(:) = 0
1071 !
1072 indims = 0
1073 idimlen(:) = 0
1074 yname = ""
1075 !
1076 kresp = 0
1077 !
1078  CALL io_buff(hrec,'W',gfound)
1079 !
1080 IF (gfound .AND. lhook) CALL dr_hook("WRITE_SURF_OL:WRITE_SURFX3_OL",1,zhook_handle)
1081 IF (gfound) RETURN
1082 !
1083 IF (ldef) THEN
1084  !
1085  yatt_title(1) = "units"
1086  CALL get_comment(hcomment,yatt(1),ycomment)
1087  !
1088  IF (PRESENT(hnam_dim)) THEN
1089  ynam_dim = hnam_dim
1090  ELSE
1091  CALL abor1_sfx("WRITE_SURFX3_OL: TO WRITE A 3D FIELD, HNAM_DIM IS NEEDED")
1092  ENDIF
1093  !
1094  IF (nrank==npio) THEN
1095  !
1096  IF (nid_nc /= 0) THEN
1097  !
1098  ! 0. find filename
1099  ! -----------------
1100  !
1101  iret(2) = nf90_inq_dimid(nid_nc,"Number_of_points",idimids(1))
1102  IF (iret(2)==0) THEN
1103  indims = 4
1104  iret(3) = nf90_inq_dimid(nid_nc,trim(ynam_dim),idimids(2))
1105  iret(4) = nf90_inq_dimid(nid_nc,'Number_of_Patches',idimids(3))
1106  iret0 = nf90_inq_dimid(nid_nc,'time',idimids(4))
1107  ELSE
1108  indims = 4
1109  iret(2) = nf90_inq_dimid(nid_nc,'lon',idimids(1))
1110  IF (iret(2)/=0) THEN
1111  iret(2) = nf90_inq_dimid(nid_nc,'xx',idimids(1))
1112  iret(3) = nf90_inq_dimid(nid_nc,'yy',idimids(2))
1113  ELSE
1114  iret(3) = nf90_inq_dimid(nid_nc,'lat',idimids(2))
1115  ENDIF
1116  iret(4) = nf90_inq_dimid(nid_nc,trim(ynam_dim),idimids(3))
1117  iret(5) = nf90_inq_dimid(nid_nc,'Number_of_Patches',idimids(4))
1118  iret0 = nf90_inq_dimid(nid_nc,'time',idimids(5))
1119  IF (iret0==0) indims = 5
1120  ENDIF
1121  !
1122  iret(5)=nf90_inquire_dimension(nid_nc,idimids(1),name=yname)
1123  !
1124  DO jret=1,5
1125  IF (iret0==0 .OR. iret(jret).NE.nf90_noerr) kresp=1
1126  ENDDO
1127  !
1128  IF (yname .NE. 'lon' .AND. yname .NE. 'xx') THEN
1129  CALL def_var_netcdf(hselect,nid_nc,hrec,ycomment,idimids(1:indims),&
1130  yatt_title,yatt,ivar_id,nf90_double)
1131  ELSE
1132  CALL def_var_netcdf(hselect,nid_nc,hrec,ycomment,idimids(1:indims), &
1133  yatt_title,yatt,ivar_id,nf90_double)
1134  ENDIF
1135  !
1136  jret = nf90_put_att(nid_nc,ivar_id,"grid_mapping","Projection_Type")
1137  !
1138  ENDIF
1139  !
1140  ENDIF
1141  !
1142 ELSE
1143  !
1144  IF (nrank==npio) THEN
1145  !
1146 #ifdef SFX_MPI
1147  xtime0 = mpi_wtime()
1148 #endif
1149  !
1150  ! 0. find filename
1151  ! -----------------
1152  !
1153  ifile_id = nid_nc
1154  !
1155  IF ( ifile_id /= 0 ) THEN
1156  !
1157  ! 1. Find id of the variable
1158  !----------------------------
1159  !
1160  iret(1)=nf90_inq_varid(ifile_id,hrec,ivar_id)
1161  iret(2)=nf90_inquire_variable(ifile_id,ivar_id,ndims=indims)
1162  iret(3)=nf90_inquire_variable(ifile_id,ivar_id,dimids=idimids(1:indims))
1163  DO jdim=1,indims
1164  jret=nf90_inquire_dimension(ifile_id,idimids(jdim),len=idimlen(jdim))
1165  IF (jret.NE.nf90_noerr) kresp=1
1166  ENDDO
1167  !
1168  iret(4)=nf90_inquire_dimension(ifile_id,idimids(1),name=yname)
1169  !
1170  ENDIF
1171  !
1172  DO jret=1,4
1173  IF (ifile_id==0 .OR. iret(jret).NE.nf90_noerr) kresp=1
1174  ENDDO
1175  !
1176 #ifdef SFX_MPI
1177  xtime_npio_write = xtime_npio_write + (mpi_wtime() - xtime0)
1178 #endif
1179  !
1180  ELSE
1181  ivar_id = 0
1182  indims = 0
1183  idimids(:) = 0
1184  idimlen(:) = SIZE(pfield,2)
1185  yname = ""
1186  ENDIF
1187  !
1188  IF (nproc>1) THEN
1189 #ifdef SFX_MPI
1190  xtime0 = mpi_wtime()
1191  CALL mpi_bcast(ifile_id,kind(ifile_id)/4,mpi_integer,npio,ncomm,infompi)
1192  xtime_comm_write = xtime_comm_write + (mpi_wtime() - xtime0)
1193 #endif
1194  ENDIF
1195  !
1196  IF (ifile_id/=0) THEN
1197  !
1198  IF (yname .EQ. 'Number_of_points') THEN
1199  CALL write_datax3_ol(idimlen(1),idimlen(2),idimlen(3),indims)
1200  ELSE
1201  CALL write_datax3_ol(idimlen(1)*idimlen(2),idimlen(3),idimlen(4),indims)
1202  ENDIF
1203  !
1204  ENDIF
1205  !
1206 ENDIF
1207 !
1208 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFX3_OL',1,zhook_handle)
1209 !
1210 CONTAINS
1211 !
1212 SUBROUTINE write_datax3_ol(KDIM1,KDIM2,KDIM3,KNDIMS)
1214 USE modd_surf_par, ONLY : xundef
1215 !
1218 USE modi_handle_err
1219 !
1220 USE netcdf
1221 !
1222 IMPLICIT NONE
1223 !
1224 INTEGER, INTENT(IN) :: KDIM1
1225 INTEGER, INTENT(IN) :: KDIM2
1226 INTEGER, INTENT(IN) :: KDIM3
1227 INTEGER, INTENT(IN) :: KNDIMS
1228 !
1229 REAL, DIMENSION(KDIM1,KDIM2,KDIM3) :: ZTAB3D ! work array read in the file
1230 REAL, DIMENSION(KDIM1,SIZE(PFIELD,2),SIZE(PFIELD,3)) :: ZWORK_IGN ! work array read in the file
1231 INTEGER, DIMENSION(KNDIMS) :: ISTART
1232 INTEGER, DIMENSION(KNDIMS) :: ISTRIDE
1233 INTEGER, DIMENSION(KNDIMS) :: ICOUNT
1234 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1235 !
1236 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFX3_OL:WRITE_DATAX3_OL',0,zhook_handle)
1237 !
1238 ztab3d(:,:,:) = xundef
1239 !
1240 IF(.NOT.ALLOCATED(nmask_ign))THEN
1241  IF (lmask) THEN
1242  CALL gather_and_write_mpi(pfield,ztab3d(:,1:SIZE(pfield,2),1:SIZE(pfield,3)),nmask)
1243  ELSE
1244  CALL gather_and_write_mpi(pfield,ztab3d(:,1:SIZE(pfield,2),1:SIZE(pfield,3)))
1245  ENDIF
1246 ELSE
1247  !ign grid
1248  IF (lmask) THEN
1249  CALL gather_and_write_mpi(pfield,zwork_ign(1:SIZE(nmask_ign),:,:),nmask)
1250  ELSE
1251  CALL gather_and_write_mpi(pfield,zwork_ign(1:SIZE(nmask_ign),:,:))
1252  ENDIF
1253  CALL unpack_same_rank(nmask_ign,zwork_ign(1:SIZE(nmask_ign),:,:),ztab3d(:,1:SIZE(pfield,2),1:SIZE(pfield,3)))
1254 ENDIF
1255 !
1256 IF (nrank==npio) THEN
1257  !
1258 #ifdef SFX_MPI
1259  xtime0 = mpi_wtime()
1260 #endif
1261  !
1262  ! 2. Put variable
1263  !----------------------------
1264  IF (lpartw) THEN
1265  ! write partially a time-matrix.
1266  ! Have to find which of the dimension is the time dimension
1267  DO jdim=1,kndims
1268  jret=nf90_inquire_dimension(ifile_id,idimids(jdim),name=yname)
1269  IF ((index(yname,'time') > 0).OR.(index(yname,'TIME') >0) &
1270  .OR.(index(yname,'Time')>0.)) THEN
1271  istart(jdim)=xstartw
1272  icount(jdim)=xcountw
1273  istride(jdim)=xstride
1274  ELSE
1275  istart(jdim)=1
1276  icount(jdim)=idimlen(jdim)
1277  istride(jdim)=1
1278  ENDIF
1279  ENDDO
1280  iret(5)=nf90_put_var(ifile_id,ivar_id,ztab3d,istart,icount,istride)
1281  ELSE
1282  iret(5)=nf90_put_var(ifile_id,ivar_id,ztab3d)
1283  ENDIF
1284  !
1285  CALL handle_err(iret(5),hrec)
1286  !
1287 #ifdef SFX_MPI
1288  xtime_npio_write = xtime_npio_write + (mpi_wtime() - xtime0)
1289 #endif
1290  !
1291 ENDIF
1292 !
1293 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFX3_OL:WRITE_DATAX3_OL',1,zhook_handle)
1294 !
1295 END SUBROUTINE write_datax3_ol
1296 !
1297 END SUBROUTINE write_surfx3_ol
1298 !
1299 ! #############################################################
1300  SUBROUTINE write_surfn1_ol (HSELECT,HREC,KFIELD,KRESP,HCOMMENT,HDIR,HNAM_DIM)
1301 ! #############################################################
1302 !
1303 !!**** *WRITEN0* - routine to read an integer
1304 !
1305 USE yomhook ,ONLY : lhook, dr_hook
1306 USE parkind1 ,ONLY : jprb
1307 !
1308 USE netcdf
1309 !
1310 IMPLICIT NONE
1311 !
1312 !* 0.1 Declarations of arguments
1313 !
1314  CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: HSELECT
1315  CHARACTER(LEN=12), INTENT(IN) :: HREC ! name of the article to be read
1316 INTEGER, DIMENSION(:), INTENT(IN) :: KFIELD ! the integer scalar to be read
1317 INTEGER, INTENT(OUT) :: KRESP ! KRESP : return-code if a problem appears
1318  CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT
1319  CHARACTER(LEN=1), INTENT(IN) :: HDIR ! type of field :
1320  ! 'H' : field with
1321  ! horizontal spatial dim.
1322  ! '-' : no horizontal dim.
1323  CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: HNAM_DIM
1324 !
1325 !* 0.2 Declarations of local variables
1326 !
1327 REAL, DIMENSION(SIZE(KFIELD)) :: ZFIELD
1328 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1329 !
1330 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFN1_OL',0,zhook_handle)
1331 !
1332 zfield=float(kfield)
1333  CALL write_surfx1_ol(hselect,hrec,zfield,kresp,hcomment,hdir,hnam_dim)
1334 !
1335 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFN1_OL',1,zhook_handle)
1336 !
1337 END SUBROUTINE write_surfn1_ol
1338 !
1339 ! #############################################################
1340  SUBROUTINE write_surfl1_ol(HSELECT,HREC,OFIELD,KRESP,HCOMMENT,HDIR)
1341 ! #############################################################
1342 !
1343 !!**** *WRITEL1* - routine to read a logical array
1344 !
1346 !
1347 USE modd_io_surf_ol, ONLY: nid_nc, ldef
1348 !
1349 USE modi_io_buff
1350 USE modi_def_var_netcdf
1351 USE modi_handle_err
1352 !
1353 USE yomhook ,ONLY : lhook, dr_hook
1354 USE parkind1 ,ONLY : jprb
1355 !
1356 USE netcdf
1357 !
1358 IMPLICIT NONE
1359 !
1360 !
1361 #ifdef SFX_MPI
1362 include "mpif.h"
1363 #endif
1364 !
1365 !* 0.1 Declarations of arguments
1366 !
1367  CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: HSELECT
1368 !
1369  CHARACTER(LEN=*), INTENT(IN) :: HREC ! name of the article to be read
1370 LOGICAL, DIMENSION(:), INTENT(IN) :: OFIELD ! array containing the data field
1371 INTEGER, INTENT(OUT):: KRESP ! KRESP : return-code if a problem appears
1372  CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT
1373  CHARACTER(LEN=1), INTENT(IN) :: HDIR ! type of field :
1374  ! 'H' : field with
1375  ! horizontal spatial dim.
1376  ! '-' : no horizontal dim.
1377 !* 0.2 Declarations of local variables
1378 !
1379  CHARACTER(LEN=100) :: YCOMMENT
1380  CHARACTER(LEN=100), DIMENSION(1) :: YATT_TITLE, YATT
1381 INTEGER, DIMENSION(2) :: IDIMIDS
1382 INTEGER, DIMENSION(2) :: IDIMLEN
1383 !
1384  CHARACTER(LEN=100) :: YNAME
1385 INTEGER,DIMENSION(4) :: IRET
1386 INTEGER :: IFILE_ID, IVAR_ID, JDIM, INDIMS
1387 !
1388 LOGICAL :: GFOUND
1389 INTEGER :: IRET0
1390 INTEGER :: JRET
1391 DOUBLE PRECISION :: XTIME0
1392 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1393 !
1394 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFL1_OL',0,zhook_handle)
1395 !
1396 iret(:) = 0
1397 !
1398 kresp = 0
1399 !
1400  CALL io_buff(hrec,'W',gfound)
1401 !
1402 IF (gfound .AND. lhook) CALL dr_hook("WRITE_SURF_OL:WRITE_SURFL1_OL",1,zhook_handle)
1403 IF (gfound) RETURN
1404 !
1405 IF (ldef) THEN
1406  !
1407  yatt_title(1) = "units"
1408  CALL get_comment(hcomment,yatt(1),ycomment)
1409  !
1410  IF (nrank==npio) THEN
1411  !
1412  IF (nid_nc /= 0) THEN
1413  !
1414  IF (hrec(1:2)=='L_') THEN
1415  iret(1) = nf90_inq_dimid(nid_nc,'Nb_of_input_data',idimids(1))
1416  ELSE
1417  iret(1) = nf90_inq_dimid(nid_nc,'Number_of_covers',idimids(1))
1418  ENDIF
1419  iret(2) = nf90_inquire_dimension(nid_nc,idimids(1),len=idimlen(1))
1420  !
1421  CALL def_var_netcdf(hselect,nid_nc,hrec,ycomment,idimids(1:1),&
1422  yatt_title,yatt,ivar_id,nf90_char,1)
1423  !
1424  ENDIF
1425  !
1426  ENDIF
1427  !
1428 ELSE
1429  !
1430  IF ( nrank==npio ) THEN
1431  !
1432 #ifdef SFX_MPI
1433  xtime0 = mpi_wtime()
1434 #endif
1435  !
1436  ! 0. find filename
1437  ! -----------------
1438  ifile_id = nid_nc
1439  !
1440  IF (ifile_id /= 0) THEN
1441  !
1442  ! 1. Find id of the variable
1443  !----------------------------
1444  iret(1)=nf90_inq_varid(ifile_id,hrec,ivar_id)
1445  iret(2)=nf90_inquire_variable(ifile_id,ivar_id,ndims=indims)
1446  iret(3)=nf90_inquire_variable(ifile_id,ivar_id,dimids=idimids(1:indims))
1447  DO jdim=1,1
1448  jret=nf90_inquire_dimension(ifile_id,idimids(jdim),len=idimlen(jdim))
1449  ENDDO
1450  !
1451  CALL write_datal1_ol(idimlen(1))
1452  !
1453  ENDIF
1454  !
1455  ! 3. Check for errors
1456  !--------------------
1457  DO jret=1,4
1458  IF (ifile_id==0 .OR. iret(jret).NE.nf90_noerr) kresp=1
1459  ENDDO
1460  !
1461 #ifdef SFX_MPI
1462  xtime_npio_write = xtime_npio_write + (mpi_wtime() - xtime0)
1463 #endif
1464  !
1465  ENDIF
1466  !
1467 ENDIF
1468 !
1469 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFL1_OL',1,zhook_handle)
1470 !
1471 CONTAINS
1472 !
1473 SUBROUTINE write_datal1_ol(KDIM)
1475 INTEGER, INTENT(IN) :: KDIM
1476 !
1477  CHARACTER(LEN=1), DIMENSION(KDIM) :: YTAB1D ! work array read in the file
1478 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1479 !
1480 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFL1_OL:WRITE_DATAL1_OL',0,zhook_handle)
1481 !
1482 DO jret=1,kdim
1483  IF (ofield(jret)) THEN
1484  ytab1d(jret) ='T'
1485  ELSE
1486  ytab1d(jret) ='F'
1487  ENDIF
1488 ENDDO
1489 !
1490 ! 2. Put variable
1491 !-----------------
1492 iret(4)=nf90_put_var(ifile_id,ivar_id,ytab1d)
1493 !
1494  CALL handle_err(iret(4),hrec)
1495 !
1496 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFL1_OL:WRITE_DATAL1_OL',1,zhook_handle)
1497 END SUBROUTINE write_datal1_ol
1498 !
1499 END SUBROUTINE write_surfl1_ol
1500 !
1501 !
1502 ! #############################################################
1503  SUBROUTINE write_surft0_ol(HSELECT,HREC,KYEAR,KMONTH,KDAY,PTIME,KRESP,HCOMMENT)
1504 ! #############################################################
1505 !
1506 !!**** *WRITET0* - routine to read a NETCDF date_time scalar
1507 !
1509 !
1510 USE modd_io_surf_ol, ONLY : nid_nc, ldef
1511 !
1512 USE modi_def_var_netcdf
1513 !
1514 USE yomhook ,ONLY : lhook, dr_hook
1515 USE parkind1 ,ONLY : jprb
1516 !
1517 USE netcdf
1518 !
1519 IMPLICIT NONE
1520 !
1521 !
1522 !* 0.1 Declarations of arguments
1523 !
1524  CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: HSELECT
1525  CHARACTER(LEN=12), INTENT(IN) :: HREC ! name of the article to be read
1526 INTEGER, INTENT(IN) :: KYEAR ! year
1527 INTEGER, INTENT(IN) :: KMONTH ! month
1528 INTEGER, INTENT(IN) :: KDAY ! day
1529 REAL, INTENT(IN) :: PTIME ! time
1530 INTEGER, INTENT(OUT) :: KRESP ! KRESP : return-code if a problem appears
1531  CHARACTER(LEN=100), INTENT(IN) :: HCOMMENT
1532 !
1533 !* 0.2 Declarations of local variables
1534 !
1535  CHARACTER(LEN=100) :: YCOMMENT
1536  CHARACTER(LEN=100), DIMENSION(1) :: YATT_TITLE, YATT
1537 INTEGER, DIMENSION(0) :: IDIMS
1538 !
1539  CHARACTER(LEN=12) :: YRECFM ! Name of the article to be written
1540 INTEGER :: IFILE_ID, IVAR_ID, JRET, JWRK
1541 INTEGER,DIMENSION(8) :: IRET
1542 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1543 !
1544 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFT0_OL',0,zhook_handle)
1545 !
1546 IF (ldef) THEN
1547  !
1548  yatt_title(1) = "units"
1549  CALL get_comment(hcomment,yatt(1),ycomment)
1550  !
1551  DO jwrk=1,4
1552  !
1553  IF (jwrk==1) THEN
1554  yrecfm = trim(hrec)//'-YEAR'
1555  ELSEIF (jwrk==2) THEN
1556  yrecfm = trim(hrec)//'-MONTH'
1557  ELSEIF (jwrk==3) THEN
1558  yrecfm = trim(hrec)//'-DAY'
1559  ELSEIF (jwrk==4) THEN
1560  yrecfm=trim(hrec)//'-TIME'
1561  ENDIF
1562  !
1563  IF (nid_nc/=0) THEN
1564  IF (jwrk<4) THEN
1565  CALL def_var_netcdf(hselect,nid_nc,yrecfm,hcomment,idims,yatt_title,yatt,ivar_id,nf90_int)
1566  ELSE
1567  CALL def_var_netcdf(hselect,nid_nc,yrecfm,hcomment,idims,yatt_title,yatt,ivar_id,nf90_double)
1568  ENDIF
1569  ENDIF
1570  !
1571  ENDDO
1572  !
1573 ELSE
1574  !
1575  kresp=0
1576  !
1577  ! 0. find filename
1578  ! -----------------
1579  ifile_id = nid_nc
1580  !
1581  IF (ifile_id /= 0) THEN
1582  !
1583  DO jwrk = 1,4
1584  !
1585  IF (jwrk==1) THEN
1586  yrecfm = trim(hrec)//'-YEAR'
1587  ELSEIF (jwrk==2) THEN
1588  yrecfm = trim(hrec)//'-MONTH'
1589  ELSEIF (jwrk==3) THEN
1590  yrecfm = trim(hrec)//'-DAY'
1591  ELSEIF (jwrk==4) THEN
1592  yrecfm=trim(hrec)//'-TIME'
1593  ENDIF
1594  !
1595  ! 1. Find id of the variable
1596  !----------------------------
1597  iret((jwrk-1)*2+1)=nf90_inq_varid(ifile_id,yrecfm,ivar_id)
1598  !
1599  IF (jwrk==1) THEN
1600  iret((jwrk-1)*2+2)=nf90_put_var(ifile_id,ivar_id,kyear)
1601  ELSEIF (jwrk==2) THEN
1602  iret((jwrk-1)*2+2)=nf90_put_var(ifile_id,ivar_id,kmonth)
1603  ELSEIF (jwrk==3) THEN
1604  iret((jwrk-1)*2+2)=nf90_put_var(ifile_id,ivar_id,kday)
1605  ELSE
1606  iret((jwrk-1)*2+2)=nf90_put_var(ifile_id,ivar_id,ptime)
1607  ENDIF
1608  !
1609  ENDDO
1610  !
1611  ENDIF
1612  !
1613  ! 3. Check for errors
1614  !--------------------
1615  DO jret=1,4
1616  IF (ifile_id==0.OR.iret(jret).NE.nf90_noerr) kresp=1
1617  ENDDO
1618  !
1619 ENDIF
1620 !
1621 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFT0_OL',1,zhook_handle)
1622 !
1623 END SUBROUTINE write_surft0_ol
1624 
1625 END MODULE mode_write_surf_ol
subroutine write_datax2_ol(KDIM1, KDIM2, KNDIMS)
subroutine write_surfc0_ol(HSELECT, HREC, HFIELD, KRESP, HCOMMENT)
subroutine handle_err(IRET, HNAME)
Definition: handle_err.F90:7
quick &counting sorts only inumt inumt name
subroutine write_surfl1_ol(HSELECT, HREC, OFIELD, KRESP, HCOMMENT, HDIR)
integer, dimension(:), pointer nmask
character(len=200), dimension(25) xnetcdf_filename_out
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
subroutine write_datal1_ol(KDIM)
subroutine write_surfn1_ol(HSELECT, HREC, KFIELD, KRESP, HCOMMENT, HDIR, HNAM_DIM)
subroutine def_var_netcdf(HSELECT, KFILE_ID, HNAME, HLONG_NAME, KDIM_ID, H
subroutine write_datax1_ol(KDIM, KNDIMS)
subroutine write_surfx0_time_ol(PFIELD, KRESP, HCOMMENT)
logical lhook
Definition: yomhook.F90:15
subroutine write_surfl0_ol(HSELECT, HREC, OFIELD, KRESP, HCOMMENT)
subroutine write_surfx1_ol(HSELECT, HREC, PFIELD, KRESP, HCOMMENT, HDIR, HNAM_DIM)
integer, dimension(25) xnetcdf_fileid_out
subroutine io_buff(HREC, HACTION, OKNOWN)
Definition: io_buff.F90:8
subroutine write_surfx3_ol(HSELECT, HREC, PFIELD, KRESP, HCOMMENT, HDIR, HNAM_DIM)
subroutine write_surfx2_ol(HSELECT, HREC, PFIELD, KRESP, HCOMMENT, HDIR, HNAM_DIM)
integer, dimension(:), allocatable nmask_ign
ERROR in index
Definition: ecsort_shared.h:90
subroutine write_datax3_ol(KDIM1, KDIM2, KDIM3, KNDIMS)
subroutine wlog_mpi(HLOG, PLOG, KLOG, KLOG2, OLOG)
subroutine write_surft0_ol(HSELECT, HREC, KYEAR, KMONTH, KDAY, PTIME, KRESP, HCOMMENT)
subroutine write_surfn0_ol(HSELECT, HREC, KFIELD, KRESP, HCOMMENT)
subroutine write_surfx0_ol(HSELECT, HREC, PFIELD, KRESP, HCOMMENT)