def computeTravelTimes(self, slowness, allSensors=True): """Compute the travel times and fill data and time matrix for later use of response and Jacobian, respectively. For response only active sources are needed, for Jacobian we need all. """ # mesh = self.mesh() # better but for now input mesh mesh = self.mesh_ data = self.data_ param_markers = np.unique(mesh.cellMarkers()) param_count = len(param_markers) if len(slowness) == mesh.cellCount(): self.mapModel(slowness) elif len(slowness) == param_count: # map the regions in the mesh to slowness slow_map = pg.stdMapF_F() min_reg_num = min(param_markers) for i, si in enumerate(slowness): slow_map.insert(float(i + min_reg_num), si) mesh.mapCellAttributes(slow_map) else: raise ValueError("Wrong no of parameters. Mesh size: {}, no " "of regions: {}, and number of slowness values:" "{}".format(self.mesh().cellCount(), param_count, len(slowness))) times = pg.RVector(self.nNodes, 0.) upTags = np.zeros(self.nNodes) downTags = np.zeros(mesh.nodeCount()) for iSource in range(self.nSensors): # initial condition (reset vectors) times *= 0.0 upTags *= 0 downwind = set() source = self.data_.sensorPosition(iSource) cell = self.mesh_.findCell(source) # fill in nodes around source using local smoothness for i, n in enumerate(cell.nodes()): times[n.id()] = cell.attribute() * n.pos().distance(source) upTags[n.id()] = 1 for i, n in enumerate(cell.nodes()): tmpNodes = pg.commonNodes(n.cellSet()) for nn in tmpNodes: if not upTags[nn.id()] and not downTags[nn.id()]: downwind.add(nn) downTags[nn.id()] = 1 while len(downwind) > 0: # start fast marching fastMarch(self.mesh_, downwind, times, upTags, downTags) self.dataMatrix[iSource] = pg.interpolate(mesh, times, data.sensorPositions()) self.timeMatrix[iSource] = pg.interpolate(mesh, times, self.midPoints) sensor_idx = data("g")[data("s") == iSource]
def computeTravelTimes(self, slowness, allSensors=True): """Compute the travel times and fill data and time matrix for later use of response and Jacobian, respectively. For response only active sources are needed, for Jacobian we need all. """ # mesh = self.mesh() # better but for now input mesh mesh = self.mesh_ data = self.data_ param_markers = np.unique(mesh.cellMarkers()) param_count = len(param_markers) if len(slowness) == mesh.cellCount(): self.mapModel(slowness) elif len(slowness) == param_count: # map the regions in the mesh to slowness slow_map = pg.stdMapF_F() min_reg_num = min(param_markers) for i, si in enumerate(slowness): slow_map.insert(float(i+min_reg_num), si) mesh.mapCellAttributes(slow_map) else: raise ValueError("Wrong no of parameters. Mesh size: {}, no " "of regions: {}, and number of slowness values:" "{}".format(self.mesh().cellCount(), param_count, len(slowness))) times = pg.RVector(self.nNodes, 0.) upTags = np.zeros(self.nNodes) downTags = np.zeros(mesh.nodeCount()) for iSource in range(self.nSensors): # initial condition (reset vectors) times *= 0.0 upTags *= 0 downwind = set() source = self.data_.sensorPosition(iSource) cell = self.mesh_.findCell(source) # fill in nodes around source using local smoothness for i, n in enumerate(cell.nodes()): times[n.id()] = cell.attribute() * n.pos().distance(source) upTags[n.id()] = 1 for i, n in enumerate(cell.nodes()): tmpNodes = pg.commonNodes(n.cellSet()) for nn in tmpNodes: if not upTags[nn.id()] and not downTags[nn.id()]: downwind.add(nn) downTags[nn.id()] = 1 while len(downwind) > 0: # start fast marching fastMarch(self.mesh_, downwind, times, upTags, downTags) self.dataMatrix[iSource] = pg.interpolate(mesh, times, data.sensorPositions()) self.timeMatrix[iSource] = pg.interpolate(mesh, times, self.midPoints) sensor_idx = data("g")[data("s") == iSource]
cell = mesh.findCell(source) for i, n in enumerate(cell.nodes()): times[n.id()] = cell.attribute() * n.pos().distance(source) upTags[n.id()] = 1 for i, n in enumerate(cell.nodes()): tmpNodes = pg.commonNodes(n.cellSet()) for nn in tmpNodes: if not upTags[nn.id()] and not downTags[nn.id()]: downwind.add(nn) downTags[nn.id()] = 1 ############################################################################### # Then we start marching until all fields are filled. tic = time.time() while len(downwind) > 0: fastMarch(mesh, downwind, times, upTags, downTags) print(time.time() - tic, "s") ############################################################################### # First, we plot the traveltime field and streamlines fig, ax = plt.subplots(figsize=(10, 5)) drawMesh(ax, mesh) ax.set_xlabel('x [m]') ax.set_ylabel('y [m]') drawField(ax, mesh, times, cmap='Spectral', fillContour=True) drawStreamLines(ax, mesh, -times, nx=50, ny=50) ############################################################################### # We compare the result with the analytical solution along the x axis x = np.arange(0., 140., 0.5)
cell = mesh.findCell(source) for i, n in enumerate(cell.nodes()): times[n.id()] = cell.attribute() * n.pos().distance(source) upTags[n.id()] = 1 for i, n in enumerate(cell.nodes()): tmpNodes = pg.commonNodes(n.cellSet()) for nn in tmpNodes: if not upTags[nn.id()] and not downTags[nn.id()]: downwind.add(nn) downTags[nn.id()] = 1 ############################################################################### # Then we start marching until all fields are filled. tic = time.time() while len(downwind) > 0: fastMarch(mesh, downwind, times, upTags, downTags) print(time.time() - tic, "s") ############################################################################### # First, we plot the traveltime field and streamlines fig, ax = plt.subplots(figsize=(10, 5)) drawMesh(ax, mesh) ax.set_xlabel('x [m]') ax.set_ylabel('y [m]') pg.show(mesh, times, cMap='Spectral', fillContour=True, ax=ax) drawStreamLines(ax, mesh, -times, nx=50, ny=50) ############################################################################### # We compare the result with the analytical solution along the x axis x = np.arange(0., 140., 0.5)