76INTEGER,
PARAMETER :: grid_id_no_driver = 0
77INTEGER,
PARAMETER :: grid_id_grib_api = 1
78INTEGER,
PARAMETER :: grid_id_gdal = 2
80#if defined HAVE_LIBGRIBAPI
81INTEGER,
PARAMETER :: grid_id_default = grid_id_grib_api
82#elif defined HAVE_LIBGDAL
83INTEGER,
PARAMETER :: grid_id_default = grid_id_gdal
85INTEGER,
PARAMETER :: grid_id_default = grid_id_no_driver
88CHARACTER(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
112TYPE(gdaldataseth) :: gdalid
113INTEGER :: nlastband=0
114TYPE(gdal_file_id_options) :: gdal_options
115TYPE(grid_file_id),
POINTER :: file_id_copy=>null()
117INTEGER :: driver=grid_id_default
125INTEGER :: nodriverid=imiss
126#ifdef HAVE_LIBGRIBAPI
130TYPE(gdalrasterbandh) :: gdalid
131TYPE(grid_file_id),
POINTER :: file_id=>null()
133INTEGER :: 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
191PRIVATE 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
197SUBROUTINE grid_file_id_init(this, filename, mode, driver, from_grid_id)
198TYPE(grid_file_id),
INTENT(out) :: this
199CHARACTER(len=*),
INTENT(in) :: filename
200CHARACTER(len=*),
INTENT(in) :: mode
201INTEGER,
INTENT(in),
OPTIONAL :: driver
202TYPE(grid_id),
INTENT(in),
OPTIONAL :: from_grid_id
204this = grid_file_id_new(filename, mode, driver, from_grid_id)
206END SUBROUTINE grid_file_id_init
221FUNCTION grid_file_id_new(filename, mode, driver, from_grid_id)
RESULT(this)
222CHARACTER(len=*),
INTENT(in) :: filename
223CHARACTER(len=*),
INTENT(in) :: mode
224INTEGER,
INTENT(in),
OPTIONAL :: driver
225TYPE(grid_id),
INTENT(in),
OPTIONAL :: from_grid_id
226TYPE(grid_file_id) :: this
232TYPE(csv_record) :: driveropts
233CHARACTER(len=12) :: drivername
236CALL gdalnullify(this%gdalid)
239IF (filename ==
'' .OR. .NOT.
c_e(filename))
RETURN
241n =
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)')
272IF (
PRESENT(driver))
THEN
275IF (
PRESENT(from_grid_id))
THEN
276 this%driver = from_grid_id%driver
279#ifdef HAVE_LIBGRIBAPI
280IF (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
286IF (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
300END FUNCTION grid_file_id_new
306FUNCTION grid_file_id_count(this)
RESULT(count)
307TYPE(grid_file_id),
INTENT(in) :: this
313#ifdef HAVE_LIBGRIBAPI
314IF (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
322IF (this%driver == grid_id_gdal)
THEN
323 IF (gdalassociated(this%gdalid))
THEN
324 count = gdalgetrastercount(this%gdalid)
329END FUNCTION grid_file_id_count
337SUBROUTINE grid_file_id_delete(this)
338TYPE(grid_file_id),
INTENT(inout) :: this
340#ifdef HAVE_LIBGRIBAPI
341IF (this%driver == grid_id_grib_api)
THEN
342 IF (
c_e(this%gaid))
CALL grib_close_file(this%gaid)
347IF (this%driver == grid_id_gdal)
THEN
352CALL gdalnullify(this%gdalid)
357END SUBROUTINE grid_file_id_delete
363FUNCTION grid_file_id_c_e(this)
364TYPE(grid_file_id),
INTENT(in) :: this
365LOGICAL :: grid_file_id_c_e
367grid_file_id_c_e = .false.
369#ifdef HAVE_LIBGRIBAPI
370IF (this%driver == grid_id_grib_api)
THEN
371 grid_file_id_c_e =
c_e(this%gaid)
375IF (this%driver == grid_id_gdal)
THEN
376 grid_file_id_c_e = gdalassociated(this%gdalid)
380END FUNCTION grid_file_id_c_e
386FUNCTION grid_file_id_c_e_v(this)
387TYPE(grid_file_id),
INTENT(in) :: this(:)
388LOGICAL :: grid_file_id_c_e_v(SIZE(this))
393 grid_file_id_c_e_v(i) =
c_e(this(i))
396END FUNCTION grid_file_id_c_e_v
399SUBROUTINE grid_id_init(this, from_grid_file_id, grib_api_template, grib_api_id)
400TYPE(grid_id),
INTENT(out) :: this
401TYPE(grid_file_id),
INTENT(inout),
OPTIONAL :: from_grid_file_id
402CHARACTER(len=*),
INTENT(in),
OPTIONAL :: grib_api_template
403INTEGER,
INTENT(in),
OPTIONAL :: grib_api_id
405this = grid_id_new(from_grid_file_id, grib_api_template, grib_api_id)
407END SUBROUTINE grid_id_init
419FUNCTION grid_id_new(from_grid_file_id, grib_api_template, grib_api_id, &
420 no_driver_id)
RESULT(this)
421TYPE(grid_file_id),
INTENT(inout),
OPTIONAL,
TARGET :: from_grid_file_id
422CHARACTER(len=*),
INTENT(in),
OPTIONAL :: grib_api_template
423INTEGER,
INTENT(in),
OPTIONAL :: grib_api_id
424INTEGER,
INTENT(in),
OPTIONAL :: no_driver_id
430CALL gdalnullify(this%gdalid)
433IF (
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
461ELSE 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
465ELSE IF (
PRESENT(grib_api_id))
THEN
466 this%driver = grid_id_grib_api
467 this%gaid = grib_api_id
469ELSE IF (
PRESENT(no_driver_id))
THEN
470 this%driver = grid_id_no_driver
471 this%nodriverid = no_driver_id
474END FUNCTION grid_id_new
481SUBROUTINE grid_id_delete(this)
482TYPE(grid_id),
INTENT(inout) :: this
484this%nodriverid = imiss
485#ifdef HAVE_LIBGRIBAPI
486IF (this%driver == grid_id_grib_api)
THEN
487 IF (
c_e(this%gaid))
CALL grib_release(this%gaid)
492CALL gdalnullify(this%gdalid)
498END SUBROUTINE grid_id_delete
503FUNCTION grid_id_readonly(this)
RESULT(readonly)
504TYPE(
grid_id),
INTENT(in) :: this
507readonly = this%driver /= grid_id_grib_api
509END FUNCTION grid_id_readonly
517SUBROUTINE grid_id_copy(this, that)
518TYPE(
grid_id),
INTENT(in) :: this
519TYPE(
grid_id),
INTENT(out) :: that
523#ifdef HAVE_LIBGRIBAPI
524IF (this%driver == grid_id_grib_api)
THEN
525 IF (
c_e(this%gaid))
THEN
527 CALL grib_clone(this%gaid, that%gaid)
532IF (this%driver == grid_id_gdal)
THEN
541END SUBROUTINE grid_id_copy
547SUBROUTINE grid_id_export(this, file_id)
548TYPE(
grid_id),
INTENT(inout) :: this
553IF (
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)
560IF (this%driver == grid_id_gdal .AND. file_id%driver == grid_id_gdal)
THEN
565END SUBROUTINE grid_id_export
572FUNCTION grid_id_c_e(this)
573TYPE(
grid_id),
INTENT(in) :: this
574LOGICAL :: grid_id_c_e
578#ifdef HAVE_LIBGRIBAPI
579IF (this%driver == grid_id_grib_api)
THEN
580 grid_id_c_e =
c_e(this%gaid)
584IF (this%driver == grid_id_gdal)
THEN
585 grid_id_c_e = gdalassociated(this%gdalid)
588IF (this%driver == grid_id_no_driver)
THEN
589 grid_id_c_e =
c_e(this%nodriverid)
592END FUNCTION grid_id_c_e
599FUNCTION grid_id_c_e_v(this)
600TYPE(
grid_id),
INTENT(in) :: this(:)
601LOGICAL :: grid_id_c_e_v(SIZE(this))
606 grid_id_c_e_v(i) =
c_e(this(i))
609END FUNCTION grid_id_c_e_v
616FUNCTION grid_file_id_get_driver(this)
RESULT(driver)
618CHARACTER(len=LEN(driverlist)) :: driver
620IF (this%driver > 0 .AND. this%driver <=
SIZE(driverlist))
THEN
621 driver = driverlist(this%driver)
623 driver = driverlist(0)
626END FUNCTION grid_file_id_get_driver
633FUNCTION grid_id_get_driver(this)
RESULT(driver)
634TYPE(
grid_id),
INTENT(in) :: this
635CHARACTER(len=LEN(driverlist)) :: driver
637IF (this%driver > 0 .AND. this%driver <=
SIZE(driverlist))
THEN
638 driver = driverlist(this%driver)
640 driver = driverlist(0)
643END FUNCTION grid_id_get_driver
652SUBROUTINE grid_id_display(this, namespace)
653TYPE(
grid_id),
INTENT(in) :: this
654CHARACTER(len=*),
OPTIONAL :: namespace
656INTEGER :: kiter, iret
657CHARACTER(len=255) :: key,
value, lnamespace
660#ifdef HAVE_LIBGRIBAPI
661IF (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)
697END SUBROUTINE grid_id_display
700#ifdef HAVE_LIBGRIBAPI
703FUNCTION grid_file_id_get_gaid(this)
RESULT(gaid)
707END FUNCTION grid_file_id_get_gaid
711FUNCTION grid_id_get_gaid(this)
RESULT(gaid)
712TYPE(
grid_id),
INTENT(in) :: this
715END FUNCTION grid_id_get_gaid
722FUNCTION grid_file_id_get_gdalid(this)
RESULT(gdalid)
724TYPE(gdaldataseth) :: gdalid
726END FUNCTION grid_file_id_get_gdalid
730FUNCTION grid_id_get_gdalid(this)
RESULT(gdalid)
731TYPE(
grid_id),
INTENT(in) :: this
732TYPE(gdalrasterbandh) :: gdalid
734END FUNCTION grid_id_get_gdalid
738FUNCTION grid_id_get_gdal_options(this)
RESULT(gdal_options)
739TYPE(
grid_id),
INTENT(in) :: this
744IF (
ASSOCIATED(this%file_id))
THEN
745 gdal_options = this%file_id%gdal_options
747 gdal_options = gdal_options_local
750END FUNCTION grid_id_get_gdal_options
757SUBROUTINE grid_id_decode_data(this, field)
758TYPE(
grid_id),
INTENT(in) :: this
759REAL,
INTENT(out) :: field(:,:)
764#ifdef HAVE_LIBGRIBAPI
765IF (
c_e(this%gaid))
THEN
766 CALL grid_id_decode_data_gribapi(this%gaid, field)
772IF (gdalassociated(this%gdalid))
THEN
773 CALL grid_id_decode_data_gdal(this%gdalid, field, this%file_id%gdal_options)
777IF (.NOT.done) field(:,:) = rmiss
779END SUBROUTINE grid_id_decode_data
785SUBROUTINE grid_id_encode_data(this, field)
786TYPE(
grid_id),
INTENT(inout) :: this
787REAL,
intent(in) :: field(:,:)
789#ifdef HAVE_LIBGRIBAPI
790IF (this%driver == grid_id_grib_api)
THEN
796 IF (
c_e(this%gaid))
CALL grid_id_encode_data_gribapi(this%gaid, field)
800IF (this%driver == grid_id_gdal)
THEN
802 CALL l4f_log(l4f_warn,
"export to gdal not implemented" )
807END SUBROUTINE grid_id_encode_data
810#ifdef HAVE_LIBGRIBAPI
811SUBROUTINE grid_id_decode_data_gribapi(gaid, field)
812INTEGER,
INTENT(in) :: gaid
813REAL,
INTENT(out) :: field(:,:)
815INTEGER :: editionnumber
816INTEGER :: alternativerowscanning, &
817 iscansnegatively, jscanspositively, jpointsareconsecutive
818INTEGER :: numberofvalues,numberofpoints
819REAL :: vector(size(field))
820INTEGER :: x1, x2, xs, y1, y2, ys, ord(2), ierr
823call grib_get(gaid,
'GRIBEditionNumber',editionnumber)
825if (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))
836else if (editionnumber /= 1)
then
838 CALL l4f_log(l4f_error, &
839 "grib_api GribEditionNumber not supported: "//
t2c(editionnumber))
846CALL grib_get(gaid,
'iScansNegatively',iscansnegatively,ierr)
847IF (ierr /= grib_success) iscansnegatively=0
848CALL grib_get(gaid,
'jScansPositively',jscanspositively,ierr)
849IF (ierr /= grib_success) jscanspositively=1
850CALL grib_get(gaid,
'jPointsAreConsecutive',jpointsareconsecutive,ierr)
851IF (ierr /= grib_success) jpointsareconsecutive=0
853call grib_get(gaid,
'numberOfPoints',numberofpoints)
854call grib_get(gaid,
'numberOfValues',numberofvalues)
856IF (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)))
868call l4f_log(l4f_info,
'grib_api number of values: '//
to_char(numberofvalues))
869call l4f_log(l4f_info,
'grib_api number of points: '//
to_char(numberofpoints))
872CALL grib_set(gaid,
'missingValue',rmiss)
873CALL grib_get(gaid,
'values',vector)
875IF (numberofvalues == 0) vector = rmiss
878CALL 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))))
880CALL l4f_log(l4f_debug,
'grib_api, decoded field with number of missing: '// &
881 t2c(count(.NOT.
c_e(vector))))
884IF (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))))
892IF (iscansnegatively == 0)
THEN
901IF (jscanspositively == 0)
THEN
911IF ( jpointsareconsecutive == 0)
THEN
917field(x1:x2:xs,y1:y2:ys) = reshape(vector, &
918 (/
SIZE(field,1),
SIZE(field,2)/), order=ord)
920END SUBROUTINE grid_id_decode_data_gribapi
923SUBROUTINE grid_id_encode_data_gribapi(gaid, field)
924INTEGER,
INTENT(in) :: gaid
925REAL,
intent(in) :: field(:,:)
927INTEGER :: editionnumber
928INTEGER :: alternativerowscanning, iscansnegatively, &
929 jscanspositively, jpointsareconsecutive
930INTEGER :: x1, x2, xs, y1, y2, ys, ierr
932call grib_get(gaid,
'GRIBEditionNumber',editionnumber)
934if (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)))
944else if( editionnumber /= 1)
then
946 call l4f_log(l4f_error, &
947 "grib_api GribEditionNumber not supported: "//
t2c(editionnumber))
953CALL grib_get(gaid,
'iScansNegatively',iscansnegatively,ierr)
954IF (ierr /= grib_success) iscansnegatively=0
955CALL grib_get(gaid,
'jScansPositively',jscanspositively,ierr)
956IF (ierr /= grib_success) jscanspositively=1
957CALL grib_get(gaid,
'jPointsAreConsecutive',jpointsareconsecutive,ierr)
958IF (ierr /= grib_success) jpointsareconsecutive=0
964CALL l4f_log(l4f_debug,
'grib_api, Ni,Nj:'//
t2c(
SIZE(field,1))//
','//
t2c(
SIZE(field,2)))
966CALL grib_set(gaid,
'Ni',
SIZE(field,1), ierr)
967CALL grib_set(gaid,
'Nj',
SIZE(field,2), ierr)
970IF (iscansnegatively == 0)
THEN
979IF (jscanspositively == 0)
THEN
990IF (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)
1017CALL 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))))
1019CALL l4f_log(l4f_debug,
'grib_api, coding field with number of missing: '// &
1020 t2c(count(.NOT.
c_e(field))))
1021CALL l4f_log(l4f_debug,
'grib_api, sizex:'//
t2c(x1)//
','//
t2c(x2)//
','//
t2c(xs))
1022CALL l4f_log(l4f_debug,
'grib_api, sizey:'//
t2c(y1)//
','//
t2c(y2)//
','//
t2c(ys))
1024IF (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)), &
1032END SUBROUTINE grid_id_encode_data_gribapi
1037SUBROUTINE grid_id_decode_data_gdal(gdalid, field, gdal_options)
1038#ifdef F2003_FULL_FEATURES
1041TYPE(gdalrasterbandh),
INTENT(in) :: gdalid
1042REAL,
INTENT(out) :: field(:,:)
1045TYPE(gdaldataseth) :: hds
1046REAL(kind=c_double) :: geotrans(6), dummy1, dummy2, dummy3, dummy4
1048REAL,
ALLOCATABLE :: buffer(:,:)
1049INTEGER :: ix1, iy1, ix2, iy2, ixs, iys, ord(2), ier
1050INTEGER(kind=c_int) :: nrx, nry
1051LOGICAL :: must_trans
1054hds = gdalgetbanddataset(gdalid)
1055ier = gdalgetgeotransform(hds, geotrans)
1057IF (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.
1083ELSE 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')
1117CALL gdalrastersimpleread_f(gdalid, gdal_options%xmin, gdal_options%ymin, &
1118 gdal_options%xmax, gdal_options%ymax, buffer, dummy1, dummy2, dummy3, dummy4)
1120IF (.NOT.
ALLOCATED(buffer))
THEN
1121 CALL l4f_log(l4f_error,
'gdal error in reading with gdal driver')
1127IF (
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
1139WHERE(ieee_is_nan(buffer))
1143WHERE(buffer /= buffer)
1149gdalmiss = 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')
1165 field(ix1:ix2:ixs,iy1:iy2:iys) = transpose(buffer)
1167 field(ix1:ix2:ixs,iy1:iy2:iys) = buffer(:,:)
1171END 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.
Class for interpreting the records of a csv file.
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...