22 USE mo_kind,
ONLY : i4, dp
23 USE mo_os,
ONLY : check_path_isfile
24 USE mo_message,
only: error_message
25 use mo_string_utils,
only : num2str
140 header_yllcorner, header_cellsize, data, mask)
144 character(len = *),
intent(in) :: filename
147 integer(i4),
intent(in) :: fileunit
150 integer(i4),
intent(in) :: header_nRows
153 integer(i4),
intent(in) :: header_nCols
156 real(dp),
intent(in) :: header_xllcorner
159 real(dp),
intent(in) :: header_yllcorner
162 real(dp),
intent(in) :: header_cellsize
165 real(dp),
dimension(:, :),
allocatable,
intent(out) :: data
168 logical,
dimension(:, :),
allocatable,
intent(out) :: mask
171 integer(i4) :: file_nRows
174 integer(i4) :: file_nCols
177 real(dp) :: file_xllcorner
180 real(dp) :: file_yllcorner
183 real(dp) :: file_cellsize
186 real(dp) :: file_nodata
191 real(dp),
dimension(:, :),
allocatable :: tmp_data
194 logical,
dimension(:, :),
allocatable :: tmp_mask
197 file_ncols, file_nrows, &
198 file_xllcorner, file_yllcorner, file_cellsize, file_nodata)
199 call check_header(file_ncols, file_nrows, file_xllcorner, file_yllcorner, file_cellsize, &
200 header_ncols, header_nrows, header_xllcorner, header_yllcorner, header_cellsize)
202 allocate(tmp_data(file_nrows, file_ncols))
203 tmp_data = file_nodata
204 allocate(tmp_mask(file_nrows, file_ncols))
209 call check_path_isfile(path = filename, raise=.true.)
213 open (unit = fileunit, file = filename, action =
'read', status =
'old', recl = 48 * file_ncols)
220 read(fileunit, *) (tmp_data(i, j), j = 1, file_ncols)
225 where (abs(tmp_data - file_nodata) .lt. tiny(1.0_dp))
230 allocate(
data(file_ncols, file_nrows))
231 data = transpose(tmp_data)
234 allocate(mask(file_ncols, file_nrows))
235 mask = transpose(tmp_mask)
269 header_yllcorner, header_cellsize, data, mask)
273 character(len = *),
intent(in) :: filename
276 integer(i4),
intent(in) :: fileunit
279 integer(i4),
intent(in) :: header_nRows
282 integer(i4),
intent(in) :: header_nCols
285 real(dp),
intent(in) :: header_xllcorner
288 real(dp),
intent(in) :: header_yllcorner
291 real(dp),
intent(in) :: header_cellsize
294 integer(i4),
dimension(:, :),
allocatable,
intent(out) :: data
297 logical,
dimension(:, :),
allocatable,
intent(out) :: mask
300 integer(i4) :: file_nRows
303 integer(i4) :: file_nCols
306 real(dp) :: file_xllcorner
309 real(dp) :: file_yllcorner
312 real(dp) :: file_cellsize
315 real(dp) :: file_nodata
320 integer(i4),
dimension(:, :),
allocatable :: tmp_data
323 logical,
dimension(:, :),
allocatable :: tmp_mask
326 file_ncols, file_nrows, &
327 file_xllcorner, file_yllcorner, file_cellsize, file_nodata)
328 call check_header(file_ncols, file_nrows, file_xllcorner, file_yllcorner, file_cellsize, &
329 header_ncols, header_nrows, header_xllcorner, header_yllcorner, header_cellsize)
331 allocate(tmp_data(file_nrows, file_ncols))
332 tmp_data = int(file_nodata, i4)
333 allocate(tmp_mask(file_nrows, file_ncols))
337 call check_path_isfile(path = filename, raise=.true.)
341 open (unit = fileunit, file = filename, action =
'read', status =
'old', recl = 48 * file_ncols)
348 read(fileunit, *) (tmp_data(i, j), j = 1, file_ncols)
353 where (tmp_data .EQ. int(file_nodata, i4))
358 allocate(
data(file_ncols, file_nrows))
359 data = transpose(tmp_data)
362 allocate(mask(file_ncols, file_nrows))
363 mask = transpose(tmp_mask)
398 subroutine read_header_ascii(filename, fileunit, header_ncols, header_nrows, header_xllcorner, header_yllcorner, &
399 header_cellsize, header_nodata)
404 character(len = *),
intent(in) :: filename
407 integer(i4),
intent(in) :: fileunit
410 integer(i4),
intent(out) :: header_nrows
413 integer(i4),
intent(out) :: header_ncols
416 real(dp),
intent(out) :: header_xllcorner
419 real(dp),
intent(out) :: header_yllcorner
422 real(dp),
intent(out) :: header_cellsize
425 real(dp),
intent(out) :: header_nodata
427 character(5) :: dummy
431 call check_path_isfile(path = filename, raise=.true.)
433 open (unit = fileunit, file = filename, status =
'old')
434 read (fileunit, *) dummy, header_ncols
435 read (fileunit, *) dummy, header_nrows
436 read (fileunit, *) dummy, header_xllcorner
437 read (fileunit, *) dummy, header_yllcorner
438 read (fileunit, *) dummy, header_cellsize
439 read (fileunit, *, iostat=io) dummy, header_nodata
448 cellsize, ref_ncols, ref_nrows, ref_xllcorner, ref_yllcorner, ref_cellsize, &
451 use mo_kind,
only : dp, i4
452 use mo_message,
only : error_message
453 use mo_string_utils,
only : num2str
458 integer(i4),
intent(in) :: ncols
459 integer(i4),
intent(in) :: nrows
460 real(dp),
intent(in) :: xllcorner
461 real(dp),
intent(in) :: yllcorner
462 real(dp),
intent(in) :: cellsize
463 integer(i4),
intent(in) :: ref_nrows
464 integer(i4),
intent(in) :: ref_ncols
465 real(dp),
intent(in) :: ref_xllcorner
466 real(dp),
intent(in) :: ref_yllcorner
467 real(dp),
intent(in) :: ref_cellsize
468 real(dp),
intent(in),
optional :: tolerance
469 character(*),
intent(in),
optional :: context
471 real(dp) :: tol_local
472 character(len=:),
allocatable :: err_message
474 if (
present(tolerance))
then
475 tol_local = tolerance
481 if ((ref_ncols .ne. ncols))
then
482 err_message = err_message //
'read_spatial_data_ascii: ncols mismatch file='// &
483 trim(num2str(ncols))//
' expected='//trim(num2str(ref_ncols))// &
486 if ((nrows .ne. ref_nrows))
then
487 err_message = err_message //
'read_spatial_data_ascii: nrows mismatch file='// &
488 trim(num2str(nrows))//
' expected='//trim(num2str(ref_nrows))// &
491 if ((abs(xllcorner - ref_xllcorner) .gt. tol_local))
then
492 err_message = err_message //
'read_spatial_data_ascii: xllcorner mismatch file='// &
493 trim(num2str(xllcorner,
'(G32.16)'))//
' expected='// &
494 trim(num2str(ref_xllcorner,
'(G32.16)'))// &
497 if ((abs(yllcorner - ref_yllcorner) .gt. tol_local))
then
498 err_message = err_message //
'read_spatial_data_ascii: yllcorner mismatch file='// &
499 trim(num2str(yllcorner,
'(G32.16)'))//
' expected='// &
500 trim(num2str(ref_yllcorner,
'(G32.16)'))// &
503 if ((abs(cellsize - ref_cellsize) .gt. tol_local))
then
504 err_message = err_message //
'read_spatial_data_ascii: cellsize mismatch file='// &
505 trim(num2str(cellsize,
'(G32.16)'))//
' expected='// &
506 trim(num2str(ref_cellsize,
'(G32.16)'))// &
510 if (len_trim(err_message) > 0)
then
511 if (
present(context))
then
512 err_message = trim(context) // new_line(
'a') // err_message
514 call error_message(trim(err_message))
523 header_cellsize, header_nodata, varName)
524 use mo_os,
only : path_root, path_isfile
526 character(len=*),
intent(in) :: filepath
527 integer(i4),
intent(in) :: fileunit
528 integer(i4),
intent(out) :: header_ncols, header_nrows
529 real(dp),
intent(out) :: header_xllcorner, header_yllcorner, header_cellsize, header_nodata
530 character(len=*),
intent(in),
optional :: varname
532 character(len=:),
allocatable :: ncname
533 character(len=:),
allocatable :: trimmed
534 integer(i4) :: len_path
537 trimmed = trim(filepath)
538 len_path = len_trim(trimmed)
540 if (len_path >= 3)
then
541 if ((trimmed(len_path-2:len_path) ==
'.nc') .or. (trimmed(len_path-2:len_path) ==
'.NC')) is_nc = .true.
545 if (.not. is_nc) ncname = path_root(trimmed) //
'.nc'
547 if (is_nc .or. path_isfile(ncname))
then
548 call get_header_info_from_nc(ncname, fileunit, header_ncols, header_nrows, header_xllcorner, header_yllcorner, &
549 header_cellsize, header_nodata, var=varname)
551 call read_header_ascii(trimmed, fileunit, header_ncols, header_nrows, header_xllcorner, header_yllcorner, &
552 header_cellsize, header_nodata)
560 use mo_netcdf,
only : ncvariable
561 use mo_utils,
only: is_close
563 type(ncvariable),
intent(in) :: var
564 real(dp),
optional,
intent(out) :: cellsize
565 real(dp),
optional,
intent(out) :: origin
566 logical,
optional,
intent(out) :: increasing
567 real(dp),
intent(in),
optional :: tol
568 real(dp),
dimension(:),
allocatable :: axis
569 real(dp),
dimension(:,:),
allocatable :: bounds
570 real(dp) :: diff, tol_
571 integer(i4) :: i_ub, i_lb
573 type(ncvariable) :: bnds
574 character(len=256) :: name
576 call var%getData(axis)
577 if (var%hasAttribute(
"bounds"))
then
579 call var%getAttribute(
"bounds", name)
580 bnds = var%parent%getVariable(trim(name))
581 call bnds%getData(bounds)
589 if (
present(tol) ) tol_ = tol
591 if (
size(axis) == 0_i4) &
592 call error_message(
"check_uniform_axis: axis is empty: ", name)
594 if (
size(axis) > 1_i4)
then
595 diff = (axis(
size(axis)) - axis(1)) / real(
size(axis) - 1_i4, dp)
596 if (.not.all(is_close(axis(2:
size(axis))-axis(1:
size(axis)-1), diff, rtol=0.0_dp, atol=tol_))) &
597 call error_message(
"check_uniform_axis: given axis is not uniform: ", name)
599 if (.not. has_bnds) &
600 call error_message(
"check_uniform_axis: can't check axis of size 1 when no bounds are given: ", name)
601 diff = bounds(2,1) - bounds(1,1)
608 if (
size(bounds, dim=2)>1)
then
609 if (.not. is_close(bounds(2,1), bounds(1,2), rtol=0.0_dp, atol=tol_) &
610 .and. is_close(bounds(1,1), bounds(2,2), rtol=0.0_dp, atol=tol_))
then
611 print *,
"check_uniform_axis: bounds actually have wrong monotonicity: ", name
616 if (.not.all(is_close(bounds(i_ub,:)-bounds(i_lb,:), diff, rtol=0.0_dp, atol=tol_))) &
617 call error_message(
"check_uniform_axis: given bounds are not uniform: ", name)
618 if (.not.all(is_close(axis(:)-bounds(i_lb,:), 0.5_dp*diff, rtol=0.0_dp, atol=tol_))) &
619 call error_message(
"check_uniform_axis: given bounds are not centered around axis points: ", name)
622 if (
present(cellsize) ) cellsize = abs(diff)
623 if (
present(origin) ) origin = minval(axis) - 0.5_dp * abs(diff)
624 if (
present(increasing) ) increasing = diff > 0.0_dp
633 use mo_netcdf,
only : ncvariable
635 type(ncvariable),
intent(in) :: var
636 character(len=256) :: tmp_str
639 if (var%hasAttribute(
"standard_name"))
then
640 call var%getAttribute(
"standard_name", tmp_str)
641 if (trim(tmp_str) ==
"projection_x_coordinate")
is_x_axis = .true.
642 else if (var%hasAttribute(
"axis"))
then
643 call var%getAttribute(
"axis", tmp_str)
644 if (trim(tmp_str) ==
"X")
is_x_axis = .true.
645 else if (var%hasAttribute(
"_CoordinateAxisType"))
then
646 call var%getAttribute(
"_CoordinateAxisType", tmp_str)
647 if (trim(tmp_str) ==
"GeoX")
is_x_axis = .true.
656 use mo_netcdf,
only : ncvariable
658 type(ncvariable),
intent(in) :: var
659 character(len=256) :: tmp_str
662 if (var%hasAttribute(
"standard_name"))
then
663 call var%getAttribute(
"standard_name", tmp_str)
664 if (trim(tmp_str) ==
"projection_y_coordinate")
is_y_axis = .true.
665 else if (var%hasAttribute(
"axis"))
then
666 call var%getAttribute(
"axis", tmp_str)
667 if (trim(tmp_str) ==
"Y")
is_y_axis = .true.
668 else if (var%hasAttribute(
"_CoordinateAxisType"))
then
669 call var%getAttribute(
"_CoordinateAxisType", tmp_str)
670 if (trim(tmp_str) ==
"GeoY")
is_y_axis = .true.
679 use mo_netcdf,
only : ncvariable
681 type(ncvariable),
intent(in) :: var
682 character(len=256) :: tmp_str
685 if (var%hasAttribute(
"standard_name"))
then
686 call var%getAttribute(
"standard_name", tmp_str)
688 else if (var%hasAttribute(
"units"))
then
689 call var%getAttribute(
"units", tmp_str)
692 if (trim(tmp_str) ==
"degree_east")
is_lon_coord = .true.
695 if (trim(tmp_str) ==
"degrees_east")
is_lon_coord = .true.
696 else if (var%hasAttribute(
"_CoordinateAxisType"))
then
697 call var%getAttribute(
"_CoordinateAxisType", tmp_str)
699 else if (var%hasAttribute(
"long_name"))
then
700 call var%getAttribute(
"long_name", tmp_str)
711 use mo_netcdf,
only : ncvariable
713 type(ncvariable),
intent(in) :: var
714 character(len=256) :: tmp_str
717 if (var%hasAttribute(
"standard_name"))
then
718 call var%getAttribute(
"standard_name", tmp_str)
720 else if (var%hasAttribute(
"units"))
then
721 call var%getAttribute(
"units", tmp_str)
724 if (trim(tmp_str) ==
"degree_north")
is_lat_coord = .true.
727 if (trim(tmp_str) ==
"degrees_north")
is_lat_coord = .true.
728 else if (var%hasAttribute(
"_CoordinateAxisType"))
then
729 call var%getAttribute(
"_CoordinateAxisType", tmp_str)
731 else if (var%hasAttribute(
"long_name"))
then
732 call var%getAttribute(
"long_name", tmp_str)
743 header_cellsize, header_nodata, mask, var)
744 use mo_netcdf,
only : ncdataset, ncvariable, ncdimension
745 use mo_utils,
only : is_close
746 use mo_string_utils,
only : num2str
748 character(*),
intent(in) :: ncname
749 integer(i4),
intent(in) :: fileunit
750 integer(i4),
intent(out) :: header_ncols
751 integer(i4),
intent(out) :: header_nrows
752 real(dp),
intent(out) :: header_xllcorner
753 real(dp),
intent(out) :: header_yllcorner
754 real(dp),
intent(out) :: header_cellsize
755 real(dp),
intent(out) :: header_nodata
756 logical,
optional,
allocatable,
dimension(:,:),
intent(out) :: mask
757 character(*),
intent(in),
optional :: var
759 type(ncdataset) :: nc
760 type(ncvariable) :: ncvar, xvar, yvar
761 type(ncdimension),
dimension(:),
allocatable :: dims
762 integer(i4) :: rnk, y_dir
763 integer(i4) :: bottom_up, top_down
764 real(dp) :: cs_x, cs_y, tol
765 logical :: y_inc, x_sph, y_sph, x_cart, y_cart, flip_y
766 integer(i4) :: keep_y
767 character(len=256) :: varname
777 nc = ncdataset(ncname,
"r")
779 if (
present(var))
then
785 ncvar = nc%getVariable(varname)
786 rnk = ncvar%getRank()
787 if (rnk < 2)
call error_message(
"grid % from_netcdf: given variable has too few dimensions: ", trim(nc%fname),
":", trim(varname))
789 dims = ncvar%getDimensions()
790 header_ncols = dims(1)%getLength()
791 header_nrows = dims(2)%getLength()
792 xvar = nc%getVariable(trim(dims(1)%getName()))
793 yvar = nc%getVariable(trim(dims(2)%getName()))
797 call error_message(
"grid % from_netcdf: variable seems to have wrong axis order (not y-x): ", trim(nc%fname),
":", trim(varname))
804 if (.not.(x_cart.or.x_sph)) &
805 call error_message(
"grid % from_netcdf: can't determine coordinate system from x-axis: ", trim(nc%fname),
":", trim(varname))
806 if (.not.(y_cart.or.y_sph)) &
807 call error_message(
"grid % from_netcdf: can't determine coordinate system from y-axis: ", trim(nc%fname),
":", trim(varname))
808 if (.not.(x_sph.eqv.y_sph)) &
809 call error_message(
"grid % from_netcdf: x and y axis seem to have different coordinate systems: ", trim(nc%fname),
":", trim(varname))
813 call check_uniform_axis(yvar, cellsize=cs_y, origin=header_yllcorner, increasing=y_inc, tol=tol)
814 if (y_dir == keep_y)
then
816 if (y_inc) y_dir = bottom_up
819 if (.not.any(y_dir==[bottom_up, top_down])) &
820 call error_message(
"grid % from_netcdf: y-direction not valid: ", trim(num2str(y_dir)))
823 flip_y = y_inc.neqv.(y_dir==bottom_up)
825 print *,
"grid % from_netcdf: y axis direction is oposite to desired one (inefficient flipping). ", &
826 "You could flip the file beforehand with: 'cdo invertlat <ifile> <ofile>'. ", trim(nc%fname),
":", trim(varname)
829 if (.not.is_close(cs_x, cs_y, rtol=0.0_dp, atol=tol)) &
830 call error_message(
"grid % from_netcdf: x and y axis have different cell sizes: ", trim(nc%fname),
":", trim(varname))
831 header_cellsize = cs_x
834 if (ncvar%hasAttribute(
"_FillValue"))
then
835 call ncvar%getAttribute(
"_FillValue", header_nodata)
836 else if (ncvar%hasAttribute(
"missing_value"))
then
837 call ncvar%getAttribute(
"missing_value", header_nodata)
839 call error_message(
'***ERROR: read_nc_header: missing _FillValue or missing_value attribute')
846 use mo_netcdf,
only : ncdataset, ncvariable
847 use mo_message,
only : error_message
848 use mo_os,
only : path_stem
849 class(ncdataset),
intent(in) :: nc
850 character(len=*),
intent(in) :: ncname
851 character(len=256) :: varname
853 type(ncvariable),
dimension(:),
allocatable :: vars
854 character(len=256),
dimension(:),
allocatable :: data_var_names
855 integer(i4) :: i, data_var_count, data_var_index
856 character(len=256) :: stem
859 vars = nc%getVariables()
863 if (vars(i)%getNoDimensions() >= 2) data_var_count = data_var_count + 1
866 if (data_var_count == 0)
then
867 call error_message(
'read_spatial_data_nc: could not determine variable name for file: ' // trim(ncname))
870 allocate(data_var_names(data_var_count))
873 if (vars(i)%getNoDimensions() >= 2)
then
874 data_var_index = data_var_index + 1
875 data_var_names(data_var_index) = trim(vars(i)%getName())
879 if (data_var_count == 1)
then
880 varname = trim(data_var_names(1))
884 stem = trim(path_stem(ncname))
885 do i = 1, data_var_count
886 if ((trim(data_var_names(i)) == stem) .or. (trim(data_var_names(i)) ==
'data'))
then
887 varname = trim(data_var_names(i))
892 call error_message(
'read_spatial_data_nc: variable name could not be determined for file: ' // trim(ncname))
908 subroutine read_spatial_data_nc_i4(ncname, data, maskout, ncols, nrows, xllcorner, yllcorner, cellsize, nodata_value, varName)
909 use mo_netcdf,
only : ncdataset, ncvariable
910 use mo_message,
only : error_message
913 character(len=*),
intent(in) :: ncname
914 character(len=*),
intent(in),
optional :: varName
915 integer(i4),
dimension(:, :),
allocatable,
intent(out) :: data
916 logical,
optional,
allocatable,
dimension(:, :),
intent(out) :: maskout
917 integer(i4),
intent(out) :: ncols, nrows
918 real(dp),
intent(out) :: xllcorner, yllcorner, cellsize
919 real(dp),
intent(out) :: nodata_value
921 type(ncdataset) :: nc
922 type(ncvariable) :: var
923 integer(i4),
allocatable :: var_shape(:), start(:), cnt(:)
924 character(len=256) :: varName_local
927 nc = ncdataset(ncname,
"r")
929 if (
present(varname))
then
930 varname_local = trim(varname)
936 call get_header_info_from_nc(ncname, 0_i4, ncols, nrows, xllcorner, yllcorner, cellsize, nodata_value, var=varname_local)
939 var = nc%getVariable(trim(varname_local))
942 var_shape = var%getShape()
943 allocate(start(
size(var_shape)), source=1_i4)
944 allocate(cnt(
size(var_shape)), source=1_i4)
945 cnt(1:2) = var_shape(1:2)
948 if (var%hasAttribute(
"_FillValue"))
then
949 call var%getAttribute(
"_FillValue", nodata_value)
950 else if (var%hasAttribute(
"missing_value"))
then
951 call var%getAttribute(
"missing_value", nodata_value)
953 call error_message(
'***ERROR: read_nc_i4_data: missing _FillValue or missing_value attribute')
957 allocate(
data(var_shape(1), var_shape(2)))
958 call var%getData(
data, start=start, cnt=cnt)
960 if (
present(maskout))
then
961 allocate(maskout(var_shape(1), var_shape(2)))
962 maskout = abs(real(
data, dp) - nodata_value) .gt. tiny(1.0_dp)
981 subroutine read_spatial_data_nc_dp(ncname, data, maskout, ncols, nrows, xllcorner, yllcorner, cellsize, nodata_value, varName)
982 use mo_netcdf,
only : ncdataset, ncvariable
983 use mo_message,
only : error_message
986 character(len=*),
intent(in) :: ncname
987 character(len=*),
intent(in),
optional :: varName
988 real(dp),
dimension(:, :),
allocatable,
intent(out) :: data
989 logical,
optional,
allocatable,
dimension(:, :),
intent(out) :: maskout
990 integer(i4),
intent(out) :: ncols, nrows
991 real(dp),
intent(out) :: xllcorner, yllcorner, cellsize
992 real(dp),
intent(out) :: nodata_value
994 type(ncdataset) :: nc
995 type(ncvariable) :: var
996 integer(i4),
allocatable :: var_shape(:), start(:), cnt(:)
997 character(len=256) :: varName_local
1000 nc = ncdataset(ncname,
"r")
1002 if (
present(varname))
then
1003 varname_local = trim(varname)
1009 call get_header_info_from_nc(ncname, 0_i4, ncols, nrows, xllcorner, yllcorner, cellsize, nodata_value, var=varname_local)
1012 var = nc%getVariable(trim(varname_local))
1015 var_shape = var%getShape()
1016 allocate(start(
size(var_shape)), source=1_i4)
1017 allocate(cnt(
size(var_shape)), source=1_i4)
1018 cnt(1:2) = var_shape(1:2)
1021 if (var%hasAttribute(
"_FillValue"))
then
1022 call var%getAttribute(
"_FillValue", nodata_value)
1023 else if (var%hasAttribute(
"missing_value"))
then
1024 call var%getAttribute(
"missing_value", nodata_value)
1026 call error_message(
'***ERROR: read_nc_i4_data: missing _FillValue or missing_value attribute')
1030 allocate(
data(var_shape(1), var_shape(2)))
1031 call var%getData(
data, start=start, cnt=cnt)
1033 if (
present(maskout))
then
1034 allocate(maskout(var_shape(1), var_shape(2)))
1035 maskout = abs(
data - nodata_value) .gt. tiny(1.0_dp)
1057 header_yllcorner, header_cellsize, data, maskout, &
1058 out_nCols, out_nRows, out_xllcorner, out_yllcorner, out_cellsize, out_nodata_value)
1059 use mo_os,
only : path_root, path_isfile
1063 character(len = *),
intent(in) :: filepath
1066 integer(i4),
intent(in) :: fileunit
1069 integer(i4),
intent(in) :: header_nRows
1072 integer(i4),
intent(in) :: header_nCols
1075 real(dp),
intent(in) :: header_xllcorner
1078 real(dp),
intent(in) :: header_yllcorner
1081 real(dp),
intent(in) :: header_cellsize
1084 real(dp),
dimension(:, :),
allocatable,
intent(out) :: data
1087 logical,
optional,
dimension(:, :),
allocatable,
intent(out) :: maskout
1090 integer(i4),
optional,
intent(out) :: out_nRows
1093 integer(i4),
optional,
intent(out) :: out_nCols
1096 real(dp),
optional,
intent(out) :: out_xllcorner
1099 real(dp),
optional,
intent(out) :: out_yllcorner
1102 real(dp),
optional,
intent(out) :: out_cellsize
1105 real(dp),
optional,
intent(out) :: out_nodata_value
1108 real(dp) :: nodata_value
1109 integer(i4) :: nrows, ncols
1110 real(dp) :: xllcorner, yllcorner, cellsize
1111 character(len=:),
allocatable :: ncname
1114 if (len_trim(filepath) >= 3)
then
1115 if ((filepath(len_trim(filepath)-2:len_trim(filepath)) ==
'.nc') .or. (filepath(len_trim(filepath)-2:len_trim(filepath)) ==
'.NC'))
then
1116 ncname = trim(filepath)
1118 ncname = path_root(filepath) //
'.nc'
1121 ncname = path_root(filepath) //
'.nc'
1126 if (path_isfile(ncname))
then
1127 print *,
"Read nc file: ", ncname
1128 call read_spatial_data_nc(ncname,
data, maskout, ncols, nrows, xllcorner, yllcorner, cellsize, nodata_value)
1130 print *,
"Read ascii file: ", filepath
1131 if ((header_ncols /= 0_i4) .and. (header_nrows /= 0_i4))
then
1132 ncols = header_ncols
1133 nrows = header_nrows
1134 yllcorner = header_yllcorner
1135 xllcorner = header_xllcorner
1136 cellsize = header_cellsize
1139 ncols, nrows, xllcorner, &
1140 yllcorner, cellsize, nodata_value)
1145 yllcorner, cellsize,
data, maskout)
1148 if (
present(out_ncols)) &
1150 if (
present(out_nrows)) &
1152 if (
present(out_xllcorner)) &
1153 out_xllcorner = xllcorner
1154 if (
present(out_yllcorner)) &
1155 out_yllcorner = yllcorner
1156 if (
present(out_cellsize)) &
1157 out_cellsize = cellsize
1158 if (
present(out_nodata_value)) &
1159 out_nodata_value = nodata_value
1177 header_yllcorner, header_cellsize, data, maskout, &
1178 out_nCols, out_nRows, out_xllcorner, out_yllcorner, out_cellsize, out_nodata_value)
1179 use mo_os,
only : path_root, path_isfile
1183 character(len = *),
intent(in) :: filepath
1186 integer(i4),
intent(in) :: fileunit
1189 integer(i4),
intent(in) :: header_nRows
1192 integer(i4),
intent(in) :: header_nCols
1195 real(dp),
intent(in) :: header_xllcorner
1198 real(dp),
intent(in) :: header_yllcorner
1201 real(dp),
intent(in) :: header_cellsize
1204 integer(i4),
dimension(:, :),
allocatable,
intent(out) :: data
1207 logical,
optional,
dimension(:, :),
allocatable,
intent(out) :: maskout
1210 integer(i4),
optional,
intent(out) :: out_nRows
1213 integer(i4),
optional,
intent(out) :: out_nCols
1216 real(dp),
optional,
intent(out) :: out_xllcorner
1219 real(dp),
optional,
intent(out) :: out_yllcorner
1222 real(dp),
optional,
intent(out) :: out_cellsize
1224 real(dp),
optional,
intent(out) :: out_nodata_value
1227 real(dp) :: nodata_value
1228 integer(i4) :: nrows, ncols
1229 real(dp) :: xllcorner, yllcorner, cellsize
1230 character(len=:),
allocatable :: ncname
1233 if (len_trim(filepath) >= 3)
then
1234 if ((filepath(len_trim(filepath)-2:len_trim(filepath)) ==
'.nc') .or. (filepath(len_trim(filepath)-2:len_trim(filepath)) ==
'.NC'))
then
1235 ncname = trim(filepath)
1237 ncname = path_root(filepath) //
'.nc'
1240 ncname = path_root(filepath) //
'.nc'
1245 if (path_isfile(ncname))
then
1246 print *,
"Read nc file: ", ncname
1247 call read_spatial_data_nc(ncname,
data, maskout, ncols, nrows, xllcorner, yllcorner, cellsize, nodata_value)
1249 print *,
"Read ascii file: ", filepath
1250 if ((header_ncols /= 0_i4) .and. (header_nrows /= 0_i4))
then
1251 ncols = header_ncols
1252 nrows = header_nrows
1253 yllcorner = header_yllcorner
1254 xllcorner = header_xllcorner
1255 cellsize = header_cellsize
1258 ncols, nrows, xllcorner, &
1259 yllcorner, cellsize, nodata_value)
1264 yllcorner, cellsize,
data, maskout)
1267 if (
present(out_ncols)) &
1269 if (
present(out_nrows)) &
1271 if (
present(out_xllcorner)) &
1272 out_xllcorner = xllcorner
1273 if (
present(out_yllcorner)) &
1274 out_yllcorner = yllcorner
1275 if (
present(out_cellsize)) &
1276 out_cellsize = cellsize
1277 if (
present(out_nodata_value)) &
1278 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 defaulttolerance_dp
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 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, data, maskout, ncols, nrows, xllcorner, yllcorner, cellsize, nodata_value, varname)
Read file from filepath.
subroutine, public get_header_info_from_nc(ncname, fileunit, header_ncols, header_nrows, header_xllcorner, header_yllcorner, header_cellsize, header_nodata, mask, var)
Read NetCDF header information (matching read_header_ascii signature)
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, public read_header_nc_or_ascii(filepath, fileunit, header_ncols, header_nrows, header_xllcorner, header_yllcorner, header_cellsize, header_nodata, varname)
Read header information from either NetCDF or ASCII depending on file name/presence.
character(len=256) function determine_data_var_name(nc, ncname)
subroutine read_spatial_data_nc_dp(ncname, data, maskout, ncols, nrows, xllcorner, yllcorner, cellsize, nodata_value, varname)
Read file from filepath.
subroutine, public check_header(ncols, nrows, xllcorner, yllcorner, cellsize, ref_ncols, ref_nrows, ref_xllcorner, ref_yllcorner, ref_cellsize, tolerance, context)
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.