コード例 #1
0
class TestPartitionofUnity(TestCase):
    """Test that elements form a partition of unity."""

    elems = [
        ElementLineP1(),
        ElementLineP2(),
        ElementTriP1(),
        ElementTriP2(),
        ElementQuad1(),
        ElementQuad2(),
        ElementQuadS2(),
        ElementTetP1(),
        ElementTetP2(),
        ElementHex1(),
        ElementHexS2(),
        ElementHex2(),
    ]

    def runTest(self):
        for elem in self.elems:
            if elem.dim == 1:
                y = np.array([[.15]])
            elif elem.dim == 2:
                y = np.array([[.15], [.15]])
            elif elem.dim == 3:
                y = np.array([[.15], [.15], [.15]])
            out = 0.
            for i in range(elem.doflocs.shape[0]):
                out += elem.lbasis(y, i)[0][0]
            self.assertAlmostEqual(out, 1, msg='failed for {}'.format(elem))
コード例 #2
0
class TestNodality(TestCase):
    """Test for Element.doflocs."""

    elems = [
        ElementLineP0(),
        ElementLineP1(),
        ElementLineP2(),
        ElementLinePp(1),
        ElementLinePp(3),
        ElementLineMini(),
        ElementTriP0(),
        ElementTriP1(),
        ElementTriP2(),
        ElementTriP3(),
        ElementTriP4(),
        ElementTriMini(),
        ElementQuad0(),
        ElementQuad1(),
        ElementQuad2(),
        ElementQuadS2(),
        ElementQuadP(1),
        ElementQuadP(3),
        ElementTetP0(),
        ElementTetP1(),
        ElementTetP2(),
        ElementTetMini(),
        ElementHex1(),
        ElementHexS2(),
        ElementHex2(),
        ElementTetCR(),
        ElementTetCCR(),
        ElementTriCR(),
        ElementTriCCR(),
        ElementWedge1(),
    ]

    def runTest(self):
        for e in self.elems:
            N = e.doflocs.shape[0]
            Ih = np.zeros((N, N))
            for itr in range(N):
                Ih[itr] = e.lbasis(e.doflocs.T, itr)[0]

            # Remove nan-rows: test nodality only on non-nan doflocs.
            #
            # Some elements, such as ElementTriMini might have a combination
            # of nodal dofs and non-nodal dofs.
            #
            # Nodal dof is defined so that there exists a point where the
            # corresponding basis function is one, and other basis functions
            # are zero. Non-nodal dof does not satisfy this property.
            ix = np.isnan(np.sum(Ih, axis=1))
            Nnan = np.sum(ix)
            ixs = np.nonzero(~ix)[0]
            Ih = Ih[ixs].T[ixs].T

            assert_allclose(Ih,
                            np.eye(N - Nnan),
                            atol=1e-13,
                            err_msg="{}".format(type(e)))
コード例 #3
0
ファイル: test_assembly.py プロジェクト: gdmcbain/scikit-fem
 def createBasis(self):
     m = MeshHex().refined(3)
     self.fbasis = FacetBasis(m, ElementHex2())
     self.boundary_area = 6.000
コード例 #4
0
ファイル: test_assembly.py プロジェクト: gdmcbain/scikit-fem
class NormalVectorTestHex(NormalVectorTestTri):

    case = (MeshHex(), ElementHex1())
    intorder = 3


class NormalVectorTestHexS2(NormalVectorTestTri):

    case = (MeshHex(), ElementHexS2())
    intorder = 3
    test_integrate_volume = False


class NormalVectorTestHex2(NormalVectorTestTri):

    case = (MeshHex(), ElementHex2())
    intorder = 3
    test_integrate_volume = False


@pytest.mark.parametrize("mtype,e,mtype2", [
    (MeshTri, ElementTriP1(), None),
    (MeshTri, ElementTriArgyris(), None),
    (MeshHex, ElementHex1(), None),
    (MeshQuad, ElementQuad1(), None),
    (MeshQuad, ElementQuad2(), None),
    (MeshQuad, ElementQuad2(), MeshQuad2),
    (MeshTri, ElementTriP1(), MeshTri2),
    (MeshTet, ElementTetP1(), MeshTet2),
    (MeshHex, ElementHex1(), MeshHex2),
])
コード例 #5
0
 def create_basis(self, m):
     e = ElementHex2()
     return Basis(m, e)
