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)
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
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(:,:)
1043 TYPE(gdal_file_id_options),
INTENT(in) :: gdal_options
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.
Derived type associated to a block/message/record/band of gridded data coming from a file-like object...
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...
This module defines an abstract interface to different drivers for access to files containing gridded...
Destructors for the corresponding classes.
Utilities for managing files.
Methods for successively obtaining the fields of a csv_record object.
Check whether the corresponding object has been correctly associated.
Set of functions that return a CHARACTER representation of the input variable.
Make a deep copy, if possible, of the grid identifier.
Definitions of constants and functions for working with missing values.
Constructors for the corresponding classes in SUBROUTINE form.
classe per la gestione del logging
Utilities for CHARACTER variables.
Display on standard output a description of the grid_id object provided.