/** The input vectors i,j,k should contain offset zero values. */ block_obs_type * block_obs_alloc_complete(const char * obs_key, block_obs_source_type source_type , const stringlist_type * summary_keys , const void * data_config , const ecl_grid_type * grid , int size, const int * i, const int * j, const int * k, const double * obs_value, const double * obs_std) { block_obs_validate_ijk( grid , size , i,j,k); { block_obs_type * block_obs = block_obs_alloc( obs_key , data_config , grid ); if (block_obs) { for (int l=0; l < size; l++) { if (source_type == SOURCE_SUMMARY) { const char * sum_key = stringlist_iget( summary_keys , l ); block_obs_append_summary_obs( block_obs , i[l] , j[l] , k[l] , sum_key , obs_value[l] , obs_std[l]); } else block_obs_append_field_obs( block_obs , i[l] , j[l] , k[l] , obs_value[l] , obs_std[l]); } return block_obs; } else { util_abort("%s: internal error - block_obs_alloc() returned NULL \n",__func__); return NULL; } } }
void test_create_from_field(ecl_grid_type * grid) { field_config_type * field_config = field_config_alloc_empty( "PRESSURE" , grid , NULL ); block_obs_type * block_obs = block_obs_alloc( "ObsKey" , field_config , grid ); test_assert_true( block_obs_is_instance( block_obs )); test_assert_int_equal(0 , block_obs_get_size( block_obs )); block_obs_append_field_obs( block_obs , 10 , 12 , 8 , 100 , 25); test_assert_int_equal(1 , block_obs_get_size( block_obs )); block_obs_append_field_obs( block_obs , 10 , 12 , 9 , 100 , 25); test_assert_int_equal(2 , block_obs_get_size( block_obs )); block_obs_free( block_obs ); field_config_free( field_config ); }
void test_create_from_summary(ecl_grid_type * grid) { container_config_type * container_config = container_config_alloc( "Container"); block_obs_type * block_obs = block_obs_alloc( "ObsKey" , container_config , grid ); test_assert_true( block_obs_is_instance( block_obs )); test_assert_int_equal(0 , block_obs_get_size( block_obs )); block_obs_append_summary_obs( block_obs , 10 , 12 , 8 , "BPR:111,13,9" , 100 , 25); test_assert_int_equal(1 , block_obs_get_size( block_obs )); block_obs_append_summary_obs( block_obs , 10 , 12 , 9 , "BPR:11,13,10" , 100 , 25); test_assert_int_equal(2 , block_obs_get_size( block_obs )); block_obs_free( block_obs ); container_config_free( container_config ); }
void test_create_invalid_data(ecl_grid_type * grid) { void * data_config = NULL; test_assert_NULL(block_obs_alloc( "ObsKey" , data_config , grid )); }
obs_vector_type * obs_vector_alloc_from_BLOCK_OBSERVATION(const conf_instance_type * conf_instance , const ecl_grid_type * grid , const ecl_sum_type * refcase , const history_type * history, ensemble_config_type * ensemble_config) { if(!conf_instance_is_of_class(conf_instance, "BLOCK_OBSERVATION")) util_abort("%s: internal error. expected \"BLOCK_OBSERVATION\" instance, got \"%s\".\n", __func__, conf_instance_get_class_name_ref(conf_instance) ); block_obs_source_type source_type = SOURCE_SUMMARY; const char * obs_label = conf_instance_get_name_ref(conf_instance); const char * source_string = conf_instance_get_item_value_ref(conf_instance , "SOURCE"); const char * field_name = conf_instance_get_item_value_ref(conf_instance , "FIELD"); const char * sum_kw = NULL; bool OK = true; if (strcmp(source_string , "FIELD") == 0) { source_type = SOURCE_FIELD; if (!ensemble_config_has_key( ensemble_config , field_name)) { OK = false; fprintf(stderr,"** Warning the ensemble key:%s does not exist - observation:%s not added \n", field_name , obs_label); } } else if (strcmp( source_string , "SUMMARY") == 0) { source_type = SOURCE_SUMMARY; sum_kw = __summary_kw( field_name ); } else util_abort("%s: internal error \n",__func__); if (OK) { obs_vector_type * obs_vector = NULL; int size = history_get_last_restart( history ); int obs_restart_nr ; stringlist_type * summary_keys = stringlist_alloc_new(); stringlist_type * obs_pt_keys = conf_instance_alloc_list_of_sub_instances_of_class_by_name(conf_instance, "OBS"); int num_obs_pts = stringlist_get_size(obs_pt_keys); double * obs_value = util_calloc(num_obs_pts , sizeof * obs_value); double * obs_std = util_calloc(num_obs_pts , sizeof * obs_std ); int * obs_i = util_calloc(num_obs_pts , sizeof * obs_i ); int * obs_j = util_calloc(num_obs_pts , sizeof * obs_j ); int * obs_k = util_calloc(num_obs_pts , sizeof * obs_k ); obs_restart_nr = __conf_instance_get_restart_nr(conf_instance , obs_label , history , size); /** Build the observation. */ for(int obs_pt_nr = 0; obs_pt_nr < num_obs_pts; obs_pt_nr++) { const char * obs_key = stringlist_iget(obs_pt_keys, obs_pt_nr); const conf_instance_type * obs_instance = conf_instance_get_sub_instance_ref(conf_instance, obs_key); const char * error_mode = conf_instance_get_item_value_ref(obs_instance, "ERROR_MODE"); double error = conf_instance_get_item_value_double(obs_instance, "ERROR"); double value = conf_instance_get_item_value_double(obs_instance, "VALUE"); double min_error = conf_instance_get_item_value_double(obs_instance, "ERROR_MIN"); if (strcmp( error_mode , "REL") == 0) error *= value; else if (strcmp( error_mode , "RELMIN") == 0) error = util_double_max( error * value , min_error ); obs_value[obs_pt_nr] = value; obs_std [obs_pt_nr] = error; /** The input values i,j,k come from the user, and are offset 1. They are immediately shifted with -1 to become C-based offset zero. */ obs_i[obs_pt_nr] = conf_instance_get_item_value_int( obs_instance, "I") - 1; obs_j[obs_pt_nr] = conf_instance_get_item_value_int( obs_instance, "J") - 1; obs_k[obs_pt_nr] = conf_instance_get_item_value_int( obs_instance, "K") - 1; if (source_type == SOURCE_SUMMARY) { char * summary_key = smspec_alloc_block_ijk_key( SUMMARY_KEY_JOIN_STRING , sum_kw , obs_i[obs_pt_nr] + 1 , obs_j[obs_pt_nr] + 1 , obs_k[obs_pt_nr] + 1 ); stringlist_append_owned_ref( summary_keys , summary_key ); } } if (source_type == SOURCE_FIELD) { const enkf_config_node_type * config_node = ensemble_config_get_node( ensemble_config , field_name); const field_config_type * field_config = enkf_config_node_get_ref( config_node ); block_obs_type * block_obs = block_obs_alloc(obs_label, source_type , NULL , field_config , grid , num_obs_pts, obs_i, obs_j, obs_k, obs_value, obs_std); if (block_obs != NULL) { obs_vector = obs_vector_alloc( BLOCK_OBS , obs_label , ensemble_config_get_node(ensemble_config , field_name), size ); obs_vector_install_node( obs_vector , obs_restart_nr , block_obs); } } else if (source_type == SOURCE_SUMMARY) { OK = true; if (refcase != NULL) { for (int i=0; i < stringlist_get_size( summary_keys ); i++) { const char * sum_key = stringlist_iget( summary_keys , i ); if (!ecl_sum_has_key(refcase , sum_key)) { /* If the */ fprintf(stderr,"** Warning missing summary %s for cell: (%d,%d,%d) in refcase - make sure that \"BPR %d %d %d\" is included in ECLIPSE summary specification \n" , sum_key , obs_i[i]+1 , obs_j[i]+1 , obs_k[i]+1 , obs_i[i]+1 , obs_j[i]+1 , obs_k[i]+1 ); //OK = false; } } } if (OK) { // We can create the container node and add the summary nodes. enkf_config_node_type * container_config = ensemble_config_add_container( ensemble_config , NULL ); for (int i=0; i < stringlist_get_size( summary_keys ); i++) { const char * sum_key = stringlist_iget( summary_keys , i ); enkf_config_node_type * child_node = ensemble_config_add_summary( ensemble_config , sum_key , LOAD_FAIL_WARN ); enkf_config_node_update_container( container_config , child_node ); } { block_obs_type * block_obs = block_obs_alloc(obs_label, source_type , summary_keys , container_config , grid , num_obs_pts, obs_i, obs_j, obs_k, obs_value, obs_std); if (block_obs != NULL) { obs_vector = obs_vector_alloc( BLOCK_OBS , obs_label , container_config, size ); obs_vector_install_node( obs_vector , obs_restart_nr , block_obs); } } } } else util_abort("%s: invalid source value \n",__func__); free(obs_value); free(obs_std); free(obs_i); free(obs_j); free(obs_k); stringlist_free(obs_pt_keys); stringlist_free(summary_keys); return obs_vector; } else { fprintf(stderr,"** Warning the ensemble key:%s does not exist - observation:%s not added \n", field_name , obs_label); return NULL; } }