IODA Bundle
main.f90
Go to the documentation of this file.
1 program bufr2nc
2 
4 use kinds, only: i_kind
7 use ncio_mod, only: write_obs
9 
10 implicit none
11 
12 integer(i_kind), parameter :: strlen = 512
13 integer(i_kind), parameter :: namelen = 64
14 integer(i_kind), parameter :: datelen = 10
15 integer(i_kind), parameter :: nfile_all = 5
16 integer(i_kind), parameter :: ftype_unknown = -1
17 integer(i_kind), parameter :: ftype_prepbufr = 1
18 integer(i_kind), parameter :: ftype_gnssro = 2
19 integer(i_kind), parameter :: ftype_amsua = 3
20 integer(i_kind), parameter :: ftype_mhs = 4
21 integer(i_kind), parameter :: ftype_airs = 5
22 
23 integer(i_kind) :: ftype(nfile_all)
24 character(len=NameLen) :: flist_all(nfile_all) = &
25  (/ &
26  "gnssro.bufr ", &
27  "prepbufr.bufr ", &
28  "amsua.bufr ", &
29  "airs.bufr ", &
30  "mhs.bufr " &
31  /)
32 character (len=NameLen) :: flist(nfile_all) ! file names to be read in from command line arguments
33 character (len=NameLen) :: filename
34 character (len=DateLen) :: filedate
35 character (len=StrLen) :: inpdir, outdir
36 logical :: fexist
37 logical :: do_radiance
38 logical :: apply_gsi_qc
39 integer(i_kind) :: nfile, ifile
40 integer(i_kind) :: itmp
41 
42 
43 do_radiance = .false. ! initialize
44 apply_gsi_qc = .false.
45 
47 
48 do ifile = 1, nfile
49 
50  filename = flist(ifile)
51 
52  if ( ftype(ifile) == ftype_gnssro ) then
53  inquire(file=trim(inpdir)//trim(filename), exist=fexist)
54  if ( .not. fexist ) then
55  write(*,*) 'Warning: ', trim(inpdir)//trim(filename), ' not found for decoding...'
56  else
57  write(*,*) '--- processing gnssro.bufr ---'
58  call read_write_gnssro(trim(inpdir)//trim(filename), trim(outdir))
59  end if
60  end if
61 
62  if ( ftype(ifile) == ftype_prepbufr ) then
63  inquire(file=trim(inpdir)//trim(filename), exist=fexist)
64  if ( .not. fexist ) then
65  write(*,*) 'Warning: ', trim(inpdir)//trim(filename), ' not found for decoding...'
66  else
67  ! read prepbufr file and store data in sequential linked list for conv obs
68  call read_prepbufr(trim(inpdir)//trim(filename), filedate)
69 
70  if ( apply_gsi_qc ) then
71  write(*,*) '--- applying some additional QC as in GSI read_prepbufr.f90 for the global model ---'
72  call filter_obs_conv
73  end if
74 
75  ! transfer info from limked list to arrays grouped by obs/variable types
76  call sort_obs_conv
77 
78  ! write out netcdf files
79  call write_obs(filedate, write_nc_conv, outdir)
80  end if
81  end if
82 
83  if ( ftype(ifile) == ftype_amsua ) then
84  inquire(file=trim(inpdir)//trim(filename), exist=fexist)
85  if ( .not. fexist ) then
86  write(*,*) 'Warning: ', trim(inpdir)//trim(filename), ' not found for decoding...'
87  else
88  do_radiance = .true.
89  ! read bufr file and store data in sequential linked list for radiances
90  call read_amsua_amsub_mhs(trim(inpdir)//trim(filename), filedate)
91  end if
92  end if
93 
94  if ( ftype(ifile) == ftype_airs ) then
95  inquire(file=trim(inpdir)//trim(filename), exist=fexist)
96  if ( .not. fexist ) then
97  write(*,*) 'Warning: ', trim(inpdir)//trim(filename), ' not found for decoding...'
98  else
99  do_radiance = .true.
100  ! read bufr file and store data in sequential linked list for radiances
101  call read_airs_colocate_amsua(trim(inpdir)//trim(filename), filedate)
102  end if
103  end if
104 
105  if ( ftype(ifile) == ftype_mhs ) then
106  inquire(file=trim(inpdir)//trim(filename), exist=fexist)
107  if ( .not. fexist ) then
108  write(*,*) 'Warning: ', trim(inpdir)//trim(filename), ' not found for decoding...'
109  else
110  do_radiance = .true.
111  ! read bufr file and store data in sequential linked list for radiances
112  call read_amsua_amsub_mhs(trim(inpdir)//trim(filename), filedate)
113  end if
114  end if
115 
116 end do ! nfile list
117 
118 if ( do_radiance ) then
119  ! transfer info linked list to arrays grouped by satellite instrument types
120  call sort_obs_radiance
121 
122  ! write out netcdf files
123  call write_obs(filedate, write_nc_radiance, outdir)
124 end if
125 
126 write(6,*) 'all done!'
127 
128 contains
129 
131 
132 implicit none
133 
134 integer(i_kind) :: iunit = 21
135 integer(i_kind) :: narg, iarg, iarg_inpdir, iarg_outdir
136 integer(i_kind) :: itmp
137 integer(i_kind) :: iost, iret, idate
138 character(len=StrLen) :: strtmp
139 character(len=8) :: subset
140 
141 narg = command_argument_count()
142 ifile = 0
143 inpdir = '.'
144 outdir = '.'
145 flist(:) = 'null'
146 if ( narg > 0 ) then
147  do iarg = 1, narg
148  call get_command_argument(number=iarg, value=strtmp)
149  if ( trim(strtmp) == '-qc' ) then
150  apply_gsi_qc = .true.
151  else if ( trim(strtmp) == '-i' ) then
152  iarg_inpdir = iarg + 1
153  else if ( trim(strtmp) == '-o' ) then
154  iarg_outdir = iarg + 1
155  else
156  if ( iarg == iarg_inpdir ) then
157  call get_command_argument(number=iarg, value=inpdir)
158  else if ( iarg == iarg_outdir ) then
159  call get_command_argument(number=iarg, value=outdir)
160  else
161  ifile = ifile + 1
162  call get_command_argument(number=iarg, value=flist(ifile))
163  end if
164  end if
165  end do
166  if ( ifile == 0 ) then
167  nfile = nfile_all
168  flist(:) = flist_all(:)
169  ftype(:) = (/ ftype_gnssro, ftype_prepbufr, ftype_amsua, ftype_airs, ftype_mhs /)
170  else
171  nfile = ifile
172  end if
173 else
174  inpdir = '.'
175  outdir = '.'
176  nfile = nfile_all
177  flist(:) = flist_all(:)
178  ftype(:) = (/ ftype_gnssro, ftype_prepbufr, ftype_amsua, ftype_airs, ftype_mhs /)
179 end if
180 
181 itmp = len_trim(inpdir)
182 if ( inpdir(itmp:itmp) /= '/' ) inpdir = trim(inpdir)//'/'
183 itmp = len_trim(outdir)
184 if ( outdir(itmp:itmp) /= '/' ) outdir = trim(outdir)//'/'
185 
186 ! use default file lists if not set in command-line arguemnt
187 if ( narg == 0 .or. ifile == 0 ) return
188 
189 ! determine the input file type
190 fileloop: do ifile = 1, nfile
191  if ( trim(flist(ifile)) == 'null' ) then
192  ftype(ifile) = ftype_unknown
193  cycle fileloop
194  end if
195  open(unit=iunit, file=trim(inpdir)//trim(flist(ifile)), form='unformatted', iostat=iost, status='old')
196  call openbf(iunit, 'IN', iunit)
197  call readmg(iunit,subset,idate,iret)
198  select case ( trim(subset) )
199  case ( 'ADPUPA', 'ADPSFC' )
200  ftype(ifile) = ftype_prepbufr
201  case ( 'NC003010' )
202  ftype(ifile) = ftype_gnssro
203  case ( 'NC021023' )
204  ftype(ifile) = ftype_amsua
205  case ( 'NC021027' )
206  ftype(ifile) = ftype_mhs
207  case ( 'NC021249' )
208  ftype(ifile) = ftype_airs
209  case default
210  ftype(ifile) = ftype_unknown
211  end select
212  call closbf(iunit)
213 end do fileloop
214 
215 end subroutine parse_files_to_convert
216 
217 end program bufr2nc
subroutine parse_files_to_convert
Definition: main.f90:131
integer(i_kind), parameter write_nc_radiance
Definition: define_mod.f90:25
integer(i_kind), parameter write_nc_conv
Definition: define_mod.f90:24
subroutine read_write_gnssro(infile, outdir)
Definition: gnssro_mod.f90:23
Definition: kinds.f90:1
integer, parameter, public i_kind
Definition: kinds.f90:71
subroutine, public write_obs(filedate, write_opt, outdir)
Definition: ncio_mod.f90:23
subroutine, public sort_obs_conv
subroutine, public read_prepbufr(filename, filedate)
subroutine, public filter_obs_conv
subroutine, public sort_obs_radiance
subroutine, public read_amsua_amsub_mhs(filename, filedate)
subroutine, public read_airs_colocate_amsua(filename, filedate)