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
117 INTEGER :: driver=grid_id_default
125 INTEGER :: nodriverid=imiss
126 #ifdef HAVE_LIBGRIBAPI
127 INTEGER :: gaid=imiss
130 TYPE(gdalrasterbandh
) :: gdalid
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)
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
228 INTEGER :: n, ier, nf
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)
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)
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)
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)
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
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
Definitions of constants and functions for working with missing values.
Functions that return a trimmed CHARACTER representation of the input variable.
Derived type associated to a block/message/record/band of gridded data coming from a file-like object...
This module defines an abstract interface to different drivers for access to files containing gridded...
Derived type containing driver-specific options for gdal.
Derived type associated to a file-like object containing many blocks/messages/records/bands of gridde...
Destructors for the corresponding classes.
Methods for successively obtaining the fields of a csv_record object.
Check whether the corresponding object has been correctly associated.
Restituiscono il valore dell'oggetto in forma di stringa stampabile.
Make a deep copy, if possible, of the grid identifier.
Constructors for the corresponding classes in SUBROUTINE form.
Class for interpreting the records of a csv file.
classe per la gestione del logging
Utilities for CHARACTER variables.
Module for quickly interpreting the OPTIONAL parameters passed to a subprogram.
Utilities for managing files.
Display on standard output a description of the grid_id object provided.