da_bias_scan.f90

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