diff --git a/Registry/registry.var b/Registry/registry.var index 5524d7446f..34575249f5 100644 --- a/Registry/registry.var +++ b/Registry/registry.var @@ -457,6 +457,7 @@ rconfig integer pseudo_time namelist,wrfvar15 1 1 - "ps rconfig real pseudo_val namelist,wrfvar15 1 1.0 - "pseudo_val" "" "" rconfig real pseudo_err namelist,wrfvar15 1 1.0 - "pseudo_err" "" "" rconfig real pseudo_elv namelist,wrfvar15 1 -999.99 - "pseudo_elv" "pseudo ob elevation, used by pseudo tpw/ztd" "m" +rconfig integer ep_format namelist,wrfvar16 1 1 - "ep_format" "format of ensemble perturbation" "1=original,11=original but in real4,2=new full-domain,3=new subdomain" rconfig integer ep_para_read namelist,wrfvar16 1 0 - "ep_para_read" "how the ensemble perturbations are read" "0: serial read, 1: parallel read" rconfig integer rden_bin namelist,wrfvar16 1 1 - "rden_bin" "number of bins/batches to read ensemble perturbations in parallel" "" rconfig integer alphacv_method namelist,wrfvar16 1 2 - "alphacv_method" "" "" diff --git a/var/build/depend.txt b/var/build/depend.txt index 438b62951e..7d267ecc8e 100644 --- a/var/build/depend.txt +++ b/var/build/depend.txt @@ -153,7 +153,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_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_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 diff --git a/var/da/da_main/da_solve.inc b/var/da/da_main/da_solve.inc index 84479e75f1..22a9655531 100644 --- a/var/da/da_main/da_solve.inc +++ b/var/da/da_main/da_solve.inc @@ -56,7 +56,10 @@ integer :: cvt_unit, iost character(len=8) :: cvtfile logical :: ex - + + character(len=10) :: this_time + character(len=8) :: this_date + if (trace_use) call da_trace_entry("da_solve") #ifdef DM_PARALLEL @@ -534,17 +537,52 @@ grid % ep % ne = be % ne if (use_background_errors .and. be % ne > 0) then -! call da_setup_flow_predictors ( ide, jde, kde, be % ne, grid%ep, & -! its, ite, jts, jte, kts, kte ) - select case ( ep_para_read ) - case ( 0 ) ! serial read (default) - call da_setup_flow_predictors ( ide_ens, jde_ens, kde_ens, be % ne, grid%ep, & - its_int, ite_int, jts_int, jte_int, kts_int, kte_int ) - case ( 1 ) ! para_read_opt1, breaks total number of ep into reading bins - call da_setup_flow_predictors_para_read_opt1 ( & - ide_ens, jde_ens, kde_ens, be % ne, grid%ep, & - its_int, ite_int, jts_int, jte_int, kts_int, kte_int ) + + call date_and_time(date=this_date, time=this_time) + write(unit=message(1),fmt='(a,a8,1x,a12)') & + ' Begin reading ensemble perturbations at ', this_date, & + this_time(1:2)//':'//this_time(3:4)//' '//this_time(5:10) + call da_message(message(1:1)) + + select case ( ep_format ) + case ( 1 ) ! original behavior + if ( ep_para_read == 0 ) then + ! each ep file is for one variable and one member + call da_setup_flow_predictors ( & + ide_ens, jde_ens, kde_ens, be % ne, grid%ep, & + its_int, ite_int, jts_int, jte_int, kts_int, kte_int ) + else if ( ep_para_read == 1 ) then + ! para_read_opt1, breaks total number of ep into reading bins + call da_setup_flow_predictors_para_read_opt1 ( & + ide_ens, jde_ens, kde_ens, be % ne, grid%ep, & + its_int, ite_int, jts_int, jte_int, kts_int, kte_int ) + end if + case ( 11 ) + ! similar to ep_format=1 except data are in single precision + ! each ep file is for one variable and one member + call da_setup_flow_predictors ( & + ide_ens, jde_ens, kde_ens, be % ne, grid%ep, & + its_int, ite_int, jts_int, jte_int, kts_int, kte_int ) + case ( 2 ) + ! full-domain + ! each ep file in single precision is for one variable and all members + call da_setup_flow_predictors_ep_format2 ( & + ide_ens, jde_ens, kde_ens, be % ne, grid%ep, & + its_int, ite_int, jts_int, jte_int, kts_int, kte_int ) + case ( 3 ) + ! decomposed sub-domain + ! each ep file in single precision is for one variable and all members + call da_setup_flow_predictors_ep_format3 ( & + ide_ens, jde_ens, kde_ens, be % ne, grid%ep, & + its_int, ite_int, jts_int, jte_int, kts_int, kte_int ) end select + + call date_and_time(date=this_date, time=this_time) + write(unit=message(1),fmt='(a,a8,1x,a12)') & + ' Fihish reading ensemble perturbations at ', this_date, & + this_time(1:2)//':'//this_time(3:4)//' '//this_time(5:10) + call da_message(message(1:1)) + end if !--------------------------------------------------------------------------- diff --git a/var/da/da_main/da_wrfvar_top.f90 b/var/da/da_main/da_wrfvar_top.f90 index 25bc9618a9..c794911105 100644 --- a/var/da/da_main/da_wrfvar_top.f90 +++ b/var/da/da_main/da_wrfvar_top.f90 @@ -69,6 +69,7 @@ module da_wrfvar_top da_setup_background_errors,da_setup_flow_predictors, & da_setup_cv, da_scale_background_errors, da_scale_background_errors_cv3 use da_setup_structures, only : da_setup_flow_predictors_para_read_opt1 + use da_setup_structures, only : da_setup_flow_predictors_ep_format2, da_setup_flow_predictors_ep_format3 use da_test, only : da_check, da_check_gradient use da_tools_serial, only : da_get_unit, da_free_unit use da_tracing, only : da_trace_entry, da_trace_exit, da_trace, da_trace_report diff --git a/var/da/da_setup_structures/da_setup_flow_predictors.inc b/var/da/da_setup_structures/da_setup_flow_predictors.inc index d1ac1aa917..16fa85bbb9 100644 --- a/var/da/da_setup_structures/da_setup_flow_predictors.inc +++ b/var/da/da_setup_structures/da_setup_flow_predictors.inc @@ -19,12 +19,17 @@ subroutine da_setup_flow_predictors( ix, jy, kz, ne, ep, its, ite, jts, jte, kts integer :: ni, nj, nk ! Grid dimensions. integer :: e ! Loop counter logical :: ldum1, ldum2,nkdum ! Dummy. - real :: temp3d(1:ix,1:jy,1:kz)! Temporary, real*4 array. - real :: temp2d(1:ix,1:jy) ! Temporary, real*4 array. + real*4, allocatable :: temp3d_r4(:,:,:) ! Temporary, real*4 array + real*4, allocatable :: temp2d_r4(:,:) ! Temporary, real*4 array + real, allocatable :: temp3d(:,:,:) ! Temporary array + real, allocatable :: temp2d(:,:) ! Temporary array real :: ens_scaling_inv ! Ensemble scaling of perturbations. integer :: ep_unit,t,te,nte,it,ie + integer :: ijk + integer, parameter :: is_r8 = 1 + integer, parameter :: is_r4 = 11 if (trace_use) call da_trace_entry("da_setup_flow_predictors") @@ -33,6 +38,7 @@ subroutine da_setup_flow_predictors( ix, jy, kz, ne, ep, its, ite, jts, jte, kts call da_message((/"Set up flow-dependent information"/)) ep % ne = ne + ijk = ix * jy * kz ens_scaling_inv = 1.0 if (ne > 1) ens_scaling_inv = 1.0 / sqrt(real(ne-1)) @@ -44,6 +50,13 @@ subroutine da_setup_flow_predictors( ix, jy, kz, ne, ep, its, ite, jts, jte, kts var(3) = 't' var(4) = 'q' var(5) = 'ps' + if ( ep_format == is_r4 ) then + var(1) = 'U' + var(2) = 'V' + var(3) = 'T' + var(4) = 'QVAPOR' + var(5) = 'PSFC' + end if else ! vp space var(1) = 'psi' var(2) = 'chi_u' @@ -64,6 +77,13 @@ subroutine da_setup_flow_predictors( ix, jy, kz, ne, ep, its, ite, jts, jte, kts ep_dir_name(1) = 'ep' end if + if ( rootproc .and. ep_format == is_r4 ) then + allocate(temp3d_r4(1:ix,1:jy,1:kz)) + allocate(temp2d_r4(1:ix,1:jy)) + end if + allocate(temp3d(1:ix,1:jy,1:kz)) + allocate(temp2d(1:ix,1:jy)) + !--------------------------------------------------------------------------- ! Input ensemble perturbations !--------------------------------------------------------------------------- @@ -81,58 +101,98 @@ subroutine da_setup_flow_predictors( ix, jy, kz, ne, ep, its, ite, jts, jte, kts ! v1: filename = trim(ep_dir_name(it))//'/'//trim(var(1))//'.e'//trim(ce) - open(unit=ep_unit, file = filename, form = 'unformatted', status = 'old') - read(unit=ep_unit) ni, nj, nk - - if (ni /= ix .or. nj /= jy .or. nk /= kz) then - write(unit=message(1),fmt='(a)') & - 'Inconsistent grid dimensions' - write(unit=message(2),fmt='(a,3i6)') & - ' Grid dims for analysis grid: ', ix, jy - write(unit=message(3),fmt='(a,3i6)') & - ' Grid dims for flow predictors: ', ni, nj - call da_warning(__FILE__,__LINE__,message(1:3)) - end if + if ( rootproc ) then + open(unit=ep_unit, file = filename, form = 'unformatted', status = 'old') + read(unit=ep_unit) ni, nj, nk + + if (ni /= ix .or. nj /= jy .or. nk /= kz) then + write(unit=message(1),fmt='(a)') & + 'Inconsistent grid dimensions' + write(unit=message(2),fmt='(a,3i6)') & + ' Grid dims for analysis grid: ', ix, jy + write(unit=message(3),fmt='(a,3i6)') & + ' Grid dims for flow predictors: ', ni, nj + call da_warning(__FILE__,__LINE__,message(1:3)) + end if - read(unit=ep_unit) temp3d(1:ix,1:jy,1:kz) - close(unit=ep_unit) + if ( ep_format == is_r8 ) then + read(unit=ep_unit) temp3d(1:ix,1:jy,1:kz) + else if ( ep_format == is_r4 ) then + read(unit=ep_unit) temp3d_r4(1:ix,1:jy,1:kz) + temp3d = temp3d_r4 + end if + close(unit=ep_unit) + end if + call wrf_dm_bcast_real(temp3d, ijk) ep % v1(its:ite,jts:jte,kts:kte,te) = ens_scaling_inv * & temp3d(its:ite,jts:jte,kts:kte) ! v2: filename = trim(ep_dir_name(it))//'/'//trim(var(2))//'.e'//trim(ce) - open(unit=ep_unit, file = filename, form = 'unformatted', status = 'old') - read(unit=ep_unit) ni, nj, nk - read(unit=ep_unit) temp3d(1:ix,1:jy,1:kz) + if ( rootproc ) then + open(unit=ep_unit, file = filename, form = 'unformatted', status = 'old') + read(unit=ep_unit) ni, nj, nk + if ( ep_format == is_r8 ) then + read(unit=ep_unit) temp3d(1:ix,1:jy,1:kz) + else if ( ep_format == is_r4 ) then + read(unit=ep_unit) temp3d_r4(1:ix,1:jy,1:kz) + temp3d = temp3d_r4 + end if + close(unit=ep_unit) + end if + call wrf_dm_bcast_real(temp3d, ijk) ep % v2(its:ite,jts:jte,kts:kte,te) = ens_scaling_inv * & temp3d(its:ite,jts:jte,kts:kte) - close(unit=ep_unit) ! v3: filename = trim(ep_dir_name(it))//'/'//trim(var(3))//'.e'//trim(ce) - open(unit=ep_unit, file = filename, form = 'unformatted', status = 'old') - read(unit=ep_unit) ni, nj, nk - read(unit=ep_unit) temp3d(1:ix,1:jy,1:kz) + if ( rootproc ) then + open(unit=ep_unit, file = filename, form = 'unformatted', status = 'old') + read(unit=ep_unit) ni, nj, nk + if ( ep_format == is_r8 ) then + read(unit=ep_unit) temp3d(1:ix,1:jy,1:kz) + else if ( ep_format == is_r4 ) then + read(unit=ep_unit) temp3d_r4(1:ix,1:jy,1:kz) + temp3d = temp3d_r4 + end if + close(unit=ep_unit) + end if + call wrf_dm_bcast_real(temp3d, ijk) ep % v3(its:ite,jts:jte,kts:kte,te) = ens_scaling_inv * & temp3d(its:ite,jts:jte,kts:kte) - close(unit=ep_unit) ! v4: filename = trim(ep_dir_name(it))//'/'//trim(var(4))//'.e'//trim(ce) - open(unit=ep_unit, file = filename, form = 'unformatted', status = 'old') - read(unit=ep_unit) ni, nj, nk - read(unit=ep_unit) temp3d(1:ix,1:jy,1:kz) + if ( rootproc ) then + open(unit=ep_unit, file = filename, form = 'unformatted', status = 'old') + read(unit=ep_unit) ni, nj, nk + if ( ep_format == is_r8 ) then + read(unit=ep_unit) temp3d(1:ix,1:jy,1:kz) + else if ( ep_format == is_r4 ) then + read(unit=ep_unit) temp3d_r4(1:ix,1:jy,1:kz) + temp3d = temp3d_r4 + end if + close(unit=ep_unit) + end if + call wrf_dm_bcast_real(temp3d, ijk) ep % v4(its:ite,jts:jte,kts:kte,te) = ens_scaling_inv * & temp3d(its:ite,jts:jte,kts:kte) - close(unit=ep_unit) ! v5: filename = trim(ep_dir_name(it))//'/'//trim(var(5))//'.e'//trim(ce) - open(unit=ep_unit, file = filename, form = 'unformatted', status = 'old') - read(unit=ep_unit) ni, nj, nkdum - read(unit=ep_unit) temp2d(1:ix,1:jy) + if ( rootproc ) then + open(unit=ep_unit, file = filename, form = 'unformatted', status = 'old') + read(unit=ep_unit) ni, nj, nkdum + if ( ep_format == is_r8 ) then + read(unit=ep_unit) temp2d(1:ix,1:jy) + else if ( ep_format == is_r4 ) then + read(unit=ep_unit) temp2d_r4(1:ix,1:jy) + temp2d = temp2d_r4 + end if + close(unit=ep_unit) + end if + call wrf_dm_bcast_real(temp2d, ix*jy) ep % v5(its:ite,jts:jte,1,te) = ens_scaling_inv * temp2d(its:ite,jts:jte) - close(unit=ep_unit) end do ! num_fgat_time*ne loop @@ -152,57 +212,136 @@ subroutine da_setup_flow_predictors( ix, jy, kz, ne, ep, its, ite, jts, jte, kts write(unit=ce,fmt='(i3.3)') ie - filename = trim(ep_dir_name(it))//'/'//'qcloud'//'.e'//trim(ce) - open(unit=ep_unit, file = filename, form = 'unformatted', status = 'old') - read(unit=ep_unit) ni, nj, nk - read(unit=ep_unit) temp3d(1:ix,1:jy,1:kz) + if ( ep_format == is_r8 ) then + filename = trim(ep_dir_name(it))//'/'//'qcloud'//'.e'//trim(ce) + else if ( ep_format == is_r4 ) then + filename = trim(ep_dir_name(it))//'/'//'QCLOUD'//'.e'//trim(ce) + end if + if ( rootproc ) then + open(unit=ep_unit, file = filename, form = 'unformatted', status = 'old') + read(unit=ep_unit) ni, nj, nk + if ( ep_format == is_r8 ) then + read(unit=ep_unit) temp3d(1:ix,1:jy,1:kz) + else if ( ep_format == is_r4 ) then + read(unit=ep_unit) temp3d_r4(1:ix,1:jy,1:kz) + temp3d = temp3d_r4 + end if + close(unit=ep_unit) + end if + call wrf_dm_bcast_real(temp3d, ijk) ep % cw(its:ite,jts:jte,kts:kte,te) = ens_scaling_inv * temp3d(its:ite,jts:jte,kts:kte) - close(unit=ep_unit) - filename = trim(ep_dir_name(it))//'/'//'qrain'//'.e'//trim(ce) - open(unit=ep_unit, file = filename, form = 'unformatted', status = 'old') - read(unit=ep_unit) ni, nj, nk - read(unit=ep_unit) temp3d(1:ix,1:jy,1:kz) + if ( ep_format == is_r8 ) then + filename = trim(ep_dir_name(it))//'/'//'qrain'//'.e'//trim(ce) + else if ( ep_format == is_r4 ) then + filename = trim(ep_dir_name(it))//'/'//'QRAIN'//'.e'//trim(ce) + end if + if ( rootproc ) then + open(unit=ep_unit, file = filename, form = 'unformatted', status = 'old') + read(unit=ep_unit) ni, nj, nk + if ( ep_format == is_r8 ) then + read(unit=ep_unit) temp3d(1:ix,1:jy,1:kz) + else if ( ep_format == is_r4 ) then + read(unit=ep_unit) temp3d_r4(1:ix,1:jy,1:kz) + temp3d = temp3d_r4 + end if + close(unit=ep_unit) + end if + call wrf_dm_bcast_real(temp3d, ijk) ep % rn(its:ite,jts:jte,kts:kte,te) = ens_scaling_inv * temp3d(its:ite,jts:jte,kts:kte) - close(unit=ep_unit) - filename = trim(ep_dir_name(it))//'/'//'qice'//'.e'//trim(ce) - open(unit=ep_unit, file = filename, form = 'unformatted', status = 'old') - read(unit=ep_unit) ni, nj, nk - read(unit=ep_unit) temp3d(1:ix,1:jy,1:kz) + if ( ep_format == is_r8 ) then + filename = trim(ep_dir_name(it))//'/'//'qice'//'.e'//trim(ce) + else if ( ep_format == is_r4 ) then + filename = trim(ep_dir_name(it))//'/'//'QICE'//'.e'//trim(ce) + end if + if ( rootproc ) then + open(unit=ep_unit, file = filename, form = 'unformatted', status = 'old') + read(unit=ep_unit) ni, nj, nk + if ( ep_format == is_r8 ) then + read(unit=ep_unit) temp3d(1:ix,1:jy,1:kz) + else if ( ep_format == is_r4 ) then + read(unit=ep_unit) temp3d_r4(1:ix,1:jy,1:kz) + temp3d = temp3d_r4 + end if + close(unit=ep_unit) + end if + call wrf_dm_bcast_real(temp3d, ijk) ep % ci(its:ite,jts:jte,kts:kte,te) = ens_scaling_inv * temp3d(its:ite,jts:jte,kts:kte) - close(unit=ep_unit) - filename = trim(ep_dir_name(it))//'/'//'qsnow'//'.e'//trim(ce) - open(unit=ep_unit, file = filename, form = 'unformatted', status = 'old') - read(unit=ep_unit) ni, nj, nk - read(unit=ep_unit) temp3d(1:ix,1:jy,1:kz) + if ( ep_format == is_r8 ) then + filename = trim(ep_dir_name(it))//'/'//'qsnow'//'.e'//trim(ce) + else if ( ep_format == is_r4 ) then + filename = trim(ep_dir_name(it))//'/'//'QSNOW'//'.e'//trim(ce) + end if + if ( rootproc ) then + open(unit=ep_unit, file = filename, form = 'unformatted', status = 'old') + read(unit=ep_unit) ni, nj, nk + if ( ep_format == is_r8 ) then + read(unit=ep_unit) temp3d(1:ix,1:jy,1:kz) + else if ( ep_format == is_r4 ) then + read(unit=ep_unit) temp3d_r4(1:ix,1:jy,1:kz) + temp3d = temp3d_r4 + end if + close(unit=ep_unit) + end if + call wrf_dm_bcast_real(temp3d, ijk) ep % sn(its:ite,jts:jte,kts:kte,te) = ens_scaling_inv * temp3d(its:ite,jts:jte,kts:kte) - close(unit=ep_unit) - filename = trim(ep_dir_name(it))//'/'//'qgraup'//'.e'//trim(ce) - open(unit=ep_unit, file = filename, form = 'unformatted', status = 'old') - read(unit=ep_unit) ni, nj, nk - read(unit=ep_unit) temp3d(1:ix,1:jy,1:kz) + if ( ep_format == is_r8 ) then + filename = trim(ep_dir_name(it))//'/'//'qgraup'//'.e'//trim(ce) + else if ( ep_format == is_r4 ) then + filename = trim(ep_dir_name(it))//'/'//'QGRAUP'//'.e'//trim(ce) + end if + if ( rootproc ) then + open(unit=ep_unit, file = filename, form = 'unformatted', status = 'old') + read(unit=ep_unit) ni, nj, nk + if ( ep_format == is_r8 ) then + read(unit=ep_unit) temp3d(1:ix,1:jy,1:kz) + else if ( ep_format == is_r4 ) then + read(unit=ep_unit) temp3d_r4(1:ix,1:jy,1:kz) + temp3d = temp3d_r4 + end if + close(unit=ep_unit) + end if + call wrf_dm_bcast_real(temp3d, ijk) ep % gr(its:ite,jts:jte,kts:kte,te) = ens_scaling_inv * temp3d(its:ite,jts:jte,kts:kte) - close(unit=ep_unit) end do ! num_fgat_time*ne loop end if ! hydrometeors - print *,"MAX EP",MAXVAL(ep % v1(its:ite,jts:jte,:,:)) - print *,"MAX EP",MAXVAL(ep % v2(its:ite,jts:jte,:,:)) - print *,"MAX EP",MAXVAL(ep % v3(its:ite,jts:jte,:,:)) - print *,"MAX EP",MAXVAL(ep % v4(its:ite,jts:jte,:,:)) - print *,"MAX EP",MAXVAL(ep % v5(its:ite,jts:jte,:,:)) + if ( rootproc .and. ep_format == is_r4 ) then + deallocate(temp3d_r4) + deallocate(temp2d_r4) + end if + deallocate(temp3d) + deallocate(temp2d) + + write(unit=message(1),fmt='(a,e12.5)') & + ' Max U ep: ', maxval(ep % v1(its:ite,jts:jte,:,:)) + write(unit=message(2),fmt='(a,e12.5)') & + ' Max V ep: ', maxval(ep % v2(its:ite,jts:jte,:,:)) + write(unit=message(3),fmt='(a,e12.5)') & + ' Max T ep: ', maxval(ep % v3(its:ite,jts:jte,:,:)) + write(unit=message(4),fmt='(a,e12.5)') & + ' Max Q ep: ', maxval(ep % v4(its:ite,jts:jte,:,:)) + write(unit=message(5),fmt='(a,e12.5)') & + ' Max Psfc ep: ', maxval(ep % v5(its:ite,jts:jte,1,:)) + call da_message(message(1:5)) if ( alphacv_method == alphacv_method_xa .and. alpha_hydrometeors ) then - print *,"MAX EP",MAXVAL(ep % cw(its:ite,jts:jte,:,:)) - print *,"MAX EP",MAXVAL(ep % rn(its:ite,jts:jte,:,:)) - print *,"MAX EP",MAXVAL(ep % ci(its:ite,jts:jte,:,:)) - print *,"MAX EP",MAXVAL(ep % sn(its:ite,jts:jte,:,:)) - print *,"MAX EP",MAXVAL(ep % gr(its:ite,jts:jte,:,:)) + write(unit=message(1),fmt='(a,e12.5)') & + ' Max QCLOUD ep: ', maxval(ep % cw(its:ite,jts:jte,:,:)) + write(unit=message(2),fmt='(a,e12.5)') & + ' Max QRAIN ep: ', maxval(ep % rn(its:ite,jts:jte,:,:)) + write(unit=message(3),fmt='(a,e12.5)') & + ' Max QICE ep: ', maxval(ep % ci(its:ite,jts:jte,:,:)) + write(unit=message(4),fmt='(a,e12.5)') & + ' Max QSNOW ep: ', maxval(ep % sn(its:ite,jts:jte,:,:)) + write(unit=message(5),fmt='(a,e12.5)') & + ' Max QGRAUP ep: ', maxval(ep % gr(its:ite,jts:jte,:,:)) + call da_message(message(1:5)) end if deallocate(ep_dir_name) diff --git a/var/da/da_setup_structures/da_setup_flow_predictors_ep_format2.inc b/var/da/da_setup_structures/da_setup_flow_predictors_ep_format2.inc new file mode 100644 index 0000000000..0118b9b4ee --- /dev/null +++ b/var/da/da_setup_structures/da_setup_flow_predictors_ep_format2.inc @@ -0,0 +1,478 @@ +subroutine da_setup_flow_predictors_ep_format2( ix, jy, kz, ne, ep, its, ite, jts, jte, kts, kte ) + + !------------------------------------------------------------------------------ + ! Purpose: Setup structures for flow-dependent information and read it in. + !------------------------------------------------------------------------------ + + implicit none + + integer, intent(in) :: ix, jy, kz ! EP grid dimensions + integer, intent(in) :: its, jts, kts ! Tile start + integer, intent(in) :: ite, jte, kte ! Tile end + integer, intent(in) :: ne ! Ensemble size + type(ep_type), intent(inout):: ep ! Flow-dependent info + + character(len=4), allocatable :: ep_dir_name(:) ! Input ep dir name + character(len=filename_len) :: filename ! Input filename + integer :: ni, nj, nk ! Grid dimensions + real*4, allocatable :: temp3d_r4(:,:,:) ! Temporary, real*4 array + real*4, allocatable :: temp2d_r4(:,:) ! Temporary, real*4 array + real, allocatable :: temp3d(:,:,:) ! Temporary array + real, allocatable :: temp2d(:,:) ! Temporary array + real :: ens_scaling_inv ! Ensemble scaling of perturbations + integer :: vardim ! dimension of variable + integer :: nens ! number of ensembles + integer :: ep_unit,te,it,ie + integer :: ijk + integer :: ierr + + if (trace_use) call da_trace_entry("da_setup_flow_predictors_ep_format2") + + call da_get_unit(ep_unit) + + call da_message((/"Set up flow-dependent information from ep_format=2"/)) + + if (alphacv_method /= alphacv_method_xa) then + write(unit=message(1),fmt='(a,i2)') & + ' ep_format=2 is not implemented for alphacv_method= ', alphacv_method + call da_error(__FILE__,__LINE__,message(1:1)) + end if + + ep % ne = ne + ijk = ix * jy * kz + + ens_scaling_inv = 1.0 + if (ne > 1) ens_scaling_inv = 1.0 / sqrt(real(ne-1)) + + if ( num_fgat_time > 1 .and. use_4denvar ) then + allocate(ep_dir_name(num_fgat_time)) + do it = 1, num_fgat_time + write(ep_dir_name(it), fmt='(a, i2.2)') 'ep', it !ep01,ep02,... + end do + else + allocate(ep_dir_name(1)) + ep_dir_name(1) = 'ep' + end if + + if ( rootproc ) then + allocate(temp3d_r4(1:ix,1:jy,1:kz)) + allocate(temp2d_r4(1:ix,1:jy)) + end if + allocate(temp3d(1:ix,1:jy,1:kz)) + allocate(temp2d(1:ix,1:jy)) + + !--------------------------------------------------------------------------- + ! Input ensemble perturbations + !--------------------------------------------------------------------------- + do it = 1, num_fgat_time + + ! v1: + filename = trim(ep_dir_name(it))//'/'//'ep.U' + if ( rootproc ) then + open(unit=ep_unit, file=filename, form='unformatted', status='old', iostat=ierr) + if ( ierr /= 0 ) then + write(unit=message(1),fmt='(a,a)') ' Error opening ', trim(filename) + call da_error(__FILE__,__LINE__,message(1:1)) + end if + read(unit=ep_unit) !varname(len=10) + read(unit=ep_unit) !date(len=19) 0000-00-00_00:00:00 + read(unit=ep_unit) vardim + read(unit=ep_unit) ni, nj, nk, nens + + if (ni /= ix .or. nj /= jy .or. nk /= kz) then + write(unit=message(1),fmt='(a)') & + 'Inconsistent grid dimensions' + write(unit=message(2),fmt='(a,3i6)') & + ' Grid dims for ensemble grid: ', ix, jy, kz + write(unit=message(3),fmt='(a,3i6)') & + ' Grid dims from U ep file: ', ni, nj, nk + call da_error(__FILE__,__LINE__,message(1:3)) + end if + + end if + call wrf_dm_bcast_integer(nens, 1) + + do ie = 1, min(ne, nens) + if ( rootproc ) then + read(unit=ep_unit) temp3d_r4(1:ix,1:jy,1:kz) + temp3d = temp3d_r4 + end if + call wrf_dm_bcast_real(temp3d, ijk) + te = ie + (it-1)*nens + ep % v1(its:ite,jts:jte,kts:kte,te) = ens_scaling_inv * & + temp3d(its:ite,jts:jte,kts:kte) + end do + if ( rootproc ) close(unit=ep_unit) + + ! v2: + filename = trim(ep_dir_name(it))//'/'//'ep.V' + if ( rootproc ) then + open(unit=ep_unit, file=filename, form='unformatted', status='old', iostat=ierr) + if ( ierr /= 0 ) then + write(unit=message(1),fmt='(a,a)') ' Error opening ', trim(filename) + call da_error(__FILE__,__LINE__,message(1:1)) + end if + read(unit=ep_unit) !varname(len=10) + read(unit=ep_unit) !date(len=19) 0000-00-00_00:00:00 + read(unit=ep_unit) vardim + read(unit=ep_unit) ni, nj, nk, nens + + if (ni /= ix .or. nj /= jy .or. nk /= kz) then + write(unit=message(1),fmt='(a)') & + 'Inconsistent grid dimensions' + write(unit=message(2),fmt='(a,3i6)') & + ' Grid dims for ensemble grid: ', ix, jy, kz + write(unit=message(3),fmt='(a,3i6)') & + ' Grid dims from V ep file: ', ni, nj, nk + call da_error(__FILE__,__LINE__,message(1:3)) + end if + + end if + + do ie = 1, min(ne, nens) + if ( rootproc ) then + read(unit=ep_unit) temp3d_r4(1:ix,1:jy,1:kz) + temp3d = temp3d_r4 + end if + call wrf_dm_bcast_real(temp3d, ijk) + te = ie + (it-1)*nens + ep % v2(its:ite,jts:jte,kts:kte,te) = ens_scaling_inv * & + temp3d(its:ite,jts:jte,kts:kte) + end do + if ( rootproc ) close(unit=ep_unit) + + ! v3: + filename = trim(ep_dir_name(it))//'/'//'ep.T' + if ( rootproc ) then + open(unit=ep_unit, file=filename, form='unformatted', status='old', iostat=ierr) + if ( ierr /= 0 ) then + write(unit=message(1),fmt='(a,a)') ' Error opening ', trim(filename) + call da_error(__FILE__,__LINE__,message(1:1)) + end if + read(unit=ep_unit) !varname(len=10) + read(unit=ep_unit) !date(len=19) 0000-00-00_00:00:00 + read(unit=ep_unit) vardim + read(unit=ep_unit) ni, nj, nk, nens + + if (ni /= ix .or. nj /= jy .or. nk /= kz) then + write(unit=message(1),fmt='(a)') & + 'Inconsistent grid dimensions' + write(unit=message(2),fmt='(a,3i6)') & + ' Grid dims for ensemble grid: ', ix, jy, kz + write(unit=message(3),fmt='(a,3i6)') & + ' Grid dims from T ep file: ', ni, nj, nk + call da_error(__FILE__,__LINE__,message(1:3)) + end if + + end if + + do ie = 1, min(ne, nens) + if ( rootproc ) then + read(unit=ep_unit) temp3d_r4(1:ix,1:jy,1:kz) + temp3d = temp3d_r4 + end if + call wrf_dm_bcast_real(temp3d, ijk) + te = ie + (it-1)*nens + ep % v3(its:ite,jts:jte,kts:kte,te) = ens_scaling_inv * & + temp3d(its:ite,jts:jte,kts:kte) + end do + if ( rootproc ) close(unit=ep_unit) + + ! v4: + filename = trim(ep_dir_name(it))//'/'//'ep.QVAPOR' + if ( rootproc ) then + open(unit=ep_unit, file=filename, form='unformatted', status='old', iostat=ierr) + if ( ierr /= 0 ) then + write(unit=message(1),fmt='(a,a)') ' Error opening ', trim(filename) + call da_error(__FILE__,__LINE__,message(1:1)) + end if + read(unit=ep_unit) !varname(len=10) + read(unit=ep_unit) !date(len=19) 0000-00-00_00:00:00 + read(unit=ep_unit) vardim + read(unit=ep_unit) ni, nj, nk, nens + + if (ni /= ix .or. nj /= jy .or. nk /= kz) then + write(unit=message(1),fmt='(a)') & + 'Inconsistent grid dimensions' + write(unit=message(2),fmt='(a,3i6)') & + ' Grid dims for ensemble grid: ', ix, jy, kz + write(unit=message(3),fmt='(a,3i6)') & + ' Grid dims from QVAPOR ep file: ', ni, nj, nk + call da_error(__FILE__,__LINE__,message(1:3)) + end if + + end if + + do ie = 1, min(ne, nens) + if ( rootproc ) then + read(unit=ep_unit) temp3d_r4(1:ix,1:jy,1:kz) + temp3d = temp3d_r4 + end if + call wrf_dm_bcast_real(temp3d, ijk) + te = ie + (it-1)*nens + ep % v4(its:ite,jts:jte,kts:kte,te) = ens_scaling_inv * & + temp3d(its:ite,jts:jte,kts:kte) + end do + if ( rootproc ) close(unit=ep_unit) + + ! v5: + filename = trim(ep_dir_name(it))//'/'//'ep.PSFC' + if ( rootproc ) then + open(unit=ep_unit, file=filename, form='unformatted', status='old', iostat=ierr) + if ( ierr /= 0 ) then + write(unit=message(1),fmt='(a,a)') ' Error opening ', trim(filename) + call da_error(__FILE__,__LINE__,message(1:1)) + end if + read(unit=ep_unit) !varname(len=10) + read(unit=ep_unit) !date(len=19) 0000-00-00_00:00:00 + read(unit=ep_unit) vardim + read(unit=ep_unit) ni, nj, nk, nens + + if (ni /= ix .or. nj /= jy) then + write(unit=message(1),fmt='(a)') & + 'Inconsistent grid dimensions' + write(unit=message(2),fmt='(a,2i6)') & + ' Grid dims for ensemble grid: ', ix, jy + write(unit=message(3),fmt='(a,2i6)') & + ' Grid dims from PSFC ep file: ', ni, nj + call da_error(__FILE__,__LINE__,message(1:3)) + end if + + end if + + do ie = 1, min(ne, nens) + if ( rootproc ) then + read(unit=ep_unit) temp2d_r4(1:ix,1:jy) + temp2d = temp2d_r4 + end if + call wrf_dm_bcast_real(temp2d, ix*jy) + te = ie + (it-1)*nens + ep % v5(its:ite,jts:jte,1,te) = ens_scaling_inv * & + temp2d(its:ite,jts:jte) + end do + if ( rootproc ) close(unit=ep_unit) + + end do ! num_fgat_time loop + + ! Optional include hydrometeors: + + if ( alphacv_method == alphacv_method_xa .and. alpha_hydrometeors ) then ! xa space + + do it = 1, num_fgat_time + + filename = trim(ep_dir_name(it))//'/'//'ep.QCLOUD' + if ( rootproc ) then + open(unit=ep_unit, file=filename, form='unformatted', status='old', iostat=ierr) + if ( ierr /= 0 ) then + write(unit=message(1),fmt='(a,a)') ' Error opening ', trim(filename) + call da_error(__FILE__,__LINE__,message(1:1)) + end if + read(unit=ep_unit) !varname(len=10) + read(unit=ep_unit) !date(len=19) 0000-00-00_00:00:00 + read(unit=ep_unit) vardim + read(unit=ep_unit) ni, nj, nk, nens + + if (ni /= ix .or. nj /= jy .or. nk /= kz) then + write(unit=message(1),fmt='(a)') & + 'Inconsistent grid dimensions' + write(unit=message(2),fmt='(a,3i6)') & + ' Grid dims for ensemble grid: ', ix, jy, kz + write(unit=message(3),fmt='(a,3i6)') & + ' Grid dims from QCLOUD ep file: ', ni, nj, nk + call da_error(__FILE__,__LINE__,message(1:3)) + end if + + end if + do ie = 1, min(ne, nens) + if ( rootproc ) then + read(unit=ep_unit) temp3d_r4(1:ix,1:jy,1:kz) + temp3d = temp3d_r4 + end if + call wrf_dm_bcast_real(temp3d, ijk) + te = ie + (it-1)*nens + ep % cw(its:ite,jts:jte,kts:kte,te) = ens_scaling_inv * & + temp3d(its:ite,jts:jte,kts:kte) + end do + if ( rootproc ) close(unit=ep_unit) + + filename = trim(ep_dir_name(it))//'/'//'ep.QRAIN' + if ( rootproc ) then + open(unit=ep_unit, file=filename, form='unformatted', status='old', iostat=ierr) + if ( ierr /= 0 ) then + write(unit=message(1),fmt='(a,a)') ' Error opening ', trim(filename) + call da_error(__FILE__,__LINE__,message(1:1)) + end if + read(unit=ep_unit) !varname(len=10) + read(unit=ep_unit) !date(len=19) 0000-00-00_00:00:00 + read(unit=ep_unit) vardim + read(unit=ep_unit) ni, nj, nk, nens + + if (ni /= ix .or. nj /= jy .or. nk /= kz) then + write(unit=message(1),fmt='(a)') & + 'Inconsistent grid dimensions' + write(unit=message(2),fmt='(a,3i6)') & + ' Grid dims for ensemble grid: ', ix, jy, kz + write(unit=message(3),fmt='(a,3i6)') & + ' Grid dims from QRAIN ep file:', ni, nj, nk + call da_error(__FILE__,__LINE__,message(1:3)) + end if + + end if + do ie = 1, min(ne, nens) + if ( rootproc ) then + read(unit=ep_unit) temp3d_r4(1:ix,1:jy,1:kz) + temp3d = temp3d_r4 + end if + call wrf_dm_bcast_real(temp3d, ijk) + te = ie + (it-1)*nens + ep % rn(its:ite,jts:jte,kts:kte,te) = ens_scaling_inv * & + temp3d(its:ite,jts:jte,kts:kte) + end do + if ( rootproc ) close(unit=ep_unit) + + filename = trim(ep_dir_name(it))//'/'//'ep.QICE' + if ( rootproc ) then + open(unit=ep_unit, file=filename, form='unformatted', status='old', iostat=ierr) + if ( ierr /= 0 ) then + write(unit=message(1),fmt='(a,a)') ' Error opening ', trim(filename) + call da_error(__FILE__,__LINE__,message(1:1)) + end if + read(unit=ep_unit) !varname(len=10) + read(unit=ep_unit) !date(len=19) 0000-00-00_00:00:00 + read(unit=ep_unit) vardim + read(unit=ep_unit) ni, nj, nk, nens + + if (ni /= ix .or. nj /= jy .or. nk /= kz) then + write(unit=message(1),fmt='(a)') & + 'Inconsistent grid dimensions' + write(unit=message(2),fmt='(a,3i6)') & + ' Grid dims for ensemble grid: ', ix, jy, kz + write(unit=message(3),fmt='(a,3i6)') & + ' Grid dims from QICE ep file: ', ni, nj, nk + call da_error(__FILE__,__LINE__,message(1:3)) + end if + + end if + do ie = 1, min(ne, nens) + if ( rootproc ) then + read(unit=ep_unit) temp3d_r4(1:ix,1:jy,1:kz) + temp3d = temp3d_r4 + end if + te = ie + (it-1)*nens + ep % ci(its:ite,jts:jte,kts:kte,te) = ens_scaling_inv * & + temp3d(its:ite,jts:jte,kts:kte) + end do + if ( rootproc ) close(unit=ep_unit) + + filename = trim(ep_dir_name(it))//'/'//'ep.QSNOW' + if ( rootproc ) then + open(unit=ep_unit, file=filename, form='unformatted', status='old', iostat=ierr) + if ( ierr /= 0 ) then + write(unit=message(1),fmt='(a,a)') ' Error opening ', trim(filename) + call da_error(__FILE__,__LINE__,message(1:1)) + end if + read(unit=ep_unit) !varname(len=10) + read(unit=ep_unit) !date(len=19) 0000-00-00_00:00:00 + read(unit=ep_unit) vardim + read(unit=ep_unit) ni, nj, nk, nens + + if (ni /= ix .or. nj /= jy .or. nk /= kz) then + write(unit=message(1),fmt='(a)') & + 'Inconsistent grid dimensions' + write(unit=message(2),fmt='(a,3i6)') & + ' Grid dims for ensemble grid: ', ix, jy, kz + write(unit=message(3),fmt='(a,3i6)') & + ' Grid dims from QSNOW ep file:', ni, nj, nk + call da_error(__FILE__,__LINE__,message(1:3)) + end if + + end if + do ie = 1, min(ne, nens) + if ( rootproc ) then + read(unit=ep_unit) temp3d_r4(1:ix,1:jy,1:kz) + temp3d = temp3d_r4 + end if + te = ie + (it-1)*nens + ep % sn(its:ite,jts:jte,kts:kte,te) = ens_scaling_inv * & + temp3d(its:ite,jts:jte,kts:kte) + end do + if ( rootproc ) close(unit=ep_unit) + + filename = trim(ep_dir_name(it))//'/'//'ep.QGRAUP' + if ( rootproc ) then + open(unit=ep_unit, file=filename, form='unformatted', status='old', iostat=ierr) + if ( ierr /= 0 ) then + write(unit=message(1),fmt='(a,a)') ' Error opening ', trim(filename) + call da_error(__FILE__,__LINE__,message(1:1)) + end if + read(unit=ep_unit) !varname(len=10) + read(unit=ep_unit) !date(len=19) 0000-00-00_00:00:00 + read(unit=ep_unit) vardim + read(unit=ep_unit) ni, nj, nk, nens + + if (ni /= ix .or. nj /= jy .or. nk /= kz) then + write(unit=message(1),fmt='(a)') & + 'Inconsistent grid dimensions' + write(unit=message(2),fmt='(a,3i6)') & + ' Grid dims for ensemble grid: ', ix, jy, kz + write(unit=message(3),fmt='(a,3i6)') & + ' Grid dims from QGRAUP ep file: ', ni, nj, nk + call da_error(__FILE__,__LINE__,message(1:3)) + end if + + end if + do ie = 1, min(ne, nens) + if ( rootproc ) then + read(unit=ep_unit) temp3d_r4(1:ix,1:jy,1:kz) + temp3d = temp3d_r4 + end if + te = ie + (it-1)*nens + ep % gr(its:ite,jts:jte,kts:kte,te) = ens_scaling_inv * & + temp3d(its:ite,jts:jte,kts:kte) + end do + if ( rootproc ) close(unit=ep_unit) + + end do ! num_fgat_time*ne loop + + end if ! hydrometeors + + if ( rootproc ) then + deallocate(temp3d_r4) + deallocate(temp2d_r4) + end if + deallocate(temp3d) + deallocate(temp2d) + + write(unit=message(1),fmt='(a,e12.5)') & + ' Max U ep: ', maxval(ep % v1(its:ite,jts:jte,:,:)) + write(unit=message(2),fmt='(a,e12.5)') & + ' Max V ep: ', maxval(ep % v2(its:ite,jts:jte,:,:)) + write(unit=message(3),fmt='(a,e12.5)') & + ' Max T ep: ', maxval(ep % v3(its:ite,jts:jte,:,:)) + write(unit=message(4),fmt='(a,e12.5)') & + ' Max Q ep: ', maxval(ep % v4(its:ite,jts:jte,:,:)) + write(unit=message(5),fmt='(a,e12.5)') & + ' Max Psfc ep: ', maxval(ep % v5(its:ite,jts:jte,1,:)) + call da_message(message(1:5)) + + if ( alphacv_method == alphacv_method_xa .and. alpha_hydrometeors ) then + write(unit=message(1),fmt='(a,e12.5)') & + ' Max QCLOUD ep: ', maxval(ep % cw(its:ite,jts:jte,:,:)) + write(unit=message(2),fmt='(a,e12.5)') & + ' Max QRAIN ep: ', maxval(ep % rn(its:ite,jts:jte,:,:)) + write(unit=message(3),fmt='(a,e12.5)') & + ' Max QICE ep: ', maxval(ep % ci(its:ite,jts:jte,:,:)) + write(unit=message(4),fmt='(a,e12.5)') & + ' Max QSNOW ep: ', maxval(ep % sn(its:ite,jts:jte,:,:)) + write(unit=message(5),fmt='(a,e12.5)') & + ' Max QGRAUP ep: ', maxval(ep % gr(its:ite,jts:jte,:,:)) + call da_message(message(1:5)) + end if + + deallocate(ep_dir_name) + call da_free_unit(ep_unit) + + if (trace_use) call da_trace_exit("da_setup_flow_predictors_ep_format2") + +end subroutine da_setup_flow_predictors_ep_format2 + diff --git a/var/da/da_setup_structures/da_setup_flow_predictors_ep_format3.inc b/var/da/da_setup_structures/da_setup_flow_predictors_ep_format3.inc new file mode 100644 index 0000000000..6da7c08c1e --- /dev/null +++ b/var/da/da_setup_structures/da_setup_flow_predictors_ep_format3.inc @@ -0,0 +1,419 @@ +subroutine da_setup_flow_predictors_ep_format3( ix, jy, kz, ne, ep, its, ite, jts, jte, kts, kte ) + + !------------------------------------------------------------------------------ + ! Purpose: Setup structures for flow-dependent information and read it in. + !------------------------------------------------------------------------------ + + implicit none + + integer, intent(in) :: ix, jy, kz ! EP grid dimensions + integer, intent(in) :: its, jts, kts ! Tile start + integer, intent(in) :: ite, jte, kte ! Tile end + integer, intent(in) :: ne ! Ensemble size + type(ep_type), intent(inout):: ep ! Flow-dependent info + + character(len=4), allocatable :: ep_dir_name(:) ! Input ep dir name + character(len=filename_len) :: filename ! Input filename + integer :: ni, nj, nk ! Grid dimensions + real*4, allocatable :: temp3d_r4(:,:,:) ! Temporary, real*4 array + real*4, allocatable :: temp2d_r4(:,:) ! Temporary, real*4 array + real :: ens_scaling_inv ! Ensemble scaling of perturbations + integer :: vardim ! dimension of variable + integer :: nens ! number of ensembles + integer :: ep_unit,te,it,ie + character(len=6) :: pe_name + integer :: ips, ipe, jps, jpe, kds, kde + integer :: ierr + + if (trace_use) call da_trace_entry("da_setup_flow_predictors_ep_format3") + + call da_get_unit(ep_unit) + + call da_message((/"Set up flow-dependent information from ep_format=3"/)) + + if (alphacv_method /= alphacv_method_xa) then + write(unit=message(1),fmt='(a,i2)') & + ' ep_format=3 is not implemented for alphacv_method= ', alphacv_method + call da_error(__FILE__,__LINE__,message(1:1)) + end if + + ep % ne = ne + + ens_scaling_inv = 1.0 + if (ne > 1) ens_scaling_inv = 1.0 / sqrt(real(ne-1)) + + if ( num_fgat_time > 1 .and. use_4denvar ) then + allocate(ep_dir_name(num_fgat_time)) + do it = 1, num_fgat_time + write(ep_dir_name(it), fmt='(a, i2.2)') 'ep', it !ep01,ep02,... + end do + else + allocate(ep_dir_name(1)) + ep_dir_name(1) = 'ep' + end if + + allocate(temp3d_r4(1:ix,1:jy,1:kz)) + allocate(temp2d_r4(1:ix,1:jy)) + + write(pe_name,'(a2,i4.4)') 'pe', myproc + + !--------------------------------------------------------------------------- + ! Input ensemble perturbations + !--------------------------------------------------------------------------- + do it = 1, num_fgat_time + + ! v1: + filename = trim(ep_dir_name(it))//'/'//'ep.U.'//trim(pe_name) + open(unit=ep_unit, file=filename, form='unformatted', status='old', iostat=ierr) + if ( ierr /= 0 ) then + write(unit=message(1),fmt='(a,a)') ' Error opening ', trim(filename) + call da_error(__FILE__,__LINE__,message(1:1)) + end if + read(unit=ep_unit) !varname(len=10) + read(unit=ep_unit) !date(len=19) 0000-00-00_00:00:00 + read(unit=ep_unit) vardim + read(unit=ep_unit) ips, ipe, jps, jpe, kds, kde, nens + + if ( ips/=its .or. ipe/=ite .or. jps/=jts .or. jpe/=jte .or. & + kds/=kts .or. kde/=kte ) then + write(unit=message(1),fmt='(a)') & + 'Inconsistent grid dimensions' + write(unit=message(2),fmt='(a,6i6)') & + ' Grid patch dims for this processor: ', its, ite, jts, jte, kts, kte + write(unit=message(3),fmt='(a,6i6)') & + ' Grid patch dims from U ep file: ', ips, ipe, jps, jpe, kds, kde + call da_error(__FILE__,__LINE__,message(1:3)) + end if + + if ( .not. allocated(temp3d_r4) ) allocate(temp3d_r4(ips:ipe,jps:jpe,kds:kde)) + do ie = 1, min(ne, nens) + read(unit=ep_unit) temp3d_r4(ips:ipe,jps:jpe,kds:kde) + te = ie + (it-1)*nens + ep % v1(its:ite,jts:jte,kts:kte,te) = ens_scaling_inv * & + temp3d_r4(its:ite,jts:jte,kts:kte) + end do + close(unit=ep_unit) + + ! v2: + filename = trim(ep_dir_name(it))//'/'//'ep.V.'//trim(pe_name) + open(unit=ep_unit, file=filename, form='unformatted', status='old', iostat=ierr) + if ( ierr /= 0 ) then + write(unit=message(1),fmt='(a,a)') ' Error opening ', trim(filename) + call da_error(__FILE__,__LINE__,message(1:1)) + end if + read(unit=ep_unit) !varname(len=10) + read(unit=ep_unit) !date(len=19) 0000-00-00_00:00:00 + read(unit=ep_unit) vardim + read(unit=ep_unit) ips, ipe, jps, jpe, kds, kde, nens + + if ( ips/=its .or. ipe/=ite .or. jps/=jts .or. jpe/=jte .or. & + kds/=kts .or. kde/=kte ) then + write(unit=message(1),fmt='(a)') & + 'Inconsistent grid dimensions' + write(unit=message(2),fmt='(a,6i6)') & + ' Grid patch dims for this processor: ', its, ite, jts, jte, kts, kte + write(unit=message(3),fmt='(a,6i6)') & + ' Grid patch dims from V ep file: ', ips, ipe, jps, jpe, kds, kde + call da_error(__FILE__,__LINE__,message(1:3)) + end if + + do ie = 1, min(ne, nens) + read(unit=ep_unit) temp3d_r4(ips:ipe,jps:jpe,kds:kde) + te = ie + (it-1)*nens + ep % v2(its:ite,jts:jte,kts:kte,te) = ens_scaling_inv * & + temp3d_r4(its:ite,jts:jte,kts:kte) + end do + close(unit=ep_unit) + + ! v3: + filename = trim(ep_dir_name(it))//'/'//'ep.T.'//trim(pe_name) + open(unit=ep_unit, file=filename, form='unformatted', status='old', iostat=ierr) + if ( ierr /= 0 ) then + write(unit=message(1),fmt='(a,a)') ' Error opening ', trim(filename) + call da_error(__FILE__,__LINE__,message(1:1)) + end if + read(unit=ep_unit) !varname(len=10) + read(unit=ep_unit) !date(len=19) 0000-00-00_00:00:00 + read(unit=ep_unit) vardim + read(unit=ep_unit) ips, ipe, jps, jpe, kds, kde, nens + + if ( ips/=its .or. ipe/=ite .or. jps/=jts .or. jpe/=jte .or. & + kds/=kts .or. kde/=kte ) then + write(unit=message(1),fmt='(a)') & + 'Inconsistent grid dimensions' + write(unit=message(2),fmt='(a,6i6)') & + ' Grid patch dims for this processor: ', its, ite, jts, jte, kts, kte + write(unit=message(3),fmt='(a,6i6)') & + ' Grid patch dims from T ep file: ', ips, ipe, jps, jpe, kds, kde + call da_error(__FILE__,__LINE__,message(1:3)) + end if + + do ie = 1, min(ne, nens) + read(unit=ep_unit) temp3d_r4(ips:ipe,jps:jpe,kds:kde) + te = ie + (it-1)*nens + ep % v3(its:ite,jts:jte,kts:kte,te) = ens_scaling_inv * & + temp3d_r4(its:ite,jts:jte,kts:kte) + end do + close(unit=ep_unit) + + ! v4: + filename = trim(ep_dir_name(it))//'/'//'ep.QVAPOR.'//trim(pe_name) + open(unit=ep_unit, file=filename, form='unformatted', status='old', iostat=ierr) + if ( ierr /= 0 ) then + write(unit=message(1),fmt='(a,a)') ' Error opening ', trim(filename) + call da_error(__FILE__,__LINE__,message(1:1)) + end if + read(unit=ep_unit) !varname(len=10) + read(unit=ep_unit) !date(len=19) 0000-00-00_00:00:00 + read(unit=ep_unit) vardim + read(unit=ep_unit) ips, ipe, jps, jpe, kds, kde, nens + + if ( ips/=its .or. ipe/=ite .or. jps/=jts .or. jpe/=jte .or. & + kds/=kts .or. kde/=kte ) then + write(unit=message(1),fmt='(a)') & + 'Inconsistent grid dimensions' + write(unit=message(2),fmt='(a,6i6)') & + ' Grid patch dims for this processor: ', its, ite, jts, jte, kts, kte + write(unit=message(3),fmt='(a,6i6)') & + ' Grid patch dims from QVAPOR ep file:', ips, ipe, jps, jpe, kds, kde + call da_error(__FILE__,__LINE__,message(1:3)) + end if + + do ie = 1, min(ne, nens) + read(unit=ep_unit) temp3d_r4(ips:ipe,jps:jpe,kds:kde) + te = ie + (it-1)*nens + ep % v4(its:ite,jts:jte,kts:kte,te) = ens_scaling_inv * & + temp3d_r4(its:ite,jts:jte,kts:kte) + end do + close(unit=ep_unit) + + ! v5: + filename = trim(ep_dir_name(it))//'/'//'ep.PSFC.'//trim(pe_name) + open(unit=ep_unit, file=filename, form='unformatted', status='old', iostat=ierr) + if ( ierr /= 0 ) then + write(unit=message(1),fmt='(a,a)') ' Error opening ', trim(filename) + call da_error(__FILE__,__LINE__,message(1:1)) + end if + read(unit=ep_unit) !varname(len=10) + read(unit=ep_unit) !date(len=19) 0000-00-00_00:00:00 + read(unit=ep_unit) vardim + read(unit=ep_unit) ips, ipe, jps, jpe, kds, kde, nens + + if ( ips/=its .or. ipe/=ite .or. jps/=jts .or. jpe/=jte ) then + write(unit=message(1),fmt='(a)') & + 'Inconsistent grid dimensions' + write(unit=message(2),fmt='(a,4i6)') & + ' Grid patch dims for this processor: ', its, ite, jts, jte + write(unit=message(3),fmt='(a,4i6)') & + ' Grid patch dims from PSFC ep file: ', ips, ipe, jps, jpe + call da_error(__FILE__,__LINE__,message(1:3)) + end if + + if ( .not. allocated(temp2d_r4) ) allocate(temp2d_r4(ips:ipe,jps:jpe)) + + do ie = 1, min(ne, nens) + read(unit=ep_unit) temp2d_r4(ips:ipe,jps:jpe) + te = ie + (it-1)*nens + ep % v5(its:ite,jts:jte,1,te) = ens_scaling_inv * & + temp2d_r4(its:ite,jts:jte) + end do + close(unit=ep_unit) + + end do ! num_fgat_time loop + + ! Optional include hydrometeors: + + if ( alphacv_method == alphacv_method_xa .and. alpha_hydrometeors ) then ! xa space + + do it = 1, num_fgat_time + + filename = trim(ep_dir_name(it))//'/'//'ep.QCLOUD.'//trim(pe_name) + open(unit=ep_unit, file=filename, form='unformatted', status='old', iostat=ierr) + if ( ierr /= 0 ) then + write(unit=message(1),fmt='(a,a)') ' Error opening ', trim(filename) + call da_error(__FILE__,__LINE__,message(1:1)) + end if + read(unit=ep_unit) !varname(len=10) + read(unit=ep_unit) !date(len=19) 0000-00-00_00:00:00 + read(unit=ep_unit) vardim + read(unit=ep_unit) ips, ipe, jps, jpe, kds, kde, nens + + if ( ips/=its .or. ipe/=ite .or. jps/=jts .or. jpe/=jte .or. & + kds/=kts .or. kde/=kte ) then + write(unit=message(1),fmt='(a)') & + 'Inconsistent grid dimensions' + write(unit=message(2),fmt='(a,6i6)') & + ' Grid patch dims for this processor: ', its, ite, jts, jte, kts, kte + write(unit=message(3),fmt='(a,6i6)') & + ' Grid patch dims from QCLOUD ep file:', ips, ipe, jps, jpe, kds, kde + call da_error(__FILE__,__LINE__,message(1:3)) + end if + + do ie = 1, min(ne, nens) + read(unit=ep_unit) temp3d_r4(ips:ipe,jps:jpe,kds:kde) + te = ie + (it-1)*nens + ep % cw(its:ite,jts:jte,kts:kte,te) = ens_scaling_inv * & + temp3d_r4(its:ite,jts:jte,kts:kte) + end do + close(unit=ep_unit) + + filename = trim(ep_dir_name(it))//'/'//'ep.QRAIN.'//trim(pe_name) + open(unit=ep_unit, file=filename, form='unformatted', status='old', iostat=ierr) + if ( ierr /= 0 ) then + write(unit=message(1),fmt='(a,a)') ' Error opening ', trim(filename) + call da_error(__FILE__,__LINE__,message(1:1)) + end if + read(unit=ep_unit) !varname(len=10) + read(unit=ep_unit) !date(len=19) 0000-00-00_00:00:00 + read(unit=ep_unit) vardim + read(unit=ep_unit) ips, ipe, jps, jpe, kds, kde, nens + + if ( ips/=its .or. ipe/=ite .or. jps/=jts .or. jpe/=jte .or. & + kds/=kts .or. kde/=kte ) then + write(unit=message(1),fmt='(a)') & + 'Inconsistent grid dimensions' + write(unit=message(2),fmt='(a,6i6)') & + ' Grid patch dims for this processor: ', its, ite, jts, jte, kts, kte + write(unit=message(3),fmt='(a,6i6)') & + ' Grid patch dims from QRAIN ep file: ', ips, ipe, jps, jpe, kds, kde + call da_error(__FILE__,__LINE__,message(1:3)) + end if + + do ie = 1, min(ne, nens) + read(unit=ep_unit) temp3d_r4(ips:ipe,jps:jpe,kds:kde) + te = ie + (it-1)*nens + ep % rn(its:ite,jts:jte,kts:kte,te) = ens_scaling_inv * & + temp3d_r4(its:ite,jts:jte,kts:kte) + end do + close(unit=ep_unit) + + filename = trim(ep_dir_name(it))//'/'//'ep.QICE.'//trim(pe_name) + open(unit=ep_unit, file=filename, form='unformatted', status='old', iostat=ierr) + if ( ierr /= 0 ) then + write(unit=message(1),fmt='(a,a)') ' Error opening ', trim(filename) + call da_error(__FILE__,__LINE__,message(1:1)) + end if + read(unit=ep_unit) !varname(len=10) + read(unit=ep_unit) !date(len=19) 0000-00-00_00:00:00 + read(unit=ep_unit) vardim + read(unit=ep_unit) ips, ipe, jps, jpe, kds, kde, nens + + if ( ips/=its .or. ipe/=ite .or. jps/=jts .or. jpe/=jte .or. & + kds/=kts .or. kde/=kte ) then + write(unit=message(1),fmt='(a)') & + 'Inconsistent grid dimensions' + write(unit=message(2),fmt='(a,6i6)') & + ' Grid patch dims for this processor: ', its, ite, jts, jte, kts, kte + write(unit=message(3),fmt='(a,6i6)') & + ' Grid patch dims from QICE ep file: ', ips, ipe, jps, jpe, kds, kde + call da_error(__FILE__,__LINE__,message(1:3)) + end if + + do ie = 1, min(ne, nens) + read(unit=ep_unit) temp3d_r4(ips:ipe,jps:jpe,kds:kde) + te = ie + (it-1)*nens + ep % ci(its:ite,jts:jte,kts:kte,te) = ens_scaling_inv * & + temp3d_r4(its:ite,jts:jte,kts:kte) + end do + close(unit=ep_unit) + + filename = trim(ep_dir_name(it))//'/'//'ep.QSNOW.'//trim(pe_name) + open(unit=ep_unit, file=filename, form='unformatted', status='old', iostat=ierr) + if ( ierr /= 0 ) then + write(unit=message(1),fmt='(a,a)') ' Error opening ', trim(filename) + call da_error(__FILE__,__LINE__,message(1:1)) + end if + read(unit=ep_unit) !varname(len=10) + read(unit=ep_unit) !date(len=19) 0000-00-00_00:00:00 + read(unit=ep_unit) vardim + read(unit=ep_unit) ips, ipe, jps, jpe, kds, kde, nens + + if ( ips/=its .or. ipe/=ite .or. jps/=jts .or. jpe/=jte .or. & + kds/=kts .or. kde/=kte ) then + write(unit=message(1),fmt='(a)') & + 'Inconsistent grid dimensions' + write(unit=message(2),fmt='(a,6i6)') & + ' Grid patch dims for this processor: ', its, ite, jts, jte, kts, kte + write(unit=message(3),fmt='(a,6i6)') & + ' Grid patch dims from QSNOW ep file: ', ips, ipe, jps, jpe, kds, kde + call da_error(__FILE__,__LINE__,message(1:3)) + end if + + do ie = 1, min(ne, nens) + read(unit=ep_unit) temp3d_r4(ips:ipe,jps:jpe,kds:kde) + te = ie + (it-1)*nens + ep % sn(its:ite,jts:jte,kts:kte,te) = ens_scaling_inv * & + temp3d_r4(its:ite,jts:jte,kts:kte) + end do + close(unit=ep_unit) + + filename = trim(ep_dir_name(it))//'/'//'ep.QGRAUP.'//trim(pe_name) + open(unit=ep_unit, file=filename, form='unformatted', status='old', iostat=ierr) + if ( ierr /= 0 ) then + write(unit=message(1),fmt='(a,a)') ' Error opening ', trim(filename) + call da_error(__FILE__,__LINE__,message(1:1)) + end if + read(unit=ep_unit) !varname(len=10) + read(unit=ep_unit) !date(len=19) 0000-00-00_00:00:00 + read(unit=ep_unit) vardim + read(unit=ep_unit) ips, ipe, jps, jpe, kds, kde, nens + + if ( ips/=its .or. ipe/=ite .or. jps/=jts .or. jpe/=jte .or. & + kds/=kts .or. kde/=kte ) then + write(unit=message(1),fmt='(a)') & + 'Inconsistent grid dimensions' + write(unit=message(2),fmt='(a,6i6)') & + ' Grid patch dims for this processor: ', its, ite, jts, jte, kts, kte + write(unit=message(3),fmt='(a,6i6)') & + ' Grid patch dims from QGRAUP ep file:', ips, ipe, jps, jpe, kds, kde + call da_error(__FILE__,__LINE__,message(1:3)) + end if + + do ie = 1, min(ne, nens) + read(unit=ep_unit) temp3d_r4(ips:ipe,jps:jpe,kds:kde) + te = ie + (it-1)*nens + ep % gr(its:ite,jts:jte,kts:kte,te) = ens_scaling_inv * & + temp3d_r4(its:ite,jts:jte,kts:kte) + end do + close(unit=ep_unit) + + end do ! num_fgat_time*ne loop + + end if ! hydrometeors + + if ( allocated(temp3d_r4) ) deallocate(temp3d_r4) + if ( allocated(temp2d_r4) ) deallocate(temp2d_r4) + + write(unit=message(1),fmt='(a,e12.5)') & + ' Max U ep: ', maxval(ep % v1(its:ite,jts:jte,:,:)) + write(unit=message(2),fmt='(a,e12.5)') & + ' Max V ep: ', maxval(ep % v2(its:ite,jts:jte,:,:)) + write(unit=message(3),fmt='(a,e12.5)') & + ' Max T ep: ', maxval(ep % v3(its:ite,jts:jte,:,:)) + write(unit=message(4),fmt='(a,e12.5)') & + ' Max Q ep: ', maxval(ep % v4(its:ite,jts:jte,:,:)) + write(unit=message(5),fmt='(a,e12.5)') & + ' Max Psfc ep: ', maxval(ep % v5(its:ite,jts:jte,1,:)) + call da_message(message(1:5)) + + if ( alphacv_method == alphacv_method_xa .and. alpha_hydrometeors ) then + write(unit=message(1),fmt='(a,e12.5)') & + ' Max QCLOUD ep: ', maxval(ep % cw(its:ite,jts:jte,:,:)) + write(unit=message(2),fmt='(a,e12.5)') & + ' Max QRAIN ep: ', maxval(ep % rn(its:ite,jts:jte,:,:)) + write(unit=message(3),fmt='(a,e12.5)') & + ' Max QICE ep: ', maxval(ep % ci(its:ite,jts:jte,:,:)) + write(unit=message(4),fmt='(a,e12.5)') & + ' Max QSNOW ep: ', maxval(ep % sn(its:ite,jts:jte,:,:)) + write(unit=message(5),fmt='(a,e12.5)') & + ' Max QGRAUP ep: ', maxval(ep % gr(its:ite,jts:jte,:,:)) + call da_message(message(1:5)) + end if + + deallocate(ep_dir_name) + call da_free_unit(ep_unit) + + if (trace_use) call da_trace_exit("da_setup_flow_predictors_ep_format3") + +end subroutine da_setup_flow_predictors_ep_format3 + diff --git a/var/da/da_setup_structures/da_setup_structures.f90 b/var/da/da_setup_structures/da_setup_structures.f90 index cfd04566f5..db979f7fcb 100644 --- a/var/da/da_setup_structures/da_setup_structures.f90 +++ b/var/da/da_setup_structures/da_setup_structures.f90 @@ -71,6 +71,7 @@ module da_setup_structures use da_control, only: use_cv_w use da_control, only: pseudo_tpw, pseudo_ztd, pseudo_ref, pseudo_uvtpq, pseudo_elv, anal_type_qcobs use da_control, only: use_gpsephobs, gpseph_loadbalance, gpseph + use da_control, only: ep_format use da_obs, only : da_fill_obs_structures, da_store_obs_grid_info, da_store_obs_grid_info_rad, & da_fill_obs_structures_rain, da_fill_obs_structures_radar, da_set_obs_missing,da_set_3d_obs_missing @@ -126,6 +127,8 @@ module da_setup_structures #include "da_chgvres.inc" #include "da_setup_flow_predictors.inc" #include "da_setup_flow_predictors_para_read_opt1.inc" +#include "da_setup_flow_predictors_ep_format2.inc" +#include "da_setup_flow_predictors_ep_format3.inc" #include "da_setup_obs_structures.inc" #include "da_setup_obs_structures_ascii.inc" #include "da_setup_obs_structures_bufr.inc"