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.
Files changed (122) hide show
  1. cxtgeo.py +558 -0
  2. cxtgeoPYTHON_wrap.c +19537 -0
  3. xtgeo/__init__.py +248 -0
  4. xtgeo/_cxtgeo.cp313-win_amd64.pyd +0 -0
  5. xtgeo/_internal.cp313-win_amd64.pyd +0 -0
  6. xtgeo/common/__init__.py +19 -0
  7. xtgeo/common/_angles.py +29 -0
  8. xtgeo/common/_xyz_enum.py +50 -0
  9. xtgeo/common/calc.py +396 -0
  10. xtgeo/common/constants.py +30 -0
  11. xtgeo/common/exceptions.py +42 -0
  12. xtgeo/common/log.py +93 -0
  13. xtgeo/common/sys.py +166 -0
  14. xtgeo/common/types.py +18 -0
  15. xtgeo/common/version.py +34 -0
  16. xtgeo/common/xtgeo_dialog.py +604 -0
  17. xtgeo/cube/__init__.py +9 -0
  18. xtgeo/cube/_cube_export.py +214 -0
  19. xtgeo/cube/_cube_import.py +532 -0
  20. xtgeo/cube/_cube_roxapi.py +180 -0
  21. xtgeo/cube/_cube_utils.py +287 -0
  22. xtgeo/cube/_cube_window_attributes.py +273 -0
  23. xtgeo/cube/cube1.py +1023 -0
  24. xtgeo/grid3d/__init__.py +15 -0
  25. xtgeo/grid3d/_ecl_grid.py +778 -0
  26. xtgeo/grid3d/_ecl_inte_head.py +152 -0
  27. xtgeo/grid3d/_ecl_logi_head.py +71 -0
  28. xtgeo/grid3d/_ecl_output_file.py +81 -0
  29. xtgeo/grid3d/_egrid.py +1004 -0
  30. xtgeo/grid3d/_find_gridprop_in_eclrun.py +625 -0
  31. xtgeo/grid3d/_grdecl_format.py +309 -0
  32. xtgeo/grid3d/_grdecl_grid.py +400 -0
  33. xtgeo/grid3d/_grid3d.py +29 -0
  34. xtgeo/grid3d/_grid3d_fence.py +284 -0
  35. xtgeo/grid3d/_grid3d_utils.py +228 -0
  36. xtgeo/grid3d/_grid_boundary.py +76 -0
  37. xtgeo/grid3d/_grid_etc1.py +1683 -0
  38. xtgeo/grid3d/_grid_export.py +222 -0
  39. xtgeo/grid3d/_grid_hybrid.py +50 -0
  40. xtgeo/grid3d/_grid_import.py +79 -0
  41. xtgeo/grid3d/_grid_import_ecl.py +101 -0
  42. xtgeo/grid3d/_grid_import_roff.py +135 -0
  43. xtgeo/grid3d/_grid_import_xtgcpgeom.py +375 -0
  44. xtgeo/grid3d/_grid_refine.py +258 -0
  45. xtgeo/grid3d/_grid_roxapi.py +292 -0
  46. xtgeo/grid3d/_grid_translate_coords.py +154 -0
  47. xtgeo/grid3d/_grid_wellzone.py +165 -0
  48. xtgeo/grid3d/_gridprop_export.py +202 -0
  49. xtgeo/grid3d/_gridprop_import_eclrun.py +164 -0
  50. xtgeo/grid3d/_gridprop_import_grdecl.py +132 -0
  51. xtgeo/grid3d/_gridprop_import_roff.py +52 -0
  52. xtgeo/grid3d/_gridprop_import_xtgcpprop.py +168 -0
  53. xtgeo/grid3d/_gridprop_lowlevel.py +171 -0
  54. xtgeo/grid3d/_gridprop_op1.py +272 -0
  55. xtgeo/grid3d/_gridprop_roxapi.py +301 -0
  56. xtgeo/grid3d/_gridprop_value_init.py +140 -0
  57. xtgeo/grid3d/_gridprops_import_eclrun.py +344 -0
  58. xtgeo/grid3d/_gridprops_import_roff.py +83 -0
  59. xtgeo/grid3d/_roff_grid.py +470 -0
  60. xtgeo/grid3d/_roff_parameter.py +303 -0
  61. xtgeo/grid3d/grid.py +3010 -0
  62. xtgeo/grid3d/grid_properties.py +699 -0
  63. xtgeo/grid3d/grid_property.py +1313 -0
  64. xtgeo/grid3d/types.py +15 -0
  65. xtgeo/interfaces/rms/__init__.py +18 -0
  66. xtgeo/interfaces/rms/_regular_surface.py +460 -0
  67. xtgeo/interfaces/rms/_rms_base.py +100 -0
  68. xtgeo/interfaces/rms/_rmsapi_package.py +69 -0
  69. xtgeo/interfaces/rms/rmsapi_utils.py +438 -0
  70. xtgeo/io/__init__.py +1 -0
  71. xtgeo/io/_file.py +603 -0
  72. xtgeo/metadata/__init__.py +17 -0
  73. xtgeo/metadata/metadata.py +435 -0
  74. xtgeo/roxutils/__init__.py +7 -0
  75. xtgeo/roxutils/_roxar_loader.py +54 -0
  76. xtgeo/roxutils/_roxutils_etc.py +122 -0
  77. xtgeo/roxutils/roxutils.py +207 -0
  78. xtgeo/surface/__init__.py +20 -0
  79. xtgeo/surface/_regsurf_boundary.py +26 -0
  80. xtgeo/surface/_regsurf_cube.py +210 -0
  81. xtgeo/surface/_regsurf_cube_window.py +391 -0
  82. xtgeo/surface/_regsurf_cube_window_v2.py +297 -0
  83. xtgeo/surface/_regsurf_cube_window_v3.py +360 -0
  84. xtgeo/surface/_regsurf_export.py +388 -0
  85. xtgeo/surface/_regsurf_grid3d.py +275 -0
  86. xtgeo/surface/_regsurf_gridding.py +347 -0
  87. xtgeo/surface/_regsurf_ijxyz_parser.py +278 -0
  88. xtgeo/surface/_regsurf_import.py +347 -0
  89. xtgeo/surface/_regsurf_lowlevel.py +122 -0
  90. xtgeo/surface/_regsurf_oper.py +538 -0
  91. xtgeo/surface/_regsurf_utils.py +81 -0
  92. xtgeo/surface/_surfs_import.py +43 -0
  93. xtgeo/surface/_zmap_parser.py +138 -0
  94. xtgeo/surface/regular_surface.py +3043 -0
  95. xtgeo/surface/surfaces.py +276 -0
  96. xtgeo/well/__init__.py +24 -0
  97. xtgeo/well/_blockedwell_roxapi.py +241 -0
  98. xtgeo/well/_blockedwells_roxapi.py +68 -0
  99. xtgeo/well/_well_aux.py +30 -0
  100. xtgeo/well/_well_io.py +327 -0
  101. xtgeo/well/_well_oper.py +483 -0
  102. xtgeo/well/_well_roxapi.py +304 -0
  103. xtgeo/well/_wellmarkers.py +486 -0
  104. xtgeo/well/_wells_utils.py +158 -0
  105. xtgeo/well/blocked_well.py +220 -0
  106. xtgeo/well/blocked_wells.py +134 -0
  107. xtgeo/well/well1.py +1516 -0
  108. xtgeo/well/wells.py +211 -0
  109. xtgeo/xyz/__init__.py +6 -0
  110. xtgeo/xyz/_polygons_oper.py +272 -0
  111. xtgeo/xyz/_xyz.py +758 -0
  112. xtgeo/xyz/_xyz_data.py +646 -0
  113. xtgeo/xyz/_xyz_io.py +737 -0
  114. xtgeo/xyz/_xyz_lowlevel.py +42 -0
  115. xtgeo/xyz/_xyz_oper.py +613 -0
  116. xtgeo/xyz/_xyz_roxapi.py +766 -0
  117. xtgeo/xyz/points.py +698 -0
  118. xtgeo/xyz/polygons.py +827 -0
  119. xtgeo-4.14.1.dist-info/METADATA +146 -0
  120. xtgeo-4.14.1.dist-info/RECORD +122 -0
  121. xtgeo-4.14.1.dist-info/WHEEL +5 -0
  122. 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")