コード例 #6
0
class TestDerivatives(TestCase):
    """Test values of derivatives."""

    elems = [
        ElementLineP1(),
        ElementLineP2(),
        ElementLineMini(),
        ElementTriP1(),
        ElementTriP2(),
        ElementTriMini(),
        ElementQuad1(),
        ElementQuad2(),
        ElementQuadS2(),
        ElementTetP1(),
        ElementTetP2(),
        ElementTetMini(),
        ElementHex1(),
        ElementHexS2(),
        ElementHex2(),
    ]

    def runTest(self):
        for elem in self.elems:
            eps = 1e-6
            for base in [0., .3, .6, .9]:
                if elem.dim == 1:
                    y = np.array([[base, base + eps]])
                elif elem.dim == 2:
                    y = np.array([[base, base + eps, base, base],
                                  [base, base, base, base + eps]])
                elif elem.dim == 3:
                    y = np.array([[base, base + eps, base, base, base, base],
                                  [base, base, base, base + eps, base, base],
                                  [base, base, base, base, base, base + eps]])
                i = 0
                while True:
                    try:
                        out = elem.lbasis(y, i)
                    except ValueError:
                        break
                    diff = (out[0][1] - out[0][0]) / eps
                    errmsg = 'x-derivative for {}th bfun failed for {}'
                    self.assertAlmostEqual(diff,
                                           out[1][0][0],
                                           delta=1e-3,
                                           msg=errmsg.format(i, elem))
                    if elem.dim > 1:
                        diff = (out[0][3] - out[0][2]) / eps
                        errmsg = 'y-derivative for {}th bfun failed for {}'
                        self.assertAlmostEqual(diff,
                                               out[1][1][3],
                                               delta=1e-3,
                                               msg=errmsg.format(i, elem))
                    if elem.dim == 3:
                        diff = (out[0][5] - out[0][4]) / eps
                        errmsg = 'z-derivative for {}th bfun failed for {}'
                        self.assertAlmostEqual(diff,
                                               out[1][2][4],
                                               delta=1e-3,
                                               msg=errmsg.format(i, elem))
                    i += 1
コード例 #7
0
ファイル: test_basis.py プロジェクト: gdmcbain/scikit-fem
        (MeshTri, ElementTriP1(), ElementTriP1(), True),
        (MeshTri, ElementTriP2(), ElementTriP1(), True),
        (MeshTri, ElementTriP2(), ElementTriP2(), True),
        (MeshTri, ElementTriP2(), None, False),
        (MeshTri, ElementTriP2(), None, True),
        (MeshQuad, ElementQuad1(), ElementQuad0(), False),
        (MeshQuad, ElementQuad1(), ElementQuad1(), False),
        (MeshQuad, ElementQuad2(), ElementQuad2(), False),
        (MeshQuad, ElementQuad1(), ElementQuad0(), True),
        (MeshQuad, ElementQuad1(), ElementQuad1(), True),
        (MeshQuad, ElementQuad2(), ElementQuad2(), True),
        (MeshTet, ElementTetP1(), ElementTetP0(), False),
        (MeshTet, ElementTetP2(), ElementTetP2(), False),
        (MeshHex, ElementHex1(), ElementHex0(), False),
        (MeshHex, ElementHex1(), ElementHex1(), False),
        (MeshHex, ElementHex2(), ElementHex2(), False),
    ],
)
def test_trace(mtype, e1, e2, flat):

    m = mtype().refined(3)

    # use the boundary where last coordinate is zero
    basis = FacetBasis(m, e1, facets=m.facets_satisfying(lambda x: x[-1] == 0.0))
    xfun = projection(lambda x: x[0], CellBasis(m, e1))
    nbasis, y = basis.trace(xfun, lambda p: p[0] if flat else p[:-1], target_elem=e2)

    @Functional
    def integ(w):
        return w.y
コード例 #8
0
class NormalVectorTestHex(NormalVectorTestTri):

    case = (MeshHex(), ElementHex1())
    intorder = 3


class NormalVectorTestHexS2(NormalVectorTestTri):

    case = (MeshHex(), ElementHexS2())
    intorder = 3
    test_integrate_volume = False


class NormalVectorTestHex2(NormalVectorTestTri):

    case = (MeshHex(), ElementHex2())
    intorder = 3
    test_integrate_volume = False


