xtgeo 4.14.1__cp313-cp313-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- cxtgeo.py +558 -0
- cxtgeoPYTHON_wrap.c +19537 -0
- xtgeo/__init__.py +248 -0
- xtgeo/_cxtgeo.cp313-win_amd64.pyd +0 -0
- xtgeo/_internal.cp313-win_amd64.pyd +0 -0
- xtgeo/common/__init__.py +19 -0
- xtgeo/common/_angles.py +29 -0
- xtgeo/common/_xyz_enum.py +50 -0
- xtgeo/common/calc.py +396 -0
- xtgeo/common/constants.py +30 -0
- xtgeo/common/exceptions.py +42 -0
- xtgeo/common/log.py +93 -0
- xtgeo/common/sys.py +166 -0
- xtgeo/common/types.py +18 -0
- xtgeo/common/version.py +34 -0
- xtgeo/common/xtgeo_dialog.py +604 -0
- xtgeo/cube/__init__.py +9 -0
- xtgeo/cube/_cube_export.py +214 -0
- xtgeo/cube/_cube_import.py +532 -0
- xtgeo/cube/_cube_roxapi.py +180 -0
- xtgeo/cube/_cube_utils.py +287 -0
- xtgeo/cube/_cube_window_attributes.py +273 -0
- xtgeo/cube/cube1.py +1023 -0
- xtgeo/grid3d/__init__.py +15 -0
- xtgeo/grid3d/_ecl_grid.py +778 -0
- xtgeo/grid3d/_ecl_inte_head.py +152 -0
- xtgeo/grid3d/_ecl_logi_head.py +71 -0
- xtgeo/grid3d/_ecl_output_file.py +81 -0
- xtgeo/grid3d/_egrid.py +1004 -0
- xtgeo/grid3d/_find_gridprop_in_eclrun.py +625 -0
- xtgeo/grid3d/_grdecl_format.py +309 -0
- xtgeo/grid3d/_grdecl_grid.py +400 -0
- xtgeo/grid3d/_grid3d.py +29 -0
- xtgeo/grid3d/_grid3d_fence.py +284 -0
- xtgeo/grid3d/_grid3d_utils.py +228 -0
- xtgeo/grid3d/_grid_boundary.py +76 -0
- xtgeo/grid3d/_grid_etc1.py +1683 -0
- xtgeo/grid3d/_grid_export.py +222 -0
- xtgeo/grid3d/_grid_hybrid.py +50 -0
- xtgeo/grid3d/_grid_import.py +79 -0
- xtgeo/grid3d/_grid_import_ecl.py +101 -0
- xtgeo/grid3d/_grid_import_roff.py +135 -0
- xtgeo/grid3d/_grid_import_xtgcpgeom.py +375 -0
- xtgeo/grid3d/_grid_refine.py +258 -0
- xtgeo/grid3d/_grid_roxapi.py +292 -0
- xtgeo/grid3d/_grid_translate_coords.py +154 -0
- xtgeo/grid3d/_grid_wellzone.py +165 -0
- xtgeo/grid3d/_gridprop_export.py +202 -0
- xtgeo/grid3d/_gridprop_import_eclrun.py +164 -0
- xtgeo/grid3d/_gridprop_import_grdecl.py +132 -0
- xtgeo/grid3d/_gridprop_import_roff.py +52 -0
- xtgeo/grid3d/_gridprop_import_xtgcpprop.py +168 -0
- xtgeo/grid3d/_gridprop_lowlevel.py +171 -0
- xtgeo/grid3d/_gridprop_op1.py +272 -0
- xtgeo/grid3d/_gridprop_roxapi.py +301 -0
- xtgeo/grid3d/_gridprop_value_init.py +140 -0
- xtgeo/grid3d/_gridprops_import_eclrun.py +344 -0
- xtgeo/grid3d/_gridprops_import_roff.py +83 -0
- xtgeo/grid3d/_roff_grid.py +470 -0
- xtgeo/grid3d/_roff_parameter.py +303 -0
- xtgeo/grid3d/grid.py +3010 -0
- xtgeo/grid3d/grid_properties.py +699 -0
- xtgeo/grid3d/grid_property.py +1313 -0
- xtgeo/grid3d/types.py +15 -0
- xtgeo/interfaces/rms/__init__.py +18 -0
- xtgeo/interfaces/rms/_regular_surface.py +460 -0
- xtgeo/interfaces/rms/_rms_base.py +100 -0
- xtgeo/interfaces/rms/_rmsapi_package.py +69 -0
- xtgeo/interfaces/rms/rmsapi_utils.py +438 -0
- xtgeo/io/__init__.py +1 -0
- xtgeo/io/_file.py +603 -0
- xtgeo/metadata/__init__.py +17 -0
- xtgeo/metadata/metadata.py +435 -0
- xtgeo/roxutils/__init__.py +7 -0
- xtgeo/roxutils/_roxar_loader.py +54 -0
- xtgeo/roxutils/_roxutils_etc.py +122 -0
- xtgeo/roxutils/roxutils.py +207 -0
- xtgeo/surface/__init__.py +20 -0
- xtgeo/surface/_regsurf_boundary.py +26 -0
- xtgeo/surface/_regsurf_cube.py +210 -0
- xtgeo/surface/_regsurf_cube_window.py +391 -0
- xtgeo/surface/_regsurf_cube_window_v2.py +297 -0
- xtgeo/surface/_regsurf_cube_window_v3.py +360 -0
- xtgeo/surface/_regsurf_export.py +388 -0
- xtgeo/surface/_regsurf_grid3d.py +275 -0
- xtgeo/surface/_regsurf_gridding.py +347 -0
- xtgeo/surface/_regsurf_ijxyz_parser.py +278 -0
- xtgeo/surface/_regsurf_import.py +347 -0
- xtgeo/surface/_regsurf_lowlevel.py +122 -0
- xtgeo/surface/_regsurf_oper.py +538 -0
- xtgeo/surface/_regsurf_utils.py +81 -0
- xtgeo/surface/_surfs_import.py +43 -0
- xtgeo/surface/_zmap_parser.py +138 -0
- xtgeo/surface/regular_surface.py +3043 -0
- xtgeo/surface/surfaces.py +276 -0
- xtgeo/well/__init__.py +24 -0
- xtgeo/well/_blockedwell_roxapi.py +241 -0
- xtgeo/well/_blockedwells_roxapi.py +68 -0
- xtgeo/well/_well_aux.py +30 -0
- xtgeo/well/_well_io.py +327 -0
- xtgeo/well/_well_oper.py +483 -0
- xtgeo/well/_well_roxapi.py +304 -0
- xtgeo/well/_wellmarkers.py +486 -0
- xtgeo/well/_wells_utils.py +158 -0
- xtgeo/well/blocked_well.py +220 -0
- xtgeo/well/blocked_wells.py +134 -0
- xtgeo/well/well1.py +1516 -0
- xtgeo/well/wells.py +211 -0
- xtgeo/xyz/__init__.py +6 -0
- xtgeo/xyz/_polygons_oper.py +272 -0
- xtgeo/xyz/_xyz.py +758 -0
- xtgeo/xyz/_xyz_data.py +646 -0
- xtgeo/xyz/_xyz_io.py +737 -0
- xtgeo/xyz/_xyz_lowlevel.py +42 -0
- xtgeo/xyz/_xyz_oper.py +613 -0
- xtgeo/xyz/_xyz_roxapi.py +766 -0
- xtgeo/xyz/points.py +698 -0
- xtgeo/xyz/polygons.py +827 -0
- xtgeo-4.14.1.dist-info/METADATA +146 -0
- xtgeo-4.14.1.dist-info/RECORD +122 -0
- xtgeo-4.14.1.dist-info/WHEEL +5 -0
- xtgeo-4.14.1.dist-info/licenses/LICENSE.md +165 -0
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
"""Import RegularSurface data."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import json
|
|
6
|
+
import mmap
|
|
7
|
+
from struct import unpack
|
|
8
|
+
from typing import TYPE_CHECKING
|
|
9
|
+
|
|
10
|
+
import h5py
|
|
11
|
+
import numpy as np
|
|
12
|
+
|
|
13
|
+
import xtgeo.common.sys as xsys
|
|
14
|
+
from xtgeo import _cxtgeo
|
|
15
|
+
from xtgeo.common.constants import UNDEF, UNDEF_LIMIT, UNDEF_MAP_IRAPA, UNDEF_MAP_IRAPB
|
|
16
|
+
from xtgeo.common.log import null_logger
|
|
17
|
+
from xtgeo.common.xtgeo_dialog import XTGeoDialog
|
|
18
|
+
from xtgeo.metadata.metadata import MetaDataRegularSurface
|
|
19
|
+
|
|
20
|
+
from ._regsurf_ijxyz_parser import parse_ijxyz
|
|
21
|
+
from ._zmap_parser import parse_zmap
|
|
22
|
+
|
|
23
|
+
if TYPE_CHECKING:
|
|
24
|
+
from xtgeo.cube.cube1 import Cube
|
|
25
|
+
from xtgeo.io._file import FileWrapper
|
|
26
|
+
from xtgeo.surface.regular_surface import RegularSurface
|
|
27
|
+
|
|
28
|
+
xtg = XTGeoDialog()
|
|
29
|
+
|
|
30
|
+
logger = null_logger(__name__)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def import_irap_binary(mfile: FileWrapper, values: bool = True, **_):
|
|
34
|
+
"""Using pure python from version 4.X.
|
|
35
|
+
|
|
36
|
+
Reverse engineering says that the BINARY header is
|
|
37
|
+
<32> IDFLAG NY XORI XMAX YORI YMAX XINC YINC <32>
|
|
38
|
+
<16> NX ROT X0ORI Y0ORI<16>
|
|
39
|
+
<28> 0 0 0 0 0 0 0 <28>
|
|
40
|
+
---data---
|
|
41
|
+
Note, XMAX and YMAX are based on unroted distances and are
|
|
42
|
+
not used directly? =>
|
|
43
|
+
XINC = (XMAX-XORI)/(NX-1) etc
|
|
44
|
+
X0ORI/Y0ORI seems to be rotation origin? Set them equal to XORI/YORI
|
|
45
|
+
|
|
46
|
+
"""
|
|
47
|
+
|
|
48
|
+
logger.info("Enter function %s", __name__)
|
|
49
|
+
|
|
50
|
+
if mfile.memstream:
|
|
51
|
+
mfile.file.seek(0)
|
|
52
|
+
buf = mfile.file.read()
|
|
53
|
+
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
|
+
)
|
|
69
|
+
|
|
70
|
+
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])
|
|
78
|
+
|
|
79
|
+
args["yflip"] = 1
|
|
80
|
+
if args["yinc"] < 0.0:
|
|
81
|
+
args["yinc"] *= -1
|
|
82
|
+
args["yflip"] = -1
|
|
83
|
+
|
|
84
|
+
if not values:
|
|
85
|
+
return args
|
|
86
|
+
|
|
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")
|
|
104
|
+
values = np.ma.masked_greater_equal(values, UNDEF_MAP_IRAPB)
|
|
105
|
+
args["values"] = np.ma.masked_invalid(values)
|
|
106
|
+
|
|
107
|
+
del buf
|
|
108
|
+
return args
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def import_irap_ascii(mfile: FileWrapper, **_):
|
|
112
|
+
"""Import Irap in pure python code, suitable for memstreams, and now efficient.
|
|
113
|
+
-996 2010 5.000000 5.000000
|
|
114
|
+
461587.553724 467902.553724 5927061.430176 5937106.430176
|
|
115
|
+
1264 30.000011 461587.553724 5927061.430176
|
|
116
|
+
0 0 0 0 0 0 0
|
|
117
|
+
1677.3239 1677.3978 1677.4855 1677.5872 1677.7034 1677.8345
|
|
118
|
+
1677.9807 1678.1420 1678.3157 1678.5000 1678.6942 1678.8973
|
|
119
|
+
1679.1086 1679.3274 1679.5524 1679.7831 1680.0186 1680.2583
|
|
120
|
+
1680.5016 1680.7480 1680.9969 1681.2479 1681.5004 1681.7538
|
|
121
|
+
....
|
|
122
|
+
"""
|
|
123
|
+
|
|
124
|
+
if mfile.memstream:
|
|
125
|
+
mfile.file.seek(0)
|
|
126
|
+
buf = mfile.file.read().decode()
|
|
127
|
+
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)
|
|
147
|
+
|
|
148
|
+
args["yflip"] = 1
|
|
149
|
+
if args["yinc"] < 0.0:
|
|
150
|
+
args["yinc"] *= -1
|
|
151
|
+
args["yflip"] = -1
|
|
152
|
+
|
|
153
|
+
del buf
|
|
154
|
+
return args
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
def import_ijxyz(
|
|
158
|
+
mfile: FileWrapper,
|
|
159
|
+
template: RegularSurface | Cube | None = None,
|
|
160
|
+
**_,
|
|
161
|
+
) -> dict:
|
|
162
|
+
"""Import OW/DSG IJXYZ ascii format."""
|
|
163
|
+
ijxyz_data = parse_ijxyz(mfile, template)
|
|
164
|
+
|
|
165
|
+
return {
|
|
166
|
+
"ncol": ijxyz_data.ncol,
|
|
167
|
+
"nrow": ijxyz_data.nrow,
|
|
168
|
+
"xori": ijxyz_data.xori,
|
|
169
|
+
"yori": ijxyz_data.yori,
|
|
170
|
+
"xinc": ijxyz_data.xinc,
|
|
171
|
+
"yinc": ijxyz_data.yinc,
|
|
172
|
+
"values": ijxyz_data.values,
|
|
173
|
+
"ilines": ijxyz_data.ilines,
|
|
174
|
+
"xlines": ijxyz_data.xlines,
|
|
175
|
+
"yflip": ijxyz_data.yflip,
|
|
176
|
+
"rotation": ijxyz_data.rotation,
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def import_petromod(mfile: FileWrapper, **_):
|
|
181
|
+
"""Import Petromod binary format."""
|
|
182
|
+
|
|
183
|
+
cfhandle = mfile.get_cfhandle()
|
|
184
|
+
|
|
185
|
+
logger.info("Enter function %s", __name__)
|
|
186
|
+
|
|
187
|
+
# read with mode 0, to get mx my and other metadata
|
|
188
|
+
dsc, _ = _cxtgeo.surf_import_petromod_bin(cfhandle, 0, 0.0, 0, 0, 0)
|
|
189
|
+
|
|
190
|
+
fields = dsc.split(",")
|
|
191
|
+
|
|
192
|
+
rota_xori = 0
|
|
193
|
+
rota_yori = 0
|
|
194
|
+
undef = 999999.0
|
|
195
|
+
args = {}
|
|
196
|
+
for field in fields:
|
|
197
|
+
key, value = field.split("=")
|
|
198
|
+
if key == "GridNoX":
|
|
199
|
+
args["ncol"] = int(value)
|
|
200
|
+
if key == "GridNoY":
|
|
201
|
+
args["nrow"] = int(value)
|
|
202
|
+
if key == "OriginX":
|
|
203
|
+
args["xori"] = float(value)
|
|
204
|
+
if key == "OriginY":
|
|
205
|
+
args["yori"] = float(value)
|
|
206
|
+
if key == "RotationOriginX":
|
|
207
|
+
rota_xori = float(value)
|
|
208
|
+
if key == "RotationOriginY":
|
|
209
|
+
rota_yori = float(value)
|
|
210
|
+
if key == "GridStepX":
|
|
211
|
+
args["xinc"] = float(value)
|
|
212
|
+
if key == "GridStepY":
|
|
213
|
+
args["yinc"] = float(value)
|
|
214
|
+
if key == "RotationAngle":
|
|
215
|
+
args["rotation"] = float(value)
|
|
216
|
+
if key == "Undefined":
|
|
217
|
+
undef = float(value)
|
|
218
|
+
|
|
219
|
+
if args["rotation"] != 0.0 and (
|
|
220
|
+
rota_xori != args["xori"] or rota_yori != args["yori"]
|
|
221
|
+
):
|
|
222
|
+
xtg.warnuser("Rotation origin and data origin do match")
|
|
223
|
+
|
|
224
|
+
# reread file for map values
|
|
225
|
+
|
|
226
|
+
dsc, values = _cxtgeo.surf_import_petromod_bin(
|
|
227
|
+
cfhandle, 1, undef, args["ncol"], args["nrow"], args["ncol"] * args["nrow"]
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
values = np.ma.masked_greater(values, UNDEF_LIMIT)
|
|
231
|
+
|
|
232
|
+
args["values"] = values.reshape(args["ncol"], args["nrow"])
|
|
233
|
+
|
|
234
|
+
mfile.cfclose()
|
|
235
|
+
return args
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
def import_zmap_ascii(mfile: FileWrapper, values: bool = True, **_):
|
|
239
|
+
"""Importing ZMAP + ascii files, in pure python only.
|
|
240
|
+
|
|
241
|
+
Some sources
|
|
242
|
+
|
|
243
|
+
https://mycarta.wordpress.com/2019/03/23/working-with-zmap-grid-files-in-python/
|
|
244
|
+
https://blog.nitorinfotech.com/what-is-zmap-plus-file-format/
|
|
245
|
+
|
|
246
|
+
"""
|
|
247
|
+
zmap_data = parse_zmap(mfile.file, load_values=values)
|
|
248
|
+
try:
|
|
249
|
+
args = {
|
|
250
|
+
"ncol": zmap_data.ncol,
|
|
251
|
+
"nrow": zmap_data.nrow,
|
|
252
|
+
"xori": zmap_data.xmin,
|
|
253
|
+
"yori": zmap_data.ymin,
|
|
254
|
+
"xinc": (zmap_data.xmax - zmap_data.xmin) / (zmap_data.ncol - 1),
|
|
255
|
+
"yinc": (zmap_data.ymax - zmap_data.ymin) / (zmap_data.nrow - 1),
|
|
256
|
+
}
|
|
257
|
+
except ZeroDivisionError as err:
|
|
258
|
+
raise ValueError(
|
|
259
|
+
f"A zmap surface must have ncol ({zmap_data.ncol}) "
|
|
260
|
+
f"and nrow ({zmap_data.ncol}) > 1"
|
|
261
|
+
) from err
|
|
262
|
+
if values:
|
|
263
|
+
loaded_values = np.reshape(
|
|
264
|
+
zmap_data.values, (zmap_data.ncol, zmap_data.nrow), order="C"
|
|
265
|
+
)
|
|
266
|
+
loaded_values = np.flip(loaded_values, axis=1)
|
|
267
|
+
args["values"] = loaded_values
|
|
268
|
+
|
|
269
|
+
return args
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
def import_xtg(mfile, values=True, **kwargs):
|
|
273
|
+
"""Using pure python for experimental XTGEO import."""
|
|
274
|
+
logger.debug("Additional, probably unused kwargs: %s", **kwargs)
|
|
275
|
+
|
|
276
|
+
offset = 28
|
|
277
|
+
with open(mfile.file, "rb") as fhandle:
|
|
278
|
+
buf = fhandle.read(offset)
|
|
279
|
+
|
|
280
|
+
# unpack header
|
|
281
|
+
swap, magic, nfloat, ncol, nrow = unpack("= i i i q q", buf)
|
|
282
|
+
|
|
283
|
+
if swap != 1 or magic != 1101:
|
|
284
|
+
raise ValueError("Invalid file format (wrong swap id or magic number).")
|
|
285
|
+
|
|
286
|
+
dtype = np.float32 if nfloat == 4 else np.float64
|
|
287
|
+
|
|
288
|
+
vals = None
|
|
289
|
+
narr = ncol * nrow
|
|
290
|
+
if values:
|
|
291
|
+
vals = xsys.npfromfile(mfile.file, dtype=dtype, count=narr, offset=offset)
|
|
292
|
+
|
|
293
|
+
# read metadata which will be at position offet + nfloat*narr +13
|
|
294
|
+
pos = offset + nfloat * narr + 13
|
|
295
|
+
|
|
296
|
+
with open(mfile.file, "rb") as fhandle:
|
|
297
|
+
fhandle.seek(pos)
|
|
298
|
+
jmeta = fhandle.read().decode()
|
|
299
|
+
|
|
300
|
+
meta = json.loads(jmeta, object_pairs_hook=dict)
|
|
301
|
+
req = meta["_required_"]
|
|
302
|
+
|
|
303
|
+
reqattrs = MetaDataRegularSurface.REQUIRED
|
|
304
|
+
|
|
305
|
+
args = {}
|
|
306
|
+
for myattr in reqattrs:
|
|
307
|
+
args[myattr] = req[myattr]
|
|
308
|
+
|
|
309
|
+
if values:
|
|
310
|
+
args["values"] = np.ma.masked_equal(
|
|
311
|
+
vals.reshape(args["ncol"], args["nrow"]), UNDEF
|
|
312
|
+
)
|
|
313
|
+
|
|
314
|
+
return args
|
|
315
|
+
|
|
316
|
+
|
|
317
|
+
def import_hdf5_regsurf(mfile: FileWrapper, values=True, **_):
|
|
318
|
+
"""Importing h5/hdf5 storage."""
|
|
319
|
+
reqattrs = MetaDataRegularSurface.REQUIRED
|
|
320
|
+
|
|
321
|
+
invalues = None
|
|
322
|
+
with h5py.File(mfile.name, "r") as h5h:
|
|
323
|
+
grp = h5h["RegularSurface"]
|
|
324
|
+
idcode = grp.attrs["format-idcode"]
|
|
325
|
+
provider = grp.attrs["provider"]
|
|
326
|
+
if idcode != 1101:
|
|
327
|
+
raise ValueError(f"Wrong id code: {idcode}")
|
|
328
|
+
logger.info("Provider is %s", provider)
|
|
329
|
+
|
|
330
|
+
if values:
|
|
331
|
+
invalues = grp["values"][:]
|
|
332
|
+
|
|
333
|
+
jmeta = grp.attrs["metadata"]
|
|
334
|
+
meta = json.loads(jmeta, object_pairs_hook=dict)
|
|
335
|
+
|
|
336
|
+
req = meta["_required_"]
|
|
337
|
+
|
|
338
|
+
args = {}
|
|
339
|
+
for myattr in reqattrs:
|
|
340
|
+
args[myattr] = req[myattr]
|
|
341
|
+
|
|
342
|
+
if values:
|
|
343
|
+
args["values"] = np.ma.masked_equal(
|
|
344
|
+
invalues.reshape(args["ncol"], args["nrow"]), UNDEF
|
|
345
|
+
)
|
|
346
|
+
|
|
347
|
+
return args
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"""RegularSurface utilities (low level)"""
|
|
2
|
+
|
|
3
|
+
from xtgeo import _cxtgeo
|
|
4
|
+
from xtgeo.common.xtgeo_dialog import XTGeoDialog
|
|
5
|
+
|
|
6
|
+
xtg = XTGeoDialog()
|
|
7
|
+
|
|
8
|
+
#
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
# ======================================================================================
|
|
12
|
+
# Helper methods, for internal usage
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def get_carr_double(self):
|
|
16
|
+
"""Return the SWIG Carray object"""
|
|
17
|
+
|
|
18
|
+
carr = _cxtgeo.new_doublearray(self.ncol * self.nrow)
|
|
19
|
+
|
|
20
|
+
_cxtgeo.swig_numpy_to_carr_1d(self.get_values1d(), carr)
|
|
21
|
+
|
|
22
|
+
return carr
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
# ======================================================================================
|
|
26
|
+
# METHODS BELOW SHALL BE DEPRECATED!!
|
|
27
|
+
# Helper methods, for internal usage
|
|
28
|
+
# --------------------------------------------------------------------------------------
|
|
29
|
+
# copy self (update) values from SWIG carray to numpy, 1D array
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
# def _update_values(self):
|
|
33
|
+
# nnum = self._ncol * self._nrow
|
|
34
|
+
|
|
35
|
+
# if self._cvalues is None and self._values is not None:
|
|
36
|
+
# return
|
|
37
|
+
|
|
38
|
+
# elif self._cvalues is None and self._values is None:
|
|
39
|
+
# logger.critical('_cvalues and _values is None in '
|
|
40
|
+
# '_update_values. STOP')
|
|
41
|
+
# sys.exit(9)
|
|
42
|
+
|
|
43
|
+
# xvv = _cxtgeo.swig_carr_to_numpy_1d(nnum, self._cvalues)
|
|
44
|
+
|
|
45
|
+
# xvv = np.reshape(xvv, (self._ncol, self._nrow), order='F')
|
|
46
|
+
|
|
47
|
+
# # make it masked
|
|
48
|
+
# xvv = ma.masked_greater(xvv, xtgeo.UNDEF_LIMIT)
|
|
49
|
+
|
|
50
|
+
# self._values = xvv
|
|
51
|
+
|
|
52
|
+
# self._delete_cvalues()
|
|
53
|
+
|
|
54
|
+
# # copy (update) values from numpy to SWIG, 1D array
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
# def _update_cvalues(self):
|
|
58
|
+
# logger.debug('Enter update cvalues method...')
|
|
59
|
+
# nnum = self._ncol * self._nrow
|
|
60
|
+
|
|
61
|
+
# if self._values is None and self._cvalues is not None:
|
|
62
|
+
# logger.debug('CVALUES unchanged')
|
|
63
|
+
# return
|
|
64
|
+
|
|
65
|
+
# elif self._cvalues is None and self._values is None:
|
|
66
|
+
# logger.critical('_cvalues and _values is None in '
|
|
67
|
+
# '_update_cvalues. STOP')
|
|
68
|
+
# sys.exit(9)
|
|
69
|
+
|
|
70
|
+
# elif self._cvalues is not None and self._values is None:
|
|
71
|
+
# logger.critical('_cvalues and _values are both present in '
|
|
72
|
+
# '_update_cvalues. STOP')
|
|
73
|
+
# sys.exit(9)
|
|
74
|
+
|
|
75
|
+
# # make a 1D F order numpy array, and update C array
|
|
76
|
+
# xvv = ma.filled(self._values, xtgeo.UNDEF)
|
|
77
|
+
# xvv = np.reshape(xvv, -1, order='F')
|
|
78
|
+
|
|
79
|
+
# self._cvalues = _cxtgeo.new_doublearray(nnum)
|
|
80
|
+
|
|
81
|
+
# _cxtgeo.swig_numpy_to_carr_1d(xvv, self._cvalues)
|
|
82
|
+
# logger.debug('Enter method... DONE')
|
|
83
|
+
|
|
84
|
+
# self._values = None
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
# def _delete_cvalues(self):
|
|
88
|
+
# logger.debug('Enter delete cvalues values method...')
|
|
89
|
+
|
|
90
|
+
# if self._cvalues is not None:
|
|
91
|
+
# _cxtgeo.delete_doublearray(self._cvalues)
|
|
92
|
+
|
|
93
|
+
# self._cvalues = None
|
|
94
|
+
# logger.debug('Enter method... DONE')
|
|
95
|
+
|
|
96
|
+
# # check i
|
|
97
|
+
# f values shape is OK (return True or False)
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
# def _check_shape_ok(self, values):
|
|
101
|
+
|
|
102
|
+
# if not values.flags['F_CONTIGUOUS']:
|
|
103
|
+
# logger.error('Wrong order; shall be Fortran (Flags: {}'
|
|
104
|
+
# .format(values.flags))
|
|
105
|
+
# return False
|
|
106
|
+
|
|
107
|
+
# (ncol, nrow) = values.shape
|
|
108
|
+
# if ncol != self._ncol or nrow != self._nrow:
|
|
109
|
+
# logger.error('Wrong shape: Dimens of values {} {} vs {} {}'
|
|
110
|
+
# .format(ncol, nrow, self._ncol, self._nrow))
|
|
111
|
+
# return False
|
|
112
|
+
# return True
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
# def _convert_carr_double_np(self, carray, nlen=None):
|
|
116
|
+
# """Convert a C array to numpy, assuming double type."""
|
|
117
|
+
# if nlen is None:
|
|
118
|
+
# nlen = len(self._df.index)
|
|
119
|
+
|
|
120
|
+
# nparray = _cxtgeo.swig_carr_to_numpy_1d(nlen, carray)
|
|
121
|
+
|
|
122
|
+
# return nparray
|