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