def get_xyz_cell_corners(self, ijk=(1, 1, 1), activeonly=True, zerobased=False): """Get X Y Z cell corners for one cell.""" i, j, k = ijk shift = 0 if zerobased: shift = 1 if activeonly: actnum = self.get_actnum() iact = actnum.values3d[i - 1 + shift, j - 1 + shift, k - 1 + shift] if iact == 0: return None pcorners = _cxtgeo.new_doublearray(24) _cxtgeo.grd3d_corners( i + shift, j + shift, k + shift, self.ncol, self.nrow, self.nlay, self._p_coord_v, self._p_zcorn_v, pcorners, XTGDEBUG, ) cornerlist = [] for i in range(24): cornerlist.append(_cxtgeo.doublearray_getitem(pcorners, i)) clist = tuple(cornerlist) return clist
def get_xyz_cell_corners(self, ijk=(1, 1, 1), activeonly=True, zerobased=False): """Get X Y Z cell corners for one cell.""" self._xtgformat1() i, j, k = ijk shift = 0 if zerobased: shift = 1 if activeonly: actnum = self.get_actnum() iact = actnum.values3d[i - 1 + shift, j - 1 + shift, k - 1 + shift] if iact == 0: return None pcorners = _cxtgeo.new_doublearray(24) if self._xtgformat == 1: logger.info("Use xtgformat 1...") _cxtgeo.grd3d_corners( i + shift, j + shift, k + shift, self.ncol, self.nrow, self.nlay, self._coordsv, self._zcornsv, pcorners, ) else: logger.info("Use xtgformat 2...") _cxtgeo.grdcp3d_corners( i + shift - 1, j + shift - 1, k + shift - 1, self.ncol, self.nrow, self.nlay, self._coordsv, self._zcornsv, pcorners, ) cornerlist = [] for i in range(24): cornerlist.append(_cxtgeo.doublearray_getitem(pcorners, i)) clist = tuple(cornerlist) return clist
def report_zone_mismatch( # pylint: disable=too-many-statements self, well=None, zonelogname="ZONELOG", zoneprop=None, onelayergrid=None, zonelogrange=(0, 9999), zonelogshift=0, depthrange=None, option=0, perflogname=None, ): """Reports well to zone mismatch; this works together with a Well object.""" this = inspect.currentframe().f_code.co_name # first do some trimming of the well dataframe if not well or not isinstance(well, Well): msg = "No well object in <{}> or invalid object; " "returns no result".format( this) xtg.warn(msg) return None if not well.zonelogname: msg = ("Asked for zone log <{}> but no such in <{}> for well {}; " "return None".format(zonelogname, this, well.wellname)) xtg.warn(msg) # warnings.warn(UserWarning(msg)) return None # qperf = True if perflogname == "None" or perflogname is None: # qperf = False pass else: if perflogname not in well.lognames: msg = ("Asked for perf log <{}> but no such in <{}> for well {}; " "return None".format(perflogname, this, well.wellname)) xtg.warn(msg) # warnings.warn(UserWarning(msg)) return None logger.info("Process well object for %s...", well.wellname) df = well.dataframe.copy() if depthrange: logger.info("Filter depth...") df = df[df.Z_TVDSS > depthrange[0]] df = df[df.Z_TVDSS < depthrange[1]] df = df.copy() logger.info("Adding zoneshift %s", zonelogshift) if zonelogshift != 0: df[zonelogname] += zonelogshift logger.info("Filter ZONELOG...") df = df[df[zonelogname] > zonelogrange[0]] df = df[df[zonelogname] < zonelogrange[1]] df = df.copy() if perflogname: logger.info("Filter PERF...") df[perflogname].fillna(-999, inplace=True) df = df[df[perflogname] > 0] df = df.copy() df.reset_index(drop=True, inplace=True) well.dataframe = df # get the relevant well log C arrays... ptr_xc = well.get_carray("X_UTME") ptr_yc = well.get_carray("Y_UTMN") ptr_zc = well.get_carray("Z_TVDSS") ptr_zo = well.get_carray(zonelogname) nval = well.nrow ptr_results = _cxtgeo.new_doublearray(10) ptr_zprop = _gridprop_lowlevel.update_carray(zoneprop) cstatus = _cxtgeo.grd3d_rpt_zlog_vs_zon( self._ncol, self._nrow, self._nlay, self._coordsv, self._zcornsv, self._actnumsv, ptr_zprop, nval, ptr_xc, ptr_yc, ptr_zc, ptr_zo, zonelogrange[0], zonelogrange[1], onelayergrid._zcornsv, onelayergrid._actnumsv, ptr_results, option, ) _gridprop_lowlevel.delete_carray(zoneprop, ptr_zprop) if cstatus == 0: logger.debug("OK well") elif cstatus == 2: msg = "Well {} have no zonation?".format(well.wellname) warnings.warn(msg, UserWarning) else: msg = "Something is rotten with {}".format(well.wellname) raise SystemExit(msg) # extract the report perc = _cxtgeo.doublearray_getitem(ptr_results, 0) tpoi = _cxtgeo.doublearray_getitem(ptr_results, 1) mpoi = _cxtgeo.doublearray_getitem(ptr_results, 2) # returns percent match, then total numbers of well counts for zone, # then match count. perc = mpoi/tpoi return (perc, int(tpoi), int(mpoi))