da_radiance1.f90

References to this file elsewhere.
1 module da_radiance1
2 
3    !---------------------------------------------------------------------------
4    ! Purpose: module for radiance data assimilation. 
5    !---------------------------------------------------------------------------
6 
7    use module_domain, only : xpose_type
8    use module_radiance, only : satinfo,q2ppmv
9 #ifdef RTTOV
10    use module_radiance, only : coefs,inst_name
11 #endif
12 #ifdef CRTM
13    use module_radiance, only : rttov_inst_name
14 #endif
15 
16    use da_control, only : trace_use,missing_r, rootproc, num_radiance_tot, &
17       stdout,write_profile,myproc,qc_good,num_fgat_time,biascorr,qc_bad, &
18       use_error_factor_rad,biasprep_unit,obs_qc_pointer, filename_len, &
19       num_procs,print_detail_radiance,tovs_min_transfer, rtm_option, &
20       rtminit_sensor,rtminit_nsensor,rtm_option_rttov,rtm_option_crtm, &
21       global
22    use da_define_structures, only : info_type,model_loc_type,maxmin_type, &
23       ob_type, y_type, jo_type,bad_data_type,bad_data_type,number_type
24    use da_par_util, only : da_proc_stats_combine
25    use da_par_util1, only : da_proc_sum_int,da_proc_sum_ints
26    use da_reporting, only : da_error, message, da_warning, da_message
27    use da_statistics, only : da_stats_calculate
28    use da_tools, only : da_residual_new
29    use da_tools1, only : da_free_unit, da_get_unit
30    use da_tracing, only : da_trace_entry, da_trace_exit, da_trace, &
31       da_trace_int_sort
32 
33    implicit none
34    
35    type datalink_type
36 
37       type (info_type)        :: info
38       type (model_loc_type)   :: loc
39 
40       integer   ::  ifgat, landsea_mask
41       integer   ::  scanline, scanpos
42       real      ::  satzen, satazi, solzen, solazi  !  satellite and solar angles
43       ! channels' bright temperature
44       real,    pointer   ::   emiss(:)
45       ! logical, pointer   ::   calcemis(:)
46       integer, pointer   ::   cloud_flag(:)
47       real,    pointer   ::   t(:), mr(:), zk(:)
48       real,    pointer   ::   pm(:), tm(:), qm(:), qrn(:), qcw(:),qci(:),qsn(:),qgr(:)
49       real               ::   ps,ts,t2m,mr2m,u10,v10, clwp
50       real               ::   smois, tslb, snowh, elevation,soiltyp,vegtyp,vegfra
51       integer            ::   isflg
52 !      real,    pointer   ::   tb_xb(:)
53       real, pointer             :: tb_ob(:)
54       real, pointer             :: tb_inv(:)
55       real, pointer             :: tb_qc(:)
56       real, pointer             :: tb_error(:)
57       integer                   :: sensor_index
58       type (datalink_type), pointer  :: next ! pointer to next data
59    end type datalink_type
60 
61    type con_vars_type
62       integer            ::  nlevels
63       real   ,  pointer  ::  t(:)
64       real   ,  pointer  ::  q(:)
65       real               ::  ps
66    end type con_vars_type
67 
68    type con_cld_vars_type
69       integer            ::  nwp_levels
70       real   ,  pointer  ::  p(:)
71       real   ,  pointer  ::  ph(:)
72       real   ,  pointer  ::  t(:)
73       real   ,  pointer  ::  cc(:)
74       real   ,  pointer  ::  clw(:)   ! kg/kg
75       real   ,  pointer  ::  ciw(:)   ! kg/kg
76       real   ,  pointer  ::  rain(:)  ! kg/m2/s
77       real   ,  pointer  ::  sp(:)    ! kg/m2/s
78    end type con_cld_vars_type
79 
80    type aux_vars_type
81       integer            ::  surftype
82       real               ::  surft, t2m, q2m, u10, v10
83       real               ::  satzen, satazi  !!, fastem(5)
84    end type aux_vars_type
85 
86    type maxmin_rad_stats_type
87       type (maxmin_type)         :: maximum, minimum
88       real                       :: ave, rms
89       integer                    :: num
90    end type maxmin_rad_stats_type
91 
92    type stats_rad_type
93       type (maxmin_rad_stats_type), pointer  :: ichan(:)
94    end type stats_rad_type
95 
96    type rad_header_type                       ! innovation file header
97       character (LEN = 19) :: date_char       ! YYYY-MM-DD-HH (assimilation window date)
98       integer              :: assim_win       ! assimilation window hours, e.g., 6 hours
99       character(LEN=20)    :: rttovid_string  ! e.g., noaa-16-amsua 
100       integer              :: platform_id     ! e.g., 1  for noaa (see RTTOV UG)
101       integer              :: satellite_id    ! e.g., 16 for noaa-16
102       integer              :: sensor_id       ! e.g., 3  for amsua
103       integer              :: num_rad         ! pixel number in file
104       integer              :: nchan           ! channel number of each pixel
105       integer ,  pointer   :: ichan(:)        ! index of nchan channels
106       integer              :: nemis           ! emissivity number of each pixel
107                                               ! may be different with nchan
108                                               ! due to polarisation in microwave
109       integer              :: nlevel_fix      ! fixed pressure level number for RTM 
110                                               ! e.g., 43 for RTTOV8_5 
111       real   ,   pointer   :: pres(:)         ! pressure with nlevel_fix
112       integer              :: nlevel_cld      ! cloud profile level number for RTM
113    end type rad_header_type
114 
115    type rad_data_type                       ! innovation file pixel data
116 
117       ! part from Observation
118       integer            :: landmask      ! 1:land; 0:sea
119       integer            :: scanline      ! number of scan line
120       integer            :: scanpos       ! number of scan position
121       real               :: lat           ! Latitude in degree
122       real               :: lon           ! Longitude in degree
123       real               :: elv           ! Elevation in m
124       real               :: satzen        ! satellite zenith angle in degree
125       real               :: satazi        ! satellite azimuth angle in degree
126       real               :: solzen        ! solar zenith angle in degree
127       real               :: solazi        ! solar azimuth angle in degree
128       real,    pointer   :: tb(:)         ! observed brightness temperatures in Kelvin
129       real,    pointer   :: inv(:)        ! innovation (obs - background) in Kelvin
130       real,    pointer   :: bias(:)       ! bias correction values in Kelvin
131       real,    pointer   :: err(:)        ! std of observation error in Kelvin
132       real,    pointer   :: qc(:)         ! quality control flag
133                                           ! 0:good; <0:rejected; other:suspected
134       real,    pointer   :: emiss(:)      ! surface emissivity
135 
136       !  part from background field
137       integer            :: surftype      ! surface type
138                                           ! 0:sea     1:sea-ice     2:land     3:snow
139                                           ! 4:mix-sea 5:mix-sea-ice 6:mix-land 7:mix-snow
140       integer            :: terrain       ! model terrain in m
141       integer            :: soiltyp       ! soil type (MM5/WRF USGS 24 catagories)
142       integer            :: vegtyp        ! vegetation type (MM5/WRF 16 catagories)
143       real               :: vegfra        ! vegetation fraction
144       real               :: soilm         ! soil moisture
145       real               :: soilt         ! soil temperature
146       real               :: snowh         ! snow depth
147       real               :: ps            ! surface pressure in hPa
148       real               :: ts            ! surface skin temperature in Kelvin
149       real               :: t2m           ! T in Kelvin at 2m 
150       real               :: mr2m          ! volume mixture ratio in ppmv at 2m
151       real               :: u10,v10       ! u/v wind in m/s at 10m
152       real,    pointer   :: t(:)          ! temperatures at fixed pressure levels
153       real,    pointer   :: mr(:)         ! volume mixture ratio in ppmv at fixed pressure levels
154       real,    pointer   :: zk(:)         ! vertical interpolation weight from model level to fixed pressure levels
155       real,    pointer   :: pm(:)         ! full-level pressure at model levels
156       real,    pointer   :: phm(:)        ! half-level pressure at model levels
157       real,    pointer   :: tm(:)         ! temperatures at model levels
158       real,    pointer   :: cc(:)         ! cloud cover at model levels
159       real,    pointer   :: rain(:)       ! rainfall rate in kg/m2/s
160       real,    pointer   :: solidp(:)     ! solid precipitation rate in kg/m2/s
161       real,    pointer   :: clw(:)        ! cloud liquid water (kg/kg)
162       real,    pointer   :: ciw(:)        ! cloud ice water    (kg/kg)
163 
164    end type rad_data_type
165 
166    type bias_type
167       integer :: nchan     ! number of channels
168       integer :: npred     ! number of predictors
169       integer :: platform_id,satellite_id,sensor_id
170       integer :: year, month, day, hour, min, sec
171       integer :: scanline,scanpos
172       integer :: landmask
173       integer, pointer :: qc_flag(:) ! 1/0:good/bad
174       integer, pointer :: cloud_flag(:) ! 1/0:no-cloud/cloud
175       integer :: surf_flag  ! surface type
176       real    :: elevation,lat,lon,ps, t2m, q2m, tsk, clwp
177       real, pointer  :: tb(:), omb(:), bias(:)
178       real, pointer  :: pred(:)
179    end type bias_type
180 
181    integer, allocatable :: num_tovs_before(:,:)
182    integer, allocatable :: num_tovs_after(:,:)
183    integer, allocatable :: tovs_send_pe(:,:)
184    integer, allocatable :: tovs_send_start(:,:)
185    integer, allocatable :: tovs_send_count(:,:)
186    integer, allocatable :: tovs_recv_pe(:,:)
187    integer, allocatable :: tovs_recv_start(:,:)
188    integer, allocatable :: tovs_copy_count(:)
189 
190 contains
191 
192 #include "da_jo_and_grady_rad.inc"
193 #include "da_residual_rad.inc"
194 #include "da_biascorr.inc"
195 #include "da_read_biascoef.inc"
196 #include "da_biasprep.inc"
197 #include "da_write_biasprep.inc"
198 #include "da_predictor_rttov.inc"
199 #include "da_predictor_crtm.inc"
200 #include "da_qc_amsua.inc"
201 #include "da_qc_amsub.inc"
202 #include "da_qc_hirs.inc"
203 #include "da_qc_airs.inc"
204 #include "da_write_iv_rad_ascii.inc"
205 #include "da_write_oa_rad_ascii.inc"
206 #include "da_detsurtyp.inc"
207 #include "da_oma_stats_rad.inc"
208 #include "da_omb_stats_rad.inc"
209 #include "da_print_stats_rad.inc"
210 #include "da_get_time_slots.inc"
211 #include "da_qc_rad.inc"
212 #include "da_qc_crtm.inc"
213 #include "da_status_rad.inc"
214 #include "da_get_julian_time.inc"
215 
216 end module da_radiance1
217