114 real(
sp),
dimension(:,:),
intent(in) :: coord
119 integer(i4) :: nedges
125 nedges =
size(coord,1)
128 if (i == nedges)
then
133 xsum = xsum + ( coord(i,1) * coord(k,2) )
134 ysum = ysum + ( coord(i,2) * coord(k,1) )
170 real(
sp),
dimension(:,:),
intent(in) :: coord
175 integer(i4) :: nedges
182 nedges =
size(coord,1)
187 if (i == nedges )
then
193 xsum = xsum + ((coord(i,1) + coord(k,1)) * &
194 ((coord(i,1) * coord(k,2) - coord(k,1) * coord(i,2))))
196 ysum = ysum + ((coord(i,2) + coord(k,2)) * &
197 ((coord(i,1) * coord(k,2) - coord(k,1) * coord(i,2))))
234 real(sp),
dimension(2),
intent(in) :: p
236 real(sp),
dimension(:, :),
intent(in) :: coord
241 integer(i4),
intent(out) :: erg
244 real(sp),
dimension(size(coord,1)) :: x, y
246 logical :: mx,my,nx,ny, test1, test2
247 integer(i4) :: n, i, j
255 if (
eq(x(i),0.0_sp) .and.
eq(y(i),0.0_sp) )
then
266 if (
eq(coord(i,1),coord(j,1)) .and.
eq(coord(i,1),p(1)) )
then
267 ly = (p(2)-coord(j,2)) / (coord(i,2)-coord(j,2))
268 if (
ge(ly,0.0_sp) .and.
le(ly,1.0_sp) )
then
274 if (
eq(coord(i,2),coord(j,2)) .and.
eq(coord(i,2),p(2)) )
then
275 lx = (p(1)-coord(j,1)) / (coord(i,1)-coord(j,1))
276 if (
ge(lx,0.0_sp ) .and.
le(lx,1.0_sp) )
then
287 test1 = .not.((my.or.ny).and.(mx.or.nx)).or.(mx.and.nx)
288 test2 = .not.(my.and.ny.and.(mx.or.nx).and..not.(mx.and.nx))
290 if (.not. test1)
then
292 if ((y(i)*x(j)-x(i)*y(j))/(x(j)-x(i)) < 0.0_sp)
then
295 if ((y(i)*x(j)-x(i)*y(j))/(x(j)-x(i)) > 0.0_sp)
then
318 real(
sp),
dimension(:,:),
intent(in) :: coord
326 real(
sp) :: sum_edges
332 sum_edges = sum((coord(2:n, 1) - coord(1:n-1, 1)) * (coord(2:n, 2) + coord(1:n-1, 2)))
333 sum_edges = sum_edges + (coord(1, 1) - coord(n, 1)) * (coord(1, 2) + coord(n, 2))
334 if (
eq(sum_edges, 0._sp))
then
336 else if (sum_edges < 0._sp)
then
355 real(
sp),
dimension(:,:),
intent(in) :: coord
357 real(
sp),
intent(in),
optional :: meridian_arg
358 real(
sp),
dimension(:,:),
allocatable :: coord_mod
363 integer(i4) :: i, j, k, n
365 if (
present(meridian_arg))
then
366 meridian = meridian_arg
374 i = maxloc(coord(:, 1), 1)
375 j = minloc(coord(:, 1), 1)
378 if (
ne(coord(i, 1), meridian))
then
381 if (
ne(coord(j, 1), meridian * (-1._sp)))
then
384 allocate(coord_mod(k, 2))
386 if (mod(i,n)+1 == j)
then
388 coord_mod(1:i, :) = coord(1:i, :)
391 if (
ne(coord(i, 1), meridian))
then
392 a = meridian - coord(i, 1)
393 break = coord(i, 2) + a / (a + abs(meridian + coord(j, 1))) * (coord(j, 2) - coord(i, 2))
394 coord_mod(k+1, :) = [meridian, break]
398 coord_mod(k+1:k+2, 1) = [meridian, meridian * (-1._sp)]
399 coord_mod(k+1:k+2, 2) = [90._sp, 90._sp]
402 if (
ne(coord(j, 1), meridian * (-1._sp)))
then
403 a = meridian - coord(i, 1)
404 break = coord(i, 2) + a / (a + abs(meridian + coord(j, 1))) * (coord(j, 2) - coord(i, 2))
405 coord_mod(k+1, :) = [meridian * (-1._sp), break]
409 if (j > 1) coord_mod(k+1:k+1+n-j, :) = coord(j:n, :)
410 else if (mod(j,n)+1 == i)
then
412 coord_mod(1:j, :) = coord(1:j, :)
415 if (
ne(coord(j, 1), meridian * (-1._sp)))
then
416 a = abs(meridian + coord(j, 1))
417 break = coord(j, 2) + a / (a + meridian - coord(i, 1)) * (coord(i, 2) - coord(j, 2))
418 coord_mod(k+1, :) = [meridian * (-1._sp), break]
422 coord_mod(k+1:k+2, 1) = [meridian * (-1._sp), meridian]
423 coord_mod(k+1:k+2, 2) = [-90._sp, -90._sp]
426 if (
ne(coord(i, 1), meridian))
then
427 a = abs(meridian + coord(j, 1))
428 break = coord(j, 2) + a / (a + meridian - coord(i, 1)) * (coord(i, 2) - coord(j, 2))
429 coord_mod(k+1, :) = [meridian, break]
433 if (i > 1) coord_mod(k+1:k+1+n-i, :) = coord(i:n, :)
445 real(
sp),
intent(in) :: x_coord
447 real(
sp),
intent(in),
optional :: meridian_arg
452 if (
present(meridian_arg))
then
453 meridian = meridian_arg
457 shifted = sign(abs(x_coord) - meridian, x_coord * (-1._sp))
489 real(
dp),
dimension(:,:),
intent(in) :: coord
494 integer(i4) :: nedges
500 nedges =
size(coord,1)
503 if (i == nedges)
then
508 xsum = xsum + ( coord(i,1) * coord(k,2) )
509 ysum = ysum + ( coord(i,2) * coord(k,1) )
545 real(
dp),
dimension(:,:),
intent(in) :: coord
550 integer(i4) :: nedges
557 nedges =
size(coord,1)
562 if (i == nedges )
then
568 xsum = xsum + ((coord(i,1) + coord(k,1)) * &
569 ((coord(i,1) * coord(k,2) - coord(k,1) * coord(i,2))))
571 ysum = ysum + ((coord(i,2) + coord(k,2)) * &
572 ((coord(i,1) * coord(k,2) - coord(k,1) * coord(i,2))))
609 real(dp),
dimension(2),
intent(in) :: p
611 real(dp),
dimension(:, :),
intent(in) :: coord
616 integer(i4),
intent(out) :: erg
619 real(dp),
dimension(size(coord,1)) :: x, y
621 logical :: mx,my,nx,ny, test1, test2
622 integer(i4) :: n, i, j
630 if (
eq(x(i),0.0_dp) .and.
eq(y(i),0.0_dp) )
then
641 if (
eq(coord(i,1),coord(j,1)) .and.
eq(coord(i,1),p(1)) )
then
642 ly = (p(2)-coord(j,2)) / (coord(i,2)-coord(j,2))
643 if (
ge(ly,0.0_dp) .and.
le(ly,1.0_dp) )
then
649 if (
eq(coord(i,2),coord(j,2)) .and.
eq(coord(i,2),p(2)) )
then
650 lx = (p(1)-coord(j,1)) / (coord(i,1)-coord(j,1))
651 if (
ge(lx,0.0_dp ) .and.
le(lx,1.0_dp) )
then
662 test1 = .not.((my.or.ny).and.(mx.or.nx)).or.(mx.and.nx)
663 test2 = .not.(my.and.ny.and.(mx.or.nx).and..not.(mx.and.nx))
665 if (.not. test1)
then
667 if ((y(i)*x(j)-x(i)*y(j))/(x(j)-x(i)) < 0.0_dp)
then
670 if ((y(i)*x(j)-x(i)*y(j))/(x(j)-x(i)) > 0.0_dp)
then
693 real(
dp),
dimension(:,:),
intent(in) :: coord
701 real(
dp) :: sum_edges
707 sum_edges = sum((coord(2:n, 1) - coord(1:n-1, 1)) * (coord(2:n, 2) + coord(1:n-1, 2)))
708 sum_edges = sum_edges + (coord(1, 1) - coord(n, 1)) * (coord(1, 2) + coord(n, 2))
709 if (
eq(sum_edges, 0._dp))
then
711 else if (sum_edges < 0._dp)
then
730 real(
dp),
dimension(:,:),
intent(in) :: coord
732 real(
dp),
intent(in),
optional :: meridian_arg
733 real(
dp),
dimension(:,:),
allocatable :: coord_mod
738 integer(i4) :: i, j, k, n
740 if (
present(meridian_arg))
then
741 meridian = meridian_arg
749 i = maxloc(coord(:, 1), 1)
750 j = minloc(coord(:, 1), 1)
753 if (
ne(coord(i, 1), meridian))
then
756 if (
ne(coord(j, 1), meridian * (-1._dp)))
then
759 allocate(coord_mod(k, 2))
761 if (mod(i,n)+1 == j)
then
763 coord_mod(1:i, :) = coord(1:i, :)
766 if (
ne(coord(i, 1), meridian))
then
767 a = meridian - coord(i, 1)
768 break = coord(i, 2) + a / (a + abs(meridian + coord(j, 1))) * (coord(j, 2) - coord(i, 2))
769 coord_mod(k+1, :) = [meridian, break]
773 coord_mod(k+1:k+2, 1) = [meridian, meridian * (-1._dp)]
774 coord_mod(k+1:k+2, 2) = [90._dp, 90._dp]
777 if (
ne(coord(j, 1), meridian * (-1._dp)))
then
778 a = meridian - coord(i, 1)
779 break = coord(i, 2) + a / (a + abs(meridian + coord(j, 1))) * (coord(j, 2) - coord(i, 2))
780 coord_mod(k+1, :) = [meridian * (-1._dp), break]
784 if (j > 1) coord_mod(k+1:k+1+n-j, :) = coord(j:n, :)
785 else if (mod(j,n)+1 == i)
then
787 coord_mod(1:j, :) = coord(1:j, :)
790 if (
ne(coord(j, 1), meridian * (-1._dp)))
then
791 a = abs(meridian + coord(j, 1))
792 break = coord(j, 2) + a / (a + meridian - coord(i, 1)) * (coord(i, 2) - coord(j, 2))
793 coord_mod(k+1, :) = [meridian * (-1._dp), break]
797 coord_mod(k+1:k+2, 1) = [meridian * (-1._dp), meridian]
798 coord_mod(k+1:k+2, 2) = [-90._dp, -90._dp]
801 if (
ne(coord(i, 1), meridian))
then
802 a = abs(meridian + coord(j, 1))
803 break = coord(j, 2) + a / (a + meridian - coord(i, 1)) * (coord(i, 2) - coord(j, 2))
804 coord_mod(k+1, :) = [meridian, break]
808 if (i > 1) coord_mod(k+1:k+1+n-i, :) = coord(i:n, :)
820 real(
dp),
intent(in) :: x_coord
822 real(
dp),
intent(in),
optional :: meridian_arg
827 if (
present(meridian_arg))
then
828 meridian = meridian_arg
832 shifted = sign(abs(x_coord) - meridian, x_coord * (-1._dp))
Center of mass of polygon.
Determination point of polygon.
Modify polygon so it covers pole correctly.
Shifts the (longitude) value 180 degrees.
Check orientation of polygon.
Comparison of real values.
Comparison of real values: a >= b.
Comparison of real values: a <= b.
Comparison of real values for inequality.
Define number representations.
integer, parameter sp
Single Precision Real Kind.
integer, parameter i4
4 Byte Integer Kind
integer, parameter dp
Double Precision Real Kind.
elemental real(sp) function mod_shift_sp(x_coord, meridian_arg)
Shifts the (longitude) value 180 degrees.
real(dp) function areapoly_dp(coord)
Area of polygon.
real(sp) function, dimension(:,:), allocatable mod_pole_sp(coord, meridian_arg)
Modify polygon so it covers pole correctly.
subroutine inpoly_dp(p, coord, erg)
Determination point of polygon.
integer(i4) function orientpoly_sp(coord)
Check orientation of polygon.
subroutine inpoly_sp(p, coord, erg)
Determination point of polygon.
integer(i4) function orientpoly_dp(coord)
Check orientation of polygon.
elemental real(dp) function mod_shift_dp(x_coord, meridian_arg)
Shifts the (longitude) value 180 degrees.
real(dp) function, dimension(2) center_of_mass_dp(coord)
Center of mass of polygon.
real(sp) function, dimension(2) center_of_mass_sp(coord)
Center of mass of polygon.
real(sp) function areapoly_sp(coord)
Area of polygon.
real(dp) function, dimension(:,:), allocatable mod_pole_dp(coord, meridian_arg)
Modify polygon so it covers pole correctly.
General utilities for the CHS library.