def __init__(self, mesh_spacing, strike, dip, top_left, top_right, bottom_right, bottom_left): super(PlanarSurface, self).__init__() if not (top_left.depth == top_right.depth and bottom_left.depth == bottom_right.depth): raise ValueError("top and bottom edges must be parallel " "to the earth surface") if not mesh_spacing > 0: raise ValueError("mesh spacing must be positive") self.mesh_spacing = mesh_spacing NodalPlane.check_dip(dip) NodalPlane.check_strike(strike) self.dip = dip self.strike = strike self.corner_lons = numpy.array([ top_left.longitude, top_right.longitude, bottom_left.longitude, bottom_right.longitude ]) self.corner_lats = numpy.array([ top_left.latitude, top_right.latitude, bottom_left.latitude, bottom_right.latitude ]) self.corner_depths = numpy.array([ top_left.depth, top_right.depth, bottom_left.depth, bottom_right.depth ]) self._init_plane() # now we can check surface for validity dists, xx, yy = self._project(self.corner_lons, self.corner_lats, self.corner_depths) # "length" of the rupture is measured along the top edge length1, length2 = xx[1] - xx[0], xx[3] - xx[2] # "width" of the rupture is measured along downdip direction width1, width2 = yy[2] - yy[0], yy[3] - yy[1] self.width = (width1 + width2) / 2.0 self.length = (length1 + length2) / 2.0 # calculate the imperfect rectangle tolerance # relative to surface's area tolerance = self.width * self.length \ * self.IMPERFECT_RECTANGLE_TOLERANCE if numpy.max(numpy.abs(dists)) > tolerance: raise ValueError("corner points do not lie on the same plane") if length2 < 0: raise ValueError("corners are in the wrong order") if abs(length1 - length2) > tolerance: raise ValueError("top and bottom edges have different lengths") if abs(xx[0] - xx[2]) > tolerance: raise ValueError("surface's angles are not right")
def __init__(self, mesh_spacing, strike, dip, top_left, top_right, bottom_right, bottom_left): super(PlanarSurface, self).__init__() if not (top_left.depth == top_right.depth and bottom_left.depth == bottom_right.depth): raise ValueError("top and bottom edges must be parallel " "to the earth surface") if not mesh_spacing > 0: raise ValueError("mesh spacing must be positive") self.mesh_spacing = mesh_spacing NodalPlane.check_dip(dip) NodalPlane.check_strike(strike) self.dip = dip self.strike = strike self.corner_lons = numpy.array([ top_left.longitude, top_right.longitude, bottom_left.longitude, bottom_right.longitude ]) self.corner_lats = numpy.array([ top_left.latitude, top_right.latitude, bottom_left.latitude, bottom_right.latitude ]) self.corner_depths = numpy.array([ top_left.depth, top_right.depth, bottom_left.depth, bottom_right.depth ]) self._init_plane() # now we can check surface for validity dists, xx, yy = self._project(self.corner_lons, self.corner_lats, self.corner_depths) # "length" of the rupture is measured along the top edge length1, length2 = xx[1] - xx[0], xx[3] - xx[2] # "width" of the rupture is measured along downdip direction width1, width2 = yy[2] - yy[0], yy[3] - yy[1] if numpy.max(numpy.abs(dists)) > self.IMPERFECT_RECTANGLE_TOLERANCE \ or abs(width1 - width2) > self.IMPERFECT_RECTANGLE_TOLERANCE \ or width2 < 0 \ or abs(xx[0] - xx[2]) > self.IMPERFECT_RECTANGLE_TOLERANCE \ or abs(length1 - length2) > self.IMPERFECT_RECTANGLE_TOLERANCE: raise ValueError("planar surface corners must " "represent a rectangle") self.width = (width1 + width2) / 2.0 self.length = (length1 + length2) / 2.0