da_bias_scan.f90

References to this file elsewhere.
1   PROGRAM da_bias_scan
2 
3   USE RAD_BIAS, only : long, bias, jpchan, jpscan, da_read_biasprep, print_bias, &
4      qc_amsua, qc_amsub, jband, boff, bdiv
5 
6 ! PURPOSE.
7 ! -------
8 ! TO CALCULATE SCAN BIAS CORRECTIONS.
9 
10 ! REFERENCE.
11 ! ----------
12 ! The ECMWF Tovs BIAs Correction, Harris and Kelly..
13 
14   IMPLICIT NONE
15 
16 ! Local Variables
17 
18   TYPE(BIAS) :: tovs
19 
20   INTEGER :: nobs(JPCHAN)
21   INTEGER :: nscan(JPSCAN), nscanch(JPCHAN,JPSCAN)
22   INTEGER :: nscanchb(JPCHAN,JPSCAN,JBAND)
23 
24   REAL(KIND=LONG) :: vmean_dep(JPCHAN), vmean_abs(JPCHAN)
25   REAL(KIND=LONG) :: vstd_dep(JPCHAN), vstd_abs(JPCHAN)
26   REAL(KIND=LONG) :: vec_dep(JPCHAN), vec_abs(JPCHAN)
27 
28   REAL(KIND=LONG) :: vmn(JPCHAN), vstd(JPCHAN)
29   REAL(KIND=LONG) :: vmnsc(JPCHAN,JPSCAN), vstdsc(JPCHAN,JPSCAN), vmnrl(JPCHAN,JPSCAN)
30  
31   REAL(KIND=LONG) :: vmnscb(JPCHAN,JPSCAN,JBAND), vstdscb(JPCHAN,JPSCAN,JBAND)
32   REAL(KIND=LONG) :: vmnrlb(JPCHAN,JPSCAN,JBAND)
33 
34 ! smoothed values
35   INTEGER :: nscanchbt(JPCHAN,JPSCAN,JBAND)
36   REAL(KIND=LONG) :: vmnscbt(JPCHAN,JPSCAN,JBAND), vstdscbt(JPCHAN,JPSCAN,JBAND)
37   REAL(KIND=LONG) :: vmnrlbt(JPCHAN,JPSCAN,JBAND)
38 
39   ! INTEGER :: ibin
40   INTEGER :: ierr, iscanm
41   INTEGER :: j, jv, jscan, js, k , l
42   ! INTEGER :: path
43   ! INTEGER :: cloud_flag
44 
45   INTEGER :: iband
46   ! INTEGER :: ia
47   ! INTEGER :: iab
48   ! INTEGER :: aoff
49   ! INTEGER :: avb 
50 
51   ! CHARACTER(LEN=2) :: cchan
52 
53   REAL(KIND=LONG) :: vmn0, vmn0b(JBAND)
54   ! REAL(KIND=LONG) :: VDHL_WINDOW, VDLL_WINDOW
55 
56   LOGICAL :: global, smoothing
57 
58 ! definition of defaut namelist values
59 !-----------------------------------------
60   INTEGER :: sband =1
61   INTEGER :: eband =18
62   INTEGER :: kscan =90
63   INTEGER :: ICOUNT = 0                              ! connter                                
64   REAL(KIND=LONG)   :: fac = 3.0                    ! Sdev factor
65   NAMELIST /INPUTS/ kscan,fac,global,sband,eband,smoothing
66 
67 !------------------------------------------------------------------------------
68 !       1.   SETUP.
69 !            -----
70 
71   READ(5,INPUTS,END=100)
72 
73   100 CONTINUE
74 
75   WRITE(6,INPUTS)
76 
77   OPEN(UNIT=10,FORM='UNFORMATTED')       ! Open input file  : Input data from select
78   OPEN(UNIT=11,FORM='UNFORMATTED')       ! Open output file : Scan mean core arrays
79   OPEN(UNIT=12,FORM='UNFORMATTED')       ! Open output file : Scan bias coef
80 
81 
82 !------------------------------------------------------------------------------
83 !       2.   READ IN DATA, Q.C., CALC MEANS AND VARIANCES.
84 !            ---- -- ----- ----- ---- ----- --- ---------
85 
86   vmean_dep = 0.0                                          ! Clear matrices
87   vstd_dep  = 0.0
88   vmean_abs = 0.0                                          ! Clear matrices
89   vstd_abs  = 0.0
90   nobs      = 0
91 
92   READ(UNIT=10,END=265)  tovs%nchan, tovs%npred    ! Read in data
93   REWIND(UNIT=10)
94 
95   allocate(tovs%tb(tovs%nchan))
96   allocate(tovs%omb(tovs%nchan))
97   allocate(tovs%bias(tovs%nchan))
98   allocate(tovs%qc_flag(tovs%nchan))
99   allocate(tovs%cloud_flag(tovs%nchan))
100   allocate(tovs%pred(tovs%npred))
101 
102 loop1:&
103   DO
104       icount=icount+1
105 
106 !
107 !  2.1 read in data
108 !
109       call da_read_biasprep(tovs,10,ierr)
110       if (ierr == 0) then      ! not end
111           continue
112       elseif (ierr == 1) then  ! end
113           exit
114       else                     ! error
115           stop 'read error in da_scan_bias'
116       endif
117 
118       if (icount < 2) call print_bias(tovs)
119 
120       vec_dep(1:tovs%nchan) = tovs%omb(1:tovs%nchan) ! obs minus guess
121       vec_abs(1:tovs%nchan) = tovs%tb(1:tovs%nchan)  ! obs
122 
123 ! 
124 !   2.2 QC: extrme values/extrme departure/window channel 
125 !
126       if (tovs%sensor_id == 3) then
127            call qc_amsua(tovs)
128       elseif(tovs%sensor_id == 4) then
129            call qc_amsub(tovs)
130       elseif(tovs%sensor_id == 15) then
131            call qc_amsub(tovs)
132       endif
133 
134     DO j=1,tovs%nchan 
135 !-------------------------------
136 !  2.3 compute the statistics
137 !-------------------------------    
138       IF ( tovs%qc_flag(j) == 1 ) THEN
139         nobs(j) = nobs(j) + 1
140         vmean_dep(j) = vmean_dep(j) + vec_dep(j)
141         vstd_dep(j) = vstd_dep(j) + vec_dep(j)*vec_dep(j)
142         vmean_abs(j) = vmean_abs(j) + vec_abs(j)
143         vstd_abs(j) = vstd_abs(j) + vec_abs(j)*vec_abs(j)
144       ENDIF
145     ENDDO
146 
147   ENDDO loop1
148 
149   265 CONTINUE            ! MEANS AND STANDARD DEVIATIONS
150 
151   WRITE (6,270) icount,nobs(1:tovs%nchan)
152   270 FORMAT (/1X,'NUMBER OF DATA Total/ACCEPTED'/1X,i10/1X,15I10)
153 
154 !---------------------------------
155 !  2.8 mean and std for channels
156 !---------------------------------
157   WHERE (nobs(:) /= 0)
158     vmean_dep(:) = vmean_dep(:)/nobs(:)
159      vstd_dep(:) = vstd_dep(:)/nobs(:) - vmean_dep(:)**2
160      vstd_dep(:) = SQRT(MAX(0.0,vstd_dep(:)))
161     vmean_abs(:) = vmean_abs(:)/nobs(:)
162      vstd_abs(:) = vstd_abs(:)/nobs(:) - vmean_abs(:)**2
163      vstd_abs(:) = SQRT(MAX(0.0,vstd_abs(:)))
164   END WHERE
165 
166   vmn(:) = vmean_dep(:)   ! used by outlier check later
167   vstd(:) = vstd_dep(:)
168 
169   WRITE (6,288)
170   288 FORMAT (/1X,'FIRST PASS: MEANS AND STANDARD DEVIATIONS')
171 
172   DO j=1,tovs%nchan
173     jv = j
174     WRITE (6,289) jv, nobs(j), vmean_abs(j),vstd_abs(j), vmean_dep(j),vstd_dep(j)
175   ENDDO
176   289 FORMAT (1X,I5,I10,4F15.2)
177 
178 !-------------------------------------------------------------------------------
179 !     3.   SECOND PASS THROUGH DATA, EXTRA Q.C.
180 !          ------ ---- ------- ----- ----- ----
181 
182   REWIND(UNIT=10)
183 
184   vmean_dep = 0.0                                          ! Clear matrices
185   vstd_dep = 0.0
186   vmean_abs = 0.0                                          ! Clear matrices
187   vstd_abs = 0.0
188   vmnsc = 0.0
189   vstdsc = 0.0
190   vmnscb = 0.0
191   vstdscb = 0.0
192   nobs = 0
193   nscan = 0
194   nscanch = 0
195   nscanchb = 0
196 
197 loop2:&
198   DO
199 
200     call da_read_biasprep(tovs,10,ierr)
201     if (ierr == 0) then      ! not end
202          continue
203     elseif (ierr == 1) then  ! end
204          exit
205     else                     ! error
206          stop 'read error in da_scan_bias'
207     endif
208 
209       vec_dep(1:tovs%nchan) = tovs%omb(1:tovs%nchan)
210       vec_abs(1:tovs%nchan) = tovs%tb(1:tovs%nchan)
211 
212       if (tovs%sensor_id == 3) then
213            call qc_amsua(tovs)
214       elseif(tovs%sensor_id == 4) then
215            call qc_amsub(tovs)
216       elseif(tovs%sensor_id == 15) then ! mhs
217            call qc_amsub(tovs)
218       endif
219 
220 !---------------------------------------------------------------------------------
221 ! 3.6 Reject outliers : using fac and stdv calculated in the first pass : loop 1
222 !---------------------------------------------------------------------------------
223     DO j=1, tovs%nchan
224       IF ( (ABS(vec_dep(j)-vmn(j)) > (vstd(j)*FAC)) ) THEN
225           tovs%qc_flag(j) = -1
226       ENDIF
227     ENDDO
228 
229 ! Good data : count and use in the ststistics
230 !----------------------------------------------------
231 
232     jscan = tovs%scanpos
233     nscan(jscan) = nscan(jscan) + 1
234 
235     iband = FLOOR(tovs%lat/BDIV) + BOFF   !! latitude band
236 
237     DO j=1, tovs%nchan
238       IF ( tovs%qc_flag(j) == 1 ) THEN
239 
240 !  statistics for channel
241 !--------------------------
242         nobs(j) = nobs(j) + 1
243         vmean_dep(j) = vmean_dep(j) + vec_dep(j)
244          vstd_dep(j) = vstd_dep(j) + vec_dep(j)*vec_dep(j)
245         vmean_abs(j) = vmean_abs(j) + vec_abs(j)
246          vstd_abs(j) = vstd_abs(j) + vec_abs(j)*vec_abs(j)
247         
248 !  statistics for channel+scan position
249 !----------------------------------------
250         nscanch(j,jscan) = nscanch(j,jscan) + 1
251           vmnsc(j,jscan) = vmnsc(j,jscan) + vec_dep(j)
252          vstdsc(j,jscan) = vstdsc(j,jscan) + vec_dep(j)*vec_dep(j)
253 
254 !  statistics for channel + scan position + lat band
255 !---------------------------------------------------------- 
256         nscanchb(j,jscan,iband) =  nscanchb(j,jscan,iband) + 1
257           vmnscb(j,jscan,iband) = vmnscb(j,jscan,iband) + vec_dep(j)
258          vstdscb(j,jscan,iband) = vstdscb(j,jscan,iband) + vec_dep(j)*vec_dep(j)
259 
260       ENDIF
261     ENDDO
262 
263   ENDDO loop2
264 
265 ! Write scan 'core' arrays NOTE: not divided by nobs
266 !------------------------------------------------------
267   WRITE(11) nobs(:)         ! statistics for channel
268   WRITE(11) vmean_dep(:)
269   WRITE(11) vstd_dep(:)
270   WRITE(11) vmean_abs(:)
271   WRITE(11) vstd_abs(:)
272 
273   WRITE(11) nscanch(:,:)    ! statistics for channel + scan position
274   WRITE(11) vmnsc(:,:)
275   WRITE(11) vstdsc(:,:)
276 
277   WRITE(11) nscanchb(:,:,:) ! statistics for channel + scan position + lat band
278   WRITE(11) vmnscb(:,:,:)
279   WRITE(11) vstdscb(:,:,:)
280 
281 ! Write out copious amounts of output
282 !----------------------------------------
283   WRITE (6,270) icount,nobs(1:tovs%nchan)
284 
285   WHERE (nobs(:) /= 0)     ! for channels
286     vmean_dep(:) = vmean_dep(:)/nobs(:)
287     vstd_dep(:) = vstd_dep(:)/nobs(:) - vmean_dep(:)**2
288     vstd_dep(:) = SQRT(MAX(0.0,vstd_dep(:)))
289     vmean_abs(:) = vmean_abs(:)/nobs(:)
290     vstd_abs(:) = vstd_abs(:)/nobs(:) - vmean_abs(:)**2
291     vstd_abs(:) = SQRT(MAX(0.0,vstd_abs(:)))
292   END WHERE
293 
294   DO j=1, tovs%nchan
295     WHERE (nscanch(j,:) /= 0)  ! for channels + scan
296       vmnsc(j,:) = vmnsc(j,:)/nscanch(j,:)
297       vstdsc(j,:) = vstdsc(j,:)/nscanch(j,:) - vmnsc(j,:)**2
298       vstdsc(j,:) = SQRT(MAX(0.0,vstdsc(j,:)))
299     END WHERE
300     WHERE (nscanchb(j,:,:) /= 0) ! for channels + scan + band
301       vmnscb(j,:,:) = vmnscb(j,:,:)/nscanchb(j,:,:)
302       vstdscb(j,:,:) = vstdscb(j,:,:)/nscanchb(j,:,:) - vmnscb(j,:,:)**2
303       vstdscb(j,:,:) = SQRT(MAX(0.0,vstdscb(j,:,:)))
304     END WHERE
305 
306 !  4.1 compute central scan position mean
307 !--------------------------------------------
308     IF (MOD(KSCAN,2) == 0 ) THEN   ! even scan number
309       iscanm = KSCAN/2     !! middle scan position
310 
311       IF( nscanch(j,iscanm) .ne. 0 .and. nscanch(j,iscanm+1) .ne.0 )then  
312          vmn0 = 0.5*(vmnsc(j,iscanm)+vmnsc(j,iscanm+1))
313          vmn0b(:) = 0.5*(vmnscb(j,iscanm,:)+vmnscb(j,iscanm+1,:))
314       ENDIF
315 
316       IF( nscanch(j,iscanm) .eq. 0 .and. nscanch(j,iscanm+1) .ne.0 )then  
317          vmn0 = vmnsc(j,iscanm+1)
318          vmn0b(:) = vmnscb(j,iscanm+1,:)
319       ENDIF
320 
321       IF( nscanch(j,iscanm) .ne. 0 .and. nscanch(j,iscanm+1) .eq.0 )then  
322          vmn0 = vmnsc(j,iscanm)
323          vmn0b(:) = vmnscb(j,iscanm,:)
324       ENDIF
325 
326     ELSE
327       iscanm = kscan/2 + 1
328       vmn0 = vmnsc(j,iscanm)
329       vmn0b(:) = vmnscb(j,iscanm,:)
330     ENDIF
331 
332 !  4.2 compute relative bias
333 !------------------------------------
334    DO k=1,KSCAN
335    IF( nscanch(j,k) .ne. 0 )then
336     vmnrl(j,k)=vmnsc(j,k) - vmn0
337     DO l=1, JBAND
338       vmnrlb(j,K,l) = vmnscb(j,K,l) - vmn0b(l)
339     ENDDO
340    ENDIF
341    ENDDO
342 
343   ENDDO
344 
345 ! prinit output
346 
347 !------------------
348   WRITE (6,388)
349   388 FORMAT (/1X,'SECOND PASS: MEANS AND STANDARD DEVIATIONS')
350   DO j=1, tovs%nchan
351     jv = j
352     WRITE (6,289) jv, nobs(j), vmean_abs(j), vstd_abs(j), vmean_dep(j), vstd_dep(j)
353   ENDDO
354 
355 !-------------------
356   WRITE (6,370) (js,js=1,KSCAN)
357   370 FORMAT (/5X,'NUMBER AT EACH SCAN POSITION'/5X,30I7)
358 
359   DO j=1, tovs%nchan
360     jv = j
361     WRITE(6,371) jv, nscanch(j,1:KSCAN)
362   ENDDO
363   371 FORMAT(1X,I4,30I7)
364 
365   WRITE (6,391) (js,js=1,KSCAN)
366   391 FORMAT (/1X,'BIASES FOR EACH SCAN ANGLE'/4X,30I7)
367   DO j=1, tovs%nchan
368     jv = j
369     WRITE (6,393) jv, (vmnsc(j,js),js=1,KSCAN)
370   ENDDO
371   393 FORMAT (1X,I3,30F7.2)
372 
373   WRITE (6,394) (js,js=1,KSCAN)
374   394 FORMAT (/1X,'STD DEV FOR EACH SCAN ANGLE'/4X,30I7)
375   DO j=1, tovs%nchan
376      jv = j
377     WRITE (6,396) jv, (vstdsc(j,js),js=1,KSCAN)
378   ENDDO
379   396  FORMAT (1X,I3,30F7.2)
380 
381 !----------------------
382   if (global) then
383     WRITE(6,'(1x,a17,2i4)') 'SCAN COEFFICIENTS', jband,kscan
384     DO j=1,tovs%nchan
385       jv = j
386       DO iband=1, jband
387          WRITE(6,'(2i3,30f7.2)') jv, iband, vmnrlb(j,1:KSCAN,iband)
388       ENDDO
389     ENDDO
390 
391     if (smoothing) then
392 
393      CLOSE(11)
394 
395      OPEN(11,FORM='UNFORMATTED')
396 
397      READ(11) nobs(:)
398      READ(11) vmean_dep(:)
399      READ(11) vstd_dep(:)
400      READ(11) vmean_abs(:)
401      READ(11) vstd_abs(:)
402 
403      READ(11) nscanch(:,:)
404      READ(11) vmnsc(:,:)
405      READ(11) vstdsc(:,:)
406 
407      READ(11) nscanchb(:,:,:)
408      READ(11) vmnscb(:,:,:)
409      READ(11) vstdscb(:,:,:)
410 
411 ! Perform smoothing on banded corrections.
412 ! for absolute bias/stdev
413 
414      vmnscbt = 0.0
415      vstdscbt= 0.0
416      nscanchbt = 0
417 
418      DO j=1, tovs%nchan
419       DO iband=1, JBAND
420 
421 !      IF (iband <= AVBAND) THEN
422 !        aoff = AVBAND - iband + 1
423 !        avb = AVBAND
424 !      ELSEIF ((iband < 2*AVBAND+1) .AND. (iband > AVBAND))  THEN
425 !        aoff = 0
426 !        avb = 2*AVBAND+1 - iband
427 !      ELSEIF ((iband >= 2*AVBAND+1) .AND. (JBAND-iband+1 >= 2*AVBAND+1)) THEN
428 !        aoff = 0
429 !        avb = 0
430 !      ELSEIF ((JBAND-iband+1 < 2*AVBAND+1) .AND. (JBAND-iband+1 > AVBAND)) THEN
431 !        aoff = 0
432 !        avb = 2*AVBAND+1 - (JBAND-iband+1)
433 !      ELSEIF (JBAND-iband+1 <= AVBAND) THEN
434 !        aoff = -(AVBAND - (JBAND-iband+1) + 1)
435 !        avb = AVBAND
436 !      ENDIF
437 
438 !      DO ia=-avb, avb
439 !        iab = iband + ia + aoff
440 !        vmnscbt(j,1:KSCAN,iband) = vmnscbt(j,1:KSCAN,iband) + vmnscb(j,1:KSCAN,IAb)
441 !        vstdscbt(j,1:KSCAN,iband) = vstdscbt(j,1:KSCAN,iband) + vstdscb(j,1:KSCAN,IAb)
442 !        nscanchbt(j,1:KSCAN,iband) = nscanchbt(j,1:KSCAN,iband) + nscanchb(j,1:KSCAN,IAb)
443 !      ENDDO
444         vmnscbt(j,1:KSCAN,iband) =  vmnscb(j,1:KSCAN,iband)
445         vstdscbt(j,1:KSCAN,iband) = vstdscb(j,1:KSCAN,iband)
446         nscanchbt(j,1:KSCAN,iband) = nscanchb(j,1:KSCAN,iband)
447       ENDDO
448     ENDDO
449  
450     DO j=1, tovs%nchan
451       WHERE (nscanchbt(j,1:KSCAN,:) /= 0)
452        vmnscbt(j,1:KSCAN,:) = vmnscbt(j,1:KSCAN,:)/nscanchbt(j,1:KSCAN,:)
453        vstdscbt(j,1:KSCAN,:) = vstdscbt(j,1:KSCAN,:)/nscanchbt(j,1:KSCAN,:) - vmnscbt(j,1:KSCAN,:)**2
454        vstdscbt(j,1:KSCAN,:) = SQRT(MAX(0.0,vstdscbt(j,1:KSCAN,:)))
455       END WHERE
456 
457 ! get bias at nadir
458     IF (MOD(KSCAN,2) == 0 ) THEN  ! even scan number
459       iscanm = KSCAN/2
460 
461       IF( nscanch(j,iscanm) .ne. 0 .and. nscanch(j,iscanm+1) .ne.0 )then
462          vmn0b(:) = 0.5*(vmnscbt(j,iscanm,:)+vmnscbt(j,iscanm+1,:))
463       ENDIF
464 
465       IF( nscanch(j,iscanm) .eq. 0 .and. nscanch(j,iscanm+1) .ne.0 )then
466          vmn0b(:) = vmnscbt(j,iscanm+1,:)
467       ENDIF
468 
469       IF( nscanch(j,iscanm) .ne. 0 .and. nscanch(j,iscanm+1) .eq.0 )then
470          vmn0b(:) = vmnscbt(j,iscanm,:)
471       ENDIF
472 
473     ELSE
474       iscanm = kscan/2 + 1
475       vmn0b(:) = vmnscbt(j,iscanm,:)
476     ENDIF
477 
478 !  4.2 compute relative bias
479 !------------------------------------
480    DO k=1,KSCAN
481    IF( nscanch(j,k) .ne. 0 )then
482     DO l=1, JBAND
483       vmnrlb(j,k,l) = vmnscbt(j,k,l) - vmn0b(l)
484     ENDDO
485    ENDIF
486    ENDDO
487 
488   ENDDO
489 
490 ! Perform smoothing on banded corrections.
491 ! for relative bias
492 
493 !  DO j=1, tovs%nchan
494 !    vmnrlbt(j,1:KSCAN,1) = 0.50*vmnrlb(j,1:KSCAN,1) &
495 !                         + 0.50*vmnrlb(j,1:KSCAN,2)
496 !    DO iband=2, JBAND-1
497 !      vmnrlbt(j,1:KSCAN,iband) = 0.25*vmnrlb(j,1:KSCAN,iband-1) &
498 !                               + 0.50*vmnrlb(j,1:KSCAN,iband) &
499 !                               + 0.25*vmnrlb(j,1:KSCAN,iband+1)
500 !    ENDDO
501 !    vmnrlbt(j,1:KSCAN,JBAND) = 0.50*vmnrlb(j,1:KSCAN,JBAND-1) &
502 !                             + 0.50*vmnrlb(j,1:KSCAN,JBAND)
503 !  ENDDO
504 
505  if ( (eband-sband+1) >= 3 ) then
506   DO j=1, tovs%nchan
507     vmnrlbt(j,1:KSCAN,sband) = 0.50*vmnrlb(j,1:KSCAN,sband) &
508                          + 0.50*vmnrlb(j,1:KSCAN,sband+1)
509     DO iband=sband, eband-1
510       vmnrlbt(j,1:KSCAN,iband) = 0.25*vmnrlb(j,1:KSCAN,iband-1) &
511                                + 0.50*vmnrlb(j,1:KSCAN,iband) &
512                                + 0.25*vmnrlb(j,1:KSCAN,iband+1)
513     ENDDO
514     vmnrlbt(j,1:KSCAN,eband) = 0.50*vmnrlb(j,1:KSCAN,eband-1) &
515                              + 0.50*vmnrlb(j,1:KSCAN,eband)
516   ENDDO
517  elseif ( (eband-sband+1) == 2 ) then
518     vmnrlbt(j,1:KSCAN,sband) = 0.50*vmnrlb(j,1:KSCAN,sband) &
519                          + 0.50*vmnrlb(j,1:KSCAN,sband+1)
520     vmnrlbt(j,1:KSCAN,eband) = 0.50*vmnrlb(j,1:KSCAN,eband-1) &
521                              + 0.50*vmnrlb(j,1:KSCAN,eband)
522  elseif ( (eband-sband+1) == 1 ) then 
523     vmnrlbt(j,1:KSCAN,sband) = vmnrlb(j,1:KSCAN,sband)
524     vmnrlbt(j,1:KSCAN,eband) = vmnrlb(j,1:KSCAN,eband) 
525  endif
526 
527 ! output relative bias
528   DO j=1, tovs%nchan
529      jv = j
530     DO iband=1,JBAND
531       WRITE(12) jv, vmnrlbt(j,1:KSCAN,iband)
532     ENDDO
533   ENDDO
534 
535 !----------------------
536     WRITE(6,'(1x,a30,2i4)') 'SMOOTHED SCAN COEFFICIENTS', jband,kscan
537     DO j=1,tovs%nchan
538       jv = j
539       DO iband=1, jband
540          WRITE(6,'(2i3,30f7.2)') jv, iband, vmnrlbt(j,1:KSCAN,iband)
541       ENDDO
542     ENDDO
543 
544  end if   ! end if smoothing
545 
546  else  ! regional 
547 !---------------------
548   WRITE (6,397) (js,js=1,KSCAN)
549   397 FORMAT (/1X,'RELATIVE BIASES FOR EACH SCAN ANGLE'/4X,30I7)
550   DO j=1, tovs%nchan
551       jv = j
552     WRITE (6,399) jv, vmnrl(j,1:KSCAN)
553   ENDDO
554   399 FORMAT (1X,I3,30F7.2)
555 
556   DO j=1, tovs%nchan
557      jv = j
558      WRITE(12) jv, vmnrl(j,1:KSCAN)
559   ENDDO
560 
561 !----------------------
562  end if   ! global
563 
564    deallocate(tovs%tb)
565    deallocate(tovs%omb)
566    deallocate(tovs%bias)
567    deallocate(tovs%qc_flag)
568    deallocate(tovs%cloud_flag)
569    deallocate(tovs%pred)
570 
571   CLOSE(UNIT=10)
572   CLOSE(UNIT=11)
573   CLOSE(UNIT=12)
574 
575   END PROGRAM da_bias_scan