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,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