Пример #1
0
def surface_weight(refine, gtype):
    if (refine, gtype) in globals()['weight']:
        return globals()['weight'][(refine, gtype)]
    
    quad_v = [[0, 0], [1, 0], [1, 1], [0, 3]]
    quad_e = [[0, 1, 2, 3]]
    tri_v =   [[0, 0], [1, 0], [0, 1]]
    tri_e = [[0, 1, 2,]]
    seg_v =   [[0,], [1, ],]
    seg_e = [[0, 1,]]

    if gtype == mfem.Geometry.TRIANGLE:
        mesh = mfem.Mesh(2, 3, 1, 0, 2)
        for j in range(3):
            mesh.AddVertex(tri_v[j])
        for j in range(1):
            mesh.AddTri(tri_e[j], 11)
        mesh.FinalizeTriMesh(1,1, True)

    elif gtype == mfem.Geometry.SQUARE:
        mesh = mfem.Mesh(2, 4, 1, 0, 2)
        for j in range(4):
            mesh.AddVertex(quad_v[j])
        for j in range(1):
            mesh.AddQuad(quad_e[j], 11)
        mesh.FinalizeQuadMesh(1,1, True)
    elif gtype == mfem.Geometry.SEGMENT:
        mesh = mfem.Mesh(1, 2, 1, 0, 1)
        for j in range(2):
            mesh.AddVertex(seg_v[j])
        for j in range(1):
            seg = mfem.Segment(seg_e[j], j+1)
            mesh.AddElement(seg)
            seg.thisown = False        
            mesh.FinalizeTopology()         
            mesh.Finalize(False, False)

    fec_type = mfem.H1_FECollection
    fe_coll = fec_type(1, 2)
    fes = mfem.FiniteElementSpace(mesh, fe_coll, 2)
    el = fes.GetFE(0)
    npt = Geom.GetVertices(gtype).GetNPoints()
    RefG = GR.Refine(gtype, refine)

    shape = mfem.Vector(el.GetDof())              
    ir = RefG.RefPts

    shapes =[]
    for i in range(ir.GetNPoints()):
        el.CalcShape(ir.IntPoint(i), shape)
        shapes.append(shape.GetDataArray().copy())
        
    w = np.vstack(shapes)
    globals()['weight'][(refine, gtype)] = w

    return w
Пример #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
Пример #3
0
def _fill_mesh_elements(omesh, vtx, indices, nverts, attrs, base):

    cnverts = np.hstack([0, np.cumsum(nverts)])

    for i, a in enumerate(attrs):
        iv = indices[cnverts[i]:cnverts[i + 1]]
        if base[i] == 1:  # segment
            el = mfem.Segment()
            el.SetAttribute(a)
            el.SetVertices(list(iv))
            el.thisown = False
            omesh.AddElement(el)
        elif base[i] == 2:  # triangle
            omesh.AddTri(list(iv), a)
        elif base[i] == 3:  # quad
            omesh.AddQuad(list(iv), a)
        elif base[i] == 4:  # tet
            omesh.AddTet(list(iv), a)
        elif base[i] == 5:  # hex
            omesh.AddHex(list(iv), a)
        else:
            assert False, "unsupported base geometry: " + str(base[i])