SURFEX v8.1
General documentation of Surfex
mode_read_surf_cov.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.
5 
7 !
8 INTERFACE write_read_cov
9  MODULE PROCEDURE read_surf_cov
10 END INTERFACE
11 !
12 CONTAINS
13 
14 ! #############################################################
15  SUBROUTINE read_surf_cov (HPROGRAM,HREC,PFIELD,OFLAG,KRESP,HCOMMENT,HDIR)
16 ! #############################################################
17 !
18 !
19 !
21 USE modd_surf_par, ONLY : xundef
22 !
23 #ifdef SFX_LFI
24 USE modd_io_surf_lfi, ONLY : nmask_lfi=>nmask, nfull_lfi=>nfull
25 #endif
26 #ifdef SFX_NC
27 USE modd_io_surf_nc, ONLY : nmask_nc=>nmask, nfull_nc=>nfull
28 #endif
29 #ifdef SFX_ASC
30 USE modd_io_surf_asc, ONLY : nmask_asc=>nmask, nfull_asc=>nfull
31 #endif
32 #ifdef SFX_FA
33 USE modd_io_surf_fa, ONLY : nmask_fa=>nmask, nfull_fa=>nfull
34 #endif
35 #ifdef SFX_MNH
36 USE modi_read_surfx2cov_mnh
37 #endif
38 !
42 USE modi_abor1_sfx
43 #ifdef SFX_ARO
44 USE modi_read_surfx1_aro
45 #endif
46 !
47 USE yomhook ,ONLY : lhook, dr_hook
48 USE parkind1 ,ONLY : jprb
49 !
50 IMPLICIT NONE
51 !
52 #ifdef SFX_MPI
53 include "mpif.h"
54 #endif
55 !
56 !* 0.1 Declarations of arguments
57 !
58 !
59 !
60  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! calling program
61  CHARACTER(LEN=*), INTENT(IN) :: HREC ! name of the article to be read
62 REAL, DIMENSION(:,:), INTENT(OUT) :: PFIELD ! array containing the data field
63 LOGICAL,DIMENSION(:), INTENT(IN) :: OFLAG ! mask for array filling
64 INTEGER, INTENT(OUT) :: KRESP ! KRESP : return-code if a problem appears
65  CHARACTER(LEN=*), OPTIONAL, INTENT(OUT) :: HCOMMENT ! name of the article to be read
66  CHARACTER(LEN=1), OPTIONAL, INTENT(IN) :: HDIR ! type of field :
67 ! ! 'H' : field with
68 ! ! horizontal spatial dim.
69 ! ! '-' : no horizontal dim.
70 !* 0.2 Declarations of local variables
71 !
72 #ifdef SFX_MPI
73 INTEGER, DIMENSION(MPI_STATUS_SIZE,NPROC-1) :: ISTATUS
74 #endif
75 !INTEGER, DIMENSION(NPROC) :: ITREQ
76 REAL, DIMENSION(:),ALLOCATABLE :: ZWORKR
77 REAL, DIMENSION(:),ALLOCATABLE :: ZFIELD
78 INTEGER, DIMENSION(:), POINTER :: IMASKF
79 INTEGER, DIMENSION(COUNT(OFLAG)) :: IMASK
80  CHARACTER(LEN=100) :: YCOMMENT
81  CHARACTER(LEN=12) :: YREC
82  CHARACTER(LEN=16) :: YREC2
83  CHARACTER(LEN=1) :: YDIR
84  CHARACTER(LEN=4) :: YLVL
85 INTEGER :: IFLAG
86 INTEGER :: IPIO_SAVE, IPAS, JP, IDEB, IFIN, JJ
87 INTEGER :: JCOVER, JPROC, IPROC
88 INTEGER :: IL1, IL2, IDX_SAVE, IDX, IVAL
89 INTEGER :: INFOMPI, IREQ, JPROC2, IFULL
90 REAL(KIND=JPRB) :: ZHOOK_HANDLE, ZHOOK_HANDLE_OMP
91 !
92 IF (lhook) CALL dr_hook('READ_SURF_COV_1',0,zhook_handle)
93 !
94 idx_save = idx_r
95 yrec = hrec
96 ycomment="empty"
97 ydir = 'H'
98 IF (PRESENT(hdir)) ydir = hdir
99 !
100 il1 = SIZE(pfield,1)
101 il2 = count(oflag)
102 !
103 IF (lhook) CALL dr_hook('READ_SURF_COV_1',1,zhook_handle)
104 !
105 IF (hprogram=='MESONH') THEN
106 #ifdef SFX_MNH
107  yrec2 = yrec
108  CALL read_surfx2cov_mnh(yrec2,il1,il2,pfield,oflag,kresp,ycomment,ydir)
109 #endif
110 ELSE
111  !
112  IF (lhook) CALL dr_hook('READ_SURF_COV_2',0,zhook_handle)
113  !
114  !mask associating the index of the cover in xcover to its real number
115  jcover = 0
116  DO jj = 1,SIZE(oflag)
117  IF (oflag(jj)) THEN
118  jcover=jcover+1
119  imask(jcover) = jj
120  ENDIF
121  ENDDO
122  !
123  !the mask to call read_and_send_mpi depends on the I/O type
124  IF (hprogram=='LFI ') THEN
125 #ifdef SFX_LFI
126  ifull = nfull_lfi
127  ALLOCATE(zfield(nfull_lfi))
128  imaskf=>nmask_lfi
129 #endif
130  ELSEIF (hprogram=='ASCII ') THEN
131 #ifdef SFX_ASC
132  ifull = nfull_asc
133  ALLOCATE(zfield(nfull_asc))
134  imaskf=>nmask_asc
135 #endif
136  ELSEIF (hprogram=='FA ') THEN
137 #ifdef SFX_FA
138  ifull = nfull_fa
139  ALLOCATE(zfield(nfull_fa))
140  imaskf=>nmask_fa
141 #endif
142  ELSEIF (hprogram=='NC ') THEN
143 #ifdef SFX_NC
144  ifull = nfull_nc
145  ALLOCATE(zfield(nfull_nc))
146  imaskf=>nmask_nc
147 #endif
148  ENDIF
149  !
150  !if we want to get covers for the current task or for the whole domain
151  IF (ydir=='H') THEN
152  !second dimension because the reading of covers is parallelized with MPI
153  ALLOCATE(zworkr(nsize))
154  ELSEIF (nrank==npio) THEN
155  ALLOCATE(zworkr(ifull))
156  ELSE
157  ALLOCATE(zworkr(0))
158  ENDIF
159  zworkr(:) = 0.
160  !
161  IF (nproc>1 .AND. ydir=='H') THEN
162  iflag = 0
163  !for the parallelization of reading, NINDEX must be known by all tasks
164  IF (nrank/=npio) THEN
165  IF (ALLOCATED(nindex)) THEN
166  IF (SIZE(nindex)==ifull) iflag=1
167  DEALLOCATE(nindex)
168  ENDIF
169  ALLOCATE(nindex(ifull))
170  ENDIF
171 #ifdef SFX_MPI
172  CALL mpi_bcast(nindex,SIZE(nindex)*kind(nindex)/4,mpi_integer,npio,ncomm,infompi)
173 #endif
174  ENDIF
175  !
176  ipio_save = npio
177  !number of covers read by each task
178  ipas = ceiling(il2*1./nproc)
179  !
180  pfield(:,:) = 0.
181  !
182  !first cover number read by the current task
183  ideb = ipas*nrank
184  !
185  IF (lhook) CALL dr_hook('READ_SURF_COV_2',1,zhook_handle)
186  !
187  DO jp = 1,ipas
188  !
189  IF (lhook) CALL dr_hook('READ_SURF_COV_3',0,zhook_handle)
190  !
191  !index of the cover read by this task at this loop index
192  jcover = ideb + jp
193  !
194  IF (jcover<=il2) THEN
195  !
196  !real number of the cover
197  jj = imask(jcover)
198  !
199  IF (trim(hrec)=='COVER') THEN
200  WRITE(yrec,'(A5,I3.3)') trim(hrec),jj
201  ELSE
202  WRITE(ylvl,'(I4)') jj
203  yrec = trim(hrec)//adjustl(ylvl(:len_trim(ylvl)))
204  ENDIF
205  ycomment='X_Y_'//yrec
206  !
207  !
208  IF (hprogram=='AROME ') THEN
209 #ifdef ARO
210  CALL read_surfx1_aro(yrec,il1,pfield(:,jcover),kresp,ycomment,ydir)
211 #endif
212  ELSE
213  !
214  !reads one cover by task
215  !
216  !number of the I/O task for this read
217  npio = nrank
218  !
219  !reading of the whol cover (HDIR='A')
220  CALL read_surf(hprogram,yrec,zfield,kresp,ycomment,'A')
221  !
222  !NPIO rebecomes the I/O task
223  npio = ipio_save
224  !
225  idx = idx_save + jp
226  IF (ydir=='H') THEN
227  !
228  !send covers to other tasks
229  CALL read_and_send_mpi(zfield,pfield(:,jcover),imaskf,nrank,idx)
230  !
231  ELSEIF (ydir=='A' .OR. ydir=='E') THEN
232  !
233  !NPIO needs to know all covers read
234  IF (nrank/=npio) THEN
235  idx = idx + 1
236 #ifdef SFX_MPI
237  CALL mpi_send(zfield,SIZE(zfield)*kind(zfield)/4,mpi_real,npio,idx,ncomm,infompi)
238 #endif
239  ELSE
240  CALL pack_same_rank(imaskf,zfield,pfield(:,jcover))
241  ENDIF
242  !
243  ELSE
244  CALL abor1_sfx("READ_SURFX2COV:HDIR MUST BE H OR A OR E")
245  ENDIF
246  !
247  ENDIF
248  !
249  ENDIF
250  !
251  IF (lhook) CALL dr_hook('READ_SURF_COV_3',1,zhook_handle)
252  !
253  IF (nrank==npio .OR. ydir=='H') THEN
254  !
255  !receives pieces of cover fields
256  !ITREQ(:) = 0
257  !
258 !$OMP PARALLEL PRIVATE(ZHOOK_HANDLE_OMP)
259 IF (lhook) CALL dr_hook('READ_SURF_COV_4',0,zhook_handle_omp)
260 #ifdef SFX_MPI
261 !$OMP DO SCHEDULE(DYNAMIC,1) PRIVATE(JPROC,IDX,ISTATUS,INFOMPI) FIRSTPRIVATE(ZWORKR)
262 #endif
263  DO jproc=0,nproc-1
264  !
265  !the cover exists and was read
266  IF (ipas*jproc + jp<=il2) THEN
267  !
268  !IF (JPROC<NRANK) THEN
269  ! ITREQ(JPROC+1) = JPROC+1
270  !ELSE
271  ! ITREQ(JPROC+1) = JPROC
272  !ENDIF
273  !
274  IF (jproc/=nrank) THEN
275  idx = idx_save + jp + 1
276  !each task receives the part of the cover read that concerns it
277  !only NPIO in cas of HDIR/=H
278 #ifdef SFX_MPI
279  CALL mpi_recv(zworkr(:),SIZE(zworkr)*kind(zworkr)/4,&
280  mpi_real,jproc,idx,ncomm,istatus,infompi)
281 #endif
282  ival = ipas*jproc + jp
283  CALL pack_same_rank(imaskf,zworkr(:),pfield(:,ival))
284  !
285  ENDIF
286  !
287  ENDIF
288  !
289  ENDDO
290 #ifdef SFX_MPI
291 !$OMP END DO
292 #endif
293 IF (lhook) CALL dr_hook('READ_SURF_COV_4',1,zhook_handle_omp)
294 !$OMP END PARALLEL
295 
296 !
297  IF (lhook) CALL dr_hook('READ_SURF_COV_5',0,zhook_handle)
298  !
299  !waits that all cover pieces are sent
300 #ifdef SFX_MPI
301  IF (ydir=='H' .AND. ipas*nrank+jp<=il2 .AND. nproc>1) THEN
302  CALL mpi_waitall(nproc-1,nreq(1:nproc-1),istatus,infompi)
303  ENDIF
304 #endif
305  !
306  IF (lhook) CALL dr_hook('READ_SURF_COV_5',1,zhook_handle)
307  !
308 ! IF (YDIR=='H' .OR. NRANK==NPIO) THEN
309 ! !packs data
310 ! IREQ = MAXVAL(ITREQ)
311 !!$OMP PARALLEL PRIVATE(ZHOOK_HANDLE_OMP)
312 !IF (LHOOK) CALL DR_HOOK('READ_SURF_COV_6',0,ZHOOK_HANDLE_OMP)
313 !!$OMP DO SCHEDULE(DYNAMIC,1) PRIVATE(JPROC,IVAL)
314 ! DO JPROC=0,IREQ-1
315 ! IVAL = IPAS*JPROC + JP
316 ! IF (JPROC>=NRANK ) IVAL = IVAL + IPAS
317 ! CALL PACK_SAME_RANK(IMASKF,ZWORKR(:,JPROC+1),PFIELD(:,IVAL))
318 ! ENDDO
319 !!$OMP END DO
320 !IF (LHOOK) CALL DR_HOOK('READ_SURF_COV_6',1,ZHOOK_HANDLE_OMP)
321 !!$OMP END PARALLEL
322 ! ENDIF
323  !
324  ENDIF
325  !
326  ENDDO
327  !
328  IF (lhook) CALL dr_hook('READ_SURF_COV_7',0,zhook_handle)
329  !
330  IF (nrank/=npio .AND. ydir=='H' .AND. iflag==0) THEN
331  DEALLOCATE(nindex)
332  ALLOCATE(nindex(0))
333  ENDIF
334  !
335  idx_r = idx_r + ipas + 1
336  DEALLOCATE(zworkr)
337  IF (hprogram /= 'AROME ') THEN
338  DEALLOCATE(zfield)
339  ENDIF
340  imaskf=>null()
341  !
342  IF (lhook) CALL dr_hook('READ_SURF_COV_7',1,zhook_handle)
343  !
344 ENDIF
345 !
346 IF (lhook) CALL dr_hook('READ_SURF_COV_8',0,zhook_handle)
347 !
348 !RJ: what is a point of comment here? last field comment? Should be 'COVER_PACKED' status?
349 IF (PRESENT(hcomment)) hcomment = ycomment
350 !
351 IF (lhook) CALL dr_hook('READ_SURF_COV_8',1,zhook_handle)
352 !
353 END SUBROUTINE read_surf_cov
354 
355 END MODULE mode_read_surf_cov
static const char * trim(const char *name, int *n)
Definition: drhook.c:2383
integer, dimension(:), allocatable nreq
integer, dimension(:), pointer nmask
subroutine read_surf_cov(HPROGRAM, HREC, PFIELD, OFLAG, KRESP, HCOMMENT, HDIR)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
integer, dimension(:), pointer nmask
logical lhook
Definition: yomhook.F90:15
integer, dimension(:), allocatable nindex
static int count
Definition: memory_hook.c:21