def createCheckerboardMesh(nb_segs_x, mesh_name=""):

    if not mesh_name:
        mesh_name = "checkerboard_%ix%i" % (nb_segs_x, nb_segs_x)

    # First mesh
    mesh_1 = createMesh(nb_segs_x, 0., 1., 0., mesh_name)

    amr = MC.MEDCouplingCartesianAMRMesh(mesh_1)

    # Exemple sur une grille 4x4
    ## 1ere diagonale
    #amr.addPatch([(0, 1), (0, 1)], [2, 2])
    #amr.addPatch([(1, 2), (1, 2)], [2, 2])
    #amr.addPatch([(2, 3), (2, 3)], [2, 2])
    #amr.addPatch([(3, 4), (3, 4)], [2, 2])

    ## en-dessous de la diagonale, en bas à droite
    #amr.addPatch([(0, 1), (2, 3)], [2, 2])
    #amr.addPatch([(1, 2), (3, 4)], [2, 2])

    ## au-dessus de la diagonale, en haut à gauche
    #amr.addPatch([(2, 3), (0, 1)], [2, 2])
    #amr.addPatch([(3, 4), (1, 2)], [2, 2])

    # généralise avec une double boucle
    for i in range(0, nb_segs_x, 1):
        if i % 2 == 0:
            for j in range(0, (nb_segs_x + 1) / 2):
                amr.addPatch([(i, i + 1), (2 * j, 2 * j + 1)], [2, 2])
        else:
            for j in range(0, nb_segs_x / 2):
                amr.addPatch([(i, i + 1), (1 + 2 * j, 2 * j + 2)], [2, 2])

    # Crée un seul maillage avec tous les rafinements
    mesh = amr.buildUnstructured()
    mesh.setName(mesh_name)
    # Merge les noeuds confondus (à faire avant le conformize2D)
    arr, areNodesMerged, newNbOfNodes = mesh.mergeNodes(1e-10)
    # Crée des polygones pour rendre conforme les mailles
    mesh.conformize2D(1e-10)

    # Crée les éléments 1D pour pouvoir imposer les conditions aux limites
    mesh_1d = mesh.computeSkin()

    # Identifie les segments de chaque côté pour créer les groupes
    tol = 1e-10
    #tol2 = 0
    #arr_left = mesh_1d.getCellsInBoundingBox([0-tol, tol, -tol, 1+tol], tol2)
    #arr_right = mesh_1d.getCellsInBoundingBox([1-tol, 1+tol, -tol, 1+tol], tol2)
    #arr_bottom = mesh_1d.getCellsInBoundingBox([0-tol, 1+tol, -tol, tol], tol2)
    #arr_top = mesh_1d.getCellsInBoundingBox([0-tol, 1+tol, 1-tol, 1+tol], tol2)

    # PB: getCellsInBoundingBox renvoie aussi les segments qui touchent la bounding box
    # => On boucle sur les coordonnées des barycentres

    barycenters = mesh_1d.computeIsoBarycenterOfNodesPerCell()
    ids_left = []
    ids_right = []
    ids_bottom = []
    ids_top = []
    for i, coord in enumerate(barycenters):
        x, y = coord
        if abs(x) < tol:
            ids_left.append(i)
        elif abs(x - 1) < tol:
            ids_right.append(i)
        elif abs(y) < tol:
            ids_bottom.append(i)
        elif abs(y - 1) < tol:
            ids_top.append(i)

    arr_left = MC.DataArrayInt(ids_left)
    arr_right = MC.DataArrayInt(ids_right)
    arr_bottom = MC.DataArrayInt(ids_bottom)
    arr_top = MC.DataArrayInt(ids_top)

    arr_left.setName("Left")
    arr_right.setName("Right")
    arr_bottom.setName("Bottom")
    arr_top.setName("Top")

    # Trie les cellules par type conformément à la convention MED fichier
    o2n = mesh.sortCellsInMEDFileFrmt()
    meshMEDFile = ML.MEDFileUMesh.New()
    # Ecrit le maillage 2D
    meshMEDFile.setMeshAtLevel(0, mesh)
    # Ecrit le maillage 1D
    meshMEDFile.setMeshAtLevel(-1, mesh_1d)
    # Ecrit les groupes
    meshMEDFile.addGroup(-1, arr_left)
    meshMEDFile.addGroup(-1, arr_right)
    meshMEDFile.addGroup(-1, arr_bottom)
    meshMEDFile.addGroup(-1, arr_top)
    filename = mesh_name + ".med"
    meshMEDFile.write(filename, 2)  # 2 stands for write from scratch

    return meshMEDFile
