Пример #1
0
    def test_lookup(self):
        model = SplineModel(3, 3)
        v = Volume().refine(1, 1, 1)
        model.add(v)
        model.add(v + (1, 0, 0))
        model.add(v + (0, 0, 1))

        q = Volume().refine(1, 1, 1)
        self.assertIs(model[q].node, model[v].node)

        q = Volume().refine(1, 1, 1).reverse('u').swap('u', 'v')
        self.assertIs(model[q].node, model[v].node)

        self.assertIs(model[v.section(w=-1)].node,
                      model[(v + (0, 0, 1)).section(w=0)].node)
Пример #2
0
    def test_faces(self):
        model = SplineModel(3, 3)
        v = Volume().refine(1, 1, 1)
        vr = v + (1, 0, 0)
        vu = v + (0, 0, 1)
        model.add([v, vr, vu])

        model[v.section(u=0)].name = 'uneg'
        model[vr.section(u=-1)].name = 'upos'
        model[vu.section(u=0)].name = 'uneg'
        model[vu.section(u=-1)].name = 'upos'

        for vv in [v, vr, vu]:
            model[vv.section(v=0)].name = 'vneg'
            model[vv.section(v=-1)].name = 'vpos'

        model[v.section(w=0)].name = 'wneg'
        model[vr.section(w=0)].name = 'wneg'
        model[vr.section(w=-1)].name = 'wpos'
        model[vu.section(w=-1)].name = 'wpos'

        model.generate_cp_numbers()
        model.generate_cell_numbers()
        faces = model.faces()

        self.assertEqual(len(faces), 100)

        # The owner should always be the lower numbered cell
        self.assertTrue(((faces['owner'] < faces['neighbor']) |
                         (faces['neighbor'] == -1)).all())

        # Where the boundary is named, the neighbor is always -1
        self.assertTrue((faces[faces['name'] != None]['neighbor'] == -1).all())

        # On internal faces, the neighbor is always > 0
        self.assertTrue((faces[faces['name'] == None]['neighbor'] > 0).all())

        # Boundaries occur the expected number of times
        self.assertEqual(np.sum(faces['name'] == None), 44)
        self.assertEqual(np.sum(faces['name'] == 'uneg'), 8)
        self.assertEqual(np.sum(faces['name'] == 'upos'), 8)
        self.assertEqual(np.sum(faces['name'] == 'vneg'), 12)
        self.assertEqual(np.sum(faces['name'] == 'vpos'), 12)
        self.assertEqual(np.sum(faces['name'] == 'wneg'), 8)
        self.assertEqual(np.sum(faces['name'] == 'wpos'), 8)

        # Every cell is mentioned by exactly six faces
        nmentions = [0] * 24
        for face in faces:
            nmentions[face['owner']] += 1
            if face['neighbor'] > 0:
                nmentions[face['neighbor']] += 1
        self.assertEqual(nmentions, [6] * 24)

        # Face normals always point toward the neighbor
        # In this case, that means in a positive axial direction,
        # except possibly for boundary faces
        cps = model.cps()
        for face in faces:
            for I in [face['nodes'][:-1], face['nodes'][1:]]:
                vertices = cps[I]
                z = np.cross(vertices[1] - vertices[0],
                             vertices[2] - vertices[1])

                # Should be zero, zero and +/- 0.25
                self.assertAlmostEqual(sum(np.abs(z)), 0.25)

                # j = index of the 0.25
                j = np.argmax(np.abs(z))
                others = {0: [1, 2], 1: [0, 2], 2: [0, 1]}[j]
                np.testing.assert_almost_equal(z[others], 0.0)

                # Check that the 0.25 has the right sign
                if face['name'] is None or face['name'][1:] == 'pos':
                    np.testing.assert_almost_equal(z[j], 0.25)
                else:
                    np.testing.assert_almost_equal(z[j], -0.25)

                # And that it occurs in the expected index (for boundary faces)
                if face['name'] is not None:
                    self.assertEqual(j, 'uvw'.index(face['name'][0]))