da_setup_obs_structures.inc

References to this file elsewhere.
1 subroutine da_setup_obs_structures( grid, ob, iv)
2 
3    !---------------------------------------------------------------------------
4    ! Purpose: Allocate and read in components of observation structure.
5    !---------------------------------------------------------------------------
6 
7    implicit none
8    
9    type (domain),     intent(inout) :: grid ! Model data
10    type (y_type),     intent(out)   :: ob  ! Observation structure.
11    type (iv_type),    intent(out)   :: iv  ! O-B structure.
12 
13    integer :: i,j
14 
15    if (trace_use) call da_trace_entry("da_setup_obs_structures")
16 
17    call da_message((/'Set up observations (ob)'/))
18 
19    ! Adjust obs switches
20 
21    if (use_synopobs .OR. use_shipsobs .OR. use_metarobs .OR. use_pilotobs .OR. &
22       use_profilerobs .OR. use_buoyobs .OR. use_soundobs .OR. use_bogusobs .OR. &
23       use_radarobs .OR. use_radar_rv .OR. use_radar_rf .OR. use_satemobs .OR. &
24       use_geoamvobs .OR. use_polaramvobs .OR. use_airepobs .OR. &
25       use_gpspwobs .OR. use_gpsrefobs .OR. use_ssmiretrievalobs .OR. &
26       use_ssmitbobs .OR. use_ssmt1obs .OR. use_ssmt2obs .OR. use_qscatobs .or. &
27       use_airsretobs ) then
28  
29       use_obsgts = .true.
30    else
31       use_obsgts = .false.
32    end if
33 
34    if (use_hirs2obs .OR. use_hirs3obs .OR. use_msuobs .OR. use_amsuaobs .OR. &
35       use_amsubobs .OR. use_airsobs .OR. use_eos_amsuaobs .OR. &
36       use_eos_radobs .OR. use_hsbobs .OR. use_kma1dvar .OR. use_filtered_rad .or. &
37       use_ssmisobs .or. use_hirs4obs .or. use_mhsobs) then
38       use_rad = .true.
39    else
40       use_rad = .false.
41    end if
42 
43    ! test_dm_exact can be set to .true. to force DM_PARALLEL runs 
44    ! to produce results that are bitwise-identical regardless of the number of 
45    ! MPI tasks used.  This is useful for validating that multi-processor runs 
46    ! are not a source of bugs.  Runtime will be much longer.  This option is 
47    ! automatically overridden to .false. for serial or 1-MPI-task runs.  
48 
49    if (test_dm_exact) then
50       if (num_procs == 1) then
51          test_dm_exact = .false.
52          write(unit=stdout,fmt='(A)') &
53             ' test_dm_exact overridden to .false. for serial or 1-MPI-task run'
54       end if
55       ! only implmenented for Sound and Synop, so switch other types off
56       use_shipsobs         = .false.
57       use_metarobs         = .false.
58       use_bogusobs         = .false.
59       use_pilotobs         = .false.
60       use_airepobs         = .false.
61       use_geoamvobs        = .false.
62       use_polaramvobs      = .false.
63       use_buoyobs          = .false.
64       use_profilerobs      = .false.
65       use_satemobs         = .false.
66       use_gpspwobs         = .false.
67       use_gpsrefobs        = .false.
68       use_ssmiretrievalobs = .false.
69       use_ssmitbobs        = .false.
70       use_ssmt1obs         = .false.
71       use_ssmt2obs         = .false.
72       use_qscatobs         = .false.
73       use_hirs2obs         = .false.
74       use_hirs3obs         = .false.
75       use_hirs4obs         = .false.
76       use_mhsobs           = .false.
77       use_msuobs           = .false.
78       use_amsuaobs         = .false.
79       use_amsubobs         = .false.
80       use_airsobs          = .false.
81       use_eos_amsuaobs     = .false.
82       use_eos_radobs       = .false.
83       use_hsbobs           = .false.
84       use_obsgts           = .false.
85       use_rad              = .false.
86       use_airsretobs       = .false.
87    end if
88     
89    if (num_pseudo > 0) then
90       call da_message((/"Single OBS Test:: Turn off all the OBS switches ***"/))
91       use_synopobs         = .false.
92       use_shipsobs         = .false.
93       use_metarobs         = .false.
94       use_soundobs         = .false.
95       use_bogusobs         = .false.
96       use_pilotobs         = .false.
97       use_airepobs         = .false.
98       use_geoamvobs        = .false.
99       use_polaramvobs      = .false.
100       use_buoyobs          = .false.
101       use_profilerobs      = .false.
102       use_satemobs         = .false.
103       use_gpspwobs         = .false.
104       use_gpsrefobs        = .false.
105       use_ssmiretrievalobs = .false.
106       use_ssmitbobs        = .false.
107       use_ssmt1obs         = .false.
108       use_ssmt2obs         = .false.
109       use_qscatobs         = .false.
110       use_hirs2obs         = .false.
111       use_hirs3obs         = .false.
112       use_hirs4obs         = .false.
113       use_mhsobs           = .false.
114       use_msuobs           = .false.
115       use_amsuaobs         = .false.
116       use_amsubobs         = .false.
117       use_airsobs          = .false.
118       use_eos_amsuaobs     = .false.
119       use_eos_radobs       = .false.
120       use_hsbobs           = .false.
121       use_obsgts           = .true.
122       use_rad              = .false.
123       use_airsretobs       = .false.
124    end if
125 
126    if (sfc_assi_options < 1 .OR. sfc_assi_options > 2) then
127       write(unit=message(1),fmt='(A,I3)') &
128          'Invalid sfc_assi_option = ', sfc_assi_options
129       call da_error(__FILE__,__LINE__,message(1:1))
130    end if
131 
132    !---------------------------------------------------------------------------      
133    ! [1.0] Setup and read in fields from first guess:
134    !----------------------------------------------------------------------------     
135 
136    iv%missing = missing
137    ! iv%ptop    = grid%xb%ptop
138 
139    iv%total_rad_pixel   = 0
140    iv%total_rad_channel = 0
141 
142    iv%info(:)%nlocal = 0
143    iv%info(:)%ntotal = 0
144    do i=1,num_ob_indexes
145       iv%info(i)%plocal(:) = 0
146       iv%info(i)%ptotal(:) = 0
147    end do
148    iv%num_inst  = 0 
149 
150    ob%nlocal(:) = 0
151    ob%ntotal(:) = 0
152    ob%num_inst  = 0
153 
154    iv%info(:)%max_lev = 0
155 
156    if (use_obsgts) then
157       ! Conventional obs can be in BUFR or ascii format
158       if (ob_format == ob_format_bufr) then
159          call da_message((/'Using BUFR format observation input'/))
160          call da_setup_obs_structures_bufr (ob, iv)
161       else if (ob_format == ob_format_ascii) then
162          call da_message((/'Using ASCII format observation input'/))
163          call da_setup_obs_structures_ascii (ob, iv, grid)
164       end if
165    end if
166 
167    ! Radiance files can only be in BUFR
168 
169    if (use_rad) then
170       call da_message((/'Using NCEP BUFR radiance 1b input'/))
171       call da_setup_bufrtovs_structures(grid, ob, iv)
172    end if
173 
174    ! Summarize observations 
175 
176    write(unit=stdout, fmt='(a)')  'Observation summary'
177    do i=1,num_fgat_time
178       write(unit=stdout, fmt='(3x,a,i2)') 'ob time ', i
179       do j=1,num_ob_indexes
180          write(unit=stdout, fmt='(6x,a,i6,a,i6,a)') &
181             obs_names(j), iv%info(j)%ptotal(i) - iv%info(j)%ptotal(i-1), ' global,', &
182             iv%info(j)%plocal(i) - iv%info(j)%plocal(i-1), ' local'
183       end do
184    end do
185    write(unit=stdout, fmt='(a)') ' '
186   
187    ! Get horizontal interpolation weights.
188 
189    call da_setup_obs_interp_wts (iv) 
190 
191    if (trace_use) call da_trace_exit("da_setup_obs_structures")    
192 
193 end subroutine da_setup_obs_structures
194 
195