Пример #2
0
def createLocallyRefinedMesh(nb_segs_x, mesh_name):

    # First mesh
    mesh_1 = createMesh(nb_segs_x, 0., 1., 0., mesh_name)

    amr = MC.MEDCouplingCartesianAMRMesh(mesh_1)

    # 1er raffinement
    amr.addPatch([(nb_segs_x / 2, nb_segs_x), (0, nb_segs_x / 2)], [2, 2])
    # 2eme raffinement
    amr[0].addPatch([(nb_segs_x / 2, nb_segs_x), (0, nb_segs_x / 2)], [2, 2])

    # Crée un seul maillage avec tous les rafinements
    mesh = amr.buildUnstructured()
    mesh.setName(mesh_name)
    # Merge les noeuds confondus (à faire avant le conformize2D)
    arr, areNodesMerged, newNbOfNodes = mesh.mergeNodes(1e-10)
    # Crée des polygones pour rendre conforme les mailles
    mesh.conformize2D(1e-10)

    # Crée les éléments 1D pour pouvoir imposer les conditions aux limites
    mesh_1d = mesh.computeSkin()

    # Identifie les segments de chaque côté pour créer les groupes
    tol = 1e-10
    #tol2 = 0
    #arr_left = mesh_1d.getCellsInBoundingBox([0-tol, tol, -tol, 1+tol], tol2)
    #arr_right = mesh_1d.getCellsInBoundingBox([1-tol, 1+tol, -tol, 1+tol], tol2)
    #arr_bottom = mesh_1d.getCellsInBoundingBox([0-tol, 1+tol, -tol, tol], tol2)
    #arr_top = mesh_1d.getCellsInBoundingBox([0-tol, 1+tol, 1-tol, 1+tol], tol2)

    # PB: getCellsInBoundingBox renvoie aussi les segments qui touchent la bounding box
    # => On boucle sur les coordonnées des barycentres

    barycenters = mesh_1d.computeIsoBarycenterOfNodesPerCell()
    ids_left = []
    ids_right = []
    ids_bottom = []
    ids_top = []
    for i, coord in enumerate(barycenters):
        x, y = coord
        if abs(x) < tol:
            ids_left.append(i)
        elif abs(x - 1) < tol:
            ids_right.append(i)
        elif abs(y) < tol:
            ids_bottom.append(i)
        elif abs(y - 1) < tol:
            ids_top.append(i)

    arr_left = MC.DataArrayInt(ids_left)
    arr_right = MC.DataArrayInt(ids_right)
    arr_bottom = MC.DataArrayInt(ids_bottom)
    arr_top = MC.DataArrayInt(ids_top)

    arr_left.setName("Left")
    arr_right.setName("Right")
    arr_bottom.setName("Bottom")
    arr_top.setName("Top")

    # Trie les cellules par type conformément à la convention MED fichier
    o2n = mesh.sortCellsInMEDFileFrmt()
    meshMEDFile = ML.MEDFileUMesh.New()
    # Ecrit le maillage 2D
    meshMEDFile.setMeshAtLevel(0, mesh)
    # Ecrit le maillage 1D
    meshMEDFile.setMeshAtLevel(-1, mesh_1d)
    # Ecrit les groupes
    meshMEDFile.addGroup(-1, arr_left)
    meshMEDFile.addGroup(-1, arr_right)
    meshMEDFile.addGroup(-1, arr_bottom)
    meshMEDFile.addGroup(-1, arr_top)
    filename = mesh_name + ".med"
    meshMEDFile.write(filename, 2)  # 2 stands for write from scratch

    return meshMEDFile
