da_transform_vptox.inc

References to this file elsewhere.
1 subroutine da_transform_vptox(grid, vp, be, ep)
2 
3    !-----------------------------------------------------------------------
4    ! Purpose: Physical transform of analysis increment variables.
5    !-----------------------------------------------------------------------
6 
7    implicit none
8 
9    type (domain), intent(inout)         :: grid
10    
11    type (vp_type), intent(inout)        :: vp  ! CV on grid structure.
12    type (be_type), intent(in), optional :: be  ! Background errors.
13    type (ep_type), intent(in), optional :: ep  ! Ensemble perturbations.
14 
15    integer :: k, j, k1            ! Loop counters.
16 
17    if (trace_use) call da_trace_entry("da_transform_vptox") 
18 
19    !---------------------------------------------------------------------------
20    !  [1] Add flow-dependent increments in control variable space (vp):
21    !---------------------------------------------------------------------------
22 
23    if (be % ne > 0 .and. alphacv_method == 1) then
24       call da_add_flow_dependence_vp(be % ne, ep, vp, its,ite, jts,jte, kts,kte)
25    end if
26 
27    !--------------------------------------------------------------------------
28    ! [2] Impose statistical balance constraints:
29    !--------------------------------------------------------------------------
30 
31    ! Chi:
32    do k = kts, kte
33       do j = jts, jte
34          vp%v2(its:ite,j,k) = vp%v2(its:ite,j,k) + be%reg_chi(j,k)* vp%v1(its:ite,j,k)
35       end do
36    end do
37   
38    ! Temperature:
39    grid%xa%t(its:ite,jts:jte,kts:kte) = vp%v3(its:ite,jts:jte,kts:kte)
40    do k1 = kts, kte
41       do k = kts, kte
42          do j = jts, jte
43             grid%xa%t(its:ite,j,k) = grid%xa%t(its:ite,j,k) + be%reg_t(j,k,k1)*vp%v1(its:ite,j,k1)
44          end do
45       end do
46    end do
47 
48    ! Surface Pressure
49    grid%xa%psfc(its:ite,jts:jte) = vp%v5(its:ite,jts:jte,1) 
50    do k = kts,kte
51       do j = jts,jte
52          grid%xa%psfc(its:ite,j) = grid%xa%psfc(its:ite,j) + be%reg_ps(j,k)*vp%v1(its:ite,j,k)
53       end do
54    end do
55 
56    !--------------------------------------------------------------------------
57    ! [3] Transform to model variable space:
58    !--------------------------------------------------------------------------
59 
60 #ifdef DM_PARALLEL
61 #include "HALO_PSICHI_UV.inc"
62 #endif
63 
64    ! Psi and chi to u and v:
65 
66    call da_psichi_to_uv(vp % v1, vp % v2, grid%xb % coefx, &
67       grid%xb % coefy , grid%xa % u, grid%xa % v)
68 
69    if (use_radarobs .and. use_radar_rf) then
70       ! Pseudo RH --> Total water mixing ratio:
71       grid%xa % qt(its:ite,jts:jte,kts:kte) = vp%v4(its:ite,jts:jte,kts:kte) * &
72          grid%xb%qs(its:ite,jts:jte,kts:kte)
73    else
74       ! Pseudo RH --> Water vapor mixing ratio:
75       grid%xa % q(its:ite,jts:jte,kts:kte) = vp%v4(its:ite,jts:jte,kts:kte) * &
76          grid%xb%qs(its:ite,jts:jte,kts:kte)
77    end if
78 
79    !---------------------------------------------------------------------------
80    !  [4] Add flow-dependent increments in model space (grid%xa):
81    !---------------------------------------------------------------------------
82 
83    if (be % ne > 0 .and. alphacv_method == alphacv_method_xa) then
84       call da_add_flow_dependence_xa(grid, be % ne, ep, vp)
85    end if
86 
87    if (trace_use) call da_trace_exit("da_transform_vptox") 
88  
89 end subroutine da_transform_vptox
90