module da_control 109,1
!--------------------------------------------------------------------------
! Purpose: Common reference point for WRFVAR control.
!--------------------------------------------------------------------------
use module_driver_constants
, only : max_domains, max_eta, max_moves, max_bogus, &
max_outer_iterations, max_instruments, max_plevs, &
max_ocean, num_ob_indexes
implicit none
#include "namelist_defines.inc"
! switches set from other namelist options
logical :: use_obsgts
logical :: use_rad
!---------------------------------------------------------------------------
! [1.0] Physical parameter constants (all NIST standard values):
!---------------------------------------------------------------------------
! Fundamental constants:
real, parameter :: pi = 3.1415926 ! Value used in WRF.
real, parameter :: radian = pi / 180.0
real, parameter :: gas_constant = 287.0 ! Value used in WRF.
real, parameter :: gas_constant_v = 461.6 ! Value used in WRF.
real, parameter :: cp = 7.0*gas_constant/2.0 ! Value used in WRF.
real, parameter :: t_kelvin = 273.15
real, parameter :: t_triple = 273.16 ! triple point of water
! The imported code for ssmi and radiance uses 273.0 in a way that suggests
! it may not be a lazy definition of the melting point of water, so keep the
! value separate for the moment
real, parameter :: t_roughem = 273.0
real, parameter :: t_landem = 273.0
real, parameter :: kappa = gas_constant / cp
real, parameter :: rd_over_rv = gas_constant / gas_constant_v
real, parameter :: rd_over_rv1 = 1.0 - rd_over_rv
real, parameter :: L_over_Rv = 5418.12
real, parameter :: gamma = 1.4
! Earth constants:
real, parameter :: gravity = 9.81 ! m/s - value used in WRF.
! real, parameter :: earth_radius = 6378.15
real, parameter :: earth_radius = 6370.0 ! Be consistant with WRF
! real, parameter :: earth_omega = 2.0*pi/86400.0 ! Omega
real, parameter :: earth_omega = 0.000072921 ! Omega 7.2921*10**-5
! Saturation Vapour Pressure Constants(Rogers & Yau, 1989)
real, parameter :: es_alpha = 611.2
real, parameter :: es_beta = 17.67
real, parameter :: es_gamma = 243.5
real, parameter :: es_gammabeta = es_gamma * es_beta
real, parameter :: es_gammakelvin = es_gamma - t_kelvin
! Explicit moist constants:
real, parameter :: SVP1=0.6112, SVP2=17.67, SVP3=29.65
real, parameter :: SVPT0=t_kelvin, TO=t_kelvin
real, parameter :: N0R=8.0E6, N0S=2.0E7, RHOS=0.1
real, parameter :: AVT=841.99667, BVT=0.8, BVT2=2.5+0.5*BVT, BVT3=3.0+BVT
real, parameter :: PPI=1.0/(pi*N0R), PPIS=1.0/(pi*N0S*RHOS)
real, parameter :: XLV1=2370.0, XLF0=0.3337E6, XLV0=3.15E6
real, parameter :: XLS=XLV0-XLV1*t_triple+XLF0
! Planetary boundary physics constants
real, parameter :: k_kar = 0.4 ! Von Karman constant
! Zenith Total Delay:
! Hydrostatic delay:
real, parameter :: zdk1 = 2.2768e-5
real, parameter :: zdk2 = 2.66e-3
real, parameter :: zdk3 = 2.8e-7
! Wet delay:
real, parameter :: wdk1 = 2.21e-7
real, parameter :: wdk2 = 3.73e-3
! GPS Refractivity constant
real, parameter :: a_ew = 0.622
real, parameter :: b_ew = 0.378
! GPS Refractivity constant
real, parameter :: coeff = (wdk2*1.e8) / 77.6
#if RWORDSIZE==8
real, parameter :: da_zero = 0D0
#else
real, parameter :: da_zero = 0.0
#endif
complex, parameter :: da_zero_complex = (da_zero,da_zero)
!---------------------------------------------------------------------------
! [2.0] WRF-Var parameter constants:
!---------------------------------------------------------------------------
! Missing values and the index number of the quality control
integer, parameter :: missing = -888888
real , parameter :: missing_r = -888888.0
real , parameter :: xmiss = -88.0
real , parameter :: Max_StHeight_Diff = 100.0
integer, parameter :: cv_options_hum_specific_humidity = 1
integer, parameter :: cv_options_hum_relative_humidity = 2
! No-one explains what these options means anywhere
integer, parameter :: vert_corr_1 = 1
integer, parameter :: vert_corr_2 = 2
integer, parameter :: vertical_ip_0 = 0
integer, parameter :: vertical_ip_sqrt_delta_p = 1
integer, parameter :: vertical_ip_delta_p = 2
integer, parameter :: vert_evalue_global = 1
integer, parameter :: vert_evalue_local = 2
integer, parameter :: alphacv_method_vp = 1
integer, parameter :: alphacv_method_xa = 2
integer, parameter :: sfc_assi_options_1 = 1
integer, parameter :: sfc_assi_options_2 = 2
integer, parameter :: check_rh_simple = 1
integer, parameter :: check_rh_tpw = 2
logical :: anal_type_verify=.false.
logical :: anal_type_randomcv=.false.
logical :: anal_type_qcobs=.false.
logical :: anal_type_hybrid_dual_res=.false.
integer,parameter :: monitor_on = 1
integer,parameter :: monitor_off = 0
integer,parameter :: qc_good = 1
integer,parameter :: qc_bad = -1
integer,parameter :: qc_varbc_bad = -1
integer, parameter :: bufr_satellite_id = 1
integer, parameter :: bufr_ifov = 2
integer, parameter :: bufr_year = 3
integer, parameter :: bufr_month = 4
integer, parameter :: bufr_day = 5
integer, parameter :: bufr_hour = 6
integer, parameter :: bufr_minute = 7
integer, parameter :: bufr_second = 8
integer, parameter :: bufr_lat = 9
integer, parameter :: bufr_lon = 10
integer, parameter :: bufr_satzen = 11
integer, parameter :: bufr_solzen = 12
integer, parameter :: bufr_station_height = 13
integer, parameter :: bufr_landsea_mask = 14
integer, parameter :: bufr_solazi = 15 !RTTOV9_3
integer, parameter :: nchan_amsua = 15
integer, parameter :: nchan_amsub = 5
integer, parameter :: nchan_mhs = 5
integer, parameter :: nchan_msu = 4
integer, parameter :: nchan_hirs2 = 19
integer, parameter :: nchan_hirs3 = 19
integer, parameter :: nchan_hirs4 = 19
integer, parameter :: nchan_ssmis = 24
integer, parameter :: nchan_airs = 281
! WRFVAR Minimisation:
integer :: iter
integer :: cv_size
integer, parameter :: MP = 6
integer, parameter :: LP = 6
integer, parameter :: MAXFEV = 10
real, parameter :: FTOL = 1.0E-4
real, parameter :: GTOL = 0.9
real, parameter :: XTOL = 1.0E-17
real, parameter :: STPMIN = 1.0E-20
real, parameter :: STPMAX = 1.0E+20
! Background errors:
real, parameter :: pplow = 1.0e-8 ! Machine lowest number?
real, parameter :: pp_umin = 1.0e-2 ! Minimum u back. error (m/s).
real, parameter :: pp_vmin = 1.0e-2 ! Minimum v back. error (m/s).
real, parameter :: pp_tmin = 1.0e-2 ! Minimum t back. error (K).
real, parameter :: pp_qmin = 1.0e-6 ! Minimum q back. error (kg/kg)
real, parameter :: pp_pmin= 1.0e+1 ! Minimum pp back. error (Pa).
! FFTs:
integer, parameter :: Forward_FFT = -1 ! Grid to spectral
integer, parameter :: Inverse_FFT = 1 ! Spectral to grid.
integer, parameter :: num_fft_factors = 10 ! Max number of factors.
integer, parameter :: nrange =1000! Range to search for efficient FFT.
! Balance:
integer, parameter :: balance_geo = 1 ! Geostrophic balance.
integer, parameter :: balance_cyc = 2 ! Cyclostrophic balance.
integer, parameter :: balance_geocyc = 3 ! Geo/cyclostrophic balance.
! Adjoint tests:
real, parameter :: typical_u_rms = 2.0 ! m/s
real, parameter :: typical_v_rms = 2.0 ! m/s
real, parameter :: typical_speed_rms = 2.0 ! m/s
real, parameter :: typical_tb19v_rms = 1.0 ! K
real, parameter :: typical_tb19h_rms = 1.0 ! K
real, parameter :: typical_tb22v_rms = 1.0 ! K
real, parameter :: typical_tb37v_rms = 1.0 ! K
real, parameter :: typical_tb37h_rms = 1.0 ! K
real, parameter :: typical_tb85v_rms = 1.0 ! K
real, parameter :: typical_tb85h_rms = 1.0 ! K
real, parameter :: typical_t_rms = 1.0 ! K
real, parameter :: typical_p_rms = 100.0 ! Pa
real, parameter :: typical_q_rms = 0.00001 ! g/kg
real, parameter :: typical_rho_rms = 0.01 ! kg/m^3
real, parameter :: typical_tpw_rms = 0.2 ! cm
real, parameter :: typical_ref_rms = 5.0 ! N unit
real, parameter :: typical_rh_rms = 20.0 ! %
real, parameter :: typical_thickness_rms = 50.0 ! m
real, parameter :: typical_qrn_rms = 0.00001 ! g/kg
real, parameter :: typical_qcw_rms = 0.00001 ! g/kg
real, parameter :: typical_qci_rms = 0.00001 ! g/kg
real, parameter :: typical_qsn_rms = 0.00001 ! g/kg
real, parameter :: typical_qgr_rms = 0.00001 ! g/kg
real, parameter :: typical_w_rms = 0.1 ! m/s
real, parameter :: typical_rv_rms = 1.0 ! m/s
real, parameter :: typical_rf_rms = 1.0 ! dBZ
real, parameter :: typical_rain_rms = 1.0 ! mm
! The following typical mean squared values depend on control variable. They
! are calculated in da_setup_background_errors and used in the VvToVp adjoint
! test:
real, parameter :: inv_typ_vp1_sumsq = 0.00001 ! 1/sum(psi**2)
real, parameter :: inv_typ_vp2_sumsq = 0.00001 ! 1/sum(chi**2)
real, parameter :: inv_typ_vp3_sumsq = 0.00001 ! 1/sum(phi_u**2)
real, parameter :: inv_typ_vp4_sumsq = 10000.0 ! 1/sum(q**2)
real, parameter :: inv_typ_vp5_sumsq = 0.00001 ! 1/sum(?**2)
real, parameter :: inv_typ_vpalpha_sumsq = 1.0 ! 1/sum(?**2)
#include "version_decl"
integer, parameter :: fg_format_wrf_arw_regional = 1
integer, parameter :: fg_format_wrf_nmm_regional = 2
integer, parameter :: fg_format_wrf_arw_global = 3
integer, parameter :: fg_format_kma_global = 4
integer, parameter :: ob_format_bufr = 1
integer, parameter :: ob_format_ascii = 2
integer, parameter :: ob_format_madis = 3
integer, parameter :: convert_fd2uv = 1
integer, parameter :: convert_uv2fd = -1
! Fortran unit parameters:
! stdout, stderr, trace_unit all controlled from namelist
! Units 9,10 are used for reading and writing namelist.input/output in WRF
! Do not use get_unit/free_unit because tracing is too low level
integer, parameter :: trace_csv_unit = 8
integer :: y_unit, yp_unit, cost_unit, grad_unit, stats_unit, jo_unit
integer :: check_max_iv_unit, check_buddy_unit, rand_unit, omb_unit, &
filtered_obs_unit
integer :: biasprep_unit, qcstat_conv_unit
integer,parameter :: filename_len = 200
integer, parameter :: num_alpha_corr_types = 3
integer, parameter :: alpha_corr_type_exp = 1
integer, parameter :: alpha_corr_type_soar = 2
integer, parameter :: alpha_corr_type_gaussian = 3
integer :: alpha_corr_unit1(num_alpha_corr_types)
integer :: alpha_corr_unit2(num_alpha_corr_types)
integer, parameter :: max_num_of_var = 200 ! Maximum # of stored fields.
integer, parameter :: unit_start = 20
integer, parameter :: unit_end = 500
logical :: unit_used(unit_start:unit_end) = .false.
! grid properties
character(len=3), parameter :: grid_ordering = "xyz"
character(len=3), parameter :: grid_stagger = "xyz"
!---------------------------------------------------------------------------
! [3.0] Variables used in MM5 part of code:
!---------------------------------------------------------------------------
integer :: map_projection !1=LamConf/2=PolarSte/3=Mercator
!0=CylEqui/6=Cassini
real :: ycntr
integer :: coarse_ix ! coarse domain dim in i direction.
integer :: coarse_jy ! coarse domain dim in y direction.
real :: coarse_ds ! Coarse domain gridlength (km)
real :: start_x ! i posn. of (1,1) in coarse domain.
real :: start_y ! j posn. of (1,1) in coarse domain.
real :: start_lat ! Latitude coresponds to start_(x,y)
real :: start_lon ! Longitude coresponds to start_(x,y)
real :: delt_lat ! Latitude increments for global grids
real :: delt_lon ! Longitude increments for global grids
real :: phic ! coarse domain central lat(degree)
real :: xlonc ! coarse domain central lon(degree)
real :: cone_factor ! Cone Factor
real :: truelat1_3dv ! True latitude 1 (degrees)
real :: truelat2_3dv ! True latitude 2 (degrees)
real :: pole ! Pole latitude (degrees)
real :: dsm ! Current domain gridlength (km)
real :: psi1 ! ?
real :: c2 ! earth_radius * COS(psi1)
real :: ptop
real, parameter :: t0 = 300.0
!------------------------------------------------------------------------------
! 4.0 vertical interpolation options
!------------------------------------------------------------------------------
integer, parameter :: v_interp_not_specified = missing, &
v_interp_p = 1, &
v_interp_h = 2
!------------------------------------------------------------------------------
! WRFVAR scalar constants:
!------------------------------------------------------------------------------
integer :: Anal_Space ! Space of analysis
! ( 1 = Full model,
! 2 = Transformed grid,
! 3 = Ob space (PSAS) )
integer :: mix ! 1st dimension of analysis grid.
integer :: mjy ! 2nd dimension of analysis grid.
integer :: mkz ! 3rd dimension of analysis grid.
! Recursive filter:
real, allocatable :: rf_turnconds(:) ! RF turning conditions.
integer, parameter :: max_ob_levels = 1001 ! Maximum levels for single ob
integer, parameter :: max_fgat_time = 100 ! Maximum levels for FGAT.
integer :: time
logical :: gaussian_lats
integer :: cv_size_domain_jb ! Total jb cv size.
integer :: cv_size_domain_je ! Total je cv size.
integer :: cv_size_domain_jp ! Total jp cv size.
integer :: cv_size_domain_js ! Total js cv size.
integer :: cv_size_domain_jl ! Total jl cv size.
integer :: cv_size_domain ! Total cv size.
! Hybrid:
real :: sigma_alpha ! Alpha standard deviation.
real :: jb_factor ! Weighting for Background Error Cov.
! Namelist variables in future?:
real, parameter :: maximum_rh = 100.0
real, parameter :: minimum_rh = 10.0
real, parameter :: qlimit = 1.0e-12 ! imposed minimum mixing ratio
! other
integer, parameter :: jperr = 6
! NCEP errors (U in m/s, V in m/s, T in K, H in %, P in Pa)
! rh has been divided by 2
real, parameter :: err_k(0:jperr+1) = &
(/200000.0, 100100.0,70000.0,50000.0,30000.0,10000.0,5000.0, 1.0/)
real, parameter :: err_u(0:jperr+1) = &
(/ 1.4, 1.4, 2.4, 2.8, 3.4, 2.5, 2.7, 2.7/)
real, parameter :: err_v(0:jperr+1) = &
(/ 1.4, 1.4, 2.4, 2.8, 3.4, 2.5, 2.7 , 2.7 /)
real, parameter :: err_t(0:jperr+1) = &
(/ 1.8, 1.8, 1.3, 1.3, 2.0, 3.1, 4.0 , 4.0 /)
real, parameter :: err_rh(0:jperr+1) = &
(/ 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0/)
real, parameter :: err_p(0:jperr+1) = &
(/ 100.0,100.0, 100.0, 100.0, 100.0, 100.0,100.0,100.0 /)
! Buddy check parameters (YRG, 10/3/2008):
real, parameter :: max_buddy_t = 8.0, &
max_buddy_uv = 8.0, &
max_buddy_z = 8.0, &
max_buddy_rh = 40.0, &
max_buddy_p = 350.0, &
buddy_weight = 1.0, &
bin_p_width = 5000.0, &
bin_z_width = 500.0
! Define various ways for bad data to be flagged.
integer, parameter :: &
missing_data = -88, & ! Data is missing with the value of
! missing_r
outside_of_domain = -77, & ! Data outside horizontal domain
! or time window, data set to missing_r
wrong_direction = -15, & ! Wind vector direction <0 or> 360
! => direction set to missing_r
negative_spd = -14, & ! Wind vector norm is negative
! => norm set to missing_r
zero_spd = -13, & ! Wind vector norm is zero
! => norm set to missing_r
wrong_wind_data = -12, & ! Spike in wind profile
! =>direction and norm set to missing_r
zero_t_td = -11, & ! t or td = 0 => t or td, rh and qv
! are set to missing_r,
t_fail_supa_inver = -10, & ! superadiabatic temperature
!
wrong_t_sign = - 9, & ! Spike in Temperature profile
!
above_model_lid = - 8, & ! heigh above model lid
! => no action
far_below_model_surface = - 7, & ! heigh far below model surface
! => no action
below_model_surface = - 6, & ! height below model surface
! => no action
standard_atmosphere = - 5, & ! Missing h, p or t
! =>Datum interpolated from standard atm
from_background = - 4, & ! Missing h, p or t
! =>Datum interpolated from model
fails_error_max = - 3, & ! Datum Fails error max check
! => no action
fails_buddy_check = - 2, & ! Datum Fails buddy check
! => no action
no_buddies = - 1, & ! Datum has no buddies
! => no action
good_quality = 0, & ! OBS datum has good quality
!
convective_adjustment = 1, & ! convective adjustement check
! =>apply correction on t, td, rh and qv
surface_correction = 2, & ! Surface datum
! => apply correction on datum
Hydrostatic_recover = 3, & ! Height from hydrostaic assumption with
! the OBS data calibration
Reference_OBS_recover = 4, & ! Height from reference state with OBS
! data calibration
Other_check = 88 ! passed other quality check
! Observations:
integer :: num_procs ! Number of total processors.
integer :: myproc ! My processor ID.
integer, parameter :: root = 0 ! Number of root processor
logical :: rootproc ! Am I the root processor
integer, parameter :: rtm_option_rttov = 1
integer, parameter :: rtm_option_crtm = 2
! rtm_init setup parameter
integer, parameter :: maxsensor = 30
integer, parameter :: npres_print = 12
! Tracing
integer :: trace_start_points=0 ! Number of routines to initiate trace
integer, parameter :: sound = 1
integer, parameter :: synop = 2
integer, parameter :: pilot = 3
integer, parameter :: satem = 4
integer, parameter :: geoamv = 5
integer, parameter :: polaramv = 6
integer, parameter :: airep = 7
integer, parameter :: gpspw = 8
integer, parameter :: gpsref = 9
integer, parameter :: metar = 10
integer, parameter :: ships = 11
integer, parameter :: ssmi_rv = 12
integer, parameter :: ssmi_tb = 13
integer, parameter :: ssmt1 = 14
integer, parameter :: ssmt2 = 15
integer, parameter :: qscat = 16
integer, parameter :: profiler = 17
integer, parameter :: buoy = 18
integer, parameter :: bogus = 19
integer, parameter :: pseudo = 20
integer, parameter :: radar = 21
integer, parameter :: radiance = 22
integer, parameter :: airsr = 23
integer, parameter :: sonde_sfc = 24
integer, parameter :: mtgirs = 25
integer, parameter :: tamdar = 26
integer, parameter :: tamdar_sfc = 27
integer, parameter :: rain = 28
character(len=14), parameter :: obs_names(num_ob_indexes) = (/ &
"sound ", &
"synop ", &
"pilot ", &
"satem ", &
"geoamv ", &
"polaramv ", &
"airep ", &
"gpspw ", &
"gpsrf ", &
"metar ", &
"ships ", &
"ssmi_rv ", &
"ssmi_tb ", &
"ssmt1 ", &
"ssmt2 ", &
"qscat ", &
"profiler ", &
"buoy ", &
"bogus ", &
"pseudo ", &
"radar ", &
"radiance ", &
"airs retrieval", &
"sonde_sfc ", &
"mtgirs ", &
"tamdar ", &
"tamdar_sfc ", &
"rain " &
/)
integer, parameter :: max_no_fm = 290
integer, parameter :: num_ob_vars=10
logical, parameter :: in_report(num_ob_vars,2) = reshape((/&
.false.,.false.,.false.,.false.,.false.,.false.,.false.,.false.,.false., & ! sound
.true.,.true.,.true.,.true.,.true.,.true.,.false.,.false.,.false.,.false.,.false./), &
(/num_ob_vars,2/))
integer, parameter :: report_h = 1
integer, parameter :: report_u = 2
integer, parameter :: report_v = 3
integer, parameter :: report_t = 4
integer, parameter :: report_q = 5
integer, parameter :: report_p = 6
integer, parameter :: report_rh = 7
integer, parameter :: report_slp = 8
integer, parameter :: report_zk = 9
logical :: obs_use(num_ob_indexes) = .false.
! Special cases
integer, parameter :: fm_satem = 86
integer, parameter :: fm_amv = 88
integer, parameter :: fm_index(max_no_fm) = (/ &
0,0,0,0,0,0,0,0,0,0, & ! 1-10
0,Synop,Ships,0,Metar, & ! 11-15
Metar,Ships,buoy,buoy,0, & ! 16-20
0,0,0,0,0,0,0,0,0,0, & ! 21-30
0,pilot,pilot,pilot,sound, & ! 31-35
sound,sound,sound,0,0, & ! 36-40
0,airep,0,0,0,0,0,0,0,0, & ! 41-50
0,0,0,0,0,0,0,0,0,0, & ! 51-60
0,0,0,0,0,0,0,0,0,0, & ! 61-70
0,0,0,0,0,0,0,0,0,0, & ! 71-80
0,0,0,0,0,satem,0,geoamv,0,0, & ! 81-90
0,0,0,0,0,airep,airep,0,0,0, & ! 91-100
tamdar,0,0,0,0,0,0,0,0,0, & ! 101-110
gpspw,0,0,gpspw,0,gpsref,0,0,0,0, & ! 111-120
ssmt1,ssmt2,0,0,ssmi_rv,0,0,0,0,0, & ! 121-130
0,profiler,airsr,0,bogus,0,0,0,0,0, & ! 131-140
0,0,0,0,0,0,0,0,0,0, & ! 141-150
0,0,0,0,0,0,0,0,0,0, & ! 151-160
mtgirs,0,0,0,0,0,0,0,0,0, & ! 161-170
0,0,0,0,0,0,0,0,0,0, & ! 171-180
0,0,0,0,0,0,0,0,0,0, & ! 181-190
0,0,0,0,0,0,0,0,0,0, & ! 191-200
0,0,0,0,0,0,0,0,0,0, & ! 201-210
0,0,0,0,0,0,0,0,0,0, & ! 211-220
0,0,0,0,0,0,0,0,0,0, & ! 231-230
0,0,0,0,0,0,0,0,0,0, & ! 231-240
0,0,0,0,0,0,0,0,0,0, & ! 241-250
0,0,0,0,0,0,0,0,0,0, & ! 251-260
0,0,0,0,0,0,0,0,0,0, & ! 261-270
0,0,0,0,0,0,0,0,0,0, & ! 271-280
qscat,0,0,0,0,0,0,0,0,0 /) ! 281-290
character(len=120) :: fmt_info ='(a12,1x,a19,1x,a40,1x,i6,3(f12.3,11x),6x,a5)'
character(len=120) :: fmt_srfc = '(7(:,f12.3,i4,f7.2))'
! character(len=120) :: fmt_srfc = '(f12.3,i4,f7.2,F12.3,I4,F7.3)'
character(len=120) :: fmt_each = &
'(3(f12.3,i4,f7.2),11x,3(f12.3,i4,f7.2),11x,3(f12.3,i4,f7.2))'
! lat/long information calculated in da_setup_firstguess_wrf
real, parameter :: deg_to_rad = pi/180.0
real, parameter :: rad_to_deg = 1.0/deg_to_rad
real, allocatable :: cos_xls(:)
real, allocatable :: sin_xls(:)
real, allocatable :: cos_xle(:)
real, allocatable :: sin_xle(:)
integer :: ierr ! General error code
integer :: comm ! MPI communicator
integer :: ids,ide,jds,jde,kds,kde
integer :: ims,ime,jms,jme,kms,kme
integer :: its,ite,jts,jte,kts,kte
integer :: ips,ipe,jps,jpe,kps,kpe
integer :: itsy,itey,jtsy,jtey,ktsy,ktey
integer :: itsx,itex,jtsx,jtex,ktsx,ktex
integer :: ide_ens,jde_ens,kde_ens
integer :: its_int,ite_int,jts_int,jte_int,kts_int,kte_int
integer :: ids_int,ide_int,jds_int,jde_int,kds_int,kde_int
integer :: ims_int,ime_int,jms_int,jme_int,kms_int,kme_int
integer :: ips_int,ipe_int,jps_int,jpe_int,kps_int,kpe_int
character (len=filename_len) :: input_file_ens = 'fg_ens'
TYPE dual_res_type
real :: x
real :: y
integer :: i
integer :: j
real :: dx
real :: dy
real :: dxm
real :: dym
integer :: xx
integer :: yy
END TYPE dual_res_type
TYPE(dual_res_type), allocatable :: ob_locs(:)
integer :: total_here
integer :: num_qcstat_conv(2,num_ob_indexes,num_ob_vars,npres_print+1)
character*4, parameter :: ob_vars(num_ob_vars) = (/'U ','V ','T ',&
'Q ','Ps ','Spd ',&
'Tpw ','GpsR','Thic','Rain'/)
real, parameter :: pptop(1:npres_print) = (/ 1000.0, 900.0, 800.0, 600.0, 400.0, 300.0, &
250.0, 200.0, 150.0, 100.0, 50.0, 0./)
real, parameter :: ppbot(npres_print) = (/ 1200.0, 999.9, 899.9, 799.0, 599.9, 399.9, &
299.9, 249.9, 199.9, 149.9, 99.9, 49.9/)
real*8, allocatable :: time_slots(:)
logical :: global
logical, allocatable :: fgat_rain_flags(:)
end module da_control