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)
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]))