UFO
gnssro_mod_transform.F90
Go to the documentation of this file.
1 !==========================================================================
3 !==========================================================================
4 
5 use kinds
7 
8 real(kind_real), parameter :: semi_major_axis = 6378.1370e3_kind_real ! (m)
9 real(kind_real), parameter :: semi_minor_axis = 6356.7523142e3_kind_real ! (m)
10 real(kind_real), parameter :: grav_polar = 9.8321849378_kind_real ! (m/s2)
11 real(kind_real), parameter :: grav_equator = 9.7803253359_kind_real ! (m/s2)
12 real(kind_real), parameter :: earth_omega = 7.292115e-5_kind_real ! (rad/s)
13 real(kind_real), parameter :: grav_constant = 3.986004418e14_kind_real !
14 real(kind_real), parameter :: flattening = (semi_major_axis-semi_minor_axis)/semi_major_axis
15 real(kind_real), parameter :: somigliana = (semi_minor_axis/semi_major_axis) * (grav_polar/grav_equator) - one
16 real(kind_real), parameter :: grav_ratio = (earth_omega*earth_omega * &
18 real(kind_real), parameter :: eccentricity = sqrt(semi_major_axis**2 - semi_minor_axis**2)/semi_major_axis
19 
20 contains
21 
22 ! ------------------------------
23 ! variable converting between geopotential and geometric heights using MJ Mahoney's (2001)
24 ! Parameters from WGS-84 model software inside GPS receivers.
25 ! copy from GSI
26 subroutine geometric2geop(Latitude,geometricZ, geopotentialH )
27 implicit none
28 real(kind_real), intent(in) :: Latitude, geometricZ
29 real(kind_real), intent(out) :: geopotentialH
30 real(kind_real) :: sino, termg, termr ! local variables
31 
32 sino = sin(deg2rad*latitude)**2
33 termg = grav_equator*( (one+somigliana*sino)/sqrt(one-eccentricity*eccentricity*sino) )
34 termr = semi_major_axis / (one + flattening + grav_ratio - two*flattening*sino)
35 geopotentialh = (termg/grav) * ((termr*geometricz)/(termr+geometricz)) ! meter
36 
37 end subroutine geometric2geop
38 
39 
40 subroutine geop2geometric(latitude, geopotentialH, geometricZ, dzdh_jac)
41 implicit none
42 ! calculate observation geometric height using MJ Mahoney's (2001), eq(23)
43 real(kind_real),intent(in) :: latitude, geopotentialH
44 real(kind_real),intent(out) :: geometricZ
45 real(kind_real),intent(out), optional ::dzdh_jac !dzdh's jacobian
46 real(kind_real) :: sino
47 real(kind_real) :: termg, termr, termrg
48 
49 sino = sin(deg2rad*latitude)**2
50 termg = grav_equator*( (one+somigliana*sino)/sqrt(one-eccentricity*eccentricity*sino) )
51 termr = semi_major_axis / (one + flattening + grav_ratio - two*flattening*sino)
52 termrg = termg/grav*termr
53 
54 geometricz = termr*geopotentialh/(termrg-geopotentialh)
55 
56 if ( present(dzdh_jac)) then
57  dzdh_jac = termr/(termrg-geopotentialh) + (termr*geopotentialh)/(termrg-geopotentialh)**2
58 end if
59 
60 end subroutine geop2geometric
61 ! ------------------------------
62 
63 subroutine compute_refractivity(temperature, specH, pressure,refr, use_compress)
64 implicit none
65 real(kind_real), intent(in) :: temperature, specH, pressure
66 real(kind_real), intent(out) :: refr
67 integer(c_int), intent(in) :: use_compress
68 real(kind_real) :: refr1,refr2,refr3, tfact
69 
70 ! constants needed to compute refractivity
71  call gnssro_ref_constants(use_compress)
72 
73  tfact = (1-rd_over_rv)*spech+rd_over_rv
74  refr1 = n_a*pressure/temperature
75  refr2 = n_b*spech*pressure/(temperature**2*tfact)
76  refr3 = n_c*spech*pressure/(temperature*tfact)
77  refr = refr1 + refr2 + refr3
78 
79 end subroutine compute_refractivity
80 ! ------------------------------
81 
82 end module gnssro_mod_transform
83 
subroutine, public gnssro_ref_constants(use_compress)
real(kind_real), public n_a
real(kind_real), public n_b
real(kind_real), public n_c
real(kind_real), parameter grav_constant
subroutine geop2geometric(latitude, geopotentialH, geometricZ, dzdh_jac)
real(kind_real), parameter earth_omega
subroutine compute_refractivity(temperature, specH, pressure, refr, use_compress)
real(kind_real), parameter semi_major_axis
subroutine geometric2geop(Latitude, geometricZ, geopotentialH)
real(kind_real), parameter grav_ratio
real(kind_real), parameter somigliana
real(kind_real), parameter grav_polar
real(kind_real), parameter grav_equator
real(kind_real), parameter flattening
real(kind_real), parameter semi_minor_axis
real(kind_real), parameter eccentricity