SURFEX v8.1
General documentation of Surfex
read_direct_gauss.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 ! #########
6  SUBROUTINE read_direct_gauss (UG, U, USS, &
7  HPROGRAM,HSCHEME,HSUBROUTINE,HFILENAME,HFIELD,OMULTITYPE)
8 ! #########################################################
9 !
10 !!**** *READ_DIRECT_GAUSS1* reads a latlon file and call treatment subroutine
11 !!
12 !! PURPOSE
13 !! -------
14 !!
15 !! METHOD
16 !! ------
17 !!
18 !! EXTERNAL
19 !! --------
20 !!
21 !! IMPLICIT ARGUMENTS
22 !! ------------------
23 !!
24 !! REFERENCE
25 !! ---------
26 !!
27 !! AUTHOR
28 !! ------
29 !!
30 !! V. Masson Meteo-France
31 !!
32 !! MODIFICATION
33 !! ------------
34 !!
35 !! Original 11/09/95
36 !!
37 !! V. Masson, March 2010 Optimization of some lat/lon boundaries computations
38 !----------------------------------------------------------------------------
39 !
40 !* 0. DECLARATION
41 ! -----------
42 !
43 USE modd_surf_par, ONLY : xundef
44 USE modd_surfex_mpi, ONLY : nrank, nproc, npio
45 !
47 USE modd_surf_atm_n, ONLY : surf_atm_t
48 USE modd_sso_n, ONLY : sso_t
49 !
51 !
52 USE modd_arch, ONLY : little_endian_arch
53 !
54 USE modd_data_cover_par, ONLY : jpcover, ntype
55 !
56 USE modi_get_luout
57 USE modi_open_namelist
58 USE modi_close_namelist
59 USE modi_open_file
60 USE modi_close_file
61 USE modi_readhead
62 USE modi_ini_ssowork
63 USE modi_pt_by_pt_treatment
65 !
66 USE modi_uncompress_field
67 !
68 USE yomhook ,ONLY : lhook, dr_hook
69 USE parkind1 ,ONLY : jprb
70 !
71 USE modi_abor1_sfx
72 !
75 USE modi_refresh_pgdwork
76 !
77 USE modd_csts ,ONLY : xsurf_epsilon
78 !
79 IMPLICIT NONE
80 !
81 !* 0.1 Declaration of arguments
82 ! ------------------------
83 !
84 TYPE(surf_atm_grid_t), INTENT(INOUT) :: UG
85 TYPE(surf_atm_t), INTENT(INOUT) :: U
86 TYPE(sso_t), INTENT(INOUT) :: USS
87 !
88  CHARACTER(LEN=6), INTENT(IN) :: HPROGRAM ! Type of program
89  CHARACTER(LEN=6), INTENT(IN) :: HSCHEME ! Scheme treated
90  CHARACTER(LEN=6), INTENT(IN) :: HSUBROUTINE ! Name of the subroutine to call
91  CHARACTER(LEN=28), INTENT(IN) :: HFILENAME ! Name of the field file.
92  CHARACTER(LEN=20), INTENT(IN) :: HFIELD ! Name of the field.
93 LOGICAL, OPTIONAL, INTENT(IN) :: OMULTITYPE
94 !
95 !* 0.2 Declaration of local variables
96 ! ------------------------------
97 !
98  CHARACTER(LEN=28) :: YFILENAME ! Name of the field file without header
99  CHARACTER(LEN=28) :: YFILEHDR ! Name of the field file header
100 !
101  CHARACTER(LEN=7) :: YTYPE ! type of numerical field stored in the
102 ! ! direct access file ('INTEGER','REAL ')
103  CHARACTER(LEN=100):: YSTRING ! string
104  CHARACTER(LEN=88 ):: YSTRING1 ! part of string STRING
105 !
106  CHARACTER(LEN=2), DIMENSION(1) :: YCPT16 ! value of a data point
107  CHARACTER(LEN=4), DIMENSION(:), ALLOCATABLE :: YCPT32
108 !
109  CHARACTER, DIMENSION(:), ALLOCATABLE :: YVALUE8 ! value of a data point
110  CHARACTER(LEN=2), DIMENSION(:), ALLOCATABLE :: YVALUE16 ! value of a data point
111  CHARACTER(LEN=4), DIMENSION(:), ALLOCATABLE :: YVALUE32R ! value of a data point
112  CHARACTER(LEN=8), DIMENSION(:), ALLOCATABLE :: YVALUE64 ! value of a data point
113 !
114 REAL, DIMENSION(1) :: ZCPT
115 !
116 REAL :: ZGLBLATMIN ! minimum latitude of data box in the file
117 REAL :: ZGLBLONMIN ! minimum longitude of data box in the file
118 REAL :: ZGLBLATMAX ! maximum latitude of data box in the file
119 REAL :: ZGLBLONMAX ! maximum longitude of data box in the file
120 REAL :: ZNODATA, ZNODATA2 ! value below which data are not considered
121 REAL :: ZDLAT ! latitude mesh in the data file
122 REAL :: ZDLON ! longitude mesh in the data file
123 REAL :: ZLONMIN ! minimum longitude of mask mesh
124 REAL :: ZLONMAX ! maximum longitude of mask mesh
125 REAL :: ZLATMIN ! minimum latitude of mask mesh
126 REAL :: ZLATMAX ! maximum latitude of mask mesh
127 REAL :: ZSHIFT ! shift on longitudes
128 INTEGER :: IFACT ! Factor integer to real
129 INTEGER(KIND=2) :: INODATA, INODATA2
130 !
131 REAL, DIMENSION(:), ALLOCATABLE :: ZVALUE
132 REAL, DIMENSION(:), POINTER :: ZLAT ! latitude of data points
133 REAL, DIMENSION(:), POINTER :: ZLON ! longitude of data points
134 REAL(KIND=4), DIMENSION(:), ALLOCATABLE :: ZVALUE32 ! value of a data point
135 REAL, DIMENSION(:), ALLOCATABLE :: ZINTER ! value of a record of data points
136 REAL, DIMENSION(:), ALLOCATABLE :: ZVALUE_WORK ! value of a valid data points
137 REAL, DIMENSION(:), ALLOCATABLE :: ZLAT_WORK ! latitude of a valid data points
138 REAL, DIMENSION(:), ALLOCATABLE :: ZLON_WORK ! longitude of a valid data points
139 !
140 INTEGER :: IINDEX ! index of a character in string STRING1
141 INTEGER :: IBITS ! number of bits of a record in the
142  ! direct access file (16,32,64)
143 INTEGER :: IRECLENGTH ! record length
144 INTEGER :: IREC ! record number
145 INTEGER :: IGLB, IGLBHDR ! logical units
146 INTEGER :: ILUOUT ! output listing logical unit
147 INTEGER :: IERR ! return codes
148 !
149 INTEGER :: INBLINE ! number of latitude rows (number of lines
150 INTEGER :: INBCOL ! number of longitude rows (number of columns)
151 INTEGER :: ILINE1,ILINE2 ! limits of index of lines
152 INTEGER :: ICOL ! number of columns in mask domain
153 INTEGER :: ICOLINDEX ! column index in record
154 INTEGER :: INBLINES, ISIZE
155 INTEGER :: IWORK, IDEB, IPAS ! index of these data
156 INTEGER :: JLOOP, JLON, JLAT, JLINE, JCOL, JL, ICPT, INB, JTYPE
157 INTEGER :: ILINE_COMPRESS
158 INTEGER :: INB_LINE_READ
159 INTEGER(KIND=8) :: IPOS
160 !
161 INTEGER, DIMENSION(360) :: IMASK
162 INTEGER, DIMENSION(2) :: ICOL1, ICOL2 ! limits of index of columns
163 !
164 INTEGER(KIND=4), DIMENSION(:), ALLOCATABLE :: ICPT0 ! loop index
165 INTEGER(KIND=4), DIMENSION(:), ALLOCATABLE :: IVALUE32 ! value of a data point
166 INTEGER(KIND=8), DIMENSION(:), ALLOCATABLE :: IVALUE64 ! value of a data point
167 !
168  CHARACTER(LEN=6) :: YACCESS
169 LOGICAL :: GSWAP ! T: swap has been done
170 LOGICAL :: GMULTITYPE, GCOMPRESS
171 !
172 REAL(KIND=JPRB) :: ZHOOK_HANDLE
173 !----------------------------------------------------------------------------
174 !
175 IF (lhook) CALL dr_hook('READ_DIRECT_GAUSS_1',0,zhook_handle)
176  CALL get_luout(hprogram,iluout)
177 !
178 !* 1. Openning of global field
179 ! ------------------------
180 !
181 !* 1.1 Logical unit attributions
182 ! -------------------------
183 !
184 yfilename=adjustl(adjustr(hfilename)//'.dir')
185 yfilehdr =adjustl(adjustr(hfilename)//'.hdr')
186 !
187 !* 1.2 Openning of header
188 ! ------------------
189 !
190  CALL open_namelist(hprogram,iglbhdr,yfilehdr)
191 !
192 !* 1.3 Reading in header of direct access characteristics
193 ! --------------------------------------------------
194 !
195 DO jloop=1,11
196  READ(iglbhdr,'(A100)') ystring
197  IF (ystring(1:10)=='recordtype') EXIT
198 END DO
199 !
200 rewind(iglbhdr)
201 !
202 ystring1=ystring(12:100)
203 !
204 !* string analysis
205 !
206 iindex=index(ystring1,'n') ! n for integer
207 IF (iindex/=0) THEN
208  ytype='INTEGER'
209 ELSE
210  ytype='REAL '
211 END IF
212 iindex=index(ystring1,'8')
213 IF (iindex/=0) ibits=8
214 iindex=index(ystring1,'1')
215 IF (iindex/=0) ibits=16
216 iindex=index(ystring1,'3')
217 IF (iindex/=0) ibits=32
218 iindex=index(ystring1,'4')
219 IF (iindex/=0) ibits=64
220 !
221 IF (lhook) CALL dr_hook('READ_DIRECT_GAUSS_1',1,zhook_handle)
222 IF (lhook) CALL dr_hook('READ_DIRECT_GAUSS_2',0,zhook_handle)
223 !----------------------------------------------------------------------------
224 !
225 !* 2. Reading of the global field
226 ! ---------------------------
227 !
228 !* 2.1 Head of data file
229 ! -----------------
230 !
231  CALL readhead(iglbhdr,zglblatmin,zglblatmax,zglblonmin,zglblonmax, &
232  inbline,inbcol,znodata,zdlat,zdlon,zlat,zlon,ierr,ifact,&
233  gcompress)
234 IF (ierr/=0) CALL abor1_sfx('READ_DIRECT_GAUSS: PB IN FILE HEADER')
235 !
236 IF (gcompress .AND. (ytype/='INTEGER' .OR. ibits/=16)) &
237  CALL abor1_sfx('READ_DIRECT_GAUSS: COMPRESSED FILES ARE POSSIBLE ONLY WITH INTEGER 16 BYTES FOR THE MOMENT')
238 !
239 gmultitype = .false.
240 IF (PRESENT(omultitype)) gmultitype = omultitype
241 !
242 IF (gmultitype) THEN
243  DEALLOCATE(nsize_all)
244  ALLOCATE(nsize_all(u%NDIM_FULL,sum(ntype)))
245  nsize_all(:,:) = 0
246  IF (catype=='MAJ') THEN
247  DEALLOCATE(nvalnbr,nvalcount,xvallist)
248  ALLOCATE(nvalnbr(u%NDIM_FULL,sum(ntype)))
249  ALLOCATE(nvalcount(u%NDIM_FULL,jpvalmax,sum(ntype)))
250  ALLOCATE(xvallist(u%NDIM_FULL,jpvalmax,sum(ntype)))
251  nvalnbr(:,:) = 0
252  nvalcount(:,:,:) = 0
253  xvallist(:,:,:) = xundef
254  ELSE
255  DEALLOCATE(xall)
256  ALLOCATE(xall(u%NDIM_FULL,sum(ntype),1))
257  xall(:,:,:) = 0.
258  ENDIF
259 ENDIF
260 !
261 IF(ytype=='INTEGER')THEN
262  IF(hfield(1:3)=='CTI'.OR.hfield=='sand fraction'.OR.hfield=='clay fraction'.OR.&
263  hfield=='organic carbon'.OR.hfield(1:4)=='SAND'.OR. hfield(1:4)=='CLAY'.OR.hfield(1:3)=='SOC')THEN
264  ifact=100
265  ELSEIF (hfield=='water depth') THEN
266  ifact=10
267  ENDIF
268 ENDIF
269 !
270 !* 2.2 Closing of header
271 ! -----------------
272 !
273  CALL close_namelist(hprogram,iglbhdr)
274 !
275 !* 2.3 Dimension of work arrays
276 ! ------------------------
277 !
278 ! ires c'est le nombre de lignes qu'on lit dans un demi degré (multiple de 60)
279 inb_line_read = inbline / ((zglblatmax-zglblatmin)*2.)
280 IF (inb_line_read>60) inb_line_read = max(inb_line_read/3,60)
281 ! on lit toujours 60 lignes d'un coup
282 isize = inb_line_read * inbcol
283 !
284 ALLOCATE(zlat_work(isize))
285 ALLOCATE(zlon_work(isize))
286 ALLOCATE(zvalue_work(isize))
287 IF (gcompress.OR.gmultitype) THEN
288  ALLOCATE (zinter(isize))
289  zinter(:) = 0.
290 ENDIF
291 !
292 IF (lhook) CALL dr_hook('READ_DIRECT_GAUSS_2',1,zhook_handle)
293 IF (lhook) CALL dr_hook('READ_DIRECT_GAUSS_3',0,zhook_handle)
294 !----------------------------------------------------------------------------
295 !
296 !* 3. Adapt subgrid mesh to input file resolution
297 ! -------------------------------------------
298 !
299 IF (hsubroutine=='A_OROG') CALL ini_ssowork(xmeshlength,zdlat,zdlon)
300 !
301 IF (lhook) CALL dr_hook('READ_DIRECT_GAUSS_3',1,zhook_handle)
302 IF (lhook) CALL dr_hook('READ_DIRECT_GAUSS_4',0,zhook_handle)
303 !----------------------------------------------------------------------------
304 !
305 !* 7. Openning of direct access file
306 ! ------------------------------
307 !
308 !* 7.1 Record length
309 ! -------------
310 !
311 ireclength = ibits/8 * inbcol
312 ALLOCATE (zvalue(inbcol))
313 zvalue(:) = 0.
314 !
315 IF (gcompress) THEN
316  ALLOCATE(ycpt32(inbline))
317  ALLOCATE(icpt0(inbline))
318 ENDIF
319 !
320 IF (ytype=='INTEGER' .AND. ibits== 8) THEN
321  ALLOCATE (yvalue8(inbcol))
322 ELSEIF (ytype=='INTEGER' .AND. ibits==16) THEN
323  ALLOCATE (yvalue16(inbcol))
324 ELSEIF (ytype=='INTEGER' .AND. ibits==32) THEN
325  ALLOCATE (ivalue32(inbcol))
326  ELSEIF (ytype=='INTEGER' .AND. ibits==64) THEN
327  ALLOCATE (ivalue64(inbcol))
328 ELSEIF (ytype=='REAL ' .AND. ibits==32) THEN
329  ALLOCATE (yvalue32r(inbcol))
330 ELSEIF (ytype=='REAL ' .AND. ibits==64) THEN
331  ALLOCATE (yvalue64(inbcol))
332 ENDIF
333 !
334 !* 7.2 Openning of direct access file
335 ! ------------------------------
336 !
337 yaccess = 'DIRECT'
338 IF (gcompress) THEN
339  yaccess='STREAM'
340  little_endian_arch = .false.
341 ENDIF
342 !
343  CALL open_file(hprogram,iglb,yfilename,'UNFORMATTED', &
344  haction='READ',haccess=yaccess,krecl=ireclength )
345 !
346 ! we read numbers of elements by line of the grid at the beginning
347 IF (gcompress) THEN
348  READ(iglb) ycpt32
349  icpt0(:) = transfer(ycpt32(:),1_4,inbline)
350 ENDIF
351 !
352 IF (lhook) CALL dr_hook('READ_DIRECT_GAUSS_4',1,zhook_handle)
353 IF (lhook) CALL dr_hook('READ_DIRECT_GAUSS_5',0,zhook_handle)
354 !----------------------------------------------------------------------------
355 !
356 !* 4. loop on mask meshes (lat)
357 ! -------------------
358 !
359 !IMASK contains the indexes of lat to be read (inside the domain)
360 imask(:) = 0
361 icpt = 0
362 DO jlat = 1,360
363  IF ( .NOT. any(llatlonmask(:,jlat)) ) cycle
364  zlatmin = (jlat-180)/2. - 0.5
365  zlatmax = (jlat-180)/2.
366  IF ( .NOT. any(zlat(:)<zlatmax .AND. zlat(:)>=zlatmin) ) cycle
367  icpt = icpt + 1
368  imask(icpt) = jlat
369 ENDDO
370 !
371 !INB: number of lat to be read
372 inb = icpt
373 !
374 !IPAS: number of lat to be read for each task
375 ipas = ceiling(inb*1./nproc)
376 !
377 gswap = .false.
378 !
379 !first lat read for this task
380 ideb = ipas*nrank
381 !
382 icpt = 0
383 !
384 jl = ipas + 1
385 !
386 IF (gcompress) iline_compress = 1
387 !
388 iwork=0
389 !
390 inodata = znodata
391 inodata2 = ishftc(inodata,8)
392 znodata2 = inodata2
393 !
394 DO
395  !
396  !the file is read from the top to the bottom (quicker)
397  jl = jl - 1
398  IF (jl==0) EXIT
399  !
400  IF (ideb+jl>inb) cycle
401  !
402  !lat read by this task for this loop index JL
403  jlat = imask(ideb+jl)
404  !
405  zlatmin = (jlat-180)/2. - 0.5
406  zlatmax = (jlat-180)/2.
407  !
408  !----------------------------------------------------------------------------
409  !
410  !* 5. index limits on latitude
411  ! ------------------------
412  !
413  iline1=max(min(int((zglblatmax-zdlat/2.-zlatmax)/zdlat+1.),inbline),0)+1
414  iline2=max(min(int((zglblatmax-zdlat/2.-zlatmin)/zdlat+1.),inbline),0)
415  !
416  !----------------------------------------------------------------------------
417  !
418  !* 8. Loop on lines
419  ! -------------
420  !
421  inblines = iline2 - iline1 + 1
422  !
423  ! first IPOS for this task is the first information plus the
424  ! number of elements by lines before the first to read
425  IF (gcompress.AND.(jl==ipas.OR.iline_compress<iline1)) THEN
426  ipos = 0
427  IF (iline1>1) THEN
428  DO jloop=1,iline1-1
429  ipos = ipos + icpt0(jloop)
430  ENDDO
431  ENDIF
432  ipos = ipos*2 + 1 + inbline*4
433  iline_compress = iline1
434  ELSE
435  ipos = 0
436  ENDIF
437  !
438  DO jline = iline1,iline2
439  !
440  !----------------------------------------------------------------------------
441  !
442  !* 10. Reading in the direct access file
443  ! ---------------------------------
444  !
445  !* 10.1 Record number
446  ! -------------
447  !
448  irec = jline
449  !
450  !* 10.2 Reading the correct data type and conversion into real
451  ! ------------------------------------------------------
452  !
453  IF (ytype=='INTEGER' .AND. ibits== 8) THEN
454  READ(iglb,rec=irec) yvalue8(:)
455  zvalue(:)=yvalue8(:)
456  ! negative values are shifted to positive values according to binary coding
457  WHERE (zvalue(:)<0.) zvalue(:) = nint(256.+zvalue(:))
458  !
459  ELSE IF (ytype=='INTEGER' .AND. ibits==16) THEN
460  !
461  IF (gcompress) THEN
462  IF (ipos/=0) THEN
463  READ(iglb,pos=ipos) yvalue16(1:icpt0(jline))
464  ipos = 0
465  ELSE
466  READ(iglb) yvalue16(1:icpt0(jline))
467  ENDIF
468  zvalue(1:icpt0(jline))=yvalue16(1:icpt0(jline))
469  iline_compress = iline_compress + 1
470  ELSE
471  READ(iglb,rec=irec) yvalue16(:)
472  zvalue(:)=yvalue16(:)
473  ENDIF
474  !
475  IF (icpt==0.AND..NOT.gcompress) THEN
476  IF ( (hfield(1:5)=="COVER" .AND. (any(zvalue>jpcover.AND.zvalue/=znodata) .OR. &
477  any(zvalue<0..AND.zvalue/=znodata) .OR. all(zvalue==256.)) ) .OR. &
478  (znodata/=0 .AND. (all(zvalue==znodata2))) .OR. &
479  ((hfield(1:4)=="SAND" .OR. hfield(1:4)=="CLAY") .AND. &
480  (any(zvalue>100..AND.zvalue/=znodata) .OR. any(zvalue<0..AND.zvalue/=znodata)) ) .OR. &
481  (hfield(1:3)=="SOC" .AND. (any(zvalue>15000..AND.zvalue/=znodata) .OR. any(zvalue<0..AND.zvalue/=znodata)) ) .OR. &
482  ((hfield(1:5)/="COVER" .AND. hfield(1:4)/="SAND" .AND. hfield(1:4)/="CLAY" .AND. &
483  hfield(1:3)/="SOC" .AND. any(zvalue>15000..AND.zvalue/=znodata) ) ) ) THEN
484  icpt = icpt + 1
485  IF (gswap) CALL abor1_sfx('READ_DIRECT_GAUSS: SWAP ALREADY DONE, CANNOT BE REDONE')
487  gswap = .true.
488  IF (nrank==npio) THEN
489  WRITE(iluout,*) '*******************************************************************'
490  WRITE(iluout,*) 'Architecture of the machine needs to swap LITTLE_ENDIAN_ARCH to ', &
492  WRITE(iluout,*) '*******************************************************************'
493  ENDIF
494  jl = ipas + 1 !back to first lat
495  iwork = 0
496  IF (hfield(1:5)=="COVER") u%LCOVER(:) = .false.
497  CALL refresh_pgdwork(hsubroutine)
498  EXIT ! rereads the file
499  ENDIF
500  ENDIF
501  !
502  !
503  ELSE IF (ytype=='INTEGER' .AND. ibits==32) THEN
504  READ(iglb,rec=irec) ivalue32(:)
505  zvalue(:)=ivalue32(:)
506  !
507  ELSE IF (ytype=='INTEGER' .AND. ibits==64) THEN
508  READ(iglb,rec=irec) ivalue64(:)
509  zvalue(:)=ivalue64(:)
510  !
511  ELSE IF (ytype=='REAL ' .AND. ibits==32) THEN
512  READ(iglb,rec=irec) yvalue32r(:)
513  zvalue(:)=yvalue32r(:)
514  !
515  IF (icpt==0) THEN
516  IF ( any(abs(zvalue)>0. .AND. abs(zvalue)<1.e-50) &
517  .OR. any(abs(zvalue)>1.e20) ) THEN
518  icpt = icpt + 1
519  IF (gswap) CALL abor1_sfx('READ_DIRECT_GAUSS: SWAP ALREADY DONE, CANNOT BE REDONE')
521  gswap = .true.
522  IF (nrank==npio) THEN
523  WRITE(iluout,*) '*******************************************************************'
524  WRITE(iluout,*) 'Architecture of the machine needs to swap LITTLE_ENDIAN_ARCH to ', &
526  WRITE(iluout,*) '*******************************************************************'
527  ENDIF
528  jl = ipas + 1
529  iwork = 0
530  CALL refresh_pgdwork(hsubroutine)
531  EXIT
532  ENDIF
533  END IF
534  !
535  ELSE IF (ytype=='REAL ' .AND. ibits==64) THEN
536  READ(iglb,rec=irec) yvalue64(:)
537  zvalue(:)=yvalue64(:)
538  !
539  IF (icpt==0) THEN
540  IF ( any(abs(zvalue)>0. .AND. abs(zvalue)<1.e-50) &
541  .OR. any(abs(zvalue)>1.e20) ) THEN
542  icpt = icpt + 1
543  IF (gswap) CALL abor1_sfx('READ_DIRECT_GAUSS: SWAP ALREADY DONE, CANNOT BE REDONE')
545  gswap = .true.
546  IF (nrank==npio) THEN
547  WRITE(iluout,*) '*******************************************************************'
548  WRITE(iluout,*) 'Architecture of the machine needs to swap LITTLE_ENDIAN_ARCH to ', &
550  WRITE(iluout,*) '*******************************************************************'
551  ENDIF
552  jl = ipas + 1
553  iwork = 0
554  CALL refresh_pgdwork(hsubroutine)
555  EXIT
556  ENDIF
557  ENDIF
558  !
559  ELSE
560  CALL abor1_sfx('READ_DIRECT_GAUSS: DATA TYPE NOT SUPPORTED')
561  END IF
562  !
563  IF(hfield=='CTI')THEN
564  WHERE(zvalue(:)<0.0) zvalue(:)=znodata
565  ENDIF
566  !
567  IF (gcompress) THEN
568  WHERE (zvalue(1:icpt0(jline))<0.) zvalue(1:icpt0(jline)) = nint(32768*2.+zvalue(1:icpt0(jline)))
569  zinter(1:icpt0(jline)) = zvalue(1:icpt0(jline))
570  CALL uncompress_field(inbcol,4000.,zinter(1:icpt0(jline)),zvalue(:))
571  ENDIF
572  !
573  !----------------------------------------------------------------------------
574  !
575  !* 4. loop on mask meshes (lon)
576  ! -------------------
577  !
578  DO jlon=1,720
579  !
580  IF (.NOT. llatlonmask(jlon,jlat)) cycle
581  !
582  zlonmin = jlon /2. - 0.5
583  zlonmax = jlon /2.
584  !
585  !----------------------------------------------------------------------------
586  !
587  !* 5. limits on longitude
588  ! -------------------
589  !
590  !* 5.1 left domain border is set just higher than the global field min. longitude
591  ! -----------------------------------------------------------------
592  !
593  zshift = 360. * nint((zlonmin-zglblonmin-180.*(1-xsurf_epsilon))/360.)
594  !
595  zglblonmin = zglblonmin + zshift
596  zglblonmax = zglblonmax + zshift
597  !
598  !* 5.2 index limits on longitude
599  ! -------------------------
600  !
601  icol1(1)=max(min(int((zlonmin-zglblonmin-zdlon/2.)/zdlon+1.),inbcol),0)+1
602  icol2(1)=max(min(int((zlonmax-zglblonmin-zdlon/2.)/zdlon+1.),inbcol),0)
603  !
604  !* Does right domain border goes outside the global field longitude range?
605  !* Does it then goes into the global field domain by the other side?
606  !* Then a second part of the global field domain must be considered
607  !
608  icol1(2)=1
609  icol2(2)=max(min(int((zlonmax-zglblonmin-zdlon/2.-360.)/zdlon+1.),inbcol),0)
610  !
611  !----------------------------------------------------------------------------
612  !
613  !* 6. Loop on longitude limits
614  ! ------------------------
615  !
616  DO jloop=1,2
617  !
618  icol = icol2(jloop) - icol1(jloop) + 1
619  !
620  IF (icol<1) cycle
621  !
622  !----------------------------------------------------------------------------
623  !
624  !* 11. Loop on columns
625  ! ---------------
626  !
627  DO jcol=1,icol
628  !
629  !* 11.1 Recovers point value
630  ! --------------------
631  !
632  icolindex = jcol+icol1(jloop)-1
633  !
634  !* 11.2 Test with respect to the 'no data' value
635  ! ----------------------------------------
636  !
637  !IF (ABS(ZVALUE(ICOLINDEX)-ZNODATA)<=1.E-10) CYCLE
638  !
639  !* 11.3 copy of the correct values in a work array
640  ! ------------------------------------------
641  !
642  iwork = iwork + 1
643  zlat_work(iwork) = zlat(jline)
644  zlon_work(iwork) = zlon(icolindex)
645  zvalue_work(iwork) = zvalue(icolindex)
646  !
647  END DO ! JCOL
648  !-------------------------------------------------------------------------------
649  END DO !JLOOP
650  !-------------------------------------------------------------------------------
651  END DO !JLON
652  !-------------------------------------------------------------------------------
653  IF (mod((jline-iline1+1),inb_line_read)==0.OR.jline==iline2) THEN
654  !
655  IF (.NOT.gmultitype.AND.ifact/=1) THEN
656  WHERE(zvalue_work(1:iwork)/=znodata)
657  zvalue_work(1:iwork)=zvalue_work(1:iwork)/float(ifact)
658  END WHERE
659  ENDIF
660  !
661  !* 12. Call to the adequate subroutine (point by point treatment)
662  ! ----------------------------------------------------------
663  !
664  IF (iwork>0) THEN
665  CALL pt_by_pt_treatment(ug, u, uss, &
666  iluout, zlat_work(1:iwork),zlon_work(1:iwork), &
667  zvalue_work(1:iwork), hsubroutine, inblines, &
668  znodata, gmultitype, ifact )
669  ENDIF
670  !
671  iwork = 0
672  !
673  ENDIF
674 
675  END DO ! JLINE
676  !-------------------------------------------------------------------------------
677  !
678 !
679 !-------------------------------------------------------------------------------
680 END DO !JLAT
681 !
682 !-------------------------------------------------------------------------------
683 !
684 IF (lhook) CALL dr_hook('READ_DIRECT_GAUSS_5',1,zhook_handle)
685 IF (lhook) CALL dr_hook('READ_DIRECT_GAUSS_6',0,zhook_handle)
686 
687 DEALLOCATE(zlat)
688 DEALLOCATE(zlon)
689 !
690 DEALLOCATE(zlat_work )
691 DEALLOCATE(zlon_work )
692 DEALLOCATE(zvalue_work)
693 !
694 DEALLOCATE (zvalue)
695 IF (ALLOCATED(zinter)) DEALLOCATE (zinter)
696 IF (ALLOCATED(yvalue8)) DEALLOCATE (yvalue8 )
697 IF (ALLOCATED(yvalue16)) DEALLOCATE (yvalue16)
698 IF (ALLOCATED(yvalue32r)) DEALLOCATE (yvalue32r)
699 IF (ALLOCATED(yvalue64)) DEALLOCATE (yvalue64)
700 IF (ALLOCATED(ivalue32)) DEALLOCATE (ivalue32)
701 IF (ALLOCATED(ivalue64)) DEALLOCATE (ivalue64)
702 IF (ALLOCATED(zvalue32)) DEALLOCATE (zvalue32)
703 !
704  CALL close_file(hprogram,iglb)
705 !
706 IF (lhook) CALL dr_hook('READ_DIRECT_GAUSS_6',1,zhook_handle)
707 !
708 !-------------------------------------------------------------------------------
709 !
710 END SUBROUTINE read_direct_gauss
real, dimension(:,:,:), allocatable xvallist
subroutine open_file(HPROGRAM, KUNIT, HFILE, HFORM, HACTION, HACCESS, KR
Definition: open_file.F90:7
character(len=3) catype
logical, dimension(720, 360) llatlonmask
integer, dimension(:,:), allocatable nsize_all
subroutine uncompress_field(KLONG, PSEUIL, PFIELD_IN, PFIELD_OUT)
real, dimension(:,:,:), allocatable xall
subroutine read_direct_gauss(UG, U, USS, HPROGRAM, HSCHEME, HSUBROUTINE, HFILENA
subroutine refresh_pgdwork(HSUBROUTINE)
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:7
real, parameter xundef
integer, parameter jprb
Definition: parkind1.F90:32
real, save xsurf_epsilon
Definition: modd_csts.F90:88
integer, dimension(:,:), allocatable nvalnbr
subroutine ini_ssowork(PMESHLENGTH, PDLAT, PDLON)
Definition: ini_ssowork.F90:7
subroutine close_namelist(HPROGRAM, KLUNAM)
subroutine close_file(HPROGRAM, KUNIT)
Definition: close_file.F90:7
subroutine pt_by_pt_treatment(UG, U, USS, KLUOUT, PLAT, PLON, PVALUE, HSUBROUTINE
subroutine get_luout(HPROGRAM, KLUOUT)
Definition: get_luout.F90:7
intent(out) overrides sub arrays one Sort by the least significant key first sum(iindex(1:n))
logical lhook
Definition: yomhook.F90:15
integer, dimension(:,:,:), allocatable nvalcount
subroutine open_namelist(HPROGRAM, KLUNAM, HFILE)
subroutine readhead(KGLB, PGLBLATMIN, PGLBLATMAX, PGLBLONMIN, PGLBLONM
Definition: readhead.F90:7
integer, parameter jpvalmax
ERROR in index
Definition: ecsort_shared.h:90
logical, dimension(nnwl), parameter little_endian_arch
Definition: modd_arch.F90:33