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