da_find_layer.inc
References to this file elsewhere.
1 subroutine da_find_layer(layer,tv,pre,pre_ma,tv_ma,ks,ke)
2
3 !-----------------------------------------------------------------------
4 ! Purpose: find the vertical location in the Tv profile given
5 ! a specific pressure and vertically interpolate Tv to that height.
6 ! pre_ma,tv_ma give vertical profile of virtual temperature
7 ! pre is a given pressure, alpha is the percentage of pre in the layer.
8 ! layer,tv are calculated vertical layer and interpolated virtual temp.
9 !-----------------------------------------------------------------------
10
11 implicit none
12
13 integer, intent(in) :: ks, ke
14 integer, intent(inout) :: layer
15 real, intent(inout) :: pre_ma(ks-1:ke+1)
16 real, intent(in) :: tv_ma(ks-1:ke+1)
17 real, intent(in) :: pre
18 real, intent(inout) :: tv
19
20 integer :: k
21 real :: alpha
22
23 if (pre >= pre_ma(ks)) then
24
25 ! Below model bottom
26 layer = ks
27 alpha = log(pre_ma(ks)/pre)/log(pre_ma(ks)/pre_ma(ks+1))
28 tv = tv_ma(ks) * (1.-alpha) + tv_ma(ks+1) * alpha
29 pre_ma(ks-1)=pre
30 else if (pre <= pre_ma(ke)) then
31
32 ! Above model top
33 layer = ke+1
34 alpha = log(pre_ma(ke-1)/pre)/log(pre_ma(ke-1)/pre_ma(ke))
35 tv = tv_ma(ke-1) * (1.-alpha) + tv_ma(ke) * alpha
36 pre_ma(ke+1) = pre
37 else
38
39 ! Between model layers
40 do k=ks,ke-1
41 if (pre>=pre_ma(k+1) .and. pre<pre_ma(k)) then
42 layer = k+1
43 alpha = log(pre_ma(k)/pre)/log(pre_ma(k)/pre_ma(k+1))
44 tv = tv_ma(k) * (1.-alpha) + tv_ma(k+1) * alpha
45 exit
46 end if
47 end do
48 end if
49
50 end subroutine da_find_layer
51
52