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, done)
758 TYPE(grid_id),
INTENT(in) :: this
759 REAL,
INTENT(out) :: field(:,:)
760 LOGICAL,
OPTIONAL,
INTENT(out) :: done
765 #ifdef HAVE_LIBGRIBAPI 766 IF (
c_e(this%gaid))
THEN 767 CALL grid_id_decode_data_gribapi(this%gaid, field)
773 IF (gdalassociated(this%gdalid))
THEN 774 CALL grid_id_decode_data_gdal(this%gdalid, field, this%file_id%gdal_options)
781 IF (
PRESENT(done)) done = ldone
783 END SUBROUTINE grid_id_decode_data
789 SUBROUTINE grid_id_encode_data(this, field)
790 TYPE(grid_id),
INTENT(inout) :: this
791 REAL,
intent(in) :: field(:,:)
793 #ifdef HAVE_LIBGRIBAPI 794 IF (this%driver == grid_id_grib_api)
THEN 800 IF (
c_e(this%gaid))
CALL grid_id_encode_data_gribapi(this%gaid, field)
804 IF (this%driver == grid_id_gdal)
THEN 806 CALL l4f_log(l4f_warn,
"export to gdal not implemented" )
811 END SUBROUTINE grid_id_encode_data
814 #ifdef HAVE_LIBGRIBAPI 815 SUBROUTINE grid_id_decode_data_gribapi(gaid, field)
816 INTEGER,
INTENT(in) :: gaid
817 REAL,
INTENT(out),
TARGET,
CONTIGUOUS :: field(:,:)
819 INTEGER :: editionnumber
820 INTEGER :: alternativerowscanning, &
821 iscansnegatively, jscanspositively, jpointsareconsecutive
823 INTEGER :: numberofvalues
825 INTEGER :: numberofpoints
826 REAL :: vector(size(field))
827 REAL,
POINTER :: fieldp(:)
828 INTEGER :: x1, x2, xs, y1, y2, ys, ord(2), ierr
831 call grib_get(gaid,
'GRIBEditionNumber',editionnumber)
833 if (editionnumber == 2)
then 835 CALL grib_get(gaid,
'alternativeRowScanning',alternativerowscanning,ierr)
836 IF (ierr == grib_success .AND. alternativerowscanning /= 0)
THEN 837 CALL l4f_log(l4f_error,
"grib_api alternativeRowScanning not supported: " &
838 //
t2c(alternativerowscanning))
844 else if (editionnumber /= 1)
then 846 CALL l4f_log(l4f_error, &
847 "grib_api GribEditionNumber not supported: "//
t2c(editionnumber))
854 CALL grib_get(gaid,
'iScansNegatively',iscansnegatively,ierr)
855 IF (ierr /= grib_success) iscansnegatively=0
856 CALL grib_get(gaid,
'jScansPositively',jscanspositively,ierr)
857 IF (ierr /= grib_success) jscanspositively=1
858 CALL grib_get(gaid,
'jPointsAreConsecutive',jpointsareconsecutive,ierr)
859 IF (ierr /= grib_success) jpointsareconsecutive=0
861 call grib_get(gaid,
'numberOfPoints',numberofpoints)
863 IF (numberofpoints /=
SIZE(field))
THEN 864 CALL l4f_log(l4f_error,
'grid_id_decode_data_gribapi numberOfPoints and grid size different')
865 CALL l4f_log(l4f_error,
'grid_id_decode_data_gribapi numberOfPoints: ' &
866 //
t2c(numberofpoints)//
', nx,ny: '&
867 //
t2c(
SIZE(field,1))//
','//
t2c(
SIZE(field,2)))
875 call grib_get(gaid,
'numberOfValues',numberofvalues)
876 call l4f_log(l4f_info,
'grib_api number of values: '//
to_char(numberofvalues))
877 call l4f_log(l4f_info,
'grib_api number of points: '//
to_char(numberofpoints))
880 CALL grib_set(gaid,
'missingValue',rmiss)
882 IF (iscansnegatively == 0 .AND. jscanspositively == 0 .AND. jpointsareconsecutive == 0)
THEN 884 fieldp(1:
SIZE(field)) => field
885 CALL grib_get(gaid,
'values',fieldp)
889 CALL grib_get(gaid,
'values',vector)
894 CALL l4f_log(l4f_debug,
'grib_api, decoded field in interval: '// &
895 t2c(minval(vector,mask=
c_e(vector)))//
' '//
t2c(maxval(vector,mask=
c_e(vector))))
896 CALL l4f_log(l4f_debug,
'grib_api, decoded field with number of missing: '// &
897 t2c(count(.NOT.
c_e(vector))))
899 IF (numberofvalues /= count(
c_e(vector)))
THEN 900 CALL l4f_log(l4f_warn,
'grid_id_decode_data_gribapi numberOfValues and valid data count different')
901 CALL l4f_log(l4f_warn,
'grid_id_decode_data_gribapi numberOfValues: ' &
902 //
t2c(numberofvalues)//
', valid data: '//
t2c(count(
c_e(vector))))
908 IF (iscansnegatively == 0)
THEN 917 IF (jscanspositively == 0)
THEN 927 IF (jpointsareconsecutive == 0)
THEN 933 field(x1:x2:xs,y1:y2:ys) = reshape(vector, &
934 (/
SIZE(field,1),
SIZE(field,2)/), order=ord)
938 END SUBROUTINE grid_id_decode_data_gribapi
941 SUBROUTINE grid_id_encode_data_gribapi(gaid, field)
942 INTEGER,
INTENT(in) :: gaid
943 REAL,
intent(in) :: field(:,:)
945 INTEGER :: editionnumber
946 INTEGER :: alternativerowscanning, iscansnegatively, &
947 jscanspositively, jpointsareconsecutive
948 INTEGER :: x1, x2, xs, y1, y2, ys, ierr
950 call grib_get(gaid,
'GRIBEditionNumber',editionnumber)
952 if (editionnumber == 2)
then 954 CALL grib_get(gaid,
'alternativeRowScanning',alternativerowscanning,ierr)
955 IF (ierr == grib_success .AND. alternativerowscanning /= 0)
THEN 956 CALL l4f_log(l4f_error,
"grib_api alternativeRowScanning not supported: " &
957 //trim(
to_char(alternativerowscanning)))
962 else if( editionnumber /= 1)
then 964 call l4f_log(l4f_error, &
965 "grib_api GribEditionNumber not supported: "//
t2c(editionnumber))
971 CALL grib_get(gaid,
'iScansNegatively',iscansnegatively,ierr)
972 IF (ierr /= grib_success) iscansnegatively=0
973 CALL grib_get(gaid,
'jScansPositively',jscanspositively,ierr)
974 IF (ierr /= grib_success) jscanspositively=1
975 CALL grib_get(gaid,
'jPointsAreConsecutive',jpointsareconsecutive,ierr)
976 IF (ierr /= grib_success) jpointsareconsecutive=0
982 CALL l4f_log(l4f_debug,
'grib_api, Ni,Nj:'//
t2c(
SIZE(field,1))//
','//
t2c(
SIZE(field,2)))
984 CALL grib_set(gaid,
'Ni',
SIZE(field,1), ierr)
985 CALL grib_set(gaid,
'Nj',
SIZE(field,2), ierr)
988 IF (iscansnegatively == 0)
THEN 997 IF (jscanspositively == 0)
THEN 1008 IF (any(field == rmiss))
THEN 1010 CALL grib_set(gaid,
'missingValue',rmiss)
1011 IF (editionnumber == 1)
THEN 1016 CALL grib_set(gaid,
"bitmapPresent",1)
1019 CALL grib_set(gaid,
"bitMapIndicator",0)
1024 IF (editionnumber == 1)
THEN 1026 CALL grib_set(gaid,
"bitmapPresent",0)
1029 CALL grib_set(gaid,
"bitMapIndicator",255)
1035 CALL l4f_log(l4f_debug,
'grib_api, coding field in interval: '// &
1036 t2c(minval(field,mask=
c_e(field)))//
' '//
t2c(maxval(field,mask=
c_e(field))))
1037 CALL l4f_log(l4f_debug,
'grib_api, coding field with number of missing: '// &
1038 t2c(count(.NOT.
c_e(field))))
1039 CALL l4f_log(l4f_debug,
'grib_api, sizex:'//
t2c(x1)//
','//
t2c(x2)//
','//
t2c(xs))
1040 CALL l4f_log(l4f_debug,
'grib_api, sizey:'//
t2c(y1)//
','//
t2c(y2)//
','//
t2c(ys))
1042 IF (jpointsareconsecutive == 0)
THEN 1043 CALL grib_set(gaid,
'values', reshape(field(x1:x2:xs,y1:y2:ys), &
1046 CALL grib_set(gaid,
'values', reshape(transpose(field(x1:x2:xs,y1:y2:ys)), &
1050 END SUBROUTINE grid_id_encode_data_gribapi
1055 SUBROUTINE grid_id_decode_data_gdal(gdalid, field, gdal_options)
1056 #ifdef F2003_FULL_FEATURES 1059 TYPE(gdalrasterbandh),
INTENT(in) :: gdalid
1060 REAL,
INTENT(out) :: field(:,:)
1061 TYPE(gdal_file_id_options),
INTENT(in) :: gdal_options
1063 TYPE(gdaldataseth) :: hds
1064 REAL(kind=c_double) :: geotrans(6), dummy1, dummy2, dummy3, dummy4
1066 REAL,
ALLOCATABLE :: buffer(:,:)
1067 INTEGER :: ix1, iy1, ix2, iy2, ixs, iys, ord(2), ier
1068 INTEGER(kind=c_int) :: nrx, nry
1069 LOGICAL :: must_trans
1072 hds = gdalgetbanddataset(gdalid)
1073 ier = gdalgetgeotransform(hds, geotrans)
1075 IF (geotrans(3) == 0.0_c_double .AND. geotrans(5) == 0.0_c_double)
THEN 1077 IF (geotrans(2) > 0.0_c_double)
THEN 1086 IF (geotrans(6) > 0.0_c_double)
THEN 1098 must_trans = .false.
1101 ELSE IF (geotrans(2) == 0.0_c_double .AND. geotrans(6) == 0.0_c_double)
THEN 1103 IF (geotrans(3) > 0.0_c_double)
THEN 1112 IF (geotrans(5) > 0.0_c_double)
THEN 1128 CALL l4f_log(l4f_error,
'gdal geotransform is a generic rotation, not supported')
1135 CALL gdalrastersimpleread_f(gdalid, gdal_options%xmin, gdal_options%ymin, &
1136 gdal_options%xmax, gdal_options%ymax, buffer, dummy1, dummy2, dummy3, dummy4)
1138 IF (.NOT.
ALLOCATED(buffer))
THEN 1139 CALL l4f_log(l4f_error,
'gdal error in reading with gdal driver')
1145 IF (
SIZE(buffer) /= (
SIZE(field)))
THEN 1146 CALL l4f_log(l4f_error,
'gdal raster band and gridinfo size different')
1147 CALL l4f_log(l4f_error,
'gdal rasterband: ' &
1148 //
t2c(
SIZE(buffer,1))//
'X'//
t2c(
SIZE(buffer,2))//
', nx,ny:' &
1149 //
t2c(
SIZE(field,ord(1)))//
'X'//
t2c(
SIZE(field,ord(2))))
1155 #ifdef F2003_FULL_FEATURES 1157 WHERE(ieee_is_nan(buffer))
1161 WHERE(buffer /= buffer)
1167 gdalmiss =
REAL(gdalgetrasternodatavalue(gdalid, ier))
1170 CALL l4f_log(l4f_info,
'gdal missing data value: '//trim(
to_char(gdalmiss)))
1172 WHERE(buffer(:,:) == gdalmiss)
1177 CALL l4f_log(l4f_info,
'gdal no missing data found in band')
1182 IF (must_trans)
THEN 1183 field(ix1:ix2:ixs,iy1:iy2:iys) = transpose(buffer)
1185 field(ix1:ix2:ixs,iy1:iy2:iys) = buffer(:,:)
1189 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.