def setup_quadrature(self): """ The quadrature rules can be defined once on the reference element and then a change of variables allows integration on any element. """ self.quad_nonsingular = dict() for n_q in range(self.min_points - 1, self.max_points): self.quad_nonsingular[n_q + 1] = \ self.get_nonsingular_ptswts(n_q + 1) self.highest_nonsingular = self.quad_nonsingular[self.max_points] self.quad_shared_edge_left=telles_singular(self.quad_points_logr, 0.0) self.quad_shared_edge_right=telles_singular(self.quad_points_logr, 1.0) self.quad_logr = [] self.quad_oneoverr = [] # For each point of the outer quadrature formula, we need a different # singular quadrature formula, because the singularity location will # move. # The highest order nonsingular quadrature is used for the outer # quadrature in the case of a singular kernel. for singular_pt in self.highest_nonsingular.x: logr = telles_singular(self.quad_points_logr, singular_pt) oneoverr = piessens(self.quad_points_oneoverr, singular_pt, self.max_points) self.quad_logr.append(logr) self.quad_oneoverr.append(oneoverr)
def get_point_source_quadrature(self, singularity_type, singular_pt, e_k, in_element = False, reference_loc = 0.0): if singularity_type == 'logr' and in_element: quad = telles_singular(self.quad_points_logr, reference_loc) elif singularity_type == 'oneoverr' and in_element: quad = piessens(self.quad_points_oneoverr, reference_loc, self.max_points) else: quad = self.get_interior_quadrature(e_k, singular_pt) return quad