1 subroutine da_get_innov_vector_pseudo(grid, ob, iv)
3 !-----------------------------------------------------------------------
5 !-----------------------------------------------------------------------
9 type(domain), intent(in) :: grid ! Background structure
10 type(y_type), intent(inout) :: ob ! Observation structure.
11 type(iv_type), intent(inout) :: iv ! O-B structure.
13 integer :: n ! Loop counter.
15 real, allocatable :: model_u(:,:)
16 real, allocatable :: model_v(:,:)
17 real, allocatable :: model_q(:,:)
18 real, allocatable :: model_p(:,:)
19 real, allocatable :: model_t(:,:)
21 if (trace_use_dull) call da_trace_entry("da_get_innov_vector_pseudo")
24 allocate (model_u(1,iv%info(pseudo)%n1:iv%info(pseudo)%n2))
25 allocate (model_v(1,iv%info(pseudo)%n1:iv%info(pseudo)%n2))
26 allocate (model_q(1,iv%info(pseudo)%n1:iv%info(pseudo)%n2))
27 allocate (model_p(1,iv%info(pseudo)%n1:iv%info(pseudo)%n2))
28 allocate (model_t(1,iv%info(pseudo)%n1:iv%info(pseudo)%n2))
30 call da_convert_zk (iv%info(pseudo))
33 call da_interp_lin_3d (grid%xb%u, iv%info(pseudo), model_u,'u')
34 call da_interp_lin_3d (grid%xb%v, iv%info(pseudo), model_v,'v')
36 call da_interp_lin_3d (grid%xb%u, iv%info(pseudo), model_u)
37 call da_interp_lin_3d (grid%xb%v, iv%info(pseudo), model_v)
39 call da_interp_lin_3d (grid%xb%t, iv%info(pseudo), model_t)
40 call da_interp_lin_3d (grid%xb%p, iv%info(pseudo), model_p)
41 call da_interp_lin_3d (grid%xb%q, iv%info(pseudo), model_q)
43 do n=iv%info(pseudo)%n1,iv%info(pseudo)%n2
44 !---------------------------------------------------------------
45 ! [3.0] Calculate observation O = B +(O-B):
46 !---------------------------------------------------------------
48 select case(pseudo_var(1:1))
50 if (ob % pseudo(n) % u > missing_r) then
51 iv % pseudo(n) % u % inv = ob%pseudo(n)%u - model_u(1,n)
53 ob % pseudo(n) % u = model_u(1,n) + iv % pseudo(n) % u % inv
56 if (ob % pseudo(n) % v > missing_r) then
57 iv % pseudo(n) % v % inv = ob%pseudo(n)%v - model_v(1,n)
59 ob % pseudo(n) % v = model_v(1,n) + iv % pseudo(n) % v % inv
62 if (ob % pseudo(n) % t > missing_r) then
63 iv % pseudo(n) % t % inv = ob%pseudo(n)%t - model_t(1,n)
65 ob % pseudo(n) % t = model_t(1,n) + iv % pseudo(n) % t % inv
68 if (ob % pseudo(n) % p > missing_r) then
69 iv % pseudo(n) % p % inv = ob%pseudo(n)%p - model_p(1,n)
71 ob % pseudo(n) % p = model_p(1,n) + iv % pseudo(n) % p % inv
74 if (ob % pseudo(n) % q > missing_r) then
75 iv % pseudo(n) % q % inv = ob%pseudo(n)%q - model_q(1,n)
77 ob % pseudo(n) % q = model_q(1,n) + iv % pseudo(n) % q % inv
88 if (trace_use_dull) call da_trace_exit("da_get_innov_vector_pseudo")
90 end subroutine da_get_innov_vector_pseudo