FilterExps
The FilterExps.jl
sub-module contains methods to configure filter twin experiments, using a stored time series as generated by GenerateTimeSeries as the underlying observation generating process. The frequency of observations in continuous time is defined by the frequency of data saved in the time series and is inferred by the experiment when reading in the data.
Filter experiment configurations are generated by supplying a NamedTuple with the required fields as specified in the experiment method. Conventions for these arguments are as follows:
time_series
- the path and file name of the .jld2 truth twin data set;method
- the sub-method analysis scheme string name;seed
- the pseudo-random seed that will define, e.g., the observation noise sequence;nanl
- the number of observation / analysis times to produce a posterior estimate;obs_un
- the observation error standard deviation, assuming a uniform scaling observation error covariance;obs_dim
- the dimension of the observation vector;γ
- defines nonlinearity in theDataAssimilationBenchmarks.ObsOperators.alternating_obs_operator
;N_ens
- the ensemble size for ensemble-based filters;s_infl
- the multiplicative inflation for the empirical model state covariance;p_infl
- the multiplicative inflation for the empirical parameter sample covariance;p_err
- defines initial parameter sample standard deviation asp_err
percent of the system parameter value;p_wlk
- defines the standard deviation of a Gaussian random walk asp_wlk
percent of the estimated parameter value for a random parameter model.
Standard configurations should be defined in the SingleExperimentDriver module, for reproducing results and generating standard tests of methods.
Filter Experiment Methods
DataAssimilationBenchmarks.FilterExps.D3_var_filter_state
— MethodD3_var_filter_state((time_series::String, bkg_cov::String, seed::Int64, nanl::Int64,
obs_dim::Int64, obs_un:Float64, γ::Float64,
s_infl::Float64)::NamedTuple)
3D-VAR state estimation twin experiment.
Output from the experiment is saved in a dictionary of the form,
data = Dict{String,Any}(
"fore_rmse" => fore_rmse,
"filt_rmse" => filt_rmse,
"bkg_cov" => bkg_cov,
"seed" => seed,
"diffusion" => diffusion,
"dx_params" => dx_params,
"sys_dim" => sys_dim,
"obs_dim" => obs_dim,
"obs_un" => obs_un,
"γ" => γ,
"nanl" => nanl,
"tanl" => tanl,
"h" => h,
"s_infl" => round(s_infl, digits=2)
)
Experiment output is written to a directory defined by
path = pkgdir(DataAssimilationBenchmarks) * "/src/data/D3-var-bkg-" * bkg_cov * "/"
where the file name is written dynamically according to the selected parameters as follows:
"bkg-" * bkg_cov *
"_L96" *
"_state_seed_" * lpad(seed, 4, "0") *
"_diff_" * rpad(diffusion, 5, "0") *
"_sysD_" * lpad(sys_dim, 2, "0") *
"_obsD_" * lpad(obs_dim, 2, "0") *
"_obsU_" * rpad(obs_un, 4, "0") *
"_gamma_" * lpad(γ, 5, "0") *
"_nanl_" * lpad(nanl, 5, "0") *
"_tanl_" * rpad(tanl, 4, "0") *
"_h_" * rpad(h, 4, "0") *
"_stateInfl_" * rpad(round(s_infl, digits=3), 5, "0") *
".jld2"
DataAssimilationBenchmarks.FilterExps.ensemble_filter_param
— Methodensemble_filter_param((time_series::String, method::String, seed::Int64, nanl::Int64,
obs_un::Float64, obs_dim::Int64, γ::Float64, p_err::Float64,
p_wlk::Float64, N_ens::Int64, s_infl::Float64,
p_infl::Float64)::NamedTuple)
Ensemble filter joint state-parameter estimation twin experiment.
Output from the experiment is saved in a dictionary of the form,
data = Dict{String,Any}(
"fore_rmse" => fore_rmse,
"filt_rmse" => filt_rmse,
"param_rmse" => para_rmse,
"fore_spread" => fore_spread,
"filt_spread" => filt_spread,
"param_spread" => para_spread,
"method" => method,
"seed" => seed,
"diffusion" => diffusion,
"dx_params" => dx_params,
"param_truth" => param_truth,
"sys_dim" => sys_dim,
"state_dim" => state_dim,
"obs_dim" => obs_dim,
"obs_un" => obs_un,
"γ" => γ,
"p_err" => p_err,
"p_wlk" => p_wlk,
"nanl" => nanl,
"tanl" => tanl,
"h" => h,
"N_ens" => N_ens,
"s_infl" => round(s_infl, digits=2),
"p_infl" => round(p_infl, digits=2)
)
if haskey(ts, "diff_mat")
data["diff_mat"] = ts["diff_mat"]::Array{Float64,2}
end
Experiment output is written to a directory defined by
path = pkgdir(DataAssimilationBenchmarks) * "/src/data/" * method * "/"
where the file name is written dynamically according to the selected parameters as follows:
method *
"_" * model *
"_param_seed_" * lpad(seed, 4, "0") *
"_diff_" * rpad(diffusion, 5, "0") *
"_sysD_" * lpad(sys_dim, 2, "0") *
"_stateD_" * lpad(state_dim, 2, "0") *
"_obsD_" * lpad(obs_dim, 2, "0") *
"_obsU_" * rpad(obs_un, 4, "0") *
"_gamma_" * lpad(γ, 5, "0") *
"_paramE_" * rpad(p_err, 4, "0") *
"_paramW_" * rpad(p_wlk, 6, "0") *
"_nanl_" * lpad(nanl, 5, "0") *
"_tanl_" * rpad(tanl, 4, "0") *
"_h_" * rpad(h, 4, "0") *
"_nens_" * lpad(N_ens, 3, "0") *
"_stateInfl_" * rpad(round(s_infl, digits=2), 4, "0") *
"_paramInfl_" * rpad(round(p_infl, digits=2), 4, "0") *
".jld2"
DataAssimilationBenchmarks.FilterExps.ensemble_filter_state
— Methodensemble_filter_state((time_series::String, method::String, seed::Int64, nanl::Int64,
obs_un::Float64, obs_dim::Int64, γ::Float64, N_ens::Int64,
s_infl::Float64)::NamedTuple)
Ensemble filter state estimation twin experiment.
Output from the experiment is saved in a dictionary of the form,
data = Dict{String,Any}(
"fore_rmse" => fore_rmse,
"filt_rmse" => filt_rmse,
"fore_spread" => fore_spread,
"filt_spread" => filt_spread,
"method" => method,
"seed" => seed,
"diffusion" => diffusion,
"dx_params" => dx_params,
"sys_dim" => sys_dim,
"obs_dim" => obs_dim,
"obs_un" => obs_un,
"γ" => γ,
"nanl" => nanl,
"tanl" => tanl,
"h" => h,
"N_ens" => N_ens,
"s_infl" => round(s_infl, digits=2)
)
if haskey(ts, "diff_mat")
data["diff_mat"] = ts["diff_mat"]::Array{Float64,2}
end
Experiment output is written to a directory defined by
path = pkgdir(DataAssimilationBenchmarks) * "/src/data/" * method * "/"
where the file name is written dynamically according to the selected parameters as follows:
method *
"_" * model *
"_state_seed_" * lpad(seed, 4, "0") *
"_diff_" * rpad(diffusion, 5, "0") *
"_sysD_" * lpad(sys_dim, 2, "0") *
"_obsD_" * lpad(obs_dim, 2, "0") *
"_obsU_" * rpad(obs_un, 4, "0") *
"_gamma_" * lpad(γ, 5, "0") *
"_nanl_" * lpad(nanl, 5, "0") *
"_tanl_" * rpad(tanl, 4, "0") *
"_h_" * rpad(h, 4, "0") *
"_nens_" * lpad(N_ens, 3,"0") *
"_stateInfl_" * rpad(round(s_infl, digits=2), 4, "0") *
".jld2"