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