1 subroutine da_vertical_transform(grid, string, be, vertical_wgt, vv, vp)
3 !---------------------------------------------------------------------
5 !---------------------------------------------------------------------
9 type (domain), intent(in) :: grid
10 character(len=*), intent(in) :: string ! Character operation
11 type (be_type), intent(in) :: be ! Background error structure.
12 real, intent(in) :: vertical_wgt(ims:ime,jms:jme,kms:kme) ! Weighting.
13 type (vp_type), intent(inout) :: vv ! CV in gridpt/EOF space.
14 type (vp_type), intent(inout) :: vp ! CV in gridpt/level space.
16 integer :: j, m, n ! Loop counters.
17 real :: alpha_stddev_inv ! 1/ sigma_alpha
18 real :: size_inv ! 1 / size.
19 real :: alpha_me, alpha_ms, alpha_sd ! Alpha statistics.
21 if (trace_use) call da_trace_entry("da_vertical_transform")
27 !-------------------------------------------------------------------
28 ! [1.0] Perform vp(i,j,k) = E L^{1/2} vv(i,j,m) transform:
29 !-------------------------------------------------------------------
31 if (be % v1 % mz > 0) then
32 call da_transform_vvtovp (grid, be % v1 % evec, be % v1 % val, vertical_wgt, &
33 vv % v1, vp % v1, be % v1 % mz, kte)
35 vp % v1(its:ite,jts:jte,kts:kte) = 0.0
38 if (be % v2 % mz > 0) then
39 call da_transform_vvtovp (grid, be % v2 % evec, be % v2 % val, vertical_wgt, &
40 vv % v2, vp % v2, be % v2 % mz, kte)
42 vp % v2(its:ite,jts:jte,kts:kte) = 0.0
45 if (be % v3 % mz > 0) then
46 call da_transform_vvtovp (grid, be % v3 % evec, be % v3 % val, vertical_wgt, &
47 vv % v3, vp % v3, be % v3 % mz, kte)
49 vp % v3(its:ite,jts:jte,kts:kte) = 0.0
52 if (be % v4 % mz > 0) then
53 call da_transform_vvtovp (grid, be % v4 % evec, be % v4 % val, vertical_wgt, &
54 vv % v4, vp % v4, be % v4 % mz, kte)
56 vp % v4(its:ite,jts:jte,kts:kte) = 0.0
59 if (be % v5 % mz > 0) then
61 vp % v5(its:ite,jts:jte,1) = vv % v5(its:ite,jts:jte,1)
63 call da_transform_vvtovp (grid, be % v5 % evec, be % v5 % val, vertical_wgt, &
64 vv % v5, vp % v5, be % v5 % mz, kts)
67 vp % v5(its:ite,jts:jte,kts:kts) = 0.0
70 if ( be % ne > 0 .and. be % alpha % mz > 0 ) then
72 call da_transform_vvtovp (grid, be % alpha % evec, be % alpha % val, vertical_wgt, &
73 vv % alpha(:,:,:,n), vp % alpha(:,:,:,n), be % alpha % mz, kte)
76 ! Calculate alpha standard deviation diagnostic:
77 ! size_inv = 1.0 / ( (ite-its+1) * ( jte-jts+1) * be % ne * be % alpha % mz )
78 ! alpha_me = sum(vp % alpha(its:ite,jts:jte,:)) * size_inv
79 ! alpha_ms = sum(vp % alpha(its:ite,jts:jte,:) * vp % alpha(its:ite,jts:jte,:)) * &
81 ! alpha_sd = sqrt( alpha_ms - alpha_me * alpha_me )
82 ! write(6,'(a,f15.5)')' Alpha std. dev = ', alpha_sd
87 !-------------------------------------------------------------------
88 ! [2.0] Perform vv(i,j,m) = L^{-1/2} E^T vp(i,j,k) transform:
89 !-------------------------------------------------------------------
91 if (be % v1 % mz > 0) then
92 call da_transform_vptovv (be % v1 % evec, be % v1 % val, vertical_wgt, &
93 vp % v1, vv % v1, be % v1 % mz, kds,kde, ims,ime, jms,jme, kms,kme, &
94 its,ite, jts,jte, kts,kte)
97 if (be % v2 % mz > 0) then
98 call da_transform_vptovv (be % v2 % evec, be % v2 % val, vertical_wgt, &
99 vp % v2, vv % v2, be % v2 % mz, kds,kde, ims,ime, jms,jme, kms,kme, &
100 its,ite, jts,jte, kts,kte)
103 if (be % v3 % mz > 0) then
104 call da_transform_vptovv (be % v3 % evec, be % v3 % val, vertical_wgt, &
105 vp % v3, vv % v3, be % v3 % mz, kds,kde, ims,ime, jms,jme, kms,kme, &
106 its,ite, jts,jte, kts,kte)
109 if (be % v4 % mz > 0) then
110 call da_transform_vptovv (be % v4 % evec, be % v4 % val, vertical_wgt, &
111 vp % v4, vv % v4, be % v4 % mz, kds,kde, ims,ime, jms,jme, kms,kme, &
112 its,ite, jts,jte, kts,kte)
115 if (be % v5 % mz > 0) then
117 vv % v5(its:ite,jts:jte,1) = vp % v5(its:ite,jts:jte,1)
119 call da_transform_vptovv (be % v5 % evec, be % v5 % val, vertical_wgt, &
120 vp % v5, vv % v5, be % v5 % mz, kds,kde, ims,ime, jms,jme, kms,kme, &
121 its,ite, jts,jte, kts,kte)
125 if ( be % ne > 0 .and. be % alpha % mz > 0 ) then
127 call da_transform_vptovv (be % alpha % evec, be % alpha % val, vertical_wgt, &
128 vp % alpha(:,:,:,n), vv % alpha(:,:,:,n), be % alpha % mz, kds,kde, &
129 ims,ime, jms,jme, kms,kme, its,ite, jts,jte, kts,kte)
135 !-------------------------------------------------------------------
136 ! [3.0] Perform vv_adj = U_{v}^{T} vp_adj transform:
137 !-------------------------------------------------------------------
139 if (be % v1 % mz > 0) then
140 call da_transform_vvtovp_adj (grid, be % v1 % evec, be % v1 % val, vertical_wgt, &
141 vp % v1, vv % v1, be % v1 % mz, kte)
144 if (be % v2 % mz > 0) then
145 call da_transform_vvtovp_adj (grid, be % v2 % evec, be % v2 % val, vertical_wgt, &
146 vp % v2, vv % v2, be % v2 % mz, kte)
149 if (be % v3 % mz > 0) then
150 call da_transform_vvtovp_adj (grid, be % v3 % evec, be % v3 % val, vertical_wgt, &
151 vp % v3, vv % v3, be % v3 % mz, kte)
154 if (be % v4 % mz > 0) then
155 call da_transform_vvtovp_adj (grid, be % v4 % evec, be % v4 % val, vertical_wgt, &
156 vp % v4, vv % v4, be % v4 % mz, kte)
159 if (be % v5 % mz > 0) then
161 vv % v5(its:ite,jts:jte,1) = vp % v5(its:ite,jts:jte,1)
163 call da_transform_vvtovp_adj (grid, be % v5 % evec, be % v5 % val, vertical_wgt, &
164 vp % v5, vv % v5, be % v5 % mz, kts)
168 if ( be % ne > 0 .and. be % alpha % mz > 0 ) then
170 call da_transform_vvtovp_adj (grid, be % alpha % evec, be % alpha % val, vertical_wgt, &
171 vp % alpha(:,:,:,n), vv % alpha(:,:,:,n), be % alpha % mz, kte)
177 call da_error(__FILE__,__LINE__, &
178 (/"Invalid da_vertical_transform option "//string/))
182 if (trace_use) call da_trace_exit("da_vertical_transform")
184 end subroutine da_vertical_transform