From b0c3bc5fbab628454fa9c3dc83da56e4345fab6c Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Fri, 5 Apr 2013 15:08:50 +0200 Subject: [PATCH] Added code for reading out grid dimensions from https://github.com/Ensembles/ert/commit/5c8ab75e76a58bfa3b17b1d8bca8fee4e99cca13 p4#: 21150 --- .../devel/libecl/include/ert/ecl/ecl_grid.h | 1 + ThirdParty/Ert/devel/libecl/src/ecl_grid.c | 101 ++++++++++++++++++ 2 files changed, 102 insertions(+) diff --git a/ThirdParty/Ert/devel/libecl/include/ert/ecl/ecl_grid.h b/ThirdParty/Ert/devel/libecl/include/ert/ecl/ecl_grid.h index 3d65451008..cbd8a73f1a 100644 --- a/ThirdParty/Ert/devel/libecl/include/ert/ecl/ecl_grid.h +++ b/ThirdParty/Ert/devel/libecl/include/ert/ecl/ecl_grid.h @@ -79,6 +79,7 @@ extern "C" { ecl_grid_type * ecl_grid_alloc_GRDECL_data(int , int , int , const float * , const float * , const int * , const float * mapaxes); ecl_grid_type * ecl_grid_alloc_GRID_data(int num_coords , int nx, int ny , int nz , int coords_size , int ** coords , float ** corners , const float * mapaxes); ecl_grid_type * ecl_grid_alloc(const char * ); + bool ecl_grid_file_dims( const char * grid_filename , const char * init_restart_filename , int * dims); ecl_grid_type * ecl_grid_load_case( const char * case_input ); ecl_grid_type * ecl_grid_alloc_rectangular( int nx , int ny , int nz , double dx , double dy , double dz , const int * actnum); ecl_grid_type * ecl_grid_alloc_regular( int nx, int ny , int nz , const double * ivec, const double * jvec , const double * kvec , const int * actnum); diff --git a/ThirdParty/Ert/devel/libecl/src/ecl_grid.c b/ThirdParty/Ert/devel/libecl/src/ecl_grid.c index c1707800ac..56ca5a85c7 100644 --- a/ThirdParty/Ert/devel/libecl/src/ecl_grid.c +++ b/ThirdParty/Ert/devel/libecl/src/ecl_grid.c @@ -2395,8 +2395,109 @@ ecl_grid_type * ecl_grid_alloc(const char * grid_file ) { return ecl_grid; } +static void ecl_grid_file_nactive_dims( fortio_type * data_fortio , int * dims) { + if (data_fortio) { + if (ecl_kw_fseek_kw( INTEHEAD_KW , false , false , data_fortio )) { + ecl_kw_type * intehead_kw = ecl_kw_fread_alloc( data_fortio ); + dims[3] = ecl_kw_iget_int( intehead_kw , INTEHEAD_NACTIVE_INDEX ); + ecl_kw_free( intehead_kw ); + } + } +} +static bool ecl_grid_file_EGRID_dims( fortio_type * grid_fortio , fortio_type * data_fortio , int * dims ) { + + if (ecl_kw_fseek_kw( GRIDHEAD_KW , false , false , grid_fortio)) { + { + ecl_kw_type * gridhead_kw = ecl_kw_fread_alloc( grid_fortio ); + dims[0] = ecl_kw_iget_int( gridhead_kw , GRIDHEAD_NX_INDEX ); + dims[1] = ecl_kw_iget_int( gridhead_kw , GRIDHEAD_NY_INDEX ); + dims[2] = ecl_kw_iget_int( gridhead_kw , GRIDHEAD_NZ_INDEX ); + + ecl_kw_free( gridhead_kw ); + } + ecl_grid_file_nactive_dims( data_fortio , dims ); + return true; + } else + return false; + +} + +static bool ecl_grid_file_GRID_dims( fortio_type * grid_fortio , fortio_type * data_fortio , int * dims ) { + + if (ecl_kw_fseek_kw( DIMENS_KW , false , false , grid_fortio)) { + { + ecl_kw_type * dimens_kw = ecl_kw_fread_alloc( grid_fortio ); + dims[0] = ecl_kw_iget_int( dimens_kw , DIMENS_NX_INDEX ); + dims[1] = ecl_kw_iget_int( dimens_kw , DIMENS_NY_INDEX ); + dims[2] = ecl_kw_iget_int( dimens_kw , DIMENS_NZ_INDEX ); + + ecl_kw_free( dimens_kw ); + } + + ecl_grid_file_nactive_dims( data_fortio , dims ); + return true; + } else + return false; + +} + +/** + Will check the grid dimensions from the input grid file + @grid_filename; the input file must be a GRID/EGRID file. On exit + the dims array will be filled as: + + dims[0] = nx; + dims[1] = ny; + dims[2] = nz; + + Optionally you can in addition supply the name of a restart or INIT + file in the second file argument - if-and-only-if, that filename + points to an existing file the fourth element in the dims array + will be set as: + + dims[3] = nactive; + + The function as a whole will return true if the grid dimensions + (nx,ny,nz) are sucessfully set. If the dimensions are not set the + dims vector is not touched. +*/ + + + +bool ecl_grid_file_dims( const char * grid_filename , const char * init_restart_filename , int * dims) { + bool input_file_OK = false; + bool grid_fmt_file; + ecl_file_enum grid_file_type = ecl_util_get_file_type( grid_filename , &grid_fmt_file , NULL ); + + if ((grid_file_type == ECL_GRID_FILE) || (grid_file_type == ECL_EGRID_FILE)) { + fortio_type * grid_fortio = fortio_open_reader( grid_filename , grid_fmt_file , ECL_ENDIAN_FLIP ); + if (grid_fortio) { + fortio_type * data_fortio = NULL; + bool data_fmt_file; + + if (init_restart_filename) { + ecl_file_enum data_file_type = ecl_util_get_file_type( init_restart_filename , &data_fmt_file , NULL ); + data_fortio = fortio_open_reader( init_restart_filename , data_fmt_file , ECL_ENDIAN_FLIP ); + } + + + if (grid_file_type == ECL_GRID_FILE) + input_file_OK = ecl_grid_file_GRID_dims( grid_fortio , data_fortio , dims ); + else + input_file_OK = ecl_grid_file_EGRID_dims( grid_fortio , data_fortio , dims ); + + if (data_fortio) + fortio_fclose( data_fortio ); + + fortio_fclose( grid_fortio ); + } + } + + return input_file_OK; +} + /**