da_transform_vptox_adj.inc

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