def __init__(self, face_number, degree): # Create quadrature rule on reference triangle reference_triangle = reference_element.UFCTriangle() reference_rule = make_quadrature(reference_triangle, degree) ref_points = reference_rule.get_points() ref_weights = reference_rule.get_weights() # Get geometry information about the face of interest reference_tet = reference_element.UFCTetrahedron() face = reference_tet.get_topology()[2][face_number] vertices = reference_tet.get_vertices_of_subcomplex(face) # Use tet to map points and weights on the appropriate face vertices = [numpy.array(list(vertex)) for vertex in vertices] x0 = vertices[0] J = numpy.matrix([vertices[1] - x0, vertices[2] - x0]).transpose() x0 = numpy.matrix(x0).transpose() # This is just a very numpyfied way of writing J*p + x0: F = lambda p: \ numpy.array(J*numpy.matrix(p).transpose() + x0).flatten() points = numpy.array([F(p) for p in ref_points]) # Map weights: multiply reference weights by sqrt(|J^T J|) detJTJ = numpy.linalg.det(J.transpose() * J) weights = numpy.sqrt(detJTJ) * ref_weights # Initialize super class with new points and weights QuadratureRule.__init__(self, reference_tet, points, weights) self._reference_rule = reference_rule self._J = J
def __init__(self, face_number, degree): # Create quadrature rule on reference triangle reference_triangle = reference_element.UFCTriangle() reference_rule = make_quadrature(reference_triangle, degree) ref_points = reference_rule.get_points() ref_weights = reference_rule.get_weights() # Get geometry information about the face of interest reference_tet = reference_element.UFCTetrahedron() face = reference_tet.get_topology()[2][face_number] vertices = reference_tet.get_vertices_of_subcomplex(face) # Use tet to map points and weights on the appropriate face vertices = [np.array(list(vertex)) for vertex in vertices] x0 = vertices[0] J = np.vstack([vertices[1] - x0, vertices[2] - x0]).T # This is just a very npfied way of writing J*p + x0: points = np.einsum("ij,kj->ki", J, ref_points) + x0 # Map weights: multiply reference weights by sqrt(|J^T J|) detJTJ = np.linalg.det(np.dot(J.T, J)) weights = np.sqrt(detJTJ) * ref_weights # Initialize super class with new points and weights QuadratureRule.__init__(self, reference_tet, points, weights) self._reference_rule = reference_rule self._J = J