da_thickness_adj.inc
References to this file elsewhere.
1 subroutine da_thickness_adj(pre_ma,tv_ma,ks,ke,tv1,tv2,layer1,layer2,pre1,pre2, &
2 ADJ_pre_ma,ADJ_tv_ma,ADJ_tv1,ADJ_tv2,ADJ_thk)
3
4 !-----------------------------------------------------------------------
5 ! Purpose: adjoint routine for thickness
6 !-----------------------------------------------------------------------
7
8 implicit none
9
10 integer, intent(in) :: layer1,layer2
11 integer, intent(in) :: ks,ke
12 real, dimension(ks-1:ke+1), intent(in) :: pre_ma,tv_ma
13 real, dimension(ks-1:ke+1), intent(inout) :: ADJ_pre_ma,ADJ_tv_ma
14 real, intent(in) :: tv1,tv2
15 real, intent(inout) :: ADJ_tv1,ADJ_tv2
16 real, intent(in) :: pre1,pre2
17 real, intent(inout) :: ADJ_thk
18
19 integer :: k
20 real, dimension(ks-1:ke+1) :: p_tmp
21 real, dimension(ks-1:ke+1) :: ADJ_p_tmp
22
23 ! p_tmp and ADJ_p_tmp are temporary (local) variables
24
25 ADJ_p_tmp(:)=0.
26
27 p_tmp(layer1) = pre1
28 p_tmp(layer2-1) = pre2
29 do k=layer2,layer1-1
30 p_tmp(k) = pre_ma(k)
31 end do
32
33 do k=layer2,layer1-1
34 ADJ_p_tmp(k+1) = ADJ_p_tmp(k+1) - 0.5*gas_constant/gravity * &
35 ADJ_thk*tv_ma(k)/p_tmp(k+1)
36 ADJ_p_tmp(k-1) = ADJ_p_tmp(k-1) + 0.5*gas_constant/gravity * &
37 ADJ_thk*tv_ma(k)/p_tmp(k-1)
38 ADJ_tv_ma(k) = ADJ_tv_ma(k) + 0.5*gas_constant/gravity * &
39 ADJ_thk*log(p_tmp(k-1)/p_tmp(k+1))
40 end do
41
42 do k=layer2,layer1-1
43 ADJ_pre_ma(k) = ADJ_pre_ma(k) + ADJ_p_tmp(k)
44 end do
45
46 ADJ_thk = 0.5 * gas_constant/gravity * ADJ_thk
47 ADJ_pre_ma(layer2) = ADJ_pre_ma(layer2) - ADJ_thk*tv2/pre_ma(layer2)
48 ADJ_tv2 = ADJ_tv2 + ADJ_thk*log(pre2/pre_ma(layer2))
49 ADJ_pre_ma(layer1-1) = ADJ_pre_ma(layer1-1) + &
50 ADJ_thk*tv1/pre_ma(layer1-1)
51 ADJ_tv1 = ADJ_tv1 + ADJ_thk*log(pre_ma(layer1-1)/pre1)
52
53 end subroutine da_thickness_adj
54
55