1 | SUBROUTINE comp_slant_tec_tl(nstate,nobs,r_leo,r_gps,x,x_tl,impact,slant_tec,slant_tec_tl)
|
---|
2 |
|
---|
3 | IMPLICIT NONE
|
---|
4 |
|
---|
5 | INTEGER, INTENT(IN) :: nstate,nobs
|
---|
6 | REAL, INTENT(IN) :: r_leo(nobs),r_gps(nobs)
|
---|
7 | REAL, INTENT(IN) :: x(nstate)
|
---|
8 | REAL, INTENT(IN) :: x_tl(nstate)
|
---|
9 | REAL, INTENT(IN) :: impact(nobs)
|
---|
10 | REAL, INTENT(OUT) :: slant_tec(nobs)
|
---|
11 | REAL, INTENT(OUT) :: slant_tec_tl(nobs)
|
---|
12 |
|
---|
13 | ! local variables
|
---|
14 |
|
---|
15 | INTEGER :: nstep_leo,nstep_gps
|
---|
16 |
|
---|
17 | INTEGER :: i,j,k
|
---|
18 |
|
---|
19 | REAL :: ne_max,rmax,H0,H_grad
|
---|
20 |
|
---|
21 | REAL :: ne_max_tl,rmax_tl,H0_tl,H_grad_tl
|
---|
22 |
|
---|
23 | REAL :: dtheta,theta_leo,theta_gps
|
---|
24 |
|
---|
25 | REAL :: x_leo,x_gps
|
---|
26 | REAL :: theta(3),h(3)
|
---|
27 | REAL :: h_tl(3)
|
---|
28 |
|
---|
29 | REAL :: rad(3)
|
---|
30 | REAL :: u(3)
|
---|
31 | REAL :: ne(3)
|
---|
32 |
|
---|
33 | REAL :: u_tl(3)
|
---|
34 | REAL :: ne_tl(3)
|
---|
35 |
|
---|
36 | REAL :: afac,S_term,S_term_tl
|
---|
37 |
|
---|
38 | ! for integral - quick test
|
---|
39 |
|
---|
40 | nstep_leo = 40
|
---|
41 | nstep_gps = 20
|
---|
42 |
|
---|
43 | ! state vector contents
|
---|
44 |
|
---|
45 | ne_max = x(1)
|
---|
46 | rmax = x(2)
|
---|
47 | H0 = x(3)
|
---|
48 | H_grad = x(4)
|
---|
49 |
|
---|
50 | ne_max_tl = x_tl(1)
|
---|
51 | rmax_tl = x_tl(2)
|
---|
52 | H0_tl = x_tl(3)
|
---|
53 | H_grad_tl = x_tl(4)
|
---|
54 |
|
---|
55 |
|
---|
56 | ! Maximum for the VaryCHAP
|
---|
57 |
|
---|
58 | !
|
---|
59 | ! Compute slant TECs for impact parameters
|
---|
60 | !
|
---|
61 |
|
---|
62 | slant_tec(:) = -9998765.0 ! missing
|
---|
63 |
|
---|
64 | slant_tec_tl(:) = -9998765.0 ! missing
|
---|
65 |
|
---|
66 | DO i = 1, nobs
|
---|
67 |
|
---|
68 | IF (r_leo(i) < impact(i) .OR. impact(i) < 0.0) CYCLE
|
---|
69 |
|
---|
70 | x_leo = r_leo(i)/impact(i)
|
---|
71 |
|
---|
72 | x_gps = r_gps(i)/impact(i)
|
---|
73 |
|
---|
74 | theta_leo = log(x_leo+SQRT(MAX(1.0E-20,(x_leo*x_leo-1.0))))
|
---|
75 |
|
---|
76 | theta_gps = log(x_gps+SQRT(MAX(1.0E-20,(x_gps*x_gps-1.0))))
|
---|
77 |
|
---|
78 | ! integrate to LEO
|
---|
79 |
|
---|
80 | slant_tec(i) = 0.0
|
---|
81 |
|
---|
82 | slant_tec_tl(i) = 0.0
|
---|
83 |
|
---|
84 | DO j = 1,(nstep_leo+nstep_gps)
|
---|
85 |
|
---|
86 | IF (j <= nstep_leo) THEN
|
---|
87 |
|
---|
88 | ! path from tangent point to LEO
|
---|
89 |
|
---|
90 | dtheta = theta_leo/REAL(nstep_leo)
|
---|
91 |
|
---|
92 | afac = 0.33333333
|
---|
93 |
|
---|
94 | ELSE
|
---|
95 |
|
---|
96 | ! path from LEO to GPS
|
---|
97 |
|
---|
98 | dtheta = (theta_gps-theta_leo)/nstep_gps
|
---|
99 |
|
---|
100 | afac = 0.16666667
|
---|
101 |
|
---|
102 | ENDIF
|
---|
103 |
|
---|
104 | DO k = 1,3
|
---|
105 |
|
---|
106 | IF (j <= nstep_leo) THEN
|
---|
107 |
|
---|
108 | theta(k) = REAL(j-1)*dtheta + REAL(k-1)*0.5*dtheta
|
---|
109 |
|
---|
110 | ELSE
|
---|
111 |
|
---|
112 | theta(k) = theta_leo + REAL(j-nstep_leo-1)*dtheta + REAL(k-1)*0.5*dtheta
|
---|
113 |
|
---|
114 | ENDIF
|
---|
115 |
|
---|
116 | rad(k) = impact(i)*COSH(theta(k))
|
---|
117 |
|
---|
118 | IF (h_grad > 1.0e-6 .AND. rad(k) > rmax ) THEN
|
---|
119 |
|
---|
120 | u(k) = LOG(1.0+H_grad*(rad(k)-rmax)/H0)/H_grad
|
---|
121 |
|
---|
122 | u_tl(k) = -(u(k)/H_grad)*H_grad_tl + &
|
---|
123 | &((1.0/(1.0+H_grad*(rad(k)-rmax)/H0))*(H_grad_tl*(rad(k)-rmax)/H0 - &
|
---|
124 | &(H_grad/H0)*rmax_tl - (H_grad*(rad(k)-rmax)/H0**2)*H0_tl ))/H_grad
|
---|
125 |
|
---|
126 | h(k) = H0 + h_grad*(rad(k)-rmax)
|
---|
127 |
|
---|
128 | h_tl(k) = H0_tl + h_grad_tl*(rad(k)-rmax) - h_grad*rmax_tl
|
---|
129 |
|
---|
130 | ELSE
|
---|
131 |
|
---|
132 | u(k) = (rad(k)-rmax)/H0
|
---|
133 |
|
---|
134 | u_tl(k) = -rmax_tl/H0 - (u(k)/H0)*H0_tl
|
---|
135 |
|
---|
136 | h(k) = H0
|
---|
137 |
|
---|
138 | h_tl(k) = H0_tl
|
---|
139 |
|
---|
140 | ENDIF
|
---|
141 |
|
---|
142 | ne(k) = ne_max*EXP(0.5*(1.0-u(k)-EXP(-u(k))))*SQRT(H0/h(k))
|
---|
143 |
|
---|
144 | ne_tl(k) = ne(k)*(ne_max_tl/ne_max + 0.5*(EXP(-u(k))-1.0)*u_tl(k) + &
|
---|
145 | & 0.5*(H0_tl/H0 - h_tl(k)/h(k)))
|
---|
146 |
|
---|
147 |
|
---|
148 | ENDDO ! k
|
---|
149 |
|
---|
150 | !!! write (6,*) j,'ne',2.0*(ne_up-ne_low)/(ne_low+ne_up),ne_up,ne_low
|
---|
151 |
|
---|
152 | !!! write (6,*) j,theta(1),dtheta,rad(1)-6.371e6,rad(3)-6.371e6,ne(1),ne(3)
|
---|
153 |
|
---|
154 | ! Simpson's rule
|
---|
155 |
|
---|
156 | S_term = (ne(1)*rad(1) + 4.0*ne(2)*rad(2) + ne(3)*rad(3))
|
---|
157 |
|
---|
158 | S_term_tl = (ne_tl(1)*rad(1) + 4.0*ne_tl(2)*rad(2) + ne_tl(3)*rad(3))
|
---|
159 | !
|
---|
160 | ! afac depends on which section of path
|
---|
161 | !
|
---|
162 | slant_tec(i) = slant_tec(i) + afac*S_term*dtheta
|
---|
163 |
|
---|
164 | slant_tec_tl(i) = slant_tec_tl(i) + afac*S_term_tl*dtheta
|
---|
165 |
|
---|
166 | ENDDO ! j
|
---|
167 |
|
---|
168 |
|
---|
169 | !! write (6,*) i,impact(i),slant_tec(i),slant_tec_tl(i)
|
---|
170 |
|
---|
171 | ENDDO ! i
|
---|
172 |
|
---|
173 |
|
---|
174 | END
|
---|
175 |
|
---|
176 |
|
---|