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