33from __future__ import annotations
44
55import json
6- import mmap
76from struct import unpack
87from typing import TYPE_CHECKING
98
109import h5py
1110import numpy as np
11+ import surfio
1212
1313import xtgeo .common .sys as xsys
1414from xtgeo import _cxtgeo
@@ -50,31 +50,20 @@ def import_irap_binary(mfile: FileWrapper, values: bool = True, **_):
5050 if mfile .memstream :
5151 mfile .file .seek (0 )
5252 buf = mfile .file .read ()
53+ surf = surfio .IrapSurface .from_binary_buffer (buf )
5354 else :
54- with open (mfile .file , "rb" ) as fhandle :
55- buf = mmap .mmap (fhandle .fileno (), 0 , access = mmap .ACCESS_READ )
56-
57- # Ensure buffer is large enough for header
58- header_size = 100
59- if len (buf ) < header_size :
60- raise ValueError ("Buffer size is too small for header" )
61-
62- # unpack header with big-endian format string (cf. docstring info)
63- hed = np .frombuffer (
64- buf [:header_size ],
65- dtype = ">i4,>i4,>i4,>f4,>f4,>f4,>f4,>f4,>f4,>i4," # <32> IDFLAG NY XORI ... <32>
66- + ">i4,>i4,>f4,>f4,>f4,>i4," # <16> NX ROT X0ORI Y0ORI<16>
67- + ">i4,>i4,>i4,>i4,>i4,>i4,>i4,>i4,>i4" , # <28> 0 0 0 0 0 0 0 <28>
68- )
55+ surf = surfio .IrapSurface .from_binary_file (mfile .file )
56+
57+ header = surf .header
6958
7059 args = {}
71- args ["nrow" ] = int ( hed [ 0 ][ 2 ])
72- args ["xori" ] = float ( hed [ 0 ][ 3 ])
73- args ["yori" ] = float ( hed [ 0 ][ 5 ])
74- args ["xinc" ] = float ( hed [ 0 ][ 7 ])
75- args ["yinc" ] = float ( hed [ 0 ][ 8 ])
76- args ["ncol" ] = int ( hed [ 0 ][ 11 ])
77- args ["rotation" ] = float ( hed [ 0 ][ 12 ])
60+ args ["nrow" ] = header . nrow
61+ args ["xori" ] = header . xori
62+ args ["yori" ] = header . yori
63+ args ["xinc" ] = header . xinc
64+ args ["yinc" ] = header . yinc
65+ args ["ncol" ] = header . ncol
66+ args ["rotation" ] = header . rot
7867
7968 args ["yflip" ] = 1
8069 if args ["yinc" ] < 0.0 :
@@ -84,32 +73,15 @@ def import_irap_binary(mfile: FileWrapper, values: bool = True, **_):
8473 if not values :
8574 return args
8675
87- # Values: traverse through data blocks
88- stv = header_size # Starting byte
89- datav = []
90-
91- while stv < len (buf ):
92- # start block integer - number of bytes of floats in following block
93- blockv = np .frombuffer (buf [stv : stv + 4 ], dtype = ">i4" )[0 ]
94- stv += 4
95- # floats
96- datav .append (np .frombuffer (buf [stv : stv + blockv ], dtype = ">f4" ))
97- stv += blockv
98- # end block integer not needed really
99- stv += 4
100-
101- values = np .hstack (datav )
102- values = np .reshape (values , (args ["ncol" ], args ["nrow" ]), order = "F" )
103- values = np .array (values , order = "C" )
76+ values = surf .values
10477 values = np .ma .masked_greater_equal (values , UNDEF_MAP_IRAPB )
10578 args ["values" ] = np .ma .masked_invalid (values )
10679
107- del buf
10880 return args
10981
11082
11183def import_irap_ascii (mfile : FileWrapper , ** _ ):
112- """Import Irap in pure python code, suitable for memstreams, and now efficient.
84+ """Import Irap ascii which has the following format:
11385 -996 2010 5.000000 5.000000
11486 461587.553724 467902.553724 5927061.430176 5937106.430176
11587 1264 30.000011 461587.553724 5927061.430176
@@ -124,33 +96,30 @@ def import_irap_ascii(mfile: FileWrapper, **_):
12496 if mfile .memstream :
12597 mfile .file .seek (0 )
12698 buf = mfile .file .read ().decode ()
99+ surface = surfio .IrapSurface .from_ascii_string (buf )
100+ del buf
127101 else :
128- with open (mfile .file ) as fhandle :
129- buf = fhandle .read ()
130-
131- buf = buf .split (maxsplit = 19 )
132- args = {}
133- args ["nrow" ] = int (buf [1 ])
134- args ["xinc" ] = float (buf [2 ])
135- args ["yinc" ] = float (buf [3 ])
136- args ["xori" ] = float (buf [4 ])
137- args ["yori" ] = float (buf [6 ])
138- args ["ncol" ] = int (buf [8 ])
139- args ["rotation" ] = float (buf [9 ])
140-
141- nvalues = args ["nrow" ] * args ["ncol" ]
142- values = np .fromstring (buf [19 ], dtype = np .double , count = nvalues , sep = " " )
143-
144- values = np .reshape (values , (args ["ncol" ], args ["nrow" ]), order = "F" )
145- values = np .array (values , order = "C" )
146- args ["values" ] = np .ma .masked_greater_equal (values , UNDEF_MAP_IRAPA )
102+ surface = surfio .IrapSurface .from_ascii_file (str (mfile .file ))
103+
104+ values = surface .values
105+ values = np .ma .masked_greater_equal (values , UNDEF_MAP_IRAPA )
106+ values = np .ma .masked_invalid (values )
107+ args = {
108+ "nrow" : surface .header .nrow ,
109+ "xinc" : surface .header .xinc ,
110+ "yinc" : surface .header .yinc ,
111+ "xori" : surface .header .xori ,
112+ "yori" : surface .header .yori ,
113+ "ncol" : surface .header .ncol ,
114+ "rotation" : surface .header .rot ,
115+ "values" : surface .values ,
116+ }
147117
148118 args ["yflip" ] = 1
149119 if args ["yinc" ] < 0.0 :
150120 args ["yinc" ] *= - 1
151121 args ["yflip" ] = - 1
152122
153- del buf
154123 return args
155124
156125
0 commit comments