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