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,214 @@
|
|
|
1
|
+
"""Export Cube data via SegyIO library or XTGeo CLIB."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
import shutil
|
|
5
|
+
import struct
|
|
6
|
+
|
|
7
|
+
import numpy as np
|
|
8
|
+
import segyio
|
|
9
|
+
|
|
10
|
+
from xtgeo import _cxtgeo
|
|
11
|
+
from xtgeo._cxtgeo import XTGeoCLibError
|
|
12
|
+
from xtgeo.common import XTGeoDialog, null_logger
|
|
13
|
+
|
|
14
|
+
logger = null_logger(__name__)
|
|
15
|
+
xtg = XTGeoDialog()
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def export_segy(self, sfile, template=None, pristine=False, engine="xtgeo"):
|
|
19
|
+
"""Export on SEGY using segyio library.
|
|
20
|
+
|
|
21
|
+
Args:
|
|
22
|
+
self (:class:`xtgeo.cube.Cube`): The instance
|
|
23
|
+
sfile (str): File name to export to.
|
|
24
|
+
template (str): Use an existing file a template.
|
|
25
|
+
pristine (bool): Make SEGY from scrtach if True; otherwise use an
|
|
26
|
+
existing SEGY file.
|
|
27
|
+
engine (str): Use 'xtgeo' or (later?) 'segyio'
|
|
28
|
+
"""
|
|
29
|
+
if engine == "segyio":
|
|
30
|
+
_export_segy_segyio(self, sfile, template=template, pristine=pristine)
|
|
31
|
+
else:
|
|
32
|
+
_export_segy_xtgeo(self, sfile)
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _export_segy_segyio(self, sfile, template=None, pristine=False):
|
|
36
|
+
"""Export on SEGY using segyio library.
|
|
37
|
+
|
|
38
|
+
Args:
|
|
39
|
+
self (:class:`xtgeo.cube.Cube`): The instance
|
|
40
|
+
sfile (str): File name to export to.
|
|
41
|
+
template (str): Use an existing file a template.
|
|
42
|
+
pristine (bool): Make SEGY from scrtach if True; otherwise use an
|
|
43
|
+
existing SEGY file.
|
|
44
|
+
"""
|
|
45
|
+
logger.debug("Export segy format using segyio...")
|
|
46
|
+
|
|
47
|
+
if template is None and self._segyfile is None:
|
|
48
|
+
raise NotImplementedError("Error, template=None is not yet made!")
|
|
49
|
+
|
|
50
|
+
# There is an existing _segyfile attribute, in this case the current SEGY
|
|
51
|
+
# headers etc are applied for the new data. Requires that shapes etc are
|
|
52
|
+
# equal.
|
|
53
|
+
if template is None and self._segyfile is not None:
|
|
54
|
+
template = self._segyfile
|
|
55
|
+
|
|
56
|
+
cvalues = self.values
|
|
57
|
+
|
|
58
|
+
if template is not None and not pristine:
|
|
59
|
+
try:
|
|
60
|
+
shutil.copyfile(self._segyfile, sfile)
|
|
61
|
+
except Exception as errormsg:
|
|
62
|
+
xtg.warn(f"Error message: {errormsg}")
|
|
63
|
+
raise
|
|
64
|
+
|
|
65
|
+
logger.debug("Input segy file copied ...")
|
|
66
|
+
|
|
67
|
+
with segyio.open(sfile, "r+") as segyfile:
|
|
68
|
+
logger.debug("Output segy file is now open...")
|
|
69
|
+
|
|
70
|
+
if segyfile.sorting == 1:
|
|
71
|
+
logger.info("xline sorting")
|
|
72
|
+
for xll, xline in enumerate(segyfile.xlines):
|
|
73
|
+
segyfile.xline[xline] = cvalues[xll] # broadcasting
|
|
74
|
+
else:
|
|
75
|
+
logger.info("iline sorting")
|
|
76
|
+
ixv, jyv, kzv = cvalues.shape
|
|
77
|
+
for ill, iline in enumerate(segyfile.ilines):
|
|
78
|
+
if ixv != jyv != kzv or ixv != kzv != jyv:
|
|
79
|
+
segyfile.iline[iline] = cvalues[ill] # broadcasting
|
|
80
|
+
else:
|
|
81
|
+
# safer but a bit slower than broadcasting
|
|
82
|
+
segyfile.iline[iline] = cvalues[ill, :, :]
|
|
83
|
+
|
|
84
|
+
else:
|
|
85
|
+
# NOT FINISHED!
|
|
86
|
+
logger.debug("Input segy file from scratch ...")
|
|
87
|
+
|
|
88
|
+
# sintv = int(self.zinc * 1000)
|
|
89
|
+
spec = segyio.spec()
|
|
90
|
+
|
|
91
|
+
spec.sorting = 2
|
|
92
|
+
spec.format = 1
|
|
93
|
+
|
|
94
|
+
spec.samples = np.arange(self.nlay)
|
|
95
|
+
spec.ilines = np.arange(self.ncol)
|
|
96
|
+
spec.xlines = np.arange(self.nrow)
|
|
97
|
+
|
|
98
|
+
with segyio.create(sfile, spec) as fseg:
|
|
99
|
+
# write the line itself to the file and the inline number
|
|
100
|
+
# in all this line's headers
|
|
101
|
+
for ill, ilno in enumerate(spec.ilines):
|
|
102
|
+
fseg.iline[ilno] = cvalues[ill]
|
|
103
|
+
# f.header.iline[ilno] = {
|
|
104
|
+
# segyio.TraceField.INLINE_3D: ilno,
|
|
105
|
+
# segyio.TraceField.offset: 0,
|
|
106
|
+
# segyio.TraceField.TRACE_SAMPLE_INTERVAL: sintv
|
|
107
|
+
# }
|
|
108
|
+
|
|
109
|
+
# # then do the same for xlines
|
|
110
|
+
# for xlno in spec.xlines:
|
|
111
|
+
# f.header.xline[xlno] = {
|
|
112
|
+
# segyio.TraceField.CROSSLINE_3D: xlno,
|
|
113
|
+
# segyio.TraceField.TRACE_SAMPLE_INTERVAL: sintv
|
|
114
|
+
# }
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def _export_segy_xtgeo(self, sfile):
|
|
118
|
+
"""Export SEGY via XTGeo internal C routine."""
|
|
119
|
+
|
|
120
|
+
values1d = self.values.reshape(-1)
|
|
121
|
+
|
|
122
|
+
ilinesp = _cxtgeo.new_intarray(len(self._ilines))
|
|
123
|
+
xlinesp = _cxtgeo.new_intarray(len(self._xlines))
|
|
124
|
+
tracidp = _cxtgeo.new_intarray(self.ncol * self.nrow)
|
|
125
|
+
|
|
126
|
+
ilns = self._ilines.astype(np.int32)
|
|
127
|
+
xlns = self._xlines.astype(np.int32)
|
|
128
|
+
trid = self._traceidcodes.flatten().astype(np.int32)
|
|
129
|
+
|
|
130
|
+
_cxtgeo.swig_numpy_to_carr_i1d(ilns, ilinesp)
|
|
131
|
+
_cxtgeo.swig_numpy_to_carr_i1d(xlns, xlinesp)
|
|
132
|
+
_cxtgeo.swig_numpy_to_carr_i1d(trid, tracidp)
|
|
133
|
+
|
|
134
|
+
status = _cxtgeo.cube_export_segy(
|
|
135
|
+
sfile,
|
|
136
|
+
self.ncol,
|
|
137
|
+
self.nrow,
|
|
138
|
+
self.nlay,
|
|
139
|
+
values1d,
|
|
140
|
+
self.xori,
|
|
141
|
+
self.xinc,
|
|
142
|
+
self.yori,
|
|
143
|
+
self.yinc,
|
|
144
|
+
self.zori,
|
|
145
|
+
self.zinc,
|
|
146
|
+
self.rotation,
|
|
147
|
+
self.yflip,
|
|
148
|
+
1,
|
|
149
|
+
ilinesp,
|
|
150
|
+
xlinesp,
|
|
151
|
+
tracidp,
|
|
152
|
+
0,
|
|
153
|
+
)
|
|
154
|
+
|
|
155
|
+
if status != 0:
|
|
156
|
+
raise XTGeoCLibError("Error when exporting to SEGY (xtgeo engine)")
|
|
157
|
+
|
|
158
|
+
_cxtgeo.delete_intarray(ilinesp)
|
|
159
|
+
_cxtgeo.delete_intarray(xlinesp)
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
def export_rmsreg(self, sfile):
|
|
163
|
+
"""Export on RMS regular format."""
|
|
164
|
+
|
|
165
|
+
logger.debug("Export to RMS regular format...")
|
|
166
|
+
values1d = self.values.reshape(-1)
|
|
167
|
+
|
|
168
|
+
status = _cxtgeo.cube_export_rmsregular(
|
|
169
|
+
self.ncol,
|
|
170
|
+
self.nrow,
|
|
171
|
+
self.nlay,
|
|
172
|
+
self.xori,
|
|
173
|
+
self.yori,
|
|
174
|
+
self.zori,
|
|
175
|
+
self.xinc,
|
|
176
|
+
self.yinc * self.yflip,
|
|
177
|
+
self.zinc,
|
|
178
|
+
self.rotation,
|
|
179
|
+
self.yflip,
|
|
180
|
+
values1d,
|
|
181
|
+
sfile,
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
if status != 0:
|
|
185
|
+
raise RuntimeError("Error when exporting to RMS regular")
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
def export_xtgregcube(self, mfile):
|
|
189
|
+
"""Export to experimental xtgregcube format, python version."""
|
|
190
|
+
logger.info("Export as xtgregcube...")
|
|
191
|
+
self.metadata.required = self
|
|
192
|
+
|
|
193
|
+
prevalues = (1, 1201, 4, self.ncol, self.nrow, self.nlay)
|
|
194
|
+
mystruct = struct.Struct("= i i i q q q")
|
|
195
|
+
pre = mystruct.pack(*prevalues)
|
|
196
|
+
|
|
197
|
+
meta = self.metadata.get_metadata()
|
|
198
|
+
|
|
199
|
+
jmeta = json.dumps(meta).encode()
|
|
200
|
+
|
|
201
|
+
with open(mfile, "wb") as fout:
|
|
202
|
+
fout.write(pre)
|
|
203
|
+
|
|
204
|
+
with open(mfile, "ab") as fout:
|
|
205
|
+
# TODO. Treat dead traces as undef
|
|
206
|
+
self.values.tofile(fout)
|
|
207
|
+
|
|
208
|
+
with open(mfile, "ab") as fout:
|
|
209
|
+
fout.write("\nXTGMETA.v01\n".encode())
|
|
210
|
+
|
|
211
|
+
with open(mfile, "ab") as fout:
|
|
212
|
+
fout.write(jmeta)
|
|
213
|
+
|
|
214
|
+
logger.info("Export as xtgregcube... done")
|