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
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, done)
758TYPE(
grid_id),
INTENT(in) :: this
759REAL,
INTENT(out) :: field(:,:)
760LOGICAL,
OPTIONAL,
INTENT(out) :: done
765#ifdef HAVE_LIBGRIBAPI
766IF (
c_e(this%gaid))
THEN
767 CALL grid_id_decode_data_gribapi(this%gaid, field)
773IF (gdalassociated(this%gdalid))
THEN
774 CALL grid_id_decode_data_gdal(this%gdalid, field, this%file_id%gdal_options)
781IF (
PRESENT(done)) done = ldone
783END SUBROUTINE grid_id_decode_data
789SUBROUTINE grid_id_encode_data(this, field)
790TYPE(
grid_id),
INTENT(inout) :: this
791REAL,
intent(in) :: field(:,:)
793#ifdef HAVE_LIBGRIBAPI
794IF (this%driver == grid_id_grib_api)
THEN
800 IF (
c_e(this%gaid))
CALL grid_id_encode_data_gribapi(this%gaid, field)
804IF (this%driver == grid_id_gdal)
THEN
806 CALL l4f_log(l4f_warn,
"export to gdal not implemented" )
811END SUBROUTINE grid_id_encode_data
814#ifdef HAVE_LIBGRIBAPI
815SUBROUTINE grid_id_decode_data_gribapi(gaid, field)
816INTEGER,
INTENT(in) :: gaid
817REAL,
INTENT(out),
TARGET,
CONTIGUOUS :: field(:,:)
819INTEGER :: editionnumber
820INTEGER :: alternativerowscanning, &
821 iscansnegatively, jscanspositively, jpointsareconsecutive
823INTEGER :: numberofvalues
825INTEGER :: numberofpoints
826REAL :: vector(size(field))
827REAL,
POINTER :: fieldp(:)
828INTEGER :: x1, x2, xs, y1, y2, ys, ord(2), ierr
831call grib_get(gaid,
'GRIBEditionNumber',editionnumber)
833if (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))
844else if (editionnumber /= 1)
then
846 CALL l4f_log(l4f_error, &
847 "grib_api GribEditionNumber not supported: "//
t2c(editionnumber))
854CALL grib_get(gaid,
'iScansNegatively',iscansnegatively,ierr)
855IF (ierr /= grib_success) iscansnegatively=0
856CALL grib_get(gaid,
'jScansPositively',jscanspositively,ierr)
857IF (ierr /= grib_success) jscanspositively=1
858CALL grib_get(gaid,
'jPointsAreConsecutive',jpointsareconsecutive,ierr)
859IF (ierr /= grib_success) jpointsareconsecutive=0
861call grib_get(gaid,
'numberOfPoints',numberofpoints)
863IF (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)))
875call grib_get(gaid,
'numberOfValues',numberofvalues)
876call l4f_log(l4f_info,
'grib_api number of values: '//
to_char(numberofvalues))
877call l4f_log(l4f_info,
'grib_api number of points: '//
to_char(numberofpoints))
880CALL grib_set(gaid,
'missingValue',rmiss)
882IF (iscansnegatively == 0 .AND. jscanspositively == 0 .AND. jpointsareconsecutive == 0)
THEN
884 fieldp(1:
SIZE(field)) => field
885 CALL grib_get(gaid,
'values',fieldp)
889CALL grib_get(gaid,
'values',vector)
894CALL 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))))
896CALL l4f_log(l4f_debug,
'grib_api, decoded field with number of missing: '// &
897 t2c(count(.NOT.
c_e(vector))))
899IF (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))))
908IF (iscansnegatively == 0)
THEN
917IF (jscanspositively == 0)
THEN
927IF (jpointsareconsecutive == 0)
THEN
933field(x1:x2:xs,y1:y2:ys) = reshape(vector, &
934 (/
SIZE(field,1),
SIZE(field,2)/), order=ord)
938END SUBROUTINE grid_id_decode_data_gribapi
941SUBROUTINE grid_id_encode_data_gribapi(gaid, field)
942INTEGER,
INTENT(in) :: gaid
943REAL,
intent(in) :: field(:,:)
945INTEGER :: EditionNumber
946INTEGER :: alternativeRowScanning, iScansNegatively, &
947 jScansPositively, jPointsAreConsecutive
948INTEGER :: x1, x2, xs, y1, y2, ys, ierr
950call grib_get(gaid,
'GRIBEditionNumber',editionnumber)
952if (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)))
962else if( editionnumber /= 1)
then
964 call l4f_log(l4f_error, &
965 "grib_api GribEditionNumber not supported: "//
t2c(editionnumber))
971CALL grib_get(gaid,
'iScansNegatively',iscansnegatively,ierr)
972IF (ierr /= grib_success) iscansnegatively=0
973CALL grib_get(gaid,
'jScansPositively',jscanspositively,ierr)
974IF (ierr /= grib_success) jscanspositively=1
975CALL grib_get(gaid,
'jPointsAreConsecutive',jpointsareconsecutive,ierr)
976IF (ierr /= grib_success) jpointsareconsecutive=0
982CALL l4f_log(l4f_debug,
'grib_api, Ni,Nj:'//
t2c(
SIZE(field,1))//
','//
t2c(
SIZE(field,2)))
984CALL grib_set(gaid,
'Ni',
SIZE(field,1), ierr)
985CALL grib_set(gaid,
'Nj',
SIZE(field,2), ierr)
988IF (iscansnegatively == 0)
THEN
997IF (jscanspositively == 0)
THEN
1008IF (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)
1035CALL 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))))
1037CALL l4f_log(l4f_debug,
'grib_api, coding field with number of missing: '// &
1038 t2c(count(.NOT.
c_e(field))))
1039CALL l4f_log(l4f_debug,
'grib_api, sizex:'//
t2c(x1)//
','//
t2c(x2)//
','//
t2c(xs))
1040CALL l4f_log(l4f_debug,
'grib_api, sizey:'//
t2c(y1)//
','//
t2c(y2)//
','//
t2c(ys))
1042IF (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)), &
1050END SUBROUTINE grid_id_encode_data_gribapi
1055SUBROUTINE grid_id_decode_data_gdal(gdalid, field, gdal_options)
1056#ifdef F2003_FULL_FEATURES
1059TYPE(gdalrasterbandh),
INTENT(in) :: gdalid
1060REAL,
INTENT(out) :: field(:,:)
1063TYPE(gdaldataseth) :: hds
1064REAL(kind=c_double) :: geotrans(6), dummy1, dummy2, dummy3, dummy4
1066REAL,
ALLOCATABLE :: buffer(:,:)
1067INTEGER :: ix1, iy1, ix2, iy2, ixs, iys, ord(2), ier
1068INTEGER(kind=c_int) :: nrx, nry
1069LOGICAL :: must_trans
1072hds = gdalgetbanddataset(gdalid)
1073ier = gdalgetgeotransform(hds, geotrans)
1075IF (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.
1101ELSE 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')
1135CALL gdalrastersimpleread_f(gdalid, gdal_options%xmin, gdal_options%ymin, &
1136 gdal_options%xmax, gdal_options%ymax, buffer, dummy1, dummy2, dummy3, dummy4)
1138IF (.NOT.
ALLOCATED(buffer))
THEN
1139 CALL l4f_log(l4f_error,
'gdal error in reading with gdal driver')
1145IF (
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
1157WHERE(ieee_is_nan(buffer))
1161WHERE(buffer /= buffer)
1167gdalmiss = 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')
1183 field(ix1:ix2:ixs,iy1:iy2:iys) = transpose(buffer)
1185 field(ix1:ix2:ixs,iy1:iy2:iys) = buffer(:,:)
1189END 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...