19 use fckit_log_module,
only: fckit_log
20 use missing_values_mod
38 use kinds,
only: kind_real
85 INTEGER,
INTENT(IN) :: nlevp
86 INTEGER,
INTENT(IN) :: nlevq
87 REAL(kind_real),
INTENT(IN) :: za(nlevp)
88 REAL(kind_real),
INTENT(IN) :: zb(nlevq)
89 REAL(kind_real),
INTENT(IN) :: p(nlevp)
90 REAL(kind_real),
INTENT(IN) :: q(nlevq)
91 LOGICAL,
INTENT(IN) :: vert_interp_ops
92 LOGICAL,
INTENT(IN) :: pseudo_ops
93 REAL(kind_real),
INTENT(IN) :: min_temp_grad
94 LOGICAL,
INTENT(OUT) :: refracerr
95 INTEGER,
INTENT(OUT) :: nreflevels
96 REAL(kind_real),
ALLOCATABLE,
INTENT(OUT) :: refractivity(:)
97 REAL(kind_real),
ALLOCATABLE,
INTENT(OUT) :: model_heights(:)
98 REAL(kind_real),
OPTIONAL,
INTENT(OUT) :: temperature(nlevq)
99 REAL(kind_real),
OPTIONAL,
INTENT(OUT) :: interp_pressure(nlevq)
102 CHARACTER(len=*),
PARAMETER :: routinename =
"ufo_calculate_refractivity"
105 REAL(kind_real) :: exner(nlevp)
106 REAL(kind_real) :: pb(nlevq)
107 REAL(kind_real) :: t_local(nlevq)
108 REAL(kind_real) :: t_virtual
109 REAL(kind_real) :: ex_theta
110 REAL(kind_real) :: pwt1
111 REAL(kind_real) :: pwt2
112 REAL(kind_real) :: ndry
113 REAL(kind_real) :: nwet
114 REAL(kind_real),
ALLOCATABLE :: p_pseudo(:)
115 REAL(kind_real),
ALLOCATABLE :: q_pseudo(:)
116 REAL(kind_real),
ALLOCATABLE :: t_pseudo(:)
117 REAL(kind_real) :: refracmodel(1:nlevq)
118 REAL(kind_real) :: gamma
119 REAL(kind_real) :: beta
121 CHARACTER(LEN=200) :: message
125 nreflevels = 2 * nlevq - 1
126 ALLOCATE (p_pseudo(nreflevels))
127 ALLOCATE (q_pseudo(nreflevels))
128 ALLOCATE (t_pseudo(nreflevels))
132 ALLOCATE (model_heights(nreflevels))
133 ALLOCATE (refractivity(nreflevels))
138 refracmodel(:) = missing_value(refracmodel(1))
139 refractivity(:) = missing_value(refractivity(1))
140 t_local(:) = missing_value(t_local(1))
144 IF (p(i) == missing_value(p(i)))
THEN
146 WRITE(message, *) routinename,
" Input pressure missing", i
147 CALL fckit_log % warning(message)
151 IF (p(i) - p(i + 1) < 0.0)
THEN
153 WRITE(message, *) routinename,
" Input pressure non-monotonic", i, p(i), p(i+1)
154 CALL fckit_log % warning(message)
159 IF (any(p(:) <= 0.0))
THEN
161 WRITE(message, *) routinename,
" Input pressure not physical"
162 CALL fckit_log % warning(message)
166 IF (.NOT. refracerr)
THEN
170 exner(:) = (p(:) / pref) ** rd_over_cp
175 pwt1 = (za(i + 1) - zb(i)) / (za(i + 1) - za(i))
180 IF (vert_interp_ops)
THEN
182 pb(i) = exp(pwt1 * log(p(i)) + pwt2 * log(p(i + 1)))
185 pb(i) = pref * (pwt1 * (p(i) / pref) ** rd_over_cp + pwt2 * (p(i + 1) / pref) ** rd_over_cp) ** (1.0 / rd_over_cp)
189 ex_theta = (pb(i) / pref) ** rd_over_cp
193 t_virtual = grav * (za(i + 1) - za(i)) * ex_theta / &
194 (cp * (exner(i) - exner(i + 1)))
196 t_local(i) = t_virtual / (1.0 + c_virtual * q(i))
199 nwet = n_beta * pb(i) * q(i) / (t_local(i) ** 2 * (mw_ratio + (1.0 - mw_ratio) * q(i)))
201 ndry = n_alpha * pb(i) / t_local(i)
203 refracmodel(i) = ndry + nwet
213 IF (mod(i, 2) > 0)
THEN
214 model_heights(i) = zb(counter)
215 p_pseudo(i) = pb(counter)
216 q_pseudo(i) = q(counter)
217 t_pseudo(i) = t_local(counter)
218 counter = counter + 1
222 model_heights(i) = (zb(counter - 1) + zb(counter)) / 2.0
225 IF (min(q(counter - 1), q(counter)) > 0.0)
THEN
226 gamma = log(q(counter - 1) / q(counter)) / (zb(counter) - zb(counter - 1))
227 q_pseudo(i) = q(counter - 1) * exp(-gamma * (model_heights(i) - model_heights(i - 1)))
231 q_pseudo(i) = q(counter - 1) + (q(counter) - q(counter - 1)) / (zb(counter) - &
232 zb(counter - 1)) * (model_heights(i) - zb(counter - 1))
236 beta = (t_local(counter) - t_local(counter - 1)) / (zb(counter) - zb(counter - 1))
237 t_pseudo(i) = t_local(counter - 1) + beta * (model_heights(i) - zb(counter - 1))
240 IF (abs(t_local(counter) - t_local(counter - 1)) > min_temp_grad)
THEN
241 c = ((pb(counter) / pb(counter - 1)) * (t_local(counter) / t_local(counter - 1)) ** (grav / (
rd * beta)) - &
242 1.0) / (zb(counter) - zb(counter - 1))
243 p_pseudo(i) = (pb(counter - 1) * (t_pseudo(i) / t_local(counter - 1)) ** &
244 (-grav / (
rd * beta))) * (1.0 + c * (model_heights(i) - zb(counter - 1)))
247 p_pseudo(i) = pb(counter - 1) * exp(log(pb(counter) / pb(counter - 1)) * &
248 ((model_heights(i) - zb(counter - 1)) / (zb(counter) - zb(counter - 1))))
253 refractivity = n_alpha * p_pseudo / t_pseudo + n_beta * p_pseudo * q_pseudo / &
254 (t_pseudo ** 2 * (mw_ratio + (1.0 - mw_ratio) * q_pseudo))
256 refractivity = refracmodel
262 IF (
PRESENT(temperature))
THEN
263 temperature(:) = t_local(:)
266 IF (
PRESENT(interp_pressure))
THEN
267 interp_pressure(:) = pb(:)
271 IF (
ALLOCATED (p_pseudo))
DEALLOCATE (p_pseudo)
272 IF (
ALLOCATED (q_pseudo))
DEALLOCATE (q_pseudo)
273 IF (
ALLOCATED (t_pseudo))
DEALLOCATE (t_pseudo)
318 INTEGER,
INTENT(IN) :: nlevp
319 INTEGER,
INTENT(IN) :: nlevq
320 INTEGER,
INTENT(IN) :: nreflevels
321 REAL(kind_real),
INTENT(IN) :: za(nlevp)
322 REAL(kind_real),
INTENT(IN) :: zb(nlevq)
323 REAL(kind_real),
INTENT(IN) :: p(nlevp)
324 REAL(kind_real),
INTENT(IN) :: q(nlevq)
325 LOGICAL,
INTENT(IN) :: pseudo_ops
326 LOGICAL,
INTENT(IN) :: vert_interp_ops
327 REAL(kind_real),
INTENT(IN) :: min_temp_grad
328 REAL(kind_real),
ALLOCATABLE,
INTENT(OUT) :: dref_dp(:,:)
329 REAL(kind_real),
ALLOCATABLE,
INTENT(OUT) :: dref_dq(:,:)
330 REAL(kind_real),
OPTIONAL,
INTENT(OUT) :: dpb_dp(nlevq,nlevp)
331 REAL(kind_real),
OPTIONAL,
INTENT(OUT),
ALLOCATABLE :: refractivity(:)
336 REAL(kind_real) :: pb(nlevq)
337 REAL(kind_real) :: t_virtual(nlevq)
338 REAL(kind_real) :: t(nlevq)
339 REAL(kind_real) :: refrac(nlevq)
340 REAL(kind_real) :: extheta
341 REAL(kind_real) :: pwt1
342 REAL(kind_real) :: pwt2
343 REAL(kind_real) :: ndry
344 REAL(kind_real) :: nwet
345 REAL(kind_real) :: dex_dp(nlevp,nlevp)
346 REAL(kind_real) :: dpb_dp_local(nlevq,nlevp)
347 REAL(kind_real) :: dextheta_dpb(nlevq,nlevq)
348 REAL(kind_real) :: dtv_dextheta(nlevq,nlevq)
349 REAL(kind_real) :: dtv_dex(nlevq,nlevp)
350 REAL(kind_real) :: dt_dtv(nlevq,nlevq)
351 REAL(kind_real) :: dt_dq(nlevq,nlevq)
352 REAL(kind_real) :: dref_dpb(nlevq,nlevq)
353 REAL(kind_real) :: dref_dt(nlevq,nlevq)
354 REAL(kind_real) :: dref_dq_model(nlevq,nlevq)
355 REAL(kind_real) :: m1(nreflevels,nlevq)
356 REAL(kind_real) :: m2(nreflevels,nlevp)
357 REAL(kind_real) :: m3(nreflevels,nlevq)
358 REAL(kind_real) :: m4(nreflevels,nlevq)
359 REAL(kind_real),
ALLOCATABLE :: p_pseudo(:)
360 REAL(kind_real),
ALLOCATABLE :: q_pseudo(:)
361 REAL(kind_real),
ALLOCATABLE :: t_pseudo(:)
362 REAL(kind_real),
ALLOCATABLE :: model_heights(:)
363 REAL(kind_real) :: gamma
364 REAL(kind_real) :: beta
366 REAL(kind_real) :: g_rb
367 REAL(kind_real) :: c_zz
368 REAL(kind_real) :: dpp_dt1
369 REAL(kind_real) :: dpp_dtp
370 REAL(kind_real) :: dtp_dt1
371 REAL(kind_real) :: dpp_dbeta
372 REAL(kind_real) :: dbeta_dt1
373 REAL(kind_real) :: dtp_dbeta
374 REAL(kind_real) :: dbeta_dt2
375 REAL(kind_real) :: dpp_dc
376 REAL(kind_real) :: dc_dt1
377 REAL(kind_real) :: dc_dbeta
378 REAL(kind_real) :: dc_dt2
379 REAL(kind_real) :: dpp_dp1
380 REAL(kind_real) :: dc_dp1
381 REAL(kind_real) :: dc_dp2
382 REAL(kind_real),
ALLOCATABLE :: dref_dppseudo(:,:)
383 REAL(kind_real),
ALLOCATABLE :: dref_dtpseudo(:,:)
384 REAL(kind_real),
ALLOCATABLE :: dref_dqpseudo(:,:)
385 REAL(kind_real),
ALLOCATABLE :: dppseudo_dpb(:,:)
386 REAL(kind_real),
ALLOCATABLE :: dtpseudo_dtb(:,:)
387 REAL(kind_real),
ALLOCATABLE :: dqpseudo_dqb(:,:)
388 REAL(kind_real),
ALLOCATABLE :: dppseudo_dt(:,:)
389 REAL(kind_real),
ALLOCATABLE :: dtb_dp(:,:)
390 REAL(kind_real),
ALLOCATABLE :: dppseudo_dp(:,:)
391 REAL(kind_real),
ALLOCATABLE :: dtpseudo_dp(:,:)
393 ALLOCATE (dref_dp(nreflevels,nlevp))
394 ALLOCATE (dref_dq(nreflevels,nlevq))
397 ALLOCATE (p_pseudo(nreflevels))
398 ALLOCATE (q_pseudo(nreflevels))
399 ALLOCATE (t_pseudo(nreflevels))
400 ALLOCATE (model_heights(nreflevels))
401 IF (
PRESENT(refractivity))
ALLOCATE (refractivity(nreflevels))
403 ALLOCATE (dref_dppseudo(nreflevels,nreflevels))
404 ALLOCATE (dref_dtpseudo(nreflevels,nreflevels))
405 ALLOCATE (dref_dqpseudo(nreflevels,nreflevels))
406 ALLOCATE (dppseudo_dpb(nreflevels,nlevq))
407 ALLOCATE (dppseudo_dt(nreflevels,nlevq))
408 ALLOCATE (dtpseudo_dtb(nreflevels,nlevq))
409 ALLOCATE (dqpseudo_dqb(nreflevels,nlevq))
411 ALLOCATE (dtb_dp(nlevq,nlevp))
412 ALLOCATE (dppseudo_dp(nreflevels,nlevp))
413 ALLOCATE (dtpseudo_dp(nreflevels,nlevp))
415 dref_dppseudo(:,:) = 0.0
416 dref_dtpseudo(:,:) = 0.0
417 dref_dqpseudo(:,:) = 0.0
418 dppseudo_dpb(:,:) = 0.0
419 dppseudo_dt(:,:) = 0.0
420 dtpseudo_dtb(:,:) = 0.0
421 dqpseudo_dqb(:,:) = 0.0
422 dppseudo_dp(:,:) = 0.0
423 dtpseudo_dp(:,:) = 0.0
457 dtb_dp = matmul(dt_dtv, matmul(matmul(dtv_dextheta, dextheta_dpb), dpb_dp_local) + matmul(dtv_dex, dex_dp))
461 IF (mod(i, 2) > 0)
THEN
462 model_heights(i) = zb(counter)
463 p_pseudo(i) = pb(counter)
464 q_pseudo(i) = q(counter)
465 t_pseudo(i) = t(counter)
466 IF (
PRESENT(refractivity)) refractivity(i) = n_alpha * p_pseudo(i) / t_pseudo(i) + &
467 n_beta * p_pseudo(i) * q_pseudo(i) / &
468 (t_pseudo(i) ** 2 * (mw_ratio + (1.0 - mw_ratio) * q_pseudo(i)))
470 dref_dppseudo(i,i) = dref_dpb(counter,counter)
471 dref_dtpseudo(i,i) = dref_dt(counter,counter)
472 dref_dqpseudo(i,i) = dref_dq_model(counter,counter)
474 dppseudo_dpb(i,counter) = 1.0
475 dtpseudo_dtb(i,counter) = 1.0
476 dqpseudo_dqb(i,counter) = 1.0
478 counter = counter + 1
482 model_heights(i) = (zb(counter - 1) + zb(counter)) / 2.0
483 IF (min(q(counter - 1), q(counter)) > 0.0)
THEN
484 gamma = log(q(counter - 1) / q(counter)) / (zb(counter) - zb(counter - 1))
485 q_pseudo(i) = q(counter - 1) * exp(-gamma * (model_heights(i) - model_heights(i - 1)))
487 q_pseudo(i) = q(counter - 1) + (q(counter) - q(counter - 1)) / &
488 (zb(counter) - zb(counter - 1)) * (model_heights(i) - zb(counter - 1))
491 beta = (t(counter) - t(counter - 1)) / (zb(counter) - zb(counter - 1))
492 t_pseudo(i) = t(counter - 1) + beta * (model_heights(i) - zb(counter - 1))
493 IF (abs(t(counter) - t(counter - 1)) > min_temp_grad)
THEN
494 c = ((pb(counter) / pb(counter - 1)) * (t(counter) / t(counter - 1)) ** (grav / (
rd * beta)) - 1.0) / &
495 (zb(counter) - zb(counter - 1))
496 p_pseudo(i) = (pb(counter - 1) * (t_pseudo(i) / t(counter - 1)) ** &
497 (-grav / (
rd * beta))) * (1.0 + c * (model_heights(i) - zb(counter - 1)))
499 p_pseudo(i) = pb(counter - 1) * exp(log(pb(counter) / pb(counter - 1)) * &
500 ((model_heights(i) - zb(counter - 1)) / (zb(counter) - zb(counter - 1))))
503 ndry = n_alpha * p_pseudo(i) / t_pseudo(i)
504 nwet = n_beta * p_pseudo(i) * q_pseudo(i) / (t_pseudo(i) ** 2 &
505 *(mw_ratio + (1.0 - mw_ratio) * q_pseudo(i)))
507 IF (
PRESENT(refractivity)) refractivity(i) = ndry + nwet
509 dref_dppseudo(i,i) = (ndry + nwet) / p_pseudo(i)
510 dref_dtpseudo(i,i) = -(ndry + 2.0 * nwet) / t_pseudo(i)
511 dref_dqpseudo(i,i) = n_beta * p_pseudo(i) * mw_ratio / (t_pseudo(i) * (mw_ratio + &
512 (1.0 - mw_ratio) * q_pseudo(i))) ** 2
515 IF (min(q(counter - 1), q(counter)) > 0.0)
THEN
516 dqpseudo_dqb(i,counter - 1) = (q_pseudo(i) / q(counter - 1)) * (1.0 - &
517 (model_heights(i) - zb(counter - 1)) / (zb(counter) - zb(counter - 1)))
519 dqpseudo_dqb(i,counter) = (q_pseudo(i) / q(counter)) * ((model_heights(i) - zb(counter - 1)) / &
520 (zb(counter) - zb(counter - 1)))
522 dqpseudo_dqb(i,counter - 1) = (zb(counter) - model_heights(i)) / (zb(counter) - zb(counter - 1))
524 dqpseudo_dqb(i,counter) = (model_heights(i) - zb(counter - 1)) / (zb(counter) - zb(counter - 1))
527 dtpseudo_dtb(i,counter - 1) = (zb(counter) - model_heights(i)) / (zb(counter) - zb(counter - 1))
529 dtpseudo_dtb(i,counter) = (model_heights(i) - zb(counter - 1)) / (zb(counter) - zb(counter - 1))
533 g_rb = grav / (
rd * beta)
534 c_zz = c + 1.0 / (zb(counter) - zb(counter - 1))
536 dpp_dt1 = (g_rb / t(counter - 1)) * p_pseudo(i)
537 dpp_dtp = -(g_rb / t_pseudo(i)) * p_pseudo(i)
538 dtp_dt1 = dtpseudo_dtb(i,counter - 1)
539 dpp_dbeta = (g_rb / beta) * log(t_pseudo(i) / t(counter - 1)) * p_pseudo(i)
540 dbeta_dt1 = -1.0 / (zb(counter) - zb(counter - 1))
541 dtp_dbeta = model_heights(i) - zb(counter - 1)
542 dbeta_dt2 = 1.0 / (zb(counter) - zb(counter - 1))
544 IF (abs(t(counter) - t(counter - 1)) > min_temp_grad)
THEN
546 dpp_dc = (model_heights(i) - zb(counter - 1)) * pb(counter - 1) * (t_pseudo(i) / t(counter - 1)) ** (-g_rb)
547 dc_dt1 = -(g_rb / (t(counter - 1))) * c_zz
548 dc_dbeta = -(g_rb / beta) * log(t(counter) / t(counter - 1)) * c_zz
549 dc_dt2 = (g_rb / t(counter)) * c_zz
550 dpp_dp1 = p_pseudo(i) / pb(counter - 1)
551 dppseudo_dt(i,counter - 1) = dpp_dt1 + dpp_dtp * dtp_dt1 + dpp_dbeta * dbeta_dt1 + dpp_dc * &
552 (dc_dt1 + dc_dbeta * dbeta_dt1)
553 dppseudo_dt(i,counter) = (dpp_dbeta + dpp_dtp * dtp_dbeta + dpp_dc * dc_dbeta) * &
554 dbeta_dt2 + dpp_dc * dc_dt2
556 dc_dp1 = -(1.0 / pb(counter - 1)) * c_zz
557 dc_dp2 = (1.0 / pb(counter)) * c_zz
559 dppseudo_dpb(i,counter - 1) = dpp_dp1 + dpp_dc * dc_dp1
560 dppseudo_dpb(i,counter) = dpp_dc * dc_dp2
562 dppseudo_dpb(i,counter - 1) = exp(log(pb(counter) / pb(counter - 1)) * ((model_heights(i) - zb(counter - 1)) / &
563 (zb(counter) - zb(counter - 1)))) * (1.0 - ((model_heights(i) - zb(counter - 1)) / (zb(counter) - zb(counter - 1))))
564 dppseudo_dpb(i,counter) = (pb(counter - 1) / pb(counter)) * ((model_heights(i) - zb(counter - 1)) / &
565 (zb(counter) - zb(counter - 1))) * exp(log(pb(counter) / pb(counter - 1)) * ((model_heights(i) - zb(counter - 1)) / &
566 (zb(counter) - zb(counter - 1))))
574 dppseudo_dp = matmul(dppseudo_dpb, dpb_dp_local) + matmul(dppseudo_dt, dtb_dp)
575 dtpseudo_dp = matmul(dtpseudo_dtb, dtb_dp)
582 dref_dp(:,:) = matmul(dref_dppseudo, dppseudo_dp) + matmul(dref_dtpseudo, dtpseudo_dp)
585 dref_dq(:,:) = matmul(dref_dqpseudo, dqpseudo_dqb) + matmul(matmul(dref_dtpseudo, dtpseudo_dtb), dt_dq) + &
586 matmul(matmul(dref_dppseudo, dppseudo_dt), dt_dq)
591 if (
PRESENT(refractivity)) refractivity = refrac
599 dref_dp(:,:) = matmul(dref_dpb, dpb_dp_local)
602 m1(:,:) = matmul(dref_dt, dt_dtv)
603 m2(:,:) = matmul(m1, dtv_dex)
604 dref_dp(:,:) = dref_dp(:,:) + matmul(m2, dex_dp)
607 m3(:,:) = matmul(m1, dtv_dextheta)
608 m4(:,:) = matmul(m3, dextheta_dpb)
609 dref_dp(:,:) = dref_dp(:,:) + matmul(m4, dpb_dp_local)
613 dref_dq(:,:) = dref_dq_model(:,:) + matmul(dref_dt, dt_dq)
617 if (
present(dpb_dp)) dpb_dp(:,:) = dpb_dp_local(:,:)
619 IF (
ALLOCATED (p_pseudo))
DEALLOCATE (p_pseudo)
620 IF (
ALLOCATED (q_pseudo))
DEALLOCATE (q_pseudo)
621 IF (
ALLOCATED (t_pseudo))
DEALLOCATE (t_pseudo)
622 IF (
ALLOCATED (model_heights))
DEALLOCATE (model_heights)
623 IF (
ALLOCATED (dref_dppseudo))
DEALLOCATE (dref_dppseudo)
624 IF (
ALLOCATED (dref_dtpseudo))
DEALLOCATE (dref_dtpseudo)
625 IF (
ALLOCATED (dref_dqpseudo))
DEALLOCATE (dref_dqpseudo)
626 IF (
ALLOCATED (dppseudo_dpb))
DEALLOCATE (dppseudo_dpb)
627 IF (
ALLOCATED (dtpseudo_dtb))
DEALLOCATE (dtpseudo_dtb)
628 IF (
ALLOCATED (dqpseudo_dqb))
DEALLOCATE (dqpseudo_dqb)
629 IF (
ALLOCATED (dppseudo_dt))
DEALLOCATE (dppseudo_dt)
630 IF (
ALLOCATED (dtb_dp))
DEALLOCATE (dtb_dp)
631 IF (
ALLOCATED (dppseudo_dp))
DEALLOCATE (dppseudo_dp)
632 IF (
ALLOCATED (dtpseudo_dp))
DEALLOCATE (dtpseudo_dp)
674 INTEGER,
INTENT(IN) :: nlevP
675 INTEGER,
INTENT(IN) :: nlevq
676 REAL(kind_real),
INTENT(IN) :: za(nlevp)
677 REAL(kind_real),
INTENT(IN) :: zb(nlevq)
678 REAL(kind_real),
INTENT(IN) :: P(nlevp)
679 REAL(kind_real),
INTENT(IN) :: q(nlevq)
680 LOGICAL,
INTENT(IN) :: vert_interp_ops
681 REAL(kind_real),
INTENT(OUT) :: dT_dTv(nlevq,nlevq)
682 REAL(kind_real),
INTENT(OUT) :: dT_dq(nlevq,nlevq)
683 REAL(kind_real),
INTENT(OUT) :: dref_dPb(nlevq,nlevq)
684 REAL(kind_real),
INTENT(OUT) :: dref_dT(nlevq,nlevq)
685 REAL(kind_real),
INTENT(OUT) :: dref_dq(nlevq,nlevq)
686 REAL(kind_real),
INTENT(OUT) :: refractivity(nlevq)
687 REAL(kind_real),
INTENT(OUT) :: T(nlevq)
688 REAL(kind_real),
INTENT(OUT) :: Pb(nlevq)
689 REAL(kind_real),
INTENT(OUT) :: dEx_dP(nlevP,nlevP)
690 REAL(kind_real),
INTENT(OUT) :: dExtheta_dPb(nlevq,nlevq)
691 REAL(kind_real),
INTENT(OUT) :: dTv_dExtheta(nlevq,nlevq)
692 REAL(kind_real),
INTENT(OUT) :: dPb_dP_local(nlevq,nlevP)
693 REAL(kind_real),
INTENT(OUT) :: dTv_dEx(nlevq,nlevP)
697 REAL(kind_real) :: Exner(nlevP)
698 REAL(kind_real) :: T_virtual(nlevq)
699 REAL(kind_real) :: Extheta
700 REAL(kind_real) :: pwt1
701 REAL(kind_real) :: pwt2
702 REAL(kind_real) :: Ndry
703 REAL(kind_real) :: Nwet
709 dpb_dp_local(:,:) = 0.0
710 dextheta_dpb(:,:) = 0.0
711 dtv_dextheta(:,:) = 0.0
721 exner(:) = (p(:) / pref) ** rd_over_cp
723 dex_dp(i,i) = rd_over_cp / pref * (p(i) / pref) ** (rd_over_cp - 1.0)
732 pwt1 = (za(i + 1) - zb(i)) / (za(i + 1) - za(i))
737 IF (vert_interp_ops)
THEN
738 pb(i) = exp(pwt1 * log(p(i)) + pwt2 * log(p(i + 1)))
740 dpb_dp_local(i,i) = pb(i) * pwt1 / p(i)
741 dpb_dp_local(i,i + 1) = pb(i) * pwt2 / p(i + 1)
744 pb(i) = pref * (pwt1 * (p(i) / pref) ** rd_over_cp + pwt2 * (p(i + 1) / pref) ** rd_over_cp) ** (1.0 / rd_over_cp)
746 dpb_dp_local(i,i) = pwt1 * (pwt1 * (p(i) / pref) ** rd_over_cp + pwt2 * &
747 (p(i + 1) / pref) ** rd_over_cp) ** (1.0 / rd_over_cp - 1.0) * (p(i) / pref) ** (rd_over_cp - 1.0)
748 dpb_dp_local(i,i + 1) = pwt2 * (pwt1 * (p(i) / pref) ** rd_over_cp + pwt2 * &
749 (p(i + 1) / pref) ** rd_over_cp) ** (1.0 / rd_over_cp - 1.0) * (p(i + 1) / pref) ** (rd_over_cp-1.0)
754 extheta = (pb(i) / pref) ** rd_over_cp
756 dextheta_dpb(i,i) = rd_over_cp * (pb(i) ** (rd_over_cp - 1.0)) / (pref ** rd_over_cp)
760 t_virtual(i) = grav * (za(i + 1) - za(i)) * extheta / (cp * (exner(i) - exner(i + 1)))
762 dtv_dextheta(i,i) = t_virtual(i) / extheta
764 dtv_dex(i,i) = -t_virtual(i) / (exner(i) - exner(i + 1))
766 dtv_dex(i,i + 1) = t_virtual(i) / (exner(i) - exner(i + 1))
768 t(i) = t_virtual(i) / (1.0 + c_virtual * q(i))
770 dt_dtv(i,i) = 1.0 / (1.0 + c_virtual * q(i))
772 dt_dq(i,i) = -c_virtual * t(i) / (1.0 + c_virtual * q(i))
776 nwet = n_beta * pb(i) * q(i) / (t(i) ** 2 * (mw_ratio + (1.0 - mw_ratio) * q(i)))
778 dref_dq(i,i) = n_beta * pb(i) * mw_ratio / (t(i) * (mw_ratio + (1.0 - mw_ratio) * q(i))) ** 2
780 ndry = n_alpha * pb(i) / t(i)
782 refractivity(i) = ndry + nwet
784 dref_dpb(i,i) = (ndry + nwet) / pb(i)
786 dref_dt(i,i) = -(ndry + 2.0 * nwet) / t(i)
real(kind_real), parameter, public rd
Module for containing a general refractivity forward operator and its K-matrix.
subroutine ufo_refractivity_partial_derivatives(nlevP, nlevq, za, zb, P, q, vert_interp_ops, dT_dTv, dT_dq, dref_dPb, dref_dT, dref_dq, refractivity, T, Pb, dEx_dP, dExtheta_dPb, dTv_dExtheta, dPb_dP_local, dTv_dEx)
Calculate some partial derivatives of refractivity on model levels.
subroutine, public ufo_calculate_refractivity(nlevP, nlevq, za, zb, P, q, vert_interp_ops, pseudo_ops, min_temp_grad, refracerr, nRefLevels, refractivity, model_heights, temperature, interp_pressure)
Calculation of the refractivity from the pressure and specific humidity.
subroutine, public ufo_refractivity_kmat(nlevP, nlevq, nRefLevels, za, zb, P, q, pseudo_ops, vert_interp_ops, min_temp_grad, dref_dP, dref_dq, dPb_dP, refractivity)
Calculate general refractivity K matrix.