def test_kmv_quad_tri_schemes(p_d): fct = np.math.factorial p, d = p_d q = create_quadrature(T, p, "KMV") for i in range(d + 1): for j in range(d + 1 - i): trueval = fct(i) * fct(j) / fct(i + j + 2) assert (np.abs(trueval - q.integrate(lambda x: x[0]**i * x[1]**j)) < 1.0e-10)
def test_Kronecker_property_tets(element_degree): """ Evaluating the nodal basis at the special quadrature points should have a Kronecker property. Also checks that the basis functions and quadrature points are given the same ordering. """ element, degree = element_degree qr = create_quadrature(Te, degree, scheme="KMV") (basis, ) = element.tabulate(0, qr.get_points()).values() assert np.allclose(basis, np.eye(*basis.shape))
def test_kmv_quad_tet_schemes(p_d): # noqa: W503 fct = np.math.factorial p, d = p_d q = create_quadrature(Te, p, "KMV") for i in range(d + 1): for j in range(d + 1 - i): for k in range(d + 1 - i - j): trueval = fct(i) * fct(j) * fct(k) / fct(i + j + k + 3) assert ( np.abs(trueval - q.integrate(lambda x: x[0]**i * x[1]**j * x[2]**k)) < 1.0e-10)
def test_interpolate_monomials_tris(element_degree): element, degree = element_degree # ordered the same way as KMV nodes pts = create_quadrature(T, degree, "KMV").pts Q = make_quadrature(T, 2 * degree) phis = element.tabulate(0, Q.pts)[0, 0] print("deg", degree) for i in range(degree + 1): for j in range(degree + 1 - i): m = lambda x: x[0]**i * x[1]**j dofs = np.array([m(pt) for pt in pts]) interp = phis.T @ dofs matqp = np.array([m(pt) for pt in Q.pts]) err = 0.0 for k in range(phis.shape[1]): err += Q.wts[k] * (interp[k] - matqp[k])**2 assert np.sqrt(err) <= 1.0e-12