예제 #1
0
파일: layer.c 프로젝트: YingfangZhou/ert
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);
    
  }
}
예제 #2
0
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;
  }
}
예제 #3
0
파일: layer.c 프로젝트: YingfangZhou/ert
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;
}
예제 #4
0
파일: layer.c 프로젝트: Ensembles/ert
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);
    }
  }
}