def logDropTol( p, droptol = 1e-3 ): """""" tmp = pg.RVector( p ); tmp = pg.abs( tmp / droptol ) tmp.setVal( 1.0, pg.find( tmp < 1.0 ) ) #for i, v in enumerate( tmp ): #tmp[ i ] = abs( tmp[ i ] / droptol ); #if tmp[ i ] < 1.0: tmp[ i ] = 1.0; tmp = pg.log10( tmp ); tmp *= pg.sign( p ); return tmp;
def createJacobian(self, slowness): """Jacobian matrix using a fat-ray approach (Jordi et al. 2016).""" data = self.data() self.jacobian().resize(data.size(), self.mesh().cellCount()) # first compute reciprocal travel times for geophone sources self.computeTravelTimes(slowness, calcOthers=True) n_data = data.size() cellSizes = self.mesh().cellSizes() for i in range(n_data): iS, iG = int(data("s")[i]), int(data("g")[i]) tsr = self.dataMatrix[iS][iG] # shot-receiver travel time dt = self.timeMatrix[iS] + self.timeMatrix[iG] - tsr # difference weight = np.maximum(1 - 2 * self.frequency * dt, 0.0) # 1 on ray if self.debug: print(pg.sum(pg.sign(weight))) wa = weight * cellSizes self.jacobian()[i] = wa / np.sum(wa) * tsr / slowness
def logDropTol(p, droptol=1e-3): """ Example ------- >>> from pygimli.utils import logDropTol >>> x = logDropTol((-10,-1,0,1,100)) >>> print(x.array()) [-4. -3. 0. 3. 5.] """ tmp = pg.RVector(p) tmp = pg.abs(tmp / droptol) tmp.setVal(1.0, pg.find(tmp < 1.0)) tmp = pg.log10(tmp) tmp *= pg.sign(p) return tmp
def logDropTol(p, droptol=1e-3): """Create logarithmic scaled copy of p. Examples -------- >>> from pygimli.utils import logDropTol >>> x = logDropTol((-10, -1, 0, 1, 100)) >>> print(x.array()) [-4. -3. 0. 3. 5.] """ tmp = pg.RVector(p) tmp = pg.abs(tmp / droptol) tmp.setVal(1.0, pg.find(tmp < 1.0)) tmp = pg.log10(tmp) tmp *= pg.sign(p) return tmp
def createJacobian(self, slowness): """Jacobian matrix using a fat-ray approach (Jordi et al. 2016).""" data = self.data() self.jacobian().resize(data.size(), self.mesh().cellCount()) # first compute reciprocal travel times for geophone sources self.computeTravelTimes(slowness, calcOthers=True) n_data = data.size() cellSizes = self.mesh().cellSizes() for i in range(n_data): iS, iG = int(data("s")[i]), int(data("g")[i]) tsr = self.dataMatrix[iS][iG] # shot-receiver travel time dt = self.timeMatrix[iS] + self.timeMatrix[iG] - tsr # difference weight = np.maximum(1 - 2 * self.frequency * dt, 0.0) # 1 on ray if self.debug: print(pg.sum(pg.sign(weight))) wa = weight * cellSizes if np.sum(wa) > 0: # only if all values are zero wa /= np.sum(wa) self.jacobian()[i] = wa * tsr / slowness
def importRes2dInv(filename, verbose=False, return_header=False): """Read res2dinv format Parameters ---------- filename : str verbose : bool [False] return_header : bool [False] Returns ------- pg.DataContainerERT and (in case of return_header=True) header dictionary Format ------ str - title float - unit spacing [m] int - Array Number (1-Wenner, 3-Dipole-dipole atm only) int - Number of Datapoints float - x-location given in terms of first electrode use 1 if mid-point location is given int - 0 for no IP, use 1 if IP present str - Phase Angle if IP present str - mrad if IP present 0,90.0 - if IP present dataBody """ def getNonEmptyRow(i, comment='#'): s = next(i) while s[0] is comment: s = next(i) return s.split('\r\n')[0] # def getNonEmptyRow(...) with open(filename, 'r') as fi: content = fi.readlines() it = iter(content) header = {} header['name'] = getNonEmptyRow(it, comment=';') header['spacing'] = float(getNonEmptyRow(it, comment=';')) typrow = getNonEmptyRow(it, comment=';') typ = int(typrow.rstrip('\n').rstrip('R').rstrip('L')) if typ == 11: # independent electrode positions header['subtype'] = int(getNonEmptyRow(it, comment=';')) header['dummy'] = getNonEmptyRow(it, comment=';') isR = int(getNonEmptyRow(it, comment=';')) nData = int(getNonEmptyRow(it, comment=';')) xLoc = float(getNonEmptyRow(it, comment=';')) hasIP = int(getNonEmptyRow(it, comment=';')) if hasIP: header['ipQuantity'] = getNonEmptyRow(it, comment=';') header['ipUnit'] = getNonEmptyRow(it, comment=';') header['ipData'] = getNonEmptyRow(it, comment=';') ipline = header['ipData'].rstrip('\n').rstrip('\r').split(' ') if len(ipline) > 2: # obviously spectral data? header['ipNumGates'] = int(ipline[0]) header['ipDelay'] = float(ipline[1]) header['onTime'] = float(ipline[-2]) header['offTime'] = float(ipline[-1]) header['ipDT'] = np.array(ipline[2:-2], dtype=float) header['ipGateT'] = np.cumsum(np.hstack((header['ipDelay'], header['ipDT']))) data = pg.DataContainerERT() data.resize(nData) if typ == 9 or typ == 10: raise Exception("Don't know how to read:" + str(typ)) if typ == 11 or typ == 12 or typ == 13: # mixed array res = pg.Vector(nData, 0.0) ip = pg.Vector(nData, 0.0) specIP = [] for i in range(nData): vals = getNonEmptyRow(it, comment=';').replace(',', ' ').split() # row starts with 4 if int(vals[0]) == 4: eaID = data.createSensor(pg.Pos(float(vals[1]), float(vals[2]))) ebID = data.createSensor(pg.Pos(float(vals[3]), float(vals[4]))) emID = data.createSensor(pg.Pos(float(vals[5]), float(vals[6]))) enID = data.createSensor(pg.Pos(float(vals[7]), float(vals[8]))) elif int(vals[0]) == 3: eaID = data.createSensor(pg.Pos(float(vals[1]), float(vals[2]))) ebID = -1 emID = data.createSensor(pg.Pos(float(vals[3]), float(vals[4]))) enID = data.createSensor(pg.Pos(float(vals[5]), float(vals[6]))) elif int(vals[0]) == 2: eaID = data.createSensor(pg.Pos(float(vals[1]), float(vals[2]))) ebID = -1 emID = data.createSensor(pg.Pos(float(vals[3]), float(vals[4]))) enID = -1 else: raise Exception('dont know how to handle row', vals[0]) res[i] = float(vals[int(vals[0])*2+1]) if hasIP: # ip[i] = float(vals[int(vals[0])*2+2]) ipCol = int(vals[0])*2+2 ip[i] = float(vals[ipCol]) if 'ipNumGates' in header: specIP.append(vals[ipCol:]) data.createFourPointData(i, eaID, ebID, emID, enID) if isR: data.set('r', res) else: data.set('rhoa', res) if hasIP: data.set('ip', ip) if 'ipNumGates' in header: A = np.array(specIP, dtype=float) A[A > 1000] = -999 A[A < -1000] = -999 for i in range(header['ipNumGates']): data.set('ip'+str(i+1), A[:, i]) data.sortSensorsX() data.sortSensorsIndex() if return_header: return data, header else: return data # amount of values per collumn per typ nntyp = [0, 3, 3, 4, 3, 3, 4, 4, 3, 0, 0, 8, 10] nn = nntyp[typ] + hasIP # dataBody = pg.Matrix(nn, nData) dataBody = np.zeros((nn, nData)) for i in range(nData): vals = getNonEmptyRow(it, comment=';').replace(',', ' ').split() dataBody[:, i] = np.array(vals, dtype=float) # for j in range(nn): # dataBody[j][i] = float(vals[j]) XX = dataBody[0] EL = dataBody[1] SP = pg.Vector(nData, 1.0) if nn - hasIP == 4: SP = dataBody[2] AA = None BB = None NN = None MM = None if typ == 1: # Wenner AA = XX - xLoc * EL * 1.5 MM = AA + EL NN = MM + EL BB = NN + EL elif typ == 2: # Pole-Pole AA = XX - xLoc * EL * 0.5 MM = AA + EL elif typ == 3: # Dipole-Dipole AA = XX - xLoc * EL * (SP / 2. + 1.) BB = AA + EL MM = BB + SP * EL NN = MM + EL pass elif typ == 3: # Dipole-Dipole AA = XX - xLoc * EL * (SP / 2. + 1.) BB = AA + EL MM = BB + SP * EL NN = MM + EL elif typ == 4: # WENNER-BETA AA = XX - xLoc * EL * 1.5 BB = AA + EL MM = BB + EL NN = MM + EL elif typ == 5: # WENNER-GAMMA AA = XX - xLoc * EL * 1.5 MM = AA + EL BB = MM + EL NN = BB + EL elif typ == 6: # POLE-DIPOLE AA = XX - xLoc * SP * EL - (SP - 1.) * (SP < 0.) * EL MM = AA + SP * EL NN = MM + pg.sign(SP) * EL elif typ == 7: # SCHLUMBERGER AA = XX - xLoc * EL * (SP + 0.5) MM = AA + SP * EL NN = MM + EL BB = NN + SP * EL else: raise Exception('Datatype ' + str(typ) + ' not yet suppoted') for i in range(len(AA)): if AA is not None: eaID = data.createSensor(pg.Pos(AA[i], 0.0)) else: eaID = -1 if BB is not None: ebID = data.createSensor(pg.Pos(BB[i], 0.0)) else: ebID = -1 if MM is not None: emID = data.createSensor(pg.Pos(MM[i], 0.0)) else: emID = -1 if NN is not None: enID = data.createSensor(pg.Pos(NN[i], 0.0)) else: enID = -1 data.createFourPointData(i, eaID, ebID, emID, enID) data.set('rhoa', dataBody[nn - hasIP - 1]) if hasIP: data.set('ip', dataBody[nn - 1]) data.sortSensorsX() if return_header: return data, header else: return data