10 use fckit_log_module,
only: fckit_log
11 use kinds,
only: kind_real
14 use missing_values_mod
54 INTEGER,
INTENT(IN) :: nobs
55 INTEGER,
INTENT(IN) :: nlev
56 REAL(kind_real),
INTENT(IN) :: a(nobs)
57 REAL(kind_real),
INTENT(IN) :: refrac(nlev)
58 REAL(kind_real),
INTENT(IN) :: nr(nlev)
59 REAL(kind_real),
INTENT(OUT) :: alpha(nobs)
62 CHARACTER(len=*),
PARAMETER :: routinename =
"Ops_GPSROcalc_alpha"
68 REAL(kind_real) :: kval(nlev - 1)
69 REAL(kind_real) :: root_2pia
70 REAL(kind_real) :: ref_low
71 REAL(kind_real) :: nr_low
72 REAL(kind_real) :: tup
73 REAL(kind_real) :: tlow
74 REAL(kind_real) :: diff_erf
75 REAL(kind_real) :: dalpha
76 REAL(kind_real) :: erf_tup
77 REAL(kind_real) :: erf_tlow
79 REAL(kind_real),
PARAMETER :: a1 = 0.3480242
80 REAL(kind_real),
PARAMETER :: a2 = -0.0958798
81 REAL(kind_real),
PARAMETER :: a3 = 0.7478556
82 REAL(kind_real),
PARAMETER :: p = 0.47047
88 IF (refrac(jbot) > 0.0 .AND. nr(jbot) > 0.0)
EXIT
100 DO i = nlev,jbot + 1,-1
103 IF ((nr(kbot) - nr(kbot - 1)) < 10.0)
EXIT
109 jbot = max(jbot,kbot)
117 kval(i) = log(refrac(i) / refrac(i + 1)) / &
118 max(1.0,(nr(i + 1) - nr(i)))
119 kval(i) = max(1.0e-6,kval(i))
127 alpha(:) = missing_value(alpha(1))
131 IF (a(n) < nr(jbot) .OR. a(n) > nr(nlev)) cycle
133 root_2pia = sqrt(2.0 * pi * a(n))
142 IF (((nr(ibot + 1) - a(n)) > 1.0) .OR. ibot == nlev - 1)
EXIT
157 DO i = ibot, nlev - 1
161 ref_low = refrac(ibot) * exp(-kval(ibot) * (a(n) - nr(ibot)))
174 IF (i == nlev - 1)
THEN
178 tup = sqrt(kval(i) * (nr(i + 1) + 1.0e5 - a(n)))
182 tup = sqrt(kval(i) * (nr(i + 1) - a(n)))
188 IF (i > ibot) tlow = sqrt(kval(i) * (nr(i) - a(n)))
192 t = 1.0 / (1.0 + p * tup)
193 erf_tup = 1.0 - exp(-(tup ** 2)) * (a1 + (a2 + a3 * t) * t) * t
195 t = 1.0 / (1.0 + p * tlow)
196 erf_tlow = 1.0 - exp(-(tlow ** 2)) * (a1 + (a2 + a3 * t) * t) * t
198 diff_erf = erf_tup - erf_tlow
200 dalpha = 1.0e-6 * root_2pia * sqrt(kval(i)) * &
201 ref_low * exp(kval(i) * (nr_low - a(n))) * diff_erf
205 alpha(n) = alpha(n) + dalpha
219 zb, & ! geopotential heights of model levels
220 refrac, & ! refractivity of model on model levels
221 Rad, & ! radius of curvature of earth at observation
222 lat, & ! latitude at observation
223 und, & ! geoid undulation above WGS-84
229 INTEGER,
INTENT(IN) :: nb
230 REAL(kind_real),
INTENT(IN) :: zb(nb)
231 REAL(kind_real),
INTENT(IN) :: rad
232 REAL(kind_real),
INTENT(IN) :: lat
233 REAL(kind_real),
INTENT(IN) :: und
234 REAL(kind_real),
INTENT(IN) :: refrac(nb)
235 REAL(kind_real),
INTENT(OUT) :: nr(nb)
238 CHARACTER(len=*),
PARAMETER :: routinename =
"Ops_GPSROcalc_nr"
239 REAL(kind_real) :: r(nb)
240 REAL(kind_real) :: z(nb)
243 nr(:) = missing_value(nr(1))
259 IF (zb(i) > 0.0 .AND. refrac(i) > 0.0)
THEN
260 nr(i) = (1.0e0 + 1.0e-6 * refrac(i)) * r(i)
278 REAL(kind_real),
INTENT(IN) :: lat
279 REAL(kind_real),
INTENT(INOUT) :: z(:)
282 CHARACTER(len=*),
PARAMETER :: routinename =
"Ops_GPSRO_geop_geom"
283 REAL(kind_real) :: r_eff
284 REAL(kind_real) :: g_somig
285 REAL(kind_real) :: latrad
291 latrad = lat * (pi / 180.0)
297 r_eff = a_earth / (1.0 + flatt + m_ratio - 2.0 * flatt * (sin(latrad)) ** 2)
299 g_somig = g_equat * (1.0 + k_somig * (sin(latrad)) ** 2) / (sqrt(1.0 - (ecc ** 2) * (sin(latrad)) ** 2))
305 z(:) = (r_eff * z(:)) / ((g_somig / grav) * r_eff - z(:))
real(kind_real), parameter, public rd
subroutine, public ops_gpsrocalc_nr(nb, zb, refrac, Rad, lat, und, nr)
subroutine, public ops_gpsrocalc_alpha(nobs, nlev, a, refrac, nr, alpha)
subroutine, public ops_gpsro_geop_geom(lat, z)