da_jo_and_grady.inc
References to this file elsewhere.
1 subroutine da_jo_and_grady(iv, re, jot, jo, jo_grad_y)
2
3 !-----------------------------------------------------------------------
4 ! Purpose: TBD
5 !-----------------------------------------------------------------------
6
7 implicit none
8
9 type (ob_type), intent(in) :: iv ! Innovation vector (O-B).
10 type (y_type), intent(in) :: re ! Residual vector (O-A).
11 real, intent(out) :: jot ! Obs cost function.
12 type (jo_type), intent(out) :: jo ! Obs cost function.
13 type (y_type), intent(out) :: jo_grad_y ! Grad_y(Jo)
14 real :: jo_sound, jo_synop, jo_geoamv, jo_polaramv, &
15 jo_airep, jo_pilot, jo_satem, &
16 jo_metar, jo_ships, jo_gpspw, &
17 jo_ssmi , jo_ssmt1, jo_ssmt2, &
18 jo_pseudo, jo_qscat, jo_buoy, &
19 jo_profiler, jo_Radar, jo_gpsref, jo_bogus, &
20 jo_radiance, jo_airsr
21 integer :: i,k
22
23 if (trace_use) call da_trace_entry("da_jo_and_grady")
24
25 !-------------------------------------------------------------------------
26 ! [1.0] Compute components of Grad_y(Jo):
27 !-------------------------------------------------------------------------
28
29 ! Radiosonde
30
31 call da_jo_and_grady_sound(iv, re, jo, jo_grad_y)
32 jo_sound = jo % sound_u + jo % sound_v + &
33 jo % sound_t + jo % sound_q
34
35 if (print_detail_grad) then
36 write(unit=stdout, fmt='(a, e24.12)') &
37 'jo_sound ', jo_sound, &
38 'jo%sound_u ', jo%sound_u, &
39 'jo%sound_v ', jo%sound_v, &
40 'jo%sound_t ', jo%sound_t, &
41 'jo%sound_q ', jo%sound_q
42 end if
43
44 call da_jo_and_grady_sonde_sfc(iv, re, jo, jo_grad_y)
45 jo_sound = jo_sound + jo % sonde_sfc_u + jo % sonde_sfc_v + &
46 jo % sonde_sfc_t + jo % sonde_sfc_q + jo % sonde_sfc_p
47
48 if (print_detail_grad) then
49 write(unit=stdout, fmt='(a, e24.12)') &
50 'jo_sound ', jo_sound, &
51 'jo%sonde_sfc_u ', jo%sonde_sfc_u, &
52 'jo%sonde_sfc_v ', jo%sonde_sfc_v, &
53 'jo%sonde_sfc_t ', jo%sonde_sfc_t, &
54 'jo%sonde_sfc_p ', jo%sonde_sfc_p, &
55 'jo%sonde_sfc_q ', jo%sonde_sfc_q
56 end if
57
58 ! Surface
59
60 call da_jo_and_grady_synop(iv, re, jo, jo_grad_y)
61 jo_synop = jo % synop_u + jo % synop_v + jo % synop_t + &
62 jo % synop_p + jo % synop_q
63
64 if (print_detail_grad) then
65 write(unit=stdout, fmt='(a, e24.12)') &
66 'jo_synop ', jo_synop, &
67 'jo%synop_u ', jo%synop_u, &
68 'jo%synop_v ', jo%synop_v, &
69 'jo%synop_t ', jo%synop_t, &
70 'jo%synop_p ', jo%synop_p, &
71 'jo%synop_q ', jo%synop_q
72 end if
73
74
75 ! Geostationary Satellite AMVs:
76
77 call da_jo_and_grady_geoamv(iv, re, jo, jo_grad_y)
78 jo_geoamv = jo % geoamv_u + jo % geoamv_v
79 if (print_detail_grad) then
80 write(unit=stdout, fmt='(a, e24.12)') &
81 'jo_geoamv ', jo_geoamv, &
82 'jo%geoamv_u ', jo%geoamv_u, &
83 'jo%geoamv_v ', jo%geoamv_v
84 end if
85
86 ! Polar orbitting Satellite AMVs:
87
88 call da_jo_and_grady_polaramv(iv, re, jo, jo_grad_y)
89 jo_polaramv = jo % polaramv_u + jo % polaramv_v
90 if (print_detail_grad) then
91 write(unit=stdout, fmt='(a, e24.12)') &
92 'jo_polaramv ', jo_polaramv, &
93 'jo%polaramv_u ', jo%polaramv_u, &
94 'jo%polaramv_v ', jo%polaramv_v
95 end if
96
97 ! Airep
98
99 call da_jo_and_grady_airep(iv, re, jo, jo_grad_y)
100 jo_airep = jo % airep_u + jo % airep_v + jo % airep_t
101
102 ! Pilot
103
104 call da_jo_and_grady_pilot(iv, re, jo, jo_grad_y)
105 jo_pilot = jo % pilot_u + jo % pilot_v
106
107 ! Satem
108
109 call da_jo_and_grady_satem(iv, re, jo, jo_grad_y)
110 jo_satem = jo % satem_thickness
111
112 ! Metar:
113
114 call da_jo_and_grady_metar(iv, re, jo, jo_grad_y)
115 jo_metar = jo % metar_u + jo % metar_v + jo % metar_t + &
116 jo % metar_p + jo % metar_q
117
118 ! Ships:
119
120 call da_jo_and_grady_ships(iv, re, jo, jo_grad_y)
121 jo_ships = jo % ships_u + jo % ships_v + jo % ships_t + &
122 jo % ships_p + jo % ships_q
123
124 ! GPSPW:
125
126 call da_jo_and_grady_gpspw(iv, re, jo, jo_grad_y)
127 jo_gpspw = jo % gpspw_tpw
128
129 ! GPSRF:
130
131 call da_jo_and_grady_gpsref(iv, re, jo, jo_grad_y)
132 jo_gpsref = jo % gpsref_ref
133
134 ! SSMI:
135
136 call da_jo_and_grady_ssmi(iv, re, jo, jo_ssmi, jo_grad_y)
137
138 ! SSMT1:
139
140 call da_jo_and_grady_ssmt1(iv, re, jo, jo_grad_y)
141 jo_ssmt1 = jo % ssmt1_t
142
143 ! SSMT2:
144
145 call da_jo_and_grady_ssmt2(iv, re, jo, jo_grad_y)
146 jo_ssmt2 = jo % ssmt2_rh
147
148 ! Radar obs:
149
150 call da_jo_and_grady_radar(iv, re, jo, jo_grad_y)
151 jo_Radar = jo % Radar_rv + jo % Radar_rf
152
153 ! Pseudo obs:
154
155 call da_jo_and_grady_pseudo(iv, re, jo, jo_grad_y)
156 jo_pseudo = jo % pseudo_u + jo % pseudo_v + jo % pseudo_t + &
157 jo % pseudo_p + jo % pseudo_q
158
159 ! Quikscat scatterometer:
160
161 call da_jo_and_grady_qscat(iv, re, jo, jo_grad_y)
162 jo_qscat = jo % qscat_u + jo % qscat_v
163
164 ! Profiler:
165
166 call da_jo_and_grady_profiler (iv, re, jo, jo_grad_y)
167 jo_profiler = jo % profiler_u + jo % profiler_v
168
169 ! TC bogus:
170
171 call da_jo_and_grady_bogus (iv, re, jo, jo_grad_y)
172 jo_bogus = jo % bogus_u + jo % bogus_v + jo % bogus_slp + &
173 jo % bogus_t + jo % bogus_q
174
175 ! Buoy:
176
177 call da_jo_and_grady_buoy (iv, re, jo, jo_grad_y)
178 jo_buoy = jo % buoy_u + jo % buoy_v + jo % buoy_t + &
179 jo % buoy_p + jo % buoy_q
180
181 ! Radiance:
182
183 call da_jo_and_grady_rad (iv, re, jo, jo_grad_y)
184
185 jo_radiance = 0.
186 if (use_rad) then
187 do i=1,iv%num_inst
188 do k=1,iv%instid(i)%nchan
189 jo_radiance = jo_radiance + jo % rad(i)%jo_ichan(k)
190 end do
191 end do
192 end if
193 if (print_detail_grad) then
194 write(unit=stdout, fmt='(a, e24.12)') &
195 'jo_radiance ', jo_radiance
196 do i = 1, iv%num_inst
197 write(unit=stdout, fmt='(a, e24.12)') &
198 trim('jo_'//iv%instid(i)%rttovid_string), sum(jo % rad(i)%jo_ichan(:))
199 end do
200 end if
201
202 ! AIRS retrievals
203
204 call da_jo_and_grady_airsr(iv, re, jo, jo_grad_y)
205 jo_airsr = jo % airsr_t + jo % airsr_q
206
207 if (print_detail_grad) then
208 write(unit=stdout, fmt='(a, e24.12)') &
209 'jo_airsr ', jo_airsr, &
210 'jo%airsr_t ', jo%airsr_t, &
211 'jo%airsr_q ', jo%airsr_q
212 end if
213
214 !-------------------------------------------------------------------------
215 ! [2.0] Jo = 1/2 * (yo-y)**2/ob_err_variance:
216 !-------------------------------------------------------------------------
217
218 jo % total = jo_sound + jo_geoamv + jo_polaramv + jo_synop + jo_satem + &
219 jo_pilot + jo_airep + jo_metar + jo_ships + &
220 jo_gpspw + jo_ssmi + jo_ssmt1 + jo_ssmt2 + &
221 jo_pseudo + jo_qscat + jo_profiler + jo_buoy + &
222 jo_Radar + jo_gpsref + jo_bogus + jo_radiance + jo_airsr
223
224 jot = jo % total
225
226 if (print_detail_grad) then
227 write(unit=stdout, fmt='(a, e24.12)') &
228 'jo % total ', jot
229
230 write(unit=stdout, fmt='(a, e24.12)') &
231 'jo_sound ', jo_sound, &
232 'jo_geoamv ', jo_geoamv, &
233 'jo_polaramv ', jo_polaramv, &
234 'jo_synop ', jo_synop, &
235 'jo_satem ', jo_satem, &
236 'jo_pilot ', jo_pilot, &
237 'jo_airep ', jo_airep, &
238 'jo_metar ', jo_metar, &
239 'jo_ships ', jo_ships, &
240 'jo_gpspw ', jo_gpspw, &
241 'jo_ssmi ', jo_ssmi, &
242 'jo_ssmt1 ', jo_ssmt1, &
243 'jo_ssmt2 ', jo_ssmt2, &
244 'jo_pseudo ', jo_pseudo, &
245 'jo_qscat ', jo_qscat, &
246 'jo_profil ', jo_profiler, &
247 'jo_buoy ', jo_buoy, &
248 'jo_radar ', jo_radar, &
249 'jo_gpsref ', jo_gpsref, &
250 'jo_bogus ', jo_bogus, &
251 'jo_radiance ', jo_radiance, &
252 'jo_airsr ', jo_airsr
253
254 end if
255
256 if (trace_use) call da_trace_exit("da_jo_and_grady")
257
258 end subroutine da_jo_and_grady
259
260