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