spherical_tri_area Function

private 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).

Arguments

Type IntentOptional 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

Return Value real(kind=wp)


Calls

proc~~spherical_tri_area~~CallsGraph proc~spherical_tri_area spherical_tri_area proc~great_circle great_circle proc~spherical_tri_area->proc~great_circle

Called by

proc~~spherical_tri_area~~CalledByGraph proc~spherical_tri_area spherical_tri_area proc~spherical_quad_area spherical_quad_area proc~spherical_quad_area->proc~spherical_tri_area proc~tripolar_supergrid_arrays tripolar_supergrid_arrays proc~tripolar_supergrid_arrays->proc~spherical_quad_area proc~metrics_fill_tripolar_whole metrics_fill_tripolar_whole proc~metrics_fill_tripolar_whole->proc~tripolar_supergrid_arrays proc~metrics_fill_tripolar metrics_fill_tripolar proc~metrics_fill_tripolar->proc~metrics_fill_tripolar_whole proc~configure_ocean_metrics configure_ocean_metrics proc~configure_ocean_metrics->proc~metrics_fill_tripolar

Variables

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

Source Code

   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