1 subroutine da_write_iv_rad_ascii (it, ob, iv )
3 !---------------------------------------------------------------------------
4 ! Purpose: write out innovation vector structure for radiance data.
5 !---------------------------------------------------------------------------
9 integer , intent(in) :: it ! outer loop count
10 type (y_type), intent(in) :: ob ! Observation structure.
11 type (iv_type), intent(in) :: iv ! O-B structure.
13 integer :: n ! Loop counter.
14 integer :: i, k, l ! Index dimension.
15 integer :: nlevelss ! Number of obs levels.
17 integer :: ios, innov_rad_unit
18 character(len=filename_len) :: filename
19 character(len=7) :: surftype
22 if (trace_use) call da_trace_entry("da_write_iv_rad_ascii")
25 if (iv%instid(i)%num_rad < 1) cycle
27 ! count number of obs within the loc%proc_domain
28 ! ---------------------------------------------
30 do n =1,iv%instid(i)%num_rad
31 if (iv%instid(i)%info%proc_domain(1,n)) then
35 if (ndomain < 1) cycle
37 write(unit=filename, fmt='(i2.2,a,i4.4)') it,'_inv_'//trim(iv%instid(i)%rttovid_string)//'.', myproc
39 call da_get_unit(innov_rad_unit)
40 open(unit=innov_rad_unit,file=trim(filename),form='formatted',iostat=ios)
42 call da_error(__FILE__,__LINE__, &
43 (/"Cannot open innovation radiance file"//filename/))
45 write(unit=innov_rad_unit,fmt='(a,a,i7,a,i5,a)') trim(iv%instid(i)%rttovid_string), &
46 ' number-of-pixels : ', ndomain, &
47 ' channel-number-of-each-pixel : ', iv%instid(i)%nchan, &
48 ' index-of-channels : '
49 write(unit=innov_rad_unit,fmt='(10i5)') iv%instid(i)%ichan
51 write(unit=innov_rad_unit,fmt=*) ' pixel-info : i date scanpos landsea_mask elv lat lon satzen satazi'
52 write(unit=innov_rad_unit,fmt=*) ' grid%xb-surf-info : i t2m mr2m(ppmv) u10 v10 ps ts smois tslb snowh isflg &
53 & soiltyp vegtyp vegfra elev clwp'
55 do n =1,iv%instid(i)%num_rad
56 if (iv%instid(i)%info%proc_domain(1,n)) then
58 write(unit=innov_rad_unit,fmt='(a,i7,2x,a,i6,i3,f6.0,4f8.2)') 'INFO : ', ndomain, &
59 iv%instid(i)%info%date_char(n), &
60 iv%instid(i)%scanpos(n), &
61 iv%instid(i)%landsea_mask(n), &
62 iv%instid(i)%info%elv(n), &
63 iv%instid(i)%info%lat(1,n), &
64 iv%instid(i)%info%lon(1,n), &
65 iv%instid(i)%satzen(n), &
66 iv%instid(i)%satazi(n)
67 select case (iv%instid(i)%isflg(n))
85 write(unit=innov_rad_unit,fmt='(a,i7,9f10.2,3i3,f8.3,f10.2,f8.3)') surftype, n, &
86 iv%instid(i)%t2m(n), &
87 iv%instid(i)%mr2m(n), &
88 iv%instid(i)%u10(n), &
89 iv%instid(i)%v10(n), &
92 iv%instid(i)%smois(n), &
93 iv%instid(i)%tslb(n), &
94 iv%instid(i)%snowh(n), &
95 iv%instid(i)%isflg(n), &
96 nint(iv%instid(i)%soiltyp(n)), &
97 nint(iv%instid(i)%vegtyp(n)), &
98 iv%instid(i)%vegfra(n), &
99 iv%instid(i)%elevation(n), &
102 write(unit=innov_rad_unit,fmt='(a)') 'OBS : '
103 write(unit=innov_rad_unit,fmt='(10f11.2)') ob%instid(i)%tb(:,n)
104 write(unit=innov_rad_unit,fmt='(a)') 'BAK : '
105 write(unit=innov_rad_unit,fmt='(10f11.2)') iv%instid(i)%tb_xb(:,n)
106 write(unit=innov_rad_unit,fmt='(a)') 'IVBC : '
107 write(unit=innov_rad_unit,fmt='(10f11.2)') iv%instid(i)%tb_inv(:,n)
108 write(unit=innov_rad_unit,fmt='(a)') 'EMS : '
109 write(unit=innov_rad_unit,fmt='(10f11.2)') iv%instid(i)%emiss(1:iv%instid(i)%nchan,n)
110 if (rtm_option==rtm_option_crtm .and. write_jacobian) then
111 write(unit=innov_rad_unit,fmt='(a)') 'EMS_JACOBIAN : '
112 write(unit=innov_rad_unit,fmt='(10f10.3)') iv%instid(i)%emiss_jacobian(1:iv%instid(i)%nchan,n)
114 write(unit=innov_rad_unit,fmt='(a)') 'ERR : '
115 write(unit=innov_rad_unit,fmt='(10f11.2)') iv%instid(i)%tb_error(:,n)
116 write(unit=innov_rad_unit,fmt='(a)') 'QC : '
117 write(unit=innov_rad_unit,fmt='(10i11)') iv%instid(i)%tb_qc(:,n)
119 if (write_profile) then
120 nlevelss = iv%instid(i)%nlevels
121 if ( rtm_option == rtm_option_rttov ) then
123 ! first, write RTTOV levels
124 write(unit=innov_rad_unit,fmt=*) 'RTM_level pres(mb) T(k) Q(ppmv)'
126 write(unit=innov_rad_unit,fmt='(i3,f10.2,f8.2,e11.4)') &
128 coefs(i) % ref_prfl_p(k) , &
129 iv%instid(i)%t(k,n) , &
131 end do ! end loop RTTOV level
132 ! second, write WRF model levels
133 write(unit=innov_rad_unit,fmt=*) &
134 'WRF_level pres(mb) T(k) q(g/kg) clw(g/kg) rain(g/kg)'
136 write(unit=innov_rad_unit,fmt='(i3,f10.2,f8.2,3e11.4)') &
137 k, & ! WRF model levels
138 iv%instid(i)%pm(k,n) , &
139 iv%instid(i)%tm(k,n) , &
140 iv%instid(i)%qm(k,n)*1000 , &
141 iv%instid(i)%qcw(k,n)*1000.0, &
142 iv%instid(i)%qrn(k,n)*1000.0
143 end do ! end loop model level
145 end if ! end if rtm_option_rttov
147 if ( rtm_option == rtm_option_crtm ) then
149 write(unit=innov_rad_unit,fmt=*) &
150 'level fullp(mb) halfp(mb) t(k) q(g/kg) water(mm) ice(mm) rain(mm) snow(mm) graupel(mm) hail(mm)'
152 do k=1,iv%instid(i)%nlevels-1
153 write(unit=innov_rad_unit,fmt='(i3,2f10.2,f8.2,13f8.3)') &
155 iv%instid(i)%pf(k,n), &
156 iv%instid(i)%pm(k,n), &
157 iv%instid(i)%tm(k,n), &
158 iv%instid(i)%qm(k,n), &
159 iv%instid(i)%qcw(k,n), &
160 iv%instid(i)%qci(k,n), &
161 iv%instid(i)%qrn(k,n), &
162 iv%instid(i)%qsn(k,n), &
163 iv%instid(i)%qgr(k,n), &
164 iv%instid(i)%qhl(k,n), &
165 iv%instid(i)%rcw(k,n), &
166 iv%instid(i)%rci(k,n), &
167 iv%instid(i)%rrn(k,n), &
168 iv%instid(i)%rsn(k,n), &
169 iv%instid(i)%rgr(k,n), &
170 iv%instid(i)%rhl(k,n)
171 end do ! end loop profile
173 do k=1,iv%instid(i)%nlevels-1
174 write(unit=innov_rad_unit,fmt='(i3,2f10.2,f8.2,7f8.3)') &
176 iv%instid(i)%pf(k,n), &
177 iv%instid(i)%pm(k,n), &
178 iv%instid(i)%tm(k,n), &
179 iv%instid(i)%qm(k,n), &
186 end do ! end loop profile
187 end if ! end if crtm_cloud
189 end if ! end if rtm_option_crtm
191 end if ! end if write_profile
193 if ( rtm_option == rtm_option_crtm .and. write_jacobian) then
195 write(unit=innov_rad_unit,fmt=*) &
196 'channel level halfp(mb) t(k) q(g/kg) water(mm) ice(mm) rain(mm) snow(mm) graupel(mm) hail(mm)'
198 do l=1,iv%instid(i)%nchan
199 do k=1,iv%instid(i)%nlevels-1
200 write(unit=innov_rad_unit,fmt='(i5,i3,f10.2,8f8.3,6f8.3)') &
202 iv%instid(i)%pm(k,n), &
203 iv%instid(i)%t_jacobian(l,k,n), &
204 iv%instid(i)%q_jacobian(l,k,n), &
205 iv%instid(i)%water_jacobian(l,k,n), &
206 iv%instid(i)%ice_jacobian(l,k,n), &
207 iv%instid(i)%rain_jacobian(l,k,n), &
208 iv%instid(i)%snow_jacobian(l,k,n), &
209 iv%instid(i)%graupel_jacobian(l,k,n), &
210 iv%instid(i)%hail_jacobian(l,k,n), &
211 iv%instid(i)%water_r_jacobian(l,k,n), &
212 iv%instid(i)%ice_r_jacobian(l,k,n), &
213 iv%instid(i)%rain_r_jacobian(l,k,n), &
214 iv%instid(i)%snow_r_jacobian(l,k,n), &
215 iv%instid(i)%graupel_r_jacobian(l,k,n), &
216 iv%instid(i)%hail_r_jacobian(l,k,n)
217 end do ! end loop profile
218 end do ! end loop channels
220 do l=1,iv%instid(i)%nchan
221 do k=1,iv%instid(i)%nlevels-1
222 write(unit=innov_rad_unit,fmt='(i5,i3,f10.2,8f8.3,6f8.3)') &
224 iv%instid(i)%pm(k,n), &
225 iv%instid(i)%t_jacobian(l,k,n), &
226 iv%instid(i)%q_jacobian(l,k,n), &
239 end do ! end loop profile
240 end do ! end loop channels
241 end if ! end if crtm_cloud
243 end if ! end if write_jacobian
245 end if ! end if proc_domain
246 end do ! end do pixels
247 close(unit=innov_rad_unit)
248 call da_free_unit(innov_rad_unit)
249 end do ! end do instruments
251 if (trace_use) call da_trace_exit("da_write_iv_rad_ascii")
253 end subroutine da_write_iv_rad_ascii