The File Format
The file format used by several oil reservoir simulators originate in fortrans WRITE and READ functions which had two modes, formatted or unformatted. Formatted would produce ASCII and unformatted produced binary.
General layout
The file consists of a series of records holding information about a named array. Each record has the following fields (in the order they appear):
The keyword (the arrays name)
The length of the array
The type of the array
The data of the array (the elements)
The keyword is a ascii string of 8 characters, the length a 32bit number, and the type one of the following 4 character strings:
INTE
REAL
LOGI
CHAR
C0XX (where XX is a number between 01 and 99)
MESS
X231
Formatted
The formatted res file format is very similar to the the unformatted files, except ascii. The layout is as follows
keyword
length
type
values
Both the keyword and type is delimited by single quotes, and uses padding:
- ‘SWAT ‘ 3 ‘REAL’
0.10500000E+00 0.10500000E+00 0.10500000E+00
Some, perhaps most, reservoir simulators that implement this format are fussy about the whitespace, both between numbers and string literals and padding inside string literals.
The keyword, length and type uses the following Fortran formatting specifyer:
(1X, "'", A8, "'", 1X, I11, 1X, "'", A4, "'")
On the next line starts the elements of the array which have the following fortran formatting specifiers, based on type:
INTE: 6(1X, I11)
REAL: 4(1X, E16.8)
LOGI: 25(1X, L2)
DOUB: 3(1X, D22.14)
CHAR: 7(1X, “’”, A8, “’”)
COXX: (1X, “’”, AXX, “’”)
Unformatted
The unformatted res file format is a binary format based on the fortran fwrite.
All numerical values are big-endian.
Generally, each array/keyword pair is layed out as follows:
Fortran header
keyword
array length
element type
Fortran footer
Fortran header
grouped array elements
Fortran footer
The exceptions to this layout is arrays of length > 2**31 which has an additional header of type X231:
Fortran header
keyword
array length // 2**31 * -1
X231
Fortran footer
Fortran header
keyword
array length % 2**31
element type
Fortran footer
Fortran header
grouped array elements
Fortran footer
The fortran header and footer is a 4 byte signed integer of the number of bytes in the group. Since keywords are 4 charactes, array length is a 32bit integer and the type is a 4 character string, the first header and footer is both 8+4+4=16.
Each array has a max number of elements per group, 1000 for numerical values and 105 for strings. Hence 1500 int elements will be layed out as follows:
16 (fortran header)
KEYWORD1
1500 (as big endian 32bit integer)
INTE
16 (fortran footer)
4000 (fortran header)
first 1000 elements
4000 (fortran footer)
2000 (fortran header)
last 500 elements
2000 (fortran footer)