26 subroutine get_mosaic_xgrid_(fileobj, i1, j1, i2, j2, area, ibegin, iend)
27 type(FmsNetcdfFile_t),
intent(in) :: fileobj
28 integer,
intent(inout) :: i1(:), j1(:), i2(:), j2(:)
29 real(kind=fms_mos_kind_),
intent(inout) :: area(:)
31 integer,
optional,
intent(in) :: ibegin, iend
33 integer :: start(4), nread(4), istart
34 real(kind=fms_mos_kind_),
dimension(2, size(i1(:))) :: tile1_cell, tile2_cell
36 real(kind=r8_kind) :: garea
37 real(kind=r8_kind) :: get_global_area
39 garea = get_global_area()
42 if(
present(ibegin) .and.
present(iend))
then
44 nxgrid = iend - ibegin + 1
45 if(nxgrid .NE.
size(i1(:)))
call mpp_error(fatal, .NE.
"get_mosaic_xgrid: nxgrid size(i1(:))")
46 if(nxgrid .NE.
size(j1(:)))
call mpp_error(fatal, .NE.
"get_mosaic_xgrid: nxgrid size(j1(:))")
47 if(nxgrid .NE.
size(i2(:)))
call mpp_error(fatal, .NE.
"get_mosaic_xgrid: nxgrid size(i2(:))")
48 if(nxgrid .NE.
size(j2(:)))
call mpp_error(fatal, .NE.
"get_mosaic_xgrid: nxgrid size(j2(:))")
49 if(nxgrid .NE.
size(area(:)))
call mpp_error(fatal, .NE.
"get_mosaic_xgrid: nxgrid size(area(:))")
56 start(1) = istart; nread(1) = nxgrid
58 call read_data(fileobj,
'xgrid_area', area, corner=start, edge_lengths=nread)
62 start(2) = istart; nread(2) = nxgrid
64 call read_data(fileobj,
'tile1_cell', tile1_cell, corner=start, edge_lengths=nread)
65 call read_data(fileobj,
'tile2_cell', tile2_cell, corner=start, edge_lengths=nread)
68 i1(n) = int(tile1_cell(1,n))
69 j1(n) = int(tile1_cell(2,n))
70 i2(n) = int(tile2_cell(1,n))
71 j2(n) = int(tile2_cell(2,n))
72 area(n) = real( real(area(n),r8_kind)/garea, fms_mos_kind_ )
77 end subroutine get_mosaic_xgrid_
87 subroutine calc_mosaic_grid_area_(lon, lat, area)
88 real(kind=fms_mos_kind_),
dimension(:,:),
intent(in) :: lon
89 real(kind=fms_mos_kind_),
dimension(:,:),
intent(in) :: lat
90 real(kind=fms_mos_kind_),
dimension(:,:),
intent(out) :: area
93 real(r8_kind) :: area_r8(size(area,1),size(area,2))
98 if(
size(lon,1) .NE. nlon+1 .OR.
size(lat,1) .NE. nlon+1 ) &
99 call mpp_error(fatal,
"mosaic_mod: size(lon,1) and size(lat,1) should equal to size(area,1)+1")
100 if(
size(lon,2) .NE. nlat+1 .OR.
size(lat,2) .NE. nlat+1 ) &
101 call mpp_error(fatal,
"mosaic_mod: size(lon,2) and size(lat,2) should equal to size(area,2)+1")
104 call get_grid_area( nlon, nlat, real(lon,r8_kind), real(lat,r8_kind), area_r8)
106 area=real(area_r8,fms_mos_kind_)
108 end subroutine calc_mosaic_grid_area_
118 subroutine calc_mosaic_grid_great_circle_area_(lon, lat, area)
119 real(kind=fms_mos_kind_),
dimension(:,:),
intent(in) :: lon
120 real(kind=fms_mos_kind_),
dimension(:,:),
intent(in) :: lat
121 real(kind=fms_mos_kind_),
dimension(:,:),
intent(inout) :: area
122 integer :: nlon, nlat
124 real(r8_kind) :: area_r8(size(area,1),size(area,2))
129 if(
size(lon,1) .NE. nlon+1 .OR.
size(lat,1) .NE. nlon+1 ) &
130 call mpp_error(fatal,
"mosaic_mod: size(lon,1) and size(lat,1) should equal to size(area,1)+1")
131 if(
size(lon,2) .NE. nlat+1 .OR.
size(lat,2) .NE. nlat+1 ) &
132 call mpp_error(fatal,
"mosaic_mod: size(lon,2) and size(lat,2) should equal to size(area,2)+1")
135 call get_grid_great_circle_area( nlon, nlat, real(lon,r8_kind), real(lat,r8_kind), area_r8)
137 area=real(area_r8, fms_mos_kind_)
139 end subroutine calc_mosaic_grid_great_circle_area_
143 function is_inside_polygon_(lon1, lat1, lon2, lat2 )
144 real(kind=fms_mos_kind_),
intent(in) :: lon1, lat1
145 real(kind=fms_mos_kind_),
intent(in) :: lon2(:), lat2(:)
146 logical :: IS_INSIDE_POLYGON_
147 integer :: npts, isinside
148 integer :: inside_a_polygon
154 isinside = inside_a_polygon(real(lon1,r8_kind), real(lat1,r8_kind), npts, real(lon2,r8_kind), real(lat2,r8_kind))
155 if(isinside == 1)
then
156 is_inside_polygon_ = .true.
158 is_inside_polygon_ = .false.
163 end function is_inside_polygon_