22 USE mo_kind,
ONLY : i4, dp
23 USE mo_os,
ONLY : check_path_isfile
24 USE mo_message,
only: error_message
137 header_yllcorner, header_cellsize, data, mask)
141 character(len = *),
intent(in) :: filename
144 integer(i4),
intent(in) :: fileunit
147 integer(i4),
intent(in) :: header_nRows
150 integer(i4),
intent(in) :: header_nCols
153 real(dp),
intent(in) :: header_xllcorner
156 real(dp),
intent(in) :: header_yllcorner
159 real(dp),
intent(in) :: header_cellsize
162 real(dp),
dimension(:, :),
allocatable,
intent(out) :: data
165 logical,
dimension(:, :),
allocatable,
intent(out) :: mask
168 integer(i4) :: file_nRows
171 integer(i4) :: file_nCols
174 real(dp) :: file_xllcorner
177 real(dp) :: file_yllcorner
180 real(dp) :: file_cellsize
183 real(dp) :: file_nodata
188 real(dp),
dimension(:, :),
allocatable :: tmp_data
191 logical,
dimension(:, :),
allocatable :: tmp_mask
196 file_ncols, file_nrows, &
197 file_xllcorner, file_yllcorner, file_cellsize, file_nodata)
198 if ((file_ncols .ne. header_ncols)) &
199 call error_message(
'read_spatial_data_ascii: header not matching with reference header: ncols')
200 if ((file_nrows .ne. header_nrows)) &
201 call error_message(
'read_spatial_data_ascii: header not matching with reference header: nrows')
202 if ((abs(file_xllcorner - header_xllcorner) .gt. tiny(1.0_dp))) &
203 call error_message(
'read_spatial_data_ascii: header not matching with reference header: xllcorner')
204 if ((abs(file_yllcorner - header_yllcorner) .gt. tiny(1.0_dp))) &
205 call error_message(
'read_spatial_data_ascii: header not matching with reference header: yllcorner')
206 if ((abs(file_cellsize - header_cellsize) .gt. tiny(1.0_dp))) &
207 call error_message(
'read_spatial_data_ascii: header not matching with reference header: cellsize')
210 allocate(tmp_data(file_nrows, file_ncols))
211 tmp_data = file_nodata
212 allocate(tmp_mask(file_nrows, file_ncols))
217 call check_path_isfile(path = filename, raise=.true.)
221 open (unit = fileunit, file = filename, action =
'read', status =
'old', recl = 48 * file_ncols)
228 read(fileunit, *) (tmp_data(i, j), j = 1, file_ncols)
233 where (abs(tmp_data - file_nodata) .lt. tiny(1.0_dp))
238 allocate(
data(file_ncols, file_nrows))
239 data = transpose(tmp_data)
242 allocate(mask(file_ncols, file_nrows))
243 mask = transpose(tmp_mask)
277 header_yllcorner, header_cellsize, data, mask)
281 character(len = *),
intent(in) :: filename
284 integer(i4),
intent(in) :: fileunit
287 integer(i4),
intent(in) :: header_nRows
290 integer(i4),
intent(in) :: header_nCols
293 real(dp),
intent(in) :: header_xllcorner
296 real(dp),
intent(in) :: header_yllcorner
299 real(dp),
intent(in) :: header_cellsize
302 integer(i4),
dimension(:, :),
allocatable,
intent(out) :: data
305 logical,
dimension(:, :),
allocatable,
intent(out) :: mask
308 integer(i4) :: file_nRows
311 integer(i4) :: file_nCols
314 real(dp) :: file_xllcorner
317 real(dp) :: file_yllcorner
320 real(dp) :: file_cellsize
323 real(dp) :: file_nodata
328 integer(i4),
dimension(:, :),
allocatable :: tmp_data
331 logical,
dimension(:, :),
allocatable :: tmp_mask
336 file_ncols, file_nrows, &
337 file_xllcorner, file_yllcorner, file_cellsize, file_nodata)
338 if ((file_ncols .ne. header_ncols)) &
339 call error_message(
'read_spatial_data_ascii: header not matching with reference header: ncols')
340 if ((file_nrows .ne. header_nrows)) &
341 call error_message(
'read_spatial_data_ascii: header not matching with reference header: nrows')
342 if ((abs(file_xllcorner - header_xllcorner) .gt. tiny(1.0_dp))) &
343 call error_message(
'read_spatial_data_ascii: header not matching with reference header: xllcorner')
344 if ((abs(file_yllcorner - header_yllcorner) .gt. tiny(1.0_dp))) &
345 call error_message(
'read_spatial_data_ascii: header not matching with reference header: yllcorner')
346 if ((abs(file_cellsize - header_cellsize) .gt. tiny(1.0_dp))) &
347 call error_message(
'read_spatial_data_ascii: header not matching with reference header: cellsize')
350 allocate(tmp_data(file_nrows, file_ncols))
351 tmp_data = int(file_nodata, i4)
352 allocate(tmp_mask(file_nrows, file_ncols))
356 call check_path_isfile(path = filename, raise=.true.)
360 open (unit = fileunit, file = filename, action =
'read', status =
'old', recl = 48 * file_ncols)
367 read(fileunit, *) (tmp_data(i, j), j = 1, file_ncols)
372 where (tmp_data .EQ. int(file_nodata, i4))
377 allocate(
data(file_ncols, file_nrows))
378 data = transpose(tmp_data)
381 allocate(mask(file_ncols, file_nrows))
382 mask = transpose(tmp_mask)
417 subroutine read_header_ascii(filename, fileunit, header_ncols, header_nrows, header_xllcorner, header_yllcorner, &
418 header_cellsize, header_nodata)
423 character(len = *),
intent(in) :: filename
426 integer(i4),
intent(in) :: fileunit
429 integer(i4),
intent(out) :: header_nrows
432 integer(i4),
intent(out) :: header_ncols
435 real(dp),
intent(out) :: header_xllcorner
438 real(dp),
intent(out) :: header_yllcorner
441 real(dp),
intent(out) :: header_cellsize
444 real(dp),
intent(out) :: header_nodata
446 character(5) :: dummy
450 call check_path_isfile(path = filename, raise=.true.)
452 open (unit = fileunit, file = filename, status =
'old')
453 read (fileunit, *) dummy, header_ncols
454 read (fileunit, *) dummy, header_nrows
455 read (fileunit, *) dummy, header_xllcorner
456 read (fileunit, *) dummy, header_yllcorner
457 read (fileunit, *) dummy, header_cellsize
458 read (fileunit, *, iostat=io) dummy, header_nodata
470 use mo_netcdf,
only : ncvariable
471 use mo_utils,
only: is_close
473 type(ncvariable),
intent(in) :: var
474 real(dp),
optional,
intent(out) :: cellsize
475 real(dp),
optional,
intent(out) :: origin
476 logical,
optional,
intent(out) :: increasing
477 real(dp),
intent(in),
optional :: tol
478 real(dp),
dimension(:),
allocatable :: axis
479 real(dp),
dimension(:,:),
allocatable :: bounds
480 real(dp) :: diff, tol_
481 integer(i4) :: i_ub, i_lb
483 type(ncvariable) :: bnds
484 character(len=256) :: name
486 call var%getData(axis)
487 if (var%hasAttribute(
"bounds"))
then
489 call var%getAttribute(
"bounds", name)
490 bnds = var%parent%getVariable(trim(name))
491 call bnds%getData(bounds)
499 if (
present(tol) ) tol_ = tol
501 if (
size(axis) == 0_i4) &
502 call error_message(
"check_uniform_axis: axis is empty: ", name)
504 if (
size(axis) > 1_i4)
then
505 diff = (axis(
size(axis)) - axis(1)) / real(
size(axis) - 1_i4, dp)
506 if (.not.all(is_close(axis(2:
size(axis))-axis(1:
size(axis)-1), diff, rtol=0.0_dp, atol=tol_))) &
507 call error_message(
"check_uniform_axis: given axis is not uniform: ", name)
509 if (.not. has_bnds) &
510 call error_message(
"check_uniform_axis: can't check axis of size 1 when no bounds are given: ", name)
511 diff = bounds(2,1) - bounds(1,1)
518 if (
size(bounds, dim=2)>1)
then
519 if (.not. is_close(bounds(2,1), bounds(1,2), rtol=0.0_dp, atol=tol_) &
520 .and. is_close(bounds(1,1), bounds(2,2), rtol=0.0_dp, atol=tol_))
then
521 print *,
"check_uniform_axis: bounds actually have wrong monotonicity: ", name
526 if (.not.all(is_close(bounds(i_ub,:)-bounds(i_lb,:), diff, rtol=0.0_dp, atol=tol_))) &
527 call error_message(
"check_uniform_axis: given bounds are not uniform: ", name)
528 if (.not.all(is_close(axis(:)-bounds(i_lb,:), 0.5_dp*diff, rtol=0.0_dp, atol=tol_))) &
529 call error_message(
"check_uniform_axis: given bounds are not centered around axis points: ", name)
532 if (
present(cellsize) ) cellsize = abs(diff)
533 if (
present(origin) ) origin = minval(axis) - 0.5_dp * abs(diff)
534 if (
present(increasing) ) increasing = diff > 0.0_dp
543 use mo_netcdf,
only : ncvariable
545 type(ncvariable),
intent(in) :: var
546 character(len=256) :: tmp_str
549 if (var%hasAttribute(
"standard_name"))
then
550 call var%getAttribute(
"standard_name", tmp_str)
551 if (trim(tmp_str) ==
"projection_x_coordinate")
is_x_axis = .true.
552 else if (var%hasAttribute(
"axis"))
then
553 call var%getAttribute(
"axis", tmp_str)
554 if (trim(tmp_str) ==
"X")
is_x_axis = .true.
555 else if (var%hasAttribute(
"_CoordinateAxisType"))
then
556 call var%getAttribute(
"_CoordinateAxisType", tmp_str)
557 if (trim(tmp_str) ==
"GeoX")
is_x_axis = .true.
566 use mo_netcdf,
only : ncvariable
568 type(ncvariable),
intent(in) :: var
569 character(len=256) :: tmp_str
572 if (var%hasAttribute(
"standard_name"))
then
573 call var%getAttribute(
"standard_name", tmp_str)
574 if (trim(tmp_str) ==
"projection_y_coordinate")
is_y_axis = .true.
575 else if (var%hasAttribute(
"axis"))
then
576 call var%getAttribute(
"axis", tmp_str)
577 if (trim(tmp_str) ==
"Y")
is_y_axis = .true.
578 else if (var%hasAttribute(
"_CoordinateAxisType"))
then
579 call var%getAttribute(
"_CoordinateAxisType", tmp_str)
580 if (trim(tmp_str) ==
"GeoY")
is_y_axis = .true.
589 use mo_netcdf,
only : ncvariable
591 type(ncvariable),
intent(in) :: var
592 character(len=256) :: tmp_str
595 if (var%hasAttribute(
"standard_name"))
then
596 call var%getAttribute(
"standard_name", tmp_str)
598 else if (var%hasAttribute(
"units"))
then
599 call var%getAttribute(
"units", tmp_str)
602 if (trim(tmp_str) ==
"degree_east")
is_lon_coord = .true.
605 if (trim(tmp_str) ==
"degrees_east")
is_lon_coord = .true.
606 else if (var%hasAttribute(
"_CoordinateAxisType"))
then
607 call var%getAttribute(
"_CoordinateAxisType", tmp_str)
609 else if (var%hasAttribute(
"long_name"))
then
610 call var%getAttribute(
"long_name", tmp_str)
621 use mo_netcdf,
only : ncvariable
623 type(ncvariable),
intent(in) :: var
624 character(len=256) :: tmp_str
627 if (var%hasAttribute(
"standard_name"))
then
628 call var%getAttribute(
"standard_name", tmp_str)
630 else if (var%hasAttribute(
"units"))
then
631 call var%getAttribute(
"units", tmp_str)
634 if (trim(tmp_str) ==
"degree_north")
is_lat_coord = .true.
637 if (trim(tmp_str) ==
"degrees_north")
is_lat_coord = .true.
638 else if (var%hasAttribute(
"_CoordinateAxisType"))
then
639 call var%getAttribute(
"_CoordinateAxisType", tmp_str)
641 else if (var%hasAttribute(
"long_name"))
then
642 call var%getAttribute(
"long_name", tmp_str)
653 use mo_netcdf,
only : ncdataset, ncvariable, ncdimension
654 use mo_utils,
only : is_close, flip
655 use mo_string_utils,
only : splitstring, num2str
657 type(ncdataset),
intent(in) :: nc
658 character(*),
intent(in) :: var
659 integer(i4),
intent(out) :: nx
660 integer(i4),
intent(out) :: ny
661 real(dp),
intent(out) :: xll
662 real(dp),
intent(out) :: yll
663 real(dp),
intent(out) :: cellsize
664 logical,
optional,
allocatable,
dimension(:,:),
intent(out) :: mask
667 type(ncvariable) :: ncvar, xvar, yvar
668 type(ncdimension),
dimension(:),
allocatable :: dims
670 integer(i4),
dimension(:),
allocatable :: shp, start, cnt
671 integer(i4) :: rnk, coordsys, y_dir
672 integer(i4) :: bottom_up, top_down
673 real(dp) :: cs_x, cs_y, tol
674 real(dp),
allocatable,
dimension(:,:) :: dummy
675 logical :: y_inc, x_sph, y_sph, x_cart, y_cart, flip_y
676 integer(i4) :: keep_y
686 ncvar = nc%getVariable(var)
687 rnk = ncvar%getRank()
688 if (rnk < 2)
call error_message(
"grid % from_netcdf: given variable has too few dimensions: ", trim(nc%fname),
":", var)
690 dims = ncvar%getDimensions()
691 nx = dims(1)%getLength()
692 ny = dims(2)%getLength()
693 xvar = nc%getVariable(trim(dims(1)%getName()))
694 yvar = nc%getVariable(trim(dims(2)%getName()))
698 call error_message(
"grid % from_netcdf: variable seems to have wrong axis order (not y-x): ", trim(nc%fname),
":", var)
705 if (.not.(x_cart.or.x_sph)) &
706 call error_message(
"grid % from_netcdf: can't determine coordinate system from x-axis: ", trim(nc%fname),
":", var)
707 if (.not.(y_cart.or.y_sph)) &
708 call error_message(
"grid % from_netcdf: can't determine coordinate system from y-axis: ", trim(nc%fname),
":", var)
709 if (.not.(x_sph.eqv.y_sph)) &
710 call error_message(
"grid % from_netcdf: x and y axis seem to have different coordinate systems: ", trim(nc%fname),
":", var)
713 if (x_sph) coordsys = 1_i4
718 if (y_dir == keep_y)
then
720 if (y_inc) y_dir = bottom_up
723 if (.not.any(y_dir==[bottom_up, top_down])) &
724 call error_message(
"grid % from_netcdf: y-direction not valid: ", trim(num2str(y_dir)))
727 flip_y = y_inc.neqv.(y_dir==bottom_up)
729 print *,
"grid % from_netcdf: y axis direction is oposite to desired one (inefficient flipping). ", &
730 "You could flip the file beforehand with: 'cdo invertlat <ifile> <ofile>'. ", trim(nc%fname),
":", var
733 if (.not.is_close(cs_x, cs_y, rtol=0.0_dp, atol=tol)) &
734 call error_message(
"grid % from_netcdf: x and y axis have different cell sizes: ", trim(nc%fname),
":", var)
738 if (
present(mask))
then
739 shp = ncvar%getShape()
740 allocate(start(rnk), source=1_i4)
741 allocate(cnt(rnk), source=1_i4)
744 call ncvar%getData(dummy, start=start, cnt=cnt, mask=mask)
764 subroutine read_spatial_data_nc_i4(ncname, varName, data, maskout, ncols, nrows, xllcorner, yllcorner, cellsize, nodata_value)
765 use mo_netcdf,
only : ncdataset, ncvariable
766 use mo_message,
only : error_message
769 character(len=*),
intent(in) :: ncname
770 character(len=*),
intent(in) :: varName
771 integer(i4),
dimension(:, :),
allocatable,
intent(out) :: data
772 logical,
optional,
allocatable,
dimension(:, :),
intent(out) :: maskout
773 integer(i4),
intent(out) :: ncols, nrows
774 real(dp),
intent(out) :: xllcorner, yllcorner, cellsize
775 real(dp),
intent(out) :: nodata_value
777 type(ncdataset) :: nc
778 type(ncvariable) :: var
779 integer(i4),
allocatable :: var_shape(:)
781 allocate(var_shape(2))
784 nc = ncdataset(ncname,
"r")
790 var = nc%getVariable(trim(varname))
793 var_shape = var%getShape()
796 if (var%hasAttribute(
"_FillValue"))
then
797 call var%getAttribute(
"_FillValue", nodata_value)
798 else if (var%hasAttribute(
"missing_value"))
then
799 call var%getAttribute(
"missing_value", nodata_value)
801 call error_message(
'***ERROR: read_nc_i4_data: missing _FillValue or missing_value attribute')
805 allocate(
data(var_shape(1), var_shape(2)))
806 call var%getData(
data, start=(/1, 1/), cnt=var_shape)
824 subroutine read_spatial_data_nc_dp(ncname, varName, data, maskout, ncols, nrows, xllcorner, yllcorner, cellsize, nodata_value)
825 use mo_netcdf,
only : ncdataset, ncvariable
826 use mo_message,
only : error_message
829 character(len=*),
intent(in) :: ncname
830 character(len=*),
intent(in) :: varName
831 real(dp),
dimension(:, :),
allocatable,
intent(out) :: data
832 logical,
optional,
allocatable,
dimension(:, :),
intent(out) :: maskout
833 integer(i4),
intent(out) :: ncols, nrows
834 real(dp),
intent(out) :: xllcorner, yllcorner, cellsize
835 real(dp),
intent(out) :: nodata_value
837 type(ncdataset) :: nc
838 type(ncvariable) :: var
839 integer(i4),
allocatable :: var_shape(:)
841 allocate(var_shape(2))
844 nc = ncdataset(ncname,
"r")
850 var = nc%getVariable(trim(varname))
853 var_shape = var%getShape()
856 if (var%hasAttribute(
"_FillValue"))
then
857 call var%getAttribute(
"_FillValue", nodata_value)
858 else if (var%hasAttribute(
"missing_value"))
then
859 call var%getAttribute(
"missing_value", nodata_value)
861 call error_message(
'***ERROR: read_nc_i4_data: missing _FillValue or missing_value attribute')
865 allocate(
data(var_shape(1), var_shape(2)))
866 call var%getData(
data, start=(/1, 1/), cnt=var_shape)
885 header_yllcorner, header_cellsize, data, maskout, &
886 out_nCols, out_nRows, out_xllcorner, out_yllcorner, out_cellsize, out_nodata_value)
887 use mo_netcdf,
only : ncdataset, ncvariable
888 use mo_os,
only : path_root, path_isfile, path_stem
892 character(len = *),
intent(in) :: filepath
895 integer(i4),
intent(in) :: fileunit
898 integer(i4),
intent(in) :: header_nRows
901 integer(i4),
intent(in) :: header_nCols
904 real(dp),
intent(in) :: header_xllcorner
907 real(dp),
intent(in) :: header_yllcorner
910 real(dp),
intent(in) :: header_cellsize
913 real(dp),
dimension(:, :),
allocatable,
intent(out) :: data
916 logical,
optional,
dimension(:, :),
allocatable,
intent(out) :: maskout
919 integer(i4),
optional,
intent(out) :: out_nRows
922 integer(i4),
optional,
intent(out) :: out_nCols
925 real(dp),
optional,
intent(out) :: out_xllcorner
928 real(dp),
optional,
intent(out) :: out_yllcorner
931 real(dp),
optional,
intent(out) :: out_cellsize
934 real(dp),
optional,
intent(out) :: out_nodata_value
937 type(ncdataset) :: nc
939 type(ncvariable) :: var
942 real(dp) :: nodata_value
943 integer(i4) :: nrows, ncols
944 real(dp) :: xllcorner, yllcorner, cellsize
945 character(len=:),
allocatable :: ncname, varName
946 integer(i4),
allocatable :: var_shape(:)
947 allocate(var_shape(2))
949 ncname = path_root(filepath) //
'.nc'
953 if (path_isfile(ncname))
then
954 varname = path_stem(ncname)
955 call read_spatial_data_nc(ncname, varname,
data, maskout, ncols, nrows, xllcorner, yllcorner, cellsize, nodata_value)
957 if ((header_ncols /= 0_i4) .and. (header_nrows /= 0_i4))
then
960 yllcorner = header_yllcorner
961 xllcorner = header_xllcorner
962 cellsize = header_cellsize
965 ncols, nrows, xllcorner, &
966 yllcorner, cellsize, nodata_value)
971 yllcorner, cellsize,
data, maskout)
974 if (
present(out_ncols)) &
976 if (
present(out_nrows)) &
978 if (
present(out_xllcorner)) &
979 out_xllcorner = xllcorner
980 if (
present(out_yllcorner)) &
981 out_yllcorner = yllcorner
982 if (
present(out_cellsize)) &
983 out_cellsize = cellsize
984 if (
present(out_nodata_value)) &
985 out_nodata_value = nodata_value
1003 header_yllcorner, header_cellsize, data, maskout, &
1004 out_nCols, out_nRows, out_xllcorner, out_yllcorner, out_cellsize, out_nodata_value)
1005 use mo_netcdf,
only : ncdataset, ncvariable
1006 use mo_os,
only : path_root, path_isfile, path_stem
1010 character(len = *),
intent(in) :: filepath
1013 integer(i4),
intent(in) :: fileunit
1016 integer(i4),
intent(in) :: header_nRows
1019 integer(i4),
intent(in) :: header_nCols
1022 real(dp),
intent(in) :: header_xllcorner
1025 real(dp),
intent(in) :: header_yllcorner
1028 real(dp),
intent(in) :: header_cellsize
1031 integer(i4),
dimension(:, :),
allocatable,
intent(out) :: data
1034 logical,
optional,
dimension(:, :),
allocatable,
intent(out) :: maskout
1037 integer(i4),
optional,
intent(out) :: out_nRows
1040 integer(i4),
optional,
intent(out) :: out_nCols
1043 real(dp),
optional,
intent(out) :: out_xllcorner
1046 real(dp),
optional,
intent(out) :: out_yllcorner
1049 real(dp),
optional,
intent(out) :: out_cellsize
1051 real(dp),
optional,
intent(out) :: out_nodata_value
1054 type(ncdataset) :: nc
1056 type(ncvariable) :: var
1059 real(dp) :: nodata_value
1060 integer(i4) :: nrows, ncols
1061 real(dp) :: xllcorner, yllcorner, cellsize
1062 character(len=:),
allocatable :: ncname, varName
1063 integer(i4),
allocatable :: var_shape(:)
1064 allocate(var_shape(2))
1066 ncname = path_root(filepath) //
'.nc'
1070 if (path_isfile(ncname))
then
1071 varname = path_stem(ncname)
1072 call read_spatial_data_nc(ncname, varname,
data, maskout, ncols, nrows, xllcorner, yllcorner, cellsize, nodata_value)
1074 if ((header_ncols /= 0_i4) .and. (header_nrows /= 0_i4))
then
1075 ncols = header_ncols
1076 nrows = header_nrows
1077 yllcorner = header_yllcorner
1078 xllcorner = header_xllcorner
1079 cellsize = header_cellsize
1082 ncols, nrows, xllcorner, &
1083 yllcorner, cellsize, nodata_value)
1088 yllcorner, cellsize,
data, maskout)
1091 if (
present(out_ncols)) &
1093 if (
present(out_nrows)) &
1095 if (
present(out_xllcorner)) &
1096 out_xllcorner = xllcorner
1097 if (
present(out_yllcorner)) &
1098 out_yllcorner = yllcorner
1099 if (
present(out_cellsize)) &
1100 out_cellsize = cellsize
1101 if (
present(out_nodata_value)) &
1102 out_nodata_value = nodata_value
Reads spatial data files of ASCII format.
Reads spatial data files of nc or ASCII format.
Reads spatial data files of nc format.
Provides constants commonly used by mHM, mRM and MPR.
real(dp), parameter, public nodata_dp
Reads spatial input data.
subroutine, public check_uniform_axis(var, cellsize, origin, increasing, tol)
check if given axis is a uniform axis.
subroutine, public get_header_info_from_nc(nc, var, nx, ny, xll, yll, cellsize, mask)
initialize grid from a netcdf dataset
subroutine read_spatial_data_nc_or_ascii_dp(filepath, fileunit, header_ncols, header_nrows, header_xllcorner, header_yllcorner, header_cellsize, data, maskout, out_ncols, out_nrows, out_xllcorner, out_yllcorner, out_cellsize, out_nodata_value)
Read file from filepath.
logical function is_y_axis(var)
check if given variable is a y-axis.
subroutine read_spatial_data_ascii_i4(filename, fileunit, header_ncols, header_nrows, header_xllcorner, header_yllcorner, header_cellsize, data, mask)
TODO: add description.
logical function is_lon_coord(var)
check if given variable is a lon coordinate.
subroutine read_spatial_data_ascii_dp(filename, fileunit, header_ncols, header_nrows, header_xllcorner, header_yllcorner, header_cellsize, data, mask)
TODO: add description.
subroutine read_spatial_data_nc_i4(ncname, varname, data, maskout, ncols, nrows, xllcorner, yllcorner, cellsize, nodata_value)
Read file from filepath.
subroutine read_spatial_data_nc_or_ascii_i4(filepath, fileunit, header_ncols, header_nrows, header_xllcorner, header_yllcorner, header_cellsize, data, maskout, out_ncols, out_nrows, out_xllcorner, out_yllcorner, out_cellsize, out_nodata_value)
Read file from filepath.
logical function is_x_axis(var)
check if given variable is a x-axis.
logical function is_lat_coord(var)
check if given variable is a lat coordinate.
subroutine read_spatial_data_nc_dp(ncname, varname, data, maskout, ncols, nrows, xllcorner, yllcorner, cellsize, nodata_value)
Read file from filepath.
subroutine, public read_header_ascii(filename, fileunit, header_ncols, header_nrows, header_xllcorner, header_yllcorner, header_cellsize, header_nodata)
Reads header lines of ASCII files.