Merge remote-tracking branch 'origin/release-v4.6.1'
[WRF.git] / var / da / da_metar / da_jo_and_grady_metar.inc
blobe8e3663c2797185136a1f5494885ee0651026c84
1 subroutine da_jo_and_grady_metar(iv, re, jo, jo_grad_y)
3    !-----------------------------------------------------------------------
4    ! Purpose: TBD
5    !-----------------------------------------------------------------------
7    implicit none
9    type (iv_type), intent(in)   :: iv          ! Innovation vector.
10    type (y_type), intent(in)    :: re          ! Residual vector.
11    type (y_type), intent(inout) :: jo_grad_y   ! Grad_y(Jo)
12    type(jo_type), intent(inout) :: jo          ! Obs cost function.
14    integer                      :: n
16    if (trace_use_dull) call da_trace_entry("da_jo_and_grady_metar")
19    jo % metar_u = 0.0
20    jo % metar_v = 0.0
21    jo % metar_t = 0.0
22    jo % metar_p = 0.0
23    jo % metar_q = 0.0
25    if (iv%info(metar)%nlocal > 0) then
26       do n=1, iv%info(metar)%nlocal
27          jo_grad_y%metar(n)%u = -re%metar(n)%u / &
28                               (iv%metar(n)%u%error * iv%metar(n)%u%error)
29          jo_grad_y%metar(n)%v = -re%metar(n)%v / &
30                               (iv%metar(n)%v%error * iv%metar(n)%v%error)
31          jo_grad_y%metar(n)%t = -re%metar(n)%t / &
32                               (iv%metar(n)%t%error * iv%metar(n)%t%error)
33          jo_grad_y%metar(n)%p = -re%metar(n)%p / &
34                               (iv%metar(n)%p%error * iv%metar(n)%p%error)
35          jo_grad_y%metar(n)%q = -re%metar(n)%q / &
36                               (iv%metar(n)%q%error * iv%metar(n)%q%error)
38          if (iv%info(metar)%proc_domain(1,n)) then
39             jo % metar_u = jo % metar_u - re%metar(n)%u * jo_grad_y%metar(n)%u
40             jo % metar_v = jo % metar_v - re%metar(n)%v * jo_grad_y%metar(n)%v
41             jo % metar_t = jo % metar_t - re%metar(n)%t * jo_grad_y%metar(n)%t
42             jo % metar_p = jo % metar_p - re%metar(n)%p * jo_grad_y%metar(n)%p
43             jo % metar_q = jo % metar_q - re%metar(n)%q * jo_grad_y%metar(n)%q
44          end if
45       end do
47       jo % metar_u = 0.5 * jo % metar_u
48       jo % metar_v = 0.5 * jo % metar_v
49       jo % metar_t = 0.5 * jo % metar_t
50       jo % metar_p = 0.5 * jo % metar_p
51       jo % metar_q = 0.5 * jo % metar_q
52    end if
54    if (trace_use_dull) call da_trace_exit("da_jo_and_grady_metar")
56 end subroutine da_jo_and_grady_metar