1 subroutine da_setup_radiance_structures( grid, ob, iv )
3 !---------------------------------------------------------------------------
4 ! Purpose: Define, allocate and read of tovs raidance observation structure.
5 !---------------------------------------------------------------------------
9 type (domain) , intent(inout) :: grid ! model data
10 type ( y_type), intent(inout) :: ob ! Observation structure.
11 type (iv_type), intent(inout) :: iv ! O-B structure.
13 character(len=200) :: filename
14 integer :: i, j, n, ios
18 integer :: istart,iend,jstart,jend
21 integer :: n1,n2,k,its,ite,jts,jte,kts,kte,inst
23 if (trace_use) call da_trace_entry("da_setup_radiance_structures")
25 !-------------------------------------------------------------------
26 ! [1.0] Initialize RTTOV coefs and innovations vector for radiance
27 !-------------------------------------------------------------------
29 call da_radiance_init(iv, ob)
31 do n = 1, rtminit_nsensor
32 iv%instid(n)%rad_monitoring = rad_monitoring(n)
35 !-------------------------------
36 ! 1.1 Make thinning grids
37 !------------------------------
38 call init_constants_derived
46 istart=MINVAL( grid%i_start(1:grid%num_tiles) )
47 iend =MAXVAL( grid%i_end (1:grid%num_tiles) )
48 jstart=MINVAL( grid%j_start(1:grid%num_tiles) )
49 jend =MAXVAL( grid%j_end (1:grid%num_tiles) )
53 rlat_min=min(rlat_min, grid%xb%lat(i,j))
54 rlat_max=max(rlat_max, grid%xb%lat(i,j))
55 if( grid%xb%lon(i,j) < zero) then
56 rlon_min=min(rlon_min, (r360+grid%xb%lon(i,j)))
57 rlon_max=max(rlon_max, (r360+grid%xb%lon(i,j)))
59 rlon_min=min(rlon_min, grid%xb%lon(i,j))
60 rlon_max=max(rlon_max, grid%xb%lon(i,j))
66 call mpi_reduce(rlat_min, rlonlat(1), 1, true_mpi_real, mpi_min, root, comm, ierr)
67 call mpi_reduce(rlon_min, rlonlat(2), 1, true_mpi_real, mpi_min, root, comm, ierr)
68 call mpi_reduce(rlat_max, rlonlat(3), 1, true_mpi_real, mpi_max, root, comm, ierr)
69 call mpi_reduce(rlon_max, rlonlat(4), 1, true_mpi_real, mpi_max, root, comm, ierr)
71 CALL mpi_bcast( rlonlat, 4 , true_mpi_real , root , comm, ierr )
79 dlat_grid = rlat_max - rlat_min
80 dlon_grid = rlon_max - rlon_min
82 allocate(thinning_grid(iv%num_inst))
84 call makegrids (n,thinning_mesh(n))
88 !-------------------------------------------------------------------
89 ! [2.0] Read NCEP bufr tovs data in radiance innovations vector
90 !-------------------------------------------------------------------
92 if ( (.not. use_filtered_rad) .and. (.not. use_pseudo_rad) .and. (.not. use_simulated_rad) ) then
94 if (use_hirs2obs) then
95 write(unit=stdout,fmt='(a)') 'Reading radiance 1b data from hirs2.bufr'
97 write(filename(1:10), fmt='(a)') 'hirs2.bufr'
98 call da_read_obs_bufrtovs ('hirs2', iv, filename)
103 write(unit=stdout,fmt='(a)') 'Reading radiance 1b data from msu.bufr'
104 write(filename(1:8), fmt='(a)') 'msu.bufr'
105 call da_read_obs_bufrtovs ('msu ', iv, filename)
108 if (use_hirs3obs) then
109 write(unit=stdout,fmt='(a)') 'Reading radiance 1b data from hirs3.bufr'
111 write(filename(1:10), fmt='(a)') 'hirs3.bufr'
112 call da_read_obs_bufrtovs('hirs3', iv, filename)
115 if (use_amsuaobs) then
116 write(unit=stdout,fmt='(a)') 'Reading radiance 1b data from amsua.bufr'
118 write(filename(1:10), fmt='(a)') 'amsua.bufr'
119 call da_read_obs_bufrtovs ('amsua', iv, filename)
122 if (use_amsubobs) then
123 write(unit=stdout,fmt='(a)') 'Reading radiance 1b data from amsub.bufr'
125 write(filename(1:10), fmt='(a)') 'amsub.bufr'
126 call da_read_obs_bufrtovs ('amsub', iv, filename)
129 if (use_hirs4obs) then
130 write(unit=stdout,fmt='(a)') 'Reading radiance 1b data from hirs4.bufr'
132 write(filename(1:10), fmt='(a)') 'hirs4.bufr'
133 call da_read_obs_bufrtovs('hirs4', iv, filename)
137 write(unit=stdout,fmt='(a)') 'Reading radiance 1b data from mhs.bufr'
139 write(filename(1:8), fmt='(a)') 'mhs.bufr'
140 call da_read_obs_bufrtovs('mhs ', iv, filename)
143 if (use_airsobs) then
144 write(unit=stdout,fmt='(a)') 'Reading airs 1b data from airs.bufr'
146 write(filename(1:9), fmt='(a)') 'airs.bufr'
147 call da_read_obs_bufrairs ('airs ',iv, filename)
150 if (use_eos_amsuaobs) then
151 write(unit=stdout,fmt='(a)') 'Reading eos_amsua 1b data from airs.bufr'
153 write(filename(1:9), fmt='(a)') 'airs.bufr'
154 call da_read_obs_bufrairs ('eos_amsua',iv, filename)
158 write(unit=stdout,fmt='(a)') 'Reading hsb 1b data from airs.bufr'
160 write(filename(1:9), fmt='(a)') 'airs.bufr'
161 call da_read_obs_bufrairs ('hsb ',iv, filename)
164 if (use_ssmisobs) then
165 write(unit=stdout,fmt='(a)') 'Reading ssmis data from ssmis.bufr'
167 write(filename(1:10), fmt='(a)') 'ssmis.bufr'
168 call da_read_obs_bufrssmis ('ssmis',iv, filename)
173 if ( use_filtered_rad ) then
174 write(unit=stdout,fmt='(a)') 'Reading filtered radiance'
175 call da_read_filtered_rad (iv)
178 if ( use_simulated_rad ) then
179 write(unit=stdout,fmt='(a)') 'Reading simulated radiance'
180 call da_read_simulated_rad (iv)
183 if ( use_pseudo_rad ) then
184 write(unit=stdout,fmt='(a)') 'Reading pseudo radiance from namelist'
185 call da_read_pseudo_rad (iv)
188 if (use_kma1dvar) then
189 do i=1,rtminit_nsensor
191 filename='kma1dvar-'//trim(iv%instid(i)%rttovid_string)//'.inv'
192 write(unit=stdout,fmt='(a,a)') ' Reading KMA 1dvar innovation from ', filename
193 call da_read_kma1dvar (i,iv, ob, filename)
199 call destroygrids (n)
201 deallocate(thinning_grid)
204 ! sorting obs into FGAT time bins
207 !-----------------------------------------------------------------------------
208 ! [3.0] create (smaller) ob structure:
209 !-----------------------------------------------------------------------------
211 if (.not. use_kma1dvar) then
212 do i = 1, ob % num_inst
213 ob % instid(i) % num_rad = iv % instid(i) % num_rad
214 if (ob % instid(i) % num_rad < 1) cycle
215 allocate (ob % instid(i) % tb(ob % instid(i) % nchan,ob % instid(i)%num_rad))
216 ob % instid(i) % tb(:,:) = iv % instid(i) % tb_inv(:,:)
220 ! Calculate DT for Cloudy Radiance DA
222 if (use_rad .and. crtm_cloud .and. .not. DT_cloud_model) then
230 grid%xb%delt(its:ite,jts:jte,kts:kte) = 0.0
232 do inst= 1, iv % num_inst
233 do n=1,iv%instid(inst)%num_rad
234 i = int(iv%instid(inst)%info%i(1,n))
235 j = int(iv%instid(inst)%info%j(1,n))
236 grid%xb%delt(i:i+1, j:j+1, kts:kte) = 1800.0
242 if (trace_use) call da_trace_exit("da_setup_radiance_structures")
244 end subroutine da_setup_radiance_structures