da_predictor_rttov.inc

References to this file elsewhere.
1 subroutine da_predictor_rttov(pred,npred,temp,hum,T_skin)
2 
3    implicit none
4 
5    ! temp - 43 level temperatures
6    ! hum  - 43 level moistures
7    ! T-skin - model skin temperature
8 
9    ! pred(1) - 1000-300 thickness 43 1005.43-521.46 thickness
10    ! pred(2) - 200-50 thickness   43  194.36-56.73  thickness
11    ! pred(3) - T_skin
12    ! pred(4) - total column precipitable water
13    ! pred(5) - 10 -2 thickness    43  10.37-2.61 thickness
14    ! pred(6) - 50 -10thickness    43  45.29-10.37 thickness
15 
16    integer, parameter :: JPRTLEV = 43
17 
18    integer, intent(in)  :: npred
19    real,    intent(in)  :: temp(JPRTLEV), hum(JPRTLEV), T_skin
20    real,    intent(out) :: pred(npred)
21 
22    real, parameter :: Kth = gas_constant*0.5/gravity
23    real, parameter :: Kpc = 100.0*0.5/gravity
24 
25    real :: tv(JPRTLEV)
26 
27    logical, SAVE :: FIRST = .true.
28 
29    real :: PLEVS(JPRTLEV) =  (/ 0.10,    0.29,    0.69,   1.42,    2.61, &
30                                 4.41,    6.95,   10.37,  14.81,   20.40, &
31                                 27.26,   35.51,   45.29,  56.73,   69.97, &
32                                 85.18,  102.05,  122.04, 143.84,  167.95, &
33                                194.36,  222.94,  253.71, 286.60,  321.50, &
34                                358.28,  396.81,  436.95, 478.54,  521.46, &
35                                565.54,  610.60,  656.43, 702.73,  749.12, &
36                                795.09,  839.95,  882.80, 922.46,  957.44, &
37                                985.88, 1005.43, 1013.25 /)
38 
39    real, SAVE :: DLP(JPRTLEV-1), DP(JPRTLEV-1)
40 
41    if (trace_use) call da_trace_entry("da_predictor_rttov")
42 
43    ! If first time compute log P(i)/P(i-1) and P(i)-P(i-1)
44    if (FIRST) then
45       DLP(1:JPRTLEV-1) = LOG(PLEVS(2:JPRTLEV)) - LOG(PLEVS(1:JPRTLEV-1))
46       DP(1:JPRTLEV-1) = PLEVS(2:JPRTLEV) - PLEVS(1:JPRTLEV-1)
47       FIRST = .false.
48    end if
49 
50    ! 1.0 Convert all temperatures to virtual temperatures
51    ! ----------------------------------------------------
52    tv =  temp/(1.0 - 0.6*hum)
53 
54    ! 2.0 Construct averages for NESDIS thick layers
55    ! ----------------------------------------------
56 
57    pred(1) = Kth*sum((tv(26:42) + tv(25:41))*DLP(25:41))
58    pred(2) = Kth*sum((tv(14:21) + tv(13:20))*DLP(13:20))
59    pred(3) = T_skin
60    pred(4) = Kpc*sum((hum(2:43) + hum(1:42))*DP(1:42))
61 
62    if (npred == 6) then
63       pred(5) = Kth*sum((tv(5:8)  + tv(4:7))*DLP(4:7))
64       pred(6) = Kth*sum((tv(8:13)  + tv(7:12))*DLP(7:12))
65    end if
66 
67    if (trace_use) call da_trace_exit("da_predictor_rttov")
68 
69 end subroutine da_predictor_rttov
70 
71