7 hprogram,hscheme,hsubroutine,hfilename,hfield)
53 USE modi_open_namelist
54 USE modi_close_namelist
59 USE modi_pt_by_pt_treatment
63 USE yomhook
,ONLY : lhook, dr_hook
64 USE parkind1
,ONLY : jprb
68 USE modi_refresh_pgdwork
79 CHARACTER(LEN=6),
INTENT(IN) :: hprogram
80 CHARACTER(LEN=6),
INTENT(IN) :: hscheme
81 CHARACTER(LEN=6),
INTENT(IN) :: hsubroutine
82 CHARACTER(LEN=28),
INTENT(IN) :: hfilename
83 CHARACTER(LEN=20),
INTENT(IN) :: hfield
99 INTEGER :: iglb, iglbhdr
103 CHARACTER(LEN=28) :: yfilename
104 CHARACTER(LEN=28) :: yfilehdr
106 CHARACTER(LEN=7) :: ytype
111 CHARACTER(LEN=100):: ystring
112 CHARACTER(LEN=88 ):: ystring1
119 INTEGER,
DIMENSION(2) :: icol1, icol2
120 INTEGER :: iline1,iline2
123 REAL,
DIMENSION(:),
POINTER :: zlat
124 REAL,
DIMENSION(:),
POINTER :: zlon
126 INTEGER :: jlon, jlat
134 CHARACTER,
DIMENSION(:),
ALLOCATABLE :: ivalue8
135 CHARACTER(LEN=2),
DIMENSION(:),
ALLOCATABLE :: ivalue16
136 CHARACTER(LEN=4),
DIMENSION(:),
ALLOCATABLE :: ivalue32r
137 INTEGER (KIND=4),
DIMENSION(:),
ALLOCATABLE :: ivalue32
138 INTEGER (KIND=8),
DIMENSION(:),
ALLOCATABLE :: ivalue64
139 REAL (KIND=4),
DIMENSION(:),
ALLOCATABLE :: zvalue32
140 CHARACTER(LEN=8),
DIMENSION(:),
ALLOCATABLE :: zvalue64
142 REAL,
DIMENSION(:),
ALLOCATABLE :: zvalue
144 REAL,
DIMENSION(:),
ALLOCATABLE :: zvalue_work
145 REAL,
DIMENSION(:),
ALLOCATABLE :: zlat_work
146 REAL,
DIMENSION(:),
ALLOCATABLE :: zlon_work
151 INTEGER :: ireclength
153 REAL(KIND=JPRB) :: zhook_handle
156 IF (lhook) CALL dr_hook(
'READ_DIRECT',0,zhook_handle)
165 yfilename=adjustl(adjustr(hfilename)//
'.dir')
166 yfilehdr =adjustl(adjustr(hfilename)//
'.hdr')
177 READ(iglbhdr,
'(A100)') ystring
178 IF (ystring(1:10)==
'recordtype')
EXIT
183 ystring1=ystring(12:100)
187 iindex=index(ystring1,
'n')
193 iindex=index(ystring1,
'8')
194 IF (iindex/=0) ibits=8
195 iindex=index(ystring1,
'1')
196 IF (iindex/=0) ibits=16
197 iindex=index(ystring1,
'3')
198 IF (iindex/=0) ibits=32
199 iindex=index(ystring1,
'4')
200 IF (iindex/=0) ibits=64
202 IF(ytype==
'INTEGER')
THEN
203 IF(hfield==
'CTI'.OR.hfield==
'sand fraction'.OR. &
204 hfield==
'clay fraction'.OR.hfield==
'organic carbon')
THEN
206 ELSEIF (hfield==
'water depth')
THEN
223 CALL
readhead(iglbhdr,zglblatmin,zglblatmax,zglblonmin,zglblonmax, &
224 inbline,inbcol,znodata,zdlat,zdlon,zlat,zlon,ierr)
225 IF (ierr/=0) CALL
abor1_sfx(
'READ_DIRECT: PB IN FILE HEADER')
235 ALLOCATE(zlat_work(inbcol))
236 ALLOCATE(zlon_work(inbcol))
237 ALLOCATE(zvalue_work(inbcol))
244 IF (hsubroutine==
'A_OROG') CALL
ini_ssowork(xmeshlength,zdlat,zdlon)
254 ireclength = ibits/8 * inbcol
255 ALLOCATE (zvalue(inbcol))
256 ALLOCATE (ivalue8(inbcol))
257 ALLOCATE (ivalue16(inbcol))
258 ALLOCATE (ivalue32(inbcol))
259 ALLOCATE (ivalue32r(inbcol))
260 ALLOCATE (ivalue64(inbcol))
261 ALLOCATE (zvalue32(inbcol))
262 ALLOCATE (zvalue64(inbcol))
267 CALL
open_file(hprogram,iglb,yfilename,
'UNFORMATTED', &
268 haction=
'READ',haccess=
'DIRECT',krecl=ireclength )
284 IF ( .NOT. any(llatlonmask(:,jlat)) ) cycle
286 zlatmin = (jlat-180)/2. - 0.5
287 zlatmax = (jlat-180)/2.
294 iline1=max(min(int((zglblatmax-zdlat/2.-zlatmax)/zdlat+1.),inbline),0)+1
295 iline2=max(min(int((zglblatmax-zdlat/2.-zlatmin)/zdlat+1.),inbline),0)
296 IF ( .NOT. any(zlat(:)<zlatmax .AND. zlat(:)>=zlatmin) ) cycle
303 DO jline = iline1,iline2
318 IF (ytype==
'INTEGER' .AND. ibits== 8)
THEN
319 READ(iglb,rec=irec) ivalue8(:)
322 WHERE (zvalue(:)<0.) zvalue(:) = nint(256.+zvalue(:))
324 ELSE IF (ytype==
'INTEGER' .AND. ibits==16)
THEN
325 READ(iglb,rec=irec) ivalue16(:)
326 zvalue(:)=ivalue16(:)
327 IF ( any(abs(zvalue)>15000) )
THEN
328 IF (gswap) CALL
abor1_sfx(
'READ_DIRECT: SWAP ALREADY DONE, CANNOT BE REDONE')
329 little_endian_arch = .NOT. little_endian_arch
331 WRITE(iluout,*)
'*******************************************************************'
332 WRITE(iluout,*)
'Architecture of the machine needs to swap LITTLE_ENDIAN_ARCH to ', &
334 WRITE(iluout,*)
'*******************************************************************'
340 ELSE IF (ytype==
'INTEGER' .AND. ibits==32)
THEN
341 READ(iglb,rec=irec) ivalue32(:)
342 zvalue(:)=ivalue32(:)
343 ELSE IF (ytype==
'INTEGER' .AND. ibits==64)
THEN
344 READ(iglb,rec=irec) ivalue64(:)
345 zvalue(:)=ivalue64(:)
346 ELSE IF (ytype==
'REAL ' .AND. ibits==32)
THEN
347 READ(iglb,rec=irec) ivalue32r(:)
348 zvalue(:)=ivalue32r(:)
349 IF ( any(abs(zvalue)>0. .AND. abs(zvalue)<1.e-50) &
350 .OR. any(abs(zvalue)>1.e20) )
THEN
351 IF (gswap) CALL
abor1_sfx(
'READ_DIRECT: SWAP ALREADY DONE, CANNOT BE REDONE')
352 little_endian_arch = .NOT. little_endian_arch
354 WRITE(iluout,*)
'*******************************************************************'
355 WRITE(iluout,*)
'Architecture of the machine needs to swap LITTLE_ENDIAN_ARCH to ', &
357 WRITE(iluout,*)
'*******************************************************************'
362 ELSE IF (ytype==
'REAL ' .AND. ibits==64)
THEN
363 READ(iglb,rec=irec) zvalue64(:)
364 zvalue(:)=zvalue64(:)
365 IF ( any(abs(zvalue)>0. .AND. abs(zvalue)<1.e-50) &
366 .OR. any(abs(zvalue)>1.e20) )
THEN
367 IF (gswap) CALL
abor1_sfx(
'READ_DIRECT: SWAP ALREADY DONE, CANNOT BE REDONE')
368 little_endian_arch = .NOT. little_endian_arch
370 WRITE(iluout,*)
'*******************************************************************'
371 WRITE(iluout,*)
'Architecture of the machine needs to swap LITTLE_ENDIAN_ARCH to ', &
373 WRITE(iluout,*)
'*******************************************************************'
379 CALL
abor1_sfx(
'READ_DIRECT1: DATA TYPE NOT SUPPORTED')
382 IF(hfield==
'CTI')
THEN
383 WHERE(zvalue(:)<0.0)zvalue(:)=znodata
386 WHERE(zvalue(:)/=znodata)zvalue(:)=zvalue(:)/zfact
395 IF (.NOT. llatlonmask(jlon,jlat)) cycle
397 zlonmin = jlon /2. - 0.5
408 zshift = 360. * nint((zlonmin-zglblonmin-180.*(1-xsurf_epsilon))/360.)
411 zglblonmin = zglblonmin + zshift
412 zglblonmax = zglblonmax + zshift
419 icol1(1)=max(min(int((zlonmin-zglblonmin-zdlon/2.)/zdlon+1.),inbcol),0)+1
420 icol2(1)=max(min(int((zlonmax-zglblonmin-zdlon/2.)/zdlon+1.),inbcol),0)
427 icol2(2)=max(min(int((zlonmax-zglblonmin-zdlon/2.-360.)/zdlon+1.),inbcol),0)
436 icol = icol2(jloop) - icol1(jloop) + 1
452 icolindex = jcol+icol1(jloop)-1
458 IF (abs(zvalue(icolindex)-znodata)<=1.e-10) cycle
465 zlat_work(iwork) = zlat(jline)
466 zlon_work(iwork) = zlon(icolindex)
467 zvalue_work(iwork) = zvalue(icolindex)
478 iluout, zlat_work(1:iwork),zlon_work(1:iwork), &
479 zvalue_work(1:iwork), &
497 DEALLOCATE(zlat_work )
498 DEALLOCATE(zlon_work )
499 DEALLOCATE(zvalue_work)
502 DEALLOCATE (ivalue8 )
503 DEALLOCATE (ivalue16)
504 DEALLOCATE (ivalue32)
505 DEALLOCATE (ivalue32r)
506 DEALLOCATE (ivalue64)
507 DEALLOCATE (zvalue32)
508 DEALLOCATE (zvalue64)
511 IF (lhook) CALL dr_hook(
'READ_DIRECT',1,zhook_handle)
subroutine read_direct(USS, HPROGRAM, HSCHEME, HSUBROUTINE, HFILENAME, HFIELD)
subroutine pt_by_pt_treatment(USS, KLUOUT, PLAT, PLON, PVALUE, HSUBROUTINE, KNBLINES, PNODATA)
subroutine abor1_sfx(YTEXT)
subroutine refresh_pgdwork
subroutine readhead(KGLB, PGLBLATMIN, PGLBLATMAX, PGLBLONMIN, PGLBLONMAX, KNBLAT, KNBLON, PCUTVAL, PDLAT, PDLON, PLAT, PLON, KERR)
subroutine ini_ssowork(PMESHLENGTH, PDLAT, PDLON)
subroutine close_namelist(HPROGRAM, KLUNAM)
subroutine close_file(HPROGRAM, KUNIT)
subroutine get_luout(HPROGRAM, KLUOUT)
subroutine open_namelist(HPROGRAM, KLUNAM, HFILE)
subroutine open_file(HPROGRAM, KUNIT, HFILE, HFORM, HACTION, HACCESS, KRECL)