3 !-----------------------------------------------------------------------------!
4 ! Assign observational error at every level from input error profiles read
7 ! Error profiles actually used are written out in files:
9 ! RH.txt: relative humidity
10 ! TEMP.txt: temperature and dew point
11 ! WIND.txt: wind speed
12 !------------------------------------------------------------------------------
15 ! F. VANDENBERGHE, March 2001
17 ! 01/13/2003 - Updated for Profiler obs. S. R. H. Rizvi
19 ! 02/04/2003 - Updated for Buoy obs. S. R. H. Rizvi
21 ! 02/10/2003 - Reviewed and modified for Profiler
22 ! and Buoy obs. Y.-R. Guo
23 ! 06/30/2006 - Updated for AIRS retrievals Syed RH Rizvi
24 ! 11/09/2006 - Updated for GPS RO Y.-R. Guo
26 !------------------------------------------------------------------------------
37 TYPE (field_type) :: synop
38 TYPE (field_type) :: ships
39 TYPE (field_type) :: buoys
40 TYPE (field_type) :: metar
41 TYPE (field_type) :: airep
42 TYPE (field_type) :: tamdar
43 TYPE (field_type) :: pilot
44 TYPE (field_type) :: profl
45 TYPE (field_type) :: sound
46 TYPE (field_type) :: satem
47 TYPE (field_type) :: satob
48 TYPE (field_type) :: gpspw
49 TYPE (field_type) :: ssmt1
50 TYPE (field_type) :: ssmt2
51 TYPE (field_type) :: ssmi
52 TYPE (field_type) :: tovs
53 TYPE (field_type) :: airs
54 TYPE (field_type) :: other
59 SUBROUTINE obs_err_afwa (filein,iunit,nobs_max, obs, number_of_obs)
61 !-------------------------------------------------------------------------------
71 CHARACTER (LEN=80) :: filein
73 INTEGER, INTENT (in) :: nobs_max
74 TYPE (report), INTENT (inout), DIMENSION (nobs_max) :: obs
75 TYPE (measurement ) , POINTER :: current
76 INTEGER, INTENT (in) :: number_of_obs
78 INTEGER :: loop_index, is_sound
79 INTEGER :: nvalids, nsoundings
80 INTEGER :: nsurfaces, nlevels
81 REAL :: pres, temp, error_rh
82 REAL :: t9, p9, rh9, qv9
88 CHARACTER (LEN=40) :: platform
90 CHARACTER (LEN=80) :: keyword
91 CHARACTER (LEN=80) :: endword
92 CHARACTER (LEN=80) :: fmt_err
94 CHARACTER (LEN= 5) :: bogus_type
96 TYPE (obs_type), DIMENSION (15) :: err
97 TYPE (obs_type), DIMENSION (26) :: err_wind
99 INCLUDE 'platform_interface.inc'
100 INCLUDE 'missing.inc'
101 INCLUDE 'constants.inc'
103 !------------------------------------------------------------------------------!
104 WRITE (UNIT = 0, FMT = '(A)') &
105 '------------------------------------------------------------------------------'
106 WRITE ( UNIT = 0, FMT = '(/,A,/)') '<AFWA> OBSERVATIONAL ERRORS PER TYPE:'
108 ! 1. LOAD OBSERVATIONAL ERROR FROM INPUT FILE
109 ! ===========================================
111 ! 1.1 INITIALISE PRESSURE LEVELS FOR HEIGHT, PRESSURE, TEMPERATURE AND RH
112 ! -------------------------------------------------------------------
114 ! Pressure levels in Pa
116 err ( 1) % level = 1000. * 100.
117 err ( 2) % level = 850. * 100.
118 err ( 3) % level = 700. * 100.
119 err ( 4) % level = 500. * 100.
120 err ( 5) % level = 400. * 100.
121 err ( 6) % level = 300. * 100.
122 err ( 7) % level = 250. * 100.
123 err ( 8) % level = 200. * 100.
124 err ( 9) % level = 150. * 100.
125 err (10) % level = 100. * 100.
126 err (11) % level = 70. * 100.
127 err (12) % level = 50. * 100.
128 err (13) % level = 30. * 100.
129 err (14) % level = 20. * 100.
130 err (15) % level = 10. * 100.
132 ! 1.2 INITIALISE PRESSURE LEVELS FOR WIND
133 ! -----------------------------------
135 ! Pressure levels in Pa
137 err_wind ( 1) % level = 1100. * 100.
138 err_wind ( 2) % level = 1050. * 100.
139 err_wind ( 3) % level = 1000. * 100.
140 err_wind ( 4) % level = 950. * 100.
141 err_wind ( 5) % level = 900. * 100.
142 err_wind ( 6) % level = 850. * 100.
143 err_wind ( 7) % level = 800. * 100.
144 err_wind ( 8) % level = 750. * 100.
145 err_wind ( 9) % level = 700. * 100.
146 err_wind (10) % level = 650. * 100.
147 err_wind (11) % level = 600. * 100.
148 err_wind (12) % level = 550. * 100.
149 err_wind (13) % level = 500. * 100.
150 err_wind (14) % level = 450. * 100.
151 err_wind (15) % level = 400. * 100.
152 err_wind (16) % level = 350. * 100.
153 err_wind (17) % level = 300. * 100.
154 err_wind (18) % level = 250. * 100.
155 err_wind (19) % level = 200. * 100.
156 err_wind (20) % level = 150. * 100.
157 err_wind (21) % level = 100. * 100.
158 err_wind (22) % level = 50. * 100.
159 err_wind (23) % level = 40. * 100.
160 err_wind (24) % level = 30. * 100.
161 err_wind (25) % level = 20. * 100.
162 err_wind (26) % level = 10. * 100.
164 ! 1.3 INITIALISE ERRORS TO NCEP VALUES FOR PRESSURE, TEMPERATURE AND RH
165 ! -----------------------------------------------------------------
171 err (i) % synop % height = intplin (err (i) % level, err_k (1:JPERR),&
173 err (i) % metar % height = intplin (err (i) % level, err_k (1:JPERR),&
175 err (i) % ships % height = intplin (err (i) % level, err_k (1:JPERR),&
177 err (i) % buoys % height = intplin (err (i) % level, err_k (1:JPERR),&
179 err (i) % sound % height = intplin (err (i) % level, err_k (1:JPERR),&
181 err (i) % pilot % height = intplin (err (i) % level, err_k (1:JPERR),&
183 err (i) % profl % height = intplin (err (i) % level, err_k (1:JPERR),&
185 err (i) % satem % height = intplin (err (i) % level, err_k (1:JPERR),&
187 err (i) % satob % height = intplin (err (i) % level, err_k (1:JPERR),&
189 err (i) % airep % height = intplin (err (i) % level, err_k (1:JPERR),&
191 err (i) % ssmt1 % height = intplin (err (i) % level, err_k (1:JPERR),&
193 err (i) % ssmt2 % height = intplin (err (i) % level, err_k (1:JPERR),&
195 err (i) % ssmi % height = intplin (err (i) % level, err_k (1:JPERR),&
197 err (i) % tovs % height = intplin (err (i) % level, err_k (1:JPERR),&
199 err (i) % airs % height = intplin (err (i) % level, err_k (1:JPERR),&
201 err (i) % other % height = intplin (err (i) % level, err_k (1:JPERR),&
205 err (i) % synop % pres = intplin (err (i) % level, err_k (1:JPERR),&
207 err (i) % metar % pres = intplin (err (i) % level, err_k (1:JPERR),&
209 err (i) % ships % pres = intplin (err (i) % level, err_k (1:JPERR),&
211 err (i) % buoys % pres = intplin (err (i) % level, err_k (1:JPERR),&
213 err (i) % sound % pres = intplin (err (i) % level, err_k (1:JPERR),&
215 err (i) % pilot % pres = intplin (err (i) % level, err_k (1:JPERR),&
217 err (i) % profl % pres = intplin (err (i) % level, err_k (1:JPERR),&
219 err (i) % satem % pres = intplin (err (i) % level, err_k (1:JPERR),&
221 err (i) % satob % pres = intplin (err (i) % level, err_k (1:JPERR),&
223 err (i) % airep % pres = intplin (err (i) % level, err_k (1:JPERR),&
225 err (i) % ssmt1 % pres = intplin (err (i) % level, err_k (1:JPERR),&
227 err (i) % ssmt2 % pres = intplin (err (i) % level, err_k (1:JPERR),&
229 err (i) % ssmi % pres = intplin (err (i) % level, err_k (1:JPERR),&
231 err (i) % tovs % pres = intplin (err (i) % level, err_k (1:JPERR),&
233 err (i) % airs % pres = intplin (err (i) % level, err_k (1:JPERR),&
235 err (i) % other % pres = intplin (err (i) % level, err_k (1:JPERR),&
240 err (i) % synop % temp = intplog (err (i) % level, err_k (1:JPERR), &
242 err (i) % metar % temp = intplog (err (i) % level, err_k (1:JPERR), &
244 err (i) % ships % temp = intplog (err (i) % level, err_k (1:JPERR), &
246 err (i) % buoys % temp = intplog (err (i) % level, err_k (1:JPERR), &
248 err (i) % sound % temp = intplog (err (i) % level, err_k (1:JPERR), &
250 err (i) % pilot % temp = intplog (err (i) % level, err_k (1:JPERR), &
252 err (i) % profl % temp = intplog (err (i) % level, err_k (1:JPERR), &
254 err (i) % satem % temp = intplog (err (i) % level, err_k (1:JPERR), &
256 err (i) % satob % temp = intplog (err (i) % level, err_k (1:JPERR), &
258 err (i) % airep % temp = intplog (err (i) % level, err_k (1:JPERR), &
260 err (i) % ssmt1 % temp = intplog (err (i) % level, err_k (1:JPERR), &
262 err (i) % ssmt2 % temp = intplog (err (i) % level, err_k (1:JPERR), &
264 err (i) % ssmi % temp = intplog (err (i) % level, err_k (1:JPERR), &
266 err (i) % tovs % temp = intplog (err (i) % level, err_k (1:JPERR), &
268 err (i) % airs % temp = intplog (err (i) % level, err_k (1:JPERR), &
270 err (i) % other % temp = intplog (err (i) % level, err_k (1:JPERR), &
272 ! Relative humidity error
274 err (i) % synop % rh = intplog (err (i) % level, err_k (1:JPERR), &
276 err (i) % metar % rh = intplog (err (i) % level, err_k (1:JPERR), &
278 err (i) % ships % rh = intplog (err (i) % level, err_k (1:JPERR), &
280 err (i) % buoys % rh = intplog (err (i) % level, err_k (1:JPERR), &
282 err (i) % sound % rh = intplog (err (i) % level, err_k (1:JPERR), &
284 err (i) % pilot % rh = intplog (err (i) % level, err_k (1:JPERR), &
286 err (i) % profl % rh = intplog (err (i) % level, err_k (1:JPERR), &
288 err (i) % satem % rh = intplog (err (i) % level, err_k (1:JPERR), &
290 err (i) % satob % rh = intplog (err (i) % level, err_k (1:JPERR), &
292 err (i) % airep % rh = intplog (err (i) % level, err_k (1:JPERR), &
294 err (i) % ssmt1 % rh = intplog (err (i) % level, err_k (1:JPERR), &
296 err (i) % ssmt2 % rh = intplog (err (i) % level, err_k (1:JPERR), &
298 err (i) % ssmi % rh = intplog (err (i) % level, err_k (1:JPERR), &
300 err (i) % tovs % rh = intplog (err (i) % level, err_k (1:JPERR), &
302 err (i) % airs % rh = intplog (err (i) % level, err_k (1:JPERR), &
304 err (i) % other % rh = intplog (err (i) % level, err_k (1:JPERR), &
309 ! 1.4 INITIALISE ERRORS TO NCEP VALUES FOR WIND
310 ! -----------------------------------------
316 err_wind (i) % synop % wind = intplin (err_wind (i) % level, &
317 err_k (1:JPERR),err_u (1:JPERR))
318 err_wind (i) % metar % wind = intplin (err_wind (i) % level, &
319 err_k (1:JPERR),err_u (1:JPERR))
320 err_wind (i) % ships % wind = intplin (err_wind (i) % level, &
321 err_k (1:JPERR),err_u (1:JPERR))
322 err_wind (i) % buoys % wind = intplin (err_wind (i) % level, &
323 err_k (1:JPERR),err_u (1:JPERR))
324 err_wind (i) % sound % wind = intplin (err_wind (i) % level, &
325 err_k (1:JPERR),err_u (1:JPERR))
326 err_wind (i) % pilot % wind = intplin (err_wind (i) % level, &
327 err_k (1:JPERR),err_u (1:JPERR))
328 err_wind (i) % profl % wind = intplin (err_wind (i) % level, &
329 err_k (1:JPERR),err_u (1:JPERR))
330 err_wind (i) % satem % wind = intplin (err_wind (i) % level, &
331 err_k (1:JPERR),err_u (1:JPERR))
332 err_wind (i) % satob % wind = intplin (err_wind (i) % level, &
333 err_k (1:JPERR),err_u (1:JPERR))
334 err_wind (i) % airep % wind = intplin (err_wind (i) % level, &
335 err_k (1:JPERR),err_u (1:JPERR))
336 err_wind (i) % ssmt1 % wind = intplin (err_wind (i) % level, &
337 err_k (1:JPERR),err_u (1:JPERR))
338 err_wind (i) % ssmt2 % wind = intplin (err_wind (i) % level, &
339 err_k (1:JPERR),err_u (1:JPERR))
340 err_wind (i) % ssmi % wind = intplin (err_wind (i) % level, &
341 err_k (1:JPERR),err_u (1:JPERR))
342 err_wind (i) % tovs % wind = intplin (err_wind (i) % level, &
343 err_k (1:JPERR),err_u (1:JPERR))
344 err_wind (i) % other % wind = intplin (err_wind (i) % level, &
345 err_k (1:JPERR),err_u (1:JPERR))
348 ! 1.5 HEIGHT OBSERVATIONAL ERROR
349 ! --------------------------
351 keyword = 'HEIGHT SENSOR ERRORS'
352 endword = 'WIND SENSOR ERRORS'
353 fmt_err = '(7(1X,F5.1))'
355 CALL read_obserr_height (iunit, filein, keyword, endword, fmt_err, err)
357 ! 1.6 WIND OBSERVATIONAL ERROR
358 ! ------------------------
360 keyword = 'WIND SENSOR ERRORS'
361 endword = 'TEMP SENSOR ERRORS'
362 fmt_err = '(7(1X,F5.1))'
363 CALL read_obserr_wind (iunit, filein, keyword, endword, fmt_err, err_wind)
365 ! 1.7 TEMPERATURE OBSERVATIONAL ERROR
366 ! -------------------------------
368 keyword = 'TEMP SENSOR ERRORS'
369 endword = 'RH SENSOR ERRORS ( % )'
370 fmt_err = '(5(1X,F5.1))'
372 CALL read_obserr_temp (iunit, filein, keyword, endword, fmt_err, err)
374 ! 1.8 RH OBSERVATIONAL ERROR
375 ! -------------------
377 keyword = 'RH SENSOR ERRORS ( % )'
378 endword = 'PRESSURE SENSOR ERRORS'
379 fmt_err = '(1X,5(1X,F5.2))'
381 CALL read_obserr_rh (iunit, filein, keyword, endword, fmt_err, err)
383 ! 1.9 PRESSURE OBSERVATIONAL ERROR
384 ! ----------------------------
386 keyword = 'PRESSURE SENSOR ERRORS'
388 fmt_err = '(5(1X,F5.1))'
390 CALL read_obserr_pres (iunit, filein, keyword, endword, fmt_err, err)
394 ! 2. LOOP OVER STATIONS
395 ! =====================
403 record: DO loop_index = 1, number_of_obs
406 ! 2.1 Check if record valid
407 ! ---------------------
409 record_valid: IF (obs(loop_index)%info%discard) THEN
415 ! 2.2 Count valid record
418 nvalids = nvalids + 1
420 ! 2.2 Type of observation
425 READ (obs (loop_index) % info % platform (4:6), '(I3)') fm
430 CALL fm_decoder (fm, platform)
431 if (fm == 135) bogus_type = obs (loop_index) % info % platform (8:12)
433 ! 2.3 2D fields observational error
434 ! -----------------------------
436 obs (loop_index) % ground % slp % error = 200. ! 2hPa
437 ! For TC bogus, slp error is obtained from psfc%data, name:"BOGUS" is not TC bogus:
438 IF (fm == 135 .and. bogus_type /= 'BOGUS') &
439 obs (loop_index) % ground % slp % error = obs (loop_index) % ground % psfc % data
441 ! Some PW or ZTD data are read with their errors, don't modify them
443 IF (obs (loop_index) % ground % pw % error .LE. 0.) THEN
444 obs (loop_index) % ground % pw % error = 0.2 ! 2. mm for GPSPW
446 ! the unit of ZTD is also cm, so the default error is 0.5 cm (YRG, 05/09/2008):
447 obs (loop_index) % ground % pw % error = 0.5 ! .5 cm for GP{SZTD
449 if (eps_equal(obs(loop_index)%ground %pw %data,missing_r,1.)) THEN
450 obs (loop_index) % ground % pw % qc = missing
453 obs (loop_index) % ground % pw % qc = 0 ! error assigned for SSMI
455 obs (loop_index) % ground % pw % qc = 1 ! error assigned.
460 obs (loop_index) % ground % tb19v % error = err (1) % ssmi % temp
461 obs (loop_index) % ground % tb19h % error = err (1) % ssmi % temp
462 obs (loop_index) % ground % tb22v % error = err (1) % ssmi % temp
463 obs (loop_index) % ground % tb37v % error = err (1) % ssmi % temp
464 obs (loop_index) % ground % tb37h % error = err (1) % ssmi % temp
465 obs (loop_index) % ground % tb85v % error = err (1) % ssmi % temp
466 obs (loop_index) % ground % tb85h % error = err (1) % ssmi % temp
468 ! SSMI Tb varies from 2 to 5 K from channel 19 to 85
470 obs (loop_index) % ground % tb19v % error = 1.00
471 obs (loop_index) % ground % tb19h % error = 1.00
472 obs (loop_index) % ground % tb22v % error = 2.33
473 obs (loop_index) % ground % tb37v % error = 3.66
474 obs (loop_index) % ground % tb37h % error = 3.66
475 obs (loop_index) % ground % tb85v % error = 5.00
476 obs (loop_index) % ground % tb85h % error = 5.00
479 ! 2.4 Initialise upper level pointer to surface level
480 ! -----------------------------------------------
482 current => obs (loop_index) % surface
484 ! 3. LOOP ON UPPER-AIR LEVELS (FIRST LEVEL IS SURFACE)
485 ! ====================================================
489 upper_level: DO WHILE (ASSOCIATED (current))
492 ! 3.1 Turn on the sounding flag and count the number of level
493 ! -------------------------------------------------------
495 is_sound = is_sound + 1
496 nlevels = nlevels + 1
501 pres = current%meas%pressure%data
503 hh = current%meas%height%data
505 ! 3.3 Check if pressure is present
506 ! ----------------------------
508 IF ((eps_equal (pres, missing_r, 1.)) .OR. &
509 (eps_equal (pres, 0., 1.))) THEN
511 WRITE (0,'(A,A,1X,A)') 'Internal error obs ', &
512 TRIM (obs (loop_index) % location % id), &
513 TRIM (obs (loop_index) % location % name)
514 WRITE (0,'(A,F12.3)') 'Pressure = ', pres
515 STOP 'in obs_err_afwa.F90.F'
520 ! 4. VERTICAL INTERPOLATION OF OBSERVATIONAL ERROR UPON OBSERVATION TYPE
521 ! =======================================================================
523 SELECT CASE (TRIM (platform))
528 ! CASE ('SYNOP','SYNOP MOBIL')
533 current % meas % direction % error = 5. ! 5 degree
535 current % meas % speed % error = intplin (pres, err_wind % level,&
536 err_wind % synop % wind)
537 current % meas % u % error = intplin (pres, err_wind % level, &
538 err_wind % synop % wind)
539 current % meas % v % error = intplin (pres, err_wind % level, &
540 err_wind % synop % wind)
544 current % meas % pressure % error = intplin (pres,err % level, &
549 current % meas % height % error = intplin (pres,err % level, &
550 err % synop % height)
553 current % meas % temperature % error = intplog (pres, err % level, &
555 ! Dew point as temperature
557 current % meas % dew_point % error = &
558 current % meas % temperature % error
562 current % meas % rh % error = intplog (pres, err % level, &
571 current % meas % direction % error = 5. ! 5 degree
572 current % meas % speed % error = intplin (pres, err_wind % level,&
573 err_wind % ships % wind)
574 current % meas % u % error = intplin (pres, err_wind % level, &
575 err_wind % ships % wind)
576 current % meas % v % error = intplin (pres, err_wind % level, &
577 err_wind % ships % wind)
581 current % meas % pressure % error = intplin (pres,err % level, &
586 current % meas % height % error = intplog (pres, err % level, &
587 err % ships % height)
591 current % meas % temperature % error = intplog (pres, err % level, &
594 ! Dew point as temperature
596 current % meas % dew_point % error = &
597 current % meas % temperature % error
601 current % meas % rh % error = intplog (pres, err % level, &
611 current % meas % direction % error = 5. ! 5 degree
612 current % meas % speed % error = intplin (pres, err_wind % level,&
613 err_wind % buoys % wind)
614 current % meas % u % error = intplin (pres, err_wind % level, &
615 err_wind % buoys % wind)
616 current % meas % v % error = intplin (pres, err_wind % level, &
617 err_wind % buoys % wind)
621 current % meas % pressure % error = intplin (pres,err % level, &
626 current % meas % height % error = intplog (pres, err % level, &
627 err % buoys % height)
631 current % meas % temperature % error = intplog (pres, err % level, &
634 ! Dew point as temperature
636 current % meas % dew_point % error = &
637 current % meas % temperature % error
641 current % meas % rh % error = intplog (pres, err % level, &
647 ! CASE ('METAR','SPECI')
652 current % meas % direction % error = 5. ! 5 degree
653 current % meas % speed % error = intplin (pres, err_wind % level,&
654 err_wind % metar % wind)
655 current % meas % u % error = intplin (pres, err_wind % level, &
656 err_wind% metar % wind)
657 current % meas % v % error = intplin (pres, err_wind % level, &
658 err_wind % metar % wind)
662 current % meas % pressure % error = intplin (pres,err % level, &
667 current % meas % height % error = intplog (pres, err % level, &
668 err % metar % height)
672 current % meas % temperature % error = intplog (pres, err % level, &
674 ! Dew point as temperature
676 current % meas % dew_point % error = &
677 current % meas % temperature % error
682 current % meas % rh % error = intplog (pres, err % level, &
688 ! CASE ('PILOT','PILOT SHIP','PILOT MOBIL')
693 current % meas % direction % error = 5. ! 5 degree
694 current % meas % speed % error = intplin (pres, err_wind % level,&
695 err_wind % pilot % wind)
696 current % meas % u % error = intplin (pres, err_wind % level, &
697 err_wind % pilot % wind)
698 current % meas % v % error = intplin (pres, err_wind % level, &
699 err_wind % pilot % wind)
702 current % meas % pressure % error = intplin (pres, err % level, &
707 current % meas % height % error = intplog (pres, err % level, &
708 err % pilot % height)
712 current % meas % temperature % error = intplog (pres,err % level, &
714 ! Dew point as temperature
716 current % meas % dew_point % error = &
717 current % meas % temperature % error
722 current % meas % rh % error = intplog (pres, err % level, &
732 current % meas % direction % error = 5. ! 5 degree
733 current % meas % speed % error = intplin (pres, err_wind % level,&
734 err_wind % profl % wind)
735 current % meas % u % error = intplin (pres, err_wind % level, &
736 err_wind % profl % wind)
737 current % meas % v % error = intplin (pres, err_wind % level, &
738 err_wind % profl % wind)
741 current % meas % pressure % error = intplin (pres, err % level, &
746 current % meas % height % error = intplog (pres, err % level, &
747 err % profl % height)
751 current % meas % temperature % error = intplog (pres,err % level, &
753 ! Dew point as temperature
755 current % meas % dew_point % error = &
756 current % meas % temperature % error
761 current % meas % rh % error = intplog (pres, err % level, &
766 ! CASE ('TEMP','TEMP SHIP','TEMP DROP','TEMP MOBIL')
771 current % meas % direction % error = 5. ! 5 degree
772 current % meas % speed % error = intplin (pres, err_wind % level,&
773 err_wind % sound % wind)
774 current % meas % u % error = intplin (pres, err_wind % level, &
775 err_wind % sound % wind)
776 current % meas % v % error = intplin (pres, err_wind % level, &
777 err_wind % sound % wind)
781 current % meas % pressure % error = intplin (pres, err % level, &
786 current % meas % height % error = intplog (pres, err % level, &
787 err % sound % height)
790 current % meas % temperature % error = intplog (pres,err % level, &
792 ! Dew point as temperature
794 current % meas % dew_point % error = &
795 current % meas % temperature % error
799 current % meas % rh % error = intplog (pres, err % level, &
803 ! 4.5.1 Bogus Sounding
811 current % meas % direction % error = 5. ! 5 degree
813 IF (bogus_type /= 'BOGUS') then
815 current % meas % speed % error = current % meas % u % data
817 current % meas % u % error = current % meas % u % data
819 current % meas % v % error = current % meas % v % data
821 current % meas % temperature % error = current % meas % dew_point % data
823 current % meas % dew_point % error = current % meas % temperature % error
825 current % meas % rh % error = current % meas % thickness % data
827 ! current % meas % pressure % error = intplin (pres, err % level, &
828 ! err % sound % pres)
830 ! current % meas % height % error = intplog (pres, err % level, &
831 ! err % sound % height)
834 current % meas % speed % error = intplin (pres, err_wind % level,&
835 err_wind % sound % wind)
836 current % meas % u % error = intplin (pres, err_wind % level, &
837 err_wind % sound % wind)
838 current % meas % v % error = intplin (pres, err_wind % level, &
839 err_wind % sound % wind)
843 current % meas % pressure % error = intplin (pres, err % level, &
848 current % meas % height % error = intplog (pres, err % level, &
849 err % sound % height)
852 current % meas % temperature % error = intplog (pres,err % level, &
854 ! Dew point as temperature
856 current % meas % dew_point % error = &
857 current % meas % temperature % error
861 current % meas % rh % error = intplog (pres, err % level, &
873 current % meas % direction % error = 5. ! 5 degree
874 current % meas % speed % error = intplin (pres, err_wind % level,&
875 err_wind % satem % wind)
876 current % meas % u % error = intplin (pres, err_wind % level, &
877 err_wind % satem % wind)
878 current % meas % v % error = intplin (pres, err_wind % level, &
879 err_wind % satem % wind)
882 current % meas % pressure % error = intplin (pres, err % level, &
887 current % meas % height % error = intplog (pres, err % level, &
888 err % satem % height)
890 current % meas % thickness % error = intplog (pres, err % level, &
891 err % satem % height)
893 obs (loop_index) % ground % pw % error = intplog ( &
894 obs(loop_index)%ground%ref_pres%data, &
895 err % level, err % satem % height)
899 current % meas % temperature % error = intplog (pres, err % level, &
902 ! Dew point as temperature
904 current % meas % dew_point % error = &
905 current % meas % temperature % error
909 current % meas % rh % error = intplog (pres, err % level, &
921 current % meas % direction % error = 5. ! 5 degree
922 current % meas % speed % error = intplin (pres, err_wind % level,&
923 err_wind % satob % wind)
924 current % meas % u % error = intplin (pres, err_wind % level, &
925 err_wind % satob % wind)
926 current % meas % v % error = intplin (pres, err_wind % level, &
927 err_wind % satob % wind)
931 current % meas % pressure % error = intplin (pres, err % level, &
936 current % meas % height % error = intplog (pres, err % level, &
937 err % satob % height)
941 current % meas % temperature % error = intplog (pres, err % level, &
944 ! Dew point as temperature
946 current % meas % dew_point % error = &
947 current % meas % temperature % error
951 current % meas % rh % error = intplog (pres, err % level, &
958 CASE ('AIREP','AMDAR','TAMDAR')
962 current % meas % direction % error = 5. ! 5 degree
963 current % meas % speed % error = intplin (pres, err_wind % level,&
964 err_wind % airep % wind)
965 current % meas % u % error = intplin (pres, err_wind % level, &
966 err_wind % airep % wind)
967 current % meas % v % error = intplin (pres, err_wind % level, &
968 err_wind % airep % wind)
972 current % meas % pressure % error = intplin (pres, err % level, &
977 current % meas % height % error = intplog (pres, err % level, &
978 err % airep % height)
982 current % meas % temperature % error = intplog (pres, err % level, &
984 ! Dew point as temperature
986 current % meas % dew_point % error = &
987 current % meas % temperature % error
991 current % meas % rh % error = intplog (pres, err % level, &
1002 current % meas % direction % error = 5. ! 5 degree
1003 current % meas % speed % error = intplin (pres, err_wind % level,&
1004 err_wind % ssmt1 % wind)
1005 current % meas % u % error = intplin (pres, err_wind % level, &
1006 err_wind % ssmt1 % wind)
1007 current % meas % v % error = intplin (pres, err_wind % level, &
1008 err_wind % ssmt1 % wind)
1012 current % meas % pressure % error = intplin (pres, err % level, &
1017 current % meas % rh % error = intplog (pres, err % level, &
1018 err % ssmt1 % height)
1022 current % meas % temperature % error = intplog (pres, err % level, &
1024 ! Dew point as temperature
1026 current % meas % dew_point % error = &
1027 current % meas % temperature % error
1031 current % meas % rh % error = intplog (pres, err % level, &
1043 current % meas % direction % error = 5. ! 5 degree
1044 current % meas % speed % error = intplin (pres, err_wind % level,&
1045 err_wind % ssmt2 % wind)
1046 current % meas % u % error = intplin (pres, err_wind % level, &
1047 err_wind % ssmt2 % wind)
1048 current % meas % v % error = intplin (pres, err_wind % level, &
1049 err_wind % ssmt2 % wind)
1053 current % meas % pressure % error = intplin (pres, err % level, &
1058 current % meas % rh % error = intplog (pres, err % level, &
1059 err % ssmt2 % height)
1063 current % meas % temperature % error = intplog (pres, err % level, &
1065 ! Dew point as temperature
1067 current % meas % dew_point % error = &
1068 current % meas % temperature % error
1072 current % meas % rh % error = intplog (pres, err % level, &
1084 current % meas % direction % error = 5. ! 5 degree
1086 ! SSMI wind speed can come with its own error
1088 IF (current % meas % speed % error .LE. 0.) &
1089 current % meas % speed % error = intplin (pres, err_wind % level,&
1090 err_wind % ssmi % wind)
1091 current % meas % u % error = intplin (pres, err_wind % level, &
1092 err_wind % ssmi % wind)
1093 current % meas % v % error = intplin (pres, err_wind % level, &
1094 err_wind % ssmi % wind)
1098 current % meas % pressure % error = intplin (pres, err % level, &
1103 current % meas % height % error = intplog (pres, err % level, &
1104 err % ssmi % height)
1108 current % meas % temperature % error = intplog (pres, err % level, &
1110 ! Dew point as temperature
1112 current % meas % dew_point % error = &
1113 current % meas % temperature % error
1117 current % meas % rh % error = intplog (pres, err % level, &
1129 current % meas % direction % error = 5. ! 5 degree
1130 current % meas % speed % error = intplin (pres, err_wind % level,&
1131 err_wind % tovs % wind)
1132 current % meas % u % error = intplin (pres, err_wind % level, &
1133 err_wind % tovs % wind)
1134 current % meas % v % error = intplin (pres, err_wind % level, &
1135 err_wind % tovs % wind)
1139 current % meas % pressure % error = intplin (pres, err % level, &
1144 current % meas % height % error = intplog (pres, err % level, &
1145 err % tovs % height)
1149 current % meas % temperature % error = intplog (pres, err % level, &
1151 ! Dew point as temperature
1153 current % meas % dew_point % error = &
1154 current % meas % temperature % error
1158 current % meas % rh % error = intplog (pres, err % level, &
1169 current % meas % direction % error = current % meas % v % data
1170 current % meas % speed % error = current % meas % u % data
1172 current % meas % u % error = intplin (pres, err_wind % level, &
1173 err_wind % tovs % wind)
1174 current % meas % v % error = intplin (pres, err_wind % level, &
1175 err_wind % tovs % wind)
1179 current % meas % pressure % error = intplin (pres, err % level, &
1184 current % meas % height % error = intplog (pres, err % level, &
1185 err % tovs % height)
1189 current % meas % temperature % error = intplog (pres, err % level, &
1191 ! Dew point as temperature
1193 current % meas % dew_point % error = &
1194 current % meas % temperature % error
1198 current % meas % rh % error = intplog (pres, err % level, &
1201 ! 4.14 GPSRF, GPSEP (like SSMT/1)
1204 CASE ('GPSRF', 'GPSEP')
1208 current % meas % direction % error = 5. ! 5 degree
1209 current % meas % speed % error = intplin (pres,err_wind % level,&
1210 err_wind % ssmt1 % wind)
1211 current % meas % u % error = intplin (pres, err_wind % level, &
1212 err_wind % ssmt1 % wind)
1213 current % meas % v % error = intplin (pres, err_wind % level, &
1214 err_wind % ssmt1 % wind)
1218 current % meas % pressure % error = intplin (pres, err % level, &
1223 current % meas % height % error = intplog (pres, err % level, &
1224 err % ssmt1 % height)
1228 current % meas % temperature % error = intplog (pres, err % level, &
1231 ! Refractivity (the 'dew point' is used to store the refractivity)
1233 latt = abs(current % meas % u % data)
1235 ! Refractivity (the 'dew point' is used to store the ref_obs)
1236 rr =(current % meas % dew_point % data) *0.01
1238 if ( hh >= ha ) then
1239 current % meas % dew_point % error =rr*ea
1241 erh90 = (ea-ed)*(hh-ha)/(ha-hd)+ea
1243 erh0 = (ea-eb)*(hh-ha)/(ha-hb)+ea
1244 else if (hh >=hc) then
1245 erh0 = (eb-ec)*(hh-hb)/(hb-hc)+eb
1253 current % meas % dew_point % error =err90-(1-(abs(latt))/90)*(err90-err0)
1258 current % meas % rh % error = intplog (pres, err % level, &
1261 ! 4.15 AIRS (like SSMT/1)
1268 current % meas % pressure % error = intplin (pres, err % level, &
1273 current % meas % height % error = intplog (pres, err % level, &
1274 err % airs % height)
1278 current % meas % temperature % error = intplog (pres, err % level, &
1283 current % meas % rh % error = intplog (pres, err % level, &
1289 ! 4.13 Others, use ncep values
1290 ! -----------------------
1294 WRITE (UNIT = 0, FMT = '(A,A,A)') &
1295 'Unknown platform:',TRIM (platform),' use NCEP observational errors.'
1300 current % meas % direction % error = 5. ! 5 degree
1301 current % meas % speed % error = intplin (pres, err_k (1:JPERR), &
1303 current % meas % u % error = intplin (pres, err_k (1:JPERR), &
1305 current % meas % v % error = intplin (pres, err_k (1:JPERR), &
1309 current % meas % pressure % error = intplin (pres, err_k (1:JPERR), &
1314 current % meas % rh % error = intplog (pres, err_k (1:JPERR), &
1319 current % meas % height % error = intplin (pres, err_k (1:JPERR), &
1324 current % meas % temperature % error = intplog (pres, err_k (1:JPERR),&
1327 ! Dew point as temperature
1329 current % meas % dew_point % error = current % meas % temperature % error
1336 ! 5. MIXING RATIO ERROR DERIVED FROM RELATIVE HUMIDITY, TEMPERATURE, AND
1338 ! =====================================================
1340 IF ((.NOT.eps_equal (current % meas % pressure % data,missing_r,1.)) .AND.&
1341 (.NOT.eps_equal (current % meas % temperature % data,missing_r,1.)).AND.&
1342 (.NOT.eps_equal (current % meas % rh % data, missing_r, 1.))) THEN
1344 ! current % meas % qv % error = E_QV_FROM_RH (current % meas % rh % error, &
1345 ! current % meas % temperature % error, &
1346 ! current % meas % pressure % error, &
1347 ! current % meas % rh % data, &
1348 ! current % meas % temperature % data, &
1349 ! current % meas % pressure % data)
1351 ! current % meas % qv % error = MAX (current % meas % qv % error, 0.001)
1353 p9 = current % meas % pressure % data / 100
1354 p = current % meas % pressure % error / 100
1355 t9 = current % meas % temperature % data
1356 t = current % meas % temperature % error
1357 rh9 = current % meas % rh % data
1358 rh = current % meas % rh % error
1360 es9 = 6.112 * EXP (17.67*(t9-273.15) &
1363 * EXP ( 17.67*(t9-273.15) / (t9-273.15+243.5) ) &
1364 * (+17.67* t / (t9-273.15+243.5) &
1365 -17.67*(t9-273.15) / ((t9-273.15+243.5)*(t9-273.15+243.5)))
1367 qs9 = 0.622 * es9 / (p9-es9)
1368 qs = 0.622 * es / (p9-es9) &
1369 - 0.622 * es9 * (p -es ) / ((p9-es9)*(p9-es9))
1372 qv = 0.01*rh *qs9 + 0.01*rh9 *qs
1374 ! Error should not be lower than 1g/kg
1376 current % meas % qv % error = MAX (qv, 0.001)
1380 current % meas % qv % error = missing_r
1385 ! IF (eps_equal (current % meas % temperature % data,missing_r,1.))
1386 ! temp = t_from_p_icao (p)
1388 ! temp = current % meas % temperature % data
1391 ! current % meas % qv % error = F_QV_FROM_RH &
1392 ! (current % meas % rh % error, temp,&
1393 ! current % meas % pressure % data)
1395 ! 6. GO TOP NEXT LEVEL
1396 ! =====================
1398 current => current%next
1403 ! 7. GO TO NEXT STATIONS
1404 ! =======================
1406 ! 7.1 Increment the surface or sounding counter
1407 ! -----------------------------------------
1409 if (is_sound .gt. 0) then
1410 nsoundings = nsoundings + 1
1412 nsurfaces = nsurfaces + 1
1415 ! 7.2 Go to next valid record
1416 ! -----------------------
1420 ! 7.3 Go to next record
1425 ! 8. PRINT DIAGNOSTIC
1426 ! ====================
1428 WRITE (UNIT = 0 , FMT = '(A)' ) ' '
1429 WRITE (UNIT = 0 , FMT = '(A,I6,A,I6,A)' ) &
1430 "Number of processed stations: ",nvalids,&
1431 " = ",nlevels," levels."
1432 WRITE (UNIT = 0 , FMT = '(A,I6,A,I6,A)' ) &
1433 "Number of processed surface stations: ",nsurfaces,&
1434 " = ",nsurfaces," surface levels."
1435 WRITE (UNIT = 0 , FMT = '(A,I6,A,I6,A,/)' ) &
1436 "Number of processed upper-air stations: ",nsoundings,&
1437 " = ",nlevels-nsurfaces," upper-air levels."
1443 END SUBROUTINE obs_err_afwa
1445 SUBROUTINE READ_OBSERR_HEIGHT (iunit, filein, keyword, endword, fmt_err, err)
1446 !------------------------------------------------------------------------------!
1448 ! Read height observational error defined on the following 15 levels (in hPa):
1450 ! 1000, 850, 700, 500, 400,
1451 ! 300, 250, 200, 150, 100,
1452 ! 70, 50, 30, 20, 10
1454 !------------------------------------------------------------------------------!
1456 !------------------------------------------------------------------------------!
1458 INTEGER :: iunit != 99
1459 CHARACTER (LEN=80) :: filein != 'obserr.txt'
1460 CHARACTER (LEN=80) :: keyword != 'HEIGHT SENSOR ERRORS'
1461 CHARACTER (LEN=80) :: endword != 'WIND SENSOR ERRORS'
1462 CHARACTER (LEN=80) :: fmt_err != '(5(1X,F5.1))'
1463 TYPE (obs_type), DIMENSION (15) :: err
1465 INTEGER :: io_error, i
1466 CHARACTER (LEN=80) :: line1, line2, line3, line4
1467 LOGICAL :: found, wind
1468 CHARACTER (LEN=80) :: fileout
1470 !------------------------------------------------------------------------------!
1472 ! 1. OPEN INPUT FILE
1473 ! ===================
1475 OPEN (UNIT = iunit , FILE = filein , FORM = 'FORMATTED' , &
1476 ACTION = 'READ' , STATUS = 'OLD', IOSTAT = io_error)
1478 IF (io_error .NE. 0) THEN
1479 WRITE (UNIT = 0, FMT = '(/,A,A,/)') &
1480 'Unable to open input observational error file ',TRIM (filein)
1488 ! Read file until keyword is found
1494 DO WHILE (io_error .EQ. 0.)
1498 READ (UNIT = iunit, IOSTAT = io_error, FMT = '(A)') line1
1500 ! Exit when error or at end of file
1502 IF (io_error .NE. 0) EXIT
1504 ! Winds are given over 4 lines, any other data are given over 3 lines
1506 IF (TRIM (obstype (line1)) .EQ. 'WIND SENSOR ERRORS') THEN
1510 ! Winds ends at temperature,
1512 ELSE IF (TRIM (obstype (line1)) .EQ. 'TEMP SENSOR ERRORS') THEN
1518 READ (UNIT = iunit, IOSTAT = io_error, FMT = '(A)') line2
1519 READ (UNIT = iunit, IOSTAT = io_error, FMT = '(A)') line3
1521 READ (UNIT = iunit, IOSTAT = io_error, FMT = '(A)') line4
1523 ! If temp obstype is found, read error data
1525 IF (TRIM (obstype (line1)) .EQ. TRIM (keyword)) THEN
1528 WRITE (UNIT = 0, FMT = '(A,A)',ADVANCE='no') &
1529 TRIM (obstype (line1)),': '
1531 ELSE IF (((TRIM (obstype (line1)) .EQ. TRIM (endword)) .OR. &
1532 (line1 (1:2) .EQ. '*.'))) THEN
1538 ! If temp obstype is not found, keep on reading
1540 IF (.NOT. found) CYCLE
1542 ! Keyword has been found, Error at mandatory pressure levels follow
1543 ! Break down data upon obs type
1546 SELECT CASE (TRIM (sensor (line1)))
1549 CASE ('RAOBS') ! Sound
1551 WRITE (UNIT = 0, FMT = '(1X,2A)', ADVANCE='no') &
1552 TRIM (sensor (line1)),','
1554 READ (line1, fmt_err) (err (i) % sound % height, i = 1, 5)
1555 READ (line2, fmt_err) (err (i) % sound % height, i = 6, 10)
1556 READ (line3, fmt_err) (err (i) % sound % height, i = 11, 15)
1558 CASE ('PIBALS') ! Pilot
1560 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
1561 TRIM (sensor (line1)),','
1563 READ (line1, fmt_err) (err (i) % pilot % height, i = 1, 5)
1564 READ (line2, fmt_err) (err (i) % pilot % height, i = 6, 10)
1565 READ (line3, fmt_err) (err (i) % pilot % height, i = 11, 15)
1567 CASE ('AIREPS') ! AIREPS
1569 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
1570 TRIM (sensor (line1)),','
1572 READ (line1, fmt_err) (err (i) % airep % height, i = 1, 5)
1573 READ (line2, fmt_err) (err (i) % airep % height, i = 6, 10)
1574 READ (line3, fmt_err) (err (i) % airep % height, i = 11, 15)
1576 CASE ('AIRSRET') ! AIRS retrievals
1578 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
1579 TRIM (sensor (line1)),','
1581 READ (line1, fmt_err) (err (i) % airs % height, i = 1, 5)
1582 READ (line2, fmt_err) (err (i) % airs % height, i = 6, 10)
1583 READ (line3, fmt_err) (err (i) % airs % height, i = 11, 15)
1585 CASE ('SURFACE LAND') ! synop and metar
1587 READ (line1, fmt_err) (err (i) % synop % height, i = 1, 5)
1588 READ (line2, fmt_err) (err (i) % synop % height, i = 6, 10)
1589 READ (line3, fmt_err) (err (i) % synop % height, i = 11, 15)
1591 READ (line1, fmt_err) (err (i) % metar % height, i = 1, 5)
1592 READ (line2, fmt_err) (err (i) % metar % height, i = 6, 10)
1593 READ (line3, fmt_err) (err (i) % metar % height, i = 11, 15)
1595 CASE ('SURFACE SHIP') ! ships
1597 WRITE (UNIT = 0, FMT = '(1X,2A)', ADVANCE='no') &
1598 TRIM (sensor (line1)),','
1600 READ (line1, fmt_err) (err (i) % ships % height, i = 1, 5)
1601 READ (line2, fmt_err) (err (i) % ships % height, i = 6, 10)
1602 READ (line3, fmt_err) (err (i) % ships % height, i = 11, 15)
1604 CASE ('BUOY') ! BUOY
1606 WRITE (UNIT = 0, FMT = '(1X,2A)', ADVANCE='no') &
1607 TRIM (sensor (line1)),','
1609 READ (line1, fmt_err) (err (i) % buoys % height, i = 1, 5)
1610 READ (line2, fmt_err) (err (i) % buoys % height, i = 6, 10)
1611 READ (line3, fmt_err) (err (i) % buoys % height, i = 11, 15)
1613 CASE ('NOAA - A RETRIEVAL') ! Satob and Satem
1615 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
1616 TRIM (sensor (line1)),','
1618 READ (line1, fmt_err) (err (i) % satob % height, i = 1, 5)
1619 READ (line2, fmt_err) (err (i) % satob % height, i = 6, 10)
1620 READ (line3, fmt_err) (err (i) % satob % height, i = 11, 15)
1622 ! READ (line1, fmt_err) (err (i) % satem % height, i = 1, 5)
1623 ! READ (line2, fmt_err) (err (i) % satem % height, i = 6, 10)
1624 ! READ (line3, fmt_err) (err (i) % satem % height, i = 11, 15)
1626 CASE ('NOAA - CLEAR PATH RETRIEVAL') ! Satem clear path
1628 ! WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
1629 WRITE (UNIT = 0, FMT = '(1X,2A)') &
1630 TRIM (sensor (line1)),','
1632 READ (line1, fmt_err) (err (i) % satem % height, i = 1, 5)
1633 READ (line2, fmt_err) (err (i) % satem % height, i = 6, 10)
1634 READ (line3, fmt_err) (err (i) % satem % height, i = 11, 15)
1636 CASE ('DMSP - A RETRIEVAL') ! ssmt1, ssmt2, ssmi and tovs
1638 ! WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
1639 WRITE (UNIT = 0, FMT = '(1X,2A)') &
1640 TRIM (sensor (line1)),','
1642 READ (line1, fmt_err) (err (i) % ssmt1 % height, i = 1, 5)
1643 READ (line2, fmt_err) (err (i) % ssmt1 % height, i = 6, 10)
1644 READ (line3, fmt_err) (err (i) % ssmt1 % height, i = 11, 15)
1646 READ (line1, fmt_err) (err (i) % ssmt2 % height, i = 1, 5)
1647 READ (line2, fmt_err) (err (i) % ssmt2 % height, i = 6, 10)
1648 READ (line3, fmt_err) (err (i) % ssmt2 % height, i = 11, 15)
1650 READ (line1, fmt_err) (err (i) % ssmi % height, i = 1, 5)
1651 READ (line2, fmt_err) (err (i) % ssmi % height, i = 6, 10)
1652 READ (line3, fmt_err) (err (i) % ssmi % height, i = 11, 15)
1654 READ (line1, fmt_err) (err (i) % tovs % height, i = 1, 5)
1655 READ (line2, fmt_err) (err (i) % tovs % height, i = 6, 10)
1656 READ (line3, fmt_err) (err (i) % tovs % height, i = 11, 15)
1658 CASE ('PROFL') ! Profilers
1660 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
1661 TRIM (sensor (line1)),','
1663 READ (line1, fmt_err) (err (i) % profl % height, i = 1, 5)
1664 READ (line2, fmt_err) (err (i) % profl % height, i = 6, 10)
1665 READ (line3, fmt_err) (err (i) % profl % height, i = 11, 15)
1668 CASE DEFAULT ! Other
1670 ! WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
1671 ! TRIM (sensor (line1)),','
1673 READ (line1, fmt_err) (err (i) % other % height, i = 1, 5)
1674 READ (line2, fmt_err) (err (i) % other % height, i = 6, 10)
1675 READ (line3, fmt_err) (err (i) % other % height, i = 11, 15)
1681 WRITE (UNIT = 0, FMT = '(A)') ' '
1683 ! If obs type is not found, print it
1685 IF (.NOT. found) THEN
1686 WRITE (UNIT = 0, FMT = '(/,A,A)') &
1687 ' Observational errors for ',TRIM (keyword)
1688 WRITE (UNIT = 0, FMT = '(A,A,/)') &
1689 ' were not found in file ', TRIM (filein)
1693 ! 3. CLOSE INPUT FILE
1694 ! ====================
1696 CLOSE (UNIT = iunit)
1701 fileout = keyword (1:6)//'.txt'
1703 OPEN (UNIT = iunit , FILE = fileout , FORM = 'FORMATTED' , &
1704 ACTION = 'WRITE' , STATUS = 'REPLACE', IOSTAT = io_error)
1706 IF (io_error .NE. 0) THEN
1707 WRITE (UNIT = 0, FMT = '(/,A,A,/)') &
1708 'Unable to open output observational error file ',TRIM (fileout)
1713 WRITE (UNIT = iunit, FMT = '(20X,A)') TRIM (keyword)
1715 WRITE (UNIT = iunit, FMT = '(1X,16A)') ' level',&
1716 ' synop ',' ship ',' buoy ',' metar ',' pilot ',' profl ',&
1717 ' sound ',' satem ',' satob ',' airep ',&
1718 ' ssmt1 ',' ssmt2 ',' tovs ',' ssmi ',' airsret',&
1722 WRITE (UNIT = iunit, FMT = '(F6.0,15(2X,F5.1))') &
1723 err (i) % level / 100., &
1724 err (i) % synop % height, &
1725 err (i) % ships % height, &
1726 err (i) % buoys % height, &
1727 err (i) % metar % height, &
1728 err (i) % pilot % height, &
1729 err (i) % profl % height, &
1730 err (i) % sound % height, &
1731 err (i) % satem % height, &
1732 err (i) % satob % height, &
1733 err (i) % airep % height, &
1734 err (i) % ssmt1 % height, &
1735 err (i) % ssmt2 % height, &
1736 err (i) % tovs % height, &
1737 err (i) % ssmi % height, &
1738 err (i) % airs % height, &
1739 err (i) % other % height
1743 CLOSE (UNIT = iunit)
1745 END SUBROUTINE READ_OBSERR_HEIGHT
1747 SUBROUTINE READ_OBSERR_WIND (iunit, filein, keyword, endword, fmt_err, err)
1748 !------------------------------------------------------------------------------!
1750 ! Read wind obsevational error defined on the following 26 pressure levels
1753 ! 10, 20, 30, 40, 50, 100, 150,
1754 ! 200, 250, 300, 350, 400, 450, 500,
1755 ! 550, 600, 650, 700, 750, 800, 850,
1756 ! 900, 950, 1000, 1050, 1100, xxxx, yyyy
1758 ! The last two values are place holders.
1760 !------------------------------------------------------------------------------!
1762 !------------------------------------------------------------------------------!
1764 INTEGER :: iunit != 99
1765 CHARACTER (LEN=80) :: filein != 'obserr.txt'
1766 CHARACTER (LEN=80) :: keyword != 'WIND SENSOR ERRORS'
1767 CHARACTER (LEN=80) :: endword != 'TEMP SENSOR ERRORS'
1768 CHARACTER (LEN=80) :: fmt_err != '(7(1X,F5.1))'
1769 TYPE (obs_type), DIMENSION (26) :: err
1771 INTEGER :: io_error, i
1772 CHARACTER (LEN=80) :: line1, line2, line3, line4
1773 LOGICAL :: found, wind
1774 CHARACTER (LEN=80) :: fileout
1777 !------------------------------------------------------------------------------!
1779 ! 1. OPEN INPUT FILE
1780 ! ===================
1782 OPEN (UNIT = iunit , FILE = filein , FORM = 'FORMATTED' , &
1783 ACTION = 'READ' , STATUS = 'OLD', IOSTAT = io_error)
1785 IF (io_error .NE. 0) THEN
1786 WRITE (UNIT = 0, FMT = '(/,A,A,/)') &
1787 'Unable to open input observational error file ',TRIM (filein)
1795 ! Read file until keyword is found
1800 DO WHILE (io_error .EQ. 0.)
1802 ! Read 4 line record
1804 READ (UNIT = iunit, IOSTAT = io_error, FMT = '(A)') line1
1805 ! Exit when error or at end of file
1807 IF (io_error .NE. 0) EXIT
1809 ! Winds are given over 4 lines, any other data are given over 3 lines
1811 IF (TRIM (obstype (line1)) .EQ. 'WIND SENSOR ERRORS') THEN
1815 ! Winds ends at temperature,
1817 ELSE IF (TRIM (obstype (line1)) .EQ. 'TEMP SENSOR ERRORS') THEN
1823 READ (UNIT = iunit, IOSTAT = io_error, FMT = '(A)') line2
1824 READ (UNIT = iunit, IOSTAT = io_error, FMT = '(A)') line3
1826 READ (UNIT = iunit, IOSTAT = io_error, FMT = '(A)') line4
1828 ! If wind obstype is found, read error data
1830 IF (TRIM (obstype (line1)) .EQ. TRIM (keyword)) THEN
1834 WRITE (UNIT = 0, FMT = '(/,A,A)', ADVANCE = 'no') &
1835 TRIM (obstype (line1)),': '
1837 ELSE IF (((TRIM (obstype (line1)) .EQ. TRIM (endword)) .OR. &
1838 (line1 (1:2) .EQ. '*.'))) THEN
1844 ! If wind obstype is not found, keep on reading
1846 IF (.NOT. found) CYCLE
1848 ! Keyword has been found, Error at mandatory pressure levels follow
1849 ! Break down data upon obs type
1851 SELECT CASE (TRIM (sensor (line1)))
1853 CASE ('RAOBS') ! Sound, synop, metar and ships
1855 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
1856 TRIM (sensor (line1)),','
1858 READ (line1, fmt_err) (err (i) % sound % wind, i = 26, 20,-1)
1859 READ (line2, fmt_err) (err (i) % sound % wind, i = 19, 13,-1)
1860 READ (line3, fmt_err) (err (i) % sound % wind, i = 12, 6,-1)
1861 READ (line4, fmt_err) (err (i) % sound % wind, i = 5, 1,-1), &
1864 READ (line1, fmt_err) (err (i) % synop % wind, i = 26, 20,-1)
1865 READ (line2, fmt_err) (err (i) % synop % wind, i = 19, 13,-1)
1866 READ (line3, fmt_err) (err (i) % synop % wind, i = 12, 6,-1)
1867 READ (line4, fmt_err) (err (i) % synop % wind, i = 5, 1,-1), &
1870 READ (line1, fmt_err) (err (i) % ships % wind, i = 26, 20,-1)
1871 READ (line2, fmt_err) (err (i) % ships % wind, i = 19, 13,-1)
1872 READ (line3, fmt_err) (err (i) % ships % wind, i = 12, 6,-1)
1873 READ (line4, fmt_err) (err (i) % ships % wind, i = 5, 1,-1), &
1876 READ (line1, fmt_err) (err (i) % metar % wind, i = 26, 20,-1)
1877 READ (line2, fmt_err) (err (i) % metar % wind, i = 19, 13,-1)
1878 READ (line3, fmt_err) (err (i) % metar % wind, i = 12, 6,-1)
1879 READ (line4, fmt_err) (err (i) % metar % wind, i = 5, 1,-1), &
1883 CASE ('PIBALS') ! Pilot
1885 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
1886 TRIM (sensor (line1)),','
1888 READ (line1, fmt_err) (err (i) % pilot % wind, i = 26, 20,-1)
1889 READ (line2, fmt_err) (err (i) % pilot % wind, i = 19, 13,-1)
1890 READ (line3, fmt_err) (err (i) % pilot % wind, i = 12, 6,-1)
1891 READ (line4, fmt_err) (err (i) % pilot % wind, i = 5, 1,-1), &
1895 CASE ('PROFL') ! Profilers
1897 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
1898 TRIM (sensor (line1)),','
1900 READ (line1, fmt_err) (err (i) % profl % wind, i = 26, 20,-1)
1901 READ (line2, fmt_err) (err (i) % profl % wind, i = 19, 13,-1)
1902 READ (line3, fmt_err) (err (i) % profl % wind, i = 12, 6,-1)
1903 READ (line4, fmt_err) (err (i) % profl % wind, i = 5, 1,-1), &
1907 CASE ('BUOY') ! BUOY
1909 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
1910 TRIM (sensor (line1)),','
1912 READ (line1, fmt_err) (err (i) % buoys % wind, i = 26, 20,-1)
1913 READ (line2, fmt_err) (err (i) % buoys % wind, i = 19, 13,-1)
1914 READ (line3, fmt_err) (err (i) % buoys % wind, i = 12, 6,-1)
1915 READ (line4, fmt_err) (err (i) % buoys % wind, i = 5, 1,-1), &
1918 CASE ('US LOW LEVEL WINDS') ! Satobs and Satem ssmt1, ssmt2, ssmi, tovs
1920 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
1921 TRIM (sensor (line1)),','
1923 READ (line1, fmt_err) (err (i) % satob % wind, i = 26, 20,-1)
1924 READ (line2, fmt_err) (err (i) % satob % wind, i = 19, 13,-1)
1925 READ (line3, fmt_err) (err (i) % satob % wind, i = 12, 6,-1)
1926 READ (line4, fmt_err) (err (i) % satob % wind, i = 5, 1,-1), &
1929 READ (line1, fmt_err) (err (i) % satem % wind, i = 26, 20,-1)
1930 READ (line2, fmt_err) (err (i) % satem % wind, i = 19, 13,-1)
1931 READ (line3, fmt_err) (err (i) % satem % wind, i = 12, 6,-1)
1932 READ (line4, fmt_err) (err (i) % satem % wind, i = 5, 1,-1), &
1935 READ (line1, fmt_err) (err (i) % ssmt1 % wind, i = 26, 20,-1)
1936 READ (line2, fmt_err) (err (i) % ssmt1 % wind, i = 19, 13,-1)
1937 READ (line3, fmt_err) (err (i) % ssmt1 % wind, i = 12, 6,-1)
1938 READ (line4, fmt_err) (err (i) % ssmt1 % wind, i = 5, 1,-1), &
1941 READ (line1, fmt_err) (err (i) % ssmt2 % wind, i = 26, 20,-1)
1942 READ (line2, fmt_err) (err (i) % ssmt2 % wind, i = 19, 13,-1)
1943 READ (line3, fmt_err) (err (i) % ssmt2 % wind, i = 12, 6,-1)
1944 READ (line4, fmt_err) (err (i) % ssmt2 % wind, i = 5, 1,-1), &
1947 READ (line1, fmt_err) (err (i) % ssmi % wind, i = 26, 20,-1)
1948 READ (line2, fmt_err) (err (i) % ssmi % wind, i = 19, 13,-1)
1949 READ (line3, fmt_err) (err (i) % ssmi % wind, i = 12, 6,-1)
1950 READ (line4, fmt_err) (err (i) % ssmi % wind, i = 5, 1,-1), &
1953 READ (line1, fmt_err) (err (i) % tovs % wind, i = 26, 20,-1)
1954 READ (line2, fmt_err) (err (i) % tovs % wind, i = 19, 13,-1)
1955 READ (line3, fmt_err) (err (i) % tovs % wind, i = 12, 6,-1)
1956 READ (line4, fmt_err) (err (i) % tovs % wind, i = 5, 1,-1), &
1959 CASE ('AIREPS') ! Airep
1961 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
1962 TRIM (sensor (line1)),','
1964 READ (line1, fmt_err) (err (i) % airep % wind, i = 26, 20,-1)
1965 READ (line2, fmt_err) (err (i) % airep % wind, i = 19, 13,-1)
1966 READ (line3, fmt_err) (err (i) % airep % wind, i = 12, 6,-1)
1967 READ (line4, fmt_err) (err (i) % airep % wind, i = 5, 1,-1), &
1971 CASE DEFAULT ! Other
1973 ! WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
1974 ! TRIM (sensor (line1)),','
1976 READ (line1, fmt_err) (err (i) % other % wind, i = 26, 20,-1)
1977 READ (line2, fmt_err) (err (i) % other % wind, i = 19, 13,-1)
1978 READ (line3, fmt_err) (err (i) % other % wind, i = 12, 6,-1)
1979 READ (line4, fmt_err) (err (i) % other % wind, i = 5, 1,-1), &
1987 WRITE (UNIT = 0, FMT = '(A)') ' '
1989 IF (.NOT. found) THEN
1991 WRITE (UNIT = 0, FMT = '(/,A,A)') &
1992 ' Observational errors for ',TRIM (keyword)
1993 WRITE (UNIT = 0, FMT = '(A,A,/)') &
1994 ' were not found in file ', TRIM (filein)
1999 ! 3. CLOSE INPUT FILE
2000 ! ====================
2002 CLOSE (UNIT = iunit)
2008 fileout = keyword (1:4)//'.txt'
2010 OPEN (UNIT = iunit , FILE = fileout , FORM = 'FORMATTED' , &
2011 ACTION = 'WRITE' , STATUS = 'REPLACE', IOSTAT = io_error)
2013 IF (io_error .NE. 0) THEN
2014 WRITE (UNIT = 0, FMT = '(/,A,A,/)') &
2015 'Unable to open output observational error file ',TRIM (fileout)
2020 WRITE (UNIT = iunit, FMT = '(20X,A)') TRIM (keyword)
2022 WRITE (UNIT = iunit, FMT = '(1X,16A)') ' level',&
2023 ' synop ',' ship ',' buoy ',' metar ',' pilot ',' profl ',&
2024 ' sound ',' satem ',' satob ',' airep ',&
2025 ' ssmt1 ',' ssmt2 ',' ssmi ',' tovs ',&
2029 WRITE (UNIT = iunit, FMT = '(F6.0,15(2X,F5.1))') &
2030 err (i) % level / 100., &
2031 err (i) % synop % wind, &
2032 err (i) % ships % wind, &
2033 err (i) % buoys % wind, &
2034 err (i) % metar % wind, &
2035 err (i) % pilot % wind, &
2036 err (i) % profl % wind, &
2037 err (i) % sound % wind, &
2038 err (i) % satem % wind, &
2039 err (i) % satob % wind, &
2040 err (i) % airep % wind, &
2041 err (i) % ssmt1 % wind, &
2042 err (i) % ssmt2 % wind, &
2043 err (i) % ssmi % wind, &
2044 err (i) % tovs % wind, &
2045 err (i) % other % wind
2050 CLOSE (UNIT = iunit)
2052 END SUBROUTINE READ_OBSERR_WIND
2054 SUBROUTINE READ_OBSERR_TEMP (iunit, filein, keyword, endword, fmt_err, err)
2055 !------------------------------------------------------------------------------!
2057 ! Read temp observational error defined on the following 15 levels (in hPa):
2059 ! 1000, 850, 700, 500, 400,
2060 ! 300, 250, 200, 150, 100,
2061 ! 70, 50, 30, 20, 10
2063 !------------------------------------------------------------------------------!
2065 !------------------------------------------------------------------------------!
2067 INTEGER :: iunit != 99
2068 CHARACTER (LEN=80) :: filein != 'obserr.txt'
2069 CHARACTER (LEN=80) :: keyword != 'TEMP SENSOR ERRORS'
2070 CHARACTER (LEN=80) :: endword != 'RH SENSOR ERRORS'
2071 CHARACTER (LEN=80) :: fmt_err != '(5(1X,F5.1))'
2072 TYPE (obs_type), DIMENSION (15) :: err
2074 INTEGER :: io_error, i
2075 CHARACTER (LEN=80) :: line1, line2, line3, line4
2076 LOGICAL :: found, wind
2077 CHARACTER (LEN=80) :: fileout
2079 !------------------------------------------------------------------------------!
2081 ! 1. OPEN INPUT FILE
2082 ! ===================
2084 OPEN (UNIT = iunit , FILE = filein , FORM = 'FORMATTED' , &
2085 ACTION = 'READ' , STATUS = 'OLD', IOSTAT = io_error)
2087 IF (io_error .NE. 0) THEN
2088 WRITE (UNIT = 0, FMT = '(/,A,A,/)') &
2089 'Unable to open input observational error file ',TRIM (filein)
2097 ! Read file until keyword is found
2103 DO WHILE (io_error .EQ. 0.)
2107 READ (UNIT = iunit, IOSTAT = io_error, FMT = '(A)') line1
2109 ! Exit when error or at end of file
2111 IF (io_error .NE. 0) EXIT
2113 ! Winds are given over 4 lines, any other data are given over 3 lines
2115 IF (TRIM (obstype (line1)) .EQ. 'WIND SENSOR ERRORS') THEN
2119 ! Winds ends at temperature,
2121 ELSE IF (TRIM (obstype (line1)) .EQ. 'TEMP SENSOR ERRORS') THEN
2127 READ (UNIT = iunit, IOSTAT = io_error, FMT = '(A)') line2
2128 READ (UNIT = iunit, IOSTAT = io_error, FMT = '(A)') line3
2130 READ (UNIT = iunit, IOSTAT = io_error, FMT = '(A)') line4
2132 ! If temp obstype is found, read error data
2134 IF (TRIM (obstype (line1)) .EQ. TRIM (keyword)) THEN
2138 WRITE (UNIT = 0, FMT = '(/,A,A)', ADVANCE = 'no' ) &
2139 TRIM (obstype (line1)),': '
2141 ELSE IF (((TRIM (obstype (line1)) .EQ. TRIM (endword)) .OR. &
2142 (line1 (1:2) .EQ. '*.'))) THEN
2148 ! If temp obstype is not found, keep on reading
2150 IF (.NOT. found) CYCLE
2152 ! Keyword has been found, Error at mandatory pressure levels follow
2153 ! Break down data upon obs type
2156 SELECT CASE (TRIM (sensor (line1)))
2158 CASE ('SURFACE LAND') ! synop and metar
2160 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
2161 TRIM (sensor (line1)),','
2163 READ (line1, fmt_err) (err (i) % synop % temp, i = 1, 5)
2164 READ (line2, fmt_err) (err (i) % synop % temp, i = 6, 10)
2165 READ (line3, fmt_err) (err (i) % synop % temp, i = 11, 15)
2167 READ (line1, fmt_err) (err (i) % metar % temp, i = 1, 5)
2168 READ (line2, fmt_err) (err (i) % metar % temp, i = 6, 10)
2169 READ (line3, fmt_err) (err (i) % metar % temp, i = 11, 15)
2171 CASE ('SURFACE SHIP') ! ships
2173 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
2174 TRIM (sensor (line1)),','
2176 READ (line1, fmt_err) (err (i) % ships % temp, i = 1, 5)
2177 READ (line2, fmt_err) (err (i) % ships % temp, i = 6, 10)
2178 READ (line3, fmt_err) (err (i) % ships % temp, i = 11, 15)
2180 CASE ('BUOY') ! BUOY
2182 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
2183 TRIM (sensor (line1)),','
2185 READ (line1, fmt_err) (err (i) % buoys % temp, i = 1, 5)
2186 READ (line2, fmt_err) (err (i) % buoys % temp, i = 6, 10)
2187 READ (line3, fmt_err) (err (i) % buoys % temp, i = 11, 15)
2189 CASE ('RAOBS') ! Sound
2191 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
2192 TRIM (sensor (line1)),','
2194 READ (line1, fmt_err) (err (i) % sound % temp, i = 1, 5)
2195 READ (line2, fmt_err) (err (i) % sound % temp, i = 6, 10)
2196 READ (line3, fmt_err) (err (i) % sound % temp, i = 11, 15)
2198 CASE ('PIBALS','PROFL') ! Pilot
2200 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
2201 TRIM (sensor (line1)),','
2203 READ (line1, fmt_err) (err (i) % pilot % temp, i = 1, 5)
2204 READ (line2, fmt_err) (err (i) % pilot % temp, i = 6, 10)
2205 READ (line3, fmt_err) (err (i) % pilot % temp, i = 11, 15)
2207 READ (line1, fmt_err) (err (i) % profl % temp, i = 1, 5)
2208 READ (line2, fmt_err) (err (i) % profl % temp, i = 6, 10)
2209 READ (line3, fmt_err) (err (i) % profl % temp, i = 11, 15)
2211 CASE ('NOAA - A RETRIEVAL') ! Satobs and Satem
2213 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
2214 TRIM (sensor (line1)),','
2216 READ (line1, fmt_err) (err (i) % satob % temp, i = 1, 5)
2217 READ (line2, fmt_err) (err (i) % satob % temp, i = 6, 10)
2218 READ (line3, fmt_err) (err (i) % satob % temp, i = 11, 15)
2220 READ (line1, fmt_err) (err (i) % satem % temp, i = 1, 5)
2221 READ (line2, fmt_err) (err (i) % satem % temp, i = 6, 10)
2222 READ (line3, fmt_err) (err (i) % satem % temp, i = 11, 15)
2224 CASE ('AIREPS') ! Airep
2226 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
2227 TRIM (sensor (line1)),','
2229 READ (line1, fmt_err) (err (i) % airep % temp, i = 1, 5)
2230 READ (line2, fmt_err) (err (i) % airep % temp, i = 6, 10)
2231 READ (line3, fmt_err) (err (i) % airep % temp, i = 11, 15)
2232 CASE ('AIRSRET') ! AIRS retrievals
2234 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
2235 TRIM (sensor (line1)),','
2237 READ (line1, fmt_err) (err (i) % airs % temp, i = 1, 5)
2238 READ (line2, fmt_err) (err (i) % airs % temp, i = 6, 10)
2239 READ (line3, fmt_err) (err (i) % airs % temp, i = 11, 15)
2241 CASE ('DMSP - A RETRIEVAL') ! ssmt1, ssmt2, ssmi and ttovs
2243 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
2244 TRIM (sensor (line1)),','
2246 READ (line1, fmt_err) (err (i) % ssmt1 % temp, i = 1, 5)
2247 READ (line2, fmt_err) (err (i) % ssmt1 % temp, i = 6, 10)
2248 READ (line3, fmt_err) (err (i) % ssmt1 % temp, i = 11, 15)
2250 READ (line1, fmt_err) (err (i) % ssmt2 % temp, i = 1, 5)
2251 READ (line2, fmt_err) (err (i) % ssmt2 % temp, i = 6, 10)
2252 READ (line3, fmt_err) (err (i) % ssmt2 % temp, i = 11, 15)
2254 READ (line1, fmt_err) (err (i) % ssmi % temp, i = 1, 5)
2255 READ (line2, fmt_err) (err (i) % ssmi % temp, i = 6, 10)
2256 READ (line3, fmt_err) (err (i) % ssmi % temp, i = 11, 15)
2258 READ (line1, fmt_err) (err (i) % tovs % temp, i = 1, 5)
2259 READ (line2, fmt_err) (err (i) % tovs % temp, i = 6, 10)
2260 READ (line3, fmt_err) (err (i) % tovs % temp, i = 11, 15)
2262 CASE DEFAULT ! Other
2264 ! WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
2265 ! TRIM (sensor (line1)),','
2267 READ (line1, fmt_err) (err (i) % other % temp, i = 1, 5)
2268 READ (line2, fmt_err) (err (i) % other % temp, i = 6, 10)
2269 READ (line3, fmt_err) (err (i) % other % temp, i = 11, 15)
2275 WRITE (UNIT = 0, FMT = '(A)') ' '
2277 ! If obs type is not found, print it
2279 IF (.NOT. found) THEN
2280 WRITE (UNIT = 0, FMT = '(/,A,A)') &
2281 ' Observational errors for ',TRIM (keyword)
2282 WRITE (UNIT = 0, FMT = '(A,A,/)') &
2283 ' were not found in file ', TRIM (filein)
2287 ! 3. CLOSE INPUT FILE
2288 ! ====================
2290 CLOSE (UNIT = iunit)
2295 fileout = keyword (1:4)//'.txt'
2297 OPEN (UNIT = iunit , FILE = fileout , FORM = 'FORMATTED' , &
2298 ACTION = 'WRITE' , STATUS = 'REPLACE', IOSTAT = io_error)
2300 IF (io_error .NE. 0) THEN
2301 WRITE (UNIT = 0, FMT = '(/,A,A,/)') &
2302 'Unable to open output observational error file ',TRIM (fileout)
2307 WRITE (UNIT = iunit, FMT = '(20X,A)') TRIM (keyword)
2309 WRITE (UNIT = iunit, FMT = '(1X,16A)') ' level',&
2310 ' synop ',' ship ',' buoy ',' metar ',' pilot ',' profl ',&
2311 ' sound ',' satem ',' satob ',' airep ',&
2312 ' ssmt1 ',' ssmt2 ',' tovs ',' ssmi ',' airsret', &
2317 WRITE (UNIT = iunit, FMT = '(F6.0,15(2X,F5.1))') &
2318 err (i) % level / 100., &
2319 err (i) % synop % temp, &
2320 err (i) % ships % temp, &
2321 err (i) % buoys % temp, &
2322 err (i) % metar % temp, &
2323 err (i) % pilot % temp, &
2324 err (i) % profl % temp, &
2325 err (i) % sound % temp, &
2326 err (i) % satem % temp, &
2327 err (i) % satob % temp, &
2328 err (i) % airep % temp, &
2329 err (i) % ssmt1 % temp, &
2330 err (i) % ssmt2 % temp, &
2331 err (i) % tovs % temp, &
2332 err (i) % ssmi % temp, &
2333 err (i) % airs % temp, &
2334 err (i) % other % temp
2338 CLOSE (UNIT = iunit)
2340 END SUBROUTINE READ_OBSERR_TEMP
2342 SUBROUTINE READ_OBSERR_RH (iunit, filein, keyword, endword, fmt_err, err)
2343 !------------------------------------------------------------------------------!
2345 ! Read rh observational error defined on the following 15 levels (in hPa):
2347 ! 1000, 850, 700, 500, 400,
2348 ! 300, 250, 200, 150, 100,
2349 ! 70, 50, 30, 20, 10
2351 !------------------------------------------------------------------------------!
2353 !------------------------------------------------------------------------------!
2355 INTEGER :: iunit != 99
2356 CHARACTER (LEN=80) :: filein != 'obserr.txt'
2357 CHARACTER (LEN=80) :: keyword != 'RH SENSOR ERRORS'
2358 CHARACTER (LEN=80) :: endword != 'PRESSURE SENSOR ERRORS'
2359 CHARACTER (LEN=80) :: fmt_err != '(5(1X,F5.2))'
2360 TYPE (obs_type), DIMENSION (15) :: err
2362 INTEGER :: io_error, i
2363 CHARACTER (LEN=80) :: line1, line2, line3, line4
2364 LOGICAL :: found, wind
2365 CHARACTER (LEN=80) :: fileout
2367 !------------------------------------------------------------------------------!
2369 ! 1. OPEN INPUT FILE
2370 ! ===================
2372 OPEN (UNIT = iunit , FILE = filein , FORM = 'FORMATTED' , &
2373 ACTION = 'READ' , STATUS = 'OLD', IOSTAT = io_error)
2375 IF (io_error .NE. 0) THEN
2376 WRITE (UNIT = 0, FMT = '(/,A,A,/)') &
2377 'Unable to open input observational error file ',TRIM (filein)
2385 ! Read file until keyword is found
2391 DO WHILE (io_error .EQ. 0)
2393 ! Read 3 line record
2395 READ (UNIT = iunit, IOSTAT = io_error, FMT = '(A)') line1
2397 ! Winds are given over 4 lines, any other data are given over 3 lines
2399 IF (TRIM (obstype (line1)) .EQ. 'WIND SENSOR ERRORS') THEN
2403 ! Winds ends at temperature,
2405 ELSE IF (TRIM (obstype (line1)) .EQ. 'TEMP SENSOR ERRORS') THEN
2411 READ (UNIT = iunit, IOSTAT = io_error, FMT = '(A)') line2
2412 READ (UNIT = iunit, IOSTAT = io_error, FMT = '(A)') line3
2414 READ (UNIT = iunit, IOSTAT = io_error, FMT = '(A)') line4
2416 ! Exit when error or at end of file
2418 IF (io_error .NE. 0) EXIT
2420 ! If rh obstype is found, read error data
2422 IF (TRIM (obstype (line1)) .EQ. TRIM (keyword)) THEN
2426 WRITE (UNIT = 0, FMT = '(/,A,A)', ADVANCE = 'no' ) &
2427 TRIM (obstype (line1)),': '
2429 ELSE IF (((TRIM (obstype (line1)) .EQ. TRIM (endword)) .OR. &
2430 (line1 (1:2) .EQ. '*.'))) THEN
2437 ! If rh obstype is not found, keep on reading
2439 IF (.NOT. found) CYCLE
2441 ! Keyword has been found, Error at mandatory pressure levels follow
2442 ! Break down data upon obs type
2444 SELECT CASE (TRIM (sensor (line1)))
2446 CASE ('SURFACE LAND') ! synop, ships, buoys and metar
2448 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
2449 TRIM (sensor (line1)),','
2451 READ (line1, fmt_err) (err (i) % synop % rh, i = 1, 5)
2452 READ (line2, fmt_err) (err (i) % synop % rh, i = 6, 10)
2453 READ (line3, fmt_err) (err (i) % synop % rh, i = 11, 15)
2455 READ (line1, fmt_err) (err (i) % ships % rh, i = 1, 5)
2456 READ (line2, fmt_err) (err (i) % ships % rh, i = 6, 10)
2457 READ (line3, fmt_err) (err (i) % ships % rh, i = 11, 15)
2459 READ (line1, fmt_err) (err (i) % buoys % rh, i = 1, 5)
2460 READ (line2, fmt_err) (err (i) % buoys % rh, i = 6, 10)
2461 READ (line3, fmt_err) (err (i) % buoys % rh, i = 11, 15)
2463 READ (line1, fmt_err) (err (i) % metar % rh, i = 1, 5)
2464 READ (line2, fmt_err) (err (i) % metar % rh, i = 6, 10)
2465 READ (line3, fmt_err) (err (i) % metar % rh, i = 11, 15)
2467 CASE ('RAOBS') ! Sound
2469 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
2470 TRIM (sensor (line1)),','
2472 READ (line1, fmt_err) (err (i) % sound % rh, i = 1, 5)
2473 READ (line2, fmt_err) (err (i) % sound % rh, i = 6, 10)
2474 READ (line3, fmt_err) (err (i) % sound % rh, i = 11, 15)
2476 CASE ('PIBALS','PROFL') ! Pilot
2478 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
2479 TRIM (sensor (line1)),','
2481 READ (line1, fmt_err) (err (i) % pilot % rh, i = 1, 5)
2482 READ (line2, fmt_err) (err (i) % pilot % rh, i = 6, 10)
2483 READ (line3, fmt_err) (err (i) % pilot % rh, i = 11, 15)
2485 READ (line1, fmt_err) (err (i) % profl % rh, i = 1, 5)
2486 READ (line2, fmt_err) (err (i) % profl % rh, i = 6, 10)
2487 READ (line3, fmt_err) (err (i) % profl % rh, i = 11, 15)
2490 CASE ('NOAA - A RETRIEVAL') ! Satobs and Satem
2492 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
2493 TRIM (sensor (line1)),','
2495 READ (line1, fmt_err) (err (i) % satob % rh, i = 1, 5)
2496 READ (line2, fmt_err) (err (i) % satob % rh, i = 6, 10)
2497 READ (line3, fmt_err) (err (i) % satob % rh, i = 11, 15)
2499 READ (line1, fmt_err) (err (i) % satem % rh, i = 1, 5)
2500 READ (line2, fmt_err) (err (i) % satem % rh, i = 6, 10)
2501 READ (line3, fmt_err) (err (i) % satem % rh, i = 11, 15)
2503 CASE ('AIREPS') ! Airep
2505 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
2506 TRIM (sensor (line1)),','
2508 READ (line1, fmt_err) (err (i) % airep % rh, i = 1, 5)
2509 READ (line2, fmt_err) (err (i) % airep % rh, i = 6, 10)
2510 READ (line3, fmt_err) (err (i) % airep % rh, i = 11, 15)
2511 CASE ('AIRSRET') ! AIRS retrievals
2513 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
2514 TRIM (sensor (line1)),','
2516 READ (line1, fmt_err) (err (i) % airs % rh, i = 1, 5)
2517 READ (line2, fmt_err) (err (i) % airs % rh, i = 6, 10)
2518 READ (line3, fmt_err) (err (i) % airs % rh, i = 11, 15)
2520 CASE ('DMSP - A RETRIEVAL') ! ssmt1, ssmt2, ssmi and ttovs
2522 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
2523 TRIM (sensor (line1)),','
2525 READ (line1, fmt_err) (err (i) % ssmt1 % rh, i = 1, 5)
2526 READ (line2, fmt_err) (err (i) % ssmt1 % rh, i = 6, 10)
2527 READ (line3, fmt_err) (err (i) % ssmt1 % rh, i = 11, 15)
2529 READ (line1, fmt_err) (err (i) % ssmt2 % rh, i = 1, 5)
2530 READ (line2, fmt_err) (err (i) % ssmt2 % rh, i = 6, 10)
2531 READ (line3, fmt_err) (err (i) % ssmt2 % rh, i = 11, 15)
2533 READ (line1, fmt_err) (err (i) % ssmi % rh, i = 1, 5)
2534 READ (line2, fmt_err) (err (i) % ssmi % rh, i = 6, 10)
2535 READ (line3, fmt_err) (err (i) % ssmi % rh, i = 11, 15)
2537 READ (line1, fmt_err) (err (i) % tovs % rh, i = 1, 5)
2538 READ (line2, fmt_err) (err (i) % tovs % rh, i = 6, 10)
2539 READ (line3, fmt_err) (err (i) % tovs % rh, i = 11, 15)
2541 CASE DEFAULT ! Other
2543 READ (line1, fmt_err) (err (i) % other % rh, i = 1, 5)
2544 READ (line2, fmt_err) (err (i) % other % rh, i = 6, 10)
2545 READ (line3, fmt_err) (err (i) % other % rh, i = 11, 15)
2553 ! If obs type is not found, print it
2555 IF (.NOT. found) THEN
2556 WRITE (UNIT = 0, FMT = '(/,A,A)') &
2557 ' Observational errors for ',TRIM (keyword)
2558 WRITE (UNIT = 0, FMT = '(A,A,/)') &
2559 ' were not found in file ', TRIM (filein)
2563 ! 3. CLOSE INPUT FILE
2564 ! ====================
2566 CLOSE (UNIT = iunit)
2572 fileout = keyword (1:2)//'.txt'
2574 OPEN (UNIT = iunit , FILE = fileout , FORM = 'FORMATTED' , &
2575 ACTION = 'WRITE' , STATUS = 'REPLACE', IOSTAT = io_error)
2577 IF (io_error .NE. 0) THEN
2578 WRITE (UNIT = 0, FMT = '(/,A,A,/)') &
2579 'Unable to open output observational error file ',TRIM (fileout)
2584 WRITE (UNIT = iunit, FMT = '(20X,A)') TRIM (keyword)
2586 WRITE (UNIT = iunit, FMT = '(1X,16A)') ' level',&
2587 ' synop ',' ship ',' buoy ',' metar ',' pilot ',' profl ',&
2588 ' sound ',' satem ',' satob ',' airep ',&
2589 ' ssmt1 ',' ssmt2 ',' tovs ',' ssmi ',' airsret',&
2593 WRITE (UNIT = iunit, FMT = '(F6.0,15(2X,F5.1))') &
2594 err (i) % level / 100., &
2595 err (i) % synop % rh, &
2596 err (i) % ships % rh, &
2597 err (i) % buoys % rh, &
2598 err (i) % metar % rh, &
2599 err (i) % pilot % rh, &
2600 err (i) % profl % rh, &
2601 err (i) % sound % rh, &
2602 err (i) % satem % rh, &
2603 err (i) % satob % rh, &
2604 err (i) % airep % rh, &
2605 err (i) % ssmt1 % rh, &
2606 err (i) % ssmt2 % rh, &
2607 err (i) % tovs % rh, &
2608 err (i) % ssmi % rh, &
2609 err (i) % airs % rh, &
2610 err (i) % other % rh
2614 CLOSE (UNIT = iunit)
2616 END SUBROUTINE READ_OBSERR_RH
2618 SUBROUTINE READ_OBSERR_PRES (iunit, filein, keyword, endword, fmt_err, err)
2619 !------------------------------------------------------------------------------!
2621 ! Read pressure observational error defined on the following 15 levels (in hPa):
2623 ! 1000, 850, 700, 500, 400,
2624 ! 300, 250, 200, 150, 100,
2625 ! 70, 50, 30, 20, 10
2627 !------------------------------------------------------------------------------!
2629 !------------------------------------------------------------------------------!
2631 INTEGER :: iunit != 99
2632 CHARACTER (LEN=80) :: filein != 'obserr.txt'
2633 CHARACTER (LEN=80) :: keyword != 'PRESSURE SENSOR ERRORS'
2634 CHARACTER (LEN=80) :: endword != '*.'
2635 CHARACTER (LEN=80) :: fmt_err != '(5(1X,F5.1))'
2636 TYPE (obs_type), DIMENSION (15) :: err
2638 INTEGER :: io_error, i
2639 CHARACTER (LEN=80) :: line1, line2, line3, line4
2640 LOGICAL :: found, wind
2641 CHARACTER (LEN=80) :: fileout
2643 !------------------------------------------------------------------------------!
2645 ! 1. OPEN INPUT FILE
2646 ! ===================
2648 OPEN (UNIT = iunit , FILE = filein , FORM = 'FORMATTED' , &
2649 ACTION = 'READ' , STATUS = 'OLD', IOSTAT = io_error)
2651 IF (io_error .NE. 0) THEN
2652 WRITE (UNIT = 0, FMT = '(/,A,A,/)') &
2653 'Unable to open input observational error file ',TRIM (filein)
2661 ! Read file until keyword is found
2667 DO WHILE (io_error .EQ. 0.)
2671 READ (UNIT = iunit, IOSTAT = io_error, FMT = '(A)') line1
2673 ! Exit when error or at end of file
2675 IF (io_error .NE. 0) EXIT
2677 ! Winds are given over 4 lines, any other data are given over 3 lines
2679 IF (TRIM (obstype (line1)) .EQ. 'WIND SENSOR ERRORS') THEN
2683 ! Winds ends at temperature,
2685 ELSE IF (TRIM (obstype (line1)) .EQ. 'TEMP SENSOR ERRORS') THEN
2691 READ (UNIT = iunit, IOSTAT = io_error, FMT = '(A)') line2
2692 READ (UNIT = iunit, IOSTAT = io_error, FMT = '(A)') line3
2694 READ (UNIT = iunit, IOSTAT = io_error, FMT = '(A)') line4
2696 ! If temp obstype is found, read error data
2698 IF (TRIM (obstype (line1)) .EQ. TRIM (keyword)) THEN
2702 WRITE (UNIT = 0, FMT = '(/,A,A)', ADVANCE = 'no' ) &
2703 TRIM (obstype (line1)),': '
2705 ELSE IF (((TRIM (obstype (line1)) .EQ. TRIM (endword)) .OR. &
2706 (line1 (1:2) .EQ. '*.'))) THEN
2712 ! If temp obstype is not found, keep on reading
2714 IF (.NOT. found) CYCLE
2716 ! Keyword has been found, Error at mandatory pressure levels follow
2717 ! Break down data upon obs type
2720 SELECT CASE (TRIM (sensor (line1)))
2722 CASE ('SURFACE LAND') ! synop and metar
2724 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
2725 TRIM (sensor (line1)),','
2727 READ (line1, fmt_err) (err (i) % synop % pres, i = 1, 5)
2728 READ (line2, fmt_err) (err (i) % synop % pres, i = 6, 10)
2729 READ (line3, fmt_err) (err (i) % synop % pres, i = 11, 15)
2731 READ (line1, fmt_err) (err (i) % metar % pres, i = 1, 5)
2732 READ (line2, fmt_err) (err (i) % metar % pres, i = 6, 10)
2733 READ (line3, fmt_err) (err (i) % metar % pres, i = 11, 15)
2735 CASE ('SURFACE SHIP') ! ships
2737 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
2738 TRIM (sensor (line1)),','
2740 READ (line1, fmt_err) (err (i) % ships % pres, i = 1, 5)
2741 READ (line2, fmt_err) (err (i) % ships % pres, i = 6, 10)
2742 READ (line3, fmt_err) (err (i) % ships % pres, i = 11, 15)
2744 CASE ('RAOBS') ! Sounding
2746 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
2747 TRIM (sensor (line1)),','
2749 READ (line1, fmt_err) (err (i) % sound % pres, i = 1, 5)
2750 READ (line2, fmt_err) (err (i) % sound % pres, i = 6, 10)
2751 READ (line3, fmt_err) (err (i) % sound % pres, i = 11, 15)
2753 CASE ('PIBALS','PROFL') ! Pilot
2755 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
2756 TRIM (sensor (line1)),','
2758 READ (line1, fmt_err) (err (i) % pilot % pres, i = 1, 5)
2759 READ (line2, fmt_err) (err (i) % pilot % pres, i = 6, 10)
2760 READ (line3, fmt_err) (err (i) % pilot % pres, i = 11, 15)
2762 READ (line1, fmt_err) (err (i) % profl % pres, i = 1, 5)
2763 READ (line2, fmt_err) (err (i) % profl % pres, i = 6, 10)
2764 READ (line3, fmt_err) (err (i) % profl % pres, i = 11, 15)
2766 CASE ('NOAA - A RETRIEVAL') ! Satobs and Satem
2768 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
2769 TRIM (sensor (line1)),','
2771 READ (line1, fmt_err) (err (i) % satob % pres, i = 1, 5)
2772 READ (line2, fmt_err) (err (i) % satob % pres, i = 6, 10)
2773 READ (line3, fmt_err) (err (i) % satob % pres, i = 11, 15)
2775 READ (line1, fmt_err) (err (i) % satem % pres, i = 1, 5)
2776 READ (line2, fmt_err) (err (i) % satem % pres, i = 6, 10)
2777 READ (line3, fmt_err) (err (i) % satem % pres, i = 11, 15)
2779 CASE ('AIREPS') ! Airep
2781 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
2782 TRIM (sensor (line1)),','
2784 READ (line1, fmt_err) (err (i) % airep % pres, i = 1, 5)
2785 READ (line2, fmt_err) (err (i) % airep % pres, i = 6, 10)
2786 READ (line3, fmt_err) (err (i) % airep % pres, i = 11, 15)
2788 CASE ('AIRSRET') ! AIRS retrievals
2790 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
2791 TRIM (sensor (line1)),','
2793 READ (line1, fmt_err) (err (i) % airs % pres, i = 1, 5)
2794 READ (line2, fmt_err) (err (i) % airs % pres, i = 6, 10)
2795 READ (line3, fmt_err) (err (i) % airs % pres, i = 11, 15)
2797 CASE ('DMSP - A RETRIEVAL') ! ssmt1, ssmt2, ssmi and ttovs
2799 WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
2800 TRIM (sensor (line1)),','
2802 READ (line1, fmt_err) (err (i) % ssmt1 % pres, i = 1, 5)
2803 READ (line2, fmt_err) (err (i) % ssmt1 % pres, i = 6, 10)
2804 READ (line3, fmt_err) (err (i) % ssmt1 % pres, i = 11, 15)
2806 READ (line1, fmt_err) (err (i) % ssmt2 % pres, i = 1, 5)
2807 READ (line2, fmt_err) (err (i) % ssmt2 % pres, i = 6, 10)
2808 READ (line3, fmt_err) (err (i) % ssmt2 % pres, i = 11, 15)
2810 READ (line1, fmt_err) (err (i) % ssmi % pres, i = 1, 5)
2811 READ (line2, fmt_err) (err (i) % ssmi % pres, i = 6, 10)
2812 READ (line3, fmt_err) (err (i) % ssmi % pres, i = 11, 15)
2814 READ (line1, fmt_err) (err (i) % tovs % pres, i = 1, 5)
2815 READ (line2, fmt_err) (err (i) % tovs % pres, i = 6, 10)
2816 READ (line3, fmt_err) (err (i) % tovs % pres, i = 11, 15)
2818 CASE DEFAULT ! Other
2820 ! WRITE (UNIT = 0, FMT = '(1X,2A)',ADVANCE='no') &
2821 ! TRIM (sensor (line1)),','
2823 READ (line1, fmt_err) (err (i) % other % pres, i = 1, 5)
2824 READ (line2, fmt_err) (err (i) % other % pres, i = 6, 10)
2825 READ (line3, fmt_err) (err (i) % other % pres, i = 11, 15)
2833 ! If obs type is not found, print it
2835 IF (.NOT. found) THEN
2836 WRITE (UNIT = 0, FMT = '(/,A,A)') &
2837 ' Observational errors for ',TRIM (keyword)
2838 WRITE (UNIT = 0, FMT = '(A,A,/)') &
2839 ' were not found in file ', TRIM (filein)
2842 ! 3. CLOSE INPUT FILE
2843 ! ====================
2845 CLOSE (UNIT = iunit)
2850 fileout = keyword (1:4)//'.txt'
2852 OPEN (UNIT = iunit , FILE = fileout , FORM = 'FORMATTED' , &
2853 ACTION = 'WRITE' , STATUS = 'REPLACE', IOSTAT = io_error)
2855 IF (io_error .NE. 0) THEN
2856 WRITE (UNIT = 0, FMT = '(/,A,A,/)') &
2857 'Unable to open output observational error file ',TRIM (fileout)
2862 WRITE (UNIT = iunit, FMT = '(20X,A)') TRIM (keyword)
2864 WRITE (UNIT = iunit, FMT = '(1X,16A)') ' level',&
2865 ' synop ',' ship ',' buoy ',' metar ',' pilot ',' profl ',&
2866 ' sound ',' satem ',' satob ',' airep ',&
2867 ' ssmt1 ',' ssmt2 ',' tovs ',' ssmi ', 'airsret', &
2871 WRITE (UNIT = iunit, FMT = '(F6.0,15(2X,F5.1))') &
2872 err (i) % level / 100., &
2873 err (i) % synop % pres / 100., &
2874 err (i) % ships % pres / 100., &
2875 err (i) % buoys % pres / 100., &
2876 err (i) % metar % pres / 100., &
2877 err (i) % pilot % pres / 100., &
2878 err (i) % profl % pres / 100., &
2879 err (i) % sound % pres / 100., &
2880 err (i) % satem % pres / 100., &
2881 err (i) % satob % pres / 100., &
2882 err (i) % airep % pres / 100., &
2883 err (i) % ssmt1 % pres / 100., &
2884 err (i) % ssmt2 % pres / 100., &
2885 err (i) % tovs % pres / 100., &
2886 err (i) % ssmi % pres / 100., &
2887 err (i) % airs % pres / 100., &
2888 err (i) % other % pres / 100.
2892 CLOSE (UNIT = iunit)
2894 END SUBROUTINE READ_OBSERR_PRES
2896 FUNCTION obstype (line) RESULT (f_obstype)
2897 !------------------------------------------------------------------------------!
2899 ! Read in a line the string present after keyword 'BOGUS'
2901 !------------------------------------------------------------------------------!
2903 CHARACTER (LEN= 80) :: line, f_obstype
2905 !------------------------------------------------------------------------------!
2907 ! Find keyword bogus
2909 DO c = 1, LEN_TRIM (line) - 5
2910 IF (line (c:c+4) .EQ. 'BOGUS') EXIT
2915 ! Skip blank until next word
2917 DO b = c, LEN_TRIM (line)
2918 IF (line (b:b) .NE. ' ') EXIT
2923 f_obstype = TRIM (line (b:LEN_TRIM (line)))
2925 END FUNCTION obstype
2927 !------------------------------------------------------------------------------!
2928 FUNCTION sensor (line) RESULT (f_sensor)
2930 ! Read first in a string after numbers
2932 !------------------------------------------------------------------------------!
2934 CHARACTER (LEN= 80) :: line, f_sensor
2936 !------------------------------------------------------------------------------!
2938 ! Find the first non-blank, non point and non-number character
2940 DO c = 1, LEN_TRIM (line)
2941 IF (((iachar (line(c:c)) .NE. 32) .AND. &
2942 (iachar (line(c:c)) .NE. 46)) .AND. &
2943 ((iachar (line(c:c)) .LT. 48) .OR. &
2944 (iachar (line(c:c)) .GT. 57))) &
2948 ! String is start after blank untill end of line
2950 f_sensor = line (c:LEN_TRIM (line))
2954 END MODULE MODULE_ERR_AFWA