NCEPLIBS-ip 4.0.0
earth_radius.f90
1 SUBROUTINE earth_radius(IGDTMPL, IGDTLEN, RADIUS, ECCEN_SQUARED)
2!$$$ SUBPROGRAM DOCUMENTATION BLOCK
3!
4! SUBPROGRAM: EARTH_RADIUS DETERMINE EARTH RADIUS AND SHAPE
5! PRGMMR: GAYNO ORG: W/NMC23 DATE: 2015-07-14
6!
7! ABSTRACT: DETERMINE THE RADIUS AND SHAPE OF THE EARTH FROM
8! THE GRIB 2 GRID DEFINITION TEMPLATE ARRAY - SECTION 3
9!
10! PROGRAM HISTORY LOG:
11! 2015-07-14 GAYNO
12!
13! USAGE: CALL EARTH_RADIUS(IGDTMPL, IGDTLEN, &
14! RADIUS, ECCEN_SQUARED)
15!
16! INPUT ARGUMENT LIST:
17! IGDTMPL - INTEGER (IGDTLEN) GRID DEFINITION TEMPLATE ARRAY.
18! CORRESPONDS TO THE GFLD%IGDTMPL COMPONENT
19! OF THE NCEP G2 LIBRARY GRIDMOD DATA STRUCTURE.
20! FOR ALL MAP PROJECTIONS RECOGNIZED BY IPLIB,
21! THE ENTRIES USE BY THIS ROUTINE ARE:
22! (1) - SHAPE OF EARTH, SECTION 3, OCTET 15
23! (2) - SCALE FACTOR OF SPHERICAL EARTH RADIUS,
24! OCTET 16
25! (3) - SCALED VALUE OF RADIUS OF SPHERICAL EARTH,
26! OCTETS 17-20
27! (4) - SCALE FACTOR OF MAJOR AXIS OF ELLIPTICAL EARTH,
28! OCTET 21
29! (5) - SCALED VALUE OF MAJOR AXIS OF ELLIPTICAL EARTH,
30! OCTETS 22-25
31! (6) - SCALE FACTOR OF MINOR AXIS OF ELLIPTICAL EARTH,
32! OCTET 26
33! (7) - SCALED VALUE OF MINOR AXIS OF ELLIPTICAL EARTH,
34! OCTETS 27-30
35! IGDTLEN - INTEGER NUMBER OF ELEMENTS OF THE GRID DEFINITION
36! TEMPLATE ARRAY. CORRESPONDS TO THE GFLD%IGDTLEN
37! COMPONENT OF THE NCEP G2 LIBRARY GRIDMOD
38! DATA STRUCTURE.
39!
40! OUTPUT ARGUMENT LIST:
41! RADIUS - REAL EARTH RADIUS IN METERS.
42! FOR ELLIPITICAL EARTHS, THIS IS THE
43! SEMI MAJOR AXIS. SEE "MAP PROJECTSIONS -
44! A WORKING MANUAL" BY SNYDER (1987)
45! FOR DETAILS.
46! ECCEN_SQUARED - REAL EARTH ECCENTRICITY SQUARED
47!
48! ATTRIBUTES:
49! LANGUAGE: FORTRAN 90
50!
51!$$$
52 IMPLICIT NONE
53!
54 INTEGER, INTENT(IN ) :: IGDTLEN
55 INTEGER, INTENT(IN ) :: IGDTMPL(IGDTLEN)
56!
57 REAL, INTENT( OUT) :: ECCEN_SQUARED
58 REAL, INTENT( OUT) :: RADIUS
59!
60 REAL :: FLAT
61 REAL :: MAJOR_AXIS, MINOR_AXIS
62!
63 SELECT CASE (igdtmpl(1))
64 CASE (0)
65 radius = 6367470.0
66 eccen_squared = 0.0
67 CASE (1) ! USER SPECIFIED SPHERICAL
68 radius = float(igdtmpl(3))/float(10**igdtmpl(2))
69 eccen_squared = 0.0
70 CASE (2) ! IAU 1965
71 radius = 6378160.0 ! SEMI MAJOR AXIS
72 flat = 1.0/297.0 ! FLATTENING
73 eccen_squared = (2.0*flat) - (flat**2)
74 CASE (3) ! USER SPECIFIED ELLIPTICAL (KM)
75 major_axis = float(igdtmpl(5))/float(10**igdtmpl(4))
76 major_axis = major_axis * 1000.0
77 minor_axis = float(igdtmpl(7))/float(10**igdtmpl(6))
78 minor_axis = minor_axis * 1000.0
79 eccen_squared = 1.0 - (minor_axis**2 / major_axis**2)
80 radius = major_axis
81 CASE (4) ! IAG-GRS80 MODEL
82 radius = 6378137.0 ! SEMI MAJOR AXIS
83 flat = 1.0/298.2572 ! FLATTENING
84 eccen_squared = (2.0*flat) - (flat**2)
85 CASE (5) ! WGS84 DATUM
86 radius = 6378137.0 ! SEMI MAJOR AXIS
87 eccen_squared = 0.00669437999013
88 CASE (6)
89 radius = 6371229.0
90 eccen_squared = 0.0
91 CASE (7) ! USER SPECIFIED ELLIPTICAL (M)
92 major_axis = float(igdtmpl(5))/float(10**igdtmpl(4))
93 minor_axis = float(igdtmpl(7))/float(10**igdtmpl(6))
94 eccen_squared = 1.0 - (minor_axis**2 / major_axis**2)
95 radius = major_axis
96 CASE (8)
97 radius = 6371200.0
98 eccen_squared = 0.0
99 CASE DEFAULT
100 radius = -9999.
101 eccen_squared = -9999.
102 END SELECT
103!
104 RETURN
105!
106 END SUBROUTINE earth_radius