Skip to content

Commit 1436973

Browse files
authored
add WRFDA satwnd.bufr ingest (#1617)
TYPE: new feature KEYWORDS: WRFDA, satwnd.bufr SOURCE: Jamie Bresch (NCAR) DESCRIPTION OF CHANGES: When ob_format=1 (bufr), WRFDA reads NCEP's prepbufr file and processes satellite winds (AMV) contained in prepbufr as ob type geoamv. This PR adds the capability to read a separate satwnd bufr file and decode additional AMVs (as ob type polaramv) that are not included in prepbufr. The `use_satwnd_bufr` default is true, when `ob_format=1` and `satwnd.bufr` does not exist in the working directory. There is no impact except for a warning message of "satwnd.bufr does not exist". Data sources: https://nomads.ncep.noaa.gov/pub/data/nccf/com/gfs/prod/gdas.YYYYMMDD/HH/atmos/gdas.tHHz.satwnd.tm00.bufr_d cheyenne:/gpfs/fs1/collections/rda/data/ds351.0/bufr/YYYY/gdas.satwnd.tHHz.YYYYMMDD.bufr Thinning for satwnd.bufr (done in da_read_obs_bufr_satwnd.inc) is implemented differently than all other ob types. Superobbing is available when `thin_conv_opt` (polaramv) is set to 3 (2-D thinning boxes) or 4 (3-D thinning boxes). The reading of an external obs error table is moved one level up, so the table values can be used by both da_read_obs_bufr.inc and da_read_obs_bufr_satwnd.inc Piggybacking on top of this PR are some other README.namelist update to fix a few typos pointed out by Yi-Chuan Lo (Central Weather Bureau, Taiwan) and adding a descrption for recently added gpsref options. LIST OF MODIFIED FILES: M Registry/registry.var M var/README.namelist M var/build/depend.txt M var/da/da_control/da_control.f90 M var/da/da_obs_io/da_obs_io.f90 M var/da/da_obs_io/da_read_obs_bufr.inc A var/da/da_obs_io/da_read_obs_bufr_satwnd.inc M var/da/da_radiance/gsi_thinning.f90 M var/da/da_setup_structures/da_setup_obs_structures.inc M var/da/da_setup_structures/da_setup_obs_structures_bufr.inc M var/da/da_setup_structures/da_setup_structures.f90 TESTS CONDUCTED: 1. A few tests were conducted to check that this version of the code runs. 2. Jenkins tests are all passing. RELEASE NOTE: WRFDA can ingest NCEP's satwnd.bufr (gdas.satwnd.tHHz.YYYYMMDD.bufr) to assimilate more AMVs that are not included in NCEP's prepbufr files. More flexible thinning/superobbing options (thin_conv_opt) and obs error specification (uv_error_opt) are implemented for using satwnd.bufr. See WRFDA/var/README.namelist for details.
1 parent 3bb5e91 commit 1436973

11 files changed

+1265
-45
lines changed

Registry/registry.var

+5-1
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,8 @@ rconfig integer num_fgat_time namelist,wrfvar3 1 1 - "num
136136
rconfig logical thin_conv namelist,wrfvar4 1 .true. - "thin_conv" "" ""
137137
rconfig logical thin_conv_ascii namelist,wrfvar4 1 .false. - "thin_conv_ascii" "" ""
138138
rconfig integer thin_conv_opt namelist,wrfvar4 num_ob_indexes 1 - "thin_conv_opt" "" "0=no thinning, >0:thinning on"
139-
rconfig real thin_mesh_conv namelist,wrfvar4 num_ob_indexes 20.0 - "thin_mesh_conv" "" ""
139+
rconfig real thin_mesh_conv namelist,wrfvar4 num_ob_indexes 20.0 - "thin_mesh_conv" "horizontal thinning mesh" "km"
140+
rconfig real thin_mesh_vert_conv namelist,wrfvar4 num_ob_indexes 100.0 - "thin_mesh_vert_conv" "vertical thinning mesh" "hPa"
140141
rconfig logical thin_rainobs namelist,wrfvar4 1 .true. - "thin_rainobs" "" ""
141142
rconfig logical use_synopobs namelist,wrfvar4 1 .true. - "use_synopobs" "" ""
142143
rconfig logical use_shipsobs namelist,wrfvar4 1 .true. - "use_shipsobs" "" ""
@@ -148,6 +149,7 @@ rconfig logical use_pilotobs namelist,wrfvar4 1 .true. - "use
148149
rconfig logical use_airepobs namelist,wrfvar4 1 .true. - "use_airepobs" "" ""
149150
rconfig logical use_geoamvobs namelist,wrfvar4 1 .true. - "use_geoamvobs" "" ""
150151
rconfig logical use_polaramvobs namelist,wrfvar4 1 .true. - "use_polaramvobs" "" ""
152+
rconfig logical use_satwnd_bufr namelist,wrfvar4 1 .true. - "use_satwnd_bufr" "if reading from satwnd.bufr" ""
151153
rconfig logical use_bogusobs namelist,wrfvar4 1 .true. - "use_bogusobs" "" ""
152154
rconfig logical use_buoyobs namelist,wrfvar4 1 .true. - "use_buoyobs" "" ""
153155
rconfig logical use_profilerobs namelist,wrfvar4 1 .true. - "use_profilerobs" "" ""
@@ -528,6 +530,8 @@ rconfig real gpsref_qc_pcnt_h2 namelist,obs_opt 1 25000.0 - "gp
528530
rconfig real gpsref_qc_pcnt_below namelist,obs_opt 1 0.05 - "gpsref_qc_pcnt_below" "error percentage threshold below" ""
529531
rconfig real gpsref_qc_pcnt_middle namelist,obs_opt 1 0.04 - "gpsref_qc_pcnt_middle" "error percentage threshold middle" ""
530532
rconfig real gpsref_qc_pcnt_above namelist,obs_opt 1 0.10 - "gpsref_qc_pcnt_above" "error percentage threshold above" ""
533+
rconfig integer uv_error_opt namelist,obs_opt num_ob_indexes 3 - "uv_error_opt" "" "1: single uv_error_val, 2: from table, 3: from ob input"
534+
rconfig real uv_error_val namelist,obs_opt num_ob_indexes 2.5 - "uv_error_val" "" "m/s"
531535
rconfig logical jcdfi_use namelist,perturbation 1 .false. - "jcdfi_use" "JcDFI on/off" ""
532536
rconfig integer jcdfi_diag namelist,perturbation 1 1 - "jcdfi_diag" "JcDFI diag. on/off" ""
533537
rconfig real jcdfi_penalty namelist,perturbation 1 10. - "jcdfi_penalty" "Penalty parameter for JcDF" ""

var/README.namelist

+46-6
Original file line numberDiff line numberDiff line change
@@ -89,10 +89,26 @@ Description of WRFDA namelist variables, defined in Registry/registry.var
8989
; data are "thinned" within thinning routine, however,
9090
; thin_conv can be set to .false. for debugging purpose.
9191
thin_conv_ascii = .false. ; .true.: thinning for ob_format=2 (ASCII) observations
92-
thin_mesh_conv (max_instruments) = 20.0 ; km, size of thinning mesh boxes for conventional (non-radiance)
92+
thin_conv_opt (num_ob_indexes) = 1 ; when thin_conv=true or thin_conv_ascii=true, each ob type
93+
; can set its thin_conv_opt.
94+
; the index/order of each ob type follows the definition in
95+
; WRFDA/var/da/da_control/da_control.f90
96+
; when thin_conv=false or thin_conv_ascii=false, WRFDA sets thin_conv_opt(:)=0
97+
; 0: no thinning
98+
; 1: thinning is on, keep one ob within a thinning box
99+
; 2: keep multiple obs within a thinning box, only applies to use_satwnd_bufr (polaramv)
100+
; 3: superob in horizontal, only applies to use_satwnd_bufr (polaramv)
101+
; 4: superob in horizontal and vertical (need to set also thin_mesh_vert_conv),
102+
; only applies to use_satwnd_bufr (polaramv)
103+
thin_mesh_conv (num_ob_indexes) = 20.0 ; km, size of horizontal thinning mesh boxes for conventional (non-radiance)
93104
; observations. Each observation type can set its thinning mesh and
94105
; the index/order follows the definition in
95106
; WRFDA/var/da/da_control/da_control.f90
107+
thin_mesh_vert_conv(num_ob_indexes) = 100.0 ; hPa, size of vertical thinning mesh boxes for conventional (non-radiance)
108+
; observations. Each observation type can set its thinning mesh and
109+
; the index/order of each ob type follows the definition in
110+
; WRFDA/var/da/da_control/da_control.f90
111+
; only used when thin_conv_opt=4 and only implemented for use_satwnd_bufr (polaramv)
96112
; use_xxxobs - .true.: assimilate xxx obs if available
97113
; .false.: do not assimilate xxx obs even if available
98114
use_synopobs = .true.
@@ -103,6 +119,10 @@ Description of WRFDA namelist variables, defined in Registry/registry.var
103119
use_airepobs = .true.
104120
use_geoamvobs = .true.
105121
use_polaramvobs = .true.
122+
use_satwnd_bufr = .true. ; when ob_format=1 and satwnd.bufr exists in the working directory
123+
; satellite AMVs are read in from satwnd.bufr and processed as polaramv
124+
; this is to add additional AMVs that are not included in prepBUFR
125+
; AMVs from prepBUFR are processed as geoamv in WRFDA
106126
use_bogusobs = .true.
107127
use_buoyobs = .true.
108128
use_profilerobs = .true.
@@ -228,11 +248,11 @@ Description of WRFDA namelist variables, defined in Registry/registry.var
228248
; control variable 5 is unbalanced surface pressure for cv_options=5 and 6.
229249
; control variable 5 is surface pressure for cv_options=7.
230250
var_scaling6 (max_outer_iterations) = 1.0 ; cloud liquid water
231-
var_scaling6 (max_outer_iterations) = 1.0 ; rain water
232-
var_scaling6 (max_outer_iterations) = 1.0 ; ice water
233-
var_scaling6 (max_outer_iterations) = 1.0 ; snow
234-
var_scaling6 (max_outer_iterations) = 1.0 ; grauple
235-
var_scaling6 (max_outer_iterations) = 1.0 ; vertical velocity
251+
var_scaling7 (max_outer_iterations) = 1.0 ; rain water
252+
var_scaling8 (max_outer_iterations) = 1.0 ; ice water
253+
var_scaling9 (max_outer_iterations) = 1.0 ; snow
254+
var_scaling10(max_outer_iterations) = 1.0 ; graupel
255+
var_scaling11(max_outer_iterations) = 1.0 ; vertical velocity
236256
; see the above description about the meaning of control variables 1-5.
237257
len_scaling1 (max_outer_iterations) = 1.0 ; tuning factor of scale-length for control variable 1.
238258
len_scaling2 (max_outer_iterations) = 1.0 ; tuning factor of scale-length for control variable 2.
@@ -582,6 +602,26 @@ Description of WRFDA namelist variables, defined in Registry/registry.var
582602
gpsro_drift = 1 ; horizontal drifting for GPSRO. 0=no drift, 1=drift
583603
gpseph_opt = 1 ; 0: local operator variant, 1: non-local
584604
gpseph_loadbalance = .true. ;
605+
write_iv_gpsref = .false. ; switch to write out RO_Innov_ files
606+
; the following gpsref_qc settings are used in da_qc_gpsref.inc
607+
gpsref_qc_dndz_opt = 1 ; 0: off, 1: on (default)
608+
gpsref_qc_dndz2_opt = 1 ; 0: off, 1: on (default)
609+
gpsref_qc_dndz_thresh = -50.0
610+
gpsref_qc_dndz2_thresh = 100.0
611+
gpsref_qc_gsi_opt = 1 ; 0: off, 1: on (default)
612+
gpsref_qc_pcnt_opt = 1 ; 0: off, 1: on (default)
613+
gpsref_qc_pcnt_h1 = 7000.0
614+
gpsref_qc_pcnt_h2 = 25000.0
615+
gpsref_qc_pcnt_below = 0.05
616+
gpsref_qc_pcnt_middle = 0.04
617+
gpsref_qc_pcnt_above = 0.10
618+
; uv_error_opt and uv_error_opt are only used by use_satwnd_bufr (polaramv)
619+
uv_error_opt (num_ob_indexes) = 3 ; 1: single uv_error_val
620+
; 2: from external obs error table (same format as used in GSI)
621+
; 3: from ob input
622+
; when ob errors are not available from ob input and obs_errtable,
623+
; WRFDA uses uv_error_val from namelist (below) for use_satwnd_bufr (polaramv).
624+
uv_error_val (num_ob_indexes) = 2.5 ; m/s, uv observation error
585625
/
586626
&perturbation ; settings related to the 4D-Var penalty term option, which controls the
587627
; high-frequency gravity waves using a digital filter.

var/build/depend.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ da_mtgirs.o : da_mtgirs.f90 da_calculate_grady_mtgirs.inc da_get_innov_vector_mt
133133
da_netcdf_interface.o : da_netcdf_interface.f90 da_atotime.inc da_get_bdytimestr_cdf.inc da_get_bdyfrq.inc da_put_att_cdf.inc da_get_att_cdf.inc da_put_var_2d_int_cdf.inc da_get_var_2d_int_cdf.inc da_put_var_2d_real_cdf.inc da_put_var_3d_real_cdf.inc da_get_var_2d_real_cdf.inc da_get_var_3d_real_cdf.inc da_get_gl_att_real_cdf.inc da_get_gl_att_int_cdf.inc da_get_dims_cdf.inc da_get_times_cdf.inc da_get_var_1d_real_cdf.inc
134134
da_obs.o : da_obs.f90 da_grid_definitions.o da_set_obs_missing.inc da_obs_sensitivity.inc da_count_filtered_obs.inc da_store_obs_grid_info_rad.inc da_store_obs_grid_info.inc da_random_omb_all.inc da_fill_obs_structures.inc da_fill_obs_structures_rain.inc da_fill_obs_structures_radar.inc da_check_missing.inc da_add_noise_to_ob.inc da_transform_xtoy_adj.inc da_transform_xtoy.inc da_obs_proc_station.inc module_dm.o da_tracing.o da_tools.o da_tools_serial.o da_synop.o da_ssmi.o da_tamdar.o da_mtgirs.o da_sound.o da_ships.o da_satem.o da_rttov.o da_reporting.o da_rain.o da_radar.o da_qscat.o da_pseudo.o da_profiler.o da_polaramv.o da_pilot.o da_physics.o da_metar.o da_gpsref.o da_gpspw.o da_geoamv.o da_crtm.o da_control.o da_buoy.o da_bogus.o da_airsr.o da_airep.o module_domain.o da_define_structures.o da_gpseph.o module_state_description.o da_fill_obs_structures_chem_sfc.inc da_chem_sfc.o
135135
da_chem_sfc.o: da_chem_sfc.f90 da_jo_and_grady_chem_sfc.inc da_jo_chem_sfc.inc da_residual_chem_sfc.inc da_transform_xtoy_chem_sfc.inc da_transform_xtoy_chem_sfc_adj.inc da_get_innov_vector_chem_sfc.inc da_check_max_iv_chem_sfc.inc da_calculate_grady_chem_sfc.inc da_interpolation.o module_dm.o module_domain.o da_control.o da_reporting.o da_tools_serial.o da_tools.o da_define_structures.o da_obs.o da_define_structures.o da_ao_stats_chem_sfc.inc da_oi_stats_chem_sfc.inc da_print_stats_chem_sfc.inc
136-
da_obs_io.o : da_obs_io.f90 da_grid_definitions.o da_final_write_modified_filtered_obs.inc da_final_write_filtered_obs.inc da_write_noise_to_ob.inc da_read_omb_tmp.inc da_read_rand_unit.inc da_read_y_unit.inc da_final_write_y.inc da_final_write_obs.inc da_read_obs_bufrgpsro.inc da_read_obs_bufr.inc da_write_y.inc da_write_modified_filtered_obs.inc da_write_filtered_obs.inc da_write_obs_etkf.inc da_search_obs.inc da_read_iv_for_multi_inc.inc da_write_iv_for_multi_inc.inc da_write_obs.inc da_use_obs_errfac.inc da_read_errfac.inc da_read_obs_rain.inc da_scan_obs_rain.inc da_scan_obs_radar.inc da_read_obs_radar.inc da_scan_obs_ascii.inc da_read_obs_ascii.inc da_par_util.o gsi_thinning.o module_radiance.o da_tracing.o da_tools_serial.o da_tools.o da_reporting.o da_physics.o da_par_util1.o da_obs.o da_grid_definitions.o da_define_structures.o da_control.o module_domain.o da_read_lsac_util.inc da_read_obs_lsac.inc da_scan_obs_lsac.inc da_netcdf_interface.o da_gpseph.o da_read_obs_bufrgpsro_eph.inc da_read_obs_chem_sfc.inc da_scan_obs_chem_sfc.inc da_write_obs_chem_sfc.inc da_final_write_obs_chem_sfc.inc da_final_write_obs_gas_sfc.inc
136+
da_obs_io.o : da_obs_io.f90 da_grid_definitions.o da_final_write_modified_filtered_obs.inc da_final_write_filtered_obs.inc da_write_noise_to_ob.inc da_read_omb_tmp.inc da_read_rand_unit.inc da_read_y_unit.inc da_final_write_y.inc da_final_write_obs.inc da_read_obs_bufrgpsro.inc da_read_obs_bufr.inc da_write_y.inc da_write_modified_filtered_obs.inc da_write_filtered_obs.inc da_write_obs_etkf.inc da_search_obs.inc da_read_iv_for_multi_inc.inc da_write_iv_for_multi_inc.inc da_write_obs.inc da_use_obs_errfac.inc da_read_errfac.inc da_read_obs_rain.inc da_scan_obs_rain.inc da_scan_obs_radar.inc da_read_obs_radar.inc da_scan_obs_ascii.inc da_read_obs_ascii.inc da_par_util.o gsi_thinning.o module_radiance.o da_tracing.o da_tools_serial.o da_tools.o da_reporting.o da_physics.o da_par_util1.o da_obs.o da_grid_definitions.o da_define_structures.o da_control.o module_domain.o da_read_lsac_util.inc da_read_obs_lsac.inc da_scan_obs_lsac.inc da_netcdf_interface.o da_gpseph.o da_read_obs_bufrgpsro_eph.inc da_read_obs_chem_sfc.inc da_scan_obs_chem_sfc.inc da_write_obs_chem_sfc.inc da_final_write_obs_chem_sfc.inc da_final_write_obs_gas_sfc.inc da_read_obs_bufr_satwnd.inc
137137
da_par_util.o : da_par_util.f90 da_proc_maxmin_combine.inc da_proc_stats_combine.inc da_system.inc da_y_facade_to_global.inc da_generic_boilerplate.inc da_deallocate_global_synop.inc da_deallocate_global_sound.inc da_deallocate_global_sonde_sfc.inc da_generic_methods.inc da_patch_to_global_3d.inc da_patch_to_global_dual_res.inc da_patch_to_global_2d.inc da_cv_to_global.inc da_transpose_y2x_v2.inc da_transpose_x2y_v2.inc da_transpose_z2y.inc da_transpose_y2z.inc da_transpose_x2z.inc da_transpose_z2x.inc da_transpose_y2x.inc da_transpose_x2y.inc da_unpack_count_obs.inc da_pack_count_obs.inc da_copy_tile_dims.inc da_copy_dims.inc da_alloc_and_copy_be_arrays.inc da_vv_to_cv.inc da_cv_to_vv.inc da_generic_typedefs.inc da_wrf_interfaces.o da_tracing.o da_reporting.o da_define_structures.o da_par_util1.o module_dm.o module_domain.o da_control.o
138138
da_par_util1.o : da_par_util1.f90 da_proc_sum_real.inc da_proc_sum_ints.inc da_proc_sum_int.inc da_control.o module_state_description.o
139139
da_physics.o : da_physics.f90 da_uv_to_sd_lin.inc da_uv_to_sd_adj.inc da_integrat_dz.inc da_wdt.inc da_filter_adj.inc da_filter.inc da_evapo_lin.inc da_condens_lin.inc da_condens_adj.inc da_moist_phys_lin.inc da_moist_phys_adj.inc da_sfc_pre_adj.inc da_sfc_pre_lin.inc da_sfc_pre.inc da_transform_xtowtq_adj.inc da_transform_xtowtq.inc da_transform_xtopsfc_adj.inc da_transform_xtopsfc.inc da_sfc_wtq_adj.inc da_sfc_wtq_lin.inc da_sfc_wtq.inc da_julian_day.inc da_roughness_from_lanu.inc da_get_q_error.inc da_check_rh_simple.inc da_check_rh.inc da_transform_xtogpsref_lin.inc da_transform_xtogpsref_adj.inc da_transform_xtogpsref.inc da_transform_xtotpw_adj.inc da_transform_xtotpw.inc da_transform_xtoztd_adj.inc da_transform_xtoztd_lin.inc da_transform_xtoztd.inc da_tv_profile_tl.inc da_thickness_tl.inc da_find_layer_adj.inc da_thickness.inc da_tv_profile_adj.inc da_find_layer.inc da_thickness_adj.inc da_find_layer_tl.inc da_tv_profile.inc da_tpq_to_slp_adj.inc da_tpq_to_slp_lin.inc da_wrf_tpq_2_slp.inc da_tpq_to_slp.inc da_trh_to_td.inc da_tp_to_qs_lin1.inc da_tp_to_qs_lin.inc da_tp_to_qs_adj1.inc da_tp_to_qs_adj.inc da_tp_to_qs1.inc da_tp_to_qs.inc da_tprh_to_q_lin1.inc da_tprh_to_q_lin.inc da_tprh_to_q_adj1.inc da_tprh_to_q_adj.inc da_tpq_to_rh_lin1.inc da_tpq_to_rh_lin.inc da_tpq_to_rh.inc da_pt_to_rho_lin.inc da_pt_to_rho_adj.inc da_uvprho_to_w_adj.inc da_uvprho_to_w_lin.inc da_prho_to_t_lin.inc da_prho_to_t_adj.inc da_wrf_interfaces.o da_reporting.o da_dynamics.o da_interpolation.o da_tracing.o da_par_util.o da_define_structures.o da_control.o module_comm_dm.o module_dm.o module_domain.o da_grid_definitions.o da_gpseph.o

var/da/da_control/da_control.f90

+7-1
Original file line numberDiff line numberDiff line change
@@ -690,6 +690,12 @@ module da_control
690690

691691
logical, allocatable :: fgat_rain_flags(:)
692692

693-
integer, parameter :: no_thin = 0
693+
integer, parameter :: no_thin = 0 ! no thinning
694+
integer, parameter :: thin_single = 1 ! keep one ob within a thinning box
695+
integer, parameter :: thin_multi = 2 ! keep multiple obs within a thinning box
696+
integer, parameter :: thin_superob = 3 ! superob in 2-D thinning boxes
697+
integer, parameter :: thin_superob_hv = 4 ! superob in horizontal and vertical
698+
699+
integer, parameter :: error_opt_nml = 1 ! ob error specified in namelist
694700

695701
end module da_control

var/da/da_obs_io/da_obs_io.f90

+7-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ module da_obs_io
3333
lsac_use_u, lsac_use_v, lsac_use_t, lsac_use_q, lsac_u_error, lsac_v_error, lsac_t_error, lsac_q_error, &
3434
gpsro_drift, max_gpseph_input, use_gpsephobs, gpseph, gpseph_loadbalance, kds, kde, kts, kte, &
3535
use_radar_rhv, use_radar_rqv, use_radar_rf, use_radar_rv, multi_inc, &
36-
thin_conv_opt, no_thin
36+
thin_conv_opt, no_thin, thin_single, thin_multi, thin_superob, thin_superob_hv, &
37+
thin_mesh_vert_conv, use_satwnd_bufr, uv_error_opt, uv_error_val, error_opt_nml
3738

3839
use da_wrf_interfaces, only : wrf_dm_bcast_integer, wrf_dm_bcast_real
3940

@@ -86,6 +87,10 @@ module da_obs_io
8687
include 'mpif.h'
8788
#endif
8889

90+
! array to hold observation error table
91+
! (300,33,6) ! 300 ob types, 33 levels (rows), 6 variables (columns)
92+
real, allocatable :: oetab(:,:,:)
93+
8994
contains
9095

9196
#include "da_read_obs_ascii.inc"
@@ -125,5 +130,6 @@ module da_obs_io
125130
#include "da_read_lsac_util.inc"
126131
#include "da_read_obs_lsac.inc"
127132
#include "da_scan_obs_lsac.inc"
133+
#include "da_read_obs_bufr_satwnd.inc"
128134

129135
end module da_obs_io

var/da/da_obs_io/da_read_obs_bufr.inc

+2-28
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ subroutine da_read_obs_bufr (iv)
7373

7474
logical :: use_errtable
7575
integer :: junit, itype, ivar
76-
real :: oetab(300,33,6) ! 300 ob types, 33 levels (rows), 6 variables (columns)
7776
real :: err_uv, err_t, err_p, err_q, err_pw, coef
7877
integer :: ibufr
7978
integer :: num_outside_all, num_outside_time, num_thinned,num_p,numbufr
@@ -199,29 +198,6 @@ bufrfile: do ibufr=1,numbufr
199198
cycle bufrfile
200199
end if
201200
end if
202-
! open observation error table if provided.
203-
call da_get_unit(junit)
204-
open (unit=junit, file='obs_errtable', form='formatted', status='old', &
205-
iostat=iost)
206-
if ( iost /= 0 ) then
207-
use_errtable = .false.
208-
call da_free_unit(junit)
209-
else
210-
use_errtable = .true.
211-
write(unit=message(1),fmt='(A)') &
212-
"obs_errtable file is found. Will use user-provided obs errors."
213-
call da_message(message(1:1))
214-
end if
215-
if ( use_errtable ) then
216-
read_loop: do
217-
read (junit,'(1x,i3)',iostat=iost) itype
218-
if ( iost /=0 ) exit read_loop
219-
do k = 1, 33
220-
read (junit,'(1x,6e12.5)',iostat=iost) (oetab(itype,k,ivar),ivar=1,6)
221-
if ( iost /=0 ) exit read_loop
222-
end do
223-
end do read_loop
224-
end if
225201

226202
hdstr='SID XOB YOB DHR TYP ELV T29'
227203
obstr='POB QOB TOB ZOB UOB VOB PWO CAT' ! observation
@@ -246,6 +222,8 @@ bufrfile: do ibufr=1,numbufr
246222
write(unit=message(1),fmt='(a,i10)') 'BUFR file date is: ', idate
247223
call da_message(message(1:1))
248224

225+
! oetab(300,33,6) processed in da_setup_obs_structures_bufr.inc
226+
use_errtable = allocated(oetab)
249227

250228
! 2.0 read data
251229
! scan reports first
@@ -1152,10 +1130,6 @@ bufrfile: do ibufr=1,numbufr
11521130

11531131
call closbf(iunit)
11541132
close(iunit)
1155-
if ( use_errtable ) then
1156-
close(junit)
1157-
call da_free_unit(junit)
1158-
end if
11591133

11601134
end do bufrfile
11611135

0 commit comments

Comments
 (0)