10 use fckit_log_module,
only: fckit_log
11 use kinds,
only: kind_real
14 use missing_values_mod
41 nb, & ! number of levels in zb
42 Rad, & ! radius of curvature of earth at observation
43 lat, & ! latitude at observation
44 und, & ! geoid undulation above WGS-84
45 refrac, & ! refractivity of model on model levels
54 INTEGER,
INTENT(IN) :: nb
55 REAL(kind_real),
INTENT(IN) :: zb(nb)
56 REAL(kind_real),
INTENT(IN) :: rad
57 REAL(kind_real),
INTENT(IN) :: lat
58 REAL(kind_real),
INTENT(IN) :: und
59 REAL(kind_real),
INTENT(IN) :: refrac(nb)
60 REAL(kind_real),
INTENT(OUT) :: dnr_dref(nb,nb)
63 CHARACTER(len=*),
PARAMETER :: routinename =
"Ops_GPSROcalc_nrK"
64 REAL(kind_real) :: r(nb)
65 REAL(kind_real) :: z(nb)
85 IF (zb(i) > 0.0 .AND. refrac(i) > 0.0)
THEN
86 dnr_dref(i,i) = 1.0e-6 * r(i)
106 INTEGER,
INTENT(IN) :: nobs
107 INTEGER,
INTENT(IN) :: nlev
108 REAL(kind_real),
INTENT(IN) :: a(nobs)
109 REAL(kind_real),
INTENT(IN) :: refrac(nlev)
110 REAL(kind_real),
INTENT(IN) :: nr(nlev)
111 REAL(kind_real),
INTENT(OUT) :: kmat_ref(nobs,nlev)
112 REAL(kind_real),
INTENT(OUT) :: kmat_nr(nobs,nlev)
115 CHARACTER(len=*),
PARAMETER :: routinename =
"Ops_GPSROcalc_alphaK"
121 REAL(kind_real) :: kval(nlev - 1)
122 REAL(kind_real) :: root_2pia
123 REAL(kind_real) :: ref_low
124 REAL(kind_real) :: nr_low
125 REAL(kind_real) :: tup
126 REAL(kind_real) :: tlow
127 REAL(kind_real) :: dalpha
128 REAL(kind_real) :: diff_erf
129 REAL(kind_real) :: erf_tup
130 REAL(kind_real) :: erf_tlow
132 REAL(kind_real),
PARAMETER :: a1 = 0.3480242
133 REAL(kind_real),
PARAMETER :: a2 = -0.0958798
134 REAL(kind_real),
PARAMETER :: a3 = 0.7478556
135 REAL(kind_real),
PARAMETER :: p = 0.47047
136 REAL(kind_real) :: dkval_dref(nlev - 1,2)
137 REAL(kind_real) :: dkval_dnr(nlev - 1,2)
138 REAL(kind_real) :: dalpha_dref(2)
139 REAL(kind_real) :: dalpha_dnr(2)
140 REAL(kind_real) :: dalpha_dk
141 REAL(kind_real) :: dalpha_drlow
142 REAL(kind_real) :: dalpha_derf
143 REAL(kind_real) :: dalpha_dnrlow
144 REAL(kind_real) :: dnrlow_dref(2)
145 REAL(kind_real) :: dnrlow_dnr(2)
146 REAL(kind_real) :: drlow_dref(2)
147 REAL(kind_real) :: drlow_dnr(2)
148 REAL(kind_real) :: drlow_dk
149 REAL(kind_real) :: derf_dref(2)
150 REAL(kind_real) :: derf_dnr(2)
151 REAL(kind_real) :: derf_dtup
152 REAL(kind_real) :: derf_dtlow
153 REAL(kind_real) :: dtup_dnr(2)
154 REAL(kind_real) :: dtlow_dnr(2)
155 REAL(kind_real) :: dtup_dref(2)
156 REAL(kind_real) :: dtlow_dref(2)
157 REAL(kind_real) :: dtup_dk
158 REAL(kind_real) :: dtlow_dk
166 dkval_dref(:,:) = 0.0
173 IF (refrac(jbot) > 0.0 .AND. nr(jbot) > 0.0)
EXIT
185 DO i = nlev,jbot + 1,-1
188 IF ((nr(kbot) - nr(kbot-1)) < 10.0)
EXIT
194 jbot = max(jbot,kbot)
202 kval(i) = log(refrac(i) / refrac(i + 1)) / &
203 max(1.0,(nr(i + 1) - nr(i)))
205 kval(i) = max(1.0e-6,kval(i))
207 IF (kval(i) > 1.0e-6)
THEN
209 dkval_dref(i,1) = 1.0 / (refrac(i) * max(1.0,(nr(i + 1) - nr(i))))
210 dkval_dref(i,2) = -1.0 / (refrac(i + 1) * max(1.0,(nr(i + 1) - nr(i))))
212 dkval_dnr(i,1) = kval(i) / max(1.0,(nr(i + 1) - nr(i)))
213 dkval_dnr(i,2) = -kval(i) / max(1.0,(nr(i + 1) - nr(i)))
225 IF (a(n) < nr(jbot) .OR. a(n) > nr(nlev)) cycle
227 root_2pia = sqrt(2.0 * pi * a(n))
237 IF (((nr(ibot + 1) - a(n)) > 1.0) .OR. ibot == nlev - 1)
EXIT
245 DO i = ibot, nlev - 1
274 ref_low = refrac(i) * exp(-kval(i) * (a(n) - nr(i)))
276 drlow_dref(1)= ref_low / refrac(i)
277 drlow_dk = -ref_low * (a(n) - nr(i))
278 drlow_dnr(1) = ref_low * kval(i)
296 drlow_dref(:) = drlow_dref(:) + drlow_dk * dkval_dref(i,:)
297 drlow_dnr(:) = drlow_dnr(:) + drlow_dk * dkval_dnr(i,:)
302 IF (i == nlev - 1)
THEN
306 tup = sqrt(kval(i) * (nr(i + 1) + 1.0e5 - a(n)))
308 dtup_dk = 0.5 * (nr(i + 1) + 1.0e5 - a(n)) / tup
309 dtup_dnr(2) = 0.5 * kval(i) / tup
313 tup = sqrt(kval(i) * (nr(i + 1) - a(n)))
315 dtup_dk = 0.5 * (nr(i + 1) - a(n)) / tup
316 dtup_dnr(2) = 0.5 * kval(i) / tup
320 dtup_dref(:) = dtup_dref(:) + dtup_dk * dkval_dref(i,:)
321 dtup_dnr(:) = dtup_dnr(:) + dtup_dk * dkval_dnr(i,:)
326 tlow = sqrt(kval(i) * (nr(i) - a(n)))
327 dtlow_dk = 0.5 * (nr(i) - a(n)) / tlow
328 dtlow_dnr(1) = 0.5 * kval(i) / tlow
331 dtlow_dref(:) = dtlow_dref(:) + dtlow_dk * dkval_dref(i,:)
332 dtlow_dnr(:) = dtlow_dnr(:) + dtlow_dk * dkval_dnr(i,:)
336 t = 1.0 / (1.0 + p * tup)
337 erf_tup = 1.0 - exp(-(tup ** 2)) * (a1 + (a2 + a3 * t) * t) * t
338 derf_dtup = exp(-(tup ** 2)) * ((2.0 * tup * (a1 + (a2 + a3 * t) * t) * t) + &
339 ((a1 + (2.0 * a2 + 3.0 * a3 * t) * t) * p * t ** 2))
341 t = 1.0 / (1.0 + p * tlow)
342 erf_tlow = 1.0 - exp(-(tlow ** 2)) * (a1 + (a2 + a3 * t) * t) * t
346 derf_dtlow = -1.0 * exp(-(tlow ** 2)) * ((2.0 * tlow * (a1 + (a2 + a3 * t) * t) * t) + &
347 ((a1 + (2.0 * a2 + 3.0 * a3 * t) * t) * p * t ** 2))
349 diff_erf = erf_tup - erf_tlow
351 derf_dref(:) = derf_dtup * dtup_dref(:) + &
352 derf_dtlow * dtlow_dref(:)
354 derf_dnr(:) = derf_dtup * dtup_dnr(:) + &
355 derf_dtlow * dtlow_dnr(:)
357 dalpha = 1.0e-6 * root_2pia * sqrt(kval(i)) * &
358 ref_low * exp(kval(i) * (nr_low - a(n))) * diff_erf
360 dalpha_drlow = dalpha / max(1.0e-10,ref_low)
362 dalpha_derf = dalpha / max(1.0e-10,diff_erf)
364 dalpha_dnrlow = dalpha * kval(i)
366 dalpha_dk = dalpha * (nr_low - a(n) + 0.5 / kval(i))
371 dalpha_dref(:) = dalpha_dref(:) + &
372 dalpha_drlow * drlow_dref(:) + &
373 dalpha_derf * derf_dref(:) + &
374 dalpha_dnrlow * dnrlow_dref(:) + &
375 dalpha_dk * dkval_dref(i,:)
377 dalpha_dnr(:) = dalpha_dnr(:) + &
378 dalpha_drlow * drlow_dnr(:) + &
379 dalpha_derf * derf_dnr(:) + &
380 dalpha_dnrlow * dnrlow_dnr(:) + &
381 dalpha_dk * dkval_dnr(i,:)
386 kmat_ref(n,i) = kmat_ref(n,i) + dalpha_dref(1)
387 kmat_nr(n,i) = kmat_nr(n,i) + dalpha_dnr(1)
389 kmat_ref(n,i + 1) = kmat_ref(n,i + 1) + dalpha_dref(2)
390 kmat_nr(n,i + 1) = kmat_nr(n,i + 1) + dalpha_dnr(2)
real(kind_real), parameter, public rd
subroutine, public ops_gpsrocalc_nrk(zb, nb, Rad, lat, und, refrac, dnr_dref)
subroutine, public ops_gpsrocalc_alphak(nobs, nlev, a, refrac, nr, Kmat_ref, Kmat_nr)
subroutine, public ops_gpsro_geop_geom(lat, z)