示例#1
0
 def setUp(self):
     self.doms = list()
     data2D = {'lower': [0, 0], 'upper': [0.6, 0.8], "nelem": [2, 3]}
     for ngl in range(2, 10, 2):
         dm = DMPlexDom(boxMesh=data2D)
         dm.setFemIndexing(ngl)
         self.doms.append(dm)
示例#2
0
 def setUp(self):
     data3D = {
         'lower': [0, 0, 0],
         'upper': [0.6, 0.8, 1],
         "nelem": [3, 4, 5]
     }
     self.dom = DMPlexDom(boxMesh=data3D)
     self.dom.setFemIndexing(3)
示例#3
0
 def test_get_all_global_nodes_ngls(self):
     data2D = {'lower': [0, 0], 'upper': [0.6, 0.8], "nelem": [2, 3]}
     for ngl in range(2, 14):
         dom = DMPlexDom(boxMesh=data2D)
         dom.setFemIndexing(ngl)
         allNodes = dom.getAllNodes()
         total = 12 + 17 * (ngl - 2) + 6 * ((ngl - 2)**2)
         assert len(allNodes) == total
         del dom
示例#4
0
    def setUp(self):
        ngl = 2
        data2D = {'lower': [0, 0], 'upper': [1, 1], "nelem": [2, 2]}
        self.dom = DMPlexDom(boxMesh=data2D)
        self.dom.setFemIndexing(ngl)

        dim = self.dom.getDimension()
        spectral2D = Spectral(ngl, dim)
        self.dom.computeFullCoordinates(spectral2D)

        self.testVelVec = self.dom.createGlobalVec()
示例#5
0
class BaseProblem(object):
    def __init__(self, comm=MPI.COMM_WORLD):
        """
        comm: MPI Communicator
        """
        self.comm = comm
        self.logger = logging.getLogger("Setting Up Base Problem")

    def setUpDomain(self):
        self.dom = DMPlexDom(self.lower, self.upper, self.nelem)
        self.logger.debug("DMPlex dom intialized")

    def setUpHighOrderIndexing(self):
        self.dom.setFemIndexing(self.ngl)

    def setUpElement(self):
        self.elemType = Spectral2D(self.ngl, self.dim)

    def setUpWithInputData(self, inputData):
        self.dim = len(inputData['nelem'])
        self.dim_w = 1 if self.dim == 2 else 3
        self.dim_s = 3 if self.dim == 2 else 6
        self.ngl = inputData['ngl']
        self.lower = inputData['lower']
        self.upper = inputData['upper']
        self.nelem = inputData['nelem']

    def createMesh(self):
        self.dom.computeFullCoordinates(self.elemType)
        self.viewer = Paraviewer(self.dim ,self.comm)
        self.viewer.saveMesh(self.dom.fullCoordVec)

    def setUpGeneral(self, inputData):
        self.setUpWithInputData(inputData)
        self.setUpDomain()
        self.setUpHighOrderIndexing()
        self.setUpElement()
        self.createMesh()
示例#6
0
    def setUp(self):
        self.dom_list_2d = list()
        dim = 2
        for ngl in range(2,4):
            dm = DMPlexDom([0]*dim, [1]*dim, [2]*dim)
            dm.setFemIndexing(ngl)
            self.dom_list_2d.append(dm)

        self.dom_list_3d = list()

        dim = 3
        for ngl in range(2,4):
            dm = DMPlexDom([0]*dim, [1]*dim, [2]*dim)
            dm.setFemIndexing(ngl)

            self.dom_list_3d.append(dm)