Пример #3
0
def createLocallyRefinedMesh(nb_segs_x, mesh_name):

    # First mesh
    mesh_1 = createMesh(nb_segs_x, 0., 1., 0., 0., mesh_name)

    amr = MC.MEDCouplingCartesianAMRMesh(mesh_1)

    # 1er raffinement
    amr.addPatch([(nb_segs_x / 2, nb_segs_x), (0, nb_segs_x / 2),
                  (0, nb_segs_x / 2)], [2, 2, 2])
    # 2eme raffinement
    amr[0].addPatch([(nb_segs_x / 2, nb_segs_x), (0, nb_segs_x / 2),
                     (0, nb_segs_x / 2)], [2, 2, 2])

    # Crée un seul maillage avec tous les rafinements
    mesh = amr.buildUnstructured()
    mesh.setName(mesh_name)
    # Merge les noeuds confondus (à faire avant le conformize2D)
    arr, areNodesMerged, newNbOfNodes = mesh.mergeNodes(1e-10)
    # Crée des polyèdres pour rendre conforme les mailles
    mesh.convertAllToPoly()
    mesh.conformize3D(1e-10)
    mesh.unPolyze()

    # Crée les éléments 1D pour pouvoir imposer les conditions aux limites
    mesh_2d = mesh.computeSkin()

    # Trie les cellules par type conformément à la convention MED fichier
    o2n = mesh.sortCellsInMEDFileFrmt()
    o2n = mesh_2d.sortCellsInMEDFileFrmt()

    # Identifie les faces de chaque côté pour créer les groupes
    tol = 1e-10

    barycenters = mesh_2d.computeIsoBarycenterOfNodesPerCell()
    ids_left = []
    ids_right = []
    ids_bottom = []
    ids_top = []
    ids_front = []
    ids_back = []
    for i, coord in enumerate(barycenters):
        x, y, z = coord
        if abs(x) < tol:
            ids_left.append(i)
        elif abs(x - 1) < tol:
            ids_right.append(i)
        elif abs(y) < tol:
            ids_bottom.append(i)
        elif abs(y - 1) < tol:
            ids_top.append(i)
        elif abs(z) < tol:
            ids_back.append(i)
        elif abs(z - 1) < tol:
            ids_front.append(i)

    arr_left = MC.DataArrayInt(ids_left)
    arr_right = MC.DataArrayInt(ids_right)
    arr_bottom = MC.DataArrayInt(ids_bottom)
    arr_top = MC.DataArrayInt(ids_top)
    arr_back = MC.DataArrayInt(ids_back)
    arr_front = MC.DataArrayInt(ids_front)

    arr_left.setName("Left")
    arr_right.setName("Right")
    arr_bottom.setName("Bottom")
    arr_top.setName("Top")
    arr_back.setName("Back")
    arr_front.setName("Front")

    meshMEDFile = ML.MEDFileUMesh.New()
    # Ecrit le maillage 3D
    meshMEDFile.setMeshAtLevel(0, mesh)
    # Ecrit le maillage 2D
    meshMEDFile.setMeshAtLevel(-1, mesh_2d)
    # Ecrit les groupes
    meshMEDFile.addGroup(-1, arr_left)
    meshMEDFile.addGroup(-1, arr_right)
    meshMEDFile.addGroup(-1, arr_bottom)
    meshMEDFile.addGroup(-1, arr_top)
    meshMEDFile.addGroup(-1, arr_back)
    meshMEDFile.addGroup(-1, arr_front)
    filename = mesh_name + ".med"
    meshMEDFile.write(filename, 2)  # 2 stands for write from scratch

    return meshMEDFile