da_control.f90

References to this file elsewhere.
1 module da_control
2 
3    !--------------------------------------------------------------------------
4    ! Purpose: Common reference point for WRFVAR control.
5    !--------------------------------------------------------------------------
6 
7    use module_driver_constants, only : max_domains,max_eta, max_moves
8 
9    implicit none
10 
11 #include "namelist_defines.inc"
12 
13 
14    !---------------------------------------------------------------------------
15    ! [1.0] Physical parameter constants (all NIST standard values):
16    !---------------------------------------------------------------------------
17 
18    ! Fundamental constants:
19    real, parameter    :: pi = 3.1415926535897932346
20    real, parameter    :: gas_constant = 287.     ! Value used in WRF.
21    real, parameter    :: gas_constant_v = 461.6  ! Value used in WRF.
22    real, parameter    :: cp = 7.*gas_constant/2. ! Value used in WRF.
23    real, parameter    :: t_kelvin = 273.15
24    real, parameter       :: ps0_inv = 1.0 / 100000.0  ! Base pressure.
25 
26    real, parameter    :: kappa = gas_constant / cp
27    real, parameter    :: rd_over_rv = gas_constant / gas_constant_v
28    real, parameter    :: rd_over_rv1 = 1.0 - rd_over_rv
29    real, parameter    :: L_over_Rv = 5418.12
30 
31    real, parameter    :: gamma = 1.4
32 
33    ! Earth constants:
34    real, parameter    :: gravity = 9.81        ! m/s - value used in MM5.
35    ! real, parameter    :: earth_radius = 6378.15
36    real, parameter    :: earth_radius = 6370.0          ! Be consistant with WRF
37    ! real, parameter    :: earth_omega  = 2.0*pi/86400.0  ! Omega
38    real, parameter    :: earth_omega  = 0.000072921     ! Omega 7.2921*10**-5
39 
40    ! Saturation Vapour Pressure Constants(Rogers & Yau, 1989) 
41    real, parameter    :: es_alpha = 611.2
42    real, parameter    :: es_beta = 17.67
43    real, parameter    :: es_gamma = 243.5
44    real, parameter    :: es_gammabeta = es_gamma * es_beta
45    real, parameter    :: es_gammakelvin = es_gamma - t_kelvin
46 
47    ! Explicit moist constants:
48    real, parameter    :: SVP1=0.6112, SVP2=17.67, SVP3=29.65
49    real, parameter    :: SVPT0=273.15, TO=273.15
50    real, parameter    :: N0R=8.E6, N0S=2.E7, RHOS=0.1
51    real, parameter    :: AVT=841.99667, BVT=0.8, BVT2=2.5+.5*BVT, BVT3=3.+BVT
52    real, parameter    :: PPI=1./(pi*N0R), PPIS=1./(pi*N0S*RHOS)
53    real, parameter    :: XLV1=2370., XLF0=.3337E6, XLV0=3.15E6
54    real, parameter    :: XLS=XLV0-XLV1*273.16+XLF0
55 
56    ! Planetary boundary physics constants
57    real, parameter         :: k_kar = 0.4    ! Von Karman constant
58 
59    ! GPS Refractivity constant  
60    real, parameter    :: coeff = 3.73e5 / 77.6
61 
62 #if RWORDSIZE==8
63    real, parameter :: da_zero = 0D0
64 #else
65    real, parameter :: da_zero = 0.0
66 #endif
67 
68 complex, parameter :: da_zero_complex = (da_zero,da_zero)
69    
70    !---------------------------------------------------------------------------
71    ! [2.0] WRF-Var parameter constants:
72    !---------------------------------------------------------------------------
73 
74    ! Missing values and the index number of the quality contro
75 
76    integer, parameter ::  missing       = -888888
77    real   , parameter ::  missing_r     = -888888.
78    real   , parameter ::  Max_StHeight_Diff = 100.
79 
80    logical :: anal_type_verify=.false.
81    logical :: anal_type_randomcv=.false.
82    logical :: anal_type_qcobs=.false.
83 
84    integer,parameter :: qc_good = 1
85    integer,parameter :: qc_bad  = -1
86 
87    integer, parameter :: bufr_satellite_id   = 1
88    integer, parameter :: bufr_ifov           = 2
89    integer, parameter :: bufr_year           = 3
90    integer, parameter :: bufr_month          = 4
91    integer, parameter :: bufr_day            = 5
92    integer, parameter :: bufr_hour           = 6
93    integer, parameter :: bufr_minute         = 7
94    integer, parameter :: bufr_second         = 8
95    integer, parameter :: bufr_lat            = 9
96    integer, parameter :: bufr_lon            = 10
97    integer, parameter :: bufr_satzen         = 11
98    integer, parameter :: bufr_solzen         = 12
99    integer, parameter :: bufr_station_height = 13
100    integer, parameter :: bufr_landsea_mask   = 14
101 
102    integer, parameter :: nchan_amsua = 15
103    integer, parameter :: nchan_msu = 4
104    integer, parameter :: nchan_hirs2 = 19
105    integer, parameter :: nchan_hirs3 = 19
106 
107    ! WRFVAR Minimisation:
108 
109    integer            :: iter
110    integer, parameter :: MP = 6
111    integer, parameter :: LP = 6
112    integer, parameter :: MAXFEV = 10
113    real, parameter    :: FTOL = 1.0E-4
114    real, parameter    :: GTOL = 0.9
115    real, parameter    :: XTOL = 1.0E-17
116    real, parameter    :: STPMin = 1.0E-20
117    real, parameter    :: STPMAX = 1.0E+20
118 
119    ! Background errors:
120    real, parameter    :: pplow = 1.0e-8       ! Machine lowest number?
121    real, parameter    :: pp_umin = 1.0e-2     ! Minimum u back. error (m/s).
122    real, parameter    :: pp_vmin = 1.0e-2     ! Minimum v back. error (m/s).
123    real, parameter    :: pp_tmin = 1.0e-2     ! Minimum t back. error (K).
124    real, parameter    :: pp_qmin = 1.0e-6     ! Minimum q back. error (kg/kg)
125    real, parameter    :: pp_pmin= 1.0e+1      ! Minimum pp back. error (Pa).
126 
127    ! FFTs:
128    integer, parameter :: Forward_FFT     = -1 ! Grid to spectral
129    integer, parameter :: Inverse_FFT     =  1 ! Spectral to grid.
130    integer, parameter :: num_fft_factors = 10 ! Max number of factors.
131  
132    ! Balance:
133    integer, parameter :: balance_geo = 1      ! Geostrophic balance.
134    integer, parameter :: balance_cyc = 2      ! Cyclostrophic balance.
135    integer, parameter :: balance_geocyc = 3   ! Geo/cyclostrophic balance.
136 
137    ! Adjoint tests:
138    real, parameter    :: typical_u_rms = 2.0     ! m/s
139    real, parameter    :: typical_v_rms = 2.0     ! m/s
140    real, parameter    :: typical_speed_rms = 2.0 ! m/s
141    real, parameter    :: typical_tb19v_rms = 1.0 ! K
142    real, parameter    :: typical_tb19h_rms = 1.0 ! K
143    real, parameter    :: typical_tb22v_rms = 1.0 ! K
144    real, parameter    :: typical_tb37v_rms = 1.0 ! K
145    real, parameter    :: typical_tb37h_rms = 1.0 ! K
146    real, parameter    :: typical_tb85v_rms = 1.0 ! K
147    real, parameter    :: typical_tb85h_rms = 1.0 ! K
148    real, parameter    :: typical_t_rms = 1.0     ! K
149    real, parameter    :: typical_p_rms = 100.0   ! Pa
150    real, parameter    :: typical_q_rms = 0.00001 ! g/kg
151    real, parameter    :: typical_rho_rms = 0.01  ! kg/m^3
152    real, parameter    :: typical_tpw_rms = 0.2   ! cm
153    real, parameter    :: typical_ref_rms = 5.0   ! N unit
154    real, parameter    :: typical_rh_rms = 20.0   ! %
155    real, parameter    :: typical_thickness_rms = 50.0   ! m
156    real, parameter    :: typical_qrn_rms = 0.00001 ! g/kg
157    real, parameter    :: typical_qcw_rms = 0.00001 ! g/kg
158    real, parameter    :: typical_w_rms = 0.1     ! m/s
159    real, parameter    :: typical_rv_rms = 1.0    ! m/s
160    real, parameter    :: typical_rf_rms = 1.0    ! dBZ
161 
162    ! The following typical mean squared values depend on control variable. They   
163    ! are calculated in da_setup_background_errors and used in the VvToVp adjoint 
164    ! test:
165 
166    real, parameter    :: inv_typ_vp1_sumsq = 0.00001 ! 1/sum(psi**2)
167    real, parameter    :: inv_typ_vp2_sumsq = 0.00001 ! 1/sum(chi**2)
168    real, parameter    :: inv_typ_vp3_sumsq = 0.00001 ! 1/sum(phi_u**2)
169    real, parameter    :: inv_typ_vp4_sumsq = 10000.0 ! 1/sum(q**2)
170    real, parameter    :: inv_typ_vp5_sumsq = 0.00001 ! 1/sum(?**2)
171    real, parameter    :: inv_typ_vpalpha_sumsq = 1.0 ! 1/sum(?**2)
172 
173    character(len=*),parameter :: wrfvar_version = "WRFVAR V2.2"
174    character(len=*),parameter :: wrf_version    = "WRF V2.2"
175 
176    integer, parameter :: fg_format_wrf = 1
177    integer, parameter :: fg_format_kma_global = 3
178 
179    integer, parameter :: ob_format_bufr = 1
180    integer, parameter :: ob_format_ascii = 2
181 
182    integer, parameter :: convert_fd2uv = 1
183    integer, parameter :: convert_uv2fd = -1
184 
185    ! Fortran unit  parameters:
186 
187    ! stdout, stderr, trace_unit all controlled from namelist
188 
189    ! Units 9,10 are used for reading and writing namelist.input/output in WRF
190 
191    ! Do not use get_unit/free_unit because tracing is too low level
192    integer, parameter :: trace_csv_unit = 8
193 
194    integer :: y_unit, yp_unit, cost_unit, grad_unit, stats_unit, jo_unit
195    integer :: check_max_iv_unit, rand_unit, omb_unit, filtered_obs_unit
196    integer :: biasprep_unit
197 
198    integer,parameter :: filename_len = 200
199 
200    integer, parameter :: num_alpha_corr_types = 3
201    integer, parameter :: num_sound_diag = 4 
202 
203    integer :: alpha_corr_unit1(num_alpha_corr_types)
204    integer :: alpha_corr_unit2(num_alpha_corr_types)
205    integer :: sound_diag_unit(num_sound_diag)
206 
207    integer, parameter :: max_num_of_var = 200 ! Maximum # of stored fields.
208 
209    integer, parameter :: unit_start = 20
210    integer, parameter :: unit_end = 500
211    logical :: unit_used(unit_start:unit_end) = .false.
212 
213 
214    !---------------------------------------------------------------------------
215    ! [3.0] Variables used in MM5 part of code:
216    !---------------------------------------------------------------------------
217 
218    integer            :: map_projection       ! 1=LamConf/2=PolarSte/3=Mercator
219    real               :: ycntr
220    integer            :: coarse_ix            ! COARSE DOMAin DIM in I DIRECTION.
221    integer            :: coarse_jy            ! COARSE DOMAin DIM in Y DIRECTION.
222    real               :: coarse_ds            ! Coarse domain gridlength (km)
223    real               :: start_x              ! i posn. of (1,1) in coarse domain.
224    real               :: start_y              ! j posn. of (1,1) in coarse domain.
225    real               :: start_lat            ! Latitude coresponds to start_(x,y)
226    real               :: start_lon            ! Longitude coresponds to start_(x,y)
227    real               :: delt_lat             ! Latitude increments for global grids
228    real               :: delt_lon             ! Longitude increments for global grids
229 
230    real               :: phic                 ! COARSE DOMAin CENTRAL LAT(DEGREE)
231    real               :: xlonc                ! COARSE DOMAin CENTRAL LON(DEGREE)
232    real               :: cone_factor          ! Cone Factor
233    real               :: truelat1_3dv         ! True latitude 1 (degrees)
234    real               :: truelat2_3dv         ! True latitude 2 (degrees)
235    real               :: pole                 ! Pole latitude (degrees)
236    real               :: dsm                  ! Current domain gridlength (km)
237    real               :: psi1                 ! ?
238    real               :: c2                   ! earth_radius * COS(psi1)
239 
240    real               :: ptop
241    real               :: ps0
242    real               :: ts0 = 300.0          ! Base potential temperture
243                                               ! mm5 code may try to change value
244    real               :: tlp
245    real               :: tis0
246 
247    !------------------------------------------------------------------------------
248    ! 4.0 vertical interpolation options
249    !------------------------------------------------------------------------------
250 
251    integer, parameter :: v_interp_not_specified = missing, &
252                          v_interp_p             = 1, &
253                          v_interp_h             = 2
254 
255    !------------------------------------------------------------------------------
256    ! WRFVAR scalar constants:
257    !------------------------------------------------------------------------------
258 
259    integer                :: Anal_Space  ! Space of analysis
260                                          ! ( 1 = Full model,
261                                          !   2 = Transformed grid,
262                                          !   3 = Ob space (PSAS) )
263 
264    integer                :: mix         ! 1st dimension of analysis grid.
265    integer                :: mjy         ! 2nd dimension of analysis grid.
266    integer                :: mkz         ! 3rd dimension of analysis grid.
267 
268    ! Recursive filter:
269 
270    real, allocatable      :: rf_turnconds(:) ! RF turning conditions.
271 
272    integer, parameter     :: max_ob_levels = 1001 ! Maximum levels for single ob
273    integer, parameter     :: max_fgat_time = 100  ! Maximum levels for FGAT.
274 
275    integer                :: current_ob_time
276 
277    integer                :: num_gpspw_tot, num_synop_tot, num_metar_tot, &
278                              num_pilot_tot, num_ssmi_rv_tot, num_ssmi_tb_tot, &
279                              num_ssmi_tot,  num_ssmt1_tot, num_ssmt2_tot, &
280                              num_satem_tot, num_geoamv_tot,num_polaramv_tot, &
281                              num_ships_tot, &
282                              num_sound_tot, num_airep_tot, num_qscat_tot, &
283                              num_profiler_tot, num_buoy_tot, num_gpsref_tot, &
284                              num_Radar_tot, num_bogus_tot,num_airsr_tot, &
285                              num_radiance_tot
286 
287    logical       :: gaussian_lats  
288 
289 
290    integer       :: cv_size_domain_jb    ! Total jb cv size.
291    integer       :: cv_size_domain_je    ! Total je cv size.
292    integer       :: cv_size_domain       ! Total cv size.    
293 
294 
295 
296    ! Namelist variables in future?:
297    real, parameter :: maximum_rh = 100.0
298    real, parameter :: minimum_rh =  10.0
299 
300    ! other
301 
302    character*80  cheadl1
303    character*80  cheadl2
304    character*160 cheadl3
305 
306 
307    integer, parameter :: jperr = 6
308 
309    ! NCEP errors (U in m/s, V in m/s, T in K, H in %, P in Pa)
310    ! rh has been divided by 2
311 
312    real, parameter :: err_k(0:jperr+1) = &
313                       (/200000., 100100.,70000.,50000.,30000.,10000.,5000., 1./)
314    real, parameter :: err_u(0:jperr+1) = &
315                       (/ 1.4, 1.4,   2.4,   2.8,   3.4,   2.5,  2.7,  2.7/)
316    real, parameter :: err_v(0:jperr+1) = &
317                       (/ 1.4, 1.4,   2.4,   2.8,   3.4,   2.5,  2.7 , 2.7 /)
318    real, parameter :: err_t(0:jperr+1) = &
319                       (/ 1.8, 1.8,   1.3,   1.3,   2.0,   3.1,  4.0 , 4.0 /)
320    real, parameter :: err_rh(0:jperr+1) = &
321                       (/ 10.0, 10.0,  10.0,  10.0,  10.0,  10.0, 10.0,  10.0/)
322    real, parameter :: err_p(0:jperr+1) = &
323                       (/ 100.0,100.0, 100.0, 100.0, 100.0, 100.0,100.0,100.0 /)
324 
325    ! Maximum error check factors:  inV > (Obs_error*factor) --> fails_error_max
326 
327    real, parameter :: max_error_t              = 5, &
328                       max_error_uv             = 5, &
329                       max_error_pw             = 5, &
330                       max_error_ref            = 5, &
331                       max_error_rh             = 5, &
332                       max_error_q              = 5, &
333                       max_error_p              = 5, &
334                       max_error_tb             = 5, &
335                       max_error_thickness      = 5, &
336                       max_error_rv             = 5, &
337                       max_error_rf             = 5, &
338                       max_error_buv            = 500, &
339                       max_error_bt             = 500, &
340                       max_error_bq             = 500, &
341                       max_error_slp            = 500
342 
343    ! Define various ways for bad data to be flagged.  
344 
345    integer, parameter ::  &
346       missing_data            = -88, &     ! Data is missing with the value of 
347                                            ! missing_r
348       outside_of_domain       = -77, &     ! Data outside horizontal domain 
349                                            ! or time window, data set to missing_r
350       wrong_direction         = -15, &     ! Wind vector direction <0 or> 360 
351                                            ! => direction set to missing_r
352       negative_spd            = -14, &     ! Wind vector norm is negative 
353                                            ! => norm set to missing_r
354       zero_spd                = -13, &     ! Wind vector norm is zero 
355                                            ! => norm set to missing_r
356       wrong_wind_data         = -12, &     ! Spike in wind profile 
357                                            ! =>direction and norm set to missing_r 
358       zero_t_td               = -11, &     ! t or td = 0 => t or td, rh and qv 
359                                            ! are set to missing_r, 
360       t_fail_supa_inver       = -10, &     ! superadiabatic temperature
361                                            ! 
362       wrong_t_sign            = - 9, &     ! Spike in Temperature profile 
363                                            ! 
364       above_model_lid         = - 8, &     ! heigh above model lid
365                                            ! => no action
366       far_below_model_surface = - 7, &     ! heigh far below model surface
367                                            ! => no action
368       below_model_surface     = - 6, &     ! height below model surface
369                                            ! => no action
370       standard_atmosphere     = - 5, &     ! Missing h, p or t
371                                            ! =>Datum interpolated from standard atm
372       from_background         = - 4, &     ! Missing h, p or t
373                                            ! =>Datum interpolated from model
374       fails_error_max         = - 3, &     ! Datum Fails error max check
375                                            ! => no action
376       fails_buddy_check       = - 2, &     ! Datum Fails buddy check
377                                            ! => no action
378       no_buddies              = - 1, &     ! Datum has no buddies
379                                            ! => no action
380       good_quality            =   0, &     ! OBS datum has good quality
381                                            !
382       convective_adjustment   =   1, &     ! convective adjustement check
383                                            ! =>apply correction on t, td, rh and qv
384       surface_correction      =   2, &     ! Surface datum
385                                            ! => apply correction on datum
386       Hydrostatic_recover     =   3, &     ! Height from hydrostaic assumption with
387                                            ! the OBS data calibration
388       Reference_OBS_recover   =   4, &     ! Height from reference state with OBS
389                                            ! data calibration
390       Other_check             =  88        ! passed other quality check
391 
392    ! Observations:
393 
394    integer, parameter     :: max_Radar = 10000    ! Maximum Number of Radar obs.
395 
396    integer                :: num_procs            ! Number of total processors.
397    integer                :: myproc               ! My processor ID.
398    integer, parameter     :: root = 0             ! Number of root processor
399    logical                :: rootproc             ! Am I the root processor
400 
401    integer, parameter :: var4d_coupling_disk_linear = 1
402    integer, parameter :: var4d_coupling_disk_simul  = 2
403 
404    integer, parameter :: rtm_option_rttov = 1
405    integer, parameter :: rtm_option_crtm = 2
406 
407    ! RTM_inIT setup parameter
408 
409    integer, parameter            :: maxsensor = 30
410 
411    ! type( rttov_coef ), pointer :: coefs(:)         ! RTTOV coefficients
412 
413    ! Tracing
414 
415    integer :: trace_start_points=0   ! Number of routines to initiate trace
416 
417    integer, parameter :: num_ob_indexes = 23
418 
419    integer, parameter :: sound_index          = 1
420    integer, parameter :: synop_index          = 2
421    integer, parameter :: pilot_index          = 3
422    integer, parameter :: satem_index          = 4
423    integer, parameter :: geoamv_index         = 5
424    integer, parameter :: polaramv_index       = 6
425    integer, parameter :: airep_index          = 7
426    integer, parameter :: gpspw_index          = 8
427    integer, parameter :: gpsref_index         = 9
428    integer, parameter :: metar_index          = 10
429    integer, parameter :: ships_index          = 11
430    integer, parameter :: ssmi_retrieval_index = 12
431    integer, parameter :: ssmi_tb_index        = 13
432    integer, parameter :: ssmt1_index          = 14
433    integer, parameter :: ssmt2_index          = 15
434    integer, parameter :: qscat_index          = 16
435    integer, parameter :: profiler_index       = 17
436    integer, parameter :: buoy_index           = 18
437    integer, parameter :: bogus_index          = 19
438    integer, parameter :: pseudo_index         = 20
439    integer, parameter :: radar_index          = 21
440    integer, parameter :: radiance_index       = 22
441    integer, parameter :: airsr_index          = 23
442 
443    character(len=14), parameter :: obs_names(num_ob_indexes) = (/ &
444       "SOUND         ", &
445       "SYNOP         ", &
446       "PILOT         ", &
447       "SATEM         ", &
448       "Geo AMV       ", &
449       "Polar AMV     ", &
450       "AIREP         ", &
451       "GPSPW         ", &
452       "GPSRF         ", &
453       "METAR         ", &
454       "SHIP          ", &
455       "SSMI_RETRIEVAL", &
456       "SSMI_TB       ", &
457       "SSMT1         ", &
458       "SSMT2         ", &
459       "QSCAT         ", &
460       "Profiler      ", &
461       "Buoy          ", &
462       "Bogus         ", &
463       "Pseudo        ", &
464       "Radar         ", &
465       "Radiance      ", &
466       "AIRS retrieval"  &
467    /)
468 
469    integer, parameter :: max_no_fm = 290
470 
471    integer, parameter :: num_ob_vars=9
472 
473    logical, parameter :: in_report(num_ob_vars,2) = reshape((/&
474      .false.,.false.,.false.,.false.,.false.,.false.,.false.,.false.,.false., & ! sound
475      .true.,.true.,.true.,.true.,.true.,.true.,.false.,.false.,.false./), &
476      (/num_ob_vars,2/))
477 
478    integer, parameter :: report_h   = 1
479    integer, parameter :: report_u   = 2
480    integer, parameter :: report_v   = 3
481    integer, parameter :: report_t   = 4
482    integer, parameter :: report_q   = 5
483    integer, parameter :: report_p   = 6
484    integer, parameter :: report_rh  = 7
485    integer, parameter :: report_slp = 8
486    integer, parameter :: report_zk  = 9
487 
488    logical :: obs_use(num_ob_indexes) = .false.
489 
490 
491 
492    ! Special cases
493 
494    integer, parameter :: fm_satem = 86
495    integer, parameter :: fm_amv   = 88
496 
497    integer, parameter :: fm_index(max_no_fm) = (/ &
498       0,0,0,0,0,0,0,0,0,0,                                & ! 1-10
499       0,Synop_index,Ships_index,0,Metar_index,            & ! 11-15
500       Metar_index,Ships_index,buoy_index,buoy_index,0,    & ! 16-20
501       0,0,0,0,0,0,0,0,0,0,                                & ! 21-30
502       0,pilot_index,pilot_index,pilot_index,sound_index,  & ! 31-35
503       sound_index,sound_index,sound_index,0,0,            & ! 36-40
504       0,airep_index,0,0,0,0,0,0,0,0,                      & ! 41-50
505       0,0,0,0,0,0,0,0,0,0,                                & ! 51-60
506       0,0,0,0,0,0,0,0,0,0,                                & ! 61-70
507       0,0,0,0,0,0,0,0,0,0,                                & ! 71-80
508       0,0,0,0,0,satem_index,0,geoamv_index,0,0,           & ! 81-90
509       0,0,0,0,0,airep_index,airep_index,0,0,0,            & ! 91-100
510       0,0,0,0,0,0,0,0,0,0,                                & ! 101-110
511       gpspw_index,0,0,gpspw_index,0,gpsref_index,0,0,0,0, & ! 111-120
512       ssmt1_index,ssmt2_index,0,0,0,0,0,0,0,0,            & ! 121-130
513       0,profiler_index,airsr_index,0,bogus_index,0,0,0,0,0, & ! 131-140
514       0,0,0,0,0,0,0,0,0,0,                                & ! 141-150
515       0,0,0,0,0,0,0,0,0,0,                                & ! 151-160
516       0,0,0,0,0,0,0,0,0,0,                                & ! 161-170
517       0,0,0,0,0,0,0,0,0,0,                                & ! 171-180
518       0,0,0,0,0,0,0,0,0,0,                                & ! 181-190
519       0,0,0,0,0,0,0,0,0,0,                                & ! 191-200
520       0,0,0,0,0,0,0,0,0,0,                                & ! 201-210
521       0,0,0,0,0,0,0,0,0,0,                                & ! 211-220
522       0,0,0,0,0,0,0,0,0,0,                                & ! 231-230
523       0,0,0,0,0,0,0,0,0,0,                                & ! 231-240
524       0,0,0,0,0,0,0,0,0,0,                                & ! 241-250
525       0,0,0,0,0,0,0,0,0,0,                                & ! 251-260
526       0,0,0,0,0,0,0,0,0,0,                                & ! 261-270
527       0,0,0,0,0,0,0,0,0,0,                                & ! 271-280
528       qscat_index,0,0,0,0,0,0,0,0,0 /)                      ! 281-290
529 
530    character(len=120)  :: fmt_info ='(a12,1x,a19,1x,a40,1x,i6,3(f12.3,11x),6x,a5)'
531    character(len=120)  :: fmt_srfc = '(7(:,f12.3,i4,f7.2))'
532    character(len=120)  :: fmt_each = &
533       '(3(f12.3,i4,f7.2),11x,3(f12.3,i4,f7.2),11x,1(f12.3,i4,f7.2))'
534 
535    ! lat/long information calculated in da_setup_firstguess_wrf
536 
537    real, parameter :: deg_to_rad = pi/180.0
538   
539    real, allocatable :: cos_xls(:)
540    real, allocatable :: sin_xls(:)
541    real, allocatable :: cos_xle(:)
542    real, allocatable :: sin_xle(:)
543 
544    integer :: ierr ! General error code
545    integer :: comm ! MPI communicator
546 
547    integer :: ids,ide,jds,jde,kds,kde
548    integer :: ims,ime,jms,jme,kms,kme
549    integer :: its,ite,jts,jte,kts,kte
550    integer :: ips,ipe,jps,jpe,kps,kpe
551 
552 contains
553 
554 #include "da_advance_cymdh.inc"
555 #include "da_array_print.inc"
556 #include "da_change_date.inc"
557 #include "da_find_fft_factors.inc"
558 #include "da_find_fft_trig_funcs.inc"
559 
560 end module da_control