class EvaluateFunctional(unittest.TestCase):
    def runTest(self):
        m = MeshQuad().refined(3)
        e = ElementQuad1()
        basis = InteriorBasis(m, e)

        @Functional
        def x_squared(w):
            return w.x[0]**2

        y = asm(x_squared, basis)
コード例 #9
0
    (MeshQuad().refined(), ElementQuad1(), ElementQuadDG),
])
def test_dg_element(m, e, edg):

    edg = edg(e)

    @Functional
    def square(w):
        return w['random']**2

    basis = InteriorBasis(m, e)
    basisdg = InteriorBasis(m, edg)

    assert_allclose(
        square.assemble(basis, random=basis.interpolate(basis.zeros() + 1)),
        square.assemble(basisdg,
                        random=basisdg.interpolate(basisdg.zeros() + 1)),
    )


@pytest.mark.parametrize("e,edg", [
    (ElementTriP1(), ElementTriDG),
    (ElementTetP2(), ElementTetDG),
    (ElementTriArgyris(), ElementTriDG),
    (ElementQuad1(), ElementQuadDG),
    (ElementQuadP(4), ElementQuadDG),
    (ElementHex2(), ElementHexDG),
])
def test_initialize_dg_composite_elements(e, edg):
    E = edg(e) * e
コード例 #10
0
ファイル: test_basis.py プロジェクト: HadrienNU/scikit-fem

@pytest.mark.parametrize("mtype,e1,e2", [
    (MeshTri, ElementTriP1(), ElementTriP0()),
    (MeshTri, ElementTriP1(), ElementTriP1()),
    (MeshTri, ElementTriP2(), ElementTriP1()),
    (MeshTri, ElementTriP2(), ElementTriP2()),
    (MeshTri, ElementTriP2(), None),
    (MeshQuad, ElementQuad1(), ElementQuad0()),
    (MeshQuad, ElementQuad1(), ElementQuad1()),
    (MeshQuad, ElementQuad2(), ElementQuad2()),
    (MeshTet, ElementTetP1(), ElementTetP0()),
    (MeshTet, ElementTetP2(), ElementTetP2()),
    (MeshHex, ElementHex1(), ElementHex0()),
    (MeshHex, ElementHex1(), ElementHex1()),
    (MeshHex, ElementHex2(), ElementHex2()),
])
def test_trace(mtype, e1, e2):

    m = mtype().refined(3)

    # use the boundary where last coordinate is zero
    basis = FacetBasis(
        m, e1, facets=m.facets_satisfying(lambda x: x[x.shape[0] - 1] == 0.0))
    xfun = projection(lambda x: x[0], InteriorBasis(m, e1))
    nbasis, y = basis.trace(xfun,
                            lambda p: p[0:(p.shape[0] - 1)],
                            target_elem=e2)

    @Functional
    def integ(w):
コード例 #11
0

@pytest.mark.parametrize("mtype,e1,e2", [
    (MeshTri, ElementTriP1(), ElementLineP0()),
    (MeshTri, ElementTriP1(), ElementLineP1()),
    (MeshTri, ElementTriP2(), ElementLineP1()),
    (MeshTri, ElementTriP2(), ElementLineP2()),
    (MeshTri, ElementTriP2(), None),
    (MeshQuad, ElementQuad1(), ElementLineP0()),
    (MeshQuad, ElementQuad1(), ElementLineP1()),
    (MeshQuad, ElementQuad2(), ElementLineP2()),
    (MeshTet, ElementTetP1(), ElementTriP0()),
    (MeshTet, ElementTetP2(), ElementTriP2()),
    (MeshHex, ElementHex1(), ElementQuad0()),
    (MeshHex, ElementHex1(), ElementQuad1()),
    (MeshHex, ElementHex2(), ElementQuad2()),
])
def test_trace(mtype, e1, e2):

    m = mtype().refined(3)

    # use the boundary where last coordinate is zero
    basis = FacetBasis(
        m, e1, facets=m.facets_satisfying(lambda x: x[x.shape[0] - 1] == 0.0))
    xfun = project(lambda x: x[0], basis_to=InteriorBasis(m, e1))
    nbasis, y = basis.trace(xfun,
                            lambda p: p[0:(p.shape[0] - 1)],
                            target_elem=e2)

    @Functional
    def integ(w):