subroutine da_thickness_adj(pre_ma,tv_ma,ks,ke,tv1,tv2,layer1,layer2,pre1,pre2, & 1,2
ADJ_pre_ma,ADJ_tv_ma,ADJ_tv1,ADJ_tv2,ADJ_thk)
!-----------------------------------------------------------------------
! Purpose: adjoint routine for thickness
!-----------------------------------------------------------------------
implicit none
integer, intent(in) :: layer1,layer2
integer, intent(in) :: ks,ke
real, intent(in) :: pre_ma(ks-1:ke+1)
real, intent(in) :: tv_ma(ks-1:ke+1)
real, intent(inout) :: ADJ_pre_ma(ks-1:ke+1)
real, intent(inout) :: ADJ_tv_ma(ks-1:ke+1)
real, intent(in) :: tv1,tv2
real, intent(inout) :: ADJ_tv1,ADJ_tv2
real, intent(in) :: pre1,pre2
real, intent(inout) :: ADJ_thk
integer :: k
real :: p_tmp(ks-1:ke+1)
real :: ADJ_p_tmp(ks-1:ke+1)
if (trace_use_dull) call da_trace_entry
("da_thickness_adj")
! p_tmp and ADJ_p_tmp are temporary (local) variables
ADJ_p_tmp(:)=0.0
p_tmp(layer1) = pre1
p_tmp(layer2-1) = pre2
do k=layer2,layer1-1
p_tmp(k) = pre_ma(k)
end do
do k=layer2,layer1-1
ADJ_p_tmp(k+1) = ADJ_p_tmp(k+1) - 0.5*gas_constant/gravity * &
ADJ_thk*tv_ma(k)/p_tmp(k+1)
ADJ_p_tmp(k-1) = ADJ_p_tmp(k-1) + 0.5*gas_constant/gravity * &
ADJ_thk*tv_ma(k)/p_tmp(k-1)
ADJ_tv_ma(k) = ADJ_tv_ma(k) + 0.5*gas_constant/gravity * &
ADJ_thk*log(p_tmp(k-1)/p_tmp(k+1))
end do
do k=layer2,layer1-1
ADJ_pre_ma(k) = ADJ_pre_ma(k) + ADJ_p_tmp(k)
end do
ADJ_thk = 0.5 * gas_constant/gravity * ADJ_thk
ADJ_pre_ma(layer2) = ADJ_pre_ma(layer2) - ADJ_thk*tv2/pre_ma(layer2)
ADJ_tv2 = ADJ_tv2 + ADJ_thk*log(pre2/pre_ma(layer2))
ADJ_pre_ma(layer1-1) = ADJ_pre_ma(layer1-1) + &
ADJ_thk*tv1/pre_ma(layer1-1)
ADJ_tv1 = ADJ_tv1 + ADJ_thk*log(pre_ma(layer1-1)/pre1)
if (trace_use_dull) call da_trace_exit
("da_thickness_adj")
end subroutine da_thickness_adj