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