int enkf_config_node_load_obs( const enkf_config_node_type * config_node , enkf_obs_type * enkf_obs ,const char * key_index , int obs_count , time_t * _sim_time , double * _y , double * _std) { ert_impl_type impl_type = enkf_config_node_get_impl_type(config_node); int num_obs = 0; int iobs; for (iobs = 0; iobs < stringlist_get_size( config_node->obs_keys ); iobs++) { obs_vector_type * obs_vector = enkf_obs_get_vector( enkf_obs , stringlist_iget( config_node->obs_keys , iobs)); int report_step = -1; while (true) { report_step = obs_vector_get_next_active_step( obs_vector , report_step); if (report_step == -1) break; { bool valid; double value , std1; /** The user index used when calling the user_get function on the gen_obs data type is different depending on whether is called with a data context user_key (as here) or with a observation context user_key (as when plotting an observation plot). See more documentation of the function gen_obs_user_get_data_index(). */ if (impl_type == GEN_DATA) gen_obs_user_get_with_data_index( obs_vector_iget_node( obs_vector , report_step ) , key_index , &value , &std1 , &valid); else obs_vector_user_get( obs_vector , key_index , report_step , &value , &std1 , &valid); if (valid) { if (obs_count > 0) { _sim_time[num_obs] = enkf_obs_iget_obs_time( enkf_obs , report_step ); _y[num_obs] = value; _std[num_obs] = std1; } num_obs++; } } } } /* Sorting the observations in time order. */ if (obs_count > 0) { double_vector_type * y = double_vector_alloc_shared_wrapper( 0 , 0 , _y , obs_count ); double_vector_type * std = double_vector_alloc_shared_wrapper( 0 , 0 , _std , obs_count ); time_t_vector_type * sim_time = time_t_vector_alloc_shared_wrapper( 0 , 0 , _sim_time , obs_count ); int * sort_perm = time_t_vector_alloc_sort_perm( sim_time ); time_t_vector_permute( sim_time , sort_perm ); double_vector_permute( y , sort_perm ); double_vector_permute( std , sort_perm ); free( sort_perm ); double_vector_free( y ); double_vector_free( std ); time_t_vector_free( sim_time ); } return num_obs; }
void test_gendata( enkf_main_type * enkf_main , const char * obs_key , int report_step ) { enkf_obs_type * enkf_obs = enkf_main_get_obs( enkf_main ); obs_vector_type * obs_vector = enkf_obs_get_vector( enkf_obs , obs_key); { enkf_plot_gendata_type * gen_data = enkf_plot_gendata_alloc_from_obs_vector( obs_vector ); enkf_fs_type * fs = enkf_main_get_fs( enkf_main ); gen_obs_type * gen_obs = obs_vector_iget_node( obs_vector , report_step ); { double value; double std; bool valid; gen_obs_user_get_with_data_index(gen_obs , "0" , &value , &std , &valid ); test_assert_double_equal( 0.143841 , value ); test_assert_double_equal( 0.0300 , std ); test_assert_true( valid ); } enkf_plot_gendata_load(gen_data, fs, report_step, FORECAST, NULL); test_assert_int_equal( enkf_main_get_ensemble_size( enkf_main ) , enkf_plot_gendata_get_size( gen_data )); { enkf_plot_genvector_type * vector = enkf_plot_gendata_iget( gen_data , 24); test_assert_true( enkf_plot_genvector_is_instance( vector )); test_assert_double_equal( 0.675537 , enkf_plot_genvector_iget( vector , 0 )); test_assert_double_equal( 0.682635 , enkf_plot_genvector_iget( vector , 1 )); test_assert_double_equal( 0.616371 , enkf_plot_genvector_iget( vector , 2 )); } { enkf_plot_genvector_type * vector = enkf_plot_gendata_iget( gen_data , 9 ); test_assert_true( enkf_plot_genvector_is_instance( vector )); test_assert_double_equal( -0.515033 , enkf_plot_genvector_iget( vector , 0 )); test_assert_double_equal( -0.507350 , enkf_plot_genvector_iget( vector , 1 )); test_assert_double_equal( -0.541030 , enkf_plot_genvector_iget( vector , 2 )); } enkf_plot_gendata_free( gen_data ); } }