def test_dofs(): line = ufc_simplex(1) T = ufc_simplex(2) T.vertices = np.asarray([(0.0, 0.0), (1.0, 0.25), (-0.75, 1.1)]) MTW = MardalTaiWinther(T, 3) Qline = make_quadrature(line, 6) linebfs = expansions.LineExpansionSet(line) linevals = linebfs.tabulate(1, Qline.pts) for ed in range(3): n = T.compute_scaled_normal(ed) wts = np.asarray(Qline.wts) vals = MTW.tabulate(0, Qline.pts, (1, ed))[(0, 0)] nvals = np.dot(np.transpose(vals, (0, 2, 1)), n) normal_moments = np.zeros((9, 2)) for bf in range(9): for k in range(len(Qline.wts)): for m in (0, 1): normal_moments[bf, m] += wts[k] * nvals[bf, k] * linevals[m, k] right = np.zeros((9, 2)) right[3 * ed, 0] = 1.0 right[3 * ed + 2, 1] = 1.0 assert np.allclose(normal_moments, right) for ed in range(3): t = T.compute_edge_tangent(ed) wts = np.asarray(Qline.wts) vals = MTW.tabulate(0, Qline.pts, (1, ed))[(0, 0)] tvals = np.dot(np.transpose(vals, (0, 2, 1)), t) tangent_moments = np.zeros(9) for bf in range(9): for k in range(len(Qline.wts)): tangent_moments[bf] += wts[k] * tvals[bf, k] * linevals[0, k] right = np.zeros(9) right[3 * ed + 1] = 1.0 assert np.allclose(tangent_moments, right)
def test_dofs(): line = ufc_simplex(1) T = ufc_simplex(2) T.vertices = np.random.rand(3, 2) AW = ArnoldWinther(T, 3) # check Kronecker property at vertices bases = [[[1, 0], [0, 0]], [[0, 1], [1, 0]], [[0, 0], [0, 1]]] vert_vals = AW.tabulate(0, T.vertices)[(0, 0)] for i in range(3): for j in range(3): assert np.allclose(vert_vals[3*i+j, :, :, i], bases[j]) for k in (1, 2): assert np.allclose(vert_vals[3*i+j, :, :, (i+k) % 3], np.zeros((2, 2))) # check edge moments Qline = make_quadrature(line, 6) linebfs = expansions.LineExpansionSet(line) linevals = linebfs.tabulate(1, Qline.pts) # n, n moments for ed in range(3): n = T.compute_scaled_normal(ed) wts = np.asarray(Qline.wts) nqpline = len(wts) vals = AW.tabulate(0, Qline.pts, (1, ed))[(0, 0)] nnvals = np.zeros((30, nqpline)) for i in range(30): for j in range(len(wts)): nnvals[i, j] = n @ vals[i, :, :, j] @ n nnmoments = np.zeros((30, 2)) for bf in range(30): for k in range(nqpline): for m in (0, 1): nnmoments[bf, m] += wts[k] * nnvals[bf, k] * linevals[m, k] for bf in range(30): if bf != AW.dual.entity_ids[1][ed][0] and bf != AW.dual.entity_ids[1][ed][2]: assert np.allclose(nnmoments[bf, :], np.zeros(2)) # n, t moments for ed in range(3): n = T.compute_scaled_normal(ed) t = T.compute_edge_tangent(ed) wts = np.asarray(Qline.wts) nqpline = len(wts) vals = AW.tabulate(0, Qline.pts, (1, ed))[(0, 0)] ntvals = np.zeros((30, nqpline)) for i in range(30): for j in range(len(wts)): ntvals[i, j] = n @ vals[i, :, :, j] @ t ntmoments = np.zeros((30, 2)) for bf in range(30): for k in range(nqpline): for m in (0, 1): ntmoments[bf, m] += wts[k] * ntvals[bf, k] * linevals[m, k] for bf in range(30): if bf != AW.dual.entity_ids[1][ed][1] and bf != AW.dual.entity_ids[1][ed][3]: assert np.allclose(ntmoments[bf, :], np.zeros(2)) # check internal dofs Q = make_quadrature(T, 6) qpvals = AW.tabulate(0, Q.pts)[(0, 0)] const_moms = qpvals @ Q.wts assert np.allclose(const_moms[:21], np.zeros((21, 2, 2))) assert np.allclose(const_moms[24:], np.zeros((6, 2, 2))) assert np.allclose(const_moms[21:24, 0, 0], np.asarray([1, 0, 0])) assert np.allclose(const_moms[21:24, 0, 1], np.asarray([0, 1, 0])) assert np.allclose(const_moms[21:24, 1, 0], np.asarray([0, 1, 0])) assert np.allclose(const_moms[21:24, 1, 1], np.asarray([0, 0, 1]))
def test_dofs(): line = ufc_simplex(1) T = ufc_simplex(2) T.vertices = np.asarray([(0.0, 0.0), (1.0, 0.25), (-0.75, 1.1)]) AW = ArnoldWintherNC(T, 2) Qline = make_quadrature(line, 6) linebfs = expansions.LineExpansionSet(line) linevals = linebfs.tabulate(1, Qline.pts) # n, n moments for ed in range(3): n = T.compute_scaled_normal(ed) wts = np.asarray(Qline.wts) nqpline = len(wts) vals = AW.tabulate(0, Qline.pts, (1, ed))[(0, 0)] nnvals = np.zeros((18, nqpline)) for i in range(18): for j in range(len(wts)): nnvals[i, j] = n @ vals[i, :, :, j] @ n nnmoments = np.zeros((18, 2)) for bf in range(18): for k in range(nqpline): for m in (0, 1): nnmoments[bf, m] += wts[k] * nnvals[bf, k] * linevals[m, k] for bf in range(18): if bf != AW.dual.entity_ids[1][ed][0] and bf != AW.dual.entity_ids[ 1][ed][2]: assert np.allclose(nnmoments[bf, :], np.zeros(2)) # n, t moments for ed in range(3): n = T.compute_scaled_normal(ed) t = T.compute_edge_tangent(ed) wts = np.asarray(Qline.wts) nqpline = len(wts) vals = AW.tabulate(0, Qline.pts, (1, ed))[(0, 0)] ntvals = np.zeros((18, nqpline)) for i in range(18): for j in range(len(wts)): ntvals[i, j] = n @ vals[i, :, :, j] @ t ntmoments = np.zeros((18, 2)) for bf in range(18): for k in range(nqpline): for m in (0, 1): ntmoments[bf, m] += wts[k] * ntvals[bf, k] * linevals[m, k] for bf in range(18): if bf != AW.dual.entity_ids[1][ed][1] and bf != AW.dual.entity_ids[ 1][ed][3]: assert np.allclose(ntmoments[bf, :], np.zeros(2), atol=1.e-7) # check internal dofs Q = make_quadrature(T, 6) qpvals = AW.tabulate(0, Q.pts)[(0, 0)] const_moms = qpvals @ Q.wts assert np.allclose(const_moms[:12], np.zeros((12, 2, 2))) assert np.allclose(const_moms[15:], np.zeros((3, 2, 2))) assert np.allclose(const_moms[12:15, 0, 0], np.asarray([1, 0, 0])) assert np.allclose(const_moms[12:15, 0, 1], np.asarray([0, 1, 0])) assert np.allclose(const_moms[12:15, 1, 0], np.asarray([0, 1, 0])) assert np.allclose(const_moms[12:15, 1, 1], np.asarray([0, 0, 1]))