static void layer_trace_block_content__( layer_type * layer , bool erase , int i , int j , int value , bool * visited , int_vector_type * i_list , int_vector_type * j_list) { int g = layer_get_global_cell_index( layer , i , j); cell_type * cell = &layer->data[g]; if (cell->cell_value != value || visited[g]) return; { visited[g] = true; if (erase) layer_iset_cell_value( layer , i , j , 0); int_vector_append( i_list , i ); int_vector_append( j_list , j ); if (i > 0) layer_trace_block_content__( layer , erase , i - 1 , j , value , visited , i_list , j_list); if (i < (layer->nx - 1)) layer_trace_block_content__( layer , erase , i + 1 , j , value , visited , i_list , j_list); if (j > 0) layer_trace_block_content__( layer , erase , i , j - 1, value , visited , i_list , j_list); if (j < (layer->ny - 1)) layer_trace_block_content__( layer , erase , i , j + 1, value , visited , i_list , j_list); } }
bool fault_block_layer_scan_kw( fault_block_layer_type * layer , const ecl_kw_type * fault_block_kw) { bool assign_zero = true; if (ecl_kw_get_size( fault_block_kw) != ecl_grid_get_global_size(layer->grid)) return false; else if (!ecl_type_is_int(ecl_kw_get_data_type( fault_block_kw ))) return false; else { int i,j; int max_block_id = 0; layer_type * work_layer = layer_alloc( ecl_grid_get_nx( layer->grid ) , ecl_grid_get_ny( layer->grid )); for (j=0; j < ecl_grid_get_ny( layer->grid ); j++) { for (i=0; i < ecl_grid_get_nx( layer->grid ); i++) { int g = ecl_grid_get_global_index3( layer->grid , i , j , layer->k ); int block_id = ecl_kw_iget_int( fault_block_kw , g ); if (block_id > 0) { layer_iset_cell_value( work_layer , i , j , block_id ); max_block_id = util_int_max( block_id , max_block_id ); } } } if (assign_zero) layer_replace_cell_values( work_layer , 0 , max_block_id + 1); fault_block_layer_scan_layer( layer , work_layer ); layer_free( work_layer ); return true; } }
int layer_replace_cell_values( layer_type * layer , int old_value , int new_value) { int i,j; int replace_count = 0; for (j=0; j < layer->ny; j++) { for (i=0; i < layer->nx; i++) { if (layer_iget_cell_value( layer , i , j ) == old_value) { layer_iset_cell_value( layer , i , j , new_value); replace_count++; } } } return replace_count; }
void layer_update_connected_cells( layer_type * layer , int i , int j , int org_value , int new_value) { if (org_value != new_value) { if (layer_iget_cell_value( layer , i , j ) == org_value) { layer_iset_cell_value( layer , i , j , new_value); if (i < (layer->nx - 1) && layer_cell_contact( layer , i,j,i+1,j)) layer_update_connected_cells( layer , i + 1 , j , org_value , new_value); if (i > 0 && layer_cell_contact( layer , i,j,i-1,j)) layer_update_connected_cells( layer , i - 1 , j , org_value , new_value); if (j < (layer->ny - 1) && layer_cell_contact( layer , i,j,i,j+1)) layer_update_connected_cells( layer , i , j + 1, org_value , new_value); if (j > 0 && layer_cell_contact( layer , i,j,i,j-1)) layer_update_connected_cells( layer , i , j - 1, org_value , new_value); } } }