예제 #1
0
def _fill_mesh_bdr_elements(omesh, vtx, bindices, nbverts, battrs, bbase,
                            kbelem):

    cnbverts = np.hstack([0, np.cumsum(nbverts)])
    for i, ba in enumerate(battrs):
        if not kbelem[i]:
            print("skipping")
            continue
        iv = bindices[cnbverts[i]:cnbverts[i + 1]]
        if bbase[i] == 0:
            el = mfem.Point(iv[0])
            el.SetAttribute(ba)
            el.thisown = False
            omesh.AddBdrElement(el)
        elif bbase[i] == 1:
            omesh.AddBdrSegment(list(iv), ba)
        elif bbase[i] == 2:
            #if myid == 1: print(list(iv), ba)
            omesh.AddBdrTriangle(list(iv), ba)
        elif bbase[i] == 3:
            omesh.AddBdrQuad(list(iv), ba)
        else:
            assert False, "unsupported base geometry: " + str(bbase[i])

    for v in vtx:
        omesh.AddVertex(list(v))
예제 #2
0
def straight_line_mesh(lengths,
                       nsegs,
                       filename='',
                       refine=False,
                       fix_orientation=False,
                       sdim=3,
                       x0=0.0):

    Nvert = np.sum(nsegs) + 1
    Nelem = np.sum(nsegs)
    Nbdrelem = len(lengths) + 1
    mesh = mfem.Mesh(1, Nvert, Nelem, Nbdrelem, sdim)

    ivert = {}
    L = np.hstack(([0], np.cumsum(lengths))).astype(float)
    P = np.hstack(([0], np.cumsum(nsegs))).astype(int)
    X = [np.linspace(L[i], L[i + 1], n + 1)[1:] for i, n in enumerate(nsegs)]
    X = np.hstack(([0], np.hstack(X)))
    A = np.hstack([[i + 1] * n for i, n in enumerate(nsegs)])
    for k, i in enumerate(P):
        ptx = mfem.Point(i)
        ptx.SetAttribute(k + 1)
        mesh.AddBdrElement(ptx)
        ptx.thisown = False

    for i in range(X.shape[0] - 1):
        seg = mfem.Segment((i, i + 1), A[i])
        mesh.AddElement(seg)
        seg.thisown = False
    for i in range(X.shape[0]):
        pt = [0] * sdim
        pt[0] = X[i] + x0
        mesh.AddVertex(pt)

    mesh.FinalizeTopology()
    mesh.Finalize(refine, fix_orientation)

    if filename != '':
        mesh.PrintToFile(filename, 8)
    return mesh