示例#7
0
class TestBoxDMPLEX2D(unittest.TestCase):

    # Test Roadmap
    ## 1. Separate dmplex from indicesmanager

    def setUp(self):
        data2D = {'lower': [0, 0], 'upper': [0.6, 0.8], "nelem": [3, 4]}
        self.dom = DMPlexDom(boxMesh=data2D)
        self.dom.setFemIndexing(3)

    def test_generate_dmplex(self):
        assert self.dom.getDimension() == 2

    def test_cell_start_end(self):
        self.assertEqual(self.dom.cellStart, 0)
        self.assertEqual(self.dom.cellEnd, 12)

    def test_cell_corners_coords(self):
        coords_cell_0 = np.array([[0, 0], [0.2, 0], [0.2, 0.2], [0, 0.2]])
        coords_cell_0.shape = 8
        coord = self.dom.getCellCornersCoords(0)
        np_test.assert_array_almost_equal(coords_cell_0, coord, decimal=13)

    def test_borders_nodes(self):
        total = 28
        bordersNodes = self.dom.getBordersNodes()
        bordersNodes_alt = self.dom.getNodesFromLabel("External Boundary")
        assert type(bordersNodes) == set
        assert len(bordersNodes) == total

        assert type(bordersNodes_alt) == set
        assert len(bordersNodes_alt) == total

        np_test.assert_equal(bordersNodes, bordersNodes_alt)

    def test_border_nodes(self):
        borderNames = self.dom.getBordersNames()
        for b in borderNames:
            if b in ['up', 'down']:
                assert len(self.dom.getBorderNodes(b)) == 7
            else:
                assert len(self.dom.getBorderNodes(b)) == 9
示例#8
0
class TestBoxDMPLEX3D(unittest.TestCase):
    def setUp(self):
        data3D = {
            'lower': [0, 0, 0],
            'upper': [0.6, 0.8, 1],
            "nelem": [3, 4, 5]
        }
        self.dom = DMPlexDom(boxMesh=data3D)
        self.dom.setFemIndexing(3)

    def test_generate_dmplex(self):
        assert self.dom.getDimension() == 3

    def test_cell_start_end(self):
        self.assertEqual(self.dom.cellStart, 0)
        self.assertEqual(self.dom.cellEnd, 3 * 4 * 5)

    def test_cell_corners_coords(self):
        coords_cell_0 = np.array([[0, 0, 0], [0, 0.2, 0], [0.2, 0.2, 0],
                                  [0.2, 0, 0], [0, 0, 0.2], [0.2, 0, 0.2],
                                  [0.2, 0.2, 0.2], [0, 0.2, 0.2]])
        coords_cell_0.shape = 8 * 3
        coord = self.dom.getCellCornersCoords(0)
        np_test.assert_array_almost_equal(coords_cell_0, coord, decimal=13)

    def test_border_names(self):
        borderNames = self.dom.getBordersNames()

        assert len(borderNames) == 6
        for b in borderNames:
            assert b in ['up', 'down', 'left', 'right', 'front', 'back']

    def test_borders_nodes(self):
        totalArc = 28 * 11
        totalFace = 35 * 2
        total = totalArc + totalFace
        bordersNodes = self.dom.getBordersNodes()
        bordersNodes_alt = self.dom.getNodesFromLabel("External Boundary")
        assert type(bordersNodes) == set
        assert len(bordersNodes) == total

        assert type(bordersNodes_alt) == set
        assert len(bordersNodes_alt) == total

        np_test.assert_equal(bordersNodes, bordersNodes_alt)

    def test_border_nodes(self):
        borderNames = self.dom.getBordersNames()
        for b in borderNames:
            if b in ['up', 'down']:
                assert len(self.dom.getBorderNodes(b)) == 7 * 11
            elif b in ['left', 'right']:
                assert len(self.dom.getBorderNodes(b)) == 9 * 11
            else:
                assert len(self.dom.getBorderNodes(b)) == 7 * 9
示例#9
0
class DomainModTests2D(unittest.TestCase):
    def setUp(self):
        ngl = 2
        data2D = {'lower': [0, 0], 'upper': [1, 1], "nelem": [2, 2]}
        self.dom = DMPlexDom(boxMesh=data2D)
        self.dom.setFemIndexing(ngl)

        dim = self.dom.getDimension()
        spectral2D = Spectral(ngl, dim)
        self.dom.computeFullCoordinates(spectral2D)

        self.testVelVec = self.dom.createGlobalVec()

    def test_get_all_global_nodes_ngls(self):
        data2D = {'lower': [0, 0], 'upper': [0.6, 0.8], "nelem": [2, 3]}
        for ngl in range(2, 14):
            dom = DMPlexDom(boxMesh=data2D)
            dom.setFemIndexing(ngl)
            allNodes = dom.getAllNodes()
            total = 12 + 17 * (ngl - 2) + 6 * ((ngl - 2)**2)
            assert len(allNodes) == total
            del dom

    def test_get_nodes_coordinates_2D(self):
        allNodes = self.dom.getAllNodes()
        coords = [[0., 0.], [0.5, 0.], [1., 0.], [0., 0.5], [0.5, 0.5],
                  [1., 0.5], [0., 1.], [0.5, 1.], [1., 1.]]
        test_coords = self.dom.getNodesCoordinates(allNodes)
        np_test.assert_array_almost_equal(coords, test_coords)

