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