diff --git a/Registry/registry.var b/Registry/registry.var index 00a39434a7..c3da95a13d 100644 --- a/Registry/registry.var +++ b/Registry/registry.var @@ -177,6 +177,12 @@ rconfig real rfmin namelist,wrfvar4 1 0.0 - "min rconfig integer rf_noice namelist,wrfvar4 1 0 - "disable ice phace in H" "" "" rconfig real radar_rf_rscl namelist,wrfvar4 1 1.0 - "weight of rf" "" "" rconfig real radar_rv_rscl namelist,wrfvar4 1 1.0 - "weight of rv" "" "" +rconfig logical use_lightningobs namelist,wrfvar4 1 .false. - "use_lightningobs" "" "" +rconfig logical use_lightning_w namelist,wrfvar4 1 .false. - "use_lightning_w" "" "" +rconfig logical use_lightning_qv namelist,wrfvar4 1 .false. - "use_lightning_qv" "" "" +rconfig logical use_lightning_div namelist,wrfvar4 1 .false. - "use_lightning_div" "" "" +rconfig real min_flashrate namelist,wrfvar4 1 2.0 - "min_flashrate" "" "" +rconfig real lightning_min_rh namelist,wrfvar4 1 85. - "lightning_min_rh" "" "" rconfig logical use_rainobs namelist,wrfvar4 1 .false. - "use_rainobs" "" "" rconfig logical use_hirs2obs namelist,wrfvar4 1 .false. - "use_hirs2obs" "" "" rconfig logical use_hirs3obs namelist,wrfvar4 1 .false. - "use_hirs3obs" "" "" @@ -230,6 +236,9 @@ rconfig real max_error_buv namelist,wrfvar5 1 500.0 - "max rconfig real max_error_bt namelist,wrfvar5 1 500.0 - "max_error_bt" "" "" rconfig real max_error_bq namelist,wrfvar5 1 500.0 - "max_error_bq" "" "" rconfig real max_error_slp namelist,wrfvar5 1 500.0 - "max_error_slp" "" "" +rconfig real max_error_lda_w namelist,wrfvar5 1 5.0 - "max_error_lda_w" "" "" +rconfig real max_error_lda_div namelist,wrfvar5 1 5.0 - "max_error_lda_div" "" "" +rconfig real max_error_lda_qv namelist,wrfvar5 1 5.0 - "max_error_lda_qv" "" "" rconfig logical check_buddy namelist,wrfvar5 1 .false. - "check_buddy" "" "" rconfig logical put_rand_seed namelist,wrfvar5 1 .false. - "put_rand_seed" "" "" rconfig logical omb_set_rand namelist,wrfvar5 1 .false. - "omb_set_rand" "" "" diff --git a/frame/module_driver_constants.F b/frame/module_driver_constants.F index c8a36cf0e6..6c7d797d1a 100644 --- a/frame/module_driver_constants.F +++ b/frame/module_driver_constants.F @@ -85,9 +85,9 @@ MODULE module_driver_constants ! The maximum number of obs indexes (for conventional DA obs) #if (WRF_CHEM == 1) - INTEGER , PARAMETER :: num_ob_indexes = 30 + INTEGER , PARAMETER :: num_ob_indexes = 31 #else - INTEGER , PARAMETER :: num_ob_indexes = 29 + INTEGER , PARAMETER :: num_ob_indexes = 30 #endif diff --git a/var/build/da.make b/var/build/da.make index 0ee2c483df..6770f48734 100644 --- a/var/build/da.make +++ b/var/build/da.make @@ -29,6 +29,7 @@ WRFVAR_OBJS = \ da_pilot.o \ da_radar.o \ da_rain.o \ + da_lightning.o \ da_gpspw.o \ da_gpsref.o \ da_gpseph.o \ diff --git a/var/build/depend.txt b/var/build/depend.txt index 8b90b55d4b..59e626f662 100644 --- a/var/build/depend.txt +++ b/var/build/depend.txt @@ -111,7 +111,7 @@ da_bogus.o : da_bogus.f90 da_calculate_grady_bogus.inc da_get_innov_vector_bogus da_buoy.o : da_buoy.f90 da_calculate_grady_buoy.inc da_get_innov_vector_buoy.inc da_check_max_iv_buoy.inc da_transform_xtoy_buoy_adj.inc da_transform_xtoy_buoy.inc da_print_stats_buoy.inc da_oi_stats_buoy.inc da_residual_buoy.inc da_jo_and_grady_buoy.inc da_ao_stats_buoy.inc da_tracing.o da_tools.o da_statistics.o da_physics.o da_grid_definitions.o da_par_util.o da_par_util1.o da_interpolation.o da_define_structures.o da_control.o module_domain.o da_control.o : da_control.f90 module_driver_constants.o da_crtm.o : da_crtm.f90 da_det_crtm_climat.inc da_crtm_sensor_descriptor.inc da_crtm_init.inc da_crtm_ad.inc da_crtm_direct.inc da_crtm_k.inc da_crtm_tl.inc da_get_innov_vector_crtm.inc da_transform_xtoy_crtm_adj.inc da_transform_xtoy_crtm.inc da_tracing.o da_tools.o da_tools_serial.o da_reporting.o da_radiance1.o module_dm.o da_physics.o da_interpolation.o da_control.o module_radiance.o da_define_structures.o module_domain.o -da_define_structures.o : da_define_structures.f90 da_gauss_noise.inc da_random_seed.inc da_initialize_cv.inc da_zero_vp_type.inc da_zero_y.inc da_zero_x.inc da_deallocate_y.inc da_deallocate_observations.inc da_deallocate_background_errors.inc da_allocate_y.inc da_allocate_observations.inc da_allocate_background_errors.inc da_wavelet.o da_reporting.o da_tools_serial.o da_tracing.o da_control.o module_domain.o da_allocate_y_rain.inc da_allocate_y_radar.inc da_allocate_observations_rain.inc da_allocate_obs_info.inc da_zero_xchem_type.inc module_state_description.o da_allocate_observations_chem_sfc.inc +da_define_structures.o : da_define_structures.f90 da_gauss_noise.inc da_random_seed.inc da_initialize_cv.inc da_zero_vp_type.inc da_zero_y.inc da_zero_x.inc da_deallocate_y.inc da_deallocate_observations.inc da_deallocate_background_errors.inc da_allocate_y.inc da_allocate_observations.inc da_allocate_background_errors.inc da_wavelet.o da_reporting.o da_tools_serial.o da_tracing.o da_control.o module_domain.o da_allocate_y_rain.inc da_allocate_y_lightning.inc da_allocate_y_radar.inc da_allocate_observations_rain.inc da_allocate_obs_info.inc da_zero_xchem_type.inc module_state_description.o da_allocate_observations_chem_sfc.inc da_dynamics.o : da_dynamics.f90 da_wz_base.inc da_uv_to_vorticity.inc da_w_adjustment_adj.inc da_w_adjustment_lin.inc da_uv_to_divergence_adj.inc da_uv_to_divergence.inc da_psichi_to_uv_adj.inc da_psichi_to_uv.inc da_hydrostaticp_to_rho_lin.inc da_hydrostaticp_to_rho_adj.inc da_balance_geoterm_lin.inc da_balance_geoterm_adj.inc da_balance_equation_lin.inc da_balance_equation_adj.inc da_balance_cycloterm_lin.inc da_balance_cycloterm_adj.inc da_balance_cycloterm.inc da_wpec_constraint.inc da_wpec_constraint_adj.inc da_wpec_constraint_cycloterm.inc da_wpec_constraint_geoterm.inc da_wpec_constraint_lin.inc da_tools.o da_tracing.o da_ffts.o da_reporting.o da_define_structures.o module_comm_dm.o module_dm.o module_domain.o da_control.o da_divergence_constraint.inc da_divergence_constraint_adj.inc da_etkf.o : da_etkf.f90 da_solve_etkf.inc da_matmultiover.inc da_matmulti.inc da_innerprod.inc da_lapack.o da_gen_be.o da_control.o da_ffts.o : da_ffts.f90 da_solve_poissoneqn_fst_adj.inc da_solve_poissoneqn_fst.inc da_solve_poissoneqn_fct_adj.inc da_solve_poissoneqn_fct.inc module_ffts.o module_comm_dm.o module_dm.o da_wrf_interfaces.o da_tracing.o da_par_util.o da_define_structures.o da_control.o module_domain.o @@ -125,15 +125,15 @@ da_interpolation.o : da_interpolation.f90 da_interp_msk_avg_2d_partial.inc da_in da_lapack.o : da_lapack.f90 dlamch.inc dlarf.inc dlarfg.inc dlarft.inc dlarfb.inc dorg2l.inc dorg2r.inc dsytd2.inc dlatrd.inc dorgqr.inc dorgql.inc dlassq.inc dlapy2.inc dlartg.inc dlasrt.inc dlansy.inc dsytrd.inc dsterf.inc dorgtr.inc dlae2.inc dlasr.inc dlaev2.inc dlascl.inc dlanst.inc dlaset.inc iparmq.inc ieeeck.inc ilaenv.inc dsteqr.inc dsyev.inc da_blas.o da_mat_cv3.o : da_mat_cv3.f90 da_metar.o : da_metar.f90 da_calculate_grady_metar.inc da_get_innov_vector_metar.inc da_check_max_iv_metar.inc da_transform_xtoy_metar_adj.inc da_transform_xtoy_metar.inc da_print_stats_metar.inc da_oi_stats_metar.inc da_residual_metar.inc da_jo_and_grady_metar.inc da_ao_stats_metar.inc da_tracing.o da_tools.o da_statistics.o da_physics.o da_grid_definitions.o da_par_util1.o da_par_util.o da_interpolation.o da_define_structures.o da_control.o module_domain.o -da_minimisation.o : da_minimisation.f90 da_read_basicstates.inc da_swap_xtraj.inc da_lanczos_io.inc da_kmat_mul.inc da_amat_mul.inc da_sensitivity.inc da_adjoint_sensitivity.inc da_transform_vtoy_adj.inc da_transform_vtoy.inc da_calculate_grady.inc da_minimise_lz.inc da_minimise_cg.inc da_write_diagnostics.inc da_dot_cv.inc da_dot.inc da_get_innov_vector.inc da_get_var_diagnostics.inc da_calculate_residual.inc da_jo_and_grady.inc da_calculate_gradj.inc da_calculate_j.inc da_transform_vtod_wpec.inc da_transform_vtod_wpec_adj.inc module_io_wrf.o da_4dvar.o da_lapack.o module_symbols_util.o da_wrf_interfaces.o da_vtox_transforms.o da_varbc.o da_transfer_model.o da_tracing.o da_tools_serial.o da_statistics.o da_synop.o da_ssmi.o da_sound.o da_ships.o da_satem.o da_reporting.o da_rain.o da_radar.o da_radiance1.o da_radiance.o da_tamdar.o da_mtgirs.o da_qscat.o da_pseudo.o da_profiler.o da_polaramv.o da_par_util1.o da_par_util.o da_pilot.o da_metar.o da_obs_io.o da_gpsref.o da_gpspw.o da_geoamv.o da_obs.o da_define_structures.o da_control.o da_buoy.o da_bogus.o da_airsr.o da_airep.o module_state_description.o module_domain.o module_dm.o module_configure.o da_join_iv_for_multi_inc.o da_wrfvar_io.o da_gpseph.o da_varbc_tamdar.o da_chem_sfc.o +da_minimisation.o : da_minimisation.f90 da_read_basicstates.inc da_swap_xtraj.inc da_lanczos_io.inc da_kmat_mul.inc da_amat_mul.inc da_sensitivity.inc da_adjoint_sensitivity.inc da_transform_vtoy_adj.inc da_transform_vtoy.inc da_calculate_grady.inc da_minimise_lz.inc da_minimise_cg.inc da_write_diagnostics.inc da_dot_cv.inc da_dot.inc da_get_innov_vector.inc da_get_var_diagnostics.inc da_calculate_residual.inc da_jo_and_grady.inc da_calculate_gradj.inc da_calculate_j.inc da_transform_vtod_wpec.inc da_transform_vtod_wpec_adj.inc module_io_wrf.o da_4dvar.o da_lapack.o module_symbols_util.o da_wrf_interfaces.o da_vtox_transforms.o da_varbc.o da_transfer_model.o da_tracing.o da_tools_serial.o da_statistics.o da_synop.o da_ssmi.o da_sound.o da_ships.o da_satem.o da_reporting.o da_rain.o da_radar.o da_lightning.o da_radiance1.o da_radiance.o da_tamdar.o da_mtgirs.o da_qscat.o da_pseudo.o da_profiler.o da_polaramv.o da_par_util1.o da_par_util.o da_pilot.o da_metar.o da_obs_io.o da_gpsref.o da_gpspw.o da_geoamv.o da_obs.o da_define_structures.o da_control.o da_buoy.o da_bogus.o da_airsr.o da_airep.o module_state_description.o module_domain.o module_dm.o module_configure.o da_join_iv_for_multi_inc.o da_wrfvar_io.o da_gpseph.o da_varbc_tamdar.o da_chem_sfc.o da_module_convert_tool.o : da_module_convert_tool.f90 da_convertor_v_interp.inc da_module_couple_uv.o : da_module_couple_uv.f90 da_couple.inc da_calc_mu_uv.inc da_couple_uv.inc da_module_couple_uv_ad.o : da_module_couple_uv_ad.f90 da_couple_ad.inc da_calc_mu_uv_ad.inc da_couple_uv_ad.inc da_module_couple_uv.o da_mtgirs.o : da_mtgirs.f90 da_calculate_grady_mtgirs.inc da_get_innov_vector_mtgirs.inc da_check_max_iv_mtgirs.inc da_transform_xtoy_mtgirs_adj.inc da_transform_xtoy_mtgirs.inc da_print_stats_mtgirs.inc da_oi_stats_mtgirs.inc da_residual_mtgirs.inc da_jo_mtgirs_uvtq.inc da_jo_and_grady_mtgirs.inc da_ao_stats_mtgirs.inc da_tracing.o da_physics.o da_grid_definitions.o da_par_util1.o da_par_util.o da_tools.o da_statistics.o da_interpolation.o module_domain.o da_define_structures.o da_control.o 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 -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 +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_fill_obs_structures_lightning.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_lightning.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 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 -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 +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_lightning.inc da_read_obs_lightning.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 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 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 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 @@ -144,6 +144,7 @@ da_pseudo.o : da_pseudo.f90 da_calculate_grady_pseudo.inc da_transform_xtoy_pseu da_qscat.o : da_qscat.f90 da_calculate_grady_qscat.inc da_transform_xtoy_qscat_adj.inc da_transform_xtoy_qscat.inc da_print_stats_qscat.inc da_oi_stats_qscat.inc da_ao_stats_qscat.inc da_get_innov_vector_qscat.inc da_check_max_iv_qscat.inc da_residual_qscat.inc da_jo_and_grady_qscat.inc da_tracing.o da_tools.o da_statistics.o da_physics.o da_grid_definitions.o da_par_util1.o da_par_util.o da_interpolation.o da_define_structures.o da_control.o module_domain.o da_rad_diags.o : da_rad_diags.f90 da_radar.o : da_radar.f90 da_write_oa_radar_ascii.inc da_max_error_qc_radar.inc da_calculate_grady_radar.inc da_radial_velocity_adj.inc da_radial_velocity_lin.inc da_radial_velocity.inc da_radar_rf.inc da_get_innov_vector_radar.inc da_check_max_iv_radar.inc da_transform_xtoy_radar_adj.inc da_transform_xtoy_radar.inc da_print_stats_radar.inc da_oi_stats_radar.inc da_residual_radar.inc da_jo_and_grady_radar.inc da_ao_stats_radar.inc da_tools_serial.o da_reporting.o da_tracing.o da_tools.o da_statistics.o da_par_util1.o da_par_util.o da_interpolation.o da_define_structures.o da_control.o module_domain.o da_radzicevar_calc_ice_abc.inc da_radzicevar_pkx.inc da_radzicevar_rain_adj.inc da_radzicevar_virtual.inc da_radzicevar_cal_tl_fw4wetice.inc da_radzicevar_parameter_zrx.inc da_radzicevar_prepare_interceptpara.inc da_radzicevar_rain_tl.inc da_radzicevar_waterfraction.inc da_radzicevar_dryice_adj.inc da_radzicevar_parameter_zxx.inc da_radzicevar_prepare_mixingratios.inc da_radzicevar_rhoair_tl.inc da_radzicevar_wetice_adj.inc da_radzicevar_dryice_tl.inc da_radzicevar_prepare_zmm_adj.inc da_radzicevar_sigma_in_abc.inc da_radzicevar_wetice_tl.inc da_radzicevar_pxabk.inc da_radzicevar_upper_f.inc da_radzicevar.inc da_radzicevar_tl.inc da_radzicevar_adj.inc +da_lightning.o : da_lightning.f90 da_calculate_grady_lightning.inc da_get_innov_vector_lightning.inc da_check_max_iv_lightning.inc da_transform_xtoy_lightning_adj.inc da_transform_xtoy_lightning.inc da_print_stats_lightning.inc da_oi_stats_lightning.inc da_residual_lightning.inc da_jo_and_grady_lightning.inc da_ao_stats_lightning.inc da_div_profile.inc da_div_profile_adj.inc da_div_profile_tl.inc da_tracing.o da_tools.o da_statistics.o da_physics.o da_par_util1.o da_par_util.o da_define_structures.o da_control.o module_domain.o da_radiance.o : da_radiance.f90 da_blacklist_rad.inc da_read_pseudo_rad.inc da_get_innov_vector_radiance.inc da_radiance_init.inc da_setup_radiance_structures.inc da_sort_rad.inc da_read_kma1dvar.inc da_initialize_rad_iv.inc da_allocate_rad_iv.inc da_read_obs_bufrssmis.inc da_read_obs_bufrairs.inc da_read_obs_bufriasi.inc da_read_obs_bufrseviri.inc da_read_obs_bufrtovs.inc da_write_filtered_rad.inc da_read_simulated_rad.inc da_read_filtered_rad.inc da_calculate_grady_rad.inc gsi_thinning.o da_wrf_interfaces.o da_varbc.o da_tracing.o da_tools.o da_statistics.o da_rttov.o da_reporting.o da_radiance1.o da_physics.o da_par_util.o da_par_util1.o da_tools_serial.o da_interpolation.o da_define_structures.o da_crtm.o da_control.o module_radiance.o module_domain.o amsr2time_.c da_read_obs_hdf5amsr2.inc da_deallocate_radiance.inc da_read_obs_ncgoesimg.inc da_get_satzen.inc da_read_obs_hdf5ahi.inc da_read_obs_netcdf4ahi_jaxa.inc da_read_obs_hdf5gmi.inc da_read_obs_netcdf4ahi_geocat.inc mod_clddet_geoir.o da_radiance1.o : da_radiance1.f90 da_mspps_ts.inc da_mspps_emis.inc da_setup_satcv.inc da_qc_rad.inc da_print_stats_rad.inc da_oi_stats_rad.inc da_ao_stats_rad.inc da_cld_eff_radius.inc da_detsurtyp.inc da_write_oa_rad_ascii.inc da_write_iv_rad_ascii.inc da_qc_mhs.inc da_qc_ssmis.inc da_qc_hirs.inc da_qc_amsub.inc da_qc_amsua.inc da_qc_airs.inc da_cloud_detect.inc da_cloud_sim.inc da_qc_seviri.inc da_qc_iasi.inc da_qc_crtm.inc da_predictor_crtm.inc da_predictor_rttov.inc da_write_biasprep.inc da_biasprep.inc da_read_biascoef.inc da_biascorr.inc da_residual_rad.inc da_jo_and_grady_rad.inc gsi_constants.o da_tracing.o da_tools_serial.o da_tools.o da_statistics.o da_reporting.o da_par_util1.o da_par_util.o module_dm.o da_define_structures.o da_control.o module_radiance.o da_wrf_interfaces.o da_qc_amsr2.inc da_qc_goesimg.inc da_qc_ahi.inc da_qc_gmi.inc da_rain.o : da_rain.f90 da_calculate_grady_rain.inc da_get_innov_vector_rain.inc da_get_hr_rain.inc da_check_max_iv_rain.inc da_transform_xtoy_rain_adj.inc da_transform_xtoy_rain.inc da_print_stats_rain.inc da_oi_stats_rain.inc da_residual_rain.inc da_jo_and_grady_rain.inc da_ao_stats_rain.inc da_tracing.o da_tools.o da_statistics.o da_par_util.o da_par_util1.o da_interpolation.o da_define_structures.o da_control.o module_comm_dm.o module_dm.o module_domain.o @@ -154,7 +155,7 @@ da_rfz_cv3.o : da_rfz_cv3.f90 da_rsl_interfaces.o : da_rsl_interfaces.f90 da_rttov.o : da_rttov.f90 da_rttov_ad.inc da_rttov_tl.inc da_rttov_direct.inc da_rttov_init.inc da_transform_xtoy_rttov_adj.inc da_transform_xtoy_rttov.inc da_get_innov_vector_rttov.inc da_rttov_k.inc da_wrf_interfaces.o da_tracing.o da_tools.o da_radiance1.o da_par_util.o da_tools_serial.o da_interpolation.o da_control.o module_radiance.o da_reporting.o module_domain.o da_define_structures.o da_satem.o : da_satem.f90 da_calculate_grady_satem.inc da_get_innov_vector_satem.inc da_check_max_iv_satem.inc da_transform_xtoy_satem_adj.inc da_transform_xtoy_satem.inc da_print_stats_satem.inc da_oi_stats_satem.inc da_residual_satem.inc da_jo_and_grady_satem.inc da_ao_stats_satem.inc da_tracing.o da_tools.o da_statistics.o da_physics.o da_par_util1.o da_par_util.o da_define_structures.o da_control.o module_domain.o -da_setup_structures.o : da_setup_structures.f90 da_truncate_spectra.inc da_get_bins_info.inc da_write_kma_increments.inc da_write_increments_for_wrf_nmm_regional.inc da_write_increments.inc da_qfrmrh.inc da_cumulus.inc da_lcl.inc da_cloud_model.inc da_setup_runconstants.inc da_setup_obs_interp_wts.inc da_setup_obs_structures_madis.inc da_setup_obs_structures_bufr.inc da_setup_obs_structures_ascii.inc da_setup_obs_structures_rain.inc da_setup_obs_structures_radar.inc da_setup_obs_structures.inc da_setup_flow_predictors.inc da_setup_flow_predictors_para_read_opt1.inc da_chgvres.inc da_setup_cv.inc da_setup_be_nmm_regional.inc da_setup_be_regional.inc da_setup_be_ncep_gfs.inc da_setup_be_global.inc da_setup_background_errors.inc da_scale_background_errors.inc da_scale_background_errors_cv3.inc da_rescale_background_errors.inc da_interpolate_regcoeff.inc da_get_vertical_truncation.inc gsi_thinning.o module_radiance.o da_rf_cv3.o da_rfz_cv3.o da_vtox_transforms.o da_tracing.o da_tools.o da_tools_serial.o da_ssmi.o da_spectral.o da_recursive_filter.o da_reporting.o da_radiance.o da_par_util.o da_par_util1.o da_obs_io.o da_obs.o da_control.o da_wrf_interfaces.o da_define_structures.o module_domain.o da_wavelet.o da_chg_be_Vres.inc da_gen_eigen.inc da_eigen_to_covmatrix.inc da_setup_pseudo_obs.inc da_setup_flow_predictors_ep_format2.inc da_setup_flow_predictors_ep_format3.inc da_get_alpha_vertloc.inc da_write_vp.inc module_state_description.o da_setup_obs_structures_chem_sfc.inc +da_setup_structures.o : da_setup_structures.f90 da_truncate_spectra.inc da_get_bins_info.inc da_write_kma_increments.inc da_write_increments_for_wrf_nmm_regional.inc da_write_increments.inc da_qfrmrh.inc da_cumulus.inc da_lcl.inc da_cloud_model.inc da_setup_runconstants.inc da_setup_obs_interp_wts.inc da_setup_obs_structures_madis.inc da_setup_obs_structures_bufr.inc da_setup_obs_structures_ascii.inc da_setup_obs_structures_rain.inc da_setup_obs_structures_radar.inc da_setup_obs_structures_lightning.inc da_setup_obs_structures.inc da_setup_flow_predictors.inc da_setup_flow_predictors_para_read_opt1.inc da_chgvres.inc da_setup_cv.inc da_setup_be_nmm_regional.inc da_setup_be_regional.inc da_setup_be_ncep_gfs.inc da_setup_be_global.inc da_setup_background_errors.inc da_scale_background_errors.inc da_scale_background_errors_cv3.inc da_rescale_background_errors.inc da_interpolate_regcoeff.inc da_get_vertical_truncation.inc gsi_thinning.o module_radiance.o da_rf_cv3.o da_rfz_cv3.o da_vtox_transforms.o da_tracing.o da_tools.o da_tools_serial.o da_ssmi.o da_spectral.o da_recursive_filter.o da_reporting.o da_radiance.o da_par_util.o da_par_util1.o da_obs_io.o da_obs.o da_control.o da_wrf_interfaces.o da_define_structures.o module_domain.o da_wavelet.o da_chg_be_Vres.inc da_gen_eigen.inc da_eigen_to_covmatrix.inc da_setup_pseudo_obs.inc da_setup_flow_predictors_ep_format2.inc da_setup_flow_predictors_ep_format3.inc da_get_alpha_vertloc.inc da_write_vp.inc module_state_description.o da_setup_obs_structures_chem_sfc.inc da_ships.o : da_ships.f90 da_calculate_grady_ships.inc da_get_innov_vector_ships.inc da_check_max_iv_ships.inc da_transform_xtoy_ships_adj.inc da_transform_xtoy_ships.inc da_print_stats_ships.inc da_oi_stats_ships.inc da_residual_ships.inc da_jo_and_grady_ships.inc da_ao_stats_ships.inc da_tracing.o da_tools.o da_statistics.o da_physics.o da_grid_definitions.o da_par_util1.o da_par_util.o da_interpolation.o da_define_structures.o da_control.o module_domain.o da_sound.o : da_sound.f90 da_calculate_grady_sonde_sfc.inc da_check_max_iv_sonde_sfc.inc da_get_innov_vector_sonde_sfc.inc da_transform_xtoy_sonde_sfc_adj.inc da_transform_xtoy_sonde_sfc.inc da_print_stats_sonde_sfc.inc da_oi_stats_sonde_sfc.inc da_residual_sonde_sfc.inc da_jo_sonde_sfc_uvtq.inc da_jo_and_grady_sonde_sfc.inc da_ao_stats_sonde_sfc.inc da_check_buddy_sound.inc da_calculate_grady_sound.inc da_get_innov_vector_sound.inc da_check_max_iv_sound.inc da_transform_xtoy_sound_adj.inc da_transform_xtoy_sound.inc da_print_stats_sound.inc da_oi_stats_sound.inc da_residual_sound.inc da_jo_sound_uvtq.inc da_jo_and_grady_sound.inc da_ao_stats_sound.inc da_tracing.o da_physics.o da_grid_definitions.o da_par_util1.o da_par_util.o da_tools.o da_statistics.o da_interpolation.o module_domain.o da_define_structures.o da_control.o da_spectral.o : da_spectral.f90 da_apply_power.inc da_legtra_inv_adj.inc da_vtovv_spectral_adj.inc da_vv_to_v_spectral.inc da_vtovv_spectral.inc da_test_spectral.inc da_setlegpol.inc da_setlegpol_test.inc da_legtra.inc da_legtra_inv.inc da_initialize_h.inc da_get_reglats.inc da_get_gausslats.inc da_calc_power_spectrum.inc da_asslegpol.inc da_tracing.o da_tools_serial.o da_reporting.o da_par_util1.o da_define_structures.o da_control.o @@ -163,11 +164,11 @@ da_statistics.o : da_statistics.f90 da_print_qcstat.inc da_stats_calculate.inc d da_synop.o : da_synop.f90 da_check_buddy_synop.inc da_calculate_grady_synop.inc da_check_max_iv_synop.inc da_get_innov_vector_synop.inc da_transform_xtoy_synop_adj.inc da_transform_xtoy_synop.inc da_print_stats_synop.inc da_oi_stats_synop.inc da_residual_synop.inc da_jo_synop_uvtq.inc da_jo_and_grady_synop.inc da_ao_stats_synop.inc da_tracing.o da_tools.o da_statistics.o da_physics.o da_grid_definitions.o da_par_util.o da_par_util1.o da_interpolation.o da_define_structures.o da_control.o module_domain.o da_tamdar.o : da_tamdar.f90 da_calculate_grady_tamdar_sfc.inc da_check_max_iv_tamdar_sfc.inc da_get_innov_vector_tamdar_sfc.inc da_transform_xtoy_tamdar_sfc_adj.inc da_transform_xtoy_tamdar_sfc.inc da_print_stats_tamdar_sfc.inc da_oi_stats_tamdar_sfc.inc da_residual_tamdar_sfc.inc da_jo_tamdar_sfc_uvtq.inc da_jo_and_grady_tamdar_sfc.inc da_ao_stats_tamdar_sfc.inc da_calculate_grady_tamdar.inc da_get_innov_vector_tamdar.inc da_check_max_iv_tamdar.inc da_transform_xtoy_tamdar_adj.inc da_transform_xtoy_tamdar.inc da_print_stats_tamdar.inc da_oi_stats_tamdar.inc da_residual_tamdar.inc da_jo_tamdar_uvtq.inc da_jo_and_grady_tamdar.inc da_ao_stats_tamdar.inc da_tracing.o da_physics.o da_grid_definitions.o da_par_util1.o da_par_util.o da_tools.o da_statistics.o da_interpolation.o module_domain.o da_define_structures.o da_control.o da_varbc_tamdar.o da_varbc_tamdar.o : da_varbc_tamdar.f90 da_varbc_tamdar_init.inc da_varbc_tamdar_pred.inc da_varbc_tamdar_precond.inc da_varbc_tamdar_direct.inc da_varbc_tamdar_adj.inc da_varbc_tamdar_tl.inc da_varbc_tamdar_update.inc da_tracing.o da_tools_serial.o da_tools.o da_reporting.o da_define_structures.o da_control.o module_dm.o -da_test.o : da_test.f90 da_test_vxtransform.inc da_check_gradient.inc da_get_y_lhs_value.inc da_check_vtoy_adjoint.inc da_set_tst_trnsf_fld.inc da_check_psfc.inc da_check_sfc_assi.inc da_setup_testfield.inc da_check_xtoy_adjoint_buoy.inc da_check_xtoy_adjoint_profiler.inc da_check_xtoy_adjoint_ssmt2.inc da_check_xtoy_adjoint_ssmt1.inc da_check_xtoy_adjoint_qscat.inc da_check_xtoy_adjoint_pseudo.inc da_dot_cv.inc da_dot.inc da_check.inc da_check_gradient.inc da_transform_xtovp.inc da_check_xtoy_adjoint_rad.inc da_check_xtoy_adjoint_synop.inc da_check_xtoy_adjoint_tamdar_sfc.inc da_check_xtoy_adjoint_tamdar.inc da_check_xtoy_adjoint_mtgirs.inc da_check_xtoy_adjoint_sonde_sfc.inc da_check_xtoy_adjoint_sound.inc da_check_xtoy_adjoint_bogus.inc da_check_xtoy_adjoint_rain.inc da_check_xtoy_adjoint_radar.inc da_check_xtoy_adjoint_ships.inc da_check_xtoy_adjoint_polaramv.inc da_check_xtoy_adjoint_geoamv.inc da_check_xtoy_adjoint_satem.inc da_check_xtoy_adjoint_ssmi_tb.inc da_check_xtoy_adjoint_ssmi_rv.inc da_check_xtoy_adjoint_pilot.inc da_check_xtoy_adjoint_metar.inc da_check_xtoy_adjoint_gpsref.inc da_check_xtoy_adjoint_gpspw.inc da_check_xtoy_adjoint_airep.inc da_check_xtoy_adjoint.inc da_check_xtovptox_errors.inc da_check_vvtovp_adjoint.inc da_check_vp_errors.inc da_check_vptox_adjoint.inc da_check_vtox_adjoint.inc da_check_cvtovv_adjoint.inc da_check_balance.inc da_4dvar.o da_vtox_transforms.o da_wrfvar_io.o da_wrf_interfaces.o da_transfer_model.o da_tracing.o da_tools_serial.o da_statistics.o da_ssmi.o da_spectral.o da_reporting.o da_physics.o da_par_util1.o da_par_util.o da_obs.o da_minimisation.o da_ffts.o da_dynamics.o da_define_structures.o module_state_description.o module_domain.o da_control.o module_comm_dm.o module_dm.o module_configure.o da_rain.o da_check_dynamics_adjoint.inc da_check_xtoy_adjoint_gpseph.inc da_check_cvtovv_adjoint_chem.inc da_check_vtox_adjoint_chem.inc da_check_vchemtox_adjoint.inc +da_test.o : da_test.f90 da_test_vxtransform.inc da_check_gradient.inc da_get_y_lhs_value.inc da_check_vtoy_adjoint.inc da_set_tst_trnsf_fld.inc da_check_psfc.inc da_check_sfc_assi.inc da_setup_testfield.inc da_check_xtoy_adjoint_buoy.inc da_check_xtoy_adjoint_profiler.inc da_check_xtoy_adjoint_ssmt2.inc da_check_xtoy_adjoint_ssmt1.inc da_check_xtoy_adjoint_qscat.inc da_check_xtoy_adjoint_pseudo.inc da_dot_cv.inc da_dot.inc da_check.inc da_check_gradient.inc da_transform_xtovp.inc da_check_xtoy_adjoint_rad.inc da_check_xtoy_adjoint_synop.inc da_check_xtoy_adjoint_tamdar_sfc.inc da_check_xtoy_adjoint_tamdar.inc da_check_xtoy_adjoint_mtgirs.inc da_check_xtoy_adjoint_sonde_sfc.inc da_check_xtoy_adjoint_sound.inc da_check_xtoy_adjoint_bogus.inc da_check_xtoy_adjoint_rain.inc da_check_xtoy_adjoint_radar.inc da_check_xtoy_adjoint_lightning.inc da_check_xtoy_adjoint_ships.inc da_check_xtoy_adjoint_polaramv.inc da_check_xtoy_adjoint_geoamv.inc da_check_xtoy_adjoint_satem.inc da_check_xtoy_adjoint_ssmi_tb.inc da_check_xtoy_adjoint_ssmi_rv.inc da_check_xtoy_adjoint_pilot.inc da_check_xtoy_adjoint_metar.inc da_check_xtoy_adjoint_gpsref.inc da_check_xtoy_adjoint_gpspw.inc da_check_xtoy_adjoint_airep.inc da_check_xtoy_adjoint.inc da_check_xtovptox_errors.inc da_check_vvtovp_adjoint.inc da_check_vp_errors.inc da_check_vptox_adjoint.inc da_check_vtox_adjoint.inc da_check_cvtovv_adjoint.inc da_check_balance.inc da_4dvar.o da_vtox_transforms.o da_wrfvar_io.o da_wrf_interfaces.o da_transfer_model.o da_tracing.o da_tools_serial.o da_statistics.o da_ssmi.o da_spectral.o da_reporting.o da_physics.o da_par_util1.o da_par_util.o da_obs.o da_minimisation.o da_ffts.o da_dynamics.o da_define_structures.o module_state_description.o module_domain.o da_control.o module_comm_dm.o module_dm.o module_configure.o da_rain.o da_check_dynamics_adjoint.inc da_check_xtoy_adjoint_gpseph.inc da_check_cvtovv_adjoint_chem.inc da_check_vtox_adjoint_chem.inc da_check_vchemtox_adjoint.inc da_tools.o : da_tools.f90 da_geo2msl1.inc da_msl2geo1.inc da_get_time_slots.inc da_get_julian_time.inc da_get_print_lvl.inc da_get_3d_sum.inc da_get_2d_sum.inc da_set_boundary_3d.inc da_set_boundary_xb.inc da_set_boundary_xa.inc da_ludcmp.inc da_lubksb.inc da_eof_decomposition.inc da_eof_decomposition_test.inc da_buddy_qc.inc da_unifva.inc da_togrid.inc da_togrid_new.inc da_smooth_anl.inc da_openfile.inc da_gaus_noise.inc da_set_randomcv.inc da_random_omb.inc da_max_error_qc.inc da_add_noise_new.inc da_add_noise.inc da_residual_new.inc da_residual.inc da_diff_seconds.inc da_mo_correction.inc da_intpsfc_tem.inc da_intpsfc_prs.inc da_sfcprs.inc da_obs_sfc_correction.inc da_1d_eigendecomposition.inc da_convert_zk.inc da_lc_cone.inc da_set_merc.inc da_map_set.inc da_map_init.inc da_set_ps.inc da_set_lc.inc da_xyll_ps.inc da_xyll_merc.inc da_xyll_lc.inc da_xyll_latlon.inc da_xyll_default.inc da_xyll.inc da_llxy_wrf_new.inc da_llxy_wrf.inc da_llxy_ps_new.inc da_llxy_ps.inc da_llxy_merc_new.inc da_llxy_merc.inc da_llxy_lc_new.inc da_llxy_lc.inc da_llxy_latlon_new.inc da_llxy_latlon.inc da_llxy_rotated_latlon.inc da_llxy_global_new.inc da_llxy_global.inc da_llxy_kma_global_new.inc da_llxy_kma_global.inc da_llxy_default_new.inc da_llxy_default.inc da_llxy_new.inc da_llxy.inc da_map_utils_defines.inc da_lapack.o da_reporting.o da_tracing.o da_tools_serial.o da_define_structures.o da_control.o module_domain.o module_dm.o module_bc.o da_sfc_hori_interp_weights.inc da_tools_serial.o : da_tools_serial.f90 da_find_fft_trig_funcs.inc da_find_fft_factors.inc da_advance_time.inc da_advance_cymdh.inc da_array_print.inc da_change_date.inc da_free_unit.inc da_get_unit.inc da_reporting.o da_control.o da_tracing.o : da_tracing.f90 da_trace_report.inc da_trace_real_sort.inc da_trace_int_sort.inc da_trace_exit.inc da_trace.inc da_trace_entry.inc da_trace_init.inc da_reporting.o da_par_util1.o da_control.o -da_transfer_model.o : da_transfer_model.f90 da_get_2nd_firstguess.inc da_setup_firstguess_kma.inc da_setup_firstguess_wrf_nmm_regional.inc da_setup_firstguess_wrf.inc da_setup_firstguess.inc da_transfer_xatoanalysis.inc da_transfer_wrftl_lbc_t0_adj.inc da_transfer_xatowrftl_adj_lbc.inc da_transfer_xatowrftl_adj.inc da_transfer_wrftl_lbc_t0.inc da_transfer_xatowrftl_lbc.inc da_transfer_xatowrftl.inc da_transfer_wrftltoxa_adj.inc da_transfer_wrftltoxa.inc da_transfer_xatokma.inc da_transfer_xatowrf_nmm_regional.inc da_transfer_xatowrf.inc da_transfer_kmatoxb.inc da_transfer_wrf_nmm_regional_toxb.inc da_transfer_wrftoxb.inc module_io_wrf.o module_bc.o da_4dvar.o da_vtox_transforms.o da_tracing.o da_tools.o da_ssmi.o da_setup_structures.o da_reporting.o da_physics.o da_par_util.o da_grid_definitions.o da_define_structures.o da_control.o module_comm_dm.o module_dm.o module_state_description.o module_io_domain.o module_domain.o module_date_time.o module_configure.o da_wrf_interfaces.o da_radar.o da_transfer_wrftoxb_chem.inc +da_transfer_model.o : da_transfer_model.f90 da_get_2nd_firstguess.inc da_setup_firstguess_kma.inc da_setup_firstguess_wrf_nmm_regional.inc da_setup_firstguess_wrf.inc da_setup_firstguess.inc da_transfer_xatoanalysis.inc da_transfer_wrftl_lbc_t0_adj.inc da_transfer_xatowrftl_adj_lbc.inc da_transfer_xatowrftl_adj.inc da_transfer_wrftl_lbc_t0.inc da_transfer_xatowrftl_lbc.inc da_transfer_xatowrftl.inc da_transfer_wrftltoxa_adj.inc da_transfer_wrftltoxa.inc da_transfer_xatokma.inc da_transfer_xatowrf_nmm_regional.inc da_transfer_xatowrf.inc da_transfer_kmatoxb.inc da_transfer_wrf_nmm_regional_toxb.inc da_transfer_wrftoxb.inc module_io_wrf.o module_bc.o da_4dvar.o da_vtox_transforms.o da_tracing.o da_tools.o da_ssmi.o da_setup_structures.o da_reporting.o da_physics.o da_par_util.o da_grid_definitions.o da_define_structures.o da_control.o module_comm_dm.o module_dm.o module_state_description.o module_io_domain.o module_domain.o module_date_time.o module_configure.o da_wrf_interfaces.o da_radar.o da_lightning.o da_transfer_wrftoxb_chem.inc da_tune_obs_desroziers.o : da_tune_obs_desroziers.f90 da_tune_obs_hollingsworth1.o : da_tune_obs_hollingsworth1.f90 da_control.o da_tune_obs_hollingsworth2.o : da_tune_obs_hollingsworth2.f90 da_control.o @@ -191,7 +192,7 @@ da_wrfvar_esmf.o : da_wrfvar_esmf.f90 da_wrfvar_esmf_super.o : da_wrfvar_esmf_super.f90 da_wrfvar_interface.inc da_esmf_finalize.inc da_esmf_run.inc da_esmf_init.inc da_wrfvar_io.o : copyfile.c da_wrfvar_io.f90 da_med_initialdata_output_lbc.inc da_med_initialdata_output.inc da_med_initialdata_input.inc da_update_firstguess.inc da_4dvar.o da_tracing.o da_reporting.o da_control.o module_io_domain.o module_domain.o module_date_time.o module_configure.o module_domain_type.o da_wrfvar_main.o : da_wrfvar_main.f90 da_4dvar.o da_wrfvar_top.o da_wrf_interfaces.o da_tracing.o da_control.o module_symbols_util.o -da_wrfvar_top.o : da_wrfvar_top.f90 da_solve_init.inc da_solve_dual_res_init.inc da_solve.inc da_wrfvar_finalize.inc da_wrfvar_interface.inc da_wrfvar_run.inc da_wrfvar_init2.inc da_wrfvar_init1.inc da_wrf_interfaces.o da_rain.o da_synop.o da_ssmi.o da_sound.o da_ships.o da_satem.o da_radar.o da_mtgirs.o da_qscat.o da_profiler.o da_polaramv.o da_pilot.o da_metar.o da_gpsref.o da_gpspw.o da_geoamv.o da_buoy.o da_bogus.o da_airsr.o da_airep.o da_crtm.o da_tools.o da_vtox_transforms.o da_transfer_model.o da_tracing.o da_tools_serial.o da_test.o da_setup_structures.o da_reporting.o da_varbc.o da_radiance1.o da_physics.o da_par_util.o da_obs_io.o da_obs.o da_minimisation.o da_define_structures.o da_control.o module_comm_dm.o module_dm.o module_tiles.o module_state_description.o module_radiance.o da_wrfvar_io.o da_4dvar.o module_symbols_util.o module_driver_constants.o module_domain.o module_configure.o module_io_domain.o da_netcdf_interface.o da_gpseph.o da_varbc_tamdar.o module_io_wrf.o da_chem_sfc.o +da_wrfvar_top.o : da_wrfvar_top.f90 da_solve_init.inc da_solve_dual_res_init.inc da_solve.inc da_wrfvar_finalize.inc da_wrfvar_interface.inc da_wrfvar_run.inc da_wrfvar_init2.inc da_wrfvar_init1.inc da_wrf_interfaces.o da_rain.o da_synop.o da_ssmi.o da_sound.o da_ships.o da_satem.o da_radar.o da_lightning.o da_mtgirs.o da_qscat.o da_profiler.o da_polaramv.o da_pilot.o da_metar.o da_gpsref.o da_gpspw.o da_geoamv.o da_buoy.o da_bogus.o da_airsr.o da_airep.o da_crtm.o da_tools.o da_vtox_transforms.o da_transfer_model.o da_tracing.o da_tools_serial.o da_test.o da_setup_structures.o da_reporting.o da_varbc.o da_radiance1.o da_physics.o da_par_util.o da_obs_io.o da_obs.o da_minimisation.o da_define_structures.o da_control.o module_comm_dm.o module_dm.o module_tiles.o module_state_description.o module_radiance.o da_wrfvar_io.o da_4dvar.o module_symbols_util.o module_driver_constants.o module_domain.o module_configure.o module_io_domain.o da_netcdf_interface.o da_gpseph.o da_varbc_tamdar.o module_io_wrf.o da_chem_sfc.o decode_airs.o : decode_airs.f90 module_read_airs.o f_qv_from_rh.o : f_qv_from_rh.f90 gamma1.o : gamma1.f90 da_control.o diff --git a/var/da/da_control/da_control.f90 b/var/da/da_control/da_control.f90 index 5abe3ff927..46810d7bec 100644 --- a/var/da/da_control/da_control.f90 +++ b/var/da/da_control/da_control.f90 @@ -240,6 +240,7 @@ module da_control 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 + real, parameter :: typical_div_rms = 0.001 ! The following typical mean squared values depend on control variable. They ! are calculated in da_setup_background_errors and used in the VvToVp adjoint @@ -487,7 +488,7 @@ module da_control ! rtm_init setup parameter - integer, parameter :: maxsensor = 30 + integer, parameter :: maxsensor = 31 integer, parameter :: npres_print = 12 @@ -525,8 +526,9 @@ module da_control integer, parameter :: tamdar_sfc = 27 integer, parameter :: rain = 28 integer, parameter :: gpseph = 29 + integer, parameter :: lightning = 30 #if (WRF_CHEM == 1) - integer, parameter :: chemic_surf = 30 + integer, parameter :: chemic_surf = 31 #endif character(len=14), parameter :: obs_names(num_ob_indexes) = (/ & @@ -558,7 +560,8 @@ module da_control "tamdar ", & "tamdar_sfc ", & "rain ", & - "gpseph " & + "gpseph ", & + "lightning " & #if (WRF_CHEM == 1) ,"chemic_surf " & #endif diff --git a/var/da/da_define_structures/da_allocate_observations.inc b/var/da/da_define_structures/da_allocate_observations.inc index 3c631deb39..90cf02f120 100644 --- a/var/da/da_define_structures/da_allocate_observations.inc +++ b/var/da/da_define_structures/da_allocate_observations.inc @@ -36,6 +36,7 @@ subroutine da_allocate_observations (iv) if (iv%info(profiler)%nlocal > 0) allocate(iv%profiler (1:iv%info(profiler)%nlocal)) if (iv%info(buoy)%nlocal > 0) allocate(iv%buoy (1:iv%info(buoy)%nlocal)) if (iv%info(radar)%nlocal > 0) allocate(iv%radar (1:iv%info(radar)%nlocal)) + if (iv%info(lightning)%nlocal > 0) allocate(iv%lightning(1:iv%info(lightning)%nlocal)) if (iv%info(bogus)%nlocal > 0) allocate(iv%bogus (1:iv%info(bogus)%nlocal)) if (iv%info(airsr)%nlocal > 0) allocate(iv%airsr (1:iv%info(airsr)%nlocal)) diff --git a/var/da/da_define_structures/da_allocate_y.inc b/var/da/da_define_structures/da_allocate_y.inc index 13935e1a52..f206bebb5b 100644 --- a/var/da/da_define_structures/da_allocate_y.inc +++ b/var/da/da_define_structures/da_allocate_y.inc @@ -211,6 +211,19 @@ subroutine da_allocate_y (iv, y) end do end if + if (y % nlocal(lightning) > 0) then + allocate (y % lightning(1:y % nlocal(lightning))) + do n = 1, y % nlocal(lightning) + nlevels = iv%info(lightning)%levels(n) + allocate (y % lightning(n) % w(1:nlevels)) + allocate (y % lightning(n) % div(1:nlevels)) + allocate (y % lightning(n) % qv(1:nlevels)) + y % lightning(n) % w(1:nlevels) = 0.0 + y % lightning(n) % div(1:nlevels) = 0.0 + y % lightning(n) % qv(1:nlevels) = 0.0 + end do + end if + if (y % nlocal(airep) > 0) then allocate (y % airep(1:y % nlocal(airep))) do n = 1, y % nlocal(airep) diff --git a/var/da/da_define_structures/da_allocate_y_lightning.inc b/var/da/da_define_structures/da_allocate_y_lightning.inc new file mode 100644 index 0000000000..5222f34e84 --- /dev/null +++ b/var/da/da_define_structures/da_allocate_y_lightning.inc @@ -0,0 +1,44 @@ +subroutine da_allocate_y_lightning (iv, y) + + !--------------------------------------------------------------------------- + ! Purpose: Allocate arrays used in y and residual obs structures. + ! Authors: Z Chen (zchen@fjnu.edu.cn), Jenny Sun (NCAR), X Qie (IAP) + !--------------------------------------------------------------------------- + + implicit none + + type (iv_type), intent(in) :: iv ! Ob type input. + type (y_type), intent(inout) :: y ! Residual type structure. + + integer :: n ! Loop counter. + integer :: nlevels ! Number of levels. + + !--------------------------------------------------------------------------- + ! [1.0] Copy number of observations: + !--------------------------------------------------------------------------- + + if (trace_use) call da_trace_entry("da_allocate_y_lightning") + + y % nlocal(lightning) = iv%info(lightning)%nlocal + y % ntotal(lightning) = iv%info(lightning)%ntotal + + !--------------------------------------------------------------------------- + ! [2.0] Allocate: + !--------------------------------------------------------------------------- + + if (y % nlocal(lightning) > 0) then + allocate (y % lightning(1:y % nlocal(lightning))) + do n = 1, y % nlocal(lightning) + nlevels = iv%info(lightning)%levels(n) + allocate (y % lightning(n) % w(1:nlevels)) + allocate (y % lightning(n) % div(1:nlevels)) + allocate (y % lightning(n) % qv(1:nlevels)) + y % lightning(n) % w(1:nlevels) = 0.0 + y % lightning(n) % div(1:nlevels) = 0.0 + y % lightning(n) % qv(1:nlevels) = 0.0 + end do + end if + + if (trace_use) call da_trace_exit("da_allocate_y_lightning") + +end subroutine da_allocate_y_lightning diff --git a/var/da/da_define_structures/da_deallocate_observations.inc b/var/da/da_define_structures/da_deallocate_observations.inc index c98a0ca210..041e56448a 100644 --- a/var/da/da_define_structures/da_deallocate_observations.inc +++ b/var/da/da_define_structures/da_deallocate_observations.inc @@ -157,6 +157,15 @@ subroutine da_deallocate_observations (iv) deallocate (iv%radar) end if + if (iv%info(lightning)%nlocal > 0) then + do n = 1, iv%info(lightning)%nlocal + deallocate (iv%lightning(n) % w) + deallocate (iv%lightning(n) % div) + deallocate (iv%lightning(n) % qv) + end do + deallocate (iv%lightning) + end if + if (iv%info(rain)%nlocal > 0) deallocate (iv%rain) if (iv%info(gpspw)%nlocal > 0) deallocate (iv%gpspw) diff --git a/var/da/da_define_structures/da_deallocate_y.inc b/var/da/da_define_structures/da_deallocate_y.inc index 3225ac90c6..25fc969836 100644 --- a/var/da/da_define_structures/da_deallocate_y.inc +++ b/var/da/da_define_structures/da_deallocate_y.inc @@ -81,18 +81,26 @@ subroutine da_deallocate_y(y) deallocate (y % bogus) end if - if (y % nlocal(radar) > 0) then - do n = 1, y % nlocal(radar) - deallocate (y % radar(n)%rv) - deallocate (y % radar(n)%rf) - if (associated(y%radar(n)%rqv)) deallocate(y%radar(n)%rqv) - if (associated(y%radar(n)%rgr)) deallocate(y%radar(n)%rgr) - if (associated(y%radar(n)%rsn)) deallocate(y%radar(n)%rsn) - if (associated(y%radar(n)%rrn)) deallocate(y%radar(n)%rrn) - end do - deallocate (y % radar) - end if + if (y % nlocal(radar) > 0) then + do n = 1, y % nlocal(radar) + deallocate (y % radar(n)%rv) + deallocate (y % radar(n)%rf) + if (associated(y%radar(n)%rqv)) deallocate(y%radar(n)%rqv) + if (associated(y%radar(n)%rgr)) deallocate(y%radar(n)%rgr) + if (associated(y%radar(n)%rsn)) deallocate(y%radar(n)%rsn) + if (associated(y%radar(n)%rrn)) deallocate(y%radar(n)%rrn) + end do + deallocate (y % radar) + end if + if (y % nlocal(lightning) > 0) then + do n = 1, y % nlocal(lightning) + deallocate (y % lightning(n)%w) + deallocate (y % lightning(n)%div) + deallocate (y % lightning(n)%qv) + end do + deallocate (y % lightning) + end if if (y % nlocal(airep) > 0) then do n = 1, y % nlocal(airep) diff --git a/var/da/da_define_structures/da_define_structures.f90 b/var/da/da_define_structures/da_define_structures.f90 index 7d3249e4c0..095c5dbcb7 100644 --- a/var/da/da_define_structures/da_define_structures.f90 +++ b/var/da/da_define_structures/da_define_structures.f90 @@ -21,7 +21,7 @@ module da_define_structures put_rand_seed, seed_array1, seed_array2, missing_r, & sound, synop, pilot, satem, geoamv, polaramv, airep, gpspw, gpsref, gpseph, & metar, ships, ssmi_rv, ssmi_tb, ssmt1, ssmt2, qscat, profiler, buoy, bogus, & - mtgirs, tamdar, tamdar_sfc, pseudo, radar, radiance, airsr, sonde_sfc, rain, & + mtgirs, tamdar, tamdar_sfc, pseudo, radar, lightning, radiance, airsr, sonde_sfc, rain, & #if (WRF_CHEM == 1) chemic_surf, chem_cv_options, & #endif @@ -318,6 +318,42 @@ module da_define_structures type (rain_each_type) :: each(1) end type rain_single_level_type + type lightning_stn_type + character (len = 5) :: platform ! Data type + character (len = 12) :: name ! Station name + character (len = 19) :: date_char ! CCYY-MM-DD_HH:MM:SS date + integer :: numobs ! number of Obs + integer :: levels ! number of levels + real :: lat ! Latitude in degree + real :: lon ! Longitude in degree + real :: elv ! Elevation in + end type lightning_stn_type + + type lightning_type + type (stn_loc_type) :: stn_loc + real , pointer :: height (:) ! Height in m + integer , pointer :: height_qc(:) ! Height QC + type (field_type) , pointer :: w(:) ! Retrieved vertical velocity from flash rate + type (field_type) , pointer :: div(:) ! Retrieved convergence fileds from vertical velocity + type (field_type) , pointer :: qv(:) ! Retrieved vapor mixing ratio from flash rate + end type lightning_type + + type lightning_each_level_type + real :: height ! Height in m + integer :: height_qc ! Height QC + real :: zk ! MM5 k-coordinates + type (field_type) :: w + type (field_type) :: div + type (field_type) :: qv + end type lightning_each_level_type + + type lightning_multi_level_type + type (lightning_stn_type) :: stn + type (info_type) :: info + type (model_loc_type) :: loc + type (lightning_each_level_type) :: each(max_ob_levels) + end type lightning_multi_level_type + #if (WRF_CHEM == 1) type chemic_surf_type @@ -702,6 +738,7 @@ module da_define_structures real :: bogus_ef_u, bogus_ef_v, bogus_ef_t, bogus_ef_p, bogus_ef_q, bogus_ef_slp real :: airsr_ef_t, airsr_ef_q real :: rain_ef_r + real :: lightning_ef_w, lightning_ef_div, lightning_ef_qv #if (WRF_CHEM == 1) real :: chemic_surf_ef #endif @@ -737,6 +774,7 @@ module da_define_structures type (tamdar_type) , pointer :: tamdar(:) type (synop_type) , pointer :: tamdar_sfc(:) type (rain_type) , pointer :: rain(:) + type (lightning_type), pointer :: lightning(:) #if (WRF_CHEM == 1) type (chemic_surf_type), pointer :: chemic_surf(:) #endif @@ -782,6 +820,8 @@ module da_define_structures type (bad_info_type) :: slp type (bad_info_type) :: rad type (bad_info_type) :: rain + type (bad_info_type) :: w + type (bad_info_type) :: div #if (WRF_CHEM == 1) type (bad_info_type) :: chemic_surf #endif @@ -928,6 +968,12 @@ module da_define_structures real, pointer :: rqv(:) => null() end type residual_radar_type + type residual_lightning_type + real, pointer :: w(:) + real, pointer :: div(:) + real, pointer :: qv(:) + end type residual_lightning_type + type residual_instid_type integer :: num_rad integer :: nchan @@ -985,6 +1031,7 @@ module da_define_structures type (residual_radar_type), pointer :: radar(:) type (residual_instid_type), pointer :: instid(:) type (residual_rain_type), pointer :: rain(:) + type (residual_lightning_type),pointer :: lightning(:) #if (WRF_CHEM == 1) type (residual_chem_surf_type),pointer :: chemic_surf(:) #endif @@ -1039,6 +1086,7 @@ module da_define_structures real :: bogus_u, bogus_v, bogus_t, bogus_q, bogus_slp real :: airsr_t, airsr_q real :: rain_r + real :: lightning_w, lightning_div, lightning_qv #if (WRF_CHEM == 1) real :: chemic_surf #endif @@ -1216,6 +1264,7 @@ module da_define_structures #endif #include "da_allocate_y.inc" #include "da_allocate_y_radar.inc" +#include "da_allocate_y_lightning.inc" #include "da_allocate_y_rain.inc" #if (WRF_CHEM == 1) #include "da_allocate_y_chem_sfc.inc" diff --git a/var/da/da_define_structures/da_zero_y.inc b/var/da/da_define_structures/da_zero_y.inc index 09bae42319..822be34ba9 100644 --- a/var/da/da_define_structures/da_zero_y.inc +++ b/var/da/da_define_structures/da_zero_y.inc @@ -284,6 +284,17 @@ subroutine da_zero_y( iv, y, value ) end do end if + ! Initialize lightning: + if ( y % nlocal(lightning) > 0 ) then + do n = 1, y % nlocal(lightning) + nlevels = iv % info(lightning) % levels(n) + + y % lightning(n) % w(1:nlevels) = value + y % lightning(n) % div(1:nlevels) = value + y % lightning(n) % qv(1:nlevels) = value + end do + end if + ! Initialize rain: if ( y % nlocal(rain) > 0 ) then y % rain(1:y % nlocal(rain)) % rain = value diff --git a/var/da/da_lightning/da_ao_stats_lightning.inc b/var/da/da_lightning/da_ao_stats_lightning.inc new file mode 100644 index 0000000000..47b97352ce --- /dev/null +++ b/var/da/da_lightning/da_ao_stats_lightning.inc @@ -0,0 +1,96 @@ +subroutine da_ao_stats_lightning (stats_unit, iv, re) + + !----------------------------------------------------------------------- + ! Purpose: TBD + ! Authors: Z Chen (zchen@fjnu.edu.cn), Jenny Sun (NCAR), X Qie (IAP) + !----------------------------------------------------------------------- + + implicit none + + integer, intent (in) :: stats_unit ! Output unit for stats. + type (iv_type), intent (inout) :: iv ! iv + type (y_type), intent (in) :: re ! A - O + + type (stats_lightning_type) :: stats + integer :: nw, ndiv, nqv + integer :: n, k + + if (trace_use_dull) call da_trace_entry("da_ao_stats_lightning") + + nw = 0 + ndiv = 0 + nqv = 0 + + stats%maximum%w = maxmin_type (missing_r, 0, 0) + stats%maximum%div = maxmin_type (missing_r, 0, 0) + stats%maximum%qv = maxmin_type (missing_r, 0, 0) + stats%minimum%w = maxmin_type(-missing_r, 0, 0) + stats%minimum%div = maxmin_type(-missing_r, 0, 0) + stats%minimum%qv = maxmin_type(-missing_r, 0, 0) + + stats%average = residual_lightning1_type(0.0, 0.0, 0.0) + stats%rms_err = stats%average + + do n = 1, iv%info(lightning)%nlocal + if(iv%info(lightning)%proc_domain(1,n)) then + do k = 1, iv%info(lightning)%levels(n) + + if(use_lightning_w) then + call da_stats_calculate (n, k, iv%lightning(n)%w(k)%qc, & + re%lightning(n)%w(k), nw, & + stats%minimum%w, stats%maximum%w, & + stats%average%w, stats%rms_err%w) + end if + + if(use_lightning_div) then + call da_stats_calculate (n, k, iv%lightning(n)%div(k)%qc, & + re%lightning(n)%div(k), ndiv, & + stats%minimum%div, stats%maximum%div, & + stats%average%div, stats%rms_err%div) + end if + + if(use_lightning_qv) then + call da_stats_calculate (n, k, iv%lightning(n)%qv(k)%qc, & + re%lightning(n)%qv(k), nqv, & + stats%minimum%qv, stats%maximum%qv, & + stats%average%qv, stats%rms_err%qv) + end if + end do + end if + end do + + ! Do inter-processor communication to gather statistics. + if (use_lightning_w) then + call da_proc_sum_int (nw) + call da_proc_stats_combine(stats%average%w, stats%rms_err%w, & + stats%minimum%w%value, stats%maximum%w%value, & + stats%minimum%w%n, stats%maximum%w%n, & + stats%minimum%w%l, stats%maximum%w%l) + end if + + if (use_lightning_div) then + call da_proc_sum_int (ndiv) + call da_proc_stats_combine(stats%average%div, stats%rms_err%div, & + stats%minimum%div%value, stats%maximum%div%value, & + stats%minimum%div%n, stats%maximum%div%n, & + stats%minimum%div%l, stats%maximum%div%l) + end if + + if (use_lightning_qv) then + call da_proc_sum_int (nqv) + call da_proc_stats_combine(stats%average%qv, stats%rms_err%qv, & + stats%minimum%qv%value, stats%maximum%qv%value, & + stats%minimum%qv%n, stats%maximum%qv%n, & + stats%minimum%qv%l, stats%maximum%qv%l) + end if + + if (rootproc) then + if ( nw /= 0 .or. ndiv /= 0 .or. nqv /= 0 ) then + write(unit=stats_unit, fmt='(/a/)') ' Diagnostics of AO for lightning' + call da_print_stats_lightning(stats_unit, nw, ndiv, nqv, stats) + end if + end if + + if (trace_use_dull) call da_trace_exit("da_ao_stats_lightning") + +end subroutine da_ao_stats_lightning diff --git a/var/da/da_lightning/da_calculate_grady_lightning.inc b/var/da/da_lightning/da_calculate_grady_lightning.inc new file mode 100644 index 0000000000..58689124fa --- /dev/null +++ b/var/da/da_lightning/da_calculate_grady_lightning.inc @@ -0,0 +1,46 @@ +subroutine da_calculate_grady_lightning(iv, re, jo_grad_y) + + !---------------------------------------------------------------------- + ! Purpose: Applies obs inverse on re-vector + ! Authors: Z Chen (zchen@fjnu.edu.cn), Jenny Sun (NCAR), X Qie (IAP) + !------------------------------------------------------------------------------ + implicit none + + type (iv_type), intent(in) :: iv ! Innovation vector. + type (y_type), intent(inout) :: re ! Residual vector. + type (y_type), intent(inout) :: jo_grad_y ! Grad_y(Jo) + + integer :: n, k + + if (trace_use_dull) call da_trace_entry("da_calculate_grady_lightning") + + do n = 1, iv%info(lightning)%nlocal + do k = 2, iv%info(lightning)%levels(n) + + if(use_lightning_w) then + if(iv%lightning(n)%w(k)%qc < obs_qc_pointer) then + re%lightning(n)%w(k) = 0.0 + end if + jo_grad_y%lightning(n)%w(k) = -re%lightning(n)%w(k) / (iv%lightning(n)%w(k)%error * iv%lightning(n)%w(k)%error) + end if + + if(use_lightning_div) then + if(iv%lightning(n)%div(k)%qc < obs_qc_pointer) then + re%lightning(n)%div(k) = 0.0 + end if + jo_grad_y%lightning(n)%div(k) = -re%lightning(n)%div(k) / (iv%lightning(n)%div(k)%error * iv%lightning(n)%div(k)%error) + end if + + if(use_lightning_qv) then + if(iv%lightning(n)%qv(k)%qc < obs_qc_pointer) then + re%lightning(n)%qv(k) = 0.0 + end if + jo_grad_y%lightning(n)%qv(k) = -re%lightning(n)%qv(k) / (iv%lightning(n)%qv(k)%error * iv%lightning(n)%qv(k)%error) + end if + + end do + end do + + if (trace_use_dull) call da_trace_exit("da_calculate_grady_lightning") + +end subroutine da_calculate_grady_lightning diff --git a/var/da/da_lightning/da_check_max_iv_lightning.inc b/var/da/da_lightning/da_check_max_iv_lightning.inc new file mode 100644 index 0000000000..e79cbe3673 --- /dev/null +++ b/var/da/da_lightning/da_check_max_iv_lightning.inc @@ -0,0 +1,62 @@ +subroutine da_check_max_iv_lightning(iv,ob, it) + + !----------------------------------------------------------------------- + ! Purpose: TBD + ! Authors: Z Chen (zchen@fjnu.edu.cn), Jenny Sun (NCAR), X Qie (IAP) + !----------------------------------------------------------------------- + + implicit none + + type(iv_type), intent(inout) :: iv + integer, intent(in) :: it ! Outer iteration + type(y_type), intent(in) :: ob ! Observation structure. + + logical :: failed + integer :: n, k + + if (trace_use) call da_trace_entry("da_check_max_iv_lightning") + + !--------------------------------------------------------------------------- + ! [1.0] Perform maximum innovation vector check: + !--------------------------------------------------------------------------- + + do n = iv%info(lightning)%n1,iv%info(lightning)%n2 + do k = 1, iv%info(lightning)%levels(n) + failed = .false. + if(iv%lightning(n)%w(k)%qc >= obs_qc_pointer) then + call da_max_error_qc(it, iv%info(lightning), n, iv%lightning(n)%w(k),max_error_lda_w, failed) + if(iv%info(lightning)%proc_domain(k,n)) then + if(failed) then + write(qcstat_conv_unit,'(2x, a10, 2x, a10, 4f12.3, a12)')& + 'Lightning','lightning',iv%info(lightning)%lat(k,n),iv%info(lightning)%lon(k,n), iv%lightning(n)%w(k)%inv, ob%lightning(n)%w(k) + end if + end if + end if + + failed = .false. + if(iv%lightning(n)%div(k)%qc >= obs_qc_pointer) then + call da_max_error_qc(it, iv%info(lightning), n, iv%lightning(n)%div(k),max_error_lda_div, failed) + if(iv%info(lightning)%proc_domain(k,n)) then + if(failed) then + write(qcstat_conv_unit,'(2x, a10, 2x, a10, 4f12.3, a12)')& + 'Lightning','lightning',iv%info(lightning)%lat(k,n),iv%info(lightning)%lon(k,n), iv%lightning(n)%div(k)%inv, ob%lightning(n)%div(k) + end if + end if + end if + + failed = .false. + if(iv%lightning(n)%qv(k)%qc >= obs_qc_pointer) then + call da_max_error_qc(it, iv%info(lightning), n, iv%lightning(n)%qv(k),max_error_lda_qv, failed) + if(iv%info(lightning)%proc_domain(k,n)) then + if(failed)then + write(qcstat_conv_unit,'(2x,a10,2x,a10,4f12.2,a12)')& + 'Lightning','lightning',iv%info(lightning)%lat(k,n),iv%info(lightning)%lon(k,n), iv%lightning(n)%qv(k)%inv, ob%lightning(n)%qv(k) + end if + end if + end if + end do + end do + + if (trace_use) call da_trace_exit("da_check_max_iv_lightning") + +end subroutine da_check_max_iv_lightning diff --git a/var/da/da_lightning/da_div_profile.inc b/var/da/da_lightning/da_div_profile.inc new file mode 100644 index 0000000000..9111112433 --- /dev/null +++ b/var/da/da_lightning/da_div_profile.inc @@ -0,0 +1,57 @@ +subroutine da_div_profile(grid, info, n, k, div) + + !-------------------------------------------------------------------------- + ! Purpose: Calculates divergence (div) on each level at the observed location (i,j). + ! dx, dxm, dy, dym are horizontal interpolation weighting. + ! d U d V + ! Div = m^2 *[---(---) + ---(---) ] + ! dx m dy m + ! Authors: Z Chen (zchen@fjnu.edu.cn), Jenny Sun (NCAR), X Qie (IAP) + !-------------------------------------------------------------------------- + + implicit none + + type (domain), intent(in) :: grid + type (infa_type), intent(in) :: info + integer, intent(in) :: n, k + real, intent(out) :: div + + integer :: ii, jj ! index dimension. + real :: div_m(2,2) ! divergence + + integer :: i, j ! OBS location + real :: dx, dxm ! interpolation weights. + real :: dy, dym ! interpolation weights. + real :: coeff + if (trace_use_dull) call da_trace_entry("da_div_profile") + + i = info%i(1,n) + j = info%j(1,n) + dx = info%dx(1,n) + dy = info%dy(1,n) + dxm = info%dxm(1,n) + dym = info%dym(1,n) + + if(i == its) i = its + 1 + if(i == ite) i = ite - 1 + if(j == jts) j = jts + 1 + if(j == jte) j = jte - 1 + ! calculate layered divergence + + do ii = i, i+1 + do jj = j, j+1 + coeff = grid%xb%map_factor(ii,jj) * grid%xb%map_factor(ii,jj)*0.5/grid%xb%ds + + div_m(ii-i+1,jj-j+1) = (grid%xb%u(ii+1,jj,k)/grid%xb%map_factor(ii+1,jj) - & + grid%xb%u(ii-1,jj,k)/grid%xb%map_factor(ii-1,jj) + & + grid%xb%v(ii,jj+1,k)/grid%xb%map_factor(ii,jj+1) - & + grid%xb%v(ii,jj-1,k)/grid%xb%map_factor(ii,jj-1))*coeff + end do + end do + + ! Horizontal interpolation to the obs. pt. + div = dym*(dxm*div_m(1,1)+dx*div_m(2,1))+dy*(dxm*div_m(1,2)+dx*div_m(2,2)) + + if (trace_use_dull) call da_trace_exit("da_div_profile") + +end subroutine da_div_profile diff --git a/var/da/da_lightning/da_div_profile_adj.inc b/var/da/da_lightning/da_div_profile_adj.inc new file mode 100644 index 0000000000..80b7855920 --- /dev/null +++ b/var/da/da_lightning/da_div_profile_adj.inc @@ -0,0 +1,65 @@ +subroutine da_div_profile_adj(grid,jo_grad_x, info, n, k, ADJ_div) + + !-------------------------------------------------------------------------- + ! Purpose: Calculates divergence (div) on each level at the observed location (i,j). + ! dx, dxm, dy, dym are horizontal interpolation weighting. + ! d U d V + ! Div = m^2 *[---(---) + ---(---) ] + ! dx m dy M + ! Authors: Z Chen (zchen@fjnu.edu.cn), Jenny Sun (NCAR), X Qie (IAP) + !-------------------------------------------------------------------------- + + implicit none + + type (x_type), intent(inout) :: jo_grad_x ! grad_x(jo) + type (domain), intent(in) :: grid + type (infa_type), intent(in) :: info + integer, intent(in) :: n, k + real, intent(out) :: ADJ_div + + integer :: ii, jj ! index dimension. + + integer :: i, j ! OBS location + real :: dx, dxm ! interpolation weights. + real :: dy, dym ! interpolation weights. + real :: coeff + real :: ADJ_div_m(2,2) + + if (trace_use_dull) call da_trace_entry ("da_div_profile_adj") + + i = info%i(1,n) + j = info%j(1,n) + dx = info%dx(1,n) + dy = info%dy(1,n) + dxm = info%dxm(1,n) + dym = info%dym(1,n) + +! avoid the boundary mistake + if(i == its) i = its + 1 + if(i == ite) i = ite - 1 + if(j == jts) j = jts + 1 + if(j == jte) j = jte - 1 + + ADJ_div_m(1,1) = dym*dxm * ADJ_div + ADJ_div_m(2,1) = dym*dx * ADJ_div + ADJ_div_m(1,2) = dy*dxm* ADJ_div + ADJ_div_m(2,2) = dy*dx* ADJ_div + ADJ_div = 0.0 + + do ii = i, i+1 + do jj = j, j+1 + coeff = grid%xb%map_factor(ii,jj) * grid%xb%map_factor(ii,jj)*0.5/grid%xb%ds + + jo_grad_x%u(ii+1,jj,k) = jo_grad_x%u(ii+1,jj,k) + ADJ_div_m(ii-i+1,jj-j+1)/grid%xb%map_factor(ii+1,jj)*coeff + + jo_grad_x%u(ii-1,jj,k) = jo_grad_x%u(ii-1,jj,k) - ADJ_div_m(ii-i+1,jj-j+1)/grid%xb%map_factor(ii-1,jj)*coeff + + jo_grad_x%v(ii,jj+1,k) = jo_grad_x%v(ii,jj+1,k) + ADJ_div_m(ii-i+1,jj-j+1)/grid%xb%map_factor(ii,jj+1)*coeff + + jo_grad_x%v(ii,jj-1,k) = jo_grad_x%v(ii,jj-1,k) - ADJ_div_m(ii-i+1,jj-j+1)/grid%xb%map_factor(ii,jj-1)*coeff + end do + end do + + if (trace_use_dull) call da_trace_exit("da_div_profile_adj") + +end subroutine da_div_profile_adj diff --git a/var/da/da_lightning/da_div_profile_tl.inc b/var/da/da_lightning/da_div_profile_tl.inc new file mode 100644 index 0000000000..a5c6aeb5e1 --- /dev/null +++ b/var/da/da_lightning/da_div_profile_tl.inc @@ -0,0 +1,58 @@ +subroutine da_div_profile_tl(grid, info, n, k, div) + + !-------------------------------------------------------------------------- + ! Purpose: Calculates divergence (div) on each level at the observed location (i,j). + ! dx, dxm, dy, dym are horizontal interpolation weighting. + ! d U d V + ! Div = m^2 *[---(---) + ---(---) ] + ! dx m dy M + ! Authors: Z Chen (zchen@fjnu.edu.cn), Jenny Sun (NCAR), X Qie (IAP) + !-------------------------------------------------------------------------- + + implicit none + + type (domain), intent(in) :: grid + type (infa_type), intent(in) :: info + integer, intent(in) :: n, k + real, intent(inout) :: div + + integer :: ii, jj ! index dimension. + real :: div_m(2,2) ! divergence + + integer :: i, j ! OBS location + real :: dx, dxm ! interpolation weights. + real :: dy, dym ! interpolation weights. + real :: coeff + + if (trace_use_dull) call da_trace_entry("da_div_profile_tl") + + i = info%i(1,n) + j = info%j(1,n) + dx = info%dx(1,n) + dy = info%dy(1,n) + dxm = info%dxm(1,n) + dym = info%dym(1,n) + + ! calculate layered divergence + if(i == its) i = its + 1 + if(i == ite) i = ite - 1 + if(j == jts) j = jts + 1 + if(j == jte) j = jte - 1 + + do ii = i, i+1 + do jj = j, j+1 + coeff = grid%xb%map_factor(ii,jj)*grid%xb%map_factor(ii,jj)*0.5/grid%xb%ds + + div_m(ii-i+1,jj-j+1) = (grid%xa%u(ii+1,jj,k)/grid%xb%map_factor(ii+1,jj) - & + grid%xa%u(ii-1,jj,k)/grid%xb%map_factor(ii-1,jj) + & + grid%xa%v(ii,jj+1,k)/grid%xb%map_factor(ii,jj+1) - & + grid%xa%v(ii,jj-1,k)/grid%xb%map_factor(ii,jj-1))* coeff + end do + end do + + ! Horizontal interpolation to the obs. pt. + div = dym*(dxm*div_m(1,1)+dx*div_m(2,1))+dy*(dxm*div_m(1,2)+dx*div_m(2,2)) + + if (trace_use_dull) call da_trace_exit("da_div_profile_tl") + +end subroutine da_div_profile_tl diff --git a/var/da/da_lightning/da_get_innov_vector_lightning.inc b/var/da/da_lightning/da_get_innov_vector_lightning.inc new file mode 100644 index 0000000000..a67d3ed2af --- /dev/null +++ b/var/da/da_lightning/da_get_innov_vector_lightning.inc @@ -0,0 +1,93 @@ +subroutine da_get_innov_vector_lightning( it, grid, ob, iv) + !----------------------------------------------------------------------- + ! Purpose: TBD + ! Authors: Z Chen (zchen@fjnu.edu.cn), Jenny Sun (NCAR), X Qie (IAP) + !----------------------------------------------------------------------- + + implicit none + + integer, intent(in) :: it ! External iteration. + type(domain), intent(in) :: grid ! first guess state. + type(y_type), intent(inout) :: ob ! Observation structure. + type(iv_type), intent(inout) :: iv ! O-B structure. + + integer :: n ! Loop counter. + integer :: i, j, k ! Index dimension. + real :: dx, dxm ! Interpolation weights. + real :: dy, dym ! Interpolation weights. + integer :: num_levs ! obs vertical levels + real :: div(kts:kte) ! Model divergence at ob loc + real :: w(kts:kte) ! Model vertical velocity + + if (trace_use) call da_trace_entry("da_get_innov_vector_lightning") + + if(it>1) then + do n = iv%info(lightning)%n1, iv%info(lightning)%n2 + do k = 1, iv%info(lightning)%levels(n) + if(iv%lightning(n)% w(k)%qc == fails_error_max) iv%lightning(n)% w(k)%qc = 0 + if(iv%lightning(n)%div(k)%qc == fails_error_max) iv%lightning(n)%div(k)%qc = 0 + if(iv%lightning(n)% qv(k)%qc == fails_error_max) iv%lightning(n)% qv(k)%qc = 0 + end do + end do + end if + + do n = iv%info(lightning)%n1, iv%info(lightning)%n2 + num_levs = iv%info(lightning)%levels(n) + + if(num_levs<1) cycle + + div(:) = 0.0 + w(:) = 0.0 + + ! [1.0] Get cross pt. horizontal interpolation weights: + + i = iv%info(lightning)%i(1,n) + dy = iv%info(lightning)%dy(1,n) + dym = iv%info(lightning)%dym(1,n) + j = iv%info(lightning)%j(1,n) + dx = iv%info(lightning)%dx(1,n) + dxm = iv%info(lightning)%dxm(1,n) + + ! [2.0] Calculate vertical profile of divergence and qv at obs pt. + + do k = 1, num_levs + iv % lightning(n) % w(k) % inv = 0.0 + iv % lightning(n) % div(k) % inv = 0.0 + iv % lightning(n) % qv(k) % inv = 0.0 + + if(use_lightning_w) then + if(ob%lightning(n)%w(k) > missing_r .and. iv%lightning(n)%w(k)%qc >= obs_qc_pointer) then + w(k) = dym*(dxm*grid%xb%w(i,j,k)+dx*grid%xb%w(i+1,j,k))+dy*(dxm*grid%xb%w(i,j+1,k)+dx*grid%xb%w(i+1,j+1,k)) + iv%lightning(n)%w(k)%qc = obs_qc_pointer + iv%lightning(n)%w(k)%inv = ob%lightning(n)%w(k) - w(k) + end if + end if + + if(use_lightning_div) then + if(ob%lightning(n)%div(k) > missing_r .and. iv%lightning(n)%div(k)%qc >= obs_qc_pointer) then + iv%lightning(n)%div(k)%qc = obs_qc_pointer + call da_div_profile(grid, iv%info(lightning), n, k, div(k)) + iv%lightning(n)%div(k)%inv = ob%lightning(n)%div(k) - div(k) + end if + end if + + if(use_lightning_qv) then + if(ob%lightning(n)%qv(k) > missing_r .and. iv%lightning(n)%qv(k)%qc >= obs_qc_pointer) then + iv%lightning(n)%qv(k)%inv = ob%lightning(n)%qv(k) - grid%xb%q(i,j,k) + iv%lightning(n)%qv(k)%inv = amax1(0.0, iv%lightning(n)%qv(k)%inv) + end if + end if + + end do + end do + + ! ----------------------------------------------------------------------- + ! [3.0] Perform optional maximum error check: + !----------------------------------------------------------------------- + + if(check_max_iv ) & + call da_check_max_iv_lightning(iv, ob, it) + + if (trace_use) call da_trace_exit("da_get_innov_vector_lightning") + +end subroutine da_get_innov_vector_lightning diff --git a/var/da/da_lightning/da_jo_and_grady_lightning.inc b/var/da/da_lightning/da_jo_and_grady_lightning.inc new file mode 100644 index 0000000000..5741a5714f --- /dev/null +++ b/var/da/da_lightning/da_jo_and_grady_lightning.inc @@ -0,0 +1,66 @@ +subroutine da_jo_and_grady_lightning(iv, re, jo, jo_grad_y) + + !----------------------------------------------------------------------- + ! Purpose: TBD + ! Authors: Z Chen (zchen@fjnu.edu.cn), Jenny Sun (NCAR), X Qie (IAP) + !----------------------------------------------------------------------- + + implicit none + + type (iv_type), intent(in) :: iv ! Innovation vector. + type (y_type), intent(in) :: re ! Residual vector. + type (y_type), intent(inout) :: jo_grad_y ! Grad_y(Jo) + type (jo_type), intent(inout) :: jo ! Obs cost function. + integer :: n, k + + if (trace_use_dull) call da_trace_entry("da_jo_and_grady_lightning") + + ! defined in da_define_structure.f90 + jo % lightning_w = 0.0 + jo % lightning_div = 0.0 + jo % lightning_qv = 0.0 + + do n = 1, iv%info(lightning)%nlocal + do k = 2, iv%info(lightning)%levels(n) + if(use_lightning_w) then + jo_grad_y%lightning(n)%w(k) = -re%lightning(n)%w(k)/(iv%lightning(n)%w(k)%error * iv%lightning(n)%w(k)%error) + end if + + if(use_lightning_div) then + jo_grad_y%lightning(n)%div(k) = -re%lightning(n)%div(k)/(iv%lightning(n)%div(k)%error * iv%lightning(n)%div(k)%error) + end if + + if(use_lightning_qv) then + jo_grad_y%lightning(n)%qv(k) = -re%lightning(n)%qv(k)/(iv%lightning(n)%qv(k)%error * iv%lightning(n)%qv(k)%error) + end if + end do + + if(iv%info(lightning)%proc_domain(1,n)) then + do k = 2, iv%info(lightning)%levels(n) + + if(use_lightning_w) then + jo%lightning_w = jo%lightning_w-re%lightning(n)%w(k)*jo_grad_y%lightning(n)%w(k) + end if + + if(use_lightning_div) then + jo%lightning_div = jo%lightning_div-re%lightning(n)%div(k) * jo_grad_y%lightning(n)%div(k) + end if + + if(use_lightning_qv) then + jo%lightning_qv = jo%lightning_qv-re%lightning(n)%qv(k)*jo_grad_y%lightning(n)%qv(k) + end if + + end do + end if + + end do + + jo%lightning_w = 0.5 * jo % lightning_w + jo%lightning_div = 0.5 * jo % lightning_div + jo%lightning_qv = 0.5 * jo % lightning_qv + + if (trace_use_dull) call da_trace_exit("da_jo_and_grady_lightning") + +end subroutine da_jo_and_grady_lightning + + diff --git a/var/da/da_lightning/da_lightning.f90 b/var/da/da_lightning/da_lightning.f90 new file mode 100644 index 0000000000..0e33c0eb41 --- /dev/null +++ b/var/da/da_lightning/da_lightning.f90 @@ -0,0 +1,67 @@ +module da_lightning + + use module_domain, only : domain + + use da_control, only : stdout, obs_qc_pointer,max_ob_levels,missing_r, & + v_interp_p, v_interp_h, check_max_iv_print, trace_use, & + missing, max_error_uv, max_error_t, rootproc, & + max_error_p,max_error_q, check_max_iv_unit,check_max_iv, & + max_stheight_diff,missing_data,max_error_bq,max_error_slp, & + max_error_bt, max_error_buv, lightning, qcstat_conv_unit, fails_error_max, & + use_lightning_w, use_lightning_qv, use_lightning_div, & + fg_format,fg_format_wrf_arw_regional,fg_format_wrf_nmm_regional,fg_format_wrf_arw_global,& + fg_format_kma_global,max_error_lda_w,max_error_lda_qv, max_error_lda_div, & + far_below_model_surface,kms,kme,kts,kte, trace_use_dull,filename_len,& + myproc, analysis_date, num_procs , ierr, comm + + use da_control, only : its, ite, jts, jte, ids, ide, jds, jde, ims, ime, jms, jme + use da_control, only : cloudbase_calc_opt + use da_define_structures, only : maxmin_type, iv_type, y_type, jo_type, & + bad_data_type, x_type, number_type, bad_data_type, & + infa_type, field_type + use da_interpolation, only : da_to_zk, da_interp_lin_3d,da_interp_lin_3d_adj + use da_par_util, only :da_proc_stats_combine, da_patch_to_global + use da_par_util1, only : da_proc_sum_int + use da_statistics, only : da_stats_calculate + use da_tools, only : da_max_error_qc, da_residual, map_info, da_llxy_wrf, da_llxy_default, da_convert_zk + use da_tracing, only : da_trace_entry, da_trace_exit + use da_reporting, only : da_error, da_warning, da_message, message + use da_tools_serial, only : da_get_unit, da_free_unit + + ! The "stats_lightning_type" is ONLY used locally in da_lightning: + + type residual_lightning1_type + real :: w + real :: div + real :: qv + end type residual_lightning1_type + + type maxmin_lightning_stats_type + type (maxmin_type) :: w ! vertical velocity + type (maxmin_type) :: div ! divgerence + type (maxmin_type) :: qv ! water vapor + end type maxmin_lightning_stats_type + + type stats_lightning_type + type (maxmin_lightning_stats_type) :: maximum, minimum + type (residual_lightning1_type) :: average, rms_err + end type stats_lightning_type + +contains + +#include "da_ao_stats_lightning.inc" +#include "da_jo_and_grady_lightning.inc" +#include "da_residual_lightning.inc" +#include "da_oi_stats_lightning.inc" +#include "da_print_stats_lightning.inc" +#include "da_transform_xtoy_lightning.inc" +#include "da_transform_xtoy_lightning_adj.inc" +#include "da_check_max_iv_lightning.inc" +#include "da_get_innov_vector_lightning.inc" +#include "da_calculate_grady_lightning.inc" +#include "da_div_profile.inc" +#include "da_div_profile_tl.inc" +#include "da_div_profile_adj.inc" + +end module da_lightning + diff --git a/var/da/da_lightning/da_oi_stats_lightning.inc b/var/da/da_lightning/da_oi_stats_lightning.inc new file mode 100644 index 0000000000..9ee917b187 --- /dev/null +++ b/var/da/da_lightning/da_oi_stats_lightning.inc @@ -0,0 +1,98 @@ +subroutine da_oi_stats_lightning (stats_unit, iv) + + !----------------------------------------------------------------------- + ! Purpose: TBD + ! Authors: Z Chen (zchen@fjnu.edu.cn), Jenny Sun (NCAR), X Qie (IAP) + !----------------------------------------------------------------------- + + implicit none + + integer, intent (in) :: stats_unit ! Output unit for stats. + type (iv_type), intent (in) :: iv ! OI + + type (stats_lightning_type) :: stats + integer :: nw, nqv, ndiv + integer :: n, k + + if (trace_use_dull) call da_trace_entry("da_oi_stats_lightning") + + nw = 0 + ndiv = 0 + nqv = 0 + + stats%maximum%w = maxmin_type(missing_r, 0, 0) + stats%minimum%w = maxmin_type(-missing_r, 0, 0) + stats%maximum%div = maxmin_type(missing_r, 0, 0) + stats%minimum%div = maxmin_type(-missing_r, 0, 0) + stats%maximum%qv = maxmin_type(missing_r, 0, 0) + stats%minimum%qv = maxmin_type(-missing_r, 0, 0) + + stats%average = residual_lightning1_type(0.0, 0.0, 0.0) + stats%rms_err = stats%average + + do n = 1, iv%info(lightning)%nlocal + if(iv%info(lightning)%proc_domain(1,n)) then + do k = 1, iv%info(lightning)%levels(n) + if(use_lightning_w) then + call da_stats_calculate(iv%info(lightning)%obs_global_index(n), & + k, iv%lightning(n)%w(k)%qc, & + iv%lightning(n)%w(k)%inv, nw, & + stats%minimum%w, stats%maximum%w, & + stats%average%w, stats%rms_err%w) + end if + + if(use_lightning_div) then + call da_stats_calculate(iv%info(lightning)%obs_global_index(n), & + k, iv%lightning(n)%div(k)%qc, & + iv%lightning(n)%div(k)%inv, ndiv, & + stats%minimum%div, stats%maximum%div, & + stats%average%div, stats%rms_err%div) + end if + + if(use_lightning_qv) then + call da_stats_calculate(iv%info(lightning)%obs_global_index(n), & + k, iv%lightning(n)%qv(k)%qc, & + iv%lightning(n)%qv(k)%inv, nqv, & + stats%minimum%qv, stats%maximum%qv, & + stats%average%qv, stats%rms_err%qv) + end if + + end do + end if + end do + + ! Do inter-processor communication to gather statistics. + if (use_lightning_w) then + call da_proc_sum_int (nw) + call da_proc_stats_combine(stats%average%w, stats%rms_err%w, & + stats%minimum%w%value, stats%maximum%w%value, & + stats%minimum%w%n, stats%maximum%w%n, & + stats%minimum%w%l, stats%maximum%w%l) + end if + + if (use_lightning_div) then + call da_proc_sum_int (ndiv) + call da_proc_stats_combine(stats%average%div, stats%rms_err%div, & + stats%minimum%div%value, stats%maximum%div%value, & + stats%minimum%div%n, stats%maximum%div%n, & + stats%minimum%div%l, stats%maximum%div%l) + end if + + if (use_lightning_qv) then + call da_proc_sum_int (nqv) + call da_proc_stats_combine(stats%average%qv, stats%rms_err%qv, & + stats%minimum%qv%value, stats%maximum%qv%value, & + stats%minimum%qv%n, stats%maximum%qv%n, & + stats%minimum%qv%l, stats%maximum%qv%l) + end if + + if (rootproc) then + if ( nw /= 0 .or. ndiv /= 0 .or. nqv /= 0 ) then + write(unit=stats_unit, fmt='(/a/)') ' Diagnostics of OI for lightning' + call da_print_stats_lightning(stats_unit, nw, ndiv, nqv, stats) + end if + end if + + if (trace_use_dull) call da_trace_exit("da_oi_stats_lightning") + +end subroutine da_oi_stats_lightning diff --git a/var/da/da_lightning/da_print_stats_lightning.inc b/var/da/da_lightning/da_print_stats_lightning.inc new file mode 100644 index 0000000000..d6d96fc2c6 --- /dev/null +++ b/var/da/da_lightning/da_print_stats_lightning.inc @@ -0,0 +1,41 @@ +subroutine da_print_stats_lightning(stats_unit, nw, ndiv, nqv, lightning) + + !----------------------------------------------------------------------- + ! Purpose: TBD + ! Authors: Z Chen (zchen@fjnu.edu.cn), Jenny Sun (NCAR), X Qie (IAP) + !----------------------------------------------------------------------- + + implicit none + + integer, intent(in) :: stats_unit + integer, intent(inout) :: nw, ndiv, nqv + type (stats_lightning_type), intent(in):: lightning + + if (trace_use_dull) call da_trace_entry("da_print_stats_lightning") + + write(unit=stats_unit, fmt='(a/)') & + ' var w (m/s) n k div (1/s) n k qv (kg/kg) n k' + + write(unit=stats_unit, fmt='(a,(i16,2i31))') & + ' Number: ', nw, ndiv, nqv + + if (nw < 1) nw = 1 + if (ndiv < 1) ndiv = 1 + if (nqv < 1) nqv = 1 + + write(unit=stats_unit, fmt='((a,f12.4,i9,i5, 2(f17.4,i9,i5)))') & + ' Minimum(n,k): ', lightning%minimum%w, lightning%minimum%div, lightning%minimum%qv + write(unit=stats_unit, fmt='((a,f12.4,i9,i5, 2(f17.4,i9,i5)))') & + ' Maximum(n,k): ', lightning%maximum%w, lightning%maximum%div, lightning%maximum%qv + write(unit=stats_unit, fmt='((a,3(f12.4,19x)))') & + ' Average : ', lightning%average%w/real(nw), & + lightning%average%div/real(ndiv), & + lightning%average%qv/real(nqv) + write(unit=stats_unit, fmt='((a,3(f12.4,19x)))') & + ' RMSE : ', sqrt(lightning%rms_err%w/real(nw)), & + sqrt(lightning%rms_err%div/real(ndiv)), & + sqrt(lightning%rms_err%qv/real(nqv)) + + if (trace_use_dull) call da_trace_exit("da_print_stats_lightning") + +end subroutine da_print_stats_lightning diff --git a/var/da/da_lightning/da_residual_lightning.inc b/var/da/da_lightning/da_residual_lightning.inc new file mode 100644 index 0000000000..84c1feb7f4 --- /dev/null +++ b/var/da/da_lightning/da_residual_lightning.inc @@ -0,0 +1,54 @@ +subroutine da_residual_lightning(iv, y, re,np_missing, np_bad_data,np_obs_used, np_available) + + !----------------------------------------------------------------------- + ! Purpose: Calculate residuals for lightning obs + ! Authors: Z Chen (zchen@fjnu.edu.cn), Jenny Sun (NCAR), X Qie (IAP) + !----------------------------------------------------------------------- + + implicit none + + type (iv_type), intent(in) :: iv ! Innovation vector (O-B). + type (y_type) , intent(in) :: y ! y = H (xa) + type (y_type) , intent(inout) :: re ! Residual vector (O-A). + + integer , intent(inout) :: np_available + integer , intent(inout) :: np_obs_used + integer , intent(inout) :: np_missing + integer , intent(inout) :: np_bad_data + + type (bad_data_type) :: n_obs_bad + integer :: n, k + + if (trace_use_dull) call da_trace_entry("da_residual_lightning") + + n_obs_bad%w%num = number_type(0, 0, 0) + n_obs_bad%q%num = number_type(0, 0, 0) + n_obs_bad%div%num = number_type(0, 0, 0) + + do n = 1, iv%info(lightning)%nlocal + do k = 1, iv%info(lightning)%levels(n) + + if(use_lightning_w) then + np_available = np_available + 1 + re%lightning(n)%w(k) = da_residual(n, k, y%lightning(n)%w(k), iv%lightning(n)%w(k), n_obs_bad % w) + end if + + if(use_lightning_div) then + np_available = np_available + 1 + re%lightning(n)%div(k) = da_residual(n, k, y%lightning(n)%div(k), iv%lightning(n)%div(k), n_obs_bad % div) + end if + + if(use_lightning_qv) then + np_available = np_available + 1 + re%lightning(n)%qv(k) = da_residual(n, k, y%lightning(n)%qv(k), iv%lightning(n)%qv(k), n_obs_bad % q) + end if + end do + end do + + np_missing = np_missing + n_obs_bad%w%num%miss + n_obs_bad%div%num%miss + n_obs_bad%q%num%miss + np_bad_data = np_bad_data + n_obs_bad%w%num%bad + n_obs_bad%div%num%bad + n_obs_bad%q%num%bad + np_obs_used = np_obs_used + n_obs_bad%w%num%use + n_obs_bad%div%num%use + n_obs_bad%q%num%use + + if (trace_use_dull) call da_trace_exit("da_residual_lightning") + +end subroutine da_residual_lightning diff --git a/var/da/da_lightning/da_transform_xtoy_lightning.inc b/var/da/da_lightning/da_transform_xtoy_lightning.inc new file mode 100644 index 0000000000..902b1e5819 --- /dev/null +++ b/var/da/da_lightning/da_transform_xtoy_lightning.inc @@ -0,0 +1,75 @@ +subroutine da_transform_xtoy_lightning (grid, iv, y) + + !----------------------------------------------------------------------- + ! Authors: Z Chen (zchen@fjnu.edu.cn), Jenny Sun (NCAR), X Qie (IAP) + !----------------------------------------------------------------------- + + implicit none + + type (domain), intent(in) :: grid + type (iv_type), intent(in) :: iv ! Innovation vector (O-B). + type (y_type), intent(inout) :: y ! y = h (grid%xa) + + integer :: n ! Loop counter. + integer :: i, j, k ! Index dimension. + real :: dx, dxm ! + real :: dy, dym ! + integer :: num_levs ! obs vertical levels + + real :: div(kts:kte) !Model divergence at ob loc + real :: ave_div(kts:kte) !Model averaged divergence at ob loc + real :: model_q(kts:kte) !Model Q at ob loc + real :: model_t(kts:kte) !Model T at ob loc + + real :: TGL_div(kts:kte) + real :: TGL_model_q(kts:kte) + + if (trace_use_dull) call da_trace_entry("da_transform_xtoy_lightning") + + do n = iv%info(lightning)%n1, iv%info(lightning)%n2 + + num_levs = iv%info(lightning)%levels(n) + + ! [1.0] Get horizontal interpolation weights: + + i = iv%info(lightning)%i(1,n) + dy = iv%info(lightning)%dy(1,n) + dym = iv%info(lightning)%dym(1,n) + j = iv%info(lightning)%j(1,n) + dx = iv%info(lightning)%dx(1,n) + dxm = iv%info(lightning)%dxm(1,n) + + TGL_div(:) = 0.0 + do k= 1, num_levs + + if(use_lightning_w) then + if(iv%lightning(n)%w(k)%qc == missing_data) then + y%lightning(n)%w(k) = 0.0 + else + y%lightning(n)%w(k) = grid%xa%w(i,j,k) + end if + end if + + if(use_lightning_div) then + if(iv%lightning(n)%div(k)%qc == missing_data) then + y%lightning(n)%div(k) = 0.0 + else + call da_div_profile_tl(grid, iv%info(lightning), n, k, TGL_div(k)) ! divergence profile + y%lightning(n)%div(k) = TGL_div(k) + end if + end if + + if(use_lightning_qv) then + if(iv%lightning(n)%qv(k)%qc == missing_data) then + y%lightning(n)%qv(k) = 0.0 + else + y%lightning(n)%qv(k) = grid%xa%q(i,j,k) + y%lightning(n)%qv(k) = y%lightning(n)%qv(k) + (17.67*243.5/(grid%xb%t(i,j,k)+243.5)**2.0)*grid%xb%q(i,j,k)*grid%xa%t(i,j,k) + end if + end if + + end do + end do + if (trace_use_dull) call da_trace_exit("da_transform_xtoy_lightning") + +end subroutine da_transform_xtoy_lightning diff --git a/var/da/da_lightning/da_transform_xtoy_lightning_adj.inc b/var/da/da_lightning/da_transform_xtoy_lightning_adj.inc new file mode 100644 index 0000000000..59e4b466c3 --- /dev/null +++ b/var/da/da_lightning/da_transform_xtoy_lightning_adj.inc @@ -0,0 +1,71 @@ +subroutine da_transform_xtoy_lightning_adj(grid, iv, jo_grad_y, jo_grad_x) + + !----------------------------------------------------------------------- + ! Purpose: TBD + ! Authors: Z Chen (zchen@fjnu.edu.cn), Jenny Sun (NCAR), X Qie (IAP) + !----------------------------------------------------------------------- + + implicit none + + type (domain), intent(in) :: grid + type (iv_type), intent(in) :: iv ! obs. inc vector (o-b). + type (y_type) , intent(inout) :: jo_grad_y ! grad_y(jo) + type (x_type) , intent(inout) :: jo_grad_x ! grad_x(jo) + + integer :: n, k ! Loop counter. + integer :: num_levs ! obs vertical levels + + integer :: i, j ! Index dimension. + real :: dx, dxm ! + real :: dy, dym ! + + real :: div(kts:kte) !Model divergence at ob loc + real :: ave_div(kts:kte) !Model averaged divergence at ob loc + real :: model_q(kts:kte) !Model RH at ob loc + real :: model_t(kts:kte) !Model T at ob loc + + real :: ADJ_div(kts:kte) + + if (trace_use_dull) call da_trace_entry("da_transform_xtoy_lightning_adj") + + do n = iv%info(lightning)%n1, iv%info(lightning)%n2 + num_levs = iv%info(lightning)%levels(n) + + ! [1.0] Get horizontal interpolation weights: + + i = iv%info(lightning)%i(1,n) + dy = iv%info(lightning)%dy(1,n) + dym = iv%info(lightning)%dym(1,n) + j = iv%info(lightning)%j(1,n) + dx = iv%info(lightning)%dx(1,n) + dxm = iv%info(lightning)%dxm(1,n) + + ADJ_div(:) = 0.0 + + do k = 1, num_levs + if(use_lightning_w) then + if(iv % lightning(n)%w(k)%qc /= missing_data) then + jo_grad_x%w(i,j,k) = jo_grad_x%w(i,j,k) + jo_grad_y%lightning(n)%w(k) + end if + end if + + if(use_lightning_div) then + if(iv % lightning(n)%div(k)%qc /= missing_data) then + call da_div_profile_adj(grid, jo_grad_x, iv%info(lightning), n, k, jo_grad_y%lightning(n)%div(k)) + end if + end if + + if(use_lightning_qv) then + if(iv % lightning(n)%qv(k)%qc /= missing_data) then + jo_grad_x%q(i,j,k) = jo_grad_x%q(i,j,k) + jo_grad_y%lightning(n)%qv(k) + jo_grad_x%t(i,j,k) = jo_grad_x%t(i,j,k) + (17.67*243.5/(grid%xb%t(i,j,k)+243.5)**2.0)*grid%xb%q(i,j,k)*jo_grad_y%lightning(n)%qv(k) + end if + end if + + end do + + end do + + if (trace_use_dull) call da_trace_exit("da_transform_xtoy_lightning_adj") + +end subroutine da_transform_xtoy_lightning_adj diff --git a/var/da/da_main/da_wrfvar_top.f90 b/var/da/da_main/da_wrfvar_top.f90 index 6205ab539d..240ceb5be0 100644 --- a/var/da/da_main/da_wrfvar_top.f90 +++ b/var/da/da_main/da_wrfvar_top.f90 @@ -121,6 +121,7 @@ module da_wrfvar_top use da_qscat, only : da_oi_stats_qscat use da_mtgirs, only : da_oi_stats_mtgirs use da_radar, only : da_oi_stats_radar, da_write_oa_radar_ascii + use da_lightning, only : da_oi_stats_lightning use da_satem, only : da_oi_stats_satem use da_ships, only : da_oi_stats_ships use da_sound, only : da_oi_stats_sound, da_oi_stats_sonde_sfc diff --git a/var/da/da_minimisation/da_calculate_grady.inc b/var/da/da_minimisation/da_calculate_grady.inc index f798d51e36..66e205a3e3 100644 --- a/var/da/da_minimisation/da_calculate_grady.inc +++ b/var/da/da_minimisation/da_calculate_grady.inc @@ -39,6 +39,7 @@ subroutine da_calculate_grady(iv, re, jo_grad_y) if (iv%info(bogus)%nlocal > 0) call da_calculate_grady_bogus (iv, re, jo_grad_y) if (iv%info(qscat)%nlocal > 0) call da_calculate_grady_qscat (iv, re, jo_grad_y) if (iv%info(radar)%nlocal > 0) call da_calculate_grady_radar (iv, re, jo_grad_y) + if (iv%info(lightning)%nlocal > 0) call da_calculate_grady_lightning(iv, re, jo_grad_y) if (iv%info(mtgirs)%nlocal > 0) call da_calculate_grady_mtgirs (iv, re, jo_grad_y) if (iv%info(tamdar)%nlocal > 0) call da_calculate_grady_tamdar (iv, re, jo_grad_y) if (iv%info(tamdar_sfc)%nlocal> 0) call da_calculate_grady_tamdar_sfc(iv, re, jo_grad_y) diff --git a/var/da/da_minimisation/da_calculate_residual.inc b/var/da/da_minimisation/da_calculate_residual.inc index 7351eb87d1..121bcce6ac 100644 --- a/var/da/da_minimisation/da_calculate_residual.inc +++ b/var/da/da_minimisation/da_calculate_residual.inc @@ -95,6 +95,9 @@ subroutine da_calculate_residual(iv, y, re) if (iv%info(radar)%nlocal > 0) & call da_residual_radar(iv, y, re, np_missing, np_bad_data, np_obs_used, np_available) + if (iv%info(lightning)%nlocal > 0) & + call da_residual_lightning(iv, y, re, np_missing, np_bad_data, np_obs_used, np_available) + if (iv%info(profiler)%nlocal > 0) & call da_residual_profiler(iv, y, re, np_missing, np_bad_data, np_obs_used, np_available) diff --git a/var/da/da_minimisation/da_get_innov_vector.inc b/var/da/da_minimisation/da_get_innov_vector.inc index 6ecc4c1aac..142b78b1ad 100644 --- a/var/da/da_minimisation/da_get_innov_vector.inc +++ b/var/da/da_minimisation/da_get_innov_vector.inc @@ -150,6 +150,8 @@ subroutine da_get_innov_vector (it, num_qcstat_conv, ob, iv, grid, config_flags) call da_get_innov_vector_satem (it, num_qcstat_conv,grid, ob, iv) if (iv%info(radar)%nlocal >= 0 .and. use_radarobs) & call da_get_innov_vector_radar (it, grid, ob, iv) + if (iv%info(lightning)%nlocal > 0) & + call da_get_innov_vector_lightning (it, grid, ob, iv) if (iv%info(qscat)%nlocal > 0) & call da_get_innov_vector_qscat (it, num_qcstat_conv,grid, ob, iv) if (iv%info(profiler)%nlocal > 0) & diff --git a/var/da/da_minimisation/da_get_var_diagnostics.inc b/var/da/da_minimisation/da_get_var_diagnostics.inc index dc135c8c16..c25236728d 100644 --- a/var/da/da_minimisation/da_get_var_diagnostics.inc +++ b/var/da/da_minimisation/da_get_var_diagnostics.inc @@ -103,7 +103,10 @@ subroutine da_get_var_diagnostics(it, iv, j) temp(77) = j % jo % rain_r !temp(78) is j % jo % airep_q listed up with other airep variables temp(79) = j % jo % gpseph_eph - + temp(80) = j % jo % lightning_w + temp(81) = j % jo % lightning_div + temp(82) = j % jo % lightning_qv + call da_proc_sum_real(temp(:)) j % jo % synop_u = temp(1) @@ -188,6 +191,10 @@ subroutine da_get_var_diagnostics(it, iv, j) j % jo % rain_r = temp(77) j % jo % gpseph_eph = temp(79) + j % jo % lightning_w = temp(80) + j % jo % lightning_div = temp(81) + j % jo % lightning_qv = temp(82) + if (use_rad) then jo_radiance = 0.0 do i = 1, iv%num_inst ! loop for sensor @@ -470,6 +477,14 @@ subroutine da_get_var_diagnostics(it, iv, j) j % jo % airsr_q, iv % airsr_ef_q, & 0.0, 1.0, 0.0, 1.0, 0.0, 1.0 end if + if (iv%info(lightning)%ntotal > 0) then + write(unit=jo_unit,fmt='(a30,2i8,10f15.5)')'lightning obs, Jo(actual) = ', & + iv%info(lightning)%ntotal, iv%nstats(lightning), & + j % jo % lightning_w, iv % lightning_ef_w, & + j % jo % lightning_div, iv % lightning_ef_div, & + j % jo % lightning_qv, iv % lightning_ef_qv, & + 0.0, 1.0, 0.0, 1.0 + end if do i = 1, iv%num_inst ! loop for sensor do k = 1, iv%instid(i)%nchan if (j % jo % rad(i) % num_ichan(k) > 0) then diff --git a/var/da/da_minimisation/da_jo_and_grady.inc b/var/da/da_minimisation/da_jo_and_grady.inc index 4b5a213813..bce6bf3c60 100644 --- a/var/da/da_minimisation/da_jo_and_grady.inc +++ b/var/da/da_minimisation/da_jo_and_grady.inc @@ -17,7 +17,7 @@ subroutine da_jo_and_grady(iv, re, jot, jo, jo_grad_y) jo_airep, jo_pilot, jo_satem, & jo_metar, jo_ships, jo_gpspw, & jo_ssmi_tb, jo_ssmi_rv, jo_ssmt1, jo_ssmt2, & - jo_pseudo, jo_qscat, jo_buoy, & + jo_pseudo, jo_qscat, jo_buoy, jo_lightning, & jo_profiler, jo_radar, jo_gpsref, jo_gpseph, jo_bogus, jo_rain, & jo_radiance, jo_airsr, jo_mtgirs, jo_tamdar, jo_tamdar_sfc #if (WRF_CHEM == 1) @@ -416,6 +416,23 @@ subroutine da_jo_and_grady(iv, re, jot, jo, jo_grad_y) jo_radar = 0.0 end if + if (iv%info(lightning)%nlocal > 0) then + call da_jo_and_grady_lightning(iv, re, jo, jo_grad_y) + jo_lightning = jo%lightning_w + jo%lightning_div + jo%lightning_qv + if (print_detail_grad) then + write(unit=stdout, fmt='(a, e24.12)') & + ' jo_lightning ', jo_lightning, & + ' jo%lightning_w ', jo%lightning_w, & + ' jo%lightning_div', jo%lightning_div, & + ' jo%lightning_qv ', jo%lightning_qv + end if + else + jo % lightning_w = 0.0 + jo % lightning_div = 0.0 + jo % lightning_qv = 0.0 + jo_lightning = 0.0 + end if + if (iv%info(rain)%nlocal > 0) then call da_jo_and_grady_rain(iv, re, jo, jo_grad_y) jo_rain = jo%rain_r @@ -593,7 +610,7 @@ subroutine da_jo_and_grady(iv, re, jot, jo, jo_grad_y) #if (WRF_CHEM == 1) jo_chemic_surf + & #endif - jo_tamdar + jo_tamdar_sfc + jo_rain + jo_tamdar + jo_tamdar_sfc + jo_rain + jo_lightning jot = jo%total @@ -633,7 +650,8 @@ subroutine da_jo_and_grady(iv, re, jot, jo, jo_grad_y) #if (WRF_CHEM == 1) ' jo_chemic_surf ', jo_chemic_surf, & #endif - ' jo_rain ', jo_rain + ' jo_rain ', jo_rain, & + ' jo_lightning ', jo_lightning end if diff --git a/var/da/da_minimisation/da_minimisation.f90 b/var/da/da_minimisation/da_minimisation.f90 index 56355d1992..519066af0b 100644 --- a/var/da/da_minimisation/da_minimisation.f90 +++ b/var/da/da_minimisation/da_minimisation.f90 @@ -54,10 +54,10 @@ module da_minimisation chemic_surf, chemicda_opt, & #endif sound, mtgirs, sonde_sfc, synop, profiler, gpsref, gpseph, gpspw, polaramv, geoamv, ships, metar, & - satem, radar, ssmi_rv, ssmi_tb, ssmt1, ssmt2, airsr, pilot, airep,tamdar, tamdar_sfc, rain, & + satem, radar, ssmi_rv, ssmi_tb, ssmt1, ssmt2, airsr, pilot, airep,tamdar, tamdar_sfc, rain, lightning, & bogus, buoy, qscat,pseudo, radiance, monitor_on, max_ext_its, use_rttov_kmatrix,& use_crtm_kmatrix,precondition_cg, precondition_factor, use_varbc, varbc_factor, & - biasprep, qc_rad, num_procs, myproc, use_gpspwobs, use_rainobs, use_gpsztdobs, & + biasprep, qc_rad, num_procs, myproc, use_gpspwobs, use_rainobs, use_gpsztdobs, use_lightningobs, & use_radar_rf, radar_rf_opt,radar_rf_rscl,radar_rv_rscl,use_radar_rhv,use_radar_rqv,pseudo_var, num_pseudo, & num_ob_indexes, num_ob_vars, npres_print, pptop, ppbot, qcstat_conv_unit, gas_constant, & orthonorm_gradient, its, ite, jts, jte, kts, kte, ids, ide, jds, jde, kds, kde, cp, & @@ -140,6 +140,10 @@ module da_minimisation use da_radar, only : da_calculate_grady_radar, da_ao_stats_radar, & da_oi_stats_radar, da_get_innov_vector_radar, da_residual_radar, & da_jo_and_grady_radar + + use da_lightning, only : da_calculate_grady_lightning, da_ao_stats_lightning, & + da_oi_stats_lightning, da_get_innov_vector_lightning, da_residual_lightning, & + da_jo_and_grady_lightning use da_rain, only : da_calculate_grady_rain, da_ao_stats_rain, & da_oi_stats_rain, da_get_innov_vector_rain, da_residual_rain, & diff --git a/var/da/da_minimisation/da_write_diagnostics.inc b/var/da/da_minimisation/da_write_diagnostics.inc index 55f33a0426..18a1998f11 100644 --- a/var/da/da_minimisation/da_write_diagnostics.inc +++ b/var/da/da_minimisation/da_write_diagnostics.inc @@ -58,6 +58,7 @@ use da_control, only : stats_unit2 if (iv%info(profiler)%ntotal > 0) call da_oi_stats_profiler (stats_unit, iv, ob) if (iv%info(buoy)%ntotal > 0) call da_oi_stats_buoy (stats_unit, iv, ob) if (iv%info(radar)%ntotal > 0) call da_oi_stats_radar (stats_unit, iv) + if (iv%info(lightning)%ntotal> 0) call da_oi_stats_lightning(stats_unit, iv) if (iv%info(bogus)%ntotal > 0) call da_oi_stats_bogus (stats_unit, iv) if (iv%info(airsr)%ntotal > 0) call da_oi_stats_airsr (stats_unit, iv) if (iv%info(rain)%ntotal > 0) call da_oi_stats_rain (stats_unit, iv) @@ -101,6 +102,7 @@ if (.not. anal_type_verify) then if (iv%info(profiler)%ntotal > 0) call da_ao_stats_profiler (stats_unit, iv, re, ob) if (iv%info(buoy)%ntotal > 0) call da_ao_stats_buoy (stats_unit, iv, re, ob) if (iv%info(radar)%ntotal > 0) call da_ao_stats_radar (stats_unit, iv, re) + if (iv%info(lightning)%ntotal> 0) call da_ao_stats_lightning(stats_unit, iv, re) if (iv%info(bogus)%ntotal > 0) call da_ao_stats_bogus (stats_unit, iv, re) if (iv%info(airsr)%ntotal > 0) call da_ao_stats_airsr (stats_unit, iv, re) if (iv%info(rain)%ntotal > 0) call da_ao_stats_rain (stats_unit, iv, re) diff --git a/var/da/da_obs/da_fill_obs_structures.inc b/var/da/da_obs/da_fill_obs_structures.inc index 48a877b889..860114da80 100644 --- a/var/da/da_obs/da_fill_obs_structures.inc +++ b/var/da/da_obs/da_fill_obs_structures.inc @@ -93,6 +93,10 @@ subroutine da_fill_obs_structures(iv, ob, uvq_direct) iv % radar_ef_rv = 1.0 iv % radar_ef_rf = 1.0 + iv % lightning_ef_w = 1.0 + iv % lightning_ef_div = 1.0 + iv % lightning_ef_qv = 1.0 + iv % rain_ef_r = 1.0 iv % bogus_ef_u = 1.0 @@ -525,6 +529,19 @@ subroutine da_fill_obs_structures(iv, ob, uvq_direct) end do end if + ! [2.21] Transfer lightning obs + + if (iv%info(lightning)%nlocal > 0) then + do n = 1, iv%info(lightning)%nlocal + do k = 1, iv%info(lightning)%levels(n) + ! Copy observation variables: + ob % lightning(n) % w(k) = iv % lightning(n) % w(k) % inv + ob % lightning(n) % div(k) = iv % lightning(n) % div(k) % inv + ob % lightning(n) % qv(k) = iv % lightning(n) % qv(k) % inv + end do + end do + end if + ! Transfer AIRS retrievals: if (iv%info(airsr)%nlocal > 0) then diff --git a/var/da/da_obs/da_fill_obs_structures_lightning.inc b/var/da/da_obs/da_fill_obs_structures_lightning.inc new file mode 100644 index 0000000000..de96586cfe --- /dev/null +++ b/var/da/da_obs/da_fill_obs_structures_lightning.inc @@ -0,0 +1,48 @@ +subroutine da_fill_obs_structures_lightning(iv, ob) + + !---------------------------------------------------------------------------- + ! Purpose: Allocates observation structure and fills it from iv. + ! Authors: Z Chen (zchen@fjnu.edu.cn), Jenny Sun (NCAR), X Qie (IAP) + !---------------------------------------------------------------------------- + + implicit none + + type (iv_type), intent(inout) :: iv ! Obs and header structure. + type (y_type), intent(out) :: ob ! (Smaller) observation structure. + + integer :: n, k ! Loop counters. + integer :: i,j + + if (trace_use) call da_trace_entry("da_fill_obs_structures_lightning") + + !--------------------------------------------------------------------------- + ! Initialise obs error factors (which will be overwritten in use_obs_errfac) + !--------------------------------------------------------------------------- + + iv % lightning_ef_w = 1.0 + iv % lightning_ef_div = 1.0 + iv % lightning_ef_qv = 1.0 + !---------------------------------------------------------------------- + ! [1.0] Allocate innovation vector and observation structures: + !---------------------------------------------------------------------- + call da_allocate_y_lightning(iv, ob) + + !---------------------------------------------------------------------- + ! [2.0] Transfer observations: + !---------------------------------------------------------------------- + + ! [2.20] Transfer lightning obs: + + if (iv%info(lightning)%nlocal > 0) then + do n = 1, iv%info(lightning)%nlocal + do k = 1, iv%info(lightning)%levels(n) + ob%lightning(n)%w(k) = iv%lightning(n)%w(k)%inv + ob%lightning(n)%div(k) = iv%lightning(n)%div(k)%inv + ob%lightning(n)%qv(k) = iv%lightning(n)%qv(k)%inv + end do + end do + end if + + if (trace_use) call da_trace_exit("da_fill_obs_structures_lightning") + +end subroutine da_fill_obs_structures_lightning diff --git a/var/da/da_obs/da_obs.f90 b/var/da/da_obs/da_obs.f90 index 998f6fa5c5..4f5f20422e 100644 --- a/var/da/da_obs/da_obs.f90 +++ b/var/da/da_obs/da_obs.f90 @@ -5,7 +5,7 @@ module da_obs da_allocate_y_chem_sfc, da_deallocate_y_chem_sfc, & #endif field_type, each_level_type,da_allocate_y, da_random_seed,da_allocate_y_rain, & - da_allocate_y_radar + da_allocate_y_radar, da_allocate_y_lightning #if (WRF_CHEM == 1) use module_domain, only : domain, x_type, xchem_type use da_chem_sfc, only : da_transform_xtoy_chem_sfc, da_transform_xtoy_chem_sfc_adj @@ -28,7 +28,7 @@ module da_obs rtm_option_crtm,use_rad, base_temp, base_lapse, base_pres, & ob_format,ob_format_ascii,filename_len, trace_use_dull, & sound, mtgirs, synop, profiler, gpsref, gpseph, gpspw, polaramv, geoamv, ships, metar, & - satem, radar, ssmi_rv, ssmi_tb, ssmt1, ssmt2, airsr, pilot, airep, sonde_sfc,rain, & + satem, radar, ssmi_rv, ssmi_tb, ssmt1, ssmt2, airsr, pilot, airep, sonde_sfc, rain, lightning, & bogus, buoy, qscat, tamdar, tamdar_sfc, pseudo, num_ob_indexes, its,ite,jds,jts,jte,ids, & #if (WRF_CHEM == 1) chemic_surf, & @@ -62,6 +62,7 @@ module da_obs use da_qscat, only : da_transform_xtoy_qscat,da_transform_xtoy_qscat_adj use da_radar, only : da_transform_xtoy_radar,da_transform_xtoy_radar_adj use da_rain, only : da_transform_xtoy_rain,da_transform_xtoy_rain_adj + use da_lightning, only : da_transform_xtoy_lightning,da_transform_xtoy_lightning_adj use da_reporting, only : da_error, message, da_warning, da_message #ifdef RTTOV use da_rttov, only : da_transform_xtoy_rttov,da_transform_xtoy_rttov_adj @@ -69,9 +70,9 @@ module da_obs use da_satem, only : da_transform_xtoy_satem, da_transform_xtoy_satem_adj use da_ships, only : da_transform_xtoy_ships, da_transform_xtoy_ships_adj use da_sound, only : da_transform_xtoy_sound, da_transform_xtoy_sonde_sfc, & - da_transform_xtoy_sound_adj, da_transform_xtoy_sonde_sfc_adj + da_transform_xtoy_sound_adj, da_transform_xtoy_sonde_sfc_adj use da_mtgirs, only : da_transform_xtoy_mtgirs, da_transform_xtoy_mtgirs_adj - use da_tamdar, only : da_transform_xtoy_tamdar, da_transform_xtoy_tamdar_adj, & + use da_tamdar, only : da_transform_xtoy_tamdar, da_transform_xtoy_tamdar_adj, & da_transform_xtoy_tamdar_sfc, da_transform_xtoy_tamdar_sfc_adj use da_ssmi, only : da_transform_xtoy_ssmt1, da_transform_xtoy_ssmt2, & da_transform_xtoy_ssmi_tb, da_transform_xtoy_ssmi_rv, & @@ -96,6 +97,7 @@ module da_obs #include "da_fill_obs_structures.inc" #include "da_fill_obs_structures_radar.inc" #include "da_fill_obs_structures_rain.inc" +#include "da_fill_obs_structures_lightning.inc" #if (WRF_CHEM == 1) #include "da_fill_obs_structures_chem_sfc.inc" #endif diff --git a/var/da/da_obs/da_obs_sensitivity.inc b/var/da/da_obs/da_obs_sensitivity.inc index 8bf9bbb65b..19d56dd9b7 100644 --- a/var/da/da_obs/da_obs_sensitivity.inc +++ b/var/da/da_obs/da_obs_sensitivity.inc @@ -506,7 +506,7 @@ subroutine da_obs_sensitivity(ktr, iv) write(unit=message(imsg),fmt='(A)') 'Impact of Conventional Observations for each observation type: ' do i = 1, num_ob_indexes if ( (i == ssmi_tb) .or. (i == ssmt1) .or. (i == ssmt2) .or. & - (i == radar ) .or. (i == radiance) .or. (i == airsr) .or. & + (i == radar ) .or. (i == radiance) .or. (i == airsr) .or. (i == lightning) .or. & (i == sonde_sfc) .or. (i == tamdar_sfc) .or. (i == rain) ) cycle imsg = imsg + 1 write(unit=message(imsg),fmt='(3x,a,e15.5)') obs_names(i), SUM(ktd_global(i,:)) diff --git a/var/da/da_obs/da_transform_xtoy.inc b/var/da/da_obs/da_transform_xtoy.inc index 83817517a8..2b99bde777 100644 --- a/var/da/da_obs/da_transform_xtoy.inc +++ b/var/da/da_obs/da_transform_xtoy.inc @@ -51,6 +51,7 @@ subroutine da_transform_xtoy(cv_size, cv, grid, iv, y) if (iv%info(bogus)%nlocal > 0) call da_transform_xtoy_bogus (grid, iv, y) if (iv%info(airsr)%nlocal > 0) call da_transform_xtoy_airsr (grid, iv, y) if (iv%info(pseudo)%nlocal > 0) call da_transform_xtoy_pseudo (grid, iv, y) + if (iv%info(lightning)%nlocal > 0) call da_transform_xtoy_lightning(grid, iv, y) #if (WRF_CHEM == 1) if (iv%info(chemic_surf)%nlocal > 0) & diff --git a/var/da/da_obs/da_transform_xtoy_adj.inc b/var/da/da_obs/da_transform_xtoy_adj.inc index dbbe9ddd15..2c8cf6cf7d 100644 --- a/var/da/da_obs/da_transform_xtoy_adj.inc +++ b/var/da/da_obs/da_transform_xtoy_adj.inc @@ -111,6 +111,7 @@ subroutine da_transform_xtoy_adj(cv_size, cv, grid, iv, jo_grad_y, jo_grad_x & if (iv%info(bogus)%nlocal > 0) call da_transform_xtoy_bogus_adj (grid, iv, jo_grad_y, jo_grad_x) if (iv%info(airsr)%nlocal > 0) call da_transform_xtoy_airsr_adj (iv, jo_grad_y, jo_grad_x) if (iv%info(pseudo)%nlocal > 0) call da_transform_xtoy_pseudo_adj (iv, jo_grad_y, jo_grad_x) + if (iv%info(lightning)%nlocal> 0) call da_transform_xtoy_lightning_adj(grid, iv, jo_grad_y, jo_grad_x) #if defined(CRTM) || defined(RTTOV) if (use_rad) then diff --git a/var/da/da_obs_io/da_final_write_obs.inc b/var/da/da_obs_io/da_final_write_obs.inc index 02b603876f..9c7f1453fa 100644 --- a/var/da/da_obs_io/da_final_write_obs.inc +++ b/var/da/da_obs_io/da_final_write_obs.inc @@ -536,6 +536,26 @@ subroutine da_final_write_obs(it,iv) end do end if + !------------------------------------------------------------------ + ! [22] writing lightning + !------------------------------------------------------------------ + + num_obs = 0 + if (iv%info(lightning)%nlocal > 0) then + do n = 1, iv%info(lightning)%nlocal + if(iv%info(lightning)%proc_domain(1,n)) num_obs = num_obs + 1 + end do + end if + call da_proc_sum_int(num_obs) + if_wind_sd = .false. + if (num_obs > 0 .and. rootproc) then + write(omb_unit,'(a20,i8)')'lightning', num_obs + num_obs = 0 + do k = 0,num_procs-1 + call da_read_omb_tmp(filename(k),iunit,num_obs,'lightning',5,if_wind_sd) + end do + end if + if (rootproc) then close(iunit) @@ -548,5 +568,3 @@ subroutine da_final_write_obs(it,iv) if (trace_use) call da_trace_exit("da_final_write_obs") end subroutine da_final_write_obs - - diff --git a/var/da/da_obs_io/da_obs_io.f90 b/var/da/da_obs_io/da_obs_io.f90 index 7e25443288..7c9760ed1a 100644 --- a/var/da/da_obs_io/da_obs_io.f90 +++ b/var/da/da_obs_io/da_obs_io.f90 @@ -4,7 +4,7 @@ module da_obs_io use da_control, only : xmiss, missing_r, fmt_each, fmt_info, trace_use, & fmt_srfc, filtered_obs_unit, num_procs,missing, ierr,comm, rand_unit, & - obs_qc_pointer, rootproc, omb_unit,omb_add_noise,use_airepobs, & + obs_qc_pointer, rootproc, omb_unit,omb_add_noise,use_airepobs, use_lightningobs, & use_airepobs,use_bogusobs,use_gpspwobs,use_gpsztdobs,use_gpsrefobs,use_geoamvobs, & use_metarobs,use_profilerobs,use_pilotobs,use_buoyobs,use_shipsobs,use_rainobs, & use_synopobs,use_soundobs,use_mtgirsobs,use_tamdarobs,use_qscatobs,use_radarobs, & @@ -23,7 +23,7 @@ module da_obs_io obs_names, num_ob_indexes, fm_index, ids,ide, ite, jte, & sound, mtgirs,synop, pilot, satem, geoamv, polaramv, airep, gpspw, gpsref, & tamdar, tamdar_sfc, metar, ships, ssmi_rv, ssmi_tb, ssmt1, ssmt2, qscat, profiler, buoy, bogus, pseudo, & - radar, radiance, airsr, sonde_sfc, trace_use_dull, num_fgat_time, time_slots, myproc, & + radar, radiance, airsr, sonde_sfc, trace_use_dull, num_fgat_time, time_slots, myproc, lightning, & qmarker_retain, anal_type_verify, top_km_gpsro, bot_km_gpsro, thin_rainobs, & sfc_assi_options, sfc_assi_options_1, sfc_assi_options_2,print_detail_rain,max_rain_input,rain, & pi, ob_format_gpsro, ob_format_ascii, analysis_date, kms,kme, v_interp_h,v_interp_p, & @@ -33,6 +33,7 @@ module da_obs_io lsac_use_u, lsac_use_v, lsac_use_t, lsac_use_q, lsac_u_error, lsac_v_error, lsac_t_error, lsac_q_error, & gpsro_drift, max_gpseph_input, use_gpsephobs, gpseph, gpseph_loadbalance, kds, kde, kts, kte, & use_radar_rhv, use_radar_rqv, use_radar_rf, use_radar_rv, multi_inc, & + use_lightning_w, use_lightning_div, use_lightning_qv, lightning_min_rh, min_flashrate, & thin_conv_opt, no_thin, thin_single, thin_multi, thin_superob, thin_superob_hv, & thin_mesh_vert_conv, use_satwnd_bufr, uv_error_opt, uv_error_val, error_opt_nml @@ -54,7 +55,7 @@ module da_obs_io use da_define_structures, only : iv_type, multi_level_type, multi_level_type_BUFR, & radar_multi_level_type, y_type, field_type, each_level_type, & radar_each_level_type, info_type, model_loc_type,gpsref_type, rain_single_level_type, rain_each_type, & - gpseph_type + gpseph_type, lightning_each_level_type, lightning_multi_level_type use da_grid_definitions, only : da_ffdduv,da_ffdduv_model,da_ffdduv_diagnose use da_obs, only : da_count_filtered_obs,da_check_missing,da_obs_proc_station, da_set_obs_missing, da_set_3d_obs_missing use da_par_util1, only : da_proc_sum_int @@ -97,6 +98,8 @@ module da_obs_io #include "da_scan_obs_ascii.inc" #include "da_read_obs_radar.inc" #include "da_scan_obs_radar.inc" +#include "da_read_obs_lightning.inc" +#include "da_scan_obs_lightning.inc" #include "da_scan_obs_rain.inc" #include "da_read_obs_rain.inc" #if (WRF_CHEM == 1) diff --git a/var/da/da_obs_io/da_read_iv_for_multi_inc.inc b/var/da/da_obs_io/da_read_iv_for_multi_inc.inc index f2ad1bd4b4..ca40e42f36 100644 --- a/var/da/da_obs_io/da_read_iv_for_multi_inc.inc +++ b/var/da/da_obs_io/da_read_iv_for_multi_inc.inc @@ -824,6 +824,35 @@ subroutine da_read_iv_for_multi_inc(file_index, iv) close (unit_in) end if ! nobs_tot > 0 + ! [26] lightning obs: + + if (iv%info(lightning)%plocal(iv%time)-iv%info(lightning)%plocal(iv%time-1) > 0) then + + open(unit=unit_in,file=trim(filename)//'.lightning',form='formatted',status='old',iostat=ios) + if (ios /= 0) Then + call da_error(__FILE__,__LINE__, & + (/"Cannot open file"//filename/)) + end if + + read(unit_in,'(a20,i8)', end = 999, err = 1000) ob_type_string, num_obs + if ( trim(adjustl(ob_type_string)) .ne. 'lightning' ) & + call da_error(__FILE__,__LINE__, & + (/"Cannot find lightning marker. "/)) + gn = 0 + do n = iv%info(lightning)%plocal(iv%time-1) + 1, & + iv%info(lightning)%plocal(iv%time) + call da_search_obs (ob_type_string, unit_in, num_obs, n, iv, found_flag) + if (found_flag .eqv. .false.) & + call da_error(__FILE__,__LINE__, & + (/"Cannot find lightning obs. "/)) + gn = gn + 1 + end do + if (gn /= iv%info(lightning)%plocal(iv%time)-iv%info(lightning)%plocal(iv%time-1)) & + call da_error(__FILE__,__LINE__, & + (/"Unequal obs. found "/)) + close (unit_in) + end if + 999 continue close (unit_in) call da_free_unit(unit_in) diff --git a/var/da/da_obs_io/da_read_obs_lightning.inc b/var/da/da_obs_io/da_read_obs_lightning.inc new file mode 100644 index 0000000000..4fd0f53b32 --- /dev/null +++ b/var/da/da_obs_io/da_read_obs_lightning.inc @@ -0,0 +1,220 @@ +subroutine da_read_obs_lightning (iv, filename, grid) + + !----------------------------------------------------------------------- + ! Purpose: Read the lightning observation file + ! Authors: Z Chen (zchen@fjnu.edu.cn), Jenny Sun (NCAR), X Qie (IAP) + !----------------------------------------------------------------------------------------! + + implicit none + + type (iv_type), intent(inout) :: iv + character(len=*), intent(in) :: filename + type(domain), intent(in) :: grid ! first guess state. + + integer :: i, n, iost + integer :: iunit + + integer :: i1, j1, k ! Index dimension. + real :: dx, dxm ! Interpolation weights + real :: dy, dym ! Interpolation weights + real :: zlcl + + type (lightning_multi_level_type) :: platform + + character (len = 120) :: char_total_lightning, char_total_levels + character (len = 160) :: info_string + integer :: total_lightning, nlevels, lightning_qc, rh_indicator + real :: flashrate, wmax, lightning_error + real, allocatable,dimension(:):: height, coff + logical :: outside, outside_all + integer :: nlocal + + if (trace_use) call da_trace_entry("da_read_obs_lightning") + + nlocal = 0 + + ! 1. open file + call da_get_unit(iunit) + open(unit = iunit, & + FILE = trim(filename), & + FORM = 'FORMATTED', & + ACCESS = 'SEQUENTIAL', & + iostat = iost, & + STATUS = 'OLD') + + if (iost /= 0) then + write(unit=message(1),fmt='(A,I5,A)') & + "Error",iost," opening lightning obs file "//trim(filename) + call da_warning(__FILE__,__LINE__,message(1:1)) + call da_free_unit(iunit) + if (trace_use) call da_trace_exit("da_read_obs_lightning") + return + end if + + ! 2. read basic info + + ! 2.1 read the number of total lightning observation and vertical layers + read (unit=iunit, fmt = '(A)', iostat = iost) char_total_lightning + read (unit=iunit, fmt = '(A)', iostat = iost) char_total_levels + read (unit=char_total_levels(9:15),fmt='(I7)', iostat = iost) nlevels + + ! skip one line + read (unit=iunit, fmt = '(A)', iostat = iost) + + ! 2.2 read height and coefficient + allocate(height(nlevels)) + allocate(coff(nlevels)) + do i = 1, nlevels + read (unit = iunit, iostat = iost, fmt = '(2F12.3)') height(i), coff(i) + end do + + ! 2.3 read header info + head_info: do + read (unit=iunit, fmt = '(A)', iostat = iost) info_string + if (iost /= 0) then + write(unit=message(1),fmt='(A,I3,A,I3)') & + "Error",iost,"reading lightning obs header on unit",iunit + call da_warning(__FILE__,__LINE__,message(1:1)) + if (trace_use) call da_trace_exit("da_scan_obs_lightning") + return + end if + if (info_string(1:6) == 'data ') exit + end do head_info + + ! 2.4 read total lightning data info + read (unit=char_total_lightning (8:14),fmt='(I7)', iostat = iost) total_lightning + + ! 2.5 skip one line + read (unit=iunit, fmt = '(A)', iostat = iost) + + ! 3. read lightning data + reports: do n = 1, total_lightning + ! 3.1 read station general info + read (unit = iunit, iostat = iost, & + fmt = '(A12,1X,A19,1X,I6,2(F12.3,2X),F8.1,1X,A5)') & + platform%info%platform, & + platform%info%date_char, & + platform%info%levels, & + platform%info%lat, & + platform%info%lon, & + platform%info%elv, & + platform%info%id + + call da_llxy (platform%info, platform%loc, outside, outside_all) + +! Height information is from xb, get horizontal interpolation weights: + i1 = platform%loc%i + j1 = platform%loc%j + dx = platform%loc%dx + dy = platform%loc%dy + dxm = platform%loc%dxm + dym = platform%loc%dym + + ! 3.2 read lightning flash rate and its qc and error info + read (unit = iunit, fmt = '(F12.3,I4,F12.3,I4)') flashrate, lightning_qc, lightning_error, rh_indicator + + !turn lighting flash rate into the maximum wmax + if(flashrate .ge. min_flashrate .and. flashrate .le. min_flashrate+10.0)then + wmax = 5!14.6 + end if + if(flashrate .gt.min_flashrate+10.0 .and. flashrate .le. min_flashrate+20.0)then + wmax = 8!17.07 + end if + if(flashrate .gt.min_flashrate+20.0 .and. flashrate.le.min_flashrate+30.0)then + wmax = 12!18.67 + end if + if(flashrate .gt.min_flashrate+30.0)then + wmax = 15!24.4 !m/s + end if + + zlcl = 125.0*(grid%xb%t(i1,j1,1)-grid%xb%td(i1,j1,1)) + grid%xb%terr(i1,j1) + zlcl = amax1(grid%xb%terr(i1,j1)+1000.,zlcl) + zlcl = amin1(3000. ,zlcl) + + do i = 1, nlevels !vertical layers + platform%each(i) = lightning_each_level_type(missing_r, missing, -1.0, & + field_type(missing_r, missing, missing_r, missing, missing_r), & ! w + field_type(missing_r, missing, missing_r, missing, missing_r), & ! div + field_type(missing_r, missing, missing_r, missing, missing_r)) ! qv + + platform%each(i)%height = grid%xb%h(i1,j1,k) !height(i) + + if(flashrate .ge. min_flashrate .and. i .gt. 1) then + ! vertical velocity + platform%each(i)%w%inv = wmax*coff(i) + platform%each(i)%w%qc = 0 + platform%each(i)%w%error = amax1(1.0, 0.20*abs(platform%each(i)%w%inv)) + ! divergence + platform%each(i)%div%inv = -wmax*(coff(i)-coff(i-1))/(height(i)-height(i-1)) + platform%each(i)%div%qc = 0 + platform%each(i)%div%error = amax1(0.0001, 0.20*abs(platform%each(i)%div%inv)) + else + platform%each(i)%w%qc = missing_data + platform%each(i)%w%error = missing_r + platform%each(i)%div%qc = missing_data + platform%each(i)%div%error = missing_r + end if + + + if(flashrate .ge. 10.0 .and. rh_indicator .gt. -1 .and. height(i) .ge. zlcl .and. height(i) .le.15000)then + platform%each(i)%qv%inv = 0.01*(2*rh_indicator+lightning_min_rh)*grid%xb%qs(i1,j1,i) + platform%each(i)%qv%qc = 0 + platform%each(i)%qv%error = amax1(0.001,0.20*platform%each(i)%qv%inv) + else + platform%each(i)%qv%qc = missing_data + platform%each(i)%qv%error = missing_r + end if + end do !vertical layers + + if(outside)then + cycle + end if + nlocal = nlocal+1 + + iv%info(lightning)%levels(nlocal) = nlevels + iv%info(lightning)%name(nlocal) = platform%info%name + iv%info(lightning)%platform(nlocal) = platform%info%platform + iv%info(lightning)%id(nlocal) = platform%info%id + iv%info(lightning)%date_char(nlocal) = platform%info%date_char + iv%info(lightning)%lat(:,nlocal) = platform%info%lat + iv%info(lightning)%lon(:,nlocal) = platform%info%lon + iv%info(lightning)%elv(nlocal) = platform%info%elv + iv%info(lightning)%pstar(nlocal) = platform%info%pstar + + iv%info(lightning)%slp(nlocal) = platform%loc%slp + iv%info(lightning)%pw(nlocal) = platform%loc%pw + iv%info(lightning)%x(:,nlocal) = platform%loc%x + iv%info(lightning)%y(:,nlocal) = platform%loc%y + iv%info(lightning)%i(:,nlocal) = platform%loc%i + iv%info(lightning)%j(:,nlocal) = platform%loc%j + iv%info(lightning)%dx(:,nlocal) = platform%loc%dx + iv%info(lightning)%dxm(:,nlocal) = platform%loc%dxm + iv%info(lightning)%dy(:,nlocal) = platform%loc%dy + iv%info(lightning)%dym(:,nlocal) = platform%loc%dym + iv%info(lightning)%proc_domain(:,nlocal) = platform%loc%proc_domain + iv%info(lightning)%obs_global_index(nlocal) = nlocal + + allocate(iv%lightning(nlocal)%height(1:nlevels)) + allocate(iv%lightning(nlocal)%height_qc(1:nlevels)) + allocate(iv%lightning(nlocal)%w(1:nlevels)) + allocate(iv%lightning(nlocal)%qv(1:nlevels)) + allocate(iv%lightning(nlocal)%div(1:nlevels)) + + do i = 1, nlevels + iv%lightning(nlocal)%height(i) = platform%each(i)%height + iv%lightning(nlocal)%height_qc(i)= platform%each(i)%height_qc + iv%lightning(nlocal)%w(i) = platform%each(i)%w + iv%lightning(nlocal)%qv(i) = platform%each(i)%qv + iv%lightning(nlocal)%div(i) = platform%each(i)%div + end do + + end do reports + deallocate(height) + deallocate(coff) + close(iunit) + call da_free_unit(iunit) + + if (trace_use) call da_trace_exit("da_read_obs_lightning") + + +end subroutine da_read_obs_lightning diff --git a/var/da/da_obs_io/da_read_omb_tmp.inc b/var/da/da_obs_io/da_read_omb_tmp.inc index f4a0ad47ef..ff83dd642a 100644 --- a/var/da/da_obs_io/da_read_omb_tmp.inc +++ b/var/da/da_obs_io/da_read_omb_tmp.inc @@ -39,8 +39,10 @@ subroutine da_read_omb_tmp(filename,unit_in,num,obs_type_in,nc,if_wind_sd) spd_obs, spd_inv, spd_err, spd_inc, & ref_obs, ref_inv, ref_error, ref_inc, & eph_obs, eph_inv, eph_error, eph_inc, & - rain_obs, rain_inv, rain_error, rain_inc, zk - integer :: u_qc, v_qc, t_qc, p_qc, q_qc, tpw_qc, spd_qc, ref_qc, rain_qc + rain_obs, rain_inv, rain_error, rain_inc, zk, & + w_obs, w_inv, w_error, w_inc, & ! lightning + div_obs, div_inv, div_error, div_inc ! lightning + integer :: u_qc, v_qc, t_qc, p_qc, q_qc, tpw_qc, spd_qc, ref_qc, rain_qc, w_qc, div_qc #if (WRF_CHEM == 1) real :: chem_obs, chem_inv, chem_err, chem_inc, & chem_obs2, chem_inv2, chem_err2, chem_inc2, & @@ -453,6 +455,34 @@ subroutine da_read_omb_tmp(filename,unit_in,num,obs_type_in,nc,if_wind_sd) if (if_write) exit reports cycle reports + case ('lightning' ) + if (num_obs > 0) then + do n = 1, num_obs + read(unit_in,'(2i8)') levels, ifgat + if (if_write) then + write(omb_unit,'(2i8)')levels, ifgat + num = num + 1 + end if + do k = 1, levels + read(unit_in,'(2i8,a5,2f9.2,f17.7,3(2f17.7,i8,2f17.7))', err= 1000)& + kk,l, stn_id, & ! Station + lat, lon, height, & ! Lat/lon, height + w_obs, w_inv, w_qc, w_error, w_inc, & ! vertical velocity + div_obs, div_inv, div_qc, div_error, div_inc, & ! divergence + q_obs, q_inv, q_qc, q_error, q_inc ! water vapor + if (if_write) & + write(omb_unit,'(2i8,a5,2f9.2,f17.7,3(2f17.7,i8,2f17.7))', err= 1000)& + num,k,stn_id, & ! Station + lat, lon, height, & ! Lat/lon, height + w_obs, w_inv, w_qc, w_error, w_inc, & ! vertical velocity + div_obs, div_inv, div_qc, div_error, div_inc, & ! divergence + q_obs, q_inv, q_qc, q_error, q_inc ! water vapor + end do + end do + end if + if (if_write) exit reports + cycle reports + #if (WRF_CHEM == 1) case ('chem' ) if (num_obs > 0) then diff --git a/var/da/da_obs_io/da_scan_obs_lightning.inc b/var/da/da_obs_io/da_scan_obs_lightning.inc new file mode 100644 index 0000000000..d21f4304d2 --- /dev/null +++ b/var/da/da_obs_io/da_scan_obs_lightning.inc @@ -0,0 +1,130 @@ +subroutine da_scan_obs_lightning (iv, filename, grid) + + !--------------------------------------------------------------------------- + ! Purpose: Scan the lightning observation file + ! Authors: Z Chen (zchen@fjnu.edu.cn), Jenny Sun (NCAR), X Qie (IAP) + !--------------------------------------------------------------------------- + + implicit none + + type (iv_type), intent(inout) :: iv + character(len=*), intent(in) :: filename + type(domain), intent(in) :: grid ! first guess state. + + integer :: i, n, iost + integer :: iunit + + type (lightning_multi_level_type) :: platform + + character (len = 120) :: char_total_lightning, char_total_levels + character (len = 160) :: info_string + integer :: total_lightning, nlevels, lightning_qc, rh_indicator + real :: flashrate, lightning_error + real, allocatable,dimension(:):: height, coff + logical :: outside, outside_all + integer :: nlocal, ntotal + + if (trace_use) call da_trace_entry("da_scan_obs_lightning") + + nlocal = 0 + ntotal = 0 + + ! 1. open file + ! ============ + call da_get_unit(iunit) + open(unit = iunit, & + FILE = trim(filename), & + FORM = 'FORMATTED', & + ACCESS = 'SEQUENTIAL', & + iostat = iost, & + STATUS = 'OLD') + + if (iost /= 0) then + write(unit=message(1),fmt='(A,I5,A)') & + "Error",iost," opening lightning obs file "//trim(filename) + call da_warning(__FILE__,__LINE__,message(1:1)) + call da_free_unit(iunit) + if (trace_use) call da_trace_exit("da_scan_obs_lightning") + return + end if + + ! 2. read basic info + + ! 2.1 read the number of total lightning observation and vertical layers + read (unit=iunit, fmt = '(A)', iostat = iost) char_total_lightning + read (unit=iunit, fmt = '(A)', iostat = iost) char_total_levels + read (unit=char_total_levels(9:15),fmt='(I7)', iostat = iost) nlevels + + ! skip one line + read (unit=iunit, fmt = '(A)', iostat = iost) + + ! 2.2 read height and coefficient + allocate(height(nlevels)) + allocate(coff(nlevels)) + do i = 1, nlevels + read (unit = iunit, iostat = iost, fmt = '(2F12.3)') height(i), coff(i) + end do + + if (iost /= 0) then + ! Does matter if present and unreadable + call da_error(__FILE__,__LINE__, & + (/"Cannot read lightning file"/)) + end if + + ! 2.3 read header info + head_info: do + read (unit=iunit, fmt = '(A)', iostat = iost) info_string + if (iost /= 0) then + write(unit=message(1),fmt='(A,I3,A,I3)') & + "Error",iost,"reading lightning obs header on unit",iunit + call da_warning(__FILE__,__LINE__,message(1:1)) + if (trace_use) call da_trace_exit("da_scan_obs_lightning") + return + end if + if (info_string(1:6) == 'data ') exit + end do head_info + + ! 2.4 read total lightning data info + read (unit=char_total_lightning(8:14),fmt='(I7)', iostat = iost) total_lightning + + ! 2.5 skip one line + read (unit=iunit, fmt = '(A)', iostat = iost) + + + ! 3. read lightning data + reports: do n = 1, total_lightning + ! 3.1 read station general info + read (unit = iunit, iostat = iost, & + fmt = '(A12,1X,A19,1X,I6,2(F12.3,2X),F8.1,1X,A5)') & + platform%info%platform, & + platform%info%date_char, & + platform%info%levels, & + platform%info%lat, & + platform%info%lon, & + platform%info%elv, & + platform%info%id + + ! 3.2 read lightning flash rate and its qc and error info + read (unit = iunit, fmt = '(F12.3,I4,F12.3,I4)') flashrate, lightning_qc, lightning_error, rh_indicator + + call da_llxy (platform%info, platform%loc, outside, outside_all) + ntotal = ntotal + 1 + if(outside)then + cycle + end if + nlocal = nlocal + 1 + end do reports + + iv%info(lightning)%max_lev = nlevels + iv%info(lightning)%ntotal = ntotal + iv%info(lightning)%nlocal = nlocal + + deallocate(height) + deallocate(coff) + close (iunit) + call da_free_unit(iunit) + + if (trace_use) call da_trace_exit("da_scan_obs_lightning") + +end subroutine da_scan_obs_lightning + diff --git a/var/da/da_obs_io/da_search_obs.inc b/var/da/da_obs_io/da_search_obs.inc index b664655497..9fb3439960 100644 --- a/var/da/da_obs_io/da_search_obs.inc +++ b/var/da/da_obs_io/da_search_obs.inc @@ -740,6 +740,34 @@ subroutine da_search_obs (ob_type_string, unit_in, num_obs, nth, iv, found_flag) rewind (unit_in) read(unit_in,*) + CASE ('lightning') + + do n = 1, num_obs + read(unit_in,'(2i8,2E22.13)') n_dummy, levels, lat, lon + + if ( abs(iv%info(lightning)%lat(1,nth) - lat ) < MIN_ERR .and. & + abs(iv%info(lightning)%lon(1,nth) - lon ) < MIN_ERR ) then + + do k = 1, levels + read(unit_in,'(3(E22.13,i8,3E22.13))')& + iv%lightning(nth)%w(k),& + iv%lightning(nth)%div(k),& + iv%lightning(nth)%qv(k) + enddo + + !found_flag = .true. + rewind (unit_in) + read(unit_in,*) + if (trace_use) call da_trace_exit("da_search_obs") + return + else + read(unit_in,*) + endif + enddo + !found_flag = .false. + rewind (unit_in) + read(unit_in,*) + CASE default; write(unit=message(1), fmt='(a,a20,a,i3)') & diff --git a/var/da/da_obs_io/da_write_iv_for_multi_inc.inc b/var/da/da_obs_io/da_write_iv_for_multi_inc.inc index 1d359c7f5f..523a10cf95 100644 --- a/var/da/da_obs_io/da_write_iv_for_multi_inc.inc +++ b/var/da/da_obs_io/da_write_iv_for_multi_inc.inc @@ -890,6 +890,35 @@ subroutine da_write_iv_for_multi_inc(file_index, iv) end if ! nobs_tot > 0 + ! [26] lightning obs: + + if (iv%info(lightning)%plocal(iv%time) - iv%info(lightning)%plocal(iv%time-1) > 0) then + + open (unit=ounit,file=trim(filename)//'.lightning',form='formatted',status='replace', & + iostat=ios) + if (ios /= 0) then + call da_error(__FILE__,__LINE__, & + (/"Cannot open conventional observation omb file"//filename/)) + end if + + write(ounit,'(a20,i8)')'radar', iv%info(lightning)%plocal(iv%time) - & + iv%info(lightning)%plocal(iv%time-1) + do n = iv%info(lightning)%plocal(iv%time-1) + 1, & + iv%info(lightning)%plocal(iv%time) + write(ounit,'(2i8,2E22.13)')& + n, iv%info(lightning)%levels(n), & + iv%info(lightning)%lat(1,n), & ! Latitude + iv%info(lightning)%lon(1,n) ! Longitude + do k = 1 , iv%info(lightning)%levels(n) + write(ounit,'(E22.13,(E22.13,i8,3E22.13))')& + iv%lightning(n)%w(k) ,& ! lightning-w + iv%lightning(n)%div(k), & ! lightning-div + iv%lightning(n)%qv(k) ! lightning-qv + enddo + end do + close (ounit) + end if + !------------------------------------------------------------------------------- diff --git a/var/da/da_obs_io/da_write_obs.inc b/var/da/da_obs_io/da_write_obs.inc index 9d1ba17aa2..7148b480d2 100644 --- a/var/da/da_obs_io/da_write_obs.inc +++ b/var/da/da_obs_io/da_write_obs.inc @@ -935,6 +935,51 @@ subroutine da_write_obs(it,ob, iv, re) end if end do end if + + !! lightning + num_obs = 0 + do n = 1, iv%info(lightning)%nlocal + if (iv%info(lightning)%proc_domain(1,n)) num_obs = num_obs + 1 + end do + if (num_obs > 0) then + write(ounit,'(a20,i8)')'lightning', num_obs + num_obs = 0 + do n = 1, iv%info(lightning)%nlocal + do itime = 1, num_fgat_time + if ( n >= iv%info(lightning)%plocal(itime-1)+1 .and. & + n <= iv%info(lightning)%plocal(itime) ) then + ifgat = itime + exit + end if + end do + if (iv%info(lightning)%proc_domain(1,n)) then + num_obs = num_obs + 1 + write(ounit,'(2i8)')iv%info(lightning)%levels(n), ifgat + do k = 1, iv%info(lightning)%levels(n) + write(ounit,'(2i8,a5,2f9.2,f17.7,3(2f17.7,i8,2f17.7))')& + num_obs , k, iv%info(lightning)%id(n), & ! Station + iv%info(lightning)%lat(1,n), & ! Latitude + iv%info(lightning)%lon(1,n), & ! Longitude + iv%lightning(n)%height(k), & ! Obs Height + ob%lightning(n)%w(k), & + iv%lightning(n)%w(k)%inv, & + iv%lightning(n)%w(k)%qc, & + iv%lightning(n)%w(k)%error, & + re%lightning(n)%w(k), & + ob%lightning(n)%div(k), & + iv%lightning(n)%div(k)%inv, & + iv%lightning(n)%div(k)%qc, & + iv%lightning(n)%div(k)%error,& + re%lightning(n)%div(k), & + ob%lightning(n)%qv(k), & + iv%lightning(n)%qv(k)%inv, & + iv%lightning(n)%qv(k)%qc, & + iv%lightning(n)%qv(k)%error, & + re%lightning(n)%qv(k) + end do + end if + end do + end if close (ounit) call da_free_unit(ounit) diff --git a/var/da/da_setup_structures/da_setup_obs_structures.inc b/var/da/da_setup_structures/da_setup_obs_structures.inc index ebbd62457e..76573c9647 100644 --- a/var/da/da_setup_structures/da_setup_obs_structures.inc +++ b/var/da/da_setup_structures/da_setup_obs_structures.inc @@ -75,6 +75,10 @@ subroutine da_setup_obs_structures( grid, ob, iv, j_cost) use_radarobs = .false. use_radar_rv = .false. use_radar_rf = .false. + use_lightningobs = .false. + use_lightning_w = .false. + use_lightning_div = .false. + use_lightning_qv = .false. #if (WRF_CHEM == 1) use_chemic_surfobs = .false. #endif @@ -158,6 +162,10 @@ subroutine da_setup_obs_structures( grid, ob, iv, j_cost) use_radarobs = .false. use_radar_rv = .false. use_radar_rf = .false. + use_lightningobs = .false. + use_lightning_w = .false. + use_lightning_div = .false. + use_lightning_qv = .false. #if (WRF_CHEM == 1) use_chemic_surfobs = .false. #endif @@ -188,6 +196,7 @@ subroutine da_setup_obs_structures( grid, ob, iv, j_cost) if ( use_profilerobs ) obs_use(profiler) = .true. if ( use_qscatobs ) obs_use(qscat) = .true. if ( use_radarobs ) obs_use(radar) = .true. + if ( use_lightningobs ) obs_use(lightning) = .true. if ( use_rainobs ) obs_use(rain) = .true. if ( use_satemobs ) obs_use(satem) = .true. if ( use_shipsobs ) obs_use(ships) = .true. @@ -277,6 +286,7 @@ subroutine da_setup_obs_structures( grid, ob, iv, j_cost) thin_conv_opt(radar) = no_thin thin_conv_opt(radiance) = no_thin thin_conv_opt(rain) = no_thin + thin_conv_opt(lightning) = no_thin if ( thin_conv .and. ob_format==ob_format_bufr ) then ! gpsref horizontal thinning is not implemented for bufr input thin_conv_opt(gpsref) = no_thin @@ -392,6 +402,12 @@ subroutine da_setup_obs_structures( grid, ob, iv, j_cost) call da_setup_obs_structures_radar (grid, ob, iv) end if + if (use_lightningobs) then + ! Lightning obs are read from separate file(s) + call da_message((/'Using ASCII format lightning observation input'/)) + call da_setup_obs_structures_lightning (grid, ob, iv) + end if + if (use_rainobs .and. var4d) then call da_message((/'Using ASCII format precipitation observation input'/)) call da_setup_obs_structures_rain (grid, ob, iv) diff --git a/var/da/da_setup_structures/da_setup_obs_structures_ascii.inc b/var/da/da_setup_structures/da_setup_obs_structures_ascii.inc index 49fca83d9d..7a0e313a8d 100644 --- a/var/da/da_setup_structures/da_setup_obs_structures_ascii.inc +++ b/var/da/da_setup_structures/da_setup_obs_structures_ascii.inc @@ -81,7 +81,7 @@ subroutine da_setup_obs_structures_ascii( ob, iv, grid ) endif do i=1,num_ob_indexes - if (i == radar) cycle + if (i == radar .or. i == lightning) cycle iv%info(i)%plocal(iv%time) = iv%info(i)%nlocal iv%info(i)%ptotal(iv%time) = iv%info(i)%ntotal end do @@ -114,7 +114,7 @@ subroutine da_setup_obs_structures_ascii( ob, iv, grid ) end if do i=1,num_ob_indexes - if (i == radar) cycle + if (i == radar .or. i==lightning) cycle iv%info(i)%thin_ptotal(n) = iv%info(i)%thin_ntotal iv%info(i)%thin_plocal(n) = iv%info(i)%thin_nlocal end do @@ -134,7 +134,7 @@ subroutine da_setup_obs_structures_ascii( ob, iv, grid ) end if do i=1,num_ob_indexes - if (i == radar) cycle + if (i == radar .or. i == lightning) cycle iv%info(i)%thin_ptotal(iv%time) = iv%info(i)%thin_ntotal iv%info(i)%thin_plocal(iv%time) = iv%info(i)%thin_nlocal end do @@ -154,7 +154,7 @@ subroutine da_setup_obs_structures_ascii( ob, iv, grid ) if ( thin_conv_ascii ) then do i = 1, num_ob_indexes if ( thin_conv_opt(i) <= no_thin ) cycle - if (i == radar) cycle + if (i == radar .or. i == lightning) cycle if ( iv%info(i)%ntotal > 0 ) then if ( iv%info(i)%nlocal > 0 ) then if ( ANY(iv%info(i)%thinned(:,:)) ) then diff --git a/var/da/da_setup_structures/da_setup_obs_structures_lightning.inc b/var/da/da_setup_structures/da_setup_obs_structures_lightning.inc new file mode 100644 index 0000000000..9bafc27805 --- /dev/null +++ b/var/da/da_setup_structures/da_setup_obs_structures_lightning.inc @@ -0,0 +1,116 @@ +subroutine da_setup_obs_structures_lightning( grid, ob, iv ) + + !------------------------------------------------------------------------- + ! Purpose: Define, allocate and read lightning observation structure. + ! Authors: Z Chen (zchen@fjnu.edu.cn), Jenny Sun (NCAR), X Qie (IAP) + !------------------------------------------------------------------------- + + implicit none + + type (y_type), intent(out) :: ob ! Observation structure. + type (iv_type), intent(inout) :: iv ! O-B structure. + type (domain), intent(inout) :: grid ! First guess structure + + character(len=filename_len) :: filename + integer :: n, i, j, k + integer :: istart,iend,jstart,jend + real :: rlonlat(4) + + if (trace_use) call da_trace_entry("da_setup_obs_structures_lightning") + + call init_constants_derived + + !-------------------------------------------------------------------------- + ! [1.0] Scan lightning observation header and get number of obs: + !-------------------------------------------------------------------------- + if (num_fgat_time > 1) then + do n=1, num_fgat_time + + iv%time = n + filename = ' ' + + ! scan lightning observation file + write(filename(1:10), fmt='(a, i2.2, a)') 'ob', n,'.lightning' + call da_scan_obs_lightning(iv, filename, grid) + + iv%info(lightning)%plocal(n) = iv%info(lightning)%nlocal + iv%info(lightning)%ptotal(n) = iv%info(lightning)%ntotal + end do + else + iv%time = 1 + ! scan main body of lightning observation file + call da_scan_obs_lightning(iv, 'ob.lightning', grid) + iv%info(lightning)%plocal(iv%time) = iv%info(lightning)%nlocal + iv%info(lightning)%ptotal(iv%time) = iv%info(lightning)%ntotal + end if + + !-------------------------------------------------------------------------- + ! Allocate based on input number of obs: + !-------------------------------------------------------------------------- + ! This logic was originally found in da_allocate_observations; moved here + if (iv%info(lightning)%nlocal > 0) allocate(iv%lightning (1:iv%info(lightning)%nlocal)) + if (iv%info(lightning)%nlocal > 0) then + allocate (iv%info(lightning)%name(iv%info(lightning)%nlocal)) + allocate (iv%info(lightning)%platform(iv%info(lightning)%nlocal)) + allocate (iv%info(lightning)%id(iv%info(lightning)%nlocal)) + allocate (iv%info(lightning)%date_char(iv%info(lightning)%nlocal)) + allocate (iv%info(lightning)%levels(iv%info(lightning)%nlocal)) + allocate (iv%info(lightning)%lat(iv%info(lightning)%max_lev,iv%info(lightning)%nlocal)) + allocate (iv%info(lightning)%lon(iv%info(lightning)%max_lev,iv%info(lightning)%nlocal)) + allocate (iv%info(lightning)%elv(iv%info(lightning)%nlocal)) + allocate (iv%info(lightning)%pstar(iv%info(lightning)%nlocal)) + + allocate (iv%info(lightning)%slp(iv%info(lightning)%nlocal)) + allocate (iv%info(lightning)%pw(iv%info(lightning)%nlocal)) + + allocate (iv%info(lightning)%x (kms:kme,iv%info(lightning)%nlocal)) + allocate (iv%info(lightning)%y (kms:kme,iv%info(lightning)%nlocal)) + allocate (iv%info(lightning)%i (kms:kme,iv%info(lightning)%nlocal)) + allocate (iv%info(lightning)%j (kms:kme,iv%info(lightning)%nlocal)) + allocate (iv%info(lightning)%dx (kms:kme,iv%info(lightning)%nlocal)) + allocate (iv%info(lightning)%dxm(kms:kme,iv%info(lightning)%nlocal)) + allocate (iv%info(lightning)%dy (kms:kme,iv%info(lightning)%nlocal)) + allocate (iv%info(lightning)%dym(kms:kme,iv%info(lightning)%nlocal)) + allocate (iv%info(lightning)%k (iv%info(lightning)%max_lev,iv%info(lightning)%nlocal)) + allocate (iv%info(lightning)%dz (iv%info(lightning)%max_lev,iv%info(lightning)%nlocal)) + allocate (iv%info(lightning)%dzm(iv%info(lightning)%max_lev,iv%info(lightning)%nlocal)) + allocate (iv%info(lightning)%zk (iv%info(lightning)%max_lev,iv%info(lightning)%nlocal)) + allocate (iv%info(lightning)%proc_domain(iv%info(lightning)%max_lev,iv%info(lightning)%nlocal)) + allocate (iv%info(lightning)%obs_global_index(iv%info(lightning)%nlocal)) + allocate (iv%info(lightning)%thinned(iv%info(lightning)%max_lev,iv%info(lightning)%nlocal)) + + iv%info(lightning)%proc_domain(:,:) = .false. + iv%info(lightning)%thinned(:,:) = .false. + iv%info(lightning)%zk(:,:) = missing_r + end if + + if (num_fgat_time > 1) then + + do n=1, num_fgat_time + iv%time = n + filename = ' ' + + ! read lightning observation file + write(filename(1:10), fmt='(a, i2.2, a)') 'ob', n,'.lightning' + call da_read_obs_lightning(iv, filename, grid) + + end do + else + iv%time = 1 + + ! read lightning observation file + call da_read_obs_lightning(iv, 'ob.lightning', grid) + end if + + !-------------------------------------------------------------------------- + ! [3.0] Calculate innovation vector (O-B) and create (smaller) ob structure: + !-------------------------------------------------------------------------- + + call da_fill_obs_structures_lightning(iv, ob) + + iv%time = 1 + + if (trace_use) call da_trace_exit("da_setup_obs_structures_lightning") +end subroutine da_setup_obs_structures_lightning + + diff --git a/var/da/da_setup_structures/da_setup_structures.f90 b/var/da/da_setup_structures/da_setup_structures.f90 index 582a14a112..22997feacc 100644 --- a/var/da/da_setup_structures/da_setup_structures.f90 +++ b/var/da/da_setup_structures/da_setup_structures.f90 @@ -14,15 +14,15 @@ module da_setup_structures #endif multi_level_type,each_level_type, da_allocate_observations_rain use da_define_structures, only : da_allocate_obs_info, da_allocate_y, da_allocate_y_radar, & - da_allocate_y_rain + da_allocate_y_rain, da_allocate_y_lightning use da_wrf_interfaces, only : wrf_debug, & wrf_dm_bcast_string, wrf_dm_bcast_integer, wrf_dm_bcast_real use da_control, only : trace_use,vert_evalue,stdout,rootproc, myproc, & analysis_date,coarse_ix,coarse_ds,map_projection,coarse_jy, c2,dsm,phic, & pole, cone_factor, start_x,base_pres,ptop,psi1,start_y, base_lapse,base_temp,truelat2_3dv, & truelat1_3dv,xlonc,t0,num_fft_factors,pi,print_detail_spectral, global, print_detail_obs, & - use_radar_rf, use_radar_rhv, use_radar_rqv, radar_rf_opt, & - num_ob_indexes,kts, kte, time_window_max, time_window_min, & + use_radar_rf, use_radar_rhv, use_radar_rqv, radar_rf_opt, use_lightning_w, use_lightning_div, & + use_lightning_qv, num_ob_indexes,kts, kte, time_window_max, time_window_min, & max_fgat_time, num_fgat_time, dt_cloud_model, & use_ssmiretrievalobs,use_radarobs,use_ssmitbobs,use_qscatobs, num_procs, use_rainobs, & #if (WRF_CHEM == 1) @@ -32,7 +32,7 @@ module da_setup_structures num_pseudo, missing, ob_format, ob_format_bufr,ob_format_ascii, ob_format_madis, ob_format_gpsro, & use_airepobs, use_tamdarobs, test_dm_exact, use_amsuaobs, use_amsubobs, & use_airsobs, use_bogusobs, sfc_assi_options, use_eos_amsuaobs, & - use_filtered_rad, use_gpsrefobs, use_hirs2obs, & + use_filtered_rad, use_gpsrefobs, use_hirs2obs, use_lightningobs, & use_hsbobs,use_hirs3obs, use_gpspwobs, use_gpsztdobs, use_metarobs, use_msuobs, & use_kma1dvar,use_pilotobs, use_polaramvobs, use_rad, crtm_cloud, use_soundobs,use_mtgirsobs, & use_ssmt1obs,use_ssmt2obs, use_shipsobs, use_satemobs, use_synopobs, & @@ -57,7 +57,7 @@ module da_setup_structures vert_corr_2, alphacv_method_xa, vert_evalue_global, & vert_evalue_local, obs_names, thin_conv, thin_conv_ascii, & sound, sonde_sfc, mtgirs, tamdar, tamdar_sfc, synop, profiler, gpsref, gpspw, polaramv, geoamv, ships, metar, & - satem, radar, ssmi_rv, ssmi_tb, ssmt1, ssmt2, airsr, pilot, airep, rain, & + satem, radar, ssmi_rv, ssmi_tb, ssmt1, ssmt2, airsr, pilot, airep, rain, lightning, & bogus, buoy, qscat, radiance, pseudo, trace_use_dull, kts,kte, & use_simulated_rad, use_pseudo_rad, pseudo_rad_platid, pseudo_rad_satid, & pseudo_rad_senid, rtminit_nsensor, rtminit_platform, rtminit_satid, & @@ -89,11 +89,13 @@ module da_setup_structures #if (WRF_CHEM == 1) da_fill_obs_structures_chem_sfc, & #endif - da_fill_obs_structures_rain, da_fill_obs_structures_radar, da_set_obs_missing,da_set_3d_obs_missing + da_fill_obs_structures_rain, da_fill_obs_structures_radar, da_fill_obs_structures_lightning, & + da_set_obs_missing, da_set_3d_obs_missing use da_obs_io, only : da_read_obs_bufr,da_read_obs_radar, & da_scan_obs_radar,da_scan_obs_ascii,da_read_obs_ascii, & da_read_obs_bufrgpsro, da_scan_obs_rain, da_read_obs_rain, & da_read_obs_lsac, da_scan_obs_lsac, da_read_obs_bufrgpsro_eph, & + da_read_obs_lightning, da_scan_obs_lightning, & da_read_obs_bufr_satwnd, oetab #if (WRF_CHEM == 1) use da_obs_io, only : da_read_obs_chem_sfc, da_scan_obs_chem_sfc @@ -155,6 +157,7 @@ module da_setup_structures #include "da_setup_obs_structures_madis.inc" #include "da_setup_obs_structures_rain.inc" #include "da_setup_obs_structures_radar.inc" +#include "da_setup_obs_structures_lightning.inc" #include "da_setup_pseudo_obs.inc" #if (WRF_CHEM == 1) #include "da_setup_obs_structures_chem_sfc.inc" diff --git a/var/da/da_statistics/da_analysis_stats.inc b/var/da/da_statistics/da_analysis_stats.inc index 672946b14e..652dbc9ba3 100644 --- a/var/da/da_statistics/da_analysis_stats.inc +++ b/var/da/da_statistics/da_analysis_stats.inc @@ -29,7 +29,7 @@ use module_state_description, only : num_chem, PARAM_FIRST_SCALAR integer :: kdim ! k range real :: um, vm, tm, pm, qm , qcwm, qrnm ! On local domain. - real :: qcim, qsnm, qgrm + real :: qcim, qsnm, qgrm, wm real :: rij_g, rijk_g ! On global domain. type (maxmin_field_type) :: max_u(kts:kte), max_v(kts:kte), & @@ -45,6 +45,8 @@ use module_state_description, only : num_chem, PARAM_FIRST_SCALAR min_qcw(kts:kte), min_qrn(kts:kte), & min_qci(kts:kte), min_qsn(kts:kte), & min_qgr(kts:kte) + type (maxmin_field_type) :: max_w(kts:kte), min_w(kts:kte) + #if (WRF_CHEM == 1) type (maxmin_field_type) :: max_chem(kts:kte,num_chem), min_chem(kts:kte,num_chem) real :: chemm(num_chem), chemv(kts:kte,num_chem) @@ -57,6 +59,7 @@ use module_state_description, only : num_chem, PARAM_FIRST_SCALAR real :: qcwv(kts:kte), qrnv(kts:kte), & qciv(kts:kte), qsnv(kts:kte), & qgrv(kts:kte) + real :: wv(kts:kte) call da_trace_entry("da_analysis_stats") @@ -70,40 +73,78 @@ use module_state_description, only : num_chem, PARAM_FIRST_SCALAR if (rootproc) then write(unit=stats_unit, fmt='(/a/)') ' Minimum of gridded analysis increments' - select case ( cloud_cv_options ) - case ( 0 ) - write(unit=stats_unit, fmt='(6a/)') & - ' Lvl ', & - 'u i j ', & - 'v i j ', & - 't i j ', & - 'p i j ', & - 'q i j' - case ( 1 ) - write(unit=stats_unit, fmt='(8a/)') & - ' Lvl ', & - 'u i j ', & - 'v i j ', & - 't i j ', & - 'p i j ', & - 'q i j ', & - 'qcw i j ', & - 'qrn i j' - case ( 2, 3 ) - write(unit=stats_unit, fmt='(11a/)') & - ' Lvl ', & - 'u i j ', & - 'v i j ', & - 't i j ', & - 'p i j ', & - 'q i j ', & - 'qcw i j ', & - 'qrn i j ', & - 'qci i j ', & - 'qsn i j ', & - 'qgr i j' - end select - + if (use_cv_w) then + select case ( cloud_cv_options ) + case ( 0 ) + write(unit=stats_unit, fmt='(7a/)') & + ' Lvl ', & + 'u i j ', & + 'v i j ', & + 'w i j ', & + 't i j ', & + 'p i j ', & + 'q i j' + case ( 1 ) + write(unit=stats_unit, fmt='(8a/)') & + ' Lvl ', & + 'u i j ', & + 'v i j ', & + 'w i j ', & + 't i j ', & + 'p i j ', & + 'q i j ', & + 'qcw i j ', & + 'qrn i j' + case ( 2, 3 ) + write(unit=stats_unit, fmt='(12a/)') & + ' Lvl ', & + 'u i j ', & + 'v i j ', & + 'w i j ', & + 't i j ', & + 'p i j ', & + 'q i j ', & + 'qcw i j ', & + 'qrn i j ', & + 'qci i j ', & + 'qsn i j ', & + 'qgr i j' + end select + else + select case ( cloud_cv_options ) + case ( 0 ) + write(unit=stats_unit, fmt='(6a/)') & + ' Lvl ', & + 'u i j ', & + 'v i j ', & + 't i j ', & + 'p i j ', & + 'q i j' + case ( 1 ) + write(unit=stats_unit, fmt='(8a/)') & + ' Lvl ', & + 'u i j ', & + 'v i j ', & + 't i j ', & + 'p i j ', & + 'q i j ', & + 'qcw i j ', & + 'qrn i j' + case ( 2, 3 ) + write(unit=stats_unit, fmt='(11a/)') & + ' Lvl ', & + 'u i j ', & + 'v i j ', & + 't i j ', & + 'p i j ', & + 'q i j ', & + 'qcw i j ', & + 'qrn i j ', & + 'qci i j ', & + 'qsn i j ', & + 'qgr i j' + end select + end if #if (WRF_CHEM == 1) write(unit=stats_unit2, fmt='(/a/)') ' Minimum of gridded analysis increments' select case ( chem_cv_options ) @@ -162,6 +203,11 @@ use module_state_description, only : num_chem, PARAM_FIRST_SCALAR call da_proc_maxmin_combine(kdim, max_qgr, min_qgr) end if + if ( use_cv_w ) then + call da_maxmin_in_field(grid%xa%w(its:ite,jts:jte,kts:kte), max_w, min_w) + call da_proc_maxmin_combine(kdim, max_w, min_w) + end if + #if (WRF_CHEM == 1) if ( chem_cv_options >= 10 ) then do ic=PARAM_FIRST_SCALAR, num_chem @@ -183,6 +229,8 @@ use module_state_description, only : num_chem, PARAM_FIRST_SCALAR qsnm = 999999.0 qgrm = 999999.0 + wm = 999999.0 + #if (WRF_CHEM == 1) chemm = 999999.0 #endif @@ -190,20 +238,35 @@ use module_state_description, only : num_chem, PARAM_FIRST_SCALAR do k = kts, kte if (rootproc) then if ( abs(min_q(k)%value) < 1.e-30 ) min_q(k)%value = 0.0 - select case ( cloud_cv_options ) - case ( 0 ) - write(unit=stats_unit, fmt='(i4,4(f12.4,2i5),e12.4,2i5)') k, & - min_u(k), min_v(k), min_t(k), min_p(k), min_q(k) - case ( 1 ) - write(unit=stats_unit, fmt='(i4,4(f12.4,2i5),3(e12.4,2i5))') k, & - min_u(k), min_v(k), min_t(k), min_p(k), min_q(k), & - min_qcw(k), min_qrn(k) - case ( 2, 3 ) - write(unit=stats_unit, fmt='(i4,4(f12.4,2i5),6(e12.4,2i5))') k, & - min_u(k), min_v(k), min_t(k), min_p(k), min_q(k), & - min_qcw(k), min_qrn(k), min_qci(k), min_qsn(k), min_qgr(k) - end select - + if (use_cv_w) then + select case ( cloud_cv_options ) + case ( 0 ) + write(unit=stats_unit, fmt='(i4,5(f12.4,2i5),e12.4,2i5)') k, & + min_u(k), min_v(k), min_w(k), min_t(k), min_p(k), min_q(k) + case ( 1 ) + write(unit=stats_unit, fmt='(i4,5(f12.4,2i5),3(e12.4,2i5))') k, & + min_u(k), min_v(k), min_w(k), min_t(k), min_p(k), min_q(k), & + min_qcw(k), min_qrn(k) + case ( 2, 3 ) + write(unit=stats_unit, fmt='(i4,5(f12.4,2i5),6(e12.4,2i5))') k, & + min_u(k), min_v(k), min_w(k), min_t(k), min_p(k), min_q(k), & + min_qcw(k), min_qrn(k), min_qci(k), min_qsn(k), min_qgr(k) + end select + else + select case ( cloud_cv_options ) + case ( 0 ) + write(unit=stats_unit, fmt='(i4,4(f12.4,2i5),e12.4,2i5)') k, & + min_u(k), min_v(k), min_t(k), min_p(k), min_q(k) + case ( 1 ) + write(unit=stats_unit, fmt='(i4,4(f12.4,2i5),3(e12.4,2i5))') k, & + min_u(k), min_v(k), min_t(k), min_p(k), min_q(k), & + min_qcw(k), min_qrn(k) + case ( 2, 3 ) + write(unit=stats_unit, fmt='(i4,4(f12.4,2i5),6(e12.4,2i5))') k, & + min_u(k), min_v(k), min_t(k), min_p(k), min_q(k), & + min_qcw(k), min_qrn(k), min_qci(k), min_qsn(k), min_qgr(k) + end select + end if #if (WRF_CHEM == 1) select case ( chem_cv_options ) case ( 10 ) @@ -241,6 +304,9 @@ use module_state_description, only : num_chem, PARAM_FIRST_SCALAR qsnm=minval(min_qsn(:)%value) qgrm=minval(min_qgr(:)%value) end if + if ( use_cv_w ) then + wm=minval(min_w(:)%value) + end if end do #if (WRF_CHEM == 1) @@ -250,17 +316,31 @@ use module_state_description, only : num_chem, PARAM_FIRST_SCALAR #endif if (rootproc) then - select case ( cloud_cv_options ) - case ( 0 ) - write(unit=stats_unit, fmt='(a,4(f12.4,10x),e12.4)') ' ALL', & - um, vm, tm, pm, qm - case ( 1 ) - write(unit=stats_unit, fmt='(a,4(f12.4,10x),3(e12.4,10x))') ' ALL', & - um, vm, tm, pm, qm, qcwm, qrnm - case ( 2, 3 ) - write(unit=stats_unit, fmt='(a,4(f12.4,10x),6(e12.4,10x))') ' ALL', & - um, vm, tm, pm, qm, qcwm, qrnm, qcim, qsnm, qgrm - end select + if ( use_cv_w ) then + select case ( cloud_cv_options ) + case ( 0 ) + write(unit=stats_unit, fmt='(a,5(f12.4,10x),e12.4)') ' ALL', & + um, vm, wm, tm, pm, qm + case ( 1 ) + write(unit=stats_unit, fmt='(a,5(f12.4,10x),3(e12.4,10x))') ' ALL', & + um, vm, wm, tm, pm, qm, qcwm, qrnm + case ( 2, 3 ) + write(unit=stats_unit, fmt='(a,5(f12.4,10x),6(e12.4,10x))') ' ALL', & + um, vm, wm, tm, pm, qm, qcwm, qrnm, qcim, qsnm, qgrm + end select + else + select case ( cloud_cv_options ) + case ( 0 ) + write(unit=stats_unit, fmt='(a,4(f12.4,10x),e12.4)') ' ALL', & + um, vm, tm, pm, qm + case ( 1 ) + write(unit=stats_unit, fmt='(a,4(f12.4,10x),3(e12.4,10x))') ' ALL', & + um, vm, tm, pm, qm, qcwm, qrnm + case ( 2, 3 ) + write(unit=stats_unit, fmt='(a,4(f12.4,10x),6(e12.4,10x))') ' ALL', & + um, vm, tm, pm, qm, qcwm, qrnm, qcim, qsnm, qgrm + end select + end if #if (WRF_CHEM == 1) select case ( chem_cv_options ) @@ -305,57 +385,112 @@ use module_state_description, only : num_chem, PARAM_FIRST_SCALAR end select #endif - select case ( cloud_cv_options ) - case ( 0 ) - write(unit=stats_unit, fmt='(6a/)') & - ' Lvl ', & - 'u i j ', & - 'v i j ', & - 't i j ', & - 'p i j ', & - 'q i j' - case ( 1 ) - write(unit=stats_unit, fmt='(8a/)') & - ' Lvl ', & - 'u i j ', & - 'v i j ', & - 't i j ', & - 'p i j ', & - 'q i j ', & - 'qcw i j ', & - 'qrn i j' - case ( 2, 3 ) - write(unit=stats_unit, fmt='(11a/)') & - ' Lvl ', & - 'u i j ', & - 'v i j ', & - 't i j ', & - 'p i j ', & - 'q i j ', & - 'qcw i j ', & - 'qrn i j ', & - 'qci i j ', & - 'qsn i j ', & - 'qgr i j' - end select - end if !rootproc - - do k = kts, kte - if (rootproc) then - if ( abs(max_q(k)%value) < 1.e-30 ) max_q(k)%value = 0.0 + if (use_cv_w) then select case ( cloud_cv_options ) case ( 0 ) - write(unit=stats_unit, fmt='(i4,4(f12.4,2i5),e12.4,2i5)') k, & - max_u(k), max_v(k), max_t(k), max_p(k), max_q(k) + write(unit=stats_unit, fmt='(7a/)') & + ' Lvl ', & + 'u i j ', & + 'v i j ', & + 'w i j ', & + 't i j ', & + 'p i j ', & + 'q i j' case ( 1 ) - write(unit=stats_unit, fmt='(i4,4(f12.4,2i5),3(e12.4,2i5))') k, & - max_u(k), max_v(k), max_t(k), max_p(k), max_q(k), & - max_qcw(k), max_qrn(k) + write(unit=stats_unit, fmt='(8a/)') & + ' Lvl ', & + 'u i j ', & + 'v i j ', & + 'w i j ', & + 't i j ', & + 'p i j ', & + 'q i j ', & + 'qcw i j ', & + 'qrn i j' case ( 2, 3 ) - write(unit=stats_unit, fmt='(i4,4(f12.4,2i5),6(e12.4,2i5))') k, & - max_u(k), max_v(k), max_t(k), max_p(k), max_q(k), & - max_qcw(k), max_qrn(k), max_qci(k), max_qsn(k), max_qgr(k) + write(unit=stats_unit, fmt='(12a/)') & + ' Lvl ', & + 'u i j ', & + 'v i j ', & + 'w i j ', & + 't i j ', & + 'p i j ', & + 'q i j ', & + 'qcw i j ', & + 'qrn i j ', & + 'qci i j ', & + 'qsn i j ', & + 'qgr i j' end select + else + select case ( cloud_cv_options ) + case ( 0 ) + write(unit=stats_unit, fmt='(6a/)') & + ' Lvl ', & + 'u i j ', & + 'v i j ', & + 't i j ', & + 'p i j ', & + 'q i j' + case ( 1 ) + write(unit=stats_unit, fmt='(8a/)') & + ' Lvl ', & + 'u i j ', & + 'v i j ', & + 't i j ', & + 'p i j ', & + 'q i j ', & + 'qcw i j ', & + 'qrn i j' + case ( 2, 3 ) + write(unit=stats_unit, fmt='(11a/)') & + ' Lvl ', & + 'u i j ', & + 'v i j ', & + 't i j ', & + 'p i j ', & + 'q i j ', & + 'qcw i j ', & + 'qrn i j ', & + 'qci i j ', & + 'qsn i j ', & + 'qgr i j' + end select + end if + end if !rootproc + + do k = kts, kte + if (rootproc) then + if ( abs(max_q(k)%value) < 1.e-30 ) max_q(k)%value = 0.0 + if ( use_cv_w ) then + select case ( cloud_cv_options ) + case ( 0 ) + write(unit=stats_unit, fmt='(i4,5(f12.4,2i5),e12.4,2i5)') k, & + max_u(k), max_v(k), max_w(k), max_t(k), max_p(k), max_q(k) + case ( 1 ) + write(unit=stats_unit, fmt='(i4,5(f12.4,2i5),3(e12.4,2i5))') k, & + max_u(k), max_v(k), max_w(k), max_t(k), max_p(k), max_q(k), & + max_qcw(k), max_qrn(k) + case ( 2, 3 ) + write(unit=stats_unit, fmt='(i4,5(f12.4,2i5),6(e12.4,2i5))') k, & + max_u(k), max_v(k), max_w(k), max_t(k), max_p(k), max_q(k), & + max_qcw(k), max_qrn(k), max_qci(k), max_qsn(k), max_qgr(k) + end select + else + select case ( cloud_cv_options ) + case ( 0 ) + write(unit=stats_unit, fmt='(i4,4(f12.4,2i5),e12.4,2i5)') k, & + max_u(k), max_v(k), max_t(k), max_p(k), max_q(k) + case ( 1 ) + write(unit=stats_unit, fmt='(i4,4(f12.4,2i5),3(e12.4,2i5))') k, & + max_u(k), max_v(k), max_t(k), max_p(k), max_q(k), & + max_qcw(k), max_qrn(k) + case ( 2, 3 ) + write(unit=stats_unit, fmt='(i4,4(f12.4,2i5),6(e12.4,2i5))') k, & + max_u(k), max_v(k), max_t(k), max_p(k), max_q(k), & + max_qcw(k), max_qrn(k), max_qci(k), max_qsn(k), max_qgr(k) + end select + end if #if (WRF_CHEM == 1) select case ( chem_cv_options ) @@ -394,6 +529,9 @@ use module_state_description, only : num_chem, PARAM_FIRST_SCALAR qsnm=maxval(max_qsn(:)%value) qgrm=maxval(max_qgr(:)%value) end if + if (use_cv_w) then + wm=maxval(max_w(:)%value) + end if end do #if (WRF_CHEM == 1) @@ -403,18 +541,31 @@ use module_state_description, only : num_chem, PARAM_FIRST_SCALAR #endif if (rootproc) then - select case ( cloud_cv_options ) - case ( 0 ) - write(unit=stats_unit, fmt='(a,4(f12.4,10x),e12.4)') ' ALL', & - um, vm, tm, pm, qm - case ( 1 ) - write(unit=stats_unit, fmt='(a,4(f12.4,10x),3(e12.4,10x))') ' ALL', & - um, vm, tm, pm, qm, qcwm, qrnm - case ( 2, 3 ) - write(unit=stats_unit, fmt='(a,4(f12.4,10x),6(e12.4,10x))') ' ALL', & - um, vm, tm, pm, qm, qcwm, qrnm, qcim, qsnm, qgrm - end select - + if (use_cv_w) then + select case ( cloud_cv_options ) + case ( 0 ) + write(unit=stats_unit, fmt='(a,5(f12.4,10x),e12.4)') ' ALL', & + um, vm, wm, tm, pm, qm + case ( 1 ) + write(unit=stats_unit, fmt='(a,5(f12.4,10x),3(e12.4,10x))') ' ALL', & + um, vm, wm, tm, pm, qm, qcwm, qrnm + case ( 2, 3 ) + write(unit=stats_unit, fmt='(a,5(f12.4,10x),6(e12.4,10x))') ' ALL', & + um, vm, wm, tm, pm, qm, qcwm, qrnm, qcim, qsnm, qgrm + end select + else + select case ( cloud_cv_options ) + case ( 0 ) + write(unit=stats_unit, fmt='(a,4(f12.4,10x),e12.4)') ' ALL', & + um, vm, tm, pm, qm + case ( 1 ) + write(unit=stats_unit, fmt='(a,4(f12.4,10x),3(e12.4,10x))') ' ALL', & + um, vm, tm, pm, qm, qcwm, qrnm + case ( 2, 3 ) + write(unit=stats_unit, fmt='(a,4(f12.4,10x),6(e12.4,10x))') ' ALL', & + um, vm, tm, pm, qm, qcwm, qrnm, qcim, qsnm, qgrm + end select + end if #if (WRF_CHEM == 1) select case ( chem_cv_options ) case ( 10 ) @@ -447,17 +598,31 @@ use module_state_description, only : num_chem, PARAM_FIRST_SCALAR end select #endif - select case ( cloud_cv_options ) - case ( 0 ) - write(unit=stats_unit, fmt='(a/)') & - ' Lvl u v t p q' - case ( 1 ) - write(unit=stats_unit, fmt='(a/)') & - ' Lvl u v t p q qcw qrn' - case ( 2, 3 ) - write(unit=stats_unit, fmt='(a/)') & - ' Lvl u v t p q qcw qrn qci qsn qgr' - end select + if ( use_cv_w ) then + select case ( cloud_cv_options ) + case ( 0 ) + write(unit=stats_unit, fmt='(a/)') & + ' Lvl u v w t p q' + case ( 1 ) + write(unit=stats_unit, fmt='(a/)') & + ' Lvl u v w t p q qcw qrn' + case ( 2, 3 ) + write(unit=stats_unit, fmt='(a/)') & + ' Lvl u v w t p q qcw qrn qci qsn qgr' + end select + else + select case ( cloud_cv_options ) + case ( 0 ) + write(unit=stats_unit, fmt='(a/)') & + ' Lvl u v t p q' + case ( 1 ) + write(unit=stats_unit, fmt='(a/)') & + ' Lvl u v t p q qcw qrn' + case ( 2, 3 ) + write(unit=stats_unit, fmt='(a/)') & + ' Lvl u v t p q qcw qrn qci qsn qgr' + end select + end if end if !rootproc um = 0.0 @@ -515,26 +680,54 @@ use module_state_description, only : num_chem, PARAM_FIRST_SCALAR call da_proc_sum_real (qgrv) end if + if ( use_cv_w ) then + wm = 0.0 + do k = kts, kte + wv(k) = sum(grid%xa%w(its:ite,jts:jte,k)) + end do + call da_proc_sum_real (wv) + end if + if (rootproc) then do k = kts, kte - select case ( cloud_cv_options ) - case ( 0 ) - write(unit=stats_unit, fmt='(i4,4f12.4,e12.4)') k, & - uv(k)*rij_g, vv(k)*rij_g, tv(k)*rij_g, & - pv(k)*rij_g, qv(k)*rij_g - case ( 1 ) - write(unit=stats_unit, fmt='(i4,4f12.4,3e12.4)') k, & - uv(k)*rij_g, vv(k)*rij_g, tv(k)*rij_g, & - pv(k)*rij_g, qv(k)*rij_g, & - qcwv(k)*rij_g, qrnv(k)*rij_g - case ( 2, 3 ) - write(unit=stats_unit, fmt='(i4,4f12.4,6e12.4)') k, & - uv(k)*rij_g, vv(k)*rij_g, tv(k)*rij_g, & - pv(k)*rij_g, qv(k)*rij_g, & - qcwv(k)*rij_g, qrnv(k)*rij_g, qciv(k)*rij_g, & - qsnv(k)*rij_g, qgrv(k)*rij_g - end select - + if ( use_cv_w ) then + select case ( cloud_cv_options ) + case ( 0 ) + write(unit=stats_unit, fmt='(i4,5f12.4,e12.4)') k, & + uv(k)*rij_g, vv(k)*rij_g, wv(k)*rij_g, & + tv(k)*rij_g, pv(k)*rij_g, qv(k)*rij_g + case ( 1 ) + write(unit=stats_unit, fmt='(i4,5f12.4,3e12.4)') k, & + uv(k)*rij_g, vv(k)*rij_g, wv(k)*rij_g, & + tv(k)*rij_g, pv(k)*rij_g, qv(k)*rij_g, & + qcwv(k)*rij_g, qrnv(k)*rij_g + case ( 2, 3 ) + write(unit=stats_unit, fmt='(i4,5f12.4,6e12.4)') k, & + uv(k)*rij_g, vv(k)*rij_g, wv(k)*rij_g, & + tv(k)*rij_g, pv(k)*rij_g, qv(k)*rij_g, & + qcwv(k)*rij_g, qrnv(k)*rij_g, qciv(k)*rij_g, & + qsnv(k)*rij_g, qgrv(k)*rij_g + end select + else + select case ( cloud_cv_options ) + case ( 0 ) + write(unit=stats_unit, fmt='(i4,4f12.4,e12.4)') k, & + uv(k)*rij_g, vv(k)*rij_g, tv(k)*rij_g, & + pv(k)*rij_g, qv(k)*rij_g + case ( 1 ) + write(unit=stats_unit, fmt='(i4,4f12.4,3e12.4)') k, & + uv(k)*rij_g, vv(k)*rij_g, tv(k)*rij_g, & + pv(k)*rij_g, qv(k)*rij_g, & + qcwv(k)*rij_g, qrnv(k)*rij_g + case ( 2, 3 ) + write(unit=stats_unit, fmt='(i4,4f12.4,6e12.4)') k, & + uv(k)*rij_g, vv(k)*rij_g, tv(k)*rij_g, & + pv(k)*rij_g, qv(k)*rij_g, & + qcwv(k)*rij_g, qrnv(k)*rij_g, qciv(k)*rij_g, & + qsnv(k)*rij_g, qgrv(k)*rij_g + end select + end if + #if (WRF_CHEM == 1) select case ( chem_cv_options ) case ( 10 ) @@ -576,23 +769,42 @@ use module_state_description, only : num_chem, PARAM_FIRST_SCALAR qsnm = qsnm + qsnv(k) qgrm = qgrm + qgrv(k) end if + if ( use_cv_w ) then + wm=wm+wv(k) + end if end do !k loop end if !rootproc if (rootproc) then - select case ( cloud_cv_options ) - case ( 0 ) - write(unit=stats_unit, fmt='(a,4f12.4,e12.4)') ' ALL', & - um*rijk_g, vm*rijk_g, tm*rijk_g, pm*rijk_g, qm*rijk_g - case ( 1 ) - write(unit=stats_unit, fmt='(a,4f12.4,3e12.4)') ' ALL', & - um*rijk_g, vm*rijk_g, tm*rijk_g, pm*rijk_g, qm*rijk_g, & - qcwm*rijk_g, qrnm*rijk_g - case ( 2, 3 ) - write(unit=stats_unit, fmt='(a,4f12.4,6e12.4)') ' ALL', & - um*rijk_g, vm*rijk_g, tm*rijk_g, pm*rijk_g, qm*rijk_g, & - qcwm*rijk_g, qrnm*rijk_g, qcim*rijk_g, qsnm*rijk_g, qgrm*rijk_g - end select + if ( use_cv_w ) then + select case ( cloud_cv_options ) + case ( 0 ) + write(unit=stats_unit, fmt='(i4,6f12.4,e12.4)') k, & + um*rijk_g, vm*rijk_g, wm*rijk_g, tm*rijk_g, pm*rijk_g, qm*rijk_g + case ( 1 ) + write(unit=stats_unit, fmt='(i4,6f12.4,3e12.4)') k, & + um*rijk_g, vm*rijk_g, wm*rijk_g, tm*rijk_g, pm*rijk_g, qm*rijk_g, & + qcwm*rijk_g, qrnm*rijk_g + case ( 2, 3 ) + write(unit=stats_unit, fmt='(i4,5f12.4,6e12.4)') k, & + um*rijk_g, vm*rijk_g, wm*rijk_g, tm*rijk_g, pm*rijk_g, qm*rijk_g, & + qcwm*rijk_g, qrnm*rijk_g, qcim*rijk_g, qsnm*rijk_g, qgrm*rijk_g + end select + else + select case ( cloud_cv_options ) + case ( 0 ) + write(unit=stats_unit, fmt='(a,4f12.4,e12.4)') ' ALL', & + um*rijk_g, vm*rijk_g, tm*rijk_g, pm*rijk_g, qm*rijk_g + case ( 1 ) + write(unit=stats_unit, fmt='(a,4f12.4,3e12.4)') ' ALL', & + um*rijk_g, vm*rijk_g, tm*rijk_g, pm*rijk_g, qm*rijk_g, & + qcwm*rijk_g, qrnm*rijk_g + case ( 2, 3 ) + write(unit=stats_unit, fmt='(a,4f12.4,6e12.4)') ' ALL', & + um*rijk_g, vm*rijk_g, tm*rijk_g, pm*rijk_g, qm*rijk_g, & + qcwm*rijk_g, qrnm*rijk_g, qcim*rijk_g, qsnm*rijk_g, qgrm*rijk_g + end select + end if #if (WRF_CHEM == 1) select case ( chem_cv_options ) @@ -628,26 +840,43 @@ use module_state_description, only : num_chem, PARAM_FIRST_SCALAR end select #endif - select case ( cloud_cv_options ) - case ( 0 ) - write(unit=stats_unit, fmt='(a/)') & - ' Lvl u v t p q' - case ( 1 ) - write(unit=stats_unit, fmt='(a/)') & - ' Lvl u v t p q qcw qrn' - case ( 2, 3 ) - write(unit=stats_unit, fmt='(a/)') & - ' Lvl u v t p q qcw qrn qci qsn qgr' - end select + if ( use_cv_w ) then + select case ( cloud_cv_options ) + case ( 0 ) + write(unit=stats_unit, fmt='(a/)') & + ' Lvl u v w t p q' + case ( 1 ) + write(unit=stats_unit, fmt='(a/)') & + ' Lvl u v w t p q qcw qrn' + case ( 2, 3 ) + write(unit=stats_unit, fmt='(a/)') & + ' Lvl u v w t p q qcw qrn qci qsn qgr' + end select + else + select case ( cloud_cv_options ) + case ( 0 ) + write(unit=stats_unit, fmt='(a/)') & + ' Lvl u v t p q' + case ( 1 ) + write(unit=stats_unit, fmt='(a/)') & + ' Lvl u v t p q qcw qrn' + case ( 2, 3 ) + write(unit=stats_unit, fmt='(a/)') & + ' Lvl u v t p q qcw qrn qci qsn qgr' + end select + end if + end if !rootproc um = 0.0 vm = 0.0 + wm = 0.0 tm = 0.0 pm = 0.0 qm = 0.0 uv = 0.0 vv = 0.0 + wv = 0.0 tv = 0.0 pv = 0.0 qv = 0.0 @@ -725,40 +954,86 @@ use module_state_description, only : num_chem, PARAM_FIRST_SCALAR call da_proc_sum_real (qsnv) call da_proc_sum_real (qgrv) end if + + if ( use_cv_w ) then + do k = kts, kte + do j=jts,jte + do i=its,ite + wv(k) = wv(k) + grid%xa%w(i,j,k) * grid%xa%w(i,j,k) + end do + end do + end do + call da_proc_sum_real (wv) + end if if (rootproc) then do k = kts, kte - select case ( cloud_cv_options ) - case ( 0 ) - write(unit=stats_unit, fmt='(i4,4f12.4,e12.4)') k, & - sqrt(uv(k)*rij_g), & - sqrt(vv(k)*rij_g), & - sqrt(tv(k)*rij_g), & - sqrt(pv(k)*rij_g), & - sqrt(qv(k)*rij_g) - case ( 1 ) - write(unit=stats_unit, fmt='(i4,4f12.4,3e12.4)') k, & - sqrt(uv(k)*rij_g), & - sqrt(vv(k)*rij_g), & - sqrt(tv(k)*rij_g), & - sqrt(pv(k)*rij_g), & - sqrt(qv(k)*rij_g), & - sqrt(qcwv(k)*rij_g), & - sqrt(qrnv(k)*rij_g) - case ( 2, 3 ) - write(unit=stats_unit, fmt='(i4,4f12.4,6e12.4)') k, & - sqrt(uv(k)*rij_g), & - sqrt(vv(k)*rij_g), & - sqrt(tv(k)*rij_g), & - sqrt(pv(k)*rij_g), & - sqrt(qv(k)*rij_g), & - sqrt(qcwv(k)*rij_g), & - sqrt(qrnv(k)*rij_g), & - sqrt(qciv(k)*rij_g), & - sqrt(qsnv(k)*rij_g), & - sqrt(qgrv(k)*rij_g) - end select - + if ( use_cv_w ) then + select case ( cloud_cv_options ) + case ( 0 ) + write(unit=stats_unit, fmt='(i4,5f12.4,e12.4)') k, & + sqrt(uv(k)*rij_g), & + sqrt(vv(k)*rij_g), & + sqrt(wv(k)*rij_g), & + sqrt(tv(k)*rij_g), & + sqrt(pv(k)*rij_g), & + sqrt(qv(k)*rij_g) + case ( 1 ) + write(unit=stats_unit, fmt='(i4,5f12.4,3e12.4)') k, & + sqrt(uv(k)*rij_g), & + sqrt(vv(k)*rij_g), & + sqrt(wv(k)*rij_g), & + sqrt(tv(k)*rij_g), & + sqrt(pv(k)*rij_g), & + sqrt(qv(k)*rij_g), & + sqrt(qcwv(k)*rij_g), & + sqrt(qrnv(k)*rij_g) + case ( 2, 3 ) + write(unit=stats_unit, fmt='(i4,5f12.4,6e12.4)') k, & + sqrt(uv(k)*rij_g), & + sqrt(vv(k)*rij_g), & + sqrt(wv(k)*rij_g), & + sqrt(tv(k)*rij_g), & + sqrt(pv(k)*rij_g), & + sqrt(qv(k)*rij_g), & + sqrt(qcwv(k)*rij_g), & + sqrt(qrnv(k)*rij_g), & + sqrt(qciv(k)*rij_g), & + sqrt(qsnv(k)*rij_g), & + sqrt(qgrv(k)*rij_g) + end select + else + select case ( cloud_cv_options ) + case ( 0 ) + write(unit=stats_unit, fmt='(i4,4f12.4,e12.4)') k, & + sqrt(uv(k)*rij_g), & + sqrt(vv(k)*rij_g), & + sqrt(tv(k)*rij_g), & + sqrt(pv(k)*rij_g), & + sqrt(qv(k)*rij_g) + case ( 1 ) + write(unit=stats_unit, fmt='(i4,4f12.4,3e12.4)') k, & + sqrt(uv(k)*rij_g), & + sqrt(vv(k)*rij_g), & + sqrt(tv(k)*rij_g), & + sqrt(pv(k)*rij_g), & + sqrt(qv(k)*rij_g), & + sqrt(qcwv(k)*rij_g), & + sqrt(qrnv(k)*rij_g) + case ( 2, 3 ) + write(unit=stats_unit, fmt='(i4,4f12.4,6e12.4)') k, & + sqrt(uv(k)*rij_g), & + sqrt(vv(k)*rij_g), & + sqrt(tv(k)*rij_g), & + sqrt(pv(k)*rij_g), & + sqrt(qv(k)*rij_g), & + sqrt(qcwv(k)*rij_g), & + sqrt(qrnv(k)*rij_g), & + sqrt(qciv(k)*rij_g), & + sqrt(qsnv(k)*rij_g), & + sqrt(qgrv(k)*rij_g) + end select + end if #if (WRF_CHEM == 1) select case ( chem_cv_options ) case ( 10 ) @@ -805,27 +1080,50 @@ use module_state_description, only : num_chem, PARAM_FIRST_SCALAR qcim=qcim+qciv(k) qsnm=qsnm+qsnv(k) end if + if ( use_cv_w ) then + wm=wm+wv(k) + end if end do !k loop end if !rootproc if (rootproc) then - select case ( cloud_cv_options ) - case ( 0 ) - write(unit=stats_unit, fmt='(a,4f12.4,e12.4)') ' ALL', & - sqrt(um*rijk_g), sqrt(vm*rijk_g), sqrt(tm*rijk_g), & - sqrt(pm*rijk_g), sqrt(qm*rijk_g) - case ( 1 ) - write(unit=stats_unit, fmt='(a,4f12.4,3e12.4)') ' ALL', & - sqrt(um*rijk_g), sqrt(vm*rijk_g), sqrt(tm*rijk_g), & - sqrt(pm*rijk_g), sqrt(qm*rijk_g), & - sqrt(qcwm*rijk_g), sqrt(qrnm*rijk_g) - case ( 2, 3 ) - write(unit=stats_unit, fmt='(a,4f12.4,6e12.4)') ' ALL', & - sqrt(um*rijk_g), sqrt(vm*rijk_g), sqrt(tm*rijk_g), & - sqrt(pm*rijk_g), sqrt(qm*rijk_g), & - sqrt(qcwm*rijk_g), sqrt(qrnm*rijk_g), sqrt(qcim*rijk_g), & - sqrt(qsnm*rijk_g), sqrt(qgrm*rijk_g) - end select + if ( use_cv_w ) then + select case ( cloud_cv_options ) + case ( 0 ) + write(unit=stats_unit, fmt='(a,5f12.4,e12.4)') ' ALL', & + sqrt(um*rijk_g), sqrt(vm*rijk_g), sqrt(wm*rijk_g), & + sqrt(tm*rijk_g), sqrt(pm*rijk_g), sqrt(qm*rijk_g) + case ( 1 ) + write(unit=stats_unit, fmt='(a,5f12.4,3e12.4)') ' ALL', & + sqrt(um*rijk_g), sqrt(vm*rijk_g), sqrt(wm*rijk_g), & + sqrt(tm*rijk_g), sqrt(pm*rijk_g), sqrt(qm*rijk_g), & + sqrt(qcwm*rijk_g), sqrt(qrnm*rijk_g) + case ( 2, 3 ) + write(unit=stats_unit, fmt='(a,5f12.4,6e12.4)') ' ALL', & + sqrt(um*rijk_g), sqrt(vm*rijk_g), sqrt(wm*rijk_g), & + sqrt(tm*rijk_g), sqrt(pm*rijk_g), sqrt(qm*rijk_g), & + sqrt(qcwm*rijk_g), sqrt(qrnm*rijk_g), sqrt(qcim*rijk_g), & + sqrt(qsnm*rijk_g), sqrt(qgrm*rijk_g) + end select + else + select case ( cloud_cv_options ) + case ( 0 ) + write(unit=stats_unit, fmt='(a,4f12.4,e12.4)') ' ALL', & + sqrt(um*rijk_g), sqrt(vm*rijk_g), sqrt(tm*rijk_g), & + sqrt(pm*rijk_g), sqrt(qm*rijk_g) + case ( 1 ) + write(unit=stats_unit, fmt='(a,4f12.4,3e12.4)') ' ALL', & + sqrt(um*rijk_g), sqrt(vm*rijk_g), sqrt(tm*rijk_g), & + sqrt(pm*rijk_g), sqrt(qm*rijk_g), & + sqrt(qcwm*rijk_g), sqrt(qrnm*rijk_g) + case ( 2, 3 ) + write(unit=stats_unit, fmt='(a,4f12.4,6e12.4)') ' ALL', & + sqrt(um*rijk_g), sqrt(vm*rijk_g), sqrt(tm*rijk_g), & + sqrt(pm*rijk_g), sqrt(qm*rijk_g), & + sqrt(qcwm*rijk_g), sqrt(qrnm*rijk_g), sqrt(qcim*rijk_g), & + sqrt(qsnm*rijk_g), sqrt(qgrm*rijk_g) + end select + end if #if (WRF_CHEM == 1) select case ( chem_cv_options ) diff --git a/var/da/da_statistics/da_statistics.f90 b/var/da/da_statistics/da_statistics.f90 index 90f3bca9df..d8aca611b9 100644 --- a/var/da/da_statistics/da_statistics.f90 +++ b/var/da/da_statistics/da_statistics.f90 @@ -11,7 +11,7 @@ module da_statistics #if (WRF_CHEM == 1) chem_cv_options, & #endif - obs_names, ob_vars, filename_len, cloud_cv_options + obs_names, ob_vars, filename_len, cloud_cv_options, use_cv_w use da_define_structures, only : iv_type, maxmin_type, x_type, maxmin_field_type use da_par_util1, only : da_proc_sum_real, da_proc_sum_int, da_proc_sum_ints use da_par_util, only : da_proc_maxmin_combine diff --git a/var/da/da_test/da_check_xtoy_adjoint.inc b/var/da/da_test/da_check_xtoy_adjoint.inc index 6b966820ab..820897820c 100644 --- a/var/da/da_test/da_check_xtoy_adjoint.inc +++ b/var/da/da_test/da_check_xtoy_adjoint.inc @@ -338,6 +338,7 @@ print*,__FILE__,jte,' xa2_v.xa2_v for row= ',jte+1,sum(xa2_v(its:ite, jte+1, kts if (iv%info(airep)%nlocal > 0) call da_check_xtoy_adjoint_airep (iv, y, partial_lhs, pertile_lhs) if (iv%info(pilot)%nlocal > 0) call da_check_xtoy_adjoint_pilot (iv, y, partial_lhs, pertile_lhs) if (iv%info(radar)%nlocal > 0) call da_check_xtoy_adjoint_radar (iv, y, partial_lhs, pertile_lhs) + if (iv%info(lightning)%nlocal> 0) call da_check_xtoy_adjoint_lightning(iv, y, partial_lhs, pertile_lhs) if (iv%info(satem)%nlocal > 0) call da_check_xtoy_adjoint_satem (iv, y, partial_lhs, pertile_lhs) if (iv%info(metar)%nlocal > 0) call da_check_xtoy_adjoint_metar (iv, y, partial_lhs, pertile_lhs) if (iv%info(ships)%nlocal > 0) call da_check_xtoy_adjoint_ships (iv, y, partial_lhs, pertile_lhs) diff --git a/var/da/da_test/da_check_xtoy_adjoint_lightning.inc b/var/da/da_test/da_check_xtoy_adjoint_lightning.inc new file mode 100644 index 0000000000..bba61b3c13 --- /dev/null +++ b/var/da/da_test/da_check_xtoy_adjoint_lightning.inc @@ -0,0 +1,36 @@ +subroutine da_check_xtoy_adjoint_lightning(iv, y, adjtest_lhs, pertile_lhs) + + !----------------------------------------------------------------------- + ! Purpose: TBD + ! Authors: Z Chen (zchen@fjnu.edu.cn), Jenny Sun (NCAR), X Qie (IAP) + !----------------------------------------------------------------------- + + implicit none + + type (iv_type), intent(in) :: iv ! obs. inc. vector (o-b). + type (y_type) , intent(inout) :: y ! y = h (xa) + real , intent(inout) :: adjtest_lhs, pertile_lhs + + integer :: n, k ! Loop counter. + + if (trace_use_dull) call da_trace_entry("da_check_xtoy_adjoint_lightning") + + do n=iv%info(lightning)%n1, iv%info(lightning)%n2 + if (iv%info(lightning)%proc_domain(1,n)) then + do k=1, iv%info(lightning)%levels(n) + adjtest_lhs = adjtest_lhs + (y%lightning(n)%div(k)/typical_div_rms)**2 + (y%lightning(n)%qv(k)/typical_q_rms)**2 + end do + end if + + do k=1, iv%info(lightning)%levels(n) + pertile_lhs = pertile_lhs + (y%lightning(n)%qv(k)/typical_div_rms)**2 + (y%lightning(n)%qv(k)/typical_q_rms)**2 + y%lightning(n)%div(k) = y%lightning(n)%div(k)/typical_div_rms** 2 + y%lightning(n)%qv(k) = y%lightning(n)%qv(k)/typical_q_rms** 2 + end do + end do + + if (trace_use_dull) call da_trace_exit("da_check_xtoy_adjoint_lightning") + +end subroutine da_check_xtoy_adjoint_lightning + + diff --git a/var/da/da_test/da_get_y_lhs_value.inc b/var/da/da_test/da_get_y_lhs_value.inc index 41f4d014c7..c88b035a3a 100644 --- a/var/da/da_test/da_get_y_lhs_value.inc +++ b/var/da/da_test/da_get_y_lhs_value.inc @@ -26,6 +26,7 @@ subroutine da_get_y_lhs_value (iv, y, partial_lhs, pertile_lhs, adj_ttl_lhs) if (iv%info(airep)%nlocal > 0) call da_check_xtoy_adjoint_airep (iv, y, partial_lhs, pertile_lhs) if (iv%info(pilot)%nlocal > 0) call da_check_xtoy_adjoint_pilot (iv, y, partial_lhs, pertile_lhs) if (iv%info(radar)%nlocal > 0) call da_check_xtoy_adjoint_radar (iv, y, partial_lhs, pertile_lhs) + if (iv%info(lightning)%nlocal > 0) call da_check_xtoy_adjoint_lightning(iv, y, partial_lhs, pertile_lhs) if (iv%info(satem)%nlocal > 0) call da_check_xtoy_adjoint_satem (iv, y, partial_lhs, pertile_lhs) if (iv%info(metar)%nlocal > 0) call da_check_xtoy_adjoint_metar (iv, y, partial_lhs, pertile_lhs) if (iv%info(ships)%nlocal > 0) call da_check_xtoy_adjoint_ships (iv, y, partial_lhs, pertile_lhs) diff --git a/var/da/da_test/da_test.f90 b/var/da/da_test/da_test.f90 index a490164cfb..ba2711317c 100644 --- a/var/da/da_test/da_test.f90 +++ b/var/da/da_test/da_test.f90 @@ -24,7 +24,7 @@ module da_test use da_control, only : trace_use,ierr, trace_use_dull, comm,global,stdout,rootproc, & sfc_assi_options,typical_qrn_rms,typical_qci_rms,typical_qsn_rms,typical_qgr_rms,jcdfi_use, jcdfi_diag, & typical_u_rms,typical_v_rms,typical_w_rms,typical_t_rms, typical_p_rms, typical_rain_rms, & - typical_q_rms,typical_qcw_rms,print_detail_testing,typical_rh_rms, & + typical_q_rms,typical_qcw_rms,print_detail_testing,typical_rh_rms, typical_div_rms,& fg_format, fg_format_wrf_arw_global, fg_format_wrf_arw_regional,fg_format_wrf_nmm_regional, & typical_rf_rms,typical_rv_rms, typical_thickness_rms, typical_tb19v_rms,typical_tb37h_rms, & typical_tb85h_rms,typical_tb37v_rms,typical_tb85v_rms,typical_tb22v_rms, & @@ -35,10 +35,11 @@ module da_test balance_geocyc, var4d, num_fgat_time,cv_options_hum_specific_humidity, & cv_options_hum_relative_humidity, ids, ide, jds, jde, kds, kde, & sound, sonde_sfc, mtgirs, synop, profiler, gpsref, gpspw, polaramv, geoamv, ships, metar, & - satem, radar, ssmi_rv, ssmi_tb, ssmt1, ssmt2, airsr, pilot, airep, tamdar, tamdar_sfc, rain, & + satem, radar, lightning, ssmi_rv, ssmi_tb, ssmt1, ssmt2, airsr, pilot, airep, tamdar, tamdar_sfc, rain, & bogus, buoy, qscat, pseudo, radiance, use_radarobs, use_ssmiretrievalobs,use_rainobs, & - use_gpsrefobs, use_ssmt1obs, use_ssmitbobs, use_ssmt2obs, use_gpspwobs, & + use_gpsrefobs, use_ssmt1obs, use_ssmitbobs, use_ssmt2obs, use_gpspwobs, use_lightningobs, & use_gpsztdobs, use_radar_rf, use_radar_rhv, use_rad, crtm_cloud, cloud_cv_options, & + use_lightning_qv, use_lightning_w, use_lightning_div, & ids,ide,jds,jde,kds,kde, ims,ime,jms,jme,kms,kme, fgat_rain_flags, & its,ite,jts,jte,kts,kte, ips,ipe,jps,jpe,kps,kpe, cv_options, cv_size, & cloud_cv_options, cp, gas_constant, test_dm_exact, cv_size_domain, & @@ -132,6 +133,7 @@ module da_test #include "da_check_xtoy_adjoint_ships.inc" #include "da_check_xtoy_adjoint_radar.inc" #include "da_check_xtoy_adjoint_rain.inc" +#include "da_check_xtoy_adjoint_lightning.inc" #include "da_check_xtoy_adjoint_bogus.inc" #include "da_check_xtoy_adjoint_sound.inc" #include "da_check_xtoy_adjoint_sonde_sfc.inc"