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