SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
mode_read_surf_asc.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 !! PURPOSE
8 !! -------
9 !
10 ! The purpose of READ_SURF_ASC is
11 !
12 !!** METHOD
13 !! ------
14 !!
15 !! EXTERNAL
16 !! --------
17 !!
18 !!
19 !!
20 !! IMPLICIT ARGUMENTS
21 !! ------------------
22 !!
23 !!
24 !! REFERENCE
25 !! ---------
26 !!
27 !!
28 !! AUTHOR
29 !! ------
30 !!
31 !! S.Malardel *METEO-FRANCE*
32 !!
33 !! MODIFICATIONS
34 !! -------------
35 !!
36 !! original 01/08/03
37 !! J.Escobar 10/06/2013: replace DOUBLE PRECISION by REAL to handle problem for promotion of real on IBM SP
38 !----------------------------------------------------------------------------
39 !
40 INTERFACE read_surf0_asc
41  MODULE PROCEDURE read_surfx0_asc
42  MODULE PROCEDURE read_surfn0_asc
43  MODULE PROCEDURE read_surfl0_asc
44  MODULE PROCEDURE read_surfc0_asc
45 END INTERFACE
46 INTERFACE read_surfn_asc
47  MODULE PROCEDURE read_surfx1_asc
48  MODULE PROCEDURE read_surfn1_asc
49  MODULE PROCEDURE read_surfl1_asc
50  MODULE PROCEDURE read_surfx2_asc
51 END INTERFACE
52 INTERFACE read_surft_asc
53  MODULE PROCEDURE read_surft0_asc
54  MODULE PROCEDURE read_surft1_asc
55  MODULE PROCEDURE read_surft2_asc
56 END INTERFACE
57 !
58  CONTAINS
59 !
60 ! #############################################################
61  SUBROUTINE read_surfx0_asc (&
62  hrec,pfield,kresp,hcomment)
63 ! #############################################################
64 !
65 !
66 !
67 !
68 USE modd_surfex_omp, ONLY : lwork0
69 !
70 USE modd_io_surf_asc, ONLY : nunit, nluout, cmask
71 !
72 USE mode_pos_surf
73 !
74 USE modi_io_buff
75 USE modi_error_read_surf_asc
76 !
77 USE yomhook ,ONLY : lhook, dr_hook
78 USE parkind1 ,ONLY : jprb
79 !
80 IMPLICIT NONE
81 !
82 !* 0.1 Declarations of arguments
83 !
84 !
85 !
86  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
87 REAL, INTENT(OUT) :: pfield ! the real scalar to be read
88 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
89  CHARACTER(LEN=100),INTENT(OUT) :: hcomment ! comment
90 !
91 !* 0.2 Declarations of local variables
92 !
93  CHARACTER(LEN=50):: ycomment
94  CHARACTER(LEN=6) :: ymask
95 LOGICAL :: gfound
96 REAL(KIND=JPRB) :: zhook_handle
97 !
98 IF (lhook) CALL dr_hook('MODE_READ_SURF_ASC:READ_SURFX0_ASC',0,zhook_handle)
99 !
100 kresp=0
101 !
102 ymask=cmask
103  CALL io_buff(&
104  hrec,'R',lwork0)
105 IF (lwork0) ymask='FULL '
106 !
107  CALL posnam(nunit,ymask//' '//hrec,gfound,nluout)
108 IF (.NOT. gfound) CALL posnam(nunit,'FULL '//' '//hrec,gfound,nluout) ! used for auxilliary files
109 !
110 READ(nunit,fmt=*,end=100)
111 READ(nunit,fmt='(A50)') ycomment
112 READ(nunit,fmt=*,err=100) pfield
113 !
114 hcomment = ycomment
115 IF (lhook) CALL dr_hook('MODE_READ_SURF_ASC:READ_SURFX0_ASC',1,zhook_handle)
116 RETURN
117 !
118 100 CONTINUE
119  CALL error_read_surf_asc(hrec,kresp)
120 IF (lhook) CALL dr_hook('MODE_READ_SURF_ASC:READ_SURFX0_ASC',1,zhook_handle)
121 !
122 END SUBROUTINE read_surfx0_asc
123 !
124 ! #############################################################
125  SUBROUTINE read_surfx1_asc (&
126  hrec,pfield,kresp,hcomment,hdir)
127 ! #############################################################
128 !
129 !!**** *READX1* - routine to fill a real 1D array for the externalised surface
130 !
131 !
132 !
133 !
134 USE modd_surfex_mpi, ONLY : nrank, nproc, ncomm, npio, xtime_npio_read, xtime_comm_read
135 !
136 USE modd_surfex_omp, ONLY : lwork0, xworkd, nworkb, cwork0, nblock
137 !
138 USE modd_io_surf_asc, ONLY : nunit, nluout, nmask, nfull, cmask
139 !
140 USE mode_pos_surf
141 !
142 USE modi_io_buff
143 USE modi_error_read_surf_asc
145 !
146 USE yomhook ,ONLY : lhook, dr_hook
147 USE parkind1 ,ONLY : jprb
148 !
149 IMPLICIT NONE
150 !
151 #ifdef SFX_MPI
152 include "mpif.h"
153 #endif
154 !
155 !* 0.1 Declarations of arguments
156 !
157 !
158 !
159  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
160 REAL, DIMENSION(:), INTENT(OUT) :: pfield ! array containing the data field
161 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
162  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
163  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
164  ! 'H' : field with
165  ! horizontal spatial dim.
166  ! '-' : no horizontal dim.
167 !* 0.2 Declarations of local variables
168 !
169  CHARACTER(LEN=6) :: ymask
170 INTEGER :: il1, infompi
171 !
172 REAL :: xtime0
173 #ifdef SFX_MPI
174 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: istatus
175 #endif
176 REAL(KIND=JPRB) :: zhook_handle
177 !
178 IF (lhook) CALL dr_hook('MODE_READ_SURF_ASC:READ_SURFX1_ASC',0,zhook_handle)
179 !
180 il1 = SIZE(pfield)
181 !
182 !$OMP SINGLE
183 nworkb=0
184 !$OMP END SINGLE
185 !
186 #ifdef SFX_MPI
187 xtime0 = mpi_wtime()
188 #endif
189 !
190 IF (hdir=='-') THEN
191 !$OMP SINGLE
192  ALLOCATE(xworkd(il1))
193 !$OMP END SINGLE
194 ENDIF
195 !
196 IF (nrank==npio) THEN
197  !
198 !$OMP SINGLE
199  !
200  IF (hdir=='A') THEN
201  ALLOCATE(xworkd(il1))
202  ELSEIF (hdir/='-') THEN
203  ALLOCATE(xworkd(nfull))
204  END IF
205  !
206  IF (hdir=='A') THEN
207  CALL posnam(nunit,cmask//' '//hrec,lwork0,nluout)
208  IF (.NOT. lwork0) CALL posnam(nunit,'FULL '//' '//hrec,lwork0,nluout)
209  ELSE
210  ymask=cmask
211  CALL io_buff(&
212  hrec,'R',lwork0)
213  IF (lwork0) ymask='FULL '
214  CALL posnam(nunit,ymask//' '//hrec,lwork0,nluout)
215  ENDIF
216  !
217  READ(nunit,fmt=*,iostat=nworkb)
218  READ(nunit,fmt='(A50)',iostat=nworkb) cwork0
219  READ(nunit,fmt=*,iostat=nworkb) xworkd
220  !
221 !$OMP END SINGLE
222  !
223 ELSEIF (hdir/='-') THEN
224 !$OMP SINGLE
225  ALLOCATE(xworkd(0))
226 !$OMP END SINGLE
227 ENDIF
228 !
229 kresp = nworkb
230 hcomment = cwork0
231 !
232 #ifdef SFX_MPI
233 xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
234 #endif
235 !
236 IF (kresp/=0) CALL error_read_surf_asc(hrec,kresp)
237 !
238 IF (hdir=='A') THEN ! no distribution on other tasks
239  IF ( nrank==npio ) THEN
240 #ifdef SFX_MPI
241  xtime0 = mpi_wtime()
242 #endif
243  pfield(:) = xworkd(1:il1)
244 #ifdef SFX_MPI
245  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
246 #endif
247  ENDIF
248 ELSEIF (hdir=='-') THEN ! distribution of the total field on other tasks
249 !$OMP SINGLE
250 #ifdef SFX_MPI
251  IF (nproc>1) THEN
252  xtime0 = mpi_wtime()
253  CALL mpi_bcast(xworkd,il1*kind(xworkd)/4,mpi_real,npio,ncomm,infompi)
254  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
255  ENDIF
256 #endif
257 !$OMP END SINGLE
258  pfield(:) = xworkd(1:il1)
259 ELSE
260  CALL read_and_send_mpi(xworkd,pfield,nmask)
261 ENDIF
262 !
263 !$OMP BARRIER
264 !
265 !$OMP SINGLE
266 DEALLOCATE(xworkd)
267 !$OMP END SINGLE
268 !
269 IF (lhook) CALL dr_hook('MODE_READ_SURF_ASC:READ_SURFX1_ASC',1,zhook_handle)
270 !
271 END SUBROUTINE read_surfx1_asc
272 !
273 ! #############################################################
274  SUBROUTINE read_surfx2_asc (&
275  hrec,pfield,kresp,hcomment,hdir)
276 ! #############################################################
277 !
278 !!**** *READX2* - routine to fill a real 2D array for the externalised surface
279 !
280 
281 !
282 !
283 !
284 USE modd_surfex_omp, ONLY : lwork0, xworkd2, nworkb, cwork0, lwork0
285 !
286 USE modd_surfex_mpi, ONLY : nrank, nproc, ncomm, npio, xtime_npio_read, xtime_comm_read
287 !
288 USE modd_io_surf_asc, ONLY : nunit, nluout, nmask, nfull, cmask
289 !
290 USE mode_pos_surf
291 !
292 USE modi_io_buff
293 USE modi_error_read_surf_asc
295 !
296 USE yomhook ,ONLY : lhook, dr_hook
297 USE parkind1 ,ONLY : jprb
298 !
299 IMPLICIT NONE
300 !
301 #ifdef SFX_MPI
302 include "mpif.h"
303 #endif
304 !
305 !* 0.1 Declarations of arguments
306 !
307 !
308 !
309  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
310 REAL, DIMENSION(:,:), INTENT(OUT) :: pfield ! array containing the data field
311 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
312  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
313  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
314  ! 'H' : field with
315  ! horizontal spatial dim.
316  ! '-' : no horizontal dim.
317 !* 0.2 Declarations of local variables
318 !
319  CHARACTER(LEN=6) :: ymask
320 INTEGER :: il1, il2, infompi
321 !
322 REAL :: xtime0
323 #ifdef SFX_MPI
324 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: istatus
325 #endif
326 REAL(KIND=JPRB) :: zhook_handle
327 !
328 IF (lhook) CALL dr_hook('MODE_READ_SURF_ASC:READ_SURFX2_ASC',0,zhook_handle)
329 !
330 il1 = SIZE(pfield,1)
331 il2 = SIZE(pfield,2)
332 !
333 !$OMP SINGLE
334 nworkb=0
335 !$OMP END SINGLE
336 !
337 #ifdef SFX_MPI
338 xtime0 = mpi_wtime()
339 #endif
340 !
341 IF (hdir=='-') THEN
342 !$OMP SINGLE
343  ALLOCATE(xworkd2(il1,il2))
344 !$OMP END SINGLE
345 ENDIF
346 !
347 IF (nrank==npio) THEN
348  !
349 !$OMP SINGLE
350  !
351  IF (hdir=='A') THEN
352  ALLOCATE(xworkd2(il1,il2))
353  ELSEIF (hdir/='-') THEN
354  ALLOCATE(xworkd2(nfull,il2))
355  END IF
356  !
357  IF (hdir=='A') THEN
358  CALL posnam(nunit,cmask//' '//hrec,lwork0,nluout)
359  IF (.NOT. lwork0) CALL posnam(nunit,'FULL '//' '//hrec,lwork0,nluout)
360  ELSE
361  ymask=cmask
362  CALL io_buff(&
363  hrec,'R',lwork0)
364  IF (lwork0) ymask='FULL '
365  CALL posnam(nunit,ymask//' '//hrec,lwork0,nluout)
366  ENDIF
367  !
368  READ(nunit,fmt=*,iostat=nworkb)
369  READ(nunit,fmt='(A50)',iostat=nworkb) cwork0
370  READ(nunit,fmt=*,iostat=nworkb) xworkd2
371  !
372 !$OMP END SINGLE
373  !
374 ELSEIF (hdir/='-') THEN
375 !$OMP SINGLE
376  ALLOCATE(xworkd2(0,0))
377 !$OMP END SINGLE
378 ENDIF
379 !
380 kresp = nworkb
381 hcomment = cwork0
382 !
383 #ifdef SFX_MPI
384 xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
385 #endif
386 !
387 IF (kresp/=0) CALL error_read_surf_asc(hrec,kresp)
388 !
389 IF (hdir=='A') THEN
390  IF ( nrank==npio ) THEN
391 #ifdef SFX_MPI
392  xtime0 = mpi_wtime()
393 #endif
394  pfield(:,:) = xworkd2(1:il1,:)
395 #ifdef SFX_MPI
396  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
397 #endif
398  ENDIF
399 ELSEIF (hdir=='-') THEN
400 !$OMP SINGLE
401 #ifdef SFX_MPI
402  IF (nproc>1) THEN
403  xtime0 = mpi_wtime()
404  CALL mpi_bcast(xworkd2,il1*il2*kind(xworkd2)/4,mpi_real,npio,ncomm,infompi)
405  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
406  ENDIF
407 #endif
408 !$OMP END SINGLE
409  IF (nrank==npio) pfield(:,:) = xworkd2(1:il1,:)
410 ELSE
411  CALL read_and_send_mpi(xworkd2,pfield,nmask)
412 ENDIF
413 !
414 !$OMP BARRIER
415 !
416 !$OMP SINGLE
417 DEALLOCATE(xworkd2)
418 !$OMP END SINGLE
419 !
420 IF (lhook) CALL dr_hook('MODE_READ_SURF_ASC:READ_SURFX2_ASC',1,zhook_handle)
421 !
422 END SUBROUTINE read_surfx2_asc
423 !
424 ! #############################################################
425  SUBROUTINE read_surfn0_asc (&
426  hrec,kfield,kresp,hcomment)
427 ! #############################################################
428 !
429 !!**** *READN0* - routine to read an integer
430 !
431 !
432 !
433 !
434 USE modd_surfex_omp, ONLY : lwork0
435 !
436 USE modd_io_surf_asc, ONLY : nunit, nluout, nmask, cmask
437 !
438 USE mode_pos_surf
439 !
440 USE modi_io_buff
441 USE modi_error_read_surf_asc
442 !
443 USE yomhook ,ONLY : lhook, dr_hook
444 USE parkind1 ,ONLY : jprb
445 !
446 IMPLICIT NONE
447 !
448 !* 0.1 Declarations of arguments
449 !
450 !
451 !
452  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
453 INTEGER, INTENT(OUT) :: kfield ! the integer to be read
454 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
455  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
456 !
457 !* 0.2 Declarations of local variables
458 !
459  CHARACTER(LEN=50) :: ycomment
460  CHARACTER(LEN=6) :: ymask
461 LOGICAL :: gfound
462 REAL(KIND=JPRB) :: zhook_handle
463 !
464 IF (lhook) CALL dr_hook('MODE_READ_SURF_ASC:READ_SURFN0_ASC',0,zhook_handle)
465 !
466 kresp=0
467 !
468 ymask=cmask
469  CALL io_buff(&
470  hrec,'R',lwork0)
471 IF (lwork0) ymask='FULL '
472 !
473  CALL posnam(nunit,ymask//' '//hrec,gfound,nluout)
474 IF (.NOT. gfound) CALL posnam(nunit,'FULL '//' '//hrec,gfound,nluout) ! used for auxilliary files
475 !
476 READ(nunit,fmt=*,end=100)
477 READ(nunit,fmt='(A50)') ycomment
478 READ(nunit,fmt=*,err=100) kfield
479 !
480 hcomment = ycomment
481 IF (lhook) CALL dr_hook('MODE_READ_SURF_ASC:READ_SURFN0_ASC',1,zhook_handle)
482 RETURN
483 !
484 100 CONTINUE
485  CALL error_read_surf_asc(hrec,kresp)
486 IF (lhook) CALL dr_hook('MODE_READ_SURF_ASC:READ_SURFN0_ASC',1,zhook_handle)
487 !-------------------------------------------------------------------------------
488 END SUBROUTINE read_surfn0_asc
489 !
490 ! #############################################################
491  SUBROUTINE read_surfn1_asc (&
492  hrec,kfield,kresp,hcomment,hdir)
493 ! #############################################################
494 !
495 !!**** *READN0* - routine to read an integer
496 !
497 !
498 !
499 !
500 USE modd_surfex_mpi, ONLY : nrank, nproc, ncomm, npio, xtime_npio_read, xtime_comm_read
501 !
502 USE modd_surfex_omp, ONLY : lwork0, cwork0, nworkd, nworkb
503 !
504 USE modd_io_surf_asc, ONLY : nunit, nluout, nmask, nfull, cmask
505 !
506 USE mode_pos_surf
507 !
508 USE modi_io_buff
509 USE modi_error_read_surf_asc
511 !
512 USE yomhook ,ONLY : lhook, dr_hook
513 USE parkind1 ,ONLY : jprb
514 !
515 IMPLICIT NONE
516 !
517 #ifdef SFX_MPI
518 include "mpif.h"
519 #endif
520 !
521 !* 0.1 Declarations of arguments
522 !
523 !
524 !
525  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
526 INTEGER, DIMENSION(:), INTENT(OUT) :: kfield ! the integer to be read
527 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
528  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
529  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
530  ! 'H' : field with
531  ! horizontal spatial dim.
532  ! '-' : no horizontal dim.
533 !* 0.2 Declarations of local variables
534 !
535  CHARACTER(LEN=6) :: ymask
536 INTEGER :: il1, infompi
537 !
538 #ifdef SFX_MPI
539 INTEGER, DIMENSION(MPI_STATUS_SIZE) :: istatus
540 #endif
541 REAL :: xtime0
542 REAL(KIND=JPRB) :: zhook_handle
543 !
544 IF (lhook) CALL dr_hook('MODE_READ_SURF_ASC:READ_SURFN1_ASC',0,zhook_handle)
545 !
546 il1 = SIZE(kfield)
547 !
548 !$OMP SINGLE
549 nworkb = 0
550 !$OMP END SINGLE
551 !
552 #ifdef SFX_MPI
553 xtime0 = mpi_wtime()
554 #endif
555 !
556 IF (hdir=='-') THEN
557 !$OMP SINGLE
558  ALLOCATE(nworkd(il1))
559 !$OMP END SINGLE
560 ENDIF
561 !
562 IF (nrank==npio) THEN
563  !
564 !$OMP SINGLE
565  !
566  IF (hdir=='A') THEN
567  ALLOCATE(nworkd(il1))
568  ELSEIF (hdir/='-') THEN
569  ALLOCATE(nworkd(nfull))
570  END IF
571  !
572  IF (hdir=='A') THEN
573  CALL posnam(nunit,cmask//' '//hrec,lwork0,nluout)
574  IF (.NOT. lwork0) CALL posnam(nunit,'FULL '//' '//hrec,lwork0,nluout)
575  ELSE
576  ymask=cmask
577  CALL io_buff(&
578  hrec,'R',lwork0)
579  IF (lwork0) ymask='FULL '
580  CALL posnam(nunit,ymask//' '//hrec,lwork0,nluout)
581  ENDIF
582  !
583  READ(nunit,fmt=*,iostat=nworkb)
584  READ(nunit,fmt='(A50)',iostat=nworkb) cwork0
585  READ(nunit,fmt=*,iostat=nworkb) nworkd
586  !
587 !$OMP END SINGLE
588  !
589 ELSEIF (hdir/='-') THEN
590 !$OMP SINGLE
591  ALLOCATE(nworkd(0))
592 !$OMP END SINGLE
593 ENDIF
594 !
595 kresp = nworkb
596 hcomment = cwork0
597 !
598 #ifdef SFX_MPI
599 xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
600 #endif
601 !
602 IF (kresp/=0) CALL error_read_surf_asc(hrec,kresp)
603 !
604 IF (hdir=='A') THEN
605  IF ( nrank==npio ) THEN
606 #ifdef SFX_MPI
607  xtime0 = mpi_wtime()
608 #endif
609  kfield(:) = nworkd(1:il1)
610 #ifdef SFX_MPI
611  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
612 #endif
613  ENDIF
614 ELSEIF (hdir=='-') THEN
615 !$OMP SINGLE
616 #ifdef SFX_MPI
617  IF (nproc>1) THEN
618  xtime0 = mpi_wtime()
619  CALL mpi_bcast(nworkd,il1*kind(nworkd)/4,mpi_integer,npio,ncomm,infompi)
620  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
621  ENDIF
622 #endif
623 !$OMP END SINGLE
624  kfield(:) = nworkd(1:il1)
625 ELSE
626  CALL read_and_send_mpi(nworkd,kfield,nmask)
627 ENDIF
628 !
629 !$OMP BARRIER
630 !
631 !$OMP SINGLE
632 DEALLOCATE(nworkd)
633 !$OMP END SINGLE
634 !
635 IF (lhook) CALL dr_hook('MODE_READ_SURF_ASC:READ_SURFN1_ASC',1,zhook_handle)
636 !
637 END SUBROUTINE read_surfn1_asc
638 !
639 ! #############################################################
640  SUBROUTINE read_surfc0_asc (&
641  hrec,hfield,kresp,hcomment)
642 ! #############################################################
643 !
644 !!**** *READC0* - routine to read a character
645 !
646 !
647 !
648 !
649 USE modd_surfex_omp, ONLY : lwork0
650 !
651 USE modd_io_surf_asc, ONLY : nunit, nluout, cmask
652 !
653 USE mode_pos_surf
654 !
655 USE modi_io_buff
656 USE modi_error_read_surf_asc
657 !
658 USE yomhook ,ONLY : lhook, dr_hook
659 USE parkind1 ,ONLY : jprb
660 !
661 IMPLICIT NONE
662 !
663 !* 0.1 Declarations of arguments
664 !
665 !
666 !
667  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
668  CHARACTER(LEN=40), INTENT(OUT) :: hfield ! the integer to be read
669 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
670  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
671 !
672 !* 0.2 Declarations of local variables
673 !
674 INTEGER :: iresp
675  CHARACTER(LEN=50):: ycomment
676  CHARACTER(LEN=6) :: ymask
677 LOGICAL :: gfound
678 REAL(KIND=JPRB) :: zhook_handle
679 !
680 IF (lhook) CALL dr_hook('MODE_READ_SURF_ASC:READ_SURFC0_ASC',0,zhook_handle)
681 !
682 kresp=0
683 !
684 ymask=cmask
685  CALL io_buff(&
686  hrec,'R',lwork0)
687 IF (lwork0) ymask='FULL '
688 !
689  CALL posnam(nunit,ymask//' '//hrec,gfound,nluout)
690 IF (.NOT. gfound) CALL posnam(nunit,'FULL '//' '//hrec,gfound,nluout) ! used for auxilliary files
691 !
692 READ(nunit,fmt=*,iostat=iresp)
693 READ(nunit,fmt='(A50)',iostat=iresp) ycomment
694 READ(nunit,fmt='(A40)',iostat=iresp) hfield
695 !
696 IF (iresp/=0) CALL error_read_surf_asc(hrec,kresp)
697 
698 hcomment = ycomment
699 !
700 IF (lhook) CALL dr_hook('MODE_READ_SURF_ASC:READ_SURFC0_ASC',1,zhook_handle)
701 !
702 END SUBROUTINE read_surfc0_asc
703 !
704 ! #############################################################
705  SUBROUTINE read_surfl0_asc (&
706  hrec,ofield,kresp,hcomment)
707 ! #############################################################
708 !
709 !!**** *READL0* - routine to read a logical
710 !
711 !
712 !
713 !
714 USE modd_surfex_omp, ONLY : lwork0
715 !
716 USE modd_io_surf_asc, ONLY : nunit, nluout, cmask
717 !
718 USE mode_pos_surf
719 !
720 USE modi_io_buff
721 USE modi_error_read_surf_asc
722 !
723 USE yomhook ,ONLY : lhook, dr_hook
724 USE parkind1 ,ONLY : jprb
725 !
726 IMPLICIT NONE
727 !
728 !* 0.1 Declarations of arguments
729 !
730 !
731 !
732  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
733 LOGICAL, INTENT(OUT) :: ofield ! array containing the data field
734 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
735  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
736 !
737 !* 0.2 Declarations of local variables
738 !
739  CHARACTER(LEN=50) :: ycomment
740  CHARACTER(LEN=6) :: ymask
741 LOGICAL :: gfound
742 REAL(KIND=JPRB) :: zhook_handle
743 !
744 IF (lhook) CALL dr_hook('MODE_READ_SURF_ASC:READ_SURFL0_ASC',0,zhook_handle)
745 kresp=0
746 !
747 ymask=cmask
748  CALL io_buff(&
749  hrec,'R',lwork0)
750 IF (lwork0) ymask='FULL '
751 !
752  CALL posnam(nunit,ymask//' '//hrec,gfound,nluout)
753 IF (.NOT. gfound) CALL posnam(nunit,'FULL '//' '//hrec,gfound,nluout) ! used for auxilliary files
754 !
755 READ(nunit,fmt=*,end=100)
756 READ(nunit,fmt='(A50)') ycomment
757 READ(nunit,fmt=*,err=100) ofield
758 !
759 hcomment = ycomment
760 IF (lhook) CALL dr_hook('MODE_READ_SURF_ASC:READ_SURFL0_ASC',1,zhook_handle)
761 RETURN
762 !
763 100 CONTINUE
764  CALL error_read_surf_asc(hrec,kresp)
765 IF (lhook) CALL dr_hook('MODE_READ_SURF_ASC:READ_SURFL0_ASC',1,zhook_handle)
766 !
767 END SUBROUTINE read_surfl0_asc
768 !
769 ! #############################################################
770  SUBROUTINE read_surfl1_asc (&
771  hrec,ofield,kresp,hcomment,hdir)
772 ! #############################################################
773 !
774 !!**** *READL1* - routine to read a logical array
775 !
776 !
777 !
778 !
779 USE modd_surfex_omp, ONLY : lwork0, lworkd, nworkb, cwork0
780 !
781 USE modd_surfex_mpi, ONLY : nrank, nproc, ncomm, npio, xtime_npio_read, xtime_comm_read
782 !
783 USE modd_io_surf_asc, ONLY : nunit, nluout, cmask
784 !
785 USE mode_pos_surf
786 !
787 USE modi_io_buff
788 USE modi_error_read_surf_asc
789 !
790 USE yomhook ,ONLY : lhook, dr_hook
791 USE parkind1 ,ONLY : jprb
792 !
793 IMPLICIT NONE
794 !
795 #ifdef SFX_MPI
796 include "mpif.h"
797 #endif
798 !
799 !* 0.1 Declarations of arguments
800 !
801 !
802 !
803  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
804 LOGICAL, DIMENSION(:), INTENT(OUT) :: ofield ! array containing the data field
805 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
806  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
807  CHARACTER(LEN=1), INTENT(IN) :: hdir ! type of field :
808  ! 'H' : field with
809  ! horizontal spatial dim.
810  ! '-' : no horizontal dim.
811 !* 0.2 Declarations of local variables
812 !
813  CHARACTER(LEN=6) :: ymask
814 INTEGER :: infompi, il1
815 REAL :: xtime0
816 REAL(KIND=JPRB) :: zhook_handle
817 !
818 IF (lhook) CALL dr_hook('MODE_READ_SURF_ASC:READ_SURFL1_ASC',0,zhook_handle)
819 !
820 il1 = SIZE(ofield)
821 !
822 nworkb = 0
823 !
824 !$OMP BARRIER
825 !
826 #ifdef SFX_MPI
827 xtime0 = mpi_wtime()
828 #endif
829 !
830 !$OMP SINGLE
831 ALLOCATE(lworkd(il1))
832 !$OMP END SINGLE
833 !
834 IF (nrank==npio) THEN
835  !
836 !$OMP SINGLE
837  !
838  ymask=cmask
839  CALL io_buff(&
840  hrec,'R',lwork0)
841  IF (lwork0) ymask='FULL '
842  !
843  CALL posnam(nunit,ymask//' '//hrec,lwork0,nluout)
844  IF (.NOT. lwork0) CALL posnam(nunit,'FULL '//' '//hrec,lwork0,nluout) ! used for auxilliary files
845  !
846  READ(nunit,fmt=*,iostat=nworkb)
847  READ(nunit,fmt='(A50)',iostat=nworkb) cwork0
848  READ(nunit,fmt=*,iostat=nworkb) lworkd
849  !
850 !$OMP END SINGLE
851  !
852 ENDIF
853 !
854 kresp = nworkb
855 hcomment = cwork0
856 !
857 #ifdef SFX_MPI
858 xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
859 #endif
860 !
861 IF (kresp/=0) CALL error_read_surf_asc(hrec,kresp)
862 !
863 #ifdef SFX_MPI
864 IF (nproc>1 .AND. hdir/='A') THEN
865 !$OMP SINGLE
866  xtime0 = mpi_wtime()
867  CALL mpi_bcast(lworkd,il1,mpi_logical,npio,ncomm,infompi)
868  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
869 !$OMP END SINGLE
870 ENDIF
871 #endif
872 !
873 ofield = lworkd
874 !
875 IF (lhook) CALL dr_hook('MODE_READ_SURF_ASC:READ_SURFL1_ASC',1,zhook_handle)
876 !
877 END SUBROUTINE read_surfl1_asc
878 !
879 !
880 ! #############################################################
881  SUBROUTINE read_surft0_asc (&
882  hrec,kyear,kmonth,kday,ptime,kresp,hcomment)
883 ! #############################################################
884 !
885 !!**** *READT0* - routine to read a date
886 !
887 !
888 !
889 !
890 USE modd_surfex_mpi, ONLY : nrank
891 USE modd_surfex_omp, ONLY : lwork0, nblock
892 !
893 USE modd_io_surf_asc, ONLY : nunit, nluout, cmask
894 !
895 USE mode_pos_surf
896 !
897 USE modi_io_buff
898 USE modi_error_read_surf_asc
899 !
900 USE yomhook ,ONLY : lhook, dr_hook
901 USE parkind1 ,ONLY : jprb
902 !
903 IMPLICIT NONE
904 !
905 !* 0.1 Declarations of arguments
906 !
907 !
908 !
909  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
910 INTEGER, INTENT(OUT) :: kyear ! year
911 INTEGER, INTENT(OUT) :: kmonth ! month
912 INTEGER, INTENT(OUT) :: kday ! day
913 REAL, INTENT(OUT) :: ptime ! year
914 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
915  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
916 
917 !* 0.2 Declarations of local variables
918 !
919  CHARACTER(LEN=50) :: ycomment
920  CHARACTER(LEN=6) :: ymask
921 LOGICAL :: gfound
922 INTEGER, DIMENSION(3) :: itdate
923 REAL(KIND=JPRB) :: zhook_handle
924 !
925 IF (lhook) CALL dr_hook('MODE_READ_SURF_ASC:READ_SURFT0_ASC',0,zhook_handle)
926 kresp=0
927 !
928 ymask=cmask
929  CALL io_buff(&
930  hrec,'R',lwork0)
931 IF (lwork0) ymask='FULL '
932 !
933  CALL posnam(nunit,ymask//' '//trim(hrec)//'%TDATE',gfound,nluout)
934 !IF (.NOT. GFOUND) CALL POSNAM(NUNIT,'FULL '//' '//HREC,GFOUND,NLUOUT) ! used for auxilliary files
935 !
936 READ(nunit,fmt=*,end=100)
937 READ(nunit,fmt='(A50)') ycomment
938 READ(nunit,fmt=*,err=100) itdate(:)
939 !
940 kyear = itdate(1)
941 kmonth = itdate(2)
942 kday = itdate(3)
943 !
944  CALL posnam(nunit,ymask//' '//trim(hrec)//'%TIME',gfound,nluout)
945 IF (.NOT. gfound) CALL posnam(nunit,'FULL '//' '//hrec,gfound,nluout) ! used for auxilliary files
946 !
947 READ(nunit,fmt=*,end=100)
948 READ(nunit,fmt='(A50)') ycomment
949 READ(nunit,fmt=*,err=100) ptime
950 !
951 hcomment = ycomment
952 !
953 IF (lhook) CALL dr_hook('MODE_READ_SURF_ASC:READ_SURFT0_ASC',1,zhook_handle)
954 RETURN
955 !
956 100 CONTINUE
957  CALL error_read_surf_asc(hrec,kresp)
958 IF (lhook) CALL dr_hook('MODE_READ_SURF_ASC:READ_SURFT0_ASC',1,zhook_handle)
959 !
960 END SUBROUTINE read_surft0_asc
961 !
962 ! #############################################################
963  SUBROUTINE read_surft1_asc (&
964  hrec,kyear,kmonth,kday,ptime,kresp,hcomment)
965 ! #############################################################
966 !
967 !!**** *READT2* - routine to read a date
968 !
969 !
970 !
971 !
972 USE modd_surfex_mpi, ONLY : nrank
973 USE modd_surfex_omp, ONLY : lwork0, nblock
974 !
975 USE modd_io_surf_asc, ONLY : nunit, nluout, cmask
976 !
977 USE mode_pos_surf
978 !
979 USE modi_io_buff
980 USE modi_error_read_surf_asc
981 !
982 USE yomhook ,ONLY : lhook, dr_hook
983 USE parkind1 ,ONLY : jprb
984 !
985 IMPLICIT NONE
986 !
987 !* 0.1 Declarations of arguments
988 !
989 !
990 !
991  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
992 INTEGER, DIMENSION(:), INTENT(OUT) :: kyear ! year
993 INTEGER, DIMENSION(:), INTENT(OUT) :: kmonth ! month
994 INTEGER, DIMENSION(:), INTENT(OUT) :: kday ! day
995 REAL, DIMENSION(:), INTENT(OUT) :: ptime ! year
996 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
997  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
998 !
999 !* 0.2 Declarations of local variables
1000 !
1001  CHARACTER(LEN=50) :: ycomment
1002  CHARACTER(LEN=6) :: ymask
1003 LOGICAL :: gfound
1004 INTEGER, DIMENSION(3,SIZE(KYEAR)) :: itdate
1005 REAL(KIND=JPRB) :: zhook_handle
1006 !
1007 IF (lhook) CALL dr_hook('MODE_READ_SURF_ASC:READ_SURFT1_ASC',0,zhook_handle)
1008 !
1009 kresp=0
1010 !
1011 ymask=cmask
1012  CALL io_buff(&
1013  hrec,'R',lwork0)
1014 IF (lwork0) ymask='FULL '
1015 !
1016  CALL posnam(nunit,ymask//' '//trim(hrec)//'%TDATE',gfound,nluout)
1017 !
1018 READ(nunit,fmt=*,end=100)
1019 READ(nunit,fmt='(A50)') ycomment
1020 READ(nunit,fmt=*,err=100) itdate(:,:)
1021 !
1022 kyear(:) = itdate(1,:)
1023 kmonth(:) = itdate(2,:)
1024 kday(:) = itdate(3,:)
1025 !
1026  CALL posnam(nunit,cmask//' '//trim(hrec)//'%TIME',gfound,nluout)
1027 !
1028 READ(nunit,fmt=*,end=100)
1029 READ(nunit,fmt='(A50)') ycomment
1030 READ(nunit,fmt=*,err=100) ptime
1031 !
1032 hcomment = ycomment
1033 IF (lhook) CALL dr_hook('MODE_READ_SURF_ASC:READ_SURFT1_ASC',1,zhook_handle)
1034 RETURN
1035 !
1036 100 CONTINUE
1037  CALL error_read_surf_asc(hrec,kresp)
1038 IF (lhook) CALL dr_hook('MODE_READ_SURF_ASC:READ_SURFT1_ASC',1,zhook_handle)
1039 !
1040 END SUBROUTINE read_surft1_asc
1041 !
1042 ! #############################################################
1043  SUBROUTINE read_surft2_asc (&
1044  hrec,kyear,kmonth,kday,ptime,kresp,hcomment)
1045 ! #############################################################
1046 !
1047 !!**** *READT2* - routine to read a date
1048 !
1049 !
1050 !
1051 !
1052 USE modd_surfex_omp, ONLY : lwork0
1053 !
1054 USE modd_io_surf_asc, ONLY : nunit, nluout, cmask
1055 !
1056 USE mode_pos_surf
1057 !
1058 USE modi_io_buff
1059 USE modi_error_read_surf_asc
1060 !
1061 USE yomhook ,ONLY : lhook, dr_hook
1062 USE parkind1 ,ONLY : jprb
1063 !
1064 IMPLICIT NONE
1065 !
1066 !* 0.1 Declarations of arguments
1067 !
1068 !
1069 !
1070  CHARACTER(LEN=*), INTENT(IN) :: hrec ! name of the article to be read
1071 INTEGER, DIMENSION(:,:), INTENT(OUT) :: kyear ! year
1072 INTEGER, DIMENSION(:,:), INTENT(OUT) :: kmonth ! month
1073 INTEGER, DIMENSION(:,:), INTENT(OUT) :: kday ! day
1074 REAL, DIMENSION(:,:), INTENT(OUT) :: ptime ! year
1075 INTEGER, INTENT(OUT) :: kresp ! KRESP : return-code if a problem appears
1076  CHARACTER(LEN=100), INTENT(OUT) :: hcomment ! comment
1077 
1078 !* 0.2 Declarations of local variables
1079 !
1080  CHARACTER(LEN=50) :: ycomment
1081  CHARACTER(LEN=6) :: ymask
1082 LOGICAL :: gfound
1083 INTEGER, DIMENSION(3,SIZE(KYEAR,1),SIZE(KYEAR,2)) :: itdate
1084 REAL(KIND=JPRB) :: zhook_handle
1085 !
1086 IF (lhook) CALL dr_hook('MODE_READ_SURF_ASC:READ_SURFT2_ASC',0,zhook_handle)
1087 !
1088 kresp=0
1089 !
1090 ymask=cmask
1091  CALL io_buff(&
1092  hrec,'R',lwork0)
1093 IF (lwork0) ymask='FULL '
1094 !
1095  CALL posnam(nunit,ymask//' '//trim(hrec)//'%TDATE',gfound,nluout)
1096 !
1097 READ(nunit,fmt=*,end=100)
1098 READ(nunit,fmt='(A50)') ycomment
1099 READ(nunit,fmt=*,err=100) itdate(:,:,:)
1100 !
1101 kyear(:,:) = itdate(1,:,:)
1102 kmonth(:,:) = itdate(2,:,:)
1103 kday(:,:) = itdate(3,:,:)
1104 !
1105  CALL posnam(nunit,ymask//' '//trim(hrec)//'%TIME',gfound,nluout)
1106 
1107 READ(nunit,fmt=*,end=100)
1108 READ(nunit,fmt='(A50)') ycomment
1109 READ(nunit,fmt=*,err=100) ptime
1110 !
1111 hcomment = ycomment
1112 !
1113 IF (lhook) CALL dr_hook('MODE_READ_SURF_ASC:READ_SURFT2_ASC',1,zhook_handle)
1114 RETURN
1115 !
1116 100 CONTINUE
1117  CALL error_read_surf_asc(hrec,kresp)
1118 IF (lhook) CALL dr_hook('MODE_READ_SURF_ASC:READ_SURFT2_ASC',1,zhook_handle)
1119 !
1120 END SUBROUTINE read_surft2_asc
1121 !
1122 END MODULE mode_read_surf_asc
subroutine read_surft2_asc(HREC, KYEAR, KMONTH, KDAY, PTIME, KRESP, HCOMMENT)
subroutine read_surft0_asc(HREC, KYEAR, KMONTH, KDAY, PTIME, KRESP, HCOMMENT)
subroutine read_surfx2_asc(HREC, PFIELD, KRESP, HCOMMENT, HDIR)
subroutine error_read_surf_asc(HREC, KRESP)
subroutine read_surft1_asc(HREC, KYEAR, KMONTH, KDAY, PTIME, KRESP, HCOMMENT)
subroutine read_surfl1_asc(HREC, OFIELD, KRESP, HCOMMENT, HDIR)
subroutine read_surfn1_asc(HREC, KFIELD, KRESP, HCOMMENT, HDIR)
subroutine posnam(KULNAM, HDNAML, OFOUND, KLUOUT)
subroutine read_surfn0_asc(HREC, KFIELD, KRESP, HCOMMENT)
subroutine read_surfc0_asc(HREC, HFIELD, KRESP, HCOMMENT)
subroutine io_buff(HREC, HACTION, OKNOWN)
Definition: io_buff.F90:6
subroutine read_surfx0_asc(HREC, PFIELD, KRESP, HCOMMENT)
subroutine read_surfx1_asc(HREC, PFIELD, KRESP, HCOMMENT, HDIR)
subroutine read_surfl0_asc(HREC, OFIELD, KRESP, HCOMMENT)