#     # TODO: implement 3D tests

    def test_set_function_vec_to_vec_2D(self):
        np_coords = np.array([[0., 0.], [0.5, 0.], [1., 0.], [0., 0.5],
                              [0.5, 0.5], [1., 0.5], [0., 1.], [0.5, 1.],
                              [1., 1.]])
        result = np.sqrt(np_coords)
        allNodes = self.dom.getAllNodes()

        f = lambda coords: (sqrt(coords[0]), sqrt(coords[1]))
        dim = self.dom.getDimension()
        self.dom.applyFunctionVecToVec(allNodes, f, self.testVelVec, dim)
        test_result = self.testVelVec.getArray().reshape(9, 2)
        np_test.assert_array_almost_equal(result, test_result, decimal=12)

    def test_set_function_vec_to_vec_2D_some_nodes(self):
        np_coords = np.array([[0., 0.], [1, 1.], [1., 1.], [0., 0.5], [1., 1.],
                              [1., 1.], [1., 1.], [0.5, 1.], [1., 1.]])
        result = np.sqrt(np_coords)

        self.testVelVec.set(1.0)
        someNodes = [0, 3, 7]
        f = lambda coords: (sqrt(coords[0]), sqrt(coords[1]))

        dim = self.dom.getDimension()
        self.dom.applyFunctionVecToVec(someNodes, f, self.testVelVec, dim)
        test_result = self.testVelVec.getArray().reshape(9, 2)
        np_test.assert_array_almost_equal(result, test_result, decimal=12)

    def test_set_function_scalar_to_vec_2D(self):
        vecScalar = PETSc.Vec().createSeq(9)

        result = np.array([0, 0.5, 1, 0.5, 1., 1.5, 1, 1.5, 2])

        allNodes = self.dom.getAllNodes()
        f = lambda coord: (coord[0] + coord[1])
        self.dom.applyFunctionScalarToVec(allNodes, f, vecScalar)
        test_result = vecScalar.getArray()
        np_test.assert_array_almost_equal(result, test_result, decimal=12)

    def test_set_constant_to_vec_2D(self):

        cteValue = [3, 5]

        result = np.array([3, 5] * 9).reshape(9, 2)
        vec = PETSc.Vec().createSeq(18)
        self.dom.applyValuesToVec(self.dom.getAllNodes(), cteValue, vec)
        test_result = vec.getArray().reshape(9, 2)
        np_test.assert_array_almost_equal(result, test_result, decimal=12)
示例#10
0
 def setUpDomain(self):
     self.dom = DMPlexDom(self.lower, self.upper, self.nelem)
     self.logger.debug("DMPlex dom intialized")
示例#11
0
                norm = vec.index(1.0)
            return norm
        else:
            return 2


class Vertex:
    def __init__(self, pointCoords):
        self.data = pointCoords
        self.next = None

    def __repr__(self):
        return str(self.data)

    def getCoordinates(self):
        return np.array(self.data)


if __name__ == "__main__":
    lower = [0, 0]
    upper = [1, 1]
    plex = DMPlexDom(lower=lower, upper=upper, faces=[3, 3])
    ns = NoSlipWalls(lower, upper)
    ns.setWallVelocity("left", [3, 5])
    ns.setWallVelocity("up", [34, 12])
    vel, velDofs = ns.getWallVelocity("up")
    dim = 2
    nodesSet = [3, 5, 9]
    dofVelToSet = [node * dim + dof for node in nodesSet for dof in velDofs]
    # print(ns)
    # plex.getFaceEntities("left")