def test_grd3d_imp_ecl_egrid(): with pytest.raises( xtgeo.XTGeoCLibError, match="Errors in array lengths checks in", ): _cxtgeo.grd3d_imp_ecl_egrid( xtgeo._XTGeoFile(io.BytesIO(b"")).get_cfhandle(), 1, 1, 1, 0, 0, 0, 0, np.array([0.0], dtype=np.float64), np.array([1.0], dtype=np.float64), np.array([1], dtype=np.int32), _cxtgeo.new_longarray(1), 1, )
def import_ecl_egrid(self, gfile): """Import, private to this routine.""" eclfile = xtgeo._XTGeoCFile(gfile) # scan file for property logger.info("Make kwlist by scanning") kwlist = utils.scan_keywords(eclfile.fhandle, fformat="xecl", maxkeys=1000, dataframe=False, dates=False) bpos = {} for name in ("COORD", "ZCORN", "ACTNUM", "MAPAXES"): bpos[name] = -1 # initially self._dualporo = False for kwitem in kwlist: kwname, kwtype, kwlen, kwbyte = kwitem if kwname == "FILEHEAD": # read FILEHEAD record: filehead = eclbin_record(eclfile.fhandle, "FILEHEAD", kwlen, kwtype, kwbyte) dualp = filehead[5].tolist() logger.info("Dual porosity flag is %s", dualp) if dualp == 1: self._dualporo = True self._dualperm = False elif dualp == 2: self._dualporo = True self._dualperm = True elif kwname == "GRIDHEAD": # read GRIDHEAD record: gridhead = eclbin_record(eclfile.fhandle, "GRIDHEAD", kwlen, kwtype, kwbyte) ncol, nrow, nlay = gridhead[1:4].tolist() logger.info("%s %s %s", ncol, nrow, nlay) elif kwname in ("COORD", "ZCORN", "ACTNUM"): bpos[kwname] = kwbyte elif kwname == "MAPAXES": # not always present bpos[kwname] = kwbyte self._ncol = ncol self._nrow = nrow self._nlay = nlay logger.info("Grid dimensions in EGRID file: %s %s %s", ncol, nrow, nlay) # allocate dimensions: ntot = self._ncol * self._nrow * self._nlay ncoord = (self._ncol + 1) * (self._nrow + 1) * 2 * 3 nzcorn = self._ncol * self._nrow * (self._nlay + 1) * 4 self._p_coord_v = _cxtgeo.new_doublearray(ncoord) self._p_zcorn_v = _cxtgeo.new_doublearray(nzcorn) self._p_actnum_v = _cxtgeo.new_intarray(ntot) p_nact = _cxtgeo.new_longpointer() option = 0 if self._dualporo: option = 1 ier = _cxtgeo.grd3d_imp_ecl_egrid( eclfile.fhandle, self._ncol, self._nrow, self._nlay, bpos["MAPAXES"], bpos["COORD"], bpos["ZCORN"], bpos["ACTNUM"], self._p_coord_v, self._p_zcorn_v, self._p_actnum_v, p_nact, option, ) if ier == -1: raise RuntimeError("Error code -1 from _cxtgeo.grd3d_imp_ecl_egrid") self._nactive = _cxtgeo.longpointer_value(p_nact) # in case of DUAL PORO/PERM ACTNUM will be 0..3; need to convert if self._dualporo: self._dualactnum = self.get_actnum(name="DUALACTNUM") acttmp = self._dualactnum.copy() acttmp.values[acttmp.values >= 1] = 1 self.set_actnum(acttmp) eclfile.close()
def import_ecl_bgrdecl(self, gfile): """Import binary files with GRDECL layout""" local_fhandle = False fhandle = gfile if isinstance(gfile, str): local_fhandle = True gfile = xtgeo._XTGeoCFile(gfile) fhandle = gfile.fhandle # scan file for properties; these have similar binary format as e.g. EGRID logger.info("Make kwlist by scanning") kwlist = utils.scan_keywords(fhandle, fformat="xecl", maxkeys=1000, dataframe=False, dates=False) bpos = {} needkwlist = ["SPECGRID", "COORD", "ZCORN", "ACTNUM"] optkwlist = ["MAPAXES"] for name in needkwlist + optkwlist: bpos[name] = -1 # initially for kwitem in kwlist: kwname, kwtype, kwlen, kwbyte = kwitem if kwname == "SPECGRID": # read grid geometry record: specgrid = eclbin_record(fhandle, "SPECGRID", kwlen, kwtype, kwbyte) ncol, nrow, nlay = specgrid[0:3].tolist() logger.info("%s %s %s", ncol, nrow, nlay) elif kwname in needkwlist: bpos[kwname] = kwbyte elif kwname == "MAPAXES": # not always present bpos[kwname] = kwbyte self._ncol = ncol self._nrow = nrow self._nlay = nlay logger.info("Grid dimensions in binary GRDECL file: %s %s %s", ncol, nrow, nlay) # allocate dimensions: ntot = self._ncol * self._nrow * self._nlay ncoord = (self._ncol + 1) * (self._nrow + 1) * 2 * 3 nzcorn = self._ncol * self._nrow * (self._nlay + 1) * 4 self._p_coord_v = _cxtgeo.new_doublearray(ncoord) self._p_zcorn_v = _cxtgeo.new_doublearray(nzcorn) self._p_actnum_v = _cxtgeo.new_intarray(ntot) p_nact = _cxtgeo.new_longpointer() ier = _cxtgeo.grd3d_imp_ecl_egrid( fhandle, self._ncol, self._nrow, self._nlay, bpos["MAPAXES"], bpos["COORD"], bpos["ZCORN"], bpos["ACTNUM"], self._p_coord_v, self._p_zcorn_v, self._p_actnum_v, p_nact, 0, ) if ier == -1: raise RuntimeError("Error code -1 from _cxtgeo.grd3d_imp_ecl_egrid") self._nactive = _cxtgeo.longpointer_value(p_nact) if local_fhandle: gfile.close(cond=local_fhandle)
def import_ecl_egrid(self, gfile): """Import, private to this routine.""" # scan file for property logger.info("Make kwlist by scanning") kwlist = utils.scan_keywords(gfile, fformat="xecl", maxkeys=1000, dataframe=False, dates=False) bpos = {} for name in ("COORD", "ZCORN", "ACTNUM", "MAPAXES"): bpos[name] = -1 # initially self._dualporo = False for kwitem in kwlist: kwname, kwtype, kwlen, kwbyte = kwitem if kwname == "FILEHEAD": # read FILEHEAD record: filehead = eclbin_record(gfile, "FILEHEAD", kwlen, kwtype, kwbyte) dualp = filehead[5].tolist() logger.info("Dual porosity flag is %s", dualp) if dualp == 1: self._dualporo = True self._dualperm = False elif dualp == 2: self._dualporo = True self._dualperm = True elif kwname == "GRIDHEAD": # read GRIDHEAD record: gridhead = eclbin_record(gfile, "GRIDHEAD", kwlen, kwtype, kwbyte) ncol, nrow, nlay = gridhead[1:4].tolist() logger.info("%s %s %s", ncol, nrow, nlay) elif kwname in ("COORD", "ZCORN", "ACTNUM"): bpos[kwname] = kwbyte elif kwname == "MAPAXES": # not always present bpos[kwname] = kwbyte self._ncol = ncol self._nrow = nrow self._nlay = nlay logger.info("Grid dimensions in EGRID file: %s %s %s", ncol, nrow, nlay) # allocate dimensions: ncoord, nzcorn, ntot = self.vectordimensions self._coordsv = np.zeros(ncoord, dtype=np.float64) self._zcornsv = np.zeros(nzcorn, dtype=np.float64) self._actnumsv = np.zeros(ntot, dtype=np.int32) p_nact = _cxtgeo.new_longpointer() option = 0 if self._dualporo: option = 1 cfhandle = gfile.get_cfhandle() ier = _cxtgeo.grd3d_imp_ecl_egrid( cfhandle, self._ncol, self._nrow, self._nlay, bpos["MAPAXES"], bpos["COORD"], bpos["ZCORN"], bpos["ACTNUM"], self._coordsv, self._zcornsv, self._actnumsv, p_nact, option, ) gfile.cfclose() logger.info("Reading ECL EGRID (C code) done") if ier == -1: raise RuntimeError("Error code -1 from _cxtgeo.grd3d_imp_ecl_egrid") self._nactive = _cxtgeo.longpointer_value(p_nact) # in case of DUAL PORO/PERM ACTNUM will be 0..3; need to convert if self._dualporo: self._dualactnum = self.get_actnum(name="DUALACTNUM") acttmp = self._dualactnum.copy() acttmp.values[acttmp.values >= 1] = 1 self.set_actnum(acttmp) logger.info("File is closed")
def import_ecl_bgrdecl(self, gfile): """Import binary files with GRDECL layout""" cfhandle = gfile.get_cfhandle() # scan file for properties; these have similar binary format as e.g. EGRID logger.info("Make kwlist by scanning") kwlist = utils.scan_keywords(gfile, fformat="xecl", maxkeys=1000, dataframe=False, dates=False) bpos = {} needkwlist = ["SPECGRID", "COORD", "ZCORN", "ACTNUM"] optkwlist = ["MAPAXES"] for name in needkwlist + optkwlist: bpos[name] = -1 # initially for kwitem in kwlist: kwname, kwtype, kwlen, kwbyte = kwitem if kwname == "SPECGRID": # read grid geometry record: specgrid = eclbin_record(gfile, "SPECGRID", kwlen, kwtype, kwbyte) ncol, nrow, nlay = specgrid[0:3].tolist() logger.info("%s %s %s", ncol, nrow, nlay) elif kwname in needkwlist: bpos[kwname] = kwbyte elif kwname == "MAPAXES": # not always present bpos[kwname] = kwbyte self._ncol = ncol self._nrow = nrow self._nlay = nlay logger.info("Grid dimensions in binary GRDECL file: %s %s %s", ncol, nrow, nlay) # allocate dimensions: ncoord, nzcorn, ntot = self.vectordimensions self._coordsv = np.zeros(ncoord, dtype=np.float64) self._zcornsv = np.zeros(nzcorn, dtype=np.float64) self._actnumsv = np.zeros(ntot, dtype=np.int32) p_nact = _cxtgeo.new_longpointer() ier = _cxtgeo.grd3d_imp_ecl_egrid( cfhandle, self._ncol, self._nrow, self._nlay, bpos["MAPAXES"], bpos["COORD"], bpos["ZCORN"], bpos["ACTNUM"], self._coordsv, self._zcornsv, self._actnumsv, p_nact, 0, ) if ier == -1: raise RuntimeError("Error code -1 from _cxtgeo.grd3d_imp_ecl_egrid") self._nactive = _cxtgeo.longpointer_value(p_nact) # if local_fhandle: # gfile.close(cond=local_fhandle) if gfile.cfclose(): logger.info("Closed SWIG C file")