7 HPROGRAM,HSCHEME,HSUBROUTINE,HFILENAME,HFIELD,OMULTITYPE)
54 USE modd_data_cover_par
, ONLY : jpcover, ntype
57 USE modi_open_namelist
58 USE modi_close_namelist
63 USE modi_pt_by_pt_treatment
66 USE modi_uncompress_field
75 USE modi_refresh_pgdwork
86 TYPE(
sso_t),
INTENT(INOUT) :: USS
88 CHARACTER(LEN=6),
INTENT(IN) :: HPROGRAM
89 CHARACTER(LEN=6),
INTENT(IN) :: HSCHEME
90 CHARACTER(LEN=6),
INTENT(IN) :: HSUBROUTINE
91 CHARACTER(LEN=28),
INTENT(IN) :: HFILENAME
92 CHARACTER(LEN=20),
INTENT(IN) :: HFIELD
93 LOGICAL,
OPTIONAL,
INTENT(IN) :: OMULTITYPE
98 CHARACTER(LEN=28) :: YFILENAME
99 CHARACTER(LEN=28) :: YFILEHDR
101 CHARACTER(LEN=7) :: YTYPE
103 CHARACTER(LEN=100):: YSTRING
104 CHARACTER(LEN=88 ):: YSTRING1
106 CHARACTER(LEN=2),
DIMENSION(1) :: YCPT16
107 CHARACTER(LEN=4),
DIMENSION(:),
ALLOCATABLE :: YCPT32
109 CHARACTER,
DIMENSION(:),
ALLOCATABLE :: YVALUE8
110 CHARACTER(LEN=2),
DIMENSION(:),
ALLOCATABLE :: YVALUE16
111 CHARACTER(LEN=4),
DIMENSION(:),
ALLOCATABLE :: YVALUE32R
112 CHARACTER(LEN=8),
DIMENSION(:),
ALLOCATABLE :: YVALUE64
114 REAL,
DIMENSION(1) :: ZCPT
120 REAL :: ZNODATA, ZNODATA2
129 INTEGER(KIND=2) :: INODATA, INODATA2
131 REAL,
DIMENSION(:),
ALLOCATABLE :: ZVALUE
132 REAL,
DIMENSION(:),
POINTER :: ZLAT
133 REAL,
DIMENSION(:),
POINTER :: ZLON
134 REAL(KIND=4),
DIMENSION(:),
ALLOCATABLE :: ZVALUE32
135 REAL,
DIMENSION(:),
ALLOCATABLE :: ZINTER
136 REAL,
DIMENSION(:),
ALLOCATABLE :: ZVALUE_WORK
137 REAL,
DIMENSION(:),
ALLOCATABLE :: ZLAT_WORK
138 REAL,
DIMENSION(:),
ALLOCATABLE :: ZLON_WORK
143 INTEGER :: IRECLENGTH
145 INTEGER :: IGLB, IGLBHDR
151 INTEGER :: ILINE1,ILINE2
154 INTEGER :: INBLINES, ISIZE
155 INTEGER :: IWORK, IDEB, IPAS
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
161 INTEGER,
DIMENSION(360) :: IMASK
162 INTEGER,
DIMENSION(2) :: ICOL1, ICOL2
164 INTEGER(KIND=4),
DIMENSION(:),
ALLOCATABLE :: ICPT0
165 INTEGER(KIND=4),
DIMENSION(:),
ALLOCATABLE :: IVALUE32
166 INTEGER(KIND=8),
DIMENSION(:),
ALLOCATABLE :: IVALUE64
168 CHARACTER(LEN=6) :: YACCESS
170 LOGICAL :: GMULTITYPE, GCOMPRESS
172 REAL(KIND=JPRB) :: ZHOOK_HANDLE
175 IF (
lhook)
CALL dr_hook(
'READ_DIRECT_GAUSS_1',0,zhook_handle)
184 yfilename=adjustl(adjustr(hfilename)//
'.dir')
185 yfilehdr =adjustl(adjustr(hfilename)//
'.hdr')
196 READ(iglbhdr,
'(A100)') ystring
197 IF (ystring(1:10)==
'recordtype')
EXIT 202 ystring1=ystring(12:100)
206 iindex=
index(ystring1,
'n')
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
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)
231 CALL readhead(iglbhdr,zglblatmin,zglblatmax,zglblonmin,zglblonmax, &
232 inbline,inbcol,znodata,zdlat,zdlon,zlat,zlon,ierr,ifact,&
234 IF (ierr/=0)
CALL abor1_sfx(
'READ_DIRECT_GAUSS: PB IN FILE HEADER')
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' 240 IF (
PRESENT(omultitype)) gmultitype = omultitype
256 ALLOCATE(
xall(u%NDIM_FULL,
sum(ntype),1))
261 IF(ytype==
'INTEGER')
THEN 262 IF(hfield(1:3)==
'CTI'.OR.hfield==
'sand fraction'.OR.hfield==
'clay fraction'.OR.
263 'organic carbon'.OR.hfield(1:4)==
'SAND'.OR. hfield(1:4)==
'CLAY'.OR.hfield
'SOC'THEN 265 ELSEIF (hfield==
'water depth')
THEN 279 inb_line_read = inbline / ((zglblatmax-zglblatmin)*2.)
280 IF (inb_line_read>60) inb_line_read = max(inb_line_read/3,60)
282 isize = inb_line_read * inbcol
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))
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)
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)
311 ireclength = ibits/8 * inbcol
312 ALLOCATE (zvalue(inbcol))
316 ALLOCATE(ycpt32(inbline))
317 ALLOCATE(icpt0(inbline))
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))
343 CALL open_file(hprogram,iglb,yfilename,
'UNFORMATTED', &
344 haction=
'READ',haccess=yaccess,krecl=ireclength )
349 icpt0(:) = transfer(ycpt32(:),1_4,inbline)
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)
364 zlatmin = (jlat-180)/2. - 0.5
365 zlatmax = (jlat-180)/2.
366 IF ( .NOT. any(zlat(:)<zlatmax .AND. zlat(:)>=zlatmin) ) cycle
375 ipas = ceiling(inb*1./
nproc)
386 IF (gcompress) iline_compress = 1
391 inodata2 = ishftc(inodata,8)
400 IF (ideb+jl>inb) cycle
403 jlat = imask(ideb+jl)
405 zlatmin = (jlat-180)/2. - 0.5
406 zlatmax = (jlat-180)/2.
413 iline1=max(min(int((zglblatmax-zdlat/2.-zlatmax)/zdlat+1.),inbline),0)
421 inblines = iline2 - iline1 + 1
425 IF (gcompress.AND.(jl==ipas.OR.iline_compress<iline1))
THEN 429 ipos = ipos + icpt0(jloop)
432 ipos = ipos*2 + 1 + inbline*4
433 iline_compress = iline1
438 DO jline = iline1,iline2
453 IF (ytype==
'INTEGER' .AND. ibits== 8)
THEN 454 READ(iglb,rec=irec) yvalue8(:)
457 WHERE (zvalue(:)<0.) zvalue(:) = nint(256.+zvalue(:))
459 ELSE IF (ytype==
'INTEGER' .AND. ibits==16)
THEN 463 READ(iglb,pos=ipos) yvalue16(1:icpt0(jline))
466 READ(iglb) yvalue16(1:icpt0(jline))
468 zvalue(1:icpt0(jline))=yvalue16(1:icpt0(jline))
469 iline_compress = iline_compress + 1
471 READ(iglb,rec=irec) yvalue16(:)
472 zvalue(:)=yvalue16(:)
475 IF (icpt==0.AND..NOT.gcompress)
THEN 476 IF ( (hfield(1:5)==
"COVER" .AND. (any(zvalue>jpcover.AND.zvalue/
479 "SAND" .OR. hfield(1:4)==
"CLAY") .AND. &
480 (any(zvalue>100..AND.zvalue/=znodata) .OR. any(zvalue<0..AND.zvalue
481 "SOC" .AND. (any(zvalue>15000..AND.zvalue/=znodata
482 "COVER" .AND. hfield(1:4)/=
"SAND" .AND. hfield
"CLAY" 483 "SOC" .AND. any(zvalue>15000..AND.zvalue/=znodata
THEN 485 IF (gswap)
CALL abor1_sfx(
'READ_DIRECT_GAUSS: SWAP ALREADY DONE, CANNOT BE REDONE' 489 WRITE(iluout,*)
'*******************************************************************' 490 WRITE(iluout,*)
'Architecture of the machine needs to swap LITTLE_ENDIAN_ARCH to ' 492 WRITE(iluout,*)
'*******************************************************************' 496 IF (hfield(1:5)==
"COVER") u%LCOVER(:) = .false.
503 ELSE IF (ytype==
'INTEGER' .AND. ibits==32)
THEN 504 READ(iglb,rec=irec) ivalue32(:)
505 zvalue(:)=ivalue32(:)
507 ELSE IF (ytype==
'INTEGER' .AND. ibits==64)
THEN 508 READ(iglb,rec=irec) ivalue64(:)
509 zvalue(:)=ivalue64(:)
511 ELSE IF (ytype==
'REAL ' .AND. ibits==32)
THEN 512 READ(iglb,rec=irec) yvalue32r(:)
513 zvalue(:)=yvalue32r(:)
516 IF ( any(abs(zvalue)>0. .AND. abs(zvalue)<1.e-50) &
517 .OR. any(abs(zvalue)>1.e20) )
THEN 519 IF (gswap)
CALL abor1_sfx(
'READ_DIRECT_GAUSS: SWAP ALREADY DONE, CANNOT BE REDONE' 523 WRITE(iluout,*)
'*******************************************************************' 524 WRITE(iluout,*)
'Architecture of the machine needs to swap LITTLE_ENDIAN_ARCH to ' 526 WRITE(iluout,*)
'*******************************************************************' 535 ELSE IF (ytype==
'REAL ' .AND. ibits==64)
THEN 536 READ(iglb,rec=irec) yvalue64(:)
537 zvalue(:)=yvalue64(:)
540 IF ( any(abs(zvalue)>0. .AND. abs(zvalue)<1.e-50) &
541 .OR. any(abs(zvalue)>1.e20) )
THEN 543 IF (gswap)
CALL abor1_sfx(
'READ_DIRECT_GAUSS: SWAP ALREADY DONE, CANNOT BE REDONE' 547 WRITE(iluout,*)
'*******************************************************************' 548 WRITE(iluout,*)
'Architecture of the machine needs to swap LITTLE_ENDIAN_ARCH to ' 550 WRITE(iluout,*)
'*******************************************************************' 560 CALL abor1_sfx(
'READ_DIRECT_GAUSS: DATA TYPE NOT SUPPORTED')
563 IF(hfield==
'CTI')
THEN 564 WHERE(zvalue(:)<0.0) zvalue(:)=znodata
568 WHERE (zvalue(1:icpt0(jline))<0.) zvalue(1:icpt0(jline)) = nint(32
582 zlonmin = jlon /2. - 0.5
593 zshift = 360. * nint((zlonmin-zglblonmin-180.*(1-
xsurf_epsilon))/3
595 zglblonmin = zglblonmin + zshift
596 zglblonmax = zglblonmax + zshift
601 icol1(1)=max(min(int((zlonmin-zglblonmin-zdlon/2.)/zdlon+1.),inbcol
609 icol2(2)=max(min(int((zlonmax-zglblonmin-zdlon/2.-360.)/zdlon+1.),inbcol
618 icol = icol2(jloop) - icol1(jloop) + 1
632 icolindex = jcol+icol1(jloop)-1
643 zlat_work(iwork) = zlat(jline)
644 zlon_work(iwork) = zlon(icolindex)
645 zvalue_work(iwork) = zvalue(icolindex)
653 IF (mod((jline-iline1+1),inb_line_read)==0.OR.jline==iline2)
THEN 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)
666 iluout, zlat_work(1:iwork),zlon_work(1:iwork
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)
690 DEALLOCATE(zlat_work )
691 DEALLOCATE(zlon_work )
692 DEALLOCATE(zvalue_work)
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)
706 IF (
lhook)
CALL dr_hook(
'READ_DIRECT_GAUSS_6',1,zhook_handle)
real, dimension(:,:,:), allocatable xvallist
subroutine open_file(HPROGRAM, KUNIT, HFILE, HFORM, HACTION, HACCESS, KR
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)
integer, dimension(:,:), allocatable nvalnbr
subroutine ini_ssowork(PMESHLENGTH, PDLAT, PDLON)
subroutine close_namelist(HPROGRAM, KLUNAM)
subroutine close_file(HPROGRAM, KUNIT)
subroutine pt_by_pt_treatment(UG, U, USS, KLUOUT, PLAT, PLON, PVALUE, HSUBROUTINE
subroutine get_luout(HPROGRAM, KLUOUT)
intent(out) overrides sub arrays one Sort by the least significant key first sum(iindex(1:n))
integer, dimension(:,:,:), allocatable nvalcount
subroutine open_namelist(HPROGRAM, KLUNAM, HFILE)
subroutine readhead(KGLB, PGLBLATMIN, PGLBLATMAX, PGLBLONMIN, PGLBLONM
integer, parameter jpvalmax
logical, dimension(nnwl), parameter little_endian_arch