62 #ifdef HAVE_LIBGRIBAPI
76 INTEGER,
PARAMETER :: grid_id_no_driver = 0
77 INTEGER,
PARAMETER :: grid_id_grib_api = 1
78 INTEGER,
PARAMETER :: grid_id_gdal = 2
80 #if defined HAVE_LIBGRIBAPI
81 INTEGER,
PARAMETER :: grid_id_default = grid_id_grib_api
82 #elif defined HAVE_LIBGDAL
83 INTEGER,
PARAMETER :: grid_id_default = grid_id_gdal
85 INTEGER,
PARAMETER :: grid_id_default = grid_id_no_driver
88 CHARACTER(len=12),
PARAMETER :: driverlist(0:2) = &
89 (/
'no_driver ',
'grib_api ',
'gdal '/)
97 DOUBLE PRECISION :: xmin=dmiss
98 DOUBLE PRECISION :: ymin=dmiss
99 DOUBLE PRECISION :: xmax=dmiss
100 DOUBLE PRECISION :: ymax=dmiss
108 #ifdef HAVE_LIBGRIBAPI
109 INTEGER :: gaid=imiss
112 TYPE(gdaldataseth) :: gdalid
113 INTEGER :: nlastband=0
114 TYPE(gdal_file_id_options) :: gdal_options
115 TYPE(grid_file_id),
POINTER :: file_id_copy=>null()
117 INTEGER :: driver=grid_id_default
125 INTEGER :: nodriverid=imiss
126 #ifdef HAVE_LIBGRIBAPI
127 INTEGER :: gaid=imiss
130 TYPE(gdalrasterbandh) :: gdalid
131 TYPE(grid_file_id),
POINTER :: file_id=>null()
133 INTEGER :: driver=grid_id_default
139 MODULE PROCEDURE grid_file_id_init, grid_id_init
144 MODULE PROCEDURE grid_file_id_delete, grid_id_delete
149 MODULE PROCEDURE grid_id_copy
154 MODULE PROCEDURE grid_id_export
182 MODULE PROCEDURE grid_id_c_e, grid_id_c_e_v, grid_file_id_c_e, grid_file_id_c_e_v
188 MODULE PROCEDURE grid_id_display
191 PRIVATE grid_file_id_delete, grid_id_delete, grid_id_copy, &
192 grid_id_c_e, grid_file_id_c_e, grid_id_c_e_v, grid_file_id_c_e_v, grid_id_display
197 SUBROUTINE grid_file_id_init(this, filename, mode, driver, from_grid_id)
198 TYPE(grid_file_id),
INTENT(out) :: this
199 CHARACTER(len=*),
INTENT(in) :: filename
200 CHARACTER(len=*),
INTENT(in) :: mode
201 INTEGER,
INTENT(in),
OPTIONAL :: driver
202 TYPE(grid_id),
INTENT(in),
OPTIONAL :: from_grid_id
204 this = grid_file_id_new(filename, mode, driver, from_grid_id)
206 END SUBROUTINE grid_file_id_init
221 FUNCTION grid_file_id_new(filename, mode, driver, from_grid_id)
RESULT(this)
222 CHARACTER(len=*),
INTENT(in) :: filename
223 CHARACTER(len=*),
INTENT(in) :: mode
224 INTEGER,
INTENT(in),
OPTIONAL :: driver
225 TYPE(grid_id),
INTENT(in),
OPTIONAL :: from_grid_id
226 TYPE(grid_file_id) :: this
228 INTEGER :: n, ier, nf
232 TYPE(csv_record) :: driveropts
233 CHARACTER(len=12) :: drivername
236 CALL gdalnullify(this%gdalid)
239 IF (filename ==
'' .OR. .NOT.
c_e(filename))
RETURN
241 n =
index(filename,
':')
243 CALL init(driveropts, filename(:n-1), nfield=nf)
245 #ifdef HAVE_LIBGRIBAPI
246 IF (drivername ==
'grib_api')
THEN
247 this%driver = grid_id_grib_api
251 IF (drivername ==
'gdal')
THEN
253 this%driver = grid_id_gdal
260 IF (.NOT.
c_e(this%gdal_options%xmin)) this%gdal_options%xmin = -1.0d6
261 IF (.NOT.
c_e(this%gdal_options%ymin)) this%gdal_options%ymin = -1.0d6
262 IF (.NOT.
c_e(this%gdal_options%xmax)) this%gdal_options%xmax = 1.0d6
263 IF (.NOT.
c_e(this%gdal_options%ymax)) this%gdal_options%ymax = 1.0d6
265 CALL l4f_log(l4f_error,
'gdal driver requires 4 extra arguments (bounding box)')
272 IF (
PRESENT(driver))
THEN
275 IF (
PRESENT(from_grid_id))
THEN
276 this%driver = from_grid_id%driver
279 #ifdef HAVE_LIBGRIBAPI
280 IF (this%driver == grid_id_grib_api)
THEN
281 CALL grib_open_file(this%gaid, filename(n+1:), trim(mode), ier)
282 IF (ier /= grib_success) this%gaid = imiss
286 IF (this%driver == grid_id_gdal)
THEN
287 IF (mode(1:1) ==
'w')
THEN
292 CALL gdalallregister()
293 this%gdalid = gdalopen(trim(filename(n+1:))//c_null_char, imode)
295 ALLOCATE(this%file_id_copy)
296 this%file_id_copy = this
300 END FUNCTION grid_file_id_new
306 FUNCTION grid_file_id_count(this)
RESULT(count)
307 TYPE(grid_file_id),
INTENT(in) :: this
313 #ifdef HAVE_LIBGRIBAPI
314 IF (this%driver == grid_id_grib_api)
THEN
315 IF (
c_e(this%gaid))
THEN
316 CALL grib_count_in_file(this%gaid, count, ier)
317 IF (ier /= grib_success) count = 0
322 IF (this%driver == grid_id_gdal)
THEN
323 IF (gdalassociated(this%gdalid))
THEN
324 count = gdalgetrastercount(this%gdalid)
329 END FUNCTION grid_file_id_count
337 SUBROUTINE grid_file_id_delete(this)
338 TYPE(grid_file_id),
INTENT(inout) :: this
340 #ifdef HAVE_LIBGRIBAPI
341 IF (this%driver == grid_id_grib_api)
THEN
342 IF (
c_e(this%gaid))
CALL grib_close_file(this%gaid)
347 IF (this%driver == grid_id_gdal)
THEN
352 CALL gdalnullify(this%gdalid)
357 END SUBROUTINE grid_file_id_delete
363 FUNCTION grid_file_id_c_e(this)
364 TYPE(grid_file_id),
INTENT(in) :: this
365 LOGICAL :: grid_file_id_c_e
367 grid_file_id_c_e = .false.
369 #ifdef HAVE_LIBGRIBAPI
370 IF (this%driver == grid_id_grib_api)
THEN
371 grid_file_id_c_e =
c_e(this%gaid)
375 IF (this%driver == grid_id_gdal)
THEN
376 grid_file_id_c_e = gdalassociated(this%gdalid)
380 END FUNCTION grid_file_id_c_e
386 FUNCTION grid_file_id_c_e_v(this)
387 TYPE(grid_file_id),
INTENT(in) :: this(:)
388 LOGICAL :: grid_file_id_c_e_v(SIZE(this))
393 grid_file_id_c_e_v(i) =
c_e(this(i))
396 END FUNCTION grid_file_id_c_e_v
399 SUBROUTINE grid_id_init(this, from_grid_file_id, grib_api_template, grib_api_id)
400 TYPE(grid_id),
INTENT(out) :: this
401 TYPE(grid_file_id),
INTENT(inout),
OPTIONAL :: from_grid_file_id
402 CHARACTER(len=*),
INTENT(in),
OPTIONAL :: grib_api_template
403 INTEGER,
INTENT(in),
OPTIONAL :: grib_api_id
405 this = grid_id_new(from_grid_file_id, grib_api_template, grib_api_id)
407 END SUBROUTINE grid_id_init
419 FUNCTION grid_id_new(from_grid_file_id, grib_api_template, grib_api_id, &
420 no_driver_id)
RESULT(this)
421 TYPE(grid_file_id),
INTENT(inout),
OPTIONAL,
TARGET :: from_grid_file_id
422 CHARACTER(len=*),
INTENT(in),
OPTIONAL :: grib_api_template
423 INTEGER,
INTENT(in),
OPTIONAL :: grib_api_id
424 INTEGER,
INTENT(in),
OPTIONAL :: no_driver_id
425 TYPE(grid_id) :: this
430 CALL gdalnullify(this%gdalid)
433 IF (
PRESENT(from_grid_file_id))
THEN
434 this%driver = from_grid_file_id%driver
436 #ifdef HAVE_LIBGRIBAPI
437 IF (this%driver == grid_id_grib_api)
THEN
438 IF (
c_e(from_grid_file_id%gaid))
THEN
439 CALL grib_new_from_file(from_grid_file_id%gaid, this%gaid, ier)
440 IF (ier /= grib_success) this%gaid = imiss
445 IF (this%driver == grid_id_gdal)
THEN
446 IF (gdalassociated(from_grid_file_id%gdalid) .AND. &
447 ASSOCIATED(from_grid_file_id%file_id_copy))
THEN
448 IF (from_grid_file_id%nlastband < &
449 gdalgetrastercount(from_grid_file_id%gdalid))
THEN
450 from_grid_file_id%nlastband = from_grid_file_id%nlastband + 1
452 gdalgetrasterband(from_grid_file_id%gdalid, from_grid_file_id%nlastband)
453 this%file_id => from_grid_file_id%file_id_copy
460 #ifdef HAVE_LIBGRIBAPI
461 ELSE IF (
PRESENT(grib_api_template))
THEN
462 this%driver = grid_id_grib_api
463 CALL grib_new_from_samples(this%gaid, grib_api_template, ier)
464 IF (ier /= grib_success) this%gaid = imiss
465 ELSE IF (
PRESENT(grib_api_id))
THEN
466 this%driver = grid_id_grib_api
467 this%gaid = grib_api_id
469 ELSE IF (
PRESENT(no_driver_id))
THEN
470 this%driver = grid_id_no_driver
471 this%nodriverid = no_driver_id
474 END FUNCTION grid_id_new
481 SUBROUTINE grid_id_delete(this)
482 TYPE(grid_id),
INTENT(inout) :: this
484 this%nodriverid = imiss
485 #ifdef HAVE_LIBGRIBAPI
486 IF (this%driver == grid_id_grib_api)
THEN
487 IF (
c_e(this%gaid))
CALL grib_release(this%gaid)
492 CALL gdalnullify(this%gdalid)
493 NULLIFY(this%file_id)
498 END SUBROUTINE grid_id_delete
503 FUNCTION grid_id_readonly(this)
RESULT(readonly)
504 TYPE(
grid_id),
INTENT(in) :: this
507 readonly = this%driver /= grid_id_grib_api
509 END FUNCTION grid_id_readonly
517 SUBROUTINE grid_id_copy(this, that)
518 TYPE(
grid_id),
INTENT(in) :: this
519 TYPE(
grid_id),
INTENT(out) :: that
523 #ifdef HAVE_LIBGRIBAPI
524 IF (this%driver == grid_id_grib_api)
THEN
525 IF (
c_e(this%gaid))
THEN
527 CALL grib_clone(this%gaid, that%gaid)
532 IF (this%driver == grid_id_gdal)
THEN
541 END SUBROUTINE grid_id_copy
547 SUBROUTINE grid_id_export(this, file_id)
548 TYPE(
grid_id),
INTENT(inout) :: this
553 IF (
c_e(this) .AND.
c_e(file_id))
THEN
554 #ifdef HAVE_LIBGRIBAPI
555 IF (this%driver == grid_id_grib_api .AND. file_id%driver == grid_id_grib_api) &
556 CALL grib_write(this%gaid, file_id%gaid, ier)
560 IF (this%driver == grid_id_gdal .AND. file_id%driver == grid_id_gdal)
THEN
565 END SUBROUTINE grid_id_export
572 FUNCTION grid_id_c_e(this)
573 TYPE(
grid_id),
INTENT(in) :: this
574 LOGICAL :: grid_id_c_e
576 grid_id_c_e = .false.
578 #ifdef HAVE_LIBGRIBAPI
579 IF (this%driver == grid_id_grib_api)
THEN
580 grid_id_c_e =
c_e(this%gaid)
584 IF (this%driver == grid_id_gdal)
THEN
585 grid_id_c_e = gdalassociated(this%gdalid)
588 IF (this%driver == grid_id_no_driver)
THEN
589 grid_id_c_e =
c_e(this%nodriverid)
592 END FUNCTION grid_id_c_e
599 FUNCTION grid_id_c_e_v(this)
600 TYPE(
grid_id),
INTENT(in) :: this(:)
601 LOGICAL :: grid_id_c_e_v(SIZE(this))
606 grid_id_c_e_v(i) =
c_e(this(i))
609 END FUNCTION grid_id_c_e_v
616 FUNCTION grid_file_id_get_driver(this)
RESULT(driver)
618 CHARACTER(len=LEN(driverlist)) :: driver
620 IF (this%driver > 0 .AND. this%driver <=
SIZE(driverlist))
THEN
621 driver = driverlist(this%driver)
623 driver = driverlist(0)
626 END FUNCTION grid_file_id_get_driver
633 FUNCTION grid_id_get_driver(this)
RESULT(driver)
634 TYPE(
grid_id),
INTENT(in) :: this
635 CHARACTER(len=LEN(driverlist)) :: driver
637 IF (this%driver > 0 .AND. this%driver <=
SIZE(driverlist))
THEN
638 driver = driverlist(this%driver)
640 driver = driverlist(0)
643 END FUNCTION grid_id_get_driver
652 SUBROUTINE grid_id_display(this, namespace)
653 TYPE(
grid_id),
INTENT(in) :: this
654 CHARACTER(len=*),
OPTIONAL :: namespace
656 INTEGER :: kiter, iret
657 CHARACTER(len=255) :: key,
value, lnamespace
660 #ifdef HAVE_LIBGRIBAPI
661 IF (this%driver == grid_id_grib_api)
THEN
663 lnamespace = optio_c(namespace,255)
664 IF (.NOT.
c_e(lnamespace))
THEN
668 print*,
"GRIB_API namespace:",trim(lnamespace)
670 CALL grib_keys_iterator_new(this%gaid, kiter, namespace=trim(lnamespace))
673 CALL grib_keys_iterator_next(kiter, iret)
679 CALL grib_keys_iterator_get_name(kiter, key)
681 IF (key ==
'computeStatistics') cycle
683 CALL grib_get(this%gaid, trim(key),
value, iret)
685 print*, trim(key)//
' = '//trim(
VALUE)
687 print*, trim(key)//
' = '//
"KEY NOT FOUND, namespace :"//trim(lnamespace)//
" ( bug ? )"
691 CALL grib_keys_iterator_delete(kiter)
697 END SUBROUTINE grid_id_display
700 #ifdef HAVE_LIBGRIBAPI
703 FUNCTION grid_file_id_get_gaid(this)
RESULT(gaid)
707 END FUNCTION grid_file_id_get_gaid
711 FUNCTION grid_id_get_gaid(this)
RESULT(gaid)
712 TYPE(
grid_id),
INTENT(in) :: this
715 END FUNCTION grid_id_get_gaid
722 FUNCTION grid_file_id_get_gdalid(this)
RESULT(gdalid)
724 TYPE(gdaldataseth) :: gdalid
726 END FUNCTION grid_file_id_get_gdalid
730 FUNCTION grid_id_get_gdalid(this)
RESULT(gdalid)
731 TYPE(
grid_id),
INTENT(in) :: this
732 TYPE(gdalrasterbandh) :: gdalid
734 END FUNCTION grid_id_get_gdalid
738 FUNCTION grid_id_get_gdal_options(this)
RESULT(gdal_options)
739 TYPE(
grid_id),
INTENT(in) :: this
744 IF (
ASSOCIATED(this%file_id))
THEN
745 gdal_options = this%file_id%gdal_options
747 gdal_options = gdal_options_local
750 END FUNCTION grid_id_get_gdal_options
757 SUBROUTINE grid_id_decode_data(this, field)
758 TYPE(
grid_id),
INTENT(in) :: this
759 REAL,
INTENT(out) :: field(:,:)
764 #ifdef HAVE_LIBGRIBAPI
765 IF (
c_e(this%gaid))
THEN
766 CALL grid_id_decode_data_gribapi(this%gaid, field)
772 IF (gdalassociated(this%gdalid))
THEN
773 CALL grid_id_decode_data_gdal(this%gdalid, field, this%file_id%gdal_options)
777 IF (.NOT.done) field(:,:) = rmiss
779 END SUBROUTINE grid_id_decode_data
785 SUBROUTINE grid_id_encode_data(this, field)
786 TYPE(
grid_id),
INTENT(inout) :: this
787 REAL,
intent(in) :: field(:,:)
789 #ifdef HAVE_LIBGRIBAPI
790 IF (this%driver == grid_id_grib_api)
THEN
796 IF (
c_e(this%gaid))
CALL grid_id_encode_data_gribapi(this%gaid, field)
800 IF (this%driver == grid_id_gdal)
THEN
802 CALL l4f_log(l4f_warn,
"export to gdal not implemented" )
807 END SUBROUTINE grid_id_encode_data
810 #ifdef HAVE_LIBGRIBAPI
811 SUBROUTINE grid_id_decode_data_gribapi(gaid, field)
812 INTEGER,
INTENT(in) :: gaid
813 REAL,
INTENT(out) :: field(:,:)
815 INTEGER :: editionnumber
816 INTEGER :: alternativerowscanning, &
817 iscansnegatively, jscanspositively, jpointsareconsecutive
818 INTEGER :: numberofvalues,numberofpoints
819 REAL :: vector(size(field))
820 INTEGER :: x1, x2, xs, y1, y2, ys, ord(2), ierr
823 call grib_get(gaid,
'GRIBEditionNumber',editionnumber)
825 if (editionnumber == 2)
then
827 CALL grib_get(gaid,
'alternativeRowScanning',alternativerowscanning,ierr)
828 IF (ierr == grib_success .AND. alternativerowscanning /= 0)
THEN
829 CALL l4f_log(l4f_error,
"grib_api alternativeRowScanning not supported: " &
830 //
t2c(alternativerowscanning))
836 else if (editionnumber /= 1)
then
838 CALL l4f_log(l4f_error, &
839 "grib_api GribEditionNumber not supported: "//
t2c(editionnumber))
846 CALL grib_get(gaid,
'iScansNegatively',iscansnegatively,ierr)
847 IF (ierr /= grib_success) iscansnegatively=0
848 CALL grib_get(gaid,
'jScansPositively',jscanspositively,ierr)
849 IF (ierr /= grib_success) jscanspositively=1
850 CALL grib_get(gaid,
'jPointsAreConsecutive',jpointsareconsecutive,ierr)
851 IF (ierr /= grib_success) jpointsareconsecutive=0
853 call grib_get(gaid,
'numberOfPoints',numberofpoints)
854 call grib_get(gaid,
'numberOfValues',numberofvalues)
856 IF (numberofpoints /=
SIZE(field))
THEN
857 CALL l4f_log(l4f_error,
'grid_id_decode_data_gribapi numberOfPoints and grid size different')
858 CALL l4f_log(l4f_error,
'grid_id_decode_data_gribapi numberOfPoints: ' &
859 //
t2c(numberofpoints)//
', nx,ny: '&
860 //
t2c(
SIZE(field,1))//
','//
t2c(
SIZE(field,2)))
868 call l4f_log(l4f_info,
'grib_api number of values: '//
to_char(numberofvalues))
869 call l4f_log(l4f_info,
'grib_api number of points: '//
to_char(numberofpoints))
872 CALL grib_set(gaid,
'missingValue',rmiss)
873 CALL grib_get(gaid,
'values',vector)
875 IF (numberofvalues == 0) vector = rmiss
878 CALL l4f_log(l4f_debug,
'grib_api, decoded field in interval: '// &
879 t2c(minval(vector,mask=
c_e(vector)))//
' '//
t2c(maxval(vector,mask=
c_e(vector))))
880 CALL l4f_log(l4f_debug,
'grib_api, decoded field with number of missing: '// &
881 t2c(count(.NOT.
c_e(vector))))
884 IF (numberofvalues /= count(
c_e(vector)))
THEN
885 CALL l4f_log(l4f_warn,
'grid_id_decode_data_gribapi numberOfValues and valid data count different')
886 CALL l4f_log(l4f_warn,
'grid_id_decode_data_gribapi numberOfValues: ' &
887 //
t2c(numberofvalues)//
', valid data: '//
t2c(count(
c_e(vector))))
892 IF (iscansnegatively == 0)
THEN
901 IF (jscanspositively == 0)
THEN
911 IF ( jpointsareconsecutive == 0)
THEN
917 field(x1:x2:xs,y1:y2:ys) = reshape(vector, &
918 (/
SIZE(field,1),
SIZE(field,2)/), order=ord)
920 END SUBROUTINE grid_id_decode_data_gribapi
923 SUBROUTINE grid_id_encode_data_gribapi(gaid, field)
924 INTEGER,
INTENT(in) :: gaid
925 REAL,
intent(in) :: field(:,:)
927 INTEGER :: editionnumber
928 INTEGER :: alternativerowscanning, iscansnegatively, &
929 jscanspositively, jpointsareconsecutive
930 INTEGER :: x1, x2, xs, y1, y2, ys, ierr
932 call grib_get(gaid,
'GRIBEditionNumber',editionnumber)
934 if (editionnumber == 2)
then
936 CALL grib_get(gaid,
'alternativeRowScanning',alternativerowscanning,ierr)
937 IF (ierr == grib_success .AND. alternativerowscanning /= 0)
THEN
938 CALL l4f_log(l4f_error,
"grib_api alternativeRowScanning not supported: " &
939 //trim(
to_char(alternativerowscanning)))
944 else if( editionnumber /= 1)
then
946 call l4f_log(l4f_error, &
947 "grib_api GribEditionNumber not supported: "//
t2c(editionnumber))
953 CALL grib_get(gaid,
'iScansNegatively',iscansnegatively,ierr)
954 IF (ierr /= grib_success) iscansnegatively=0
955 CALL grib_get(gaid,
'jScansPositively',jscanspositively,ierr)
956 IF (ierr /= grib_success) jscanspositively=1
957 CALL grib_get(gaid,
'jPointsAreConsecutive',jpointsareconsecutive,ierr)
958 IF (ierr /= grib_success) jpointsareconsecutive=0
964 CALL l4f_log(l4f_debug,
'grib_api, Ni,Nj:'//
t2c(
SIZE(field,1))//
','//
t2c(
SIZE(field,2)))
966 CALL grib_set(gaid,
'Ni',
SIZE(field,1), ierr)
967 CALL grib_set(gaid,
'Nj',
SIZE(field,2), ierr)
970 IF (iscansnegatively == 0)
THEN
979 IF (jscanspositively == 0)
THEN
990 IF (any(field == rmiss))
THEN
992 CALL grib_set(gaid,
'missingValue',rmiss)
993 IF (editionnumber == 1)
THEN
998 CALL grib_set(gaid,
"bitmapPresent",1)
1001 CALL grib_set(gaid,
"bitMapIndicator",0)
1006 IF (editionnumber == 1)
THEN
1008 CALL grib_set(gaid,
"bitmapPresent",0)
1011 CALL grib_set(gaid,
"bitMapIndicator",255)
1017 CALL l4f_log(l4f_debug,
'grib_api, coding field in interval: '// &
1018 t2c(minval(field,mask=
c_e(field)))//
' '//
t2c(maxval(field,mask=
c_e(field))))
1019 CALL l4f_log(l4f_debug,
'grib_api, coding field with number of missing: '// &
1020 t2c(count(.NOT.
c_e(field))))
1021 CALL l4f_log(l4f_debug,
'grib_api, sizex:'//
t2c(x1)//
','//
t2c(x2)//
','//
t2c(xs))
1022 CALL l4f_log(l4f_debug,
'grib_api, sizey:'//
t2c(y1)//
','//
t2c(y2)//
','//
t2c(ys))
1024 IF (jpointsareconsecutive == 0)
THEN
1025 CALL grib_set(gaid,
'values', reshape(field(x1:x2:xs,y1:y2:ys), &
1028 CALL grib_set(gaid,
'values', reshape(transpose(field(x1:x2:xs,y1:y2:ys)), &
1032 END SUBROUTINE grid_id_encode_data_gribapi
1037 SUBROUTINE grid_id_decode_data_gdal(gdalid, field, gdal_options)
1038 #ifdef F2003_FULL_FEATURES
1041 TYPE(gdalrasterbandh),
INTENT(in) :: gdalid
1042 REAL,
INTENT(out) :: field(:,:)
1045 TYPE(gdaldataseth) :: hds
1046 REAL(kind=c_double) :: geotrans(6), dummy1, dummy2, dummy3, dummy4
1048 REAL,
ALLOCATABLE :: buffer(:,:)
1049 INTEGER :: ix1, iy1, ix2, iy2, ixs, iys, ord(2), ier
1050 INTEGER(kind=c_int) :: nrx, nry
1051 LOGICAL :: must_trans
1054 hds = gdalgetbanddataset(gdalid)
1055 ier = gdalgetgeotransform(hds, geotrans)
1057 IF (geotrans(3) == 0.0_c_double .AND. geotrans(5) == 0.0_c_double)
THEN
1059 IF (geotrans(2) > 0.0_c_double)
THEN
1068 IF (geotrans(6) > 0.0_c_double)
THEN
1080 must_trans = .false.
1083 ELSE IF (geotrans(2) == 0.0_c_double .AND. geotrans(6) == 0.0_c_double)
THEN
1085 IF (geotrans(3) > 0.0_c_double)
THEN
1094 IF (geotrans(5) > 0.0_c_double)
THEN
1110 CALL l4f_log(l4f_error,
'gdal geotransform is a generic rotation, not supported')
1117 CALL gdalrastersimpleread_f(gdalid, gdal_options%xmin, gdal_options%ymin, &
1118 gdal_options%xmax, gdal_options%ymax, buffer, dummy1, dummy2, dummy3, dummy4)
1120 IF (.NOT.
ALLOCATED(buffer))
THEN
1121 CALL l4f_log(l4f_error,
'gdal error in reading with gdal driver')
1127 IF (
SIZE(buffer) /= (
SIZE(field)))
THEN
1128 CALL l4f_log(l4f_error,
'gdal raster band and gridinfo size different')
1129 CALL l4f_log(l4f_error,
'gdal rasterband: ' &
1130 //
t2c(
SIZE(buffer,1))//
'X'//
t2c(
SIZE(buffer,2))//
', nx,ny:' &
1131 //
t2c(
SIZE(field,ord(1)))//
'X'//
t2c(
SIZE(field,ord(2))))
1137 #ifdef F2003_FULL_FEATURES
1139 WHERE(ieee_is_nan(buffer))
1143 WHERE(buffer /= buffer)
1149 gdalmiss = real(gdalgetrasternodatavalue(gdalid, ier))
1152 CALL l4f_log(l4f_info,
'gdal missing data value: '//trim(
to_char(gdalmiss)))
1154 WHERE(buffer(:,:) == gdalmiss)
1159 CALL l4f_log(l4f_info,
'gdal no missing data found in band')
1164 IF (must_trans)
THEN
1165 field(ix1:ix2:ixs,iy1:iy2:iys) = transpose(buffer)
1167 field(ix1:ix2:ixs,iy1:iy2:iys) = buffer(:,:)
1171 END SUBROUTINE grid_id_decode_data_gdal
Set of functions that return a trimmed CHARACTER representation of the input variable.
Set of functions that return a CHARACTER representation of the input variable.
Methods for successively obtaining the fields of a csv_record object.
Check whether the corresponding object has been correctly associated.
Make a deep copy, if possible, of the grid identifier.
Destructors for the corresponding classes.
Display on standard output a description of the grid_id object provided.
Constructors for the corresponding classes in SUBROUTINE form.
Utilities for CHARACTER variables.
Utilities for managing files.
This module defines an abstract interface to different drivers for access to files containing gridded...
classe per la gestione del logging
Definitions of constants and functions for working with missing values.
Module for quickly interpreting the OPTIONAL parameters passed to a subprogram.
Derived type containing driver-specific options for gdal.
Derived type associated to a file-like object containing many blocks/messages/records/bands of gridde...
Derived type associated to a block/message/record/band of gridded data coming from a file-like object...