10 use,
intrinsic :: iso_c_binding
11 use kinds,
only: kind_real
12 use missing_values_mod
24 integer,
intent(in ) :: nlev
25 real(kind_real),
intent(in ) :: obl
26 real(kind_real),
intent(in ) :: vec(nlev)
27 integer,
intent(out) :: wi
28 real(kind_real),
intent(out) :: wf
32 if (vec(1) < vec(nlev))
then
34 if (obl < vec(1))
then
37 elseif (obl > vec(nlev))
then
42 if (obl >= vec(k) .and. obl <= vec(k+1))
then
46 wf = (vec(wi+1) - obl)/(vec(wi+1) - vec(wi))
51 if (obl > vec(1))
then
54 elseif (obl < vec(nlev))
then
59 if (obl >= vec(k+1) .and. obl <= vec(k))
then
63 wf = (vec(wi+1) - obl)/(vec(wi+1) - vec(wi))
75 integer,
intent(in ) :: nlev
76 real(kind_real),
intent(in ) :: fvec(nlev)
77 integer,
intent(in ) :: wi
78 real(kind_real),
intent(in ) :: wf
79 real(kind_real),
intent(out) :: f
81 if (fvec(wi) == missing_value(f) .or. fvec(wi+1) == missing_value(f))
then
84 f = fvec(wi)*wf + fvec(wi+1)*(1.0-wf)
94 integer,
intent(in) :: nlev
95 real(kind_real),
intent(in) :: fvec_tl(nlev)
96 integer,
intent(in) :: wi
97 real(kind_real),
intent(in) :: wf
98 real(kind_real),
intent(out) :: f_tl
100 if (fvec_tl(wi) == missing_value(f_tl) .or. fvec_tl(wi+1) == missing_value(f_tl))
then
101 f_tl = missing_value(f_tl)
103 f_tl = fvec_tl(wi)*wf + fvec_tl(wi+1)*(1.0_kind_real-wf)
113 integer,
intent(in) :: nlev
114 real(kind_real),
intent(inout) :: fvec_ad(nlev)
115 integer,
intent(in) :: wi
116 real(kind_real),
intent(in) :: wf
117 real(kind_real),
intent(in) :: f_ad
118 real(kind_real) :: missing
120 missing = missing_value(missing)
122 if (fvec_ad(wi) == missing .or. f_ad == missing)
then
123 fvec_ad(wi ) = 0.0_kind_real
125 fvec_ad(wi ) = fvec_ad(wi ) + f_ad*wf
127 if (fvec_ad(wi+1) == missing .or. f_ad == missing)
then
128 fvec_ad(wi+1) = 0.0_kind_real
130 fvec_ad(wi+1) = fvec_ad(wi+1) + f_ad*(1.0_kind_real-wf)
Fortran module to perform linear interpolation.
subroutine vert_interp_apply_ad(nlev, fvec_ad, f_ad, wi, wf)
subroutine vert_interp_weights(nlev, obl, vec, wi, wf)
subroutine vert_interp_apply(nlev, fvec, f, wi, wf)
subroutine vert_interp_apply_tl(nlev, fvec_tl, f_tl, wi, wf)