ecl_rsthead_type * ecl_rsthead_ialloc( const ecl_file_type * rst_file , int occurence) { if (ecl_file_get_num_named_kw( rst_file , INTEHEAD_KW) > occurence) { const ecl_kw_type * intehead_kw = ecl_file_iget_named_kw( rst_file , INTEHEAD_KW , occurence); ecl_rsthead_type * rsthead = util_malloc( sizeof * rsthead ); { const int * data = (const int *) ecl_kw_get_void_ptr( intehead_kw ); rsthead->day = data[INTEHEAD_DAY_INDEX]; rsthead->month = data[INTEHEAD_MONTH_INDEX]; rsthead->year = data[INTEHEAD_YEAR_INDEX]; rsthead->version = data[INTEHEAD_IPROG_INDEX]; rsthead->phase_sum = data[INTEHEAD_PHASE_INDEX]; rsthead->nx = data[INTEHEAD_NX_INDEX]; rsthead->ny = data[INTEHEAD_NY_INDEX]; rsthead->nz = data[INTEHEAD_NZ_INDEX]; rsthead->nactive = data[INTEHEAD_NACTIVE_INDEX]; rsthead->nwells = data[INTEHEAD_NWELLS_INDEX]; rsthead->niwelz = data[INTEHEAD_NIWELZ_INDEX]; rsthead->nzwelz = data[INTEHEAD_NZWELZ_INDEX]; rsthead->nsconz = data[INTEHEAD_NSCONZ_INDEX]; rsthead->niconz = data[INTEHEAD_NICONZ_INDEX]; rsthead->ncwmax = data[INTEHEAD_NCWMAX_INDEX]; rsthead->nisegz = data[INTEHEAD_NISEGZ_INDEX]; rsthead->nsegmx = data[INTEHEAD_NSEGMX_INDEX]; rsthead->nswlmx = data[INTEHEAD_NSWLMX_INDEX]; rsthead->nrsegz = data[INTEHEAD_NRSEGZ_INDEX]; // The only derived quantity rsthead->sim_time = rsthead_date( rsthead->day , rsthead->month , rsthead->year ); } if (ecl_file_get_num_named_kw(rst_file, DOUBHEAD_KW) > occurence) { const ecl_kw_type * doubhead_kw = ecl_file_iget_named_kw( rst_file , DOUBHEAD_KW , occurence); rsthead->sim_days = ecl_kw_iget_double( doubhead_kw , DOUBHEAD_DAYS_INDEX ); } if (ecl_file_get_num_named_kw(rst_file, LOGIHEAD_KW) > occurence) { const ecl_kw_type * logihead_kw = ecl_file_iget_named_kw( rst_file , LOGIHEAD_KW , occurence); rsthead->dualp = ecl_kw_iget_bool( logihead_kw , LOGIHEAD_DUALP_INDEX); } else rsthead->dualp = false; return rsthead; } else return NULL; }
ecl_rsthead_type * ecl_rsthead_alloc_from_kw( int report_step , const ecl_kw_type * intehead_kw , const ecl_kw_type * doubhead_kw , const ecl_kw_type * logihead_kw ) { ecl_rsthead_type * rsthead = util_malloc( sizeof * rsthead ); rsthead->report_step = report_step; { const int * data = (const int *) ecl_kw_get_void_ptr( intehead_kw ); rsthead->day = data[INTEHEAD_DAY_INDEX]; rsthead->month = data[INTEHEAD_MONTH_INDEX]; rsthead->year = data[INTEHEAD_YEAR_INDEX]; rsthead->version = data[INTEHEAD_IPROG_INDEX]; rsthead->phase_sum = data[INTEHEAD_PHASE_INDEX]; rsthead->nx = data[INTEHEAD_NX_INDEX]; rsthead->ny = data[INTEHEAD_NY_INDEX]; rsthead->nz = data[INTEHEAD_NZ_INDEX]; rsthead->nactive = data[INTEHEAD_NACTIVE_INDEX]; rsthead->nwells = data[INTEHEAD_NWELLS_INDEX]; rsthead->niwelz = data[INTEHEAD_NIWELZ_INDEX]; rsthead->nzwelz = data[INTEHEAD_NZWELZ_INDEX]; rsthead->nsconz = data[INTEHEAD_NSCONZ_INDEX]; rsthead->niconz = data[INTEHEAD_NICONZ_INDEX]; rsthead->ncwmax = data[INTEHEAD_NCWMAX_INDEX]; rsthead->nisegz = data[INTEHEAD_NISEGZ_INDEX]; rsthead->nsegmx = data[INTEHEAD_NSEGMX_INDEX]; rsthead->nswlmx = data[INTEHEAD_NSWLMX_INDEX]; rsthead->nrsegz = data[INTEHEAD_NRSEGZ_INDEX]; // The only derived quantity rsthead->sim_time = rsthead_date( rsthead->day , rsthead->month , rsthead->year ); } if (doubhead_kw) rsthead->sim_days = ecl_kw_iget_double( doubhead_kw , DOUBHEAD_DAYS_INDEX ); if (logihead_kw) rsthead->dualp = ecl_kw_iget_bool( logihead_kw , LOGIHEAD_DUALP_INDEX); return rsthead; }
void rms_export_roff_from_keyword(const char *filename, ecl_grid_type *ecl_grid, ecl_kw_type **ecl_kw, int size) { rms_file_type *rms_file; rms_tagkey_type *data_key; int nx, ny, nz, active_size; int i, j, k; int global_size; int n; ecl_grid_get_dims(ecl_grid, &nx, &ny, &nz, &active_size); global_size = ecl_grid_get_global_size(ecl_grid); rms_file = rms_file_alloc(filename, false); rms_file_fopen_w(rms_file); rms_file_init_fwrite(rms_file , "parameter"); rms_tag_fwrite_dimensions(nx , ny , nz , rms_file_get_FILE(rms_file)); for (n = 0; n < size; n++) { float *src_data; float *target_data; src_data = (float *) ecl_kw_get_void_ptr(ecl_kw[n]); target_data = util_calloc(global_size , sizeof * target_data ); for (k=0; k < nz; k++) { for (j=0; j < ny; j++) { for (i=0; i < nx; i++) { int index1D; int index3D; double fill = RMS_INACTIVE_FLOAT; /* TODO: * This currently only supports FLOAT / REAL type. */ index1D = ecl_grid_get_active_index3(ecl_grid, i, j, k); index3D = rms_util_global_index_from_eclipse_ijk(nx, ny, nz, i, j, k); if (index1D >= 0) target_data[index3D] = src_data[index1D]; else memcpy(&target_data[index3D] , &fill, sizeof(float)); } } } data_key = rms_tagkey_alloc_complete("data", global_size, rms_util_convert_ecl_type(ecl_kw_get_data_type(ecl_kw[n])) , target_data, true); rms_tag_fwrite_parameter(ecl_kw_get_header8(ecl_kw[n]), data_key, rms_file_get_FILE(rms_file)); rms_tagkey_free(data_key); util_safe_free(target_data); } rms_file_complete_fwrite(rms_file); rms_file_fclose(rms_file); rms_file_free(rms_file); }