Merge remote-tracking branch 'origin/release-v4.6.1'
[WRF.git] / var / da / da_obs_io / da_search_obs.inc
blob9fb3439960016ddaa34b0f0bc1ce8ebec288f433
1 subroutine da_search_obs (ob_type_string, unit_in, num_obs, nth, iv, found_flag)
3    !-----------------------------------------------------------------------
4    ! Purpose: Search obs. in gts_omb.000 
5    !-----------------------------------------------------------------------
7    !-------------------------------------------------------------------------
8    ! read iv=O-B structure written by WRFVAR
9    !-------------------------------------------------------------------------
11    implicit none
13    type (iv_type), intent(inout)    :: iv      ! O-B structure.
14    integer, intent(in)              :: unit_in, nth, num_obs
15    character(len=20), intent(in)    :: ob_type_string
16    logical, intent(out)             :: found_flag
18    character*5  :: stn_id
19    real         :: lat, lon
20    integer      :: n, n_dummy, k, levels
21    real, parameter :: MIN_ERR=1.0E-6
23    if (trace_use) call da_trace_entry("da_search_obs")
25    found_flag = .true. 
26    SELECT CASE (trim(adjustl(ob_type_string)))
28    CASE ('synop')
30    do n = 1, num_obs
31       read(unit_in,'(i8,a5,2E22.13)') n_dummy, stn_id, lat, lon
32       if ( trim(iv%info(synop)%id(nth))  == trim(adjustl(stn_id)) .and.  &
33            abs(iv%info(synop)%lat(1,nth) - lat ) < MIN_ERR     .and.  &
34            abs(iv%info(synop)%lon(1,nth) - lon ) < MIN_ERR ) then
36          read(unit_in,'(E22.13,5(E22.13,i8,3E22.13))')&
37               iv%synop(nth)%h, &
38               iv%synop(nth)%u, &!  O-B u
39               iv%synop(nth)%v, &!  O-B v
40               iv%synop(nth)%t, &!  O-B t
41               iv%synop(nth)%p, &!  O-B p
42               iv%synop(nth)%q  !  O-B q
43          !found_flag = .true.
44          rewind (unit_in)
45          read(unit_in,*)
46          if (trace_use) call da_trace_exit("da_search_obs")
47          return
48       else
49          read(unit_in,*)
50       endif
51    enddo
52    !found_flag = .false.
53    rewind (unit_in)
54    read(unit_in,*)
56    CASE ('metar')
58    do n = 1, num_obs
59       read(unit_in,'(i8,a5,2E22.13)') n_dummy, stn_id, lat, lon
60       if ( trim(iv%info(metar)%id(nth))  == trim(adjustl(stn_id)) .and.  &
61            abs(iv%info(metar)%lat(1,nth) - lat ) < MIN_ERR     .and.  &
62            abs(iv%info(metar)%lon(1,nth) - lon ) < MIN_ERR ) then
64          read(unit_in,'(E22.13,5(E22.13,i8,3E22.13))')&
65               iv%metar(nth)%h, &
66               iv%metar(nth)%u, &!  O-B u
67               iv%metar(nth)%v, &!  O-B v
68               iv%metar(nth)%t, &!  O-B t
69               iv%metar(nth)%p, &!  O-B p
70               iv%metar(nth)%q  !  O-B q
71          !found_flag = .true.
72          rewind (unit_in)
73          read(unit_in,*)
74          if (trace_use) call da_trace_exit("da_search_obs")
75          return
76       else
77          read(unit_in,*)
78       endif
79    enddo
80    !found_flag = .false.
81    rewind (unit_in)
82    read(unit_in,*)
84    CASE ('ships')
86    do n = 1, num_obs
87       read(unit_in,'(i8,a5,2E22.13)') n_dummy, stn_id, lat, lon
88       if ( trim(iv%info(ships)%id(nth))  == trim(adjustl(stn_id)) .and.  &
89            abs(iv%info(ships)%lat(1,nth) - lat ) < MIN_ERR     .and.  &
90            abs(iv%info(ships)%lon(1,nth) - lon ) < MIN_ERR ) then
92          read(unit_in,'(E22.13,5(E22.13,i8,3E22.13))')&
93               iv%ships(nth)%h, &
94               iv%ships(nth)%u, &!  O-B u
95               iv%ships(nth)%v, &!  O-B v
96               iv%ships(nth)%t, &!  O-B t
97               iv%ships(nth)%p, &!  O-B p
98               iv%ships(nth)%q  !  O-B q
99          !found_flag = .true.
100          rewind (unit_in)
101          read(unit_in,*)
102          if (trace_use) call da_trace_exit("da_search_obs")
103          return
104       else
105          read(unit_in,*)
106       endif
107    enddo
108    !found_flag = .false.
109    rewind (unit_in)
110    read(unit_in,*)
112    CASE ('sonde_sfc')
114    do n = 1, num_obs
115       read(unit_in,'(i8,a5,2E22.13)') n_dummy, stn_id, lat, lon
116       if ( trim(iv%info(sonde_sfc)%id(nth))  == trim(adjustl(stn_id)) .and.  &
117            abs(iv%info(sonde_sfc)%lat(1,nth) - lat ) < MIN_ERR     .and.  &
118            abs(iv%info(sonde_sfc)%lon(1,nth) - lon ) < MIN_ERR ) then
120          read(unit_in,'(E22.13,5(E22.13,i8,3E22.13))')&
121               iv%sonde_sfc(nth)%h, &
122               iv%sonde_sfc(nth)%u, &!  O-B u
123               iv%sonde_sfc(nth)%v, &!  O-B v
124               iv%sonde_sfc(nth)%t, &!  O-B t
125               iv%sonde_sfc(nth)%p, &!  O-B p
126               iv%sonde_sfc(nth)%q  !  O-B q
127          !found_flag = .true.
128          rewind (unit_in)
129          read(unit_in,*)
130          if (trace_use) call da_trace_exit("da_search_obs")
131          return
132       else
133          read(unit_in,*)
134       endif
135    enddo
136    !found_flag = .false.
137    rewind (unit_in)
138    read(unit_in,*)
140    CASE ('sound')
142    do n = 1, num_obs
143       read(unit_in,'(2i8,a5,2E22.13)') n_dummy, levels, stn_id, lat, lon
144       if ( trim(iv%info(sound)%id(nth))  == trim(adjustl(stn_id)) .and.  &
145            abs(iv%info(sound)%lat(1,nth) - lat ) < MIN_ERR     .and.  &
146            abs(iv%info(sound)%lon(1,nth) - lon ) < MIN_ERR ) then
148          do k = 1, levels
149             read(unit_in,'(2E22.13,4(E22.13,i8,3E22.13))')&
150                  iv % sound(nth) % h(k), &
151                  iv % sound(nth) % p(k), &             ! Obs Pressure
152                  iv%sound(nth)%u(k), &! O-B u
153                  iv%sound(nth)%v(k), &! O-B v
154                  iv%sound(nth)%t(k), &! O-B t
155                  iv%sound(nth)%q(k)   ! O-B q
156          enddo
157          !found_flag = .true.
158          rewind (unit_in)
159          read(unit_in,*)
160          if (trace_use) call da_trace_exit("da_search_obs")
161          return
162       else
163          do k = 1, levels
164             read(unit_in,*)
165          enddo
166       endif
167    enddo
168    !found_flag = .false.
169    rewind (unit_in)
170    read(unit_in,*)
172    CASE ('mtgirs')
174    do n = 1, num_obs
175       read(unit_in,'(2i8,a5,2E22.13)') n_dummy, levels, stn_id, lat, lon
176       if ( trim(iv%info(mtgirs)%id(nth))  == trim(adjustl(stn_id)) .and.  &
177            abs(iv%info(mtgirs)%lat(1,nth) - lat ) < MIN_ERR     .and.  &
178            abs(iv%info(mtgirs)%lon(1,nth) - lon ) < MIN_ERR ) then
180          do k = 1, levels
181             read(unit_in,'(2E22.13,4(E22.13,i8,3E22.13))')&
182                  iv % mtgirs(nth) % h(k), &
183                  iv % mtgirs(nth) % p(k), &             ! Obs Pressure
184                  iv%mtgirs(nth)%u(k), &! O-B u
185                  iv%mtgirs(nth)%v(k), &! O-B v
186                  iv%mtgirs(nth)%t(k), &! O-B t
187                  iv%mtgirs(nth)%q(k)   ! O-B q
188          enddo
189          !found_flag = .true.
190          rewind (unit_in)
191          read(unit_in,*)
192          if (trace_use) call da_trace_exit("da_search_obs")
193          return
194       else
195          do k = 1, levels
196             read(unit_in,*)
197          enddo
198       endif
199    enddo
200    !found_flag = .false.
201    rewind (unit_in)
202    read(unit_in,*)
204    CASE ('tamdar')
206    do n = 1, num_obs
207       read(unit_in,'(2i8,a5,2E22.13)') n_dummy, levels, stn_id, lat, lon
208       if ( trim(iv%info(tamdar)%id(nth))  == trim(adjustl(stn_id)) .and.  &
209            abs(iv%info(tamdar)%lat(1,nth) - lat ) < MIN_ERR     .and.  &
210            abs(iv%info(tamdar)%lon(1,nth) - lon ) < MIN_ERR ) then
212          do k = 1, levels
213             read(unit_in,'(2E22.13,4(E22.13,i8,3E22.13))')&
214                  iv % tamdar(nth) % h(k), &
215                  iv % tamdar(nth) % p(k), &             ! Obs Pressure
216                  iv%tamdar(nth)%u(k), &! O-B u
217                  iv%tamdar(nth)%v(k), &! O-B v
218                  iv%tamdar(nth)%t(k), &! O-B t
219                  iv%tamdar(nth)%q(k)   ! O-B q
220          enddo
221          !found_flag = .true.
222          rewind (unit_in)
223          read(unit_in,*)
224          if (trace_use) call da_trace_exit("da_search_obs")
225          return
226       else
227          do k = 1, levels
228             read(unit_in,*)
229          enddo
230       endif
231    enddo
232    !found_flag = .false.
233    rewind (unit_in)
234    read(unit_in,*)
236    CASE ('tamdar_sfc')
238    do n = 1, num_obs
239       read(unit_in,'(i8,a5,2E22.13)') n_dummy, stn_id, lat, lon
240       if ( trim(iv%info(tamdar_sfc)%id(nth))  == trim(adjustl(stn_id)) .and.  &
241            abs(iv%info(tamdar_sfc)%lat(1,nth) - lat ) < MIN_ERR     .and.  &
242            abs(iv%info(tamdar_sfc)%lon(1,nth) - lon ) < MIN_ERR ) then
244          read(unit_in,'(E22.13,5(E22.13,i8,3E22.13))')&
245               iv%tamdar_sfc(nth)%h, &
246               iv%tamdar_sfc(nth)%u, &!  O-B u
247               iv%tamdar_sfc(nth)%v, &!  O-B v
248               iv%tamdar_sfc(nth)%t, &!  O-B t
249               iv%tamdar_sfc(nth)%p, &!  O-B p
250               iv%tamdar_sfc(nth)%q  !  O-B q
251          !found_flag = .true.
252          rewind (unit_in)
253          read(unit_in,*)
254          if (trace_use) call da_trace_exit("da_search_obs")
255          return
256       else
257          read(unit_in,*)
258       endif
259    enddo
260    !found_flag = .false.
261    rewind (unit_in)
262    read(unit_in,*)
264    CASE ('buoy')
266    do n = 1, num_obs
267       read(unit_in,'(i8,a5,2E22.13)') n_dummy, stn_id, lat, lon
268       if ( trim(iv%info(buoy)%id(nth))  == trim(adjustl(stn_id)) .and.  &
269            abs(iv%info(buoy)%lat(1,nth) - lat ) < MIN_ERR     .and.  &
270            abs(iv%info(buoy)%lon(1,nth) - lon ) < MIN_ERR ) then
272          read(unit_in,'(E22.13,5(E22.13,i8,3E22.13))')&
273               iv%buoy(nth)%h, &
274               iv%buoy(nth)%u, &!  O-B u
275               iv%buoy(nth)%v, &!  O-B v
276               iv%buoy(nth)%t, &!  O-B t
277               iv%buoy(nth)%p, &!  O-B p
278               iv%buoy(nth)%q  !  O-B q
279          !found_flag = .true.
280          rewind (unit_in)
281          read(unit_in,*)
282          if (trace_use) call da_trace_exit("da_search_obs")
283          return
284       else
285          read(unit_in,*)
286       endif
287    enddo
288    !found_flag = .false.
289    rewind (unit_in)
290    read(unit_in,*)
292    CASE ('geoamv')
294    do n = 1, num_obs
295       read(unit_in,'(2i8,a5,2E22.13)') n_dummy, levels, stn_id, lat, lon
296       if ( trim(iv%info(geoamv)%id(nth))  == trim(adjustl(stn_id)) .and.  &
297            abs(iv%info(geoamv)%lat(1,nth) - lat ) < MIN_ERR     .and.  &
298            abs(iv%info(geoamv)%lon(1,nth) - lon ) < MIN_ERR ) then
299          do k = 1, levels
300             read(unit_in,'(E22.13,2(E22.13,i8,3E22.13))')&
301                  iv % geoamv(nth) % p(k), &                ! Obs Pressure
302                  iv%geoamv(nth)%u(k), &! O-B u
303                  iv%geoamv(nth)%v(k)
304          enddo
305          !found_flag = .true.
306          rewind (unit_in)
307          read(unit_in,*)
308          if (trace_use) call da_trace_exit("da_search_obs")
309          return
310       else
311          do k = 1, levels
312             read(unit_in,*)
313          enddo
314       endif
315    enddo
316    !found_flag = .false.
317    rewind (unit_in)
318    read(unit_in,*)
320    CASE ('gpspw')
322    do n = 1, num_obs
323       read(unit_in,'(i8,a5,2E22.13)') n_dummy, stn_id, lat, lon
324       if ( trim(iv%info(gpspw)%id(nth))  == trim(adjustl(stn_id)) .and.  &
325            abs(iv%info(gpspw)%lat(1,nth) - lat ) < MIN_ERR     .and.  &
326            abs(iv%info(gpspw)%lon(1,nth) - lon ) < MIN_ERR ) then
328          read(unit_in,'(E22.13,i8,3E22.13)')&
329               iv%gpspw(nth)%tpw
330          !found_flag = .true.
331          rewind (unit_in)
332          read(unit_in,*)
333          if (trace_use) call da_trace_exit("da_search_obs")
334          return
335       else
336          read(unit_in,*)
337       endif
338    enddo
339    !found_flag = .false.
340    rewind (unit_in)
341    read(unit_in,*)
343    CASE ('radar')
345    do n = 1, num_obs
346       read(unit_in,'(2i8,2E22.13)') n_dummy, levels, lat, lon
348       if ( abs(iv%info(radar)%lat(1,nth) - lat ) < MIN_ERR     .and.  &
349            abs(iv%info(radar)%lon(1,nth) - lon ) < MIN_ERR ) then
351          do k = 1, levels
352             read(unit_in,'(E22.13,i8,3E22.13)')&
353                  iv%radar(nth)%rv(k) 
354          enddo
356          !found_flag = .true.
357          rewind (unit_in)
358          read(unit_in,*)
359          if (trace_use) call da_trace_exit("da_search_obs")
360          return
361       else
362          do k = 1, levels
363            read(unit_in,*)
364          enddo
365       endif
366    enddo
367    !found_flag = .false.
368    rewind (unit_in)
369    read(unit_in,*)
371    CASE ('ssmir')
373    do n = 1, num_obs
374       read(unit_in,'(i8,2E22.13)') n_dummy, lat, lon
375       if ( abs(iv%info(ssmi_rv)%lat(1,nth) - lat ) < MIN_ERR .and. &
376            abs(iv%info(ssmi_rv)%lon(1,nth) - lon ) < MIN_ERR ) then
378          read(unit_in,'(2(E22.13,i8,3E22.13))')&
379               iv%ssmi_rv(nth)%speed, & ! O-B speed
380               iv%ssmi_rv(nth)%tpw ! O-BA tpw
381          !found_flag = .true.
382          rewind (unit_in)
383          read(unit_in,*)
384          if (trace_use) call da_trace_exit("da_search_obs")
385          return
386       else
387          read(unit_in,*)
388       endif
389    enddo
390    !found_flag = .false.
391    rewind (unit_in)
392    read(unit_in,*)
394    CASE ('airep')
396    do n = 1, num_obs
397       read(unit_in,'(2i8,a5,2E22.13)') n_dummy, levels, stn_id, lat, lon
399       if ( trim(iv%info(airep)%id(nth))  == trim(adjustl(stn_id)) .and.  &
400            abs(iv%info(airep)%lat(1,nth) - lat ) < MIN_ERR     .and.  &
401            abs(iv%info(airep)%lon(1,nth) - lon ) < MIN_ERR ) then
403          do k = 1, levels
404             read(unit_in,'(2E22.13,4(E22.13,i8,3E22.13))')&
405                  iv % airep(nth) % h(k), &
406                  iv % airep(nth) % p(k), &             ! Obs pressure
407                  iv%airep(nth)%u(k), &! O-B u
408                  iv%airep(nth)%v(k), &! O-B v
409                  iv%airep(nth)%t(k), &! 
410                  iv%airep(nth)%q(k)
411          enddo
413          !found_flag = .true.
414          rewind (unit_in)
415          read(unit_in,*)
416          if (trace_use) call da_trace_exit("da_search_obs")
417          return
418       else
419          do k = 1, levels
420             read(unit_in,*)
421          enddo
422       endif
423    enddo
424    !found_flag = .false.
425    rewind (unit_in)
426    read(unit_in,*)
428    CASE ('polaramv')
430    do n = 1, num_obs
431       read(unit_in,'(2i8,a5,2E22.13)') n_dummy, levels, stn_id, lat, lon
432       if ( trim(iv%info(polaramv)%id(nth))  == trim(adjustl(stn_id)) .and.  &
433            abs(iv%info(polaramv)%lat(1,nth) - lat ) < MIN_ERR     .and.  &
434            abs(iv%info(polaramv)%lon(1,nth) - lon ) < MIN_ERR ) then
436          do k = 1, levels
437             read(unit_in,'(E22.13,2(E22.13,i8,3E22.13))')&
438                  iv % polaramv(nth) % p(k), &                ! Obs Pressure
439                  iv%polaramv(nth)%u(k), &! O-B u
440                  iv%polaramv(nth)%v(k)
441          enddo
442          !found_flag = .true.
443          rewind (unit_in)
444          read(unit_in,*)
445          if (trace_use) call da_trace_exit("da_search_obs")
446          return
447       else
448          do k = 1, levels
449             read(unit_in,*)
450          enddo
451       endif
452    enddo
453    !found_flag = .false.
454    rewind (unit_in)
455    read(unit_in,*)
457    CASE ('pilot')
459    do n = 1, num_obs
460       read(unit_in,'(2i8,a5,2E22.13)') n_dummy, levels, stn_id, lat, lon
461       if ( trim(iv%info(pilot)%id(nth))  == trim(adjustl(stn_id)) .and.  &
462            abs(iv%info(pilot)%lat(1,nth) - lat ) < MIN_ERR     .and.  &
463            abs(iv%info(pilot)%lon(1,nth) - lon ) < MIN_ERR ) then
465          do k = 1, levels
466             read(unit_in,'(E22.13,2(E22.13,i8,3E22.13))')&
467                  iv % pilot(nth) % p(k), &                ! Obs Pressure
468                  iv%pilot(nth)%u(k), &! O-B u
469                  iv%pilot(nth)%v(k)
470          enddo
471          !found_flag = .true.
472          rewind (unit_in)
473          read(unit_in,*)
474          if (trace_use) call da_trace_exit("da_search_obs")
475          return
476       else
477          do k = 1, levels
478             read(unit_in,*)
479          enddo
480       endif
481    enddo
482    !found_flag = .false.
483    rewind (unit_in)
484    read(unit_in,*)
486    CASE ('ssmi_tb')
488    do n = 1, num_obs
489       read(unit_in,'(i8,2E22.13)') n_dummy, lat, lon
490       if ( abs(iv%info(ssmi_tb)%lat(1,nth) - lat ) < MIN_ERR .and. &
491            abs(iv%info(ssmi_tb)%lon(1,nth) - lon ) < MIN_ERR ) then
493          read(unit_in,'(7(E22.13,i8,3E22.13))')&
494               iv%ssmi_tb(nth)%tb19h, & ! O-B Tb19h
495               iv%ssmi_tb(nth)%tb19v, & ! O-B Tb19v
496               iv%ssmi_tb(nth)%tb22v, & ! O-B Tb22v
497               iv%ssmi_tb(nth)%tb37h, & ! O-B Tb37h
498               iv%ssmi_tb(nth)%tb37v, & ! O-B Tb37v
499               iv%ssmi_tb(nth)%tb85h, & ! O-B Tb85h
500               iv%ssmi_tb(nth)%tb85v    ! O-B Tb85v
501          !found_flag = .true.
502          rewind (unit_in)
503          read(unit_in,*)
504          if (trace_use) call da_trace_exit("da_search_obs")
505          return
506       else
507          read(unit_in,*)
508       endif
509    enddo
510    !found_flag = .false.
511    rewind (unit_in)
512    read(unit_in,*)
514    CASE ('satem')
516    do n = 1, num_obs
517       read(unit_in,'(2i8,a5,2E22.13)') n_dummy, levels, stn_id, lat, lon
518       if ( trim(iv%info(satem)%id(nth))  == trim(adjustl(stn_id)) .and.  &
519            abs(iv%info(satem)%lat(1,nth) - lat ) < MIN_ERR     .and.  &
520            abs(iv%info(satem)%lon(1,nth) - lon ) < MIN_ERR ) then
522          do k = 1, levels
523             read(unit_in,'(E22.13,(E22.13,i8,3E22.13))')&
524                  iv % satem(nth) % p(k), &             ! Obs Pressure
525                  iv%satem(nth)%thickness(k)
526          enddo
527          !found_flag = .true.
528          rewind (unit_in)
529          read(unit_in,*)
530          if (trace_use) call da_trace_exit("da_search_obs")
531          return
532       else
533          do k = 1, levels
534             read(unit_in,*)
535          enddo
536       endif
537    enddo
538    !found_flag = .false.
539    rewind (unit_in)
540    read(unit_in,*)
542    CASE ('ssmt1')
544    do n = 1, num_obs
545       read(unit_in,'(2i8,a5,2E22.13)') n_dummy, levels, stn_id, lat, lon
546       if ( trim(iv%info(ssmt1)%id(nth))  == trim(adjustl(stn_id)) .and.  &
547            abs(iv%info(ssmt1)%lat(1,nth) - lat ) < MIN_ERR     .and.  &
548            abs(iv%info(ssmt1)%lon(1,nth) - lon ) < MIN_ERR ) then
550          do k = 1, levels
551             read(unit_in,'(E22.13,(E22.13,i8,3E22.13))')&
552                  iv % ssmt1(nth) % h(k), &             ! Obs Pressure
553                  iv%ssmt1(nth)%t(k)
554          enddo
555          !found_flag = .true.
556          rewind (unit_in)
557          read(unit_in,*)
558          if (trace_use) call da_trace_exit("da_search_obs")
559          return
560       else
561          do k = 1, levels
562             read(unit_in,*)
563          enddo
564       endif
565    enddo
566    !found_flag = .false.
567    rewind (unit_in)
568    read(unit_in,*)
570    CASE ('ssmt2')
572    do n = 1, num_obs
573       read(unit_in,'(2i8,a5,2E22.13)') n_dummy, levels, stn_id, lat, lon
574       if ( trim(iv%info(ssmt2)%id(nth))  == trim(adjustl(stn_id)) .and.  &
575            abs(iv%info(ssmt2)%lat(1,nth) - lat ) < MIN_ERR     .and.  &
576            abs(iv%info(ssmt2)%lon(1,nth) - lon ) < MIN_ERR ) then
578          do k = 1, levels
579             read(unit_in,'(E22.13,(E22.13,i8,3E22.13))')&
580                  iv % ssmt2(nth) % h(k), &             ! Obs Pressure
581                  iv%ssmt2(nth)%rh(k)
582          enddo
583          !found_flag = .true.
584          rewind (unit_in)
585          read(unit_in,*)
586          if (trace_use) call da_trace_exit("da_search_obs")
587          return
588       else
589          do k = 1, levels
590             read(unit_in,*)
591          enddo
592       endif
593    enddo
594    !found_flag = .false.
595    rewind (unit_in)
596    read(unit_in,*)
598    CASE ('qscat')
600    do n = 1, num_obs
601       read(unit_in,'(i8,a5,2E22.13)') n_dummy, stn_id, lat, lon
602       if ( trim(iv%info(qscat)%id(nth))  == trim(adjustl(stn_id)) .and.  &
603            abs(iv%info(qscat)%lat(1,nth) - lat ) < MIN_ERR     .and.  &
604            abs(iv%info(qscat)%lon(1,nth) - lon ) < MIN_ERR ) then
606          read(unit_in,'(E22.13,2(E22.13,i8,3E22.13))')&
607               iv % qscat(nth) % h, &                ! Obs height
608               iv%qscat(nth)%u, &! O-B u
609               iv%qscat(nth)%v   ! O-B v
610          !found_flag = .true.
611          rewind (unit_in)
612          read(unit_in,*)
613          if (trace_use) call da_trace_exit("da_search_obs")
614          return
615       else
616          read(unit_in,*)
617       endif
618    enddo
619    !found_flag = .false.
620    rewind (unit_in)
621    read(unit_in,*)
623    CASE ('profiler')
625    do n = 1, num_obs
626       read(unit_in,'(2i8,a5,2E22.13)') n_dummy, levels, stn_id, lat, lon
627       if ( trim(iv%info(profiler)%id(nth))  == trim(adjustl(stn_id)) .and.  &
628            abs(iv%info(profiler)%lat(1,nth) - lat ) < MIN_ERR     .and.  &
629            abs(iv%info(profiler)%lon(1,nth) - lon ) < MIN_ERR ) then
631          do k = 1, levels
632             read(unit_in,'(E22.13,2(E22.13,i8,3E22.13))')&
633                  iv % profiler(nth) % p(k), &             ! Obs Pressure
634                  iv%profiler(nth)%u(k), &! O-B u
635                  iv%profiler(nth)%v(k) ! O-B v
636          enddo
637          !found_flag = .true.
638          rewind (unit_in)
639          read(unit_in,*)
640          if (trace_use) call da_trace_exit("da_search_obs")
641          return
642       else
643          do k = 1, levels
644             read(unit_in,*)
645          enddo
646       endif
647    enddo
648    !found_flag = .false.
649    rewind (unit_in)
650    read(unit_in,*)
652    CASE ('bogus')
654    do n = 1, num_obs
655       read(unit_in,'(2i8,a5,2E22.13)') n_dummy, levels, stn_id, lat, lon
656       if ( trim(iv%info(bogus)%id(nth))  == trim(adjustl(stn_id)) .and.  &
657            abs(iv%info(bogus)%lat(1,nth) - lat ) < MIN_ERR     .and.  &
658            abs(iv%info(bogus)%lon(1,nth) - lon ) < MIN_ERR ) then
660          read(unit_in,'(E22.13,i8,3E22.13)') iv%bogus(nth)%slp
661          do k = 1, levels
662             read(unit_in,'(2E22.13,4(E22.13,i8,3E22.13))')&
663                  iv % bogus(nth) % h(k), &
664                  iv % bogus(nth) % p(k), &             ! Obs Pressure
665                  iv%bogus(nth)%u(k), &! O-B u
666                  iv%bogus(nth)%v(k), &! O-B v
667                  iv%bogus(nth)%t(k), &! O-B t
668                  iv%bogus(nth)%q(k)   ! O-B q
669          enddo
670          !found_flag = .true.
671          rewind (unit_in)
672          read(unit_in,*)
673          if (trace_use) call da_trace_exit("da_search_obs")
674          return
675       else
676          read(unit_in,*)
677          do k = 1, levels
678             read(unit_in,*)
679          enddo
680       endif
681    enddo
682    !found_flag = .false.
683    rewind (unit_in)
684    read(unit_in,*)
686    CASE ('airsr')
688    do n = 1, num_obs
689       read(unit_in,'(2i8,a5,2E22.13)') n_dummy, levels, stn_id, lat, lon
690       if ( trim(iv%info(airsr)%id(nth))  == trim(adjustl(stn_id)) .and.  &
691            abs(iv%info(airsr)%lat(1,nth) - lat ) < MIN_ERR     .and.  &
692            abs(iv%info(airsr)%lon(1,nth) - lon ) < MIN_ERR ) then
694          do k = 1, levels
695             read(unit_in,'(E22.13,2(E22.13,i8,3E22.13))')&
696                  iv % airsr(nth) % p(k), &             ! Obs Pressure
697                  iv%airsr(nth)%t(k), &! O-B t
698                  iv%airsr(nth)%q(k)   ! O-B q
699          enddo
700          !found_flag = .true.
701          rewind (unit_in)
702          read(unit_in,*)
703          if (trace_use) call da_trace_exit("da_search_obs")
704          return
705       else
706         do k = 1, levels
707           read(unit_in,*)
708         enddo
709       endif
710    enddo
711    !found_flag = .false.
712    rewind (unit_in)
713    read(unit_in,*)
715    CASE ('gpsref')
717    do n = 1, num_obs
718       read(unit_in,'(2i8,a5,2E22.13)') n_dummy, levels, stn_id, lat, lon
719       if ( trim(iv%info(gpsref)%id(nth))  == trim(adjustl(stn_id)) .and.  &
720            abs(iv%info(gpsref)%lat(1,nth) - lat ) < MIN_ERR     .and.  &
721            abs(iv%info(gpsref)%lon(1,nth) - lon ) < MIN_ERR ) then
723          do k = 1, levels
724             read(unit_in,'(E22.13,(E22.13,i8,3E22.13))')&
725                  iv % gpsref(nth) % h(k), &             ! Obs Height
726                  iv%gpsref(nth)%ref(k) ! O-B ref
727          enddo
728          !found_flag = .true.
729          rewind (unit_in)
730          read(unit_in,*)
731          if (trace_use) call da_trace_exit("da_search_obs")
732          return
733       else
734          do k = 1, levels
735             read(unit_in,*)
736          enddo
737       endif
738    enddo
739    !found_flag = .false.
740    rewind (unit_in)
741    read(unit_in,*)
743    CASE ('lightning')
745    do n = 1, num_obs
746       read(unit_in,'(2i8,2E22.13)') n_dummy, levels, lat, lon
748       if ( abs(iv%info(lightning)%lat(1,nth) - lat ) < MIN_ERR     .and.  &
749            abs(iv%info(lightning)%lon(1,nth) - lon ) < MIN_ERR ) then
751          do k = 1, levels
752             read(unit_in,'(3(E22.13,i8,3E22.13))')&
753                  iv%lightning(nth)%w(k),&
754                  iv%lightning(nth)%div(k),&
755                  iv%lightning(nth)%qv(k)                         
756          enddo
758          !found_flag = .true.
759          rewind (unit_in)
760          read(unit_in,*)
761          if (trace_use) call da_trace_exit("da_search_obs")
762          return
763       else
764          read(unit_in,*)
765       endif
766    enddo
767    !found_flag = .false.
768    rewind (unit_in)
769    read(unit_in,*)
771    CASE default;
773    write(unit=message(1), fmt='(a,a20,a,i3)') &
774         'Got unknown obs_type string:', trim(ob_type_string),' on unit ',unit_in
775    call da_error(__FILE__,__LINE__,message(1:1))
777    END SELECT
779    if (trace_use) call da_trace_exit("da_search_obs")
780    return
781 end subroutine da_search_obs