SURFEX v8.1
General documentation of Surfex
mode_read_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 !! PURPOSE
8 !! -------
9 !
10 ! The purpose of READ_SURF_OL 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 !! F. Habets *METEO-FRANCE*
32 !!
33 !! MODIFICATIONS
34 !! -------------
35 !!
36 !! original 01/08/03
37 !----------------------------------------------------------------------------
38 !
39 INTERFACE read_surf0_ol
40  MODULE PROCEDURE read_surfx0_ol
41  MODULE PROCEDURE read_surfn0_ol
42  MODULE PROCEDURE read_surfc0_ol
43  MODULE PROCEDURE read_surfl0_ol
44 END INTERFACE
46  MODULE PROCEDURE read_surfx1_ol
47  MODULE PROCEDURE read_surfn1_ol
48 END INTERFACE
50  MODULE PROCEDURE read_surfl1_ol
51  MODULE PROCEDURE read_surfx2_ol
52  MODULE PROCEDURE read_surfx3_ol
53 END INTERFACE
54 INTERFACE read_surft_ol
55  MODULE PROCEDURE read_surft0_ol
56 END INTERFACE
57 !
58 CONTAINS
59 !
60 ! #############################################################
61  SUBROUTINE read_surfx0_ol(HREC,PFIELD,KRESP,HCOMMENT)
62 ! #############################################################
63 !
64 !!**** *READX0* - routine to read a real scalar
65 !
66 USE modd_surf_par, ONLY: xundef
67 !
68 USE modi_ol_find_file_read
69 USE modi_error_read_surf_ol
70 !
71 USE yomhook ,ONLY : lhook, dr_hook
72 USE parkind1 ,ONLY : jprb
73 !
74 USE netcdf
75 !
76 IMPLICIT NONE
77 !
78 !
79 !* 0.1 Declarations of arguments
80 !
81  CHARACTER(LEN=*), INTENT(IN) :: HREC ! name of the article to be read
82 REAL, INTENT(OUT) :: PFIELD ! the real scalar to be read
83 INTEGER, INTENT(OUT) :: KRESP ! KRESP : return-code if a problem appears
84  CHARACTER(LEN=100), INTENT(OUT) :: HCOMMENT ! comment
85 !
86 !* 0.2 Declarations of local variables
87 !
88 REAL*4 :: ZFIELD
89  CHARACTER(LEN=100) :: YFILE ! filename
90 INTEGER :: IVAR_ID,IFILE_ID,JRET,IVAL,ITYPE,INDIMS
91 INTEGER,DIMENSION(4) :: IRET
92 REAL(KIND=JPRB) :: ZHOOK_HANDLE
93 !
94 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFX0_OL',0,zhook_handle)
95 !
96 kresp=0
97 hcomment = " "
98 !
99 ! 0. find filename
100 ! -----------------
101  CALL ol_find_file_read(hrec,ifile_id)
102 !
103 IF (ifile_id.NE.0) THEN
104  !
105  ! 1. Find id of the variable
106  !----------------------------
107  iret(1)=nf90_inq_varid(ifile_id,hrec,ivar_id)
108  iret(1)=nf90_inquire_variable(ifile_id,ivar_id,xtype=itype)
109  iret(1)=nf90_inquire_variable(ifile_id,ivar_id,ndims=indims)
110  !
111  ! 2. Get variable
112  !----------------------------
113  IF (itype==nf90_double) THEN
114  iret(2)=nf90_get_var(ifile_id,ivar_id,pfield)
115  ELSEIF (itype==nf90_float) THEN
116  iret(2)=nf90_get_var(ifile_id,ivar_id,zfield)
117  pfield = zfield
118  ENDIF
119  !
120 ENDIF
121 !
122 ! 3. Check for errors
123 !--------------------
124 DO jret=1,2
125  IF ((pfield==xundef).OR.(ifile_id==0).OR.iret(jret).NE.nf90_noerr) THEN
126  pfield=xundef
127  kresp=1
128  ENDIF
129 ENDDO
130 !
131 IF (kresp /=0) CALL error_read_surf_ol(hrec,kresp)
132 !
133 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFX0_OL',1,zhook_handle)
134 !
135 END SUBROUTINE read_surfx0_ol
136 !
137 ! #############################################################
138  SUBROUTINE read_surfx1_ol(HREC,PFIELD,KRESP,HCOMMENT,HDIR)
139 ! #############################################################
140 !
141 !!**** *READX1* - routine to fill a real 1D array for the externalised surface
142 !
144 !
146 !
147 USE modd_surf_par, ONLY: xundef
148 !
149 USE modi_ol_find_file_read
150 USE modi_error_read_surf_ol
152 !
153 USE yomhook ,ONLY : lhook, dr_hook
154 USE parkind1 ,ONLY : jprb
155 !
156 USE netcdf
157 !
158 IMPLICIT NONE
159 !
160 !
161 #ifdef SFX_MPI
162 include "mpif.h"
163 #endif
164 !
165 !* 0.1 Declarations of arguments
166 !
167  CHARACTER(LEN=*), INTENT(IN) :: HREC ! name of the article to be read
168 REAL, DIMENSION(:), INTENT(OUT) :: PFIELD ! array containing the data field
169 INTEGER, INTENT(OUT) :: KRESP ! KRESP : return-code if a problem appears
170  CHARACTER(LEN=100), INTENT(OUT) :: HCOMMENT ! comment
171  CHARACTER(LEN=1), INTENT(IN) :: HDIR ! type of field :
172  ! 'H' : field with
173  ! horizontal spatial dim.
174  ! '-' : no horizontal dim.
175 !* 0.2 Declarations of local variables
176 !
177  CHARACTER(LEN=100) :: YFILE,YOUT ! Filename
178 INTEGER :: IVAR_ID,IFILE_ID,JRET,JDIM,INDIMS, ITYPE
179 INTEGER,DIMENSION(2) :: IDIMIDS,IDIMLEN
180 INTEGER,DIMENSION(2) :: IRET
181 !
182 INTEGER,DIMENSION(:),ALLOCATABLE :: ISTART,ICOUNT,ISTRIDE
183 REAL, DIMENSION(:), ALLOCATABLE :: ZWORK
184 REAL*4, DIMENSION(:), ALLOCATABLE :: ZTAB_1D4
185 DOUBLE PRECISION :: XTIME0
186 REAL(KIND=JPRB) :: ZHOOK_HANDLE
187 !
188 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFX1_OL',0,zhook_handle)
189 !
190 !
191 kresp=0
192 !
193 hcomment = " "
194 !
195 #ifdef SFX_MPI
196 xtime0 = mpi_wtime()
197 #endif
198 !
199 IF (nrank==npio) THEN
200  !
201  ! 0. find filename
202  ! -----------------
203  CALL ol_find_file_read(hrec,ifile_id)
204  !
205  IF (ifile_id.NE.0) THEN
206  !
207  ! 1. Find id of the variable
208  !----------------------------
209  iret(1)=nf90_inq_varid(ifile_id,hrec,ivar_id)
210  iret(1)=nf90_inquire_variable(ifile_id,ivar_id,xtype=itype)
211  iret(1)=nf90_inquire_variable(ifile_id,ivar_id,ndims=indims)
212  iret(1)=nf90_inquire_variable(ifile_id,ivar_id,dimids=idimids(1:indims))
213  idimlen(:) = 1.
214  DO jdim=1,indims
215  jret=nf90_inquire_dimension(ifile_id,idimids(jdim),len=idimlen(jdim))
216  ENDDO
217  ALLOCATE(zwork(idimlen(1)*idimlen(2)))
218  !
219  ALLOCATE(istart(indims))
220  ALLOCATE(icount(indims))
221  !
222  ! 2. Get variable
223  !----------------------------
224  IF (lpartr) THEN
225  ! write partially a time-matrix.
226  ! Have to find which of the dimension is the time dimension
227  ALLOCATE(istride(indims))
228  DO jdim=1,indims
229  iret=nf90_inquire_dimension(ifile_id,idimids(jdim),name=yout)
230  IF ((index(yout,'time') > 0).OR.(index(yout,'TIME') >0) &
231  .OR.(index(yout,'Time')>0.)) THEN
232  istart(jdim)=xstart
233  icount(jdim)=xcount
234  istride(jdim)=xstride
235  ELSE
236  istart(jdim)=1
237  icount(jdim)=idimlen(jdim)
238  istride(jdim)=1
239  ENDIF
240  ENDDO
241 
242  IF (itype==nf90_double) THEN
243  iret(1)=nf90_get_var(ifile_id,ivar_id,zwork,istart,icount,istride)
244  ELSEIF (itype==nf90_float) THEN
245  ALLOCATE(ztab_1d4(idimlen(1)*idimlen(2)))
246  iret(1)=nf90_get_var(ifile_id,ivar_id,ztab_1d4,istart,icount,istride)
247  zwork(:) = ztab_1d4(:)
248  DEALLOCATE(ztab_1d4)
249  ENDIF
250 
251  DEALLOCATE(istride)
252 
253  ELSE
254 
255  istart(:) = 1
256  icount(1:indims) = idimlen(1:indims)
257 
258  IF (itype==nf90_double) THEN
259  iret(1)=nf90_get_var(ifile_id,ivar_id,zwork,istart,icount)
260  ELSEIF (itype==nf90_float) THEN
261  ALLOCATE(ztab_1d4(idimlen(1)*idimlen(2)))
262  iret(1)=nf90_get_var(ifile_id,ivar_id,ztab_1d4,istart,icount)
263  zwork(:) = ztab_1d4(:)
264  DEALLOCATE(ztab_1d4)
265  ENDIF
266 
267  ENDIF
268  !
269  DEALLOCATE(istart)
270  DEALLOCATE(icount)
271  !
272  ENDIF
273  !
274  ! 3. Check for errors
275  !--------------------
276  DO jret=1,1
277  IF ((ifile_id==0).OR.iret(jret).NE.nf90_noerr) THEN
278  zwork = xundef
279  kresp=1
280  ELSE
281  IF (minval(zwork)==xundef) THEN
282  kresp = 1
283  zwork = xundef
284  ENDIF
285  ENDIF
286  ENDDO
287  !
288  IF (kresp /=0) CALL error_read_surf_ol(hrec,kresp)
289  !
290 ELSE
291  ALLOCATE(zwork(0))
292 ENDIF
293 !
294 #ifdef SFX_MPI
295 xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
296 #endif
297 !
298 IF (lmask) THEN
299  CALL read_and_send_mpi(zwork,pfield,nmask)
300 ELSE
301  CALL read_and_send_mpi(zwork,pfield)
302 END IF
303 !
304 DEALLOCATE(zwork)
305 !
306 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFX1_OL',1,zhook_handle)
307 !
308 END SUBROUTINE read_surfx1_ol
309 !
310 ! #############################################################
311  SUBROUTINE read_surfx2_ol(HREC,PFIELD,KRESP,HCOMMENT,HDIR)
312 ! #############################################################
313 !
314 !!**** *READX2* - routine to fill a real 2D array for the externalised surface
315 !
317 !
319 USE modd_surf_par, ONLY: xundef
320 !
321 USE modi_ol_find_file_read
322 USE modi_error_read_surf_ol
324 !
325 USE yomhook ,ONLY : lhook, dr_hook
326 USE parkind1 ,ONLY : jprb
327 !
328 USE netcdf
329 !
330 IMPLICIT NONE
331 !
332 !
333 #ifdef SFX_MPI
334 include "mpif.h"
335 #endif
336 !
337 !* 0.1 Declarations of arguments
338 !
339  CHARACTER(LEN=*), INTENT(IN) :: HREC ! name of the article to be read
340 REAL, DIMENSION(:,:), INTENT(OUT) :: PFIELD ! array containing the data field
341 INTEGER, INTENT(OUT) :: KRESP ! KRESP : return-code if a problem appears
342  CHARACTER(LEN=100), INTENT(OUT) :: HCOMMENT ! comment
343  CHARACTER(LEN=1), INTENT(IN) :: HDIR ! type of field :
344  ! 'H' : field with
345  ! horizontal spatial dim.
346  ! '-' : no horizontal dim.
347 !* 0.2 Declarations of local variables
348 !
349  CHARACTER(LEN=100) :: YFILE,YOUT ! filename
350 INTEGER :: IVAR_ID,IFILE_ID,JRET,JDIM,INDIMS,ITYPE
351 INTEGER,DIMENSION(3) :: IDIMIDS,IDIMLEN
352 INTEGER,DIMENSION(2) :: IRET
353 INTEGER, DIMENSION(:), ALLOCATABLE :: ISTART,ISTRIDE,ICOUNT
354 REAL, DIMENSION(:,:), ALLOCATABLE :: ZWORK2
355 REAL*4, DIMENSION(:,:), ALLOCATABLE :: ZTAB_2D4
356 DOUBLE PRECISION :: XTIME0
357 REAL(KIND=JPRB) :: ZHOOK_HANDLE
358 !
359 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFX2_OL',0,zhook_handle)
360 !
361 !
362 kresp=0
363 !
364 hcomment = " "
365 !
366 #ifdef SFX_MPI
367 xtime0 = mpi_wtime()
368 #endif
369 !
370 IF (nrank==npio) THEN
371  !
372  ! 0. find filename
373  ! -----------------
374  CALL ol_find_file_read(hrec,ifile_id)
375  !
376  IF (ifile_id.NE.0) THEN
377  !
378  ! 1. Find id of the variable
379  !----------------------------
380  iret(1)=nf90_inq_varid(ifile_id,hrec,ivar_id)
381  iret(1)=nf90_inquire_variable(ifile_id,ivar_id,xtype=itype)
382  iret(1)=nf90_inquire_variable(ifile_id,ivar_id,ndims=indims)
383  iret(1)=nf90_inquire_variable(ifile_id,ivar_id,dimids=idimids(1:indims))
384  idimlen(:) = 1.
385  DO jdim=1,indims
386  jret=nf90_inquire_dimension(ifile_id,idimids(jdim),len=idimlen(jdim))
387  ENDDO
388  !
389  ALLOCATE(istart(indims))
390  ALLOCATE(icount(indims))
391  !
392  ! 2. Get variable
393  !----------------------------
394  IF (lpartr) THEN
395  ! write partially a time-matrix.
396  ! Have to find which of the dimension is the time dimension
397  icount(:) = 1.
398  ALLOCATE(istride(indims))
399  DO jdim=1,indims
400  iret=nf90_inquire_dimension(ifile_id,idimids(jdim),name=yout)
401  IF ((index(yout,'time') > 0).OR.(index(yout,'TIME') >0) &
402  .OR.(index(yout,'Time')>0.)) THEN
403  istart(jdim)=xstart
404  icount(jdim)=xcount
405  istride(jdim)=xstride
406  ELSE
407  istart(jdim)=1
408  icount(jdim)=idimlen(jdim)
409  istride(jdim)=1
410  ENDIF
411  ENDDO
412 
413  ALLOCATE(zwork2(product(icount(1:indims-1)),icount(indims)))
414  IF (itype==nf90_double) THEN
415  iret(2)=nf90_get_var(ifile_id,ivar_id,zwork2,istart,icount,istride)
416  ELSEIF (itype==nf90_float) THEN
417  ALLOCATE(ztab_2d4(product(icount(1:indims-1)),icount(indims)))
418  iret(2)=nf90_get_var(ifile_id,ivar_id,ztab_2d4,istart,icount,istride)
419  zwork2(:,:) = ztab_2d4(:,:)
420  DEALLOCATE(ztab_2d4)
421  ENDIF
422  DEALLOCATE(istride)
423 
424  ELSE
425 
426  istart(:) = 1
427  icount(1:indims) = idimlen(1:indims)
428 
429  ALLOCATE(zwork2(product(idimlen(1:indims-1)),idimlen(indims)))
430  IF (itype==nf90_double) THEN
431  iret(2)=nf90_get_var(ifile_id,ivar_id,zwork2)
432  ELSEIF (itype==nf90_float) THEN
433  ALLOCATE(ztab_2d4(product(idimlen(1:indims-1)),idimlen(indims)))
434  iret(2)=nf90_get_var(ifile_id,ivar_id,ztab_2d4)
435  zwork2(:,:) = ztab_2d4(:,:)
436  DEALLOCATE(ztab_2d4)
437  ENDIF
438  ENDIF
439 
440  DEALLOCATE(istart)
441  DEALLOCATE(icount)
442 
443  ENDIF
444 
445  ! 3. Check for errors
446  !--------------------
447  DO jret=1,2
448  IF ((ifile_id==0).OR.iret(jret).NE.nf90_noerr) THEN
449  zwork2 = xundef
450  kresp=1
451  ELSE
452  IF (minval(zwork2)==xundef) THEN
453  kresp=1
454  zwork2 = xundef
455  ENDIF
456  ENDIF
457  ENDDO
458  !
459  IF (kresp /=0) CALL error_read_surf_ol(hrec,kresp)
460  !
461 ELSE
462  ALLOCATE(zwork2(0,0))
463 ENDIF
464 !
465 #ifdef SFX_MPI
466 xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
467 #endif
468 !
469 IF (lmask) THEN
470  CALL read_and_send_mpi(zwork2,pfield,nmask)
471 ELSE
472  CALL read_and_send_mpi(zwork2,pfield)
473 END IF
474 !
475 DEALLOCATE(zwork2)
476 !
477 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFX2_OL',1,zhook_handle)
478 !
479 END SUBROUTINE read_surfx2_ol
480 !
481 ! #############################################################
482  SUBROUTINE read_surfx3_ol(HREC,PFIELD,KRESP,HCOMMENT,HDIR)
483 ! #############################################################
484 !
485 !!**** *READX3* - routine to fill a real 2D array for the externalised surface
486 !
488 !
490 USE modd_surf_par, ONLY: xundef
491 !
492 USE modi_ol_find_file_read
493 USE modi_error_read_surf_ol
495 !
496 USE yomhook ,ONLY : lhook, dr_hook
497 USE parkind1 ,ONLY : jprb
498 !
499 USE netcdf
500 !
501 IMPLICIT NONE
502 !
503 !
504 #ifdef SFX_MPI
505 include "mpif.h"
506 #endif
507 !
508 !* 0.1 Declarations of arguments
509 !
510  CHARACTER(LEN=*), INTENT(IN) :: HREC ! name of the article to be read
511 REAL, DIMENSION(:,:,:), INTENT(OUT) :: PFIELD ! array containing the data field
512 INTEGER, INTENT(OUT) :: KRESP ! KRESP : return-code if a problem appears
513  CHARACTER(LEN=100), INTENT(OUT) :: HCOMMENT ! comment
514  CHARACTER(LEN=1), INTENT(IN) :: HDIR ! type of field :
515  ! 'H' : field with
516  ! horizontal spatial dim.
517  ! '-' : no horizontal dim.
518 !* 0.2 Declarations of local variables
519 !
520  CHARACTER(LEN=100) :: YFILE,YOUT ! filename
521 INTEGER :: IVAR_ID,IFILE_ID,JRET,JDIM,INDIMS,ITYPE
522 INTEGER,DIMENSION(3) :: IDIMIDS,IDIMLEN
523 INTEGER,DIMENSION(2) :: IRET
524 INTEGER, DIMENSION(:), ALLOCATABLE :: ISTART,ISTRIDE,ICOUNT
525 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWORK3
526 REAL*4, DIMENSION(:,:,:), ALLOCATABLE :: ZTAB_3D4
527 DOUBLE PRECISION :: XTIME0
528 REAL(KIND=JPRB) :: ZHOOK_HANDLE
529 !
530 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFX3_OL',0,zhook_handle)
531 !
532 kresp=0
533 !
534 hcomment = " "
535 !
536 #ifdef SFX_MPI
537 xtime0 = mpi_wtime()
538 #endif
539 !
540 IF (nrank==npio) THEN
541  !
542  ! 0. find filename
543  ! -----------------
544  CALL ol_find_file_read(hrec,ifile_id)
545  !
546  IF (ifile_id.NE.0) THEN
547  !
548  ! 1. Find id of the variable
549  !----------------------------
550  iret(1)=nf90_inq_varid(ifile_id,hrec,ivar_id)
551  iret(1)=nf90_inquire_variable(ifile_id,ivar_id,xtype=itype)
552  iret(1)=nf90_inquire_variable(ifile_id,ivar_id,ndims=indims)
553  iret(1)=nf90_inquire_variable(ifile_id,ivar_id,dimids=idimids(1:indims))
554  DO jdim=1,indims
555  jret=nf90_inquire_dimension(ifile_id,idimids(jdim),len=idimlen(jdim))
556  ENDDO
557  !
558  ALLOCATE(istart(indims))
559  ALLOCATE(icount(indims))
560  !
561  ! 2. Get variable
562  !----------------------------
563  IF (lpartr) THEN
564  ! write partially a time-matrix.
565  ! Have to find which of the dimension is the time dimension
566  ALLOCATE(istride(indims))
567  DO jdim=1,indims
568  iret=nf90_inquire_dimension(ifile_id,idimids(jdim),name=yout)
569  IF ((index(yout,'time') > 0).OR.(index(yout,'TIME') >0) &
570  .OR.(index(yout,'Time')>0.)) THEN
571  istart(jdim)=xstart
572  icount(jdim)=xcount
573  istride(jdim)=xstride
574  ELSE
575  istart(jdim)=1
576  icount(jdim)=idimlen(jdim)
577  istride(jdim)=1
578  ENDIF
579  ENDDO
580 
581  ALLOCATE(zwork3(icount(1),icount(2),icount(3)))
582 
583  IF (itype==nf90_double) THEN
584  iret(2)=nf90_get_var(ifile_id,ivar_id,zwork3,istart,icount,istride)
585  ELSEIF (itype==nf90_float) THEN
586  ALLOCATE(ztab_3d4(icount(1),icount(2),icount(3)))
587  iret(2)=nf90_get_var(ifile_id,ivar_id,ztab_3d4,istart,icount,istride)
588  zwork3(:,:,:) = ztab_3d4(:,:,:)
589  DEALLOCATE(ztab_3d4)
590  ENDIF
591  DEALLOCATE(istride)
592  !
593  ELSE
594 
595  istart(:) = 1
596  icount(1:indims) = idimlen(1:indims)
597 
598  ALLOCATE(zwork3(idimlen(1),idimlen(2),idimlen(3)))
599  IF (itype==nf90_double) THEN
600  iret(2)=nf90_get_var(ifile_id,ivar_id,zwork3)
601  ELSEIF (itype==nf90_float) THEN
602  ALLOCATE(ztab_3d4(icount(1),icount(2),icount(3)))
603  iret(2)=nf90_get_var(ifile_id,ivar_id,ztab_3d4)
604  zwork3(:,:,:) = ztab_3d4(:,:,:)
605  DEALLOCATE(ztab_3d4)
606  ENDIF
607 
608  ENDIF
609  !
610  DEALLOCATE(istart)
611  DEALLOCATE(icount)
612  !
613  ENDIF
614  !
615  ! 3. Check for errors
616  !--------------------
617  DO jret=1,2
618  IF ((ifile_id==0).OR.iret(jret).NE.nf90_noerr) THEN
619  zwork3 = xundef
620  kresp = 1
621  ELSE
622  IF (minval(zwork3)==xundef) THEN
623  kresp = 1
624  zwork3 = xundef
625  ENDIF
626  ENDIF
627  ENDDO
628  !
629  IF (kresp /=0) CALL error_read_surf_ol(hrec,kresp)
630  !
631 ELSE
632  ALLOCATE(zwork3(0,0,0))
633 ENDIF
634 !
635 #ifdef SFX_MPI
636 xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
637 #endif
638 !
639 IF (lmask) THEN
640  CALL read_and_send_mpi(zwork3,pfield,nmask)
641 ELSE
642  CALL read_and_send_mpi(zwork3,pfield)
643 END IF
644 !
645 DEALLOCATE(zwork3)
646 !
647 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFX3_OL',1,zhook_handle)
648 !
649 END SUBROUTINE read_surfx3_ol
650 !
651 ! #############################################################
652  SUBROUTINE read_surfn0_ol(HREC,KFIELD,KRESP,HCOMMENT)
653 ! #############################################################
654 !
655 !!**** *READN0* - routine to read an integer
656 !
657 USE modd_surf_par, ONLY: nundef
658 !
659 USE modi_ol_find_file_read
660 USE modi_error_read_surf_ol
661 !
662 USE yomhook ,ONLY : lhook, dr_hook
663 USE parkind1 ,ONLY : jprb
664 !
665 USE netcdf
666 !
667 IMPLICIT NONE
668 !
669 !
670 !* 0.1 Declarations of arguments
671 !
672  CHARACTER(LEN=*), INTENT(IN) :: HREC ! name of the article to be read
673 INTEGER, INTENT(OUT) :: KFIELD ! the integer scalar to be read
674 INTEGER, INTENT(OUT) :: KRESP ! KRESP : return-code if a problem appears
675  CHARACTER(LEN=100), INTENT(OUT) :: HCOMMENT ! comment
676 !
677 !
678 !* 0.2 Declarations of local variables
679 !
680  CHARACTER(LEN=100):: YFILE ! filename
681 INTEGER :: IVAR_ID,IFILE_ID,JRET,JDIM,INDIMS
682 INTEGER,DIMENSION(4) :: IRET
683 REAL(KIND=JPRB) :: ZHOOK_HANDLE
684 !
685 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFN0_OL',0,zhook_handle)
686 !
687 kresp=0
688 hcomment = " "
689 !
690 ! 0. find filename
691 ! -----------------
692  CALL ol_find_file_read(hrec,ifile_id)
693 !
694 IF (ifile_id.NE.0) THEN
695  !
696  ! 1. Find id of the variable
697  !----------------------------
698  iret(1)=nf90_inq_varid(ifile_id,hrec,ivar_id)
699  !
700  ! 2. Get variable
701  !----------------------------
702  iret(2)=nf90_get_var(ifile_id,ivar_id,kfield)
703  !
704 ENDIF
705 !
706 ! 3. Check for errors
707 !--------------------
708 DO jret=1,2
709  IF ((kfield==nundef).OR.(ifile_id==0).OR.iret(jret).NE.nf90_noerr) THEN
710  kfield=nundef
711  kresp=1
712  ENDIF
713 ENDDO
714 !
715 IF (kresp /=0) CALL error_read_surf_ol(hrec,kresp)
716 !
717 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFN0_OL',1,zhook_handle)
718 !
719 END SUBROUTINE read_surfn0_ol
720 !
721 ! #############################################################
722  SUBROUTINE read_surfn1_ol(HREC,KFIELD,KRESP,HCOMMENT,HDIR)
723 ! #############################################################
724 !
725 !!**** *READN0* - routine to read an integer
726 !
727 USE yomhook ,ONLY : lhook, dr_hook
728 USE parkind1 ,ONLY : jprb
729 !
730 USE netcdf
731 !
732 IMPLICIT NONE
733 !
734 !* 0.1 Declarations of arguments
735 !
736  CHARACTER(LEN=*), INTENT(IN) :: HREC ! name of the article to be read
737 INTEGER, DIMENSION(:), INTENT(OUT) :: KFIELD ! the integer scalar to be read
738 INTEGER, INTENT(OUT) :: KRESP ! KRESP : return-code if a problem appears
739  CHARACTER(LEN=100), INTENT(OUT) :: HCOMMENT ! comment
740  CHARACTER(LEN=1), INTENT(IN) :: HDIR ! type of field :
741  ! 'H' : field with
742  ! horizontal spatial dim.
743  ! '-' : no horizontal dim.
744 !* 0.2 Declarations of local variables
745 !
746 REAL, DIMENSION(SIZE(KFIELD)) :: ZFIELD
747 REAL(KIND=JPRB) :: ZHOOK_HANDLE
748 !
749 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFN1_OL',0,zhook_handle)
750 !
751  CALL read_surfx1_ol(hrec,zfield,kresp,hcomment,hdir)
752 kfield = nint(zfield)
753 !
754 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFN1_OL',1,zhook_handle)
755 !
756 END SUBROUTINE read_surfn1_ol
757 !
758 ! #############################################################
759  SUBROUTINE read_surfc0_ol(HREC,HFIELD,KRESP,HCOMMENT)
760 ! #############################################################
761 !
762 !!**** *READC0* - routine to read a STRING
763 !
764 USE modi_ol_find_file_read
765 USE modi_error_read_surf_ol
766 !
767 USE modd_surf_par, ONLY: xundef
768 !
769 USE yomhook ,ONLY : lhook, dr_hook
770 USE parkind1 ,ONLY : jprb
771 !
772 USE netcdf
773 !
774 IMPLICIT NONE
775 !
776 !
777 !* 0.1 Declarations of arguments
778 !
779  CHARACTER(LEN=*), INTENT(IN) :: HREC ! name of the article to be read
780  CHARACTER(LEN=40), INTENT(OUT) :: HFIELD ! the integer scalar to be read
781 INTEGER, INTENT(OUT) :: KRESP ! KRESP : return-code if a problem appears
782  CHARACTER(LEN=100), INTENT(OUT) :: HCOMMENT ! comment
783 !
784 !* 0.2 Declarations of local variables
785 !
786  CHARACTER(LEN=100):: YFILE ! filename
787  CHARACTER(LEN=100):: YFIELD
788 INTEGER :: IVAR_ID,IFILE_ID,JRET,JDIM,INDIMS
789 INTEGER,DIMENSION(4) :: IRET
790 REAL(KIND=JPRB) :: ZHOOK_HANDLE
791 !
792 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFC0_OL',0,zhook_handle)
793 !
794 kresp=0
795 hcomment = " "
796 !
797 ! 0. find filename
798 ! -----------------
799  CALL ol_find_file_read(hrec,ifile_id)
800 !
801 IF (ifile_id.NE.0) THEN
802  !
803  ! 1. Find id of the variable
804  !----------------------------
805  iret(1)=nf90_inq_varid(ifile_id,hrec,ivar_id)
806  !
807  ! 2. Get variable
808  !----------------------------
809  iret(2)=nf90_get_var(ifile_id,ivar_id,yfield)
810  hfield=yfield(:len_trim(yfield))
811  !
812 ENDIF
813 
814 ! 3. Check for errors
815 !--------------------
816 DO jret=1,2
817  IF ((ifile_id==0).OR.iret(jret).NE.nf90_noerr) THEN
818  kresp=1
819  ENDIF
820 ENDDO
821 !
822 IF (kresp /=0) CALL error_read_surf_ol(hrec,kresp)
823 !
824 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFC0_OL',1,zhook_handle)
825 !
826 END SUBROUTINE read_surfc0_ol
827 !
828 ! #############################################################
829  SUBROUTINE read_surfl0_ol(HREC,OFIELD,KRESP,HCOMMENT)
830 ! #############################################################
831 !
832 !!**** *READL0* - routine to read a logical
833 !
834 USE modi_ol_find_file_read
835 USE modi_error_read_surf_ol
836 !
837 USE modd_surf_par, ONLY: xundef
838 !
839 USE yomhook ,ONLY : lhook, dr_hook
840 USE parkind1 ,ONLY : jprb
841 !
842 USE netcdf
843 !
844 IMPLICIT NONE
845 !
846 !
847 !* 0.1 Declarations of arguments
848 !
849  CHARACTER(LEN=*), INTENT(IN) :: HREC ! name of the article to be read
850 LOGICAL, INTENT(OUT) :: OFIELD ! array containing the data field
851 INTEGER, INTENT(OUT) :: KRESP ! KRESP : return-code if a problem appears
852  CHARACTER(LEN=100), INTENT(OUT) :: HCOMMENT ! comment
853 !
854 !* 0.2 Declarations of local variables
855 !
856  CHARACTER(LEN=1) :: YFIELD ! work array read in the file
857  CHARACTER(LEN=100) :: YFILE ! Filename
858 INTEGER :: IVAR_ID,IFILE_ID, JRET
859 INTEGER,DIMENSION(2) :: IRET
860 REAL(KIND=JPRB) :: ZHOOK_HANDLE
861 !
862 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFL0_OL',0,zhook_handle)
863 !
864 kresp=0
865 hcomment = " "
866 !
867 ! 0. find filename
868 ! -----------------
869  CALL ol_find_file_read(hrec,ifile_id)
870 !
871 IF (ifile_id.NE.0) THEN
872  !
873  ! 1. Find id of the variable
874  !----------------------------
875  iret(1)=nf90_inq_varid(ifile_id,hrec,ivar_id)
876  !
877  ! 2. Get variable
878  !----------------------------
879  iret(2)=nf90_get_var(ifile_id,ivar_id,yfield)
880  !
881  IF (yfield =='T') ofield=.true.
882  IF (yfield =='F') ofield=.false.
883  !
884 ENDIF
885 !
886 ! 3. Check for errors
887 !--------------------
888 IF ((ifile_id==0).OR.iret(1).NE.nf90_noerr) THEN
889  kresp=1
890 ENDIF
891 !
892 IF (kresp /=0) CALL error_read_surf_ol(hrec,kresp)
893 !
894 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFL0_OL',1,zhook_handle)
895 !
896 END SUBROUTINE read_surfl0_ol
897 !
898 ! #############################################################
899  SUBROUTINE read_surfl1_ol(HREC,OFIELD,KRESP,HCOMMENT,HDIR)
900 ! #############################################################
901 !
902 !!**** *READL1* - routine to read a logical array
903 !
905 !
906 USE modi_ol_find_file_read
907 USE modi_error_read_surf_ol
908 !
909 USE modd_surf_par, ONLY: xundef
910 !
911 USE yomhook ,ONLY : lhook, dr_hook
912 USE parkind1 ,ONLY : jprb
913 !
914 USE netcdf
915 !
916 IMPLICIT NONE
917 !
918 !
919 #ifdef SFX_MPI
920 include "mpif.h"
921 #endif
922 !
923 !* 0.1 Declarations of arguments
924 !
925  CHARACTER(LEN=*), INTENT(IN) :: HREC ! name of the article to be read
926 LOGICAL, DIMENSION(:), INTENT(OUT) :: OFIELD ! array containing the data field
927 INTEGER, INTENT(OUT) :: KRESP ! KRESP : return-code if a problem appears
928  CHARACTER(LEN=100), INTENT(OUT) :: HCOMMENT ! comment
929  CHARACTER(LEN=1), INTENT(IN) :: HDIR ! type of field :
930  ! 'H' : field with
931  ! horizontal spatial dim.
932  ! '-' : no horizontal dim.
933 !* 0.2 Declarations of local variables
934 !
935  CHARACTER(LEN=100) :: YFILE ! Filename
936  CHARACTER(LEN=1), DIMENSION(:), ALLOCATABLE :: YTAB_1D ! work array read in the file
937 !
938 INTEGER :: IVAR_ID,IFILE_ID,JRET,JDIM,INDIMS
939 INTEGER :: INFOMPI
940 INTEGER,DIMENSION(1) :: IDIMIDS,IDIMLEN
941 INTEGER,DIMENSION(2) :: IRET
942 INTEGER, DIMENSION(:), POINTER :: IMASK ! 1D mask to read only interesting
943 DOUBLE PRECISION :: XTIME0
944 REAL(KIND=JPRB) :: ZHOOK_HANDLE
945 !
946 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFL1_OL',0,zhook_handle)
947 !
948 kresp=0
949 !
950 hcomment = " "
951 !
952 #ifdef SFX_MPI
953 xtime0 = mpi_wtime()
954 #endif
955 !
956 IF (nrank==npio) THEN
957  !
958  !
959  ! 0. find filename
960  ! -----------------
961  CALL ol_find_file_read(hrec,ifile_id)
962  !
963  IF (ifile_id.NE.0) THEN
964  !
965  ! 1. Find id of the variable
966  !----------------------------
967  iret(1)=nf90_inq_varid(ifile_id,hrec,ivar_id)
968  iret(1)=nf90_inquire_variable(ifile_id,ivar_id,ndims=indims)
969  iret(1)=nf90_inquire_variable(ifile_id,ivar_id,dimids=idimids)
970  DO jdim=1,indims
971  jret=nf90_inquire_dimension(ifile_id,idimids(jdim),len=idimlen(jdim))
972  ENDDO
973  ALLOCATE(ytab_1d(idimlen(1)))
974  !
975  ! 2. Get variable
976  !----------------------------
977  iret(1)=nf90_get_var(ifile_id,ivar_id,ytab_1d)
978  !
979  DO jret=1,idimlen(1)
980  IF (ytab_1d(jret) =='T') ofield(jret)=.true.
981  IF (ytab_1d(jret) =='F') ofield(jret)=.false.
982  ENDDO
983  !
984  ENDIF
985  !
986  ! 3. Check for errors
987  !--------------------
988  DO jret=1,1
989  IF ((ifile_id==0).OR.iret(jret).NE.nf90_noerr) THEN
990  kresp=1
991  ENDIF
992  ENDDO
993  !
994  DEALLOCATE(ytab_1d)
995  !
996  IF (kresp /=0) CALL error_read_surf_ol(hrec,kresp)
997  !
998 ENDIF
999 !
1000 #ifdef SFX_MPI
1001 xtime_npio_read = xtime_npio_read + (mpi_wtime() - xtime0)
1002 #endif
1003 !
1004 IF (nproc>1) THEN
1005 #ifdef SFX_MPI
1006  xtime0 = mpi_wtime()
1007  CALL mpi_bcast(ofield,SIZE(ofield),mpi_logical,npio,ncomm,infompi)
1008  xtime_comm_read = xtime_comm_read + (mpi_wtime() - xtime0)
1009 #endif
1010 ENDIF
1011 !
1012 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFL1_OL',1,zhook_handle)
1013 !
1014 END SUBROUTINE read_surfl1_ol
1015 !
1016 !
1017 ! #############################################################
1018  SUBROUTINE read_surft0_ol(HREC,KYEAR,KMONTH,KDAY,PTIME,KRESP,HCOMMENT)
1019 ! #############################################################
1020 !
1021 !!**** *READT0* - routine to read a NETCDF date_time scalar
1022 !
1023 USE modi_ol_find_file_read
1024 USE modi_error_read_surf_ol
1025 !
1026 USE modd_surf_par, ONLY: xundef
1027 !
1028 USE yomhook ,ONLY : lhook, dr_hook
1029 USE parkind1 ,ONLY : jprb
1030 !
1031 USE netcdf
1032 !
1033 IMPLICIT NONE
1034 !
1035 !
1036 !* 0.1 Declarations of arguments
1037 !
1038  CHARACTER(LEN=*), INTENT(IN) :: HREC ! name of the article to be read
1039 INTEGER, INTENT(OUT) :: KYEAR ! year
1040 INTEGER, INTENT(OUT) :: KMONTH ! month
1041 INTEGER, INTENT(OUT) :: KDAY ! day
1042 REAL, INTENT(OUT) :: PTIME ! time
1043 INTEGER, INTENT(OUT) :: KRESP ! KRESP : return-code if a problem appears
1044  CHARACTER(LEN=100), INTENT(OUT) :: HCOMMENT ! comment
1045 
1046 !
1047 !* 0.2 Declarations of local variables
1048 !
1049  CHARACTER(LEN=18) :: YRECFM ! Name of the article to be written
1050  CHARACTER(LEN=100) :: YFILE ! Filename
1051 INTEGER :: IVAR_ID,IFILE_ID,JRET,JDIM,INDIMS,JWRK
1052 INTEGER, DIMENSION(1) :: IDIMIDS,IDIMLEN
1053 INTEGER, DIMENSION(4) :: IRET
1054 INTEGER, DIMENSION(3) :: ITDATE ! work array read in the file
1055 INTEGER, DIMENSION(:), POINTER :: IMASK ! 1D mask to read only interesting
1056 REAL:: ZTIME
1057 REAL(KIND=JPRB) :: ZHOOK_HANDLE
1058 !
1059 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFT0_OL',0,zhook_handle)
1060 !
1061 kresp=0
1062 hcomment = " "
1063 !
1064 DO jwrk=1,2
1065  IF (jwrk == 1) THEN
1066  yrecfm=trim(hrec)//'-TDATE'
1067  ELSE
1068  yrecfm=trim(hrec)//'-TIME'
1069  ENDIF
1070 ! 0. find filename
1071 ! -----------------
1072  CALL ol_find_file_read(yrecfm,ifile_id)
1073  !
1074  IF (ifile_id.NE.0) THEN
1075  !
1076  ! 1. Find id of the variable
1077  !----------------------------
1078  jret=nf90_inq_varid(ifile_id,yrecfm,ivar_id)
1079  !
1080  ! 2. Get variable
1081  !----------------------------
1082  IF (jwrk == 1) THEN
1083  iret(jwrk)=nf90_get_var(ifile_id,ivar_id,itdate)
1084  kyear = itdate(1)
1085  kmonth = itdate(2)
1086  kday = itdate(3)
1087  ELSE
1088  iret(jwrk)=nf90_get_var(ifile_id,ivar_id,ptime)
1089  ENDIF
1090  ENDIF
1091 ENDDO
1092 !
1093 ! 3. Check for errors
1094 !--------------------
1095 DO jret=1,2
1096  IF ((ifile_id==0).OR.iret(jret).NE.nf90_noerr) THEN
1097  kresp=1
1098  ENDIF
1099 ENDDO
1100 IF (kresp /=0) CALL error_read_surf_ol(yrecfm,kresp)
1101 !
1102 IF (lhook) CALL dr_hook('MODE_READ_SURF_OL:READ_SURFT0_OL',1,zhook_handle)
1103 !
1104 END SUBROUTINE read_surft0_ol
1105 !
1106 END MODULE mode_read_surf_ol
subroutine read_surfl1_ol(HREC, OFIELD, KRESP, HCOMMENT, HDIR)
quick &counting sorts only inumt inumt name
integer, dimension(:), pointer nmask
subroutine read_surfx2_ol(HREC, PFIELD, KRESP, HCOMMENT, HDIR)
subroutine ol_find_file_read(HNAME, IFILE_ID)
subroutine read_surfn0_ol(HREC, KFIELD, KRESP, HCOMMENT)
subroutine read_surfx0_ol(HREC, PFIELD, KRESP, HCOMMENT)
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
integer, parameter nundef
subroutine read_surfc0_ol(HREC, HFIELD, KRESP, HCOMMENT)
subroutine read_surft0_ol(HREC, KYEAR, KMONTH, KDAY, PTIME, KRESP, HCOMMENT)
logical lhook
Definition: yomhook.F90:15
subroutine read_surfn1_ol(HREC, KFIELD, KRESP, HCOMMENT, HDIR)
subroutine read_surfx3_ol(HREC, PFIELD, KRESP, HCOMMENT, HDIR)
subroutine read_surfx1_ol(HREC, PFIELD, KRESP, HCOMMENT, HDIR)
ERROR in index
Definition: ecsort_shared.h:90
subroutine error_read_surf_ol(HREC, KRESP)
subroutine read_surfl0_ol(HREC, OFIELD, KRESP, HCOMMENT)