da_tv_profile.inc

References to this file elsewhere.
1 subroutine da_tv_profile(xp, xb, i, j, dx, dxm, dy, dym, pre_ma, tv_ma)
2 
3    !--------------------------------------------------------------------------
4    ! Purpose: Calculates virtual temperature (tv_ma) on each level
5    ! (pre_ma, pressure at the level) at the observed location (i,j). 
6    ! dx, dxm, dy, dym are horizontal interpolation weighting.
7    !--------------------------------------------------------------------------
8 
9    implicit none
10 
11    type (xb_type), intent(in)     :: xb       ! first guess state.
12    type (xpose_type), intent(in)  :: xp       ! Dimensions and xpose buffers.
13    integer, intent(in)            :: i, j     ! OBS location
14    real, intent(in)               :: dx, dxm  ! interpolation weights.
15    real, intent(in)               :: dy, dym  ! interpolation weights.
16    real, dimension(xp%kts-1:xp%kte+1), intent(out)   :: pre_ma,tv_ma
17                           
18    integer                        :: ii,jj,ks,ke    ! index dimension.
19    real, dimension(2,2,xp%kts:xp%kte)   :: tv_m     ! Virtual temperatures
20 
21    ks = xp%kts; ke = xp%kte
22 
23    ! Virtual temperature
24 
25    do ii=i,i+1
26       do jj=j,j+1
27          tv_m(ii-i+1,jj-j+1,ks:ke) = xb%t(ii,jj,ks:ke) * &
28             (1. + 0.61*xb%q(ii,jj,ks:ke))
29       end do
30    end do
31 
32    ! Horizontal interpolation to the obs. pt.
33 
34    pre_ma(ks:ke) = dym* ( dxm * xb%p(i,j,ks:ke) + dx * xb%p(i+1,j,ks:ke) ) + &
35                    dy * ( dxm * xb%p(i,j+1,ks:ke) + dx * xb%p(i+1,j+1,ks:ke) )
36 
37    tv_ma (ks:ke) = dym* ( dxm * tv_m (1,1,ks:ke) + dx * tv_m (2,1,ks:ke) ) + &
38                    dy * ( dxm * tv_m (1,2,ks:ke) + dx * tv_m (2,2,ks:ke) )
39 
40 end subroutine da_tv_profile
41 
42