Area (m^2) of a spherical triangle (corners in degrees) via the spherical-excess form of L’Huilier’s theorem. Side lengths are angular (great-circle distance / r).
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| real(kind=wp), | intent(in) | :: | r | |||
| real(kind=wp), | intent(in) | :: | lat1 | |||
| real(kind=wp), | intent(in) | :: | lon1 | |||
| real(kind=wp), | intent(in) | :: | lat2 | |||
| real(kind=wp), | intent(in) | :: | lon2 | |||
| real(kind=wp), | intent(in) | :: | lat3 | |||
| real(kind=wp), | intent(in) | :: | lon3 |
| Type | Visibility | Attributes | Name | Initial | |||
|---|---|---|---|---|---|---|---|
| real(kind=wp), | private | :: | a | ||||
| real(kind=wp), | private | :: | b | ||||
| real(kind=wp), | private | :: | c | ||||
| real(kind=wp), | private | :: | e | ||||
| real(kind=wp), | private | :: | sps | ||||
| real(kind=wp), | private | :: | t |
pure function spherical_tri_area(r, lat1, lon1, lat2, lon2, lat3, lon3) result(area) !! Area (m^2) of a spherical triangle (corners in degrees) via the !! spherical-excess form of L'Huilier's theorem. Side lengths are !! angular (great-circle distance / r). real(wp), intent(in) :: r, lat1, lon1, lat2, lon2, lat3, lon3 real(wp) :: area real(wp) :: a, b, c, sps, e, t a = great_circle(1.0_wp, lat2, lon2, lat3, lon3) b = great_circle(1.0_wp, lat1, lon1, lat3, lon3) c = great_circle(1.0_wp, lat1, lon1, lat2, lon2) sps = 0.5_wp*(a + b + c) ! tan(E/4) = sqrt(tan(s/2) tan((s-a)/2) tan((s-b)/2) tan((s-c)/2)) t = tan(0.5_wp*sps)*tan(0.5_wp*(sps - a))* & tan(0.5_wp*(sps - b))*tan(0.5_wp*(sps - c)) if (t <= 0.0_wp) then area = 0.0_wp else e = 4.0_wp*atan(sqrt(t)) area = r*r*e end if end function spherical_tri_area