SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
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 write_surf0_ol
8  MODULE PROCEDURE write_surfx0_ol
9  MODULE PROCEDURE write_surfn0_ol
10  MODULE PROCEDURE write_surfc0_ol
11  MODULE PROCEDURE write_surfl0_ol
12 END INTERFACE
14  MODULE PROCEDURE write_surfx0_time_ol
15 END INTERFACE
17  MODULE PROCEDURE write_surfx1_ol
18  MODULE PROCEDURE write_surfn1_ol
19 END INTERFACE
21  MODULE PROCEDURE write_surfl1_ol
22  MODULE PROCEDURE write_surfx2_ol
23 END INTERFACE
24 INTERFACE write_surft_ol
25  MODULE PROCEDURE write_surft0_ol
26 END INTERFACE
27 !
28  CONTAINS
29 !
30 ! #############################################################
31  SUBROUTINE write_surfx0_ol(HREC,PFIELD,KRESP,HCOMMENT)
32 ! #############################################################
33 !
34 !!**** *WRITEX0* - routine to read a real scalar
35 !
36 USE modi_ol_find_file_write
37 !
38 USE yomhook ,ONLY : lhook, dr_hook
39 USE parkind1 ,ONLY : jprb
40 !
41 IMPLICIT NONE
42 !
43 include "netcdf.inc"
44 !
45 !* 0.1 Declarations of arguments
46 !
47  CHARACTER(LEN=12), INTENT(IN) :: hrec ! name of the article to be read
48 REAL, INTENT(IN) :: pfield ! the real scalar to be read
49 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
50  CHARACTER(LEN=100), INTENT(IN) :: hcomment
51 !
52 !* 0.2 Declarations of local variables
53 !
54 INTEGER :: ifile_id,ivar_id,jret
55 INTEGER,DIMENSION(2) :: iret
56 REAL(KIND=JPRB) :: zhook_handle
57 !
58 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFX0_OL',0,zhook_handle)
59 !
60 kresp=0
61 !
62 ! 0. find filename
63 ! -----------------
64  CALL ol_find_file_write(hrec,ifile_id)
65 !
66 IF (ifile_id /= 0) THEN
67  ! 1. Find id of the variable
68  !----------------------------
69  iret(1)=nf_inq_varid(ifile_id,hrec,ivar_id)
70  ! 2. Put variable
71  !----------------------------
72  iret(2)=nf_put_var_double(ifile_id,ivar_id,pfield)
73 ENDIF
74 !
75 ! 3. Check for errors
76 !--------------------
77 DO jret=1,2
78  IF (ifile_id==0 .OR. iret(jret).NE.nf_noerr) kresp=1
79 ENDDO
80 !
81 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFX0_OL',1,zhook_handle)
82 !
83 END SUBROUTINE write_surfx0_ol
84 !
85 ! #############################################################
86  SUBROUTINE write_surfn0_ol(HREC,KFIELD,KRESP,HCOMMENT)
87 ! #############################################################
88 !
89 !!**** *WRITEN0* - routine to read an integer
90 !
91 USE modi_ol_find_file_write
92 !
93 USE yomhook ,ONLY : lhook, dr_hook
94 USE parkind1 ,ONLY : jprb
95 !
96 IMPLICIT NONE
97 !
98 include "netcdf.inc"
99 !
100 !* 0.1 Declarations of arguments
101 !
102  CHARACTER(LEN=12), INTENT(IN) :: hrec ! name of the article to be read
103 INTEGER, INTENT(IN) :: kfield ! the integer scalar to be read
104 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
105  CHARACTER(LEN=100), INTENT(IN) :: hcomment
106 !
107 !* 0.2 Declarations of local variables
108 !
109 INTEGER :: ifile_id, ivar_id, jret
110 INTEGER,DIMENSION(2) :: iret
111 REAL(KIND=JPRB) :: zhook_handle
112 !
113 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFN0_OL',0,zhook_handle)
114 !
115 kresp=0
116 !
117 ! 0. find filename
118 ! -----------------
119  CALL ol_find_file_write(hrec,ifile_id)
120 !
121 IF (ifile_id /= 0) THEN
122  ! 1. Find id of the variable
123  !----------------------------
124  iret(1)=nf_inq_varid(ifile_id,hrec,ivar_id)
125  ! 2. Get variable
126  !----------------------------
127  iret(2)=nf_put_var_int(ifile_id,ivar_id,kfield)
128 ENDIF
129 !
130 ! 3. Check for errors
131 !--------------------
132 DO jret=1,2
133  IF (ifile_id==0 .OR. iret(jret).NE.nf_noerr) kresp=1
134 ENDDO
135 !
136 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFN0_OL',1,zhook_handle)
137 !
138 END SUBROUTINE write_surfn0_ol
139 !
140 ! #############################################################
141  SUBROUTINE write_surfc0_ol(HREC,HFIELD,KRESP,HCOMMENT)
142 ! #############################################################
143 !
144 !!**** *WRITEC0* - routine to read a STRING
145 !
146 USE modi_ol_find_file_write
147 !
148 USE yomhook ,ONLY : lhook, dr_hook
149 USE parkind1 ,ONLY : jprb
150 !
151 IMPLICIT NONE
152 !
153 include "netcdf.inc"
154 !
155 !* 0.1 Declarations of arguments
156 !
157  CHARACTER(LEN=12), INTENT(IN) :: hrec ! name of the article to be read
158  CHARACTER(LEN=40), INTENT(IN) :: hfield ! the integer scalar to be read
159 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
160  CHARACTER(LEN=100), INTENT(IN) :: hcomment
161 !
162 !* 0.2 Declarations of local variables
163 !
164  CHARACTER(LEN=100) :: yfield
165 INTEGER :: ifile_id, ivar_id, jret
166 INTEGER,DIMENSION(2) :: iret
167 REAL(KIND=JPRB) :: zhook_handle
168 !
169 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFC0_OL',0,zhook_handle)
170 !
171 kresp=0
172 !
173 ! 0. find filename
174 ! -----------------
175  CALL ol_find_file_write(hrec,ifile_id)
176 !
177 IF (ifile_id /= 0) THEN
178  ! 1. Find id of the variable
179  !----------------------------
180  iret(1)=nf_inq_varid(ifile_id,hrec,ivar_id)
181  ! 2. Get variable
182  !----------------------------
183  yfield=hfield(:len_trim(hfield))
184  iret(2)=nf_put_var_text(ifile_id,ivar_id,yfield)
185 ENDIF
186 !
187 ! 3. Check for errors
188 !--------------------
189 DO jret=1,2
190  IF (ifile_id==0 .OR. iret(jret).NE.nf_noerr) kresp=1
191 ENDDO
192 !
193 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFC0_OL',1,zhook_handle)
194 !
195 END SUBROUTINE write_surfc0_ol
196 !
197 ! #############################################################
198  SUBROUTINE write_surfl0_ol(HREC,OFIELD,KRESP,HCOMMENT)
199 ! #############################################################
200 !
201 !!**** *WRITEL0* - routine to read a logical
202 !
203 USE modi_ol_find_file_write
204 USE modi_handle_err
205 !
206 USE yomhook ,ONLY : lhook, dr_hook
207 USE parkind1 ,ONLY : jprb
208 !
209 IMPLICIT NONE
210 !
211 include "netcdf.inc"
212 !
213 !* 0.1 Declarations of arguments
214 !
215  CHARACTER(LEN=12), INTENT(IN) :: hrec ! name of the article to be read
216 LOGICAL, INTENT(IN) :: ofield ! array containing the data field
217 INTEGER, INTENT(OUT):: kresp ! KRESP : return-code if a problem appears
218  CHARACTER(LEN=100), INTENT(IN) :: hcomment
219 !
220 !* 0.2 Declarations of local variables
221 !
222  CHARACTER(LEN=1) :: yfield ! work array read in the file
223 INTEGER :: ifile_id, ivar_id, jret
224 INTEGER,DIMENSION(2) :: iret
225 REAL(KIND=JPRB) :: zhook_handle
226 !
227 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFL0_OL',0,zhook_handle)
228 !
229 kresp=0
230 !
231 ! 0. find filename
232 ! -----------------
233  CALL ol_find_file_write(hrec,ifile_id)
234 !
235 IF (ifile_id /= 0) THEN
236  ! 1. Find id of the variable
237  !----------------------------
238  iret(1)=nf_inq_varid(ifile_id,hrec,ivar_id)
239  IF (ofield) THEN
240  yfield ='T'
241  ELSE
242  yfield ='F'
243  ENDIF
244  ! 2. Put variable
245  !----------------------------
246  iret(2)=nf_put_var_text(ifile_id,ivar_id,yfield)
247  CALL handle_err(iret(1),hrec)
248 ENDIF
249 !
250 ! 3. Check for errors
251 !--------------------
252 DO jret=1,2
253  IF (ifile_id==0 .OR. iret(jret).NE.nf_noerr) kresp=1
254 ENDDO
255 !
256 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFL0_OL',1,zhook_handle)
257 !
258 END SUBROUTINE write_surfl0_ol
259 !
260 ! #############################################################
261  SUBROUTINE write_surfx0_time_ol(PFIELD,KRESP,HCOMMENT)
262 ! #############################################################
263 !
264 !!**** *WRITEX1* - routine to fill a real 1D array for the externalised surface
265 !
266 USE modd_io_surf_ol, ONLY: xstartw, xtype
267 USE modd_ol_fileid, ONLY: xid_surf, xid_nature, xid_sea, xid_water, xid_town
268 !
269 USE modi_handle_err
270 !
271 USE yomhook ,ONLY : lhook, dr_hook
272 USE parkind1 ,ONLY : jprb
273 !
274 IMPLICIT NONE
275 include "netcdf.inc"
276 !
277 !* 0.1 Declarations of arguments
278 !
279 REAL, INTENT(IN) :: pfield ! array containing the data field
280 INTEGER, INTENT(OUT):: kresp ! KRESP : return-code if a problem appears
281  CHARACTER(LEN=100), INTENT(IN) :: hcomment
282 !
283 !* 0.2 Declarations of local variables
284 !
285 REAL(KIND=JPRB) :: zhook_handle
286 !
287 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFX0_TIME_OL',0,zhook_handle)
288 !
289 kresp=0
290 !
291 IF (xtype==1) THEN
292  CALL write_time_dim(xid_surf)
293 ELSEIF (xtype==2) THEN
294  CALL write_time_dim(xid_nature)
295 ELSEIF (xtype==3) THEN
296  CALL write_time_dim(xid_sea)
297 ELSEIF (xtype==4) THEN
298  CALL write_time_dim(xid_water)
299 ELSEIF (xtype==5) THEN
300  CALL write_time_dim(xid_town)
301 ENDIF
302 !
303 kresp = 0
304 !
305 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFX0_TIME_OL',1,zhook_handle)
306 !
307  CONTAINS
308 !
309 SUBROUTINE write_time_dim(PTAB)
310 !
311 INTEGER, DIMENSION(:), INTENT(IN) :: ptab
312 !
313 INTEGER :: ivar_id
314 INTEGER :: jret, jj !loop index
315 REAL(KIND=JPRB) :: zhook_handle
316 !
317 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFX0_TIME_OL:WRITE_TIME_DIM',0,zhook_handle)
318 !
319 IF (ptab(1).NE.0 .AND. xtype.NE.1) THEN
320  !
321  jret = nf_inq_varid(ptab(1),'time',ivar_id)
322  IF (jret.EQ.nf_noerr) THEN
323  jret = nf_put_vars_double(ptab(1),ivar_id,xstartw,1,1,pfield)
324  CALL handle_err(jret,'time')
325  ENDIF
326  !
327 ENDIF
328 !
329 DO jj=2,SIZE(ptab)
330  !
331  IF (ptab(jj).NE.ptab(jj-1) .AND. ptab(jj).NE.0) THEN
332  jret = nf_inq_varid(ptab(jj),'time',ivar_id)
333  IF (jret.EQ.nf_noerr) THEN
334  jret = nf_put_vars_double(ptab(jj),ivar_id,xstartw,1,1,pfield)
335  CALL handle_err(jret,'time')
336  ENDIF
337  ENDIF
338  !
339 ENDDO
340 !
341 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFX0_TIME_OL:WRITE_TIME_DIM',1,zhook_handle)
342 !
343 END SUBROUTINE write_time_dim
344 !
345 END SUBROUTINE write_surfx0_time_ol
346 !
347 ! #############################################################
348  SUBROUTINE write_surfx1_ol (&
349  hrec,pfield,kresp,hcomment,hdir)
350 ! #############################################################
351 !
352 !!**** *WRITEX1* - routine to fill a real 1D array for the externalised surface
353 !
354 !
355 !
356 !
357 USE modd_surfex_mpi, ONLY : nrank, npio, ncomm, nproc, xtime_npio_write, &
358  xtime_comm_write, wlog_mpi
359 USE modd_surfex_omp, ONLY : cwork0, nwork0, nworkvar, nworkb, nworkdims, &
360  nworkids, nworklen, lwork0
361 !
362 USE modd_io_surf_ol, ONLY: lmask, nmask, nmask_ign, xstart, &
363  xstride, lpartw, xstartw, xcountw
364 !
365 USE modi_io_buff
366 USE modi_ol_find_file_write
367 !
368 USE yomhook ,ONLY : lhook, dr_hook
369 USE parkind1 ,ONLY : jprb
370 !
371 IMPLICIT NONE
372 !
373 include "netcdf.inc"
374 !
375 #ifdef SFX_MPI
376 include "mpif.h"
377 #endif
378 !
379 !* 0.1 Declarations of arguments
380 !
381 !
382 !
383  CHARACTER(LEN=12), INTENT(IN) :: hrec ! name of the article to be read
384 REAL, DIMENSION(:), INTENT(IN) :: pfield ! array containing the data field
385 INTEGER, INTENT(OUT):: kresp ! KRESP : return-code if a problem appears
386  CHARACTER(LEN=100), INTENT(IN) :: hcomment
387  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
388  ! 'H' : field with
389  ! horizontal spatial dim.
390  ! '-' : no horizontal dim.
391 !* 0.2 Declarations of local variables
392 !
393  CHARACTER(LEN=100) :: yname
394 INTEGER :: ifile_id, ivar_id, jdim, indims
395 INTEGER :: jret
396 INTEGER :: infompi
397 INTEGER, DIMENSION(4) :: idimids
398 INTEGER, DIMENSION(4) :: idimlen
399 INTEGER,DIMENSION(5) :: iret
400 DOUBLE PRECISION :: xtime0
401 REAL, DIMENSION(:), ALLOCATABLE :: ztab1d
402 REAL, DIMENSION(:), ALLOCATABLE :: zwork_ign
403 REAL(KIND=JPRB) :: zhook_handle
404 !
405 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFX1_OL',0,zhook_handle)
406 !
407 !$OMP BARRIER
408 !
409 iret(:) = 0
410 !
411 !$OMP SINGLE
412 !
413 nworkdims = 0
414 nworklen(:) = 0
415  cwork0 = ""
416 nworkb=0
417 !
418  CALL io_buff(&
419  hrec,'W',lwork0)
420 !
421 !$OMP END SINGLE
422 !
423 IF (lwork0 .AND. lhook) CALL dr_hook("WRITE_SURF_OL:WRITE_SURFX1_OL",1,zhook_handle)
424 IF (lwork0) RETURN
425 !
426 IF (nrank==npio) THEN
427  !
428 #ifdef SFX_MPI
429  xtime0 = mpi_wtime()
430 #endif
431  !
432 !$OMP SINGLE
433  !
434  ! 0. find filename
435  ! -----------------
436  CALL ol_find_file_write(hrec,nwork0)
437  !
438  IF (nwork0 /= 0) THEN
439  !
440  ! 1. Find id of the variable
441  !----------------------------
442  iret(1)=nf_inq_varid(nwork0,hrec,nworkvar)
443  iret(2)=nf_inq_varndims(nwork0,nworkvar,nworkdims)
444  iret(3)=nf_inq_vardimid(nwork0,nworkvar,nworkids(1:nworkdims))
445  DO jdim=1,2
446  jret=nf_inq_dimlen(nwork0,nworkids(jdim),nworklen(jdim))
447  ENDDO
448  !
449  iret(4)=nf_inq_dimname(nwork0,nworkids(1),cwork0)
450  !
451  ! 3. Check for errors
452  !--------------------
453  DO jret=1,4
454  IF (nwork0==0 .OR. iret(jret).NE.nf_noerr) nworkb=1
455  ENDDO
456  !
457  ENDIF
458  !
459 !$OMP END SINGLE
460  !
461  ivar_id = nworkvar
462  indims = nworkdims
463  idimids = nworkids
464  idimlen = nworklen
465  yname = cwork0
466  !
467 #ifdef SFX_MPI
468  xtime_npio_write = xtime_npio_write + (mpi_wtime() - xtime0)
469 #endif
470  !
471 ELSE
472  ivar_id = 0
473  indims = 0
474  idimids(:) = 0
475  idimlen(:) = 0
476  yname = ""
477 ENDIF
478 !
479 kresp = nworkb
480 !
481 IF (nproc>1) THEN
482 #ifdef SFX_MPI
483  xtime0 = mpi_wtime()
484 !$OMP SINGLE
485  CALL mpi_bcast(nwork0,kind(nwork0)/4,mpi_integer,npio,ncomm,infompi)
486 !$OMP END SINGLE
487  xtime_comm_write = xtime_comm_write + (mpi_wtime() - xtime0)
488 #endif
489 ENDIF
490 !
491 ifile_id = nwork0
492 !
493 IF (ifile_id/=0) THEN
494  !
495  IF (yname .EQ. 'Number_of_points') THEN
496  CALL write_datax1_ol(idimlen(1),indims)
497  ELSE
498  CALL write_datax1_ol(idimlen(1)*idimlen(2),indims)
499  ENDIF
500  !
501 ENDIF
502 !
503 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFX1_OL',1,zhook_handle)
504 !
505  CONTAINS
506 !
507 SUBROUTINE write_datax1_ol(KDIM,KNDIMS)
508 !
511 USE modi_handle_err
512 !
513 IMPLICIT NONE
514 !
515 INTEGER, INTENT(IN) :: kdim
516 INTEGER, INTENT(IN) :: kndims
517 !
518 REAL, DIMENSION(KDIM) :: ztab1d
519 REAL, DIMENSION(KDIM) :: zwork_ign
520 !
521 INTEGER, DIMENSION(KNDIMS) :: istart
522 INTEGER, DIMENSION(KNDIMS) :: icount
523 INTEGER, DIMENSION(KNDIMS) :: istride
524 REAL(KIND=JPRB) :: zhook_handle
525 !
526 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFX1_OL:WRITE_DATAX1_OL',0,zhook_handle)
527 !
528 IF(.NOT.ALLOCATED(nmask_ign))THEN
529  IF (lmask) THEN
530  CALL gather_and_write_mpi(pfield,ztab1d,nmask)
531  ELSE
532  CALL gather_and_write_mpi(pfield,ztab1d)
533  ENDIF
534 ELSE
535  !ign grid
536  IF (lmask) THEN
537  CALL gather_and_write_mpi(pfield,zwork_ign(1:SIZE(nmask_ign)),nmask)
538  ELSE
539  CALL gather_and_write_mpi(pfield,zwork_ign(1:SIZE(nmask_ign)))
540  ENDIF
541  CALL unpack_same_rank(nmask_ign,zwork_ign(1:SIZE(nmask_ign)),ztab1d)
542 ENDIF
543 !
544 IF (nrank==npio) THEN
545  !
546 #ifdef SFX_MPI
547  xtime0 = mpi_wtime()
548 #endif
549  !
550 !$OMP SINGLE
551  !
552  IF (lpartw) THEN
553  ! write partially a time-matrix.
554  ! Have to find which of the dimension is the time dimension
555  DO jdim=1,kndims
556  jret=nf_inq_dimname(ifile_id,idimids(jdim),yname)
557  IF ((index(yname,'time') > 0).OR.(index(yname,'TIME') >0) &
558  .OR.(index(yname,'Time')>0.)) THEN
559  istart(jdim)=xstartw
560  icount(jdim)=xcountw
561  istride(jdim)=xstride
562  ELSE
563  istart(jdim)=1
564  icount(jdim)=idimlen(jdim)
565  istride(jdim)=1
566  ENDIF
567  ENDDO
568  iret(5)=nf_put_vars_double(ifile_id,ivar_id,istart,icount,istride,ztab1d)
569  ELSE
570  iret(5)=nf_put_var_double(ifile_id,ivar_id,ztab1d)
571  ENDIF
572  !
573  CALL handle_err(iret(5),hrec)
574  !
575 !$OMP END SINGLE NOWAIT
576  !
577 #ifdef SFX_MPI
578  xtime_npio_write = xtime_npio_write + (mpi_wtime() - xtime0)
579 #endif
580  !
581 ENDIF
582 !
583 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFX1_OL:WRITE_DATAX1_OL',1,zhook_handle)
584 !
585 END SUBROUTINE write_datax1_ol
586 !
587 END SUBROUTINE write_surfx1_ol
588 !
589 ! #############################################################
590  SUBROUTINE write_surfx2_ol(HREC,PFIELD,KRESP,HCOMMENT,HDIR)
591 ! #############################################################
592 !
593 !!**** *WRITEX2* - routine to fill a real 2D array for the externalised surface
594 !
595 USE modd_surfex_mpi, ONLY : nrank, npio, ncomm, nproc, xtime_npio_write, &
596  xtime_comm_write
597 !
598 USE modd_surfex_omp, ONLY : cwork0, nwork0, nworkvar, nworkb, nworkdims, &
599  nworkids, nworklen, nblock
600 !
601 USE modd_io_surf_ol, ONLY: lmask, nmask, nmask_ign, xstart, xstride, &
602  lpartw, xstartw, xcountw
603 !
604 USE modi_ol_find_file_write
605 !
606 USE yomhook ,ONLY : lhook, dr_hook
607 USE parkind1 ,ONLY : jprb
608 !
609 IMPLICIT NONE
610 !
611 include "netcdf.inc"
612 !
613 #ifdef SFX_MPI
614 include "mpif.h"
615 #endif
616 !
617 !* 0.1 Declarations of arguments
618 !
619  CHARACTER(LEN=12), INTENT(IN) :: hrec ! name of the article to be read
620 REAL, DIMENSION(:,:), INTENT(IN) :: pfield ! array containing the data field
621 INTEGER, INTENT(OUT):: kresp ! KRESP : return-code if a problem appears
622  CHARACTER(LEN=100), INTENT(IN) :: hcomment
623  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
624  ! 'H' : field with
625  ! horizontal spatial dim.
626  ! '-' : no horizontal dim.
627 !* 0.2 Declarations of local variables
628 !
629  CHARACTER(LEN=100) :: yname
630 INTEGER :: ifile_id, ivar_id, jdim, indims
631 INTEGER :: jret
632 INTEGER :: infompi
633 INTEGER, DIMENSION(4) :: idimids
634 INTEGER, DIMENSION(4) :: idimlen
635 INTEGER, DIMENSION(5) :: iret
636 DOUBLE PRECISION :: xtime0
637 REAL(KIND=JPRB) :: zhook_handle
638 !
639 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFX2_OL',0,zhook_handle)
640 !
641 !$OMP BARRIER
642 !
643 !$OMP SINGLE
644 nworkdims = 0
645 nworklen(:) = 0
646  cwork0 = ""
647 !
648 nworkb=0
649 !$OMP END SINGLE
650 !
651 IF (nrank==npio) THEN
652  !
653 #ifdef SFX_MPI
654  xtime0 = mpi_wtime()
655 #endif
656  !
657 !$OMP SINGLE
658  !
659  ! 0. find filename
660  ! -----------------
661  CALL ol_find_file_write(hrec,nwork0)
662  !
663  IF ( nwork0 /= 0 ) THEN
664  !
665  ! 1. Find id of the variable
666  !----------------------------
667  !
668  iret(1)=nf_inq_varid(nwork0,hrec,nworkvar)
669  iret(2)=nf_inq_varndims(nwork0,nworkvar,nworkdims)
670 
671  iret(3)=nf_inq_vardimid(nwork0,nworkvar,nworkids(1:nworkdims))
672  DO jdim=1,nworkdims
673  jret=nf_inq_dimlen(nwork0,nworkids(jdim),nworklen(jdim))
674  IF (jret.NE.nf_noerr) nworkb=1
675  ENDDO
676  !
677  iret(4)=nf_inq_dimname(nwork0,nworkids(1),cwork0)
678  !
679  ENDIF
680  !
681  DO jret=1,4
682  IF (nwork0==0 .OR. iret(jret).NE.nf_noerr) nworkb=1
683  ENDDO
684  !
685 !$OMP END SINGLE
686  !
687  ivar_id = nworkvar
688  indims = nworkdims
689  idimids = nworkids
690  idimlen = nworklen
691  yname = cwork0
692  !
693 #ifdef SFX_MPI
694  xtime_npio_write = xtime_npio_write + (mpi_wtime() - xtime0)
695 #endif
696  !
697 ELSE
698  ivar_id = 0
699  indims = 0
700  idimids(:) = 0
701  idimlen(:) = SIZE(pfield,2)
702  yname = ""
703 ENDIF
704 !
705 !
706 kresp = nworkb
707 !
708 IF (nproc>1) THEN
709 #ifdef SFX_MPI
710  xtime0 = mpi_wtime()
711 !$OMP SINGLE
712  CALL mpi_bcast(nwork0,kind(nwork0)/4,mpi_integer,npio,ncomm,infompi)
713 !$OMP END SINGLE
714  xtime_comm_write = xtime_comm_write + (mpi_wtime() - xtime0)
715 #endif
716 ENDIF
717 !
718 ifile_id = nwork0
719 !
720 IF (ifile_id/=0) THEN
721  !
722  IF (yname .EQ. 'Number_of_points') THEN
723  CALL write_datax2_ol(idimlen(1),idimlen(2),indims)
724  ELSE
725  CALL write_datax2_ol(idimlen(1)*idimlen(2),idimlen(3),indims)
726  ENDIF
727  !
728 ENDIF
729 !
730 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFX2_OL',1,zhook_handle)
731 !
732  CONTAINS
733 !
734 SUBROUTINE write_datax2_ol(KDIM1,KDIM2,KNDIMS)
735 !
736 USE modd_surf_par, ONLY : xundef
737 !
740 USE modi_handle_err
741 !
742 IMPLICIT NONE
743 !
744 INTEGER, INTENT(IN) :: kdim1
745 INTEGER, INTENT(IN) :: kdim2
746 INTEGER, INTENT(IN) :: kndims
747 !
748 REAL, DIMENSION(KDIM1,KDIM2) :: ztab2d ! work array read in the file
749 REAL, DIMENSION(KDIM1,SIZE(PFIELD,2)) :: zwork_ign ! work array read in the file
750 INTEGER, DIMENSION(KNDIMS) :: istart
751 INTEGER, DIMENSION(KNDIMS) :: istride
752 INTEGER, DIMENSION(KNDIMS) :: icount
753 REAL(KIND=JPRB) :: zhook_handle
754 !
755 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFX2_OL:WRITE_DATAX2_OL',0,zhook_handle)
756 !
757 ztab2d(:,:) = xundef
758 !
759 IF(.NOT.ALLOCATED(nmask_ign))THEN
760  IF (lmask) THEN
761  CALL gather_and_write_mpi(pfield,ztab2d(:,1:SIZE(pfield,2)),nmask)
762  ELSE
763  CALL gather_and_write_mpi(pfield,ztab2d(:,1:SIZE(pfield,2)))
764  ENDIF
765 ELSE
766  !ign grid
767  IF (lmask) THEN
768  CALL gather_and_write_mpi(pfield,zwork_ign(1:SIZE(nmask_ign),:),nmask)
769  ELSE
770  CALL gather_and_write_mpi(pfield,zwork_ign(1:SIZE(nmask_ign),:))
771  ENDIF
772  CALL unpack_same_rank(nmask_ign,zwork_ign(1:SIZE(nmask_ign),:),ztab2d(:,1:SIZE(pfield,2)))
773 ENDIF
774 !
775 IF (nrank==npio) THEN
776  !
777 #ifdef SFX_MPI
778  xtime0 = mpi_wtime()
779 #endif
780  !
781 !$OMP SINGLE
782  !
783  ! 2. Put variable
784  !----------------------------
785  IF (lpartw) THEN
786  ! write partially a time-matrix.
787  ! Have to find which of the dimension is the time dimension
788  DO jdim=1,kndims
789  jret=nf_inq_dimname(ifile_id,idimids(jdim),yname)
790  IF ((index(yname,'time') > 0).OR.(index(yname,'TIME') >0) &
791  .OR.(index(yname,'Time')>0.)) THEN
792  istart(jdim)=xstartw
793  icount(jdim)=xcountw
794  istride(jdim)=xstride
795  ELSE
796  istart(jdim)=1
797  icount(jdim)=idimlen(jdim)
798  istride(jdim)=1
799  ENDIF
800  ENDDO
801  iret(5)=nf_put_vars_double(ifile_id,ivar_id,istart,icount,istride,ztab2d)
802  ELSE
803  iret(5)=nf_put_var_double(ifile_id,ivar_id,ztab2d)
804  ENDIF
805  !
806  CALL handle_err(iret(5),hrec)
807  !
808 !$OMP END SINGLE NOWAIT
809  !
810 #ifdef SFX_MPI
811  xtime_npio_write = xtime_npio_write + (mpi_wtime() - xtime0)
812 #endif
813  !
814 ENDIF
815 !
816 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFX2_OL:WRITE_DATAX2_OL',1,zhook_handle)
817 !
818 END SUBROUTINE write_datax2_ol
819 !
820 END SUBROUTINE write_surfx2_ol
821 
822 ! #############################################################
823  SUBROUTINE write_surfn1_ol (&
824  hrec,kfield,kresp,hcomment,hdir)
825 ! #############################################################
826 !
827 !!**** *WRITEN0* - routine to read an integer
828 !
829 !
830 USE yomhook ,ONLY : lhook, dr_hook
831 USE parkind1 ,ONLY : jprb
832 !
833 IMPLICIT NONE
834 !
835 !* 0.1 Declarations of arguments
836 !
837 !
838  CHARACTER(LEN=12), INTENT(IN) :: hrec ! name of the article to be read
839 INTEGER, DIMENSION(:), INTENT(IN) :: kfield ! the integer scalar to be read
840 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
841  CHARACTER(LEN=100), INTENT(IN) :: hcomment
842  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
843  ! 'H' : field with
844  ! horizontal spatial dim.
845  ! '-' : no horizontal dim.
846 !* 0.2 Declarations of local variables
847 !
848 REAL, DIMENSION(SIZE(KFIELD)) :: zfield
849 REAL(KIND=JPRB) :: zhook_handle
850 !
851 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFN1_OL',0,zhook_handle)
852 !
853 zfield=float(kfield)
854  CALL write_surfx1_ol(&
855  hrec,zfield,kresp,hcomment,hdir)
856 !
857 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFN1_OL',1,zhook_handle)
858 !
859 END SUBROUTINE write_surfn1_ol
860 !
861 ! #############################################################
862  SUBROUTINE write_surfl1_ol(HREC,OFIELD,KRESP,HCOMMENT,HDIR)
863 ! #############################################################
864 !
865 !!**** *WRITEL1* - routine to read a logical array
866 !
867 USE modd_surfex_mpi, ONLY : nrank, npio, xtime_npio_write
868 !
869 USE modi_ol_find_file_write
870 USE modi_handle_err
871 !
872 USE yomhook ,ONLY : lhook, dr_hook
873 USE parkind1 ,ONLY : jprb
874 !
875 IMPLICIT NONE
876 !
877 include "netcdf.inc"
878 !
879 #ifdef SFX_MPI
880 include "mpif.h"
881 #endif
882 !
883 !* 0.1 Declarations of arguments
884 !
885  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
886 LOGICAL, DIMENSION(:), INTENT(IN) :: ofield ! array containing the data field
887 INTEGER, INTENT(OUT):: kresp ! KRESP : return-code if a problem appears
888  CHARACTER(LEN=100), INTENT(IN) :: hcomment
889  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
890  ! 'H' : field with
891  ! horizontal spatial dim.
892  ! '-' : no horizontal dim.
893 !* 0.2 Declarations of local variables
894 !
895 INTEGER :: ifile_id, ivar_id, jdim, indims
896 INTEGER :: jret
897 INTEGER, DIMENSION(4) :: idimids
898 INTEGER, DIMENSION(1) :: idimlen
899 INTEGER, DIMENSION(4) :: iret
900 DOUBLE PRECISION :: xtime0
901 REAL(KIND=JPRB) :: zhook_handle
902 !
903 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFL1_OL',0,zhook_handle)
904 !
905 !$OMP BARRIER
906 !
907 kresp=0
908 !
909 IF ( nrank==npio ) THEN
910  !
911 #ifdef SFX_MPI
912  xtime0 = mpi_wtime()
913 #endif
914 
915  !
916 !$OMP SINGLE
917  !
918  ! 0. find filename
919  ! -----------------
920  CALL ol_find_file_write(hrec,ifile_id)
921  !
922  IF (ifile_id /= 0) THEN
923  !
924  ! 1. Find id of the variable
925  !----------------------------
926  iret(1)=nf_inq_varid(ifile_id,hrec,ivar_id)
927  iret(2)=nf_inq_varndims(ifile_id,ivar_id,indims)
928  iret(3)=nf_inq_vardimid(ifile_id,ivar_id,idimids(1:indims))
929  DO jdim=1,1
930  jret=nf_inq_dimlen(ifile_id,idimids(jdim),idimlen(jdim))
931  ENDDO
932  !
933  CALL write_datal1_ol(idimlen(1))
934  !
935  ENDIF
936  !
937  ! 3. Check for errors
938  !--------------------
939  DO jret=1,4
940  IF (ifile_id==0 .OR. iret(jret).NE.nf_noerr) kresp=1
941  ENDDO
942  !
943 !$OMP END SINGLE
944  !
945 #ifdef SFX_MPI
946  xtime_npio_write = xtime_npio_write + (mpi_wtime() - xtime0)
947 #endif
948  !
949 ENDIF
950 !
951 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFL1_OL',1,zhook_handle)
952 !
953  CONTAINS
954 !
955 SUBROUTINE write_datal1_ol(KDIM)
956 !
957 INTEGER, INTENT(IN) :: kdim
958 !
959  CHARACTER(LEN=1), DIMENSION(KDIM) :: ytab1d ! work array read in the file
960 REAL(KIND=JPRB) :: zhook_handle
961 !
962 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFL1_OL:WRITE_DATAL1_OL',0,zhook_handle)
963 !
964 DO jret=1,kdim
965  IF (ofield(jret)) THEN
966  ytab1d(jret) ='T'
967  ELSE
968  ytab1d(jret) ='F'
969  ENDIF
970 ENDDO
971 !
972 ! 2. Put variable
973 !-----------------
974 iret(4)=nf_put_var_text(ifile_id,ivar_id,ytab1d)
975 !
976  CALL handle_err(iret(4),hrec)
977 !
978 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFL1_OL:WRITE_DATAL1_OL',1,zhook_handle)
979 END SUBROUTINE write_datal1_ol
980 !
981 END SUBROUTINE write_surfl1_ol
982 !
983 !
984 ! #############################################################
985  SUBROUTINE write_surft0_ol(HREC,KYEAR,KMONTH,KDAY,PTIME,KRESP,HCOMMENT)
986 ! #############################################################
987 !
988 !!**** *WRITET0* - routine to read a NETCDF date_time scalar
989 !
991 !
992 USE modi_ol_find_file_write
993 !
994 USE yomhook ,ONLY : lhook, dr_hook
995 USE parkind1 ,ONLY : jprb
996 !
997 IMPLICIT NONE
998 !
999 include "netcdf.inc"
1000 !
1001 !* 0.1 Declarations of arguments
1002 !
1003  CHARACTER(LEN=12), INTENT(IN) :: hrec ! name of the article to be read
1004 INTEGER, INTENT(IN) :: kyear ! year
1005 INTEGER, INTENT(IN) :: kmonth ! month
1006 INTEGER, INTENT(IN) :: kday ! day
1007 REAL, INTENT(IN) :: ptime ! time
1008 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
1009  CHARACTER(LEN=100), INTENT(IN) :: hcomment
1010 !
1011 !* 0.2 Declarations of local variables
1012 !
1013  CHARACTER(LEN=12) :: yrecfm ! Name of the article to be written
1014 INTEGER :: ifile_id, ivar_id, jret, jwrk
1015 INTEGER :: jlen
1016 INTEGER,DIMENSION(3) :: itdate ! work array read in the file
1017 INTEGER,DIMENSION(4) :: iret
1018 REAL(KIND=JPRB) :: zhook_handle
1019 !
1020 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFT0_OL',0,zhook_handle)
1021 !
1022 kresp=0
1023 !
1024 DO jwrk=1,2
1025  !
1026  IF (jwrk == 1) THEN
1027  yrecfm=trim(hrec)//'-TDATE'
1028  jlen=3
1029  ELSE
1030  yrecfm=trim(hrec)//'-TIME'
1031  jlen=1
1032  ENDIF
1033  ! 0. find filename
1034  ! -----------------
1035  CALL ol_find_file_write(yrecfm,ifile_id)
1036  !
1037  IF (ifile_id /= 0) THEN
1038  !
1039  ! 1. Find id of the variable
1040  !----------------------------
1041  iret(1+jwrk*2)=nf_inq_varid(ifile_id,yrecfm,ivar_id)
1042  IF (jwrk == 1) THEN
1043  itdate(1)=kyear
1044  itdate(2)=kmonth
1045  itdate(3)=kday
1046  iret(jwrk)=nf_put_var_int(ifile_id,ivar_id,itdate)
1047  ELSE
1048  jlen=1
1049  iret(jwrk)=nf_put_var_double(ifile_id,ivar_id,ptime)
1050  ENDIF
1051  ENDIF
1052 ENDDO
1053 !
1054 ! 3. Check for errors
1055 !--------------------
1056 DO jret=1,4
1057  IF (ifile_id==0.OR.iret(jret).NE.nf_noerr) kresp=1
1058 ENDDO
1059 !
1060 IF (lhook) CALL dr_hook('MODE_WRITE_SURF_OL:WRITE_SURFT0_OL',1,zhook_handle)
1061 !
1062 END SUBROUTINE write_surft0_ol
1063 
1064 END MODULE mode_write_surf_ol
subroutine write_datax2_ol(KDIM1, KDIM2, KNDIMS)
subroutine write_surft0_ol(HREC, KYEAR, KMONTH, KDAY, PTIME, KRESP, HCOMMENT)
subroutine handle_err(IRET, HNAME)
Definition: handle_err.F90:6
subroutine write_surfl0_ol(HREC, OFIELD, KRESP, HCOMMENT)
subroutine ol_find_file_write(HNAME, IFILE_ID)
subroutine write_surfc0_ol(HREC, HFIELD, KRESP, HCOMMENT)
subroutine write_datal1_ol(KDIM)
subroutine write_datax1_ol(KDIM, KNDIMS)
subroutine write_surfx0_ol(HREC, PFIELD, KRESP, HCOMMENT)
subroutine write_surfx1_ol(HREC, PFIELD, KRESP, HCOMMENT, HDIR)
subroutine wlog_mpi(HLOG, PLOG, KLOG, KLOG2, OLOG)
subroutine write_time_dim(PTAB)
subroutine io_buff(HREC, HACTION, OKNOWN)
Definition: io_buff.F90:6
subroutine write_surfx2_ol(HREC, PFIELD, KRESP, HCOMMENT, HDIR)
subroutine write_surfx0_time_ol(PFIELD, KRESP, HCOMMENT)
subroutine write_surfl1_ol(HREC, OFIELD, KRESP, HCOMMENT, HDIR)
subroutine write_surfn1_ol(HREC, KFIELD, KRESP, HCOMMENT, HDIR)
subroutine write_surfn0_ol(HREC, KFIELD, KRESP, HCOMMENT)