12 use fckit_log_module,
only: fckit_log
13 use kinds,
only: kind_real
16 use missing_values_mod
49 INTEGER,
INTENT(IN) :: nlevq
50 INTEGER,
INTENT(IN) :: nlevp
51 REAL(kind_real),
INTENT(IN) :: za(:)
53 REAL(kind_real),
INTENT(IN) :: zb(:)
54 REAL(kind_real),
INTENT(IN) :: x(:)
55 REAL(kind_real),
INTENT(INOUT) :: pn(:)
56 LOGICAL,
INTENT(OUT) :: refracerr
57 REAL(kind_real),
INTENT(INOUT) :: refrac(:)
61 CHARACTER(len=*),
PARAMETER :: routinename =
"ufo_refractivity"
64 REAL,
ALLOCATABLE :: exnern(:)
65 REAL,
ALLOCATABLE :: exner(:)
66 REAL(kind_real) :: t(nlevq)
77 CHARACTER(len=max_string) :: message
79 REAL(kind_real) :: p(nlevp)
80 REAL(kind_real) :: q(nlevq)
81 REAL(kind_real) :: pwt1
82 REAL(kind_real) :: pwt2
88 nstate = nlevp + nlevq
90 q(:) = x(nlevp + 1:nstate)
92 ALLOCATE (exnern(nlevq))
93 ALLOCATE (exner(nlevp))
95 refrac(:) = missing_value(refrac(1))
96 t(:) = missing_value(t(1))
103 IF (p(i) == missing_value(p(i)))
THEN
105 WRITE(message, *) routinename,
"Missing value P", i
106 CALL fckit_log % warning(message)
113 IF (p(i) - p(i + 1) < 0.0)
THEN
116 WRITE(message,*)
"Non monotonic", i, p(i), p(i+1)
117 CALL fckit_log % warning(message)
122 IF (any(p(:) <= 0.0))
THEN
127 IF (nlevq >= nlevp)
THEN
135 CALL fckit_log%warning (routinename //
": Pressure non-monotonic")
136 ELSE IF (unphys)
THEN
137 CALL fckit_log%warning (routinename //
": Pressure <= zero")
139 CALL fckit_log%warning (routinename //
": Pressure missing")
142 CALL fckit_log%warning (routinename //
": Too many wet levels")
149 exner(:) = (p(:) / pref) ** rd_over_cp
154 DO level = 1, nlevp - 1
156 pwt1 = (za(level + 1) - zb(level)) / (za(level + 1) - za(level))
159 pn(level) = exp(pwt1 * log(p(level)) + pwt2 * log(p(level + 1)))
166 exnern(i) = (pn(i) / pref) ** rd_over_cp
170 tv = grav * (za(i + 1) - za(i)) * exnern(i) / &
171 (cp * (exner(i) - exner(i + 1)))
183 t(i) = tv / (1.0 + c_virtual * q(i))
187 nwet = n_beta * pn(i) * q(i) / (t(i) ** 2 * (mw_ratio + (1.0 - mw_ratio) * q(i)))
200 ndry = n_alpha * pn(i) / t(i)
204 refrac(i) = ndry + nwet