10 use fckit_log_module,
only: fckit_log
11 use kinds,
only: kind_real
14 use missing_values_mod
56 GPSRO_vert_interp_ops, &
63 INTEGER,
INTENT(IN) :: nstate
64 INTEGER,
INTENT(IN) :: nlevp
65 INTEGER,
INTENT(IN) :: nb
66 INTEGER,
INTENT(IN) :: nlevq
67 REAL(kind_real),
INTENT(IN) :: za(:)
68 REAL(kind_real),
INTENT(IN) :: zb(:)
69 REAL(kind_real),
INTENT(IN) :: x(:)
70 LOGICAL,
INTENT(IN) :: gpsro_pseudo_ops
71 LOGICAL,
INTENT(IN) :: gpsro_vert_interp_ops
72 REAL(kind_real),
ALLOCATABLE,
INTENT(OUT) :: dref_dp(:,:)
73 REAL(kind_real),
ALLOCATABLE,
INTENT(OUT) :: dref_dq(:,:)
76 CHARACTER(len=*),
PARAMETER :: routinename =
"Ops_GPSRO_refracK"
79 REAL(kind_real) :: p(nlevp)
80 REAL(kind_real) :: exner(nlevp)
81 REAL(kind_real) :: q(nlevq)
82 REAL(kind_real) :: pb(nlevq)
83 REAL(kind_real) :: tv(nlevq)
84 REAL(kind_real) :: t(nlevq)
85 REAL(kind_real) :: extheta
86 REAL(kind_real) :: pwt1
87 REAL(kind_real) :: pwt2
88 REAL(kind_real) :: ndry
89 REAL(kind_real) :: nwet
90 REAL(kind_real) :: refrac(nlevq)
91 REAL(kind_real) :: dex_dp(nlevp,nlevp)
92 REAL(kind_real) :: dpb_dp(nlevq,nlevp)
93 REAL(kind_real) :: dextheta_dpb(nlevq,nlevq)
94 REAL(kind_real) :: dtv_dextheta(nlevq,nlevq)
95 REAL(kind_real) :: dtv_dex(nlevq,nlevp)
96 REAL(kind_real) :: dt_dtv(nlevq,nlevq)
97 REAL(kind_real) :: dt_dq(nlevq,nlevq)
98 REAL(kind_real) :: dref_dpb(nlevq,nlevq)
99 REAL(kind_real) :: dref_dt(nlevq,nlevq)
100 REAL(kind_real) :: m1(nb,nlevq)
101 REAL(kind_real) :: m2(nb,nlevp)
102 REAL(kind_real) :: m3(nb,nlevq)
103 REAL(kind_real) :: m4(nb,nlevq)
104 REAL(kind_real),
ALLOCATABLE :: p_pseudo(:)
105 REAL(kind_real),
ALLOCATABLE :: q_pseudo(:)
106 REAL(kind_real),
ALLOCATABLE :: t_pseudo(:)
107 REAL(kind_real),
ALLOCATABLE :: z_pseudo(:)
108 REAL(kind_real),
ALLOCATABLE :: n_pseudo(:)
109 REAL(kind_real) :: gamma
110 REAL(kind_real) :: beta
112 REAL(kind_real) :: g_rb
113 REAL(kind_real) :: c_zz
114 REAL(kind_real) :: dpp_dt1
115 REAL(kind_real) :: dpp_dtp
116 REAL(kind_real) :: dtp_dt1
117 REAL(kind_real) :: dpp_dbeta
118 REAL(kind_real) :: dbeta_dt1
119 REAL(kind_real) :: dtp_dbeta
120 REAL(kind_real) :: dbeta_dt2
121 REAL(kind_real) :: dpp_dc
122 REAL(kind_real) :: dc_dt1
123 REAL(kind_real) :: dc_dbeta
124 REAL(kind_real) :: dc_dt2
125 REAL(kind_real) :: dpp_dp1
126 REAL(kind_real) :: dc_dp1
127 REAL(kind_real) :: dc_dp2
128 REAL(kind_real),
ALLOCATABLE :: dref_dppseudo(:,:)
129 REAL(kind_real),
ALLOCATABLE :: dref_dtpseudo(:,:)
130 REAL(kind_real),
ALLOCATABLE :: dref_dqpseudo(:,:)
131 REAL(kind_real),
ALLOCATABLE :: dppseudo_dpb(:,:)
132 REAL(kind_real),
ALLOCATABLE :: dtpseudo_dtb(:,:)
133 REAL(kind_real),
ALLOCATABLE :: dqpseudo_dqb(:,:)
134 REAL(kind_real),
ALLOCATABLE :: dppseudo_dt(:,:)
135 REAL(kind_real),
ALLOCATABLE :: dtb_dp(:,:)
136 REAL(kind_real),
ALLOCATABLE :: dppseudo_dp(:,:)
137 REAL(kind_real),
ALLOCATABLE :: dtpseudo_dp(:,:)
139 IF (gpsro_pseudo_ops)
THEN
140 ALLOCATE (dref_dp(nb,nlevp))
141 ALLOCATE (dref_dq(nb,nlevq))
143 ALLOCATE (p_pseudo(nb))
144 ALLOCATE (q_pseudo(nb))
145 ALLOCATE (t_pseudo(nb))
146 ALLOCATE (z_pseudo(nb))
147 ALLOCATE (n_pseudo(nb))
149 ALLOCATE (dref_dppseudo(nb,nb))
150 ALLOCATE (dref_dtpseudo(nb,nb))
151 ALLOCATE (dref_dqpseudo(nb,nb))
152 ALLOCATE (dppseudo_dpb(nb,nlevq))
153 ALLOCATE (dppseudo_dt(nb,nlevq))
154 ALLOCATE (dtpseudo_dtb(nb,nlevq))
155 ALLOCATE (dqpseudo_dqb(nb,nlevq))
157 ALLOCATE (dtb_dp(nlevq,nlevp))
158 ALLOCATE (dppseudo_dp(nb,nlevp))
159 ALLOCATE (dtpseudo_dp(nb,nlevp))
161 dref_dppseudo(:,:) = 0.0
162 dref_dtpseudo(:,:) = 0.0
163 dref_dqpseudo(:,:) = 0.0
164 dppseudo_dpb(:,:) = 0.0
165 dppseudo_dt(:,:) = 0.0
166 dtpseudo_dtb(:,:) = 0.0
167 dqpseudo_dqb(:,:) = 0.0
168 dppseudo_dp(:,:) = 0.0
169 dtpseudo_dp(:,:) = 0.0
171 ALLOCATE (dref_dp(nlevq,nlevp))
172 ALLOCATE (dref_dq(nlevq,nlevq))
180 dextheta_dpb(:,:) = 0.0
182 dtv_dextheta(:,:) = 0.0
193 p(:) = 1.0e2 * x(1:nlevp)
194 q(:) = 1.0e-3 * x(nlevp + 1:nstate)
198 exner(:) = (p(:) / pref) ** rd_over_cp
202 dex_dp(i,i) = rd_over_cp / pref * (p(i) / pref) ** (rd_over_cp - 1.0)
214 pwt1 = (za(i + 1) - zb(i)) / (za(i + 1) - za(i))
219 IF (gpsro_vert_interp_ops)
THEN
220 pb(i) = exp(pwt1 * log(p(i)) + pwt2 * log(p(i + 1)))
222 dpb_dp(i,i) = pb(i) * pwt1 / p(i)
223 dpb_dp(i,i + 1) = pb(i) * pwt2 / p(i + 1)
226 pb(i) = pref * (pwt1 * (p(i) / pref) ** rd_over_cp + pwt2 * (p(i + 1) / pref) ** rd_over_cp) ** (1.0 / rd_over_cp)
228 dpb_dp(i,i) = pwt1 * (pwt1 * (p(i) / pref) ** rd_over_cp + pwt2 * &
229 (p(i + 1) / pref) ** rd_over_cp) ** (1.0 / rd_over_cp - 1.0) * (p(i) / pref) ** (rd_over_cp - 1.0)
230 dpb_dp(i,i + 1) = pwt2 * (pwt1 * (p(i) / pref) ** rd_over_cp + pwt2 * &
231 (p(i + 1) / pref) ** rd_over_cp) ** (1.0 / rd_over_cp - 1.0) * (p(i + 1) / pref) ** (rd_over_cp-1.0)
236 extheta = (pb(i) / pref) ** rd_over_cp
238 dextheta_dpb(i,i) = rd_over_cp * (pb(i) ** (rd_over_cp - 1.0)) / (pref ** rd_over_cp)
242 tv(i) = grav * (za(i + 1) - za(i)) * extheta / (cp * (exner(i) - exner(i + 1)))
244 dtv_dextheta(i,i) = tv(i) / extheta
246 dtv_dex(i,i) = -tv(i) / (exner(i) - exner(i + 1))
248 dtv_dex(i,i + 1) = tv(i) / (exner(i) - exner(i + 1))
262 t(i) = tv(i) / (1.0 + c_virtual * q(i))
264 dt_dtv(i,i) = 1.0 / (1.0 + c_virtual * q(i))
266 dt_dq(i,i) = -c_virtual * t(i) / (1.0 + c_virtual * q(i))
270 nwet = n_beta * pb(i) * q(i) / (t(i) ** 2 * (mw_ratio + (1.0 - mw_ratio) * q(i)))
272 dref_dq(i,i) = n_beta * pb(i) * mw_ratio / (t(i) * (mw_ratio + (1.0 - mw_ratio) * q(i))) ** 2
276 ndry = n_alpha * pb(i) / t(i)
278 refrac(i) = ndry + nwet
280 dref_dpb(i,i) = refrac(i) / pb(i)
282 dref_dt(i,i) = -(ndry + 2.0 * nwet) / t(i)
286 IF (gpsro_pseudo_ops)
THEN
290 dtb_dp = matmul(dt_dtv, matmul(matmul(dtv_dextheta, dextheta_dpb), dpb_dp) + matmul(dtv_dex, dex_dp))
294 IF (mod(i, 2) > 0)
THEN
295 z_pseudo(i) = zb(counter)
296 p_pseudo(i) = pb(counter)
297 q_pseudo(i) = q(counter)
298 t_pseudo(i) = t(counter)
299 n_pseudo(i) = n_alpha * p_pseudo(i) / t_pseudo(i) + n_beta * p_pseudo(i) * q_pseudo(i) / &
300 (t_pseudo(i) ** 2 * (mw_ratio + (1.0 - mw_ratio) * q_pseudo(i)))
302 dref_dppseudo(i,i) = dref_dpb(counter,counter)
303 dref_dtpseudo(i,i) = dref_dt(counter,counter)
304 dref_dqpseudo(i,i) = dref_dq(counter,counter)
306 dppseudo_dpb(i,counter) = 1.0
307 dtpseudo_dtb(i,counter) = 1.0
308 dqpseudo_dqb(i,counter) = 1.0
310 counter = counter + 1
314 z_pseudo(i) = (zb(counter - 1) + zb(counter)) / 2.0
315 IF (min(q(counter - 1), q(counter)) > 0.0)
THEN
316 gamma = log(q(counter - 1) / q(counter)) / (zb(counter) - zb(counter - 1))
317 q_pseudo(i) = q(counter - 1) * exp(-gamma * (z_pseudo(i) - z_pseudo(i - 1)))
319 q_pseudo(i) = q(counter - 1) + (q(counter) - q(counter - 1)) / &
320 (zb(counter) - zb(counter - 1)) * (z_pseudo(i) - zb(counter - 1))
323 beta = (t(counter) - t(counter - 1)) / (zb(counter) - zb(counter - 1))
324 t_pseudo(i) = t(counter - 1) + beta * (z_pseudo(i) - zb(counter - 1))
325 IF (abs(t(counter) - t(counter - 1)) > 1.0e-10)
THEN
326 c = ((pb(counter) / pb(counter - 1)) * (t(counter) / t(counter - 1)) ** (grav / (
rd * beta)) - 1.0) / &
327 (zb(counter) - zb(counter - 1))
328 p_pseudo(i) = (pb(counter - 1) * (t_pseudo(i) / t(counter - 1)) ** &
329 (-grav / (
rd * beta))) * (1.0 + c * (z_pseudo(i) - zb(counter - 1)))
331 p_pseudo(i) = pb(counter - 1) * exp(log(pb(counter) / pb(counter - 1)) * &
332 ((z_pseudo(i) - zb(counter - 1)) / (zb(counter) - zb(counter - 1))))
335 ndry = n_alpha * p_pseudo(i) / t_pseudo(i)
336 nwet = n_beta * p_pseudo(i) * q_pseudo(i) / (t_pseudo(i) ** 2 &
337 *(mw_ratio + (1.0 - mw_ratio) * q_pseudo(i)))
339 n_pseudo(i) = ndry + nwet
341 dref_dppseudo(i,i) = n_pseudo(i) / p_pseudo(i)
342 dref_dtpseudo(i,i) = -(ndry + 2.0 * nwet) / t_pseudo(i)
343 dref_dqpseudo(i,i) = n_beta * p_pseudo(i) * mw_ratio / (t_pseudo(i) * (mw_ratio + &
344 (1.0 - mw_ratio) * q_pseudo(i))) ** 2
347 IF (min(q(counter - 1), q(counter)) > 0.0)
THEN
348 dqpseudo_dqb(i,counter - 1) = (q_pseudo(i) / q(counter - 1)) * (1.0 - &
349 (z_pseudo(i) - zb(counter - 1)) / (zb(counter) - zb(counter - 1)))
351 dqpseudo_dqb(i,counter) = (q_pseudo(i) / q(counter)) * ((z_pseudo(i) - zb(counter - 1)) / &
352 (zb(counter) - zb(counter - 1)))
354 dqpseudo_dqb(i,counter - 1) = (zb(counter) - z_pseudo(i)) / (zb(counter) - zb(counter - 1))
356 dqpseudo_dqb(i,counter) = (z_pseudo(i) - zb(counter - 1)) / (zb(counter) - zb(counter - 1))
359 dtpseudo_dtb(i,counter - 1) = (zb(counter) - z_pseudo(i)) / (zb(counter) - zb(counter - 1))
361 dtpseudo_dtb(i,counter) = (z_pseudo(i) - zb(counter - 1)) / (zb(counter) - zb(counter - 1))
365 g_rb = grav / (
rd * beta)
366 c_zz = c + 1.0 / (zb(counter) - zb(counter - 1))
368 dpp_dt1 = (g_rb / t(counter - 1)) * p_pseudo(i)
369 dpp_dtp = -(g_rb / t_pseudo(i)) * p_pseudo(i)
370 dtp_dt1 = dtpseudo_dtb(i,counter - 1)
371 dpp_dbeta = (g_rb / beta) * log(t_pseudo(i) / t(counter - 1)) * p_pseudo(i)
372 dbeta_dt1 = -1.0 / (zb(counter) - zb(counter - 1))
373 dtp_dbeta = z_pseudo(i) - zb(counter - 1)
374 dbeta_dt2 = 1.0 / (zb(counter) - zb(counter - 1))
376 IF (abs(t(counter) - t(counter - 1)) > 1.0e-10)
THEN
378 dpp_dc = (z_pseudo(i) - zb(counter - 1)) * pb(counter - 1) * (t_pseudo(i) / t(counter - 1)) ** (-g_rb)
379 dc_dt1 = -(g_rb / (t(counter - 1))) * c_zz
380 dc_dbeta = -(g_rb / beta) * log(t(counter) / t(counter - 1)) * c_zz
381 dc_dt2 = (g_rb / t(counter)) * c_zz
382 dpp_dp1 = p_pseudo(i) / pb(counter - 1)
383 dppseudo_dt(i,counter - 1) = dpp_dt1 + dpp_dtp * dtp_dt1 + dpp_dbeta * dbeta_dt1 + dpp_dc * &
384 (dc_dt1 + dc_dbeta * dbeta_dt1)
385 dppseudo_dt(i,counter) = (dpp_dbeta + dpp_dtp * dtp_dbeta + dpp_dc * dc_dbeta) * &
386 dbeta_dt2 + dpp_dc * dc_dt2
388 dc_dp1 = -(1.0 / pb(counter - 1)) * c_zz
389 dc_dp2 = (1.0 / pb(counter)) * c_zz
391 dppseudo_dpb(i,counter - 1) = dpp_dp1 + dpp_dc * dc_dp1
392 dppseudo_dpb(i,counter) = dpp_dc * dc_dp2
394 dppseudo_dpb(i,counter - 1) = exp(log(pb(counter) / pb(counter - 1)) * ((z_pseudo(i) - zb(counter - 1)) / &
395 (zb(counter) - zb(counter - 1)))) * (1.0 - ((z_pseudo(i) - zb(counter - 1)) / (zb(counter) - zb(counter - 1))))
396 dppseudo_dpb(i,counter) = (pb(counter - 1) / pb(counter)) * ((z_pseudo(i) - zb(counter - 1)) / &
397 (zb(counter) - zb(counter - 1))) * exp(log(pb(counter) / pb(counter - 1)) * ((z_pseudo(i) - zb(counter - 1)) / &
398 (zb(counter) - zb(counter - 1))))
406 dppseudo_dp = matmul(dppseudo_dpb, dpb_dp) + matmul(dppseudo_dt, dtb_dp)
407 dtpseudo_dp = matmul(dtpseudo_dtb, dtb_dp)
414 dref_dp(:,:) = matmul(dref_dppseudo, dppseudo_dp) + matmul(dref_dtpseudo, dtpseudo_dp)
417 dref_dq(:,:) = matmul(dref_dqpseudo, dqpseudo_dqb) + matmul(matmul(dref_dtpseudo, dtpseudo_dtb), dt_dq) + &
418 matmul(matmul(dref_dppseudo, dppseudo_dt), dt_dq)
422 dref_dp(:,:) = 1.0e2 * dref_dp(:,:)
424 dref_dq(:,:) = 1.0e-3 * dref_dq(:,:)
435 dref_dp(:,:) = matmul(dref_dpb, dpb_dp)
438 m1(:,:) = matmul(dref_dt, dt_dtv)
439 m2(:,:) = matmul(m1, dtv_dex)
440 dref_dp(:,:) = dref_dp(:,:) + matmul(m2, dex_dp)
443 m3(:,:) = matmul(m1, dtv_dextheta)
444 m4(:,:) = matmul(m3, dextheta_dpb)
445 dref_dp(:,:) = dref_dp(:,:) + matmul(m4, dpb_dp)
449 dref_dq(:,:) = dref_dq(:,:) + matmul(dref_dt, dt_dq)
453 dref_dp(:,:) = 1.0e2 * dref_dp(:,:)
455 dref_dq(:,:) = 1.0e-3 * dref_dq(:,:)
459 IF (
ALLOCATED (p_pseudo))
DEALLOCATE (p_pseudo)
460 IF (
ALLOCATED (q_pseudo))
DEALLOCATE (q_pseudo)
461 IF (
ALLOCATED (t_pseudo))
DEALLOCATE (t_pseudo)
462 IF (
ALLOCATED (z_pseudo))
DEALLOCATE (z_pseudo)
463 IF (
ALLOCATED (n_pseudo))
DEALLOCATE (n_pseudo)
464 IF (
ALLOCATED (dref_dppseudo))
DEALLOCATE (dref_dppseudo)
465 IF (
ALLOCATED (dref_dtpseudo))
DEALLOCATE (dref_dtpseudo)
466 IF (
ALLOCATED (dref_dqpseudo))
DEALLOCATE (dref_dqpseudo)
467 IF (
ALLOCATED (dppseudo_dpb))
DEALLOCATE (dppseudo_dpb)
468 IF (
ALLOCATED (dtpseudo_dtb))
DEALLOCATE (dtpseudo_dtb)
469 IF (
ALLOCATED (dqpseudo_dqb))
DEALLOCATE (dqpseudo_dqb)
470 IF (
ALLOCATED (dppseudo_dt))
DEALLOCATE (dppseudo_dt)
471 IF (
ALLOCATED (dtb_dp))
DEALLOCATE (dtb_dp)
472 IF (
ALLOCATED (dppseudo_dp))
DEALLOCATE (dppseudo_dp)
473 IF (
ALLOCATED (dtpseudo_dp))
DEALLOCATE (dtpseudo_dp)
479 nb, & ! number of levels in zb
480 Rad, & ! radius of curvature of earth at observation
481 lat, & ! latitude at observation
482 und, & ! geoid undulation above WGS-84
483 refrac, & ! refractivity of model on model levels
492 INTEGER,
INTENT(IN) :: nb
493 REAL(kind_real),
INTENT(IN) :: zb(nb)
494 REAL(kind_real),
INTENT(IN) :: rad
495 REAL(kind_real),
INTENT(IN) :: lat
496 REAL(kind_real),
INTENT(IN) :: und
497 REAL(kind_real),
INTENT(IN) :: refrac(nb)
498 REAL(kind_real),
INTENT(OUT) :: dnr_dref(nb,nb)
501 CHARACTER(len=*),
PARAMETER :: routinename =
"Ops_GPSROcalc_nrK"
502 REAL(kind_real) :: r(nb)
503 REAL(kind_real) :: z(nb)
523 IF (zb(i) > 0.0 .AND. refrac(i) > 0.0)
THEN
524 dnr_dref(i,i) = 1.0e-6 * r(i)
544 INTEGER,
INTENT(IN) :: nobs
545 INTEGER,
INTENT(IN) :: nlev
546 REAL(kind_real),
INTENT(IN) :: a(nobs)
547 REAL(kind_real),
INTENT(IN) :: refrac(nlev)
548 REAL(kind_real),
INTENT(IN) :: nr(nlev)
549 REAL(kind_real),
INTENT(OUT) :: kmat_ref(nobs,nlev)
550 REAL(kind_real),
INTENT(OUT) :: kmat_nr(nobs,nlev)
553 CHARACTER(len=*),
PARAMETER :: routinename =
"Ops_GPSROcalc_alphaK"
559 REAL(kind_real) :: kval(nlev - 1)
560 REAL(kind_real) :: root_2pia
561 REAL(kind_real) :: ref_low
562 REAL(kind_real) :: nr_low
563 REAL(kind_real) :: tup
564 REAL(kind_real) :: tlow
565 REAL(kind_real) :: dalpha
566 REAL(kind_real) :: diff_erf
567 REAL(kind_real) :: erf_tup
568 REAL(kind_real) :: erf_tlow
570 REAL(kind_real),
PARAMETER :: a1 = 0.3480242
571 REAL(kind_real),
PARAMETER :: a2 = -0.0958798
572 REAL(kind_real),
PARAMETER :: a3 = 0.7478556
573 REAL(kind_real),
PARAMETER :: p = 0.47047
574 REAL(kind_real) :: dkval_dref(nlev - 1,2)
575 REAL(kind_real) :: dkval_dnr(nlev - 1,2)
576 REAL(kind_real) :: dalpha_dref(2)
577 REAL(kind_real) :: dalpha_dnr(2)
578 REAL(kind_real) :: dalpha_dk
579 REAL(kind_real) :: dalpha_drlow
580 REAL(kind_real) :: dalpha_derf
581 REAL(kind_real) :: dalpha_dnrlow
582 REAL(kind_real) :: dnrlow_dref(2)
583 REAL(kind_real) :: dnrlow_dnr(2)
584 REAL(kind_real) :: drlow_dref(2)
585 REAL(kind_real) :: drlow_dnr(2)
586 REAL(kind_real) :: drlow_dk
587 REAL(kind_real) :: derf_dref(2)
588 REAL(kind_real) :: derf_dnr(2)
589 REAL(kind_real) :: derf_dtup
590 REAL(kind_real) :: derf_dtlow
591 REAL(kind_real) :: dtup_dnr(2)
592 REAL(kind_real) :: dtlow_dnr(2)
593 REAL(kind_real) :: dtup_dref(2)
594 REAL(kind_real) :: dtlow_dref(2)
595 REAL(kind_real) :: dtup_dk
596 REAL(kind_real) :: dtlow_dk
604 dkval_dref(:,:) = 0.0
611 IF (refrac(jbot) > 0.0 .AND. nr(jbot) > 0.0)
EXIT
623 DO i = nlev,jbot + 1,-1
626 IF ((nr(kbot) - nr(kbot-1)) < 10.0)
EXIT
632 jbot = max(jbot,kbot)
640 kval(i) = log(refrac(i) / refrac(i + 1)) / &
641 max(1.0,(nr(i + 1) - nr(i)))
643 kval(i) = max(1.0e-6,kval(i))
645 IF (kval(i) > 1.0e-6)
THEN
647 dkval_dref(i,1) = 1.0 / (refrac(i) * max(1.0,(nr(i + 1) - nr(i))))
648 dkval_dref(i,2) = -1.0 / (refrac(i + 1) * max(1.0,(nr(i + 1) - nr(i))))
650 dkval_dnr(i,1) = kval(i) / max(1.0,(nr(i + 1) - nr(i)))
651 dkval_dnr(i,2) = -kval(i) / max(1.0,(nr(i + 1) - nr(i)))
663 IF (a(n) < nr(jbot) .OR. a(n) > nr(nlev)) cycle
665 root_2pia = sqrt(2.0 * pi * a(n))
675 IF (((nr(ibot + 1) - a(n)) > 1.0) .OR. ibot == nlev - 1)
EXIT
683 DO i = ibot, nlev - 1
712 ref_low = refrac(i) * exp(-kval(i) * (a(n) - nr(i)))
714 drlow_dref(1)= ref_low / refrac(i)
715 drlow_dk = -ref_low * (a(n) - nr(i))
716 drlow_dnr(1) = ref_low * kval(i)
734 drlow_dref(:) = drlow_dref(:) + drlow_dk * dkval_dref(i,:)
735 drlow_dnr(:) = drlow_dnr(:) + drlow_dk * dkval_dnr(i,:)
740 IF (i == nlev - 1)
THEN
744 tup = sqrt(kval(i) * (nr(i + 1) + 1.0e5 - a(n)))
746 dtup_dk = 0.5 * (nr(i + 1) + 1.0e5 - a(n)) / tup
747 dtup_dnr(2) = 0.5 * kval(i) / tup
751 tup = sqrt(kval(i) * (nr(i + 1) - a(n)))
753 dtup_dk = 0.5 * (nr(i + 1) - a(n)) / tup
754 dtup_dnr(2) = 0.5 * kval(i) / tup
758 dtup_dref(:) = dtup_dref(:) + dtup_dk * dkval_dref(i,:)
759 dtup_dnr(:) = dtup_dnr(:) + dtup_dk * dkval_dnr(i,:)
764 tlow = sqrt(kval(i) * (nr(i) - a(n)))
765 dtlow_dk = 0.5 * (nr(i) - a(n)) / tlow
766 dtlow_dnr(1) = 0.5 * kval(i) / tlow
769 dtlow_dref(:) = dtlow_dref(:) + dtlow_dk * dkval_dref(i,:)
770 dtlow_dnr(:) = dtlow_dnr(:) + dtlow_dk * dkval_dnr(i,:)
774 t = 1.0 / (1.0 + p * tup)
775 erf_tup = 1.0 - exp(-(tup ** 2)) * (a1 + (a2 + a3 * t) * t) * t
776 derf_dtup = exp(-(tup ** 2)) * ((2.0 * tup * (a1 + (a2 + a3 * t) * t) * t) + &
777 ((a1 + (2.0 * a2 + 3.0 * a3 * t) * t) * p * t ** 2))
779 t = 1.0 / (1.0 + p * tlow)
780 erf_tlow = 1.0 - exp(-(tlow ** 2)) * (a1 + (a2 + a3 * t) * t) * t
784 derf_dtlow = -1.0 * exp(-(tlow ** 2)) * ((2.0 * tlow * (a1 + (a2 + a3 * t) * t) * t) + &
785 ((a1 + (2.0 * a2 + 3.0 * a3 * t) * t) * p * t ** 2))
787 diff_erf = erf_tup - erf_tlow
789 derf_dref(:) = derf_dtup * dtup_dref(:) + &
790 derf_dtlow * dtlow_dref(:)
792 derf_dnr(:) = derf_dtup * dtup_dnr(:) + &
793 derf_dtlow * dtlow_dnr(:)
795 dalpha = 1.0e-6 * root_2pia * sqrt(kval(i)) * &
796 ref_low * exp(kval(i) * (nr_low - a(n))) * diff_erf
798 dalpha_drlow = dalpha / max(1.0e-10,ref_low)
800 dalpha_derf = dalpha / max(1.0e-10,diff_erf)
802 dalpha_dnrlow = dalpha * kval(i)
804 dalpha_dk = dalpha * (nr_low - a(n) + 0.5 / kval(i))
809 dalpha_dref(:) = dalpha_dref(:) + &
810 dalpha_drlow * drlow_dref(:) + &
811 dalpha_derf * derf_dref(:) + &
812 dalpha_dnrlow * dnrlow_dref(:) + &
813 dalpha_dk * dkval_dref(i,:)
815 dalpha_dnr(:) = dalpha_dnr(:) + &
816 dalpha_drlow * drlow_dnr(:) + &
817 dalpha_derf * derf_dnr(:) + &
818 dalpha_dnrlow * dnrlow_dnr(:) + &
819 dalpha_dk * dkval_dnr(i,:)
824 kmat_ref(n,i) = kmat_ref(n,i) + dalpha_dref(1)
825 kmat_nr(n,i) = kmat_nr(n,i) + dalpha_dnr(1)
827 kmat_ref(n,i + 1) = kmat_ref(n,i + 1) + dalpha_dref(2)
828 kmat_nr(n,i + 1) = kmat_nr(n,i + 1) + dalpha_dnr(2)