|
21 | 21 |
|
22 | 22 | from FIAT import expansions, polynomial_set, reference_element
|
23 | 23 | from FIAT.quadrature_schemes import create_quadrature
|
| 24 | +from itertools import chain |
24 | 25 |
|
25 | 26 |
|
26 | 27 | @pytest.fixture(params=(1, 2, 3))
|
@@ -107,3 +108,45 @@ def test_bubble_duality(cell, degree):
|
107 | 108 | results = scale * numpy.dot(numpy.multiply(phi_dual, qwts), phi.T)
|
108 | 109 | assert numpy.allclose(results, numpy.diag(numpy.diag(results)))
|
109 | 110 | assert numpy.allclose(numpy.diag(results), 1.0)
|
| 111 | + |
| 112 | + |
| 113 | +@pytest.mark.parametrize("degree", [10]) |
| 114 | +def test_union_of_polysets(cell, degree): |
| 115 | + """ demonstrates that polysets don't need to have the same degree for union |
| 116 | + using RT space as an example""" |
| 117 | + |
| 118 | + sd = cell.get_spatial_dimension() |
| 119 | + k = degree |
| 120 | + vecPk = polynomial_set.ONPolynomialSet(cell, degree, (sd,)) |
| 121 | + |
| 122 | + vec_Pkp1 = polynomial_set.ONPolynomialSet(cell, k + 1, (sd,), scale="orthonormal") |
| 123 | + |
| 124 | + dimPkp1 = expansions.polynomial_dimension(cell, k + 1) |
| 125 | + dimPk = expansions.polynomial_dimension(cell, k) |
| 126 | + dimPkm1 = expansions.polynomial_dimension(cell, k - 1) |
| 127 | + |
| 128 | + vec_Pk_indices = list(chain(*(range(i * dimPkp1, i * dimPkp1 + dimPk) |
| 129 | + for i in range(sd)))) |
| 130 | + vec_Pk_from_Pkp1 = vec_Pkp1.take(vec_Pk_indices) |
| 131 | + |
| 132 | + Pkp1 = polynomial_set.ONPolynomialSet(cell, k + 1, scale="orthonormal") |
| 133 | + PkH = Pkp1.take(list(range(dimPkm1, dimPk))) |
| 134 | + |
| 135 | + Q = create_quadrature(cell, 2 * (k + 1)) |
| 136 | + Qpts, Qwts = Q.get_points(), Q.get_weights() |
| 137 | + |
| 138 | + PkH_at_Qpts = PkH.tabulate(Qpts)[(0,) * sd] |
| 139 | + Pkp1_at_Qpts = Pkp1.tabulate(Qpts)[(0,) * sd] |
| 140 | + x = Qpts.T |
| 141 | + PkHx_at_Qpts = PkH_at_Qpts[:, None, :] * x[None, :, :] |
| 142 | + PkHx_coeffs = numpy.dot(numpy.multiply(PkHx_at_Qpts, Qwts), Pkp1_at_Qpts.T) |
| 143 | + PkHx = polynomial_set.PolynomialSet(cell, k, k + 1, vec_Pkp1.get_expansion_set(), PkHx_coeffs) |
| 144 | + |
| 145 | + same_deg = polynomial_set.polynomial_set_union_normalized(vec_Pk_from_Pkp1, PkHx) |
| 146 | + different_deg = polynomial_set.polynomial_set_union_normalized(vecPk, PkHx) |
| 147 | + |
| 148 | + Q = create_quadrature(cell, 2*(degree)) |
| 149 | + Qpts, _ = Q.get_points(), Q.get_weights() |
| 150 | + same_vals = same_deg.tabulate(Qpts)[(0,) * sd] |
| 151 | + diff_vals = different_deg.tabulate(Qpts)[(0,) * sd] |
| 152 | + assert numpy.allclose(same_vals - diff_vals, 0) |
0 commit comments