def extract_refined_mesh_data1(mesh, refine=None): ndim = mesh.Dimension() sdim = mesh.SpaceDimension() ivert0 = [ mesh.GetElement(i).GetVerticesArray() for i in range(mesh.GetNE()) ] idx2 = np.arange(mesh.GetNE()) iv2 = [np.arange(mesh.GetNV())] table = np.arange(mesh.GetNV()) battrs = mesh.GetAttributeArray() gt = mesh.GetElementTransformation cells = {} cell_data = {} ptx = [mesh.GetVertexArray() for i in range(mesh.GetNV())] base = 1 from petram.mesh.refined_mfem_geom import get_geom if len(idx2) > 0: attr2, ptx2, ivx2, ivxe2, attrx2 = get_geom( idx2, 2, base, gt, battrs, sdim, refine, ) ptx.append(ptx2) cells['line_x'] = ivx2 cell_data['line_x'] = {} cell_data['line_x']['physical'] = attrx2 cell_data['X_refined_edge'] = ptx2 X = np.vstack(ptx) from petram.mesh.mesh_utils import populate_plotdata l_s_loop = populate_plotdata(mesh, table, cells, cell_data) iedge2bb = None # is it used? #print "X", X.shape #for k in cells['vertex']:print X[k] return X, cells, cell_data, l_s_loop, iedge2bb
def extract_refined_mesh_data2(mesh, refine=None): ndim = mesh.Dimension() sdim = mesh.SpaceDimension() ivert0 = [ mesh.GetElement(i).GetVerticesArray() for i in range(mesh.GetNE()) ] attrs = mesh.GetAttributeArray() nvert = np.array([len(x) for x in ivert0]) idx3 = np.where(nvert == 3)[0] idx4 = np.where(nvert == 4)[0] ivert = [] ivert3 = None ivert4 = None iv3 = [] iv4 = [] iv3p = np.array([], dtype=int) iv4p = np.array([], dtype=int) from petram.mesh.refined_mfem_geom import get_geom ptx = [] ivx3 = None ptx3 = [] if len(idx3) != 0: base = mesh.GetElementBaseGeometry(idx3[0]) gt = mesh.GetElementTransformation attr3, ptx3, ivx3, ivxe3, attrx3 = get_geom(idx3, 3, base, gt, attrs, sdim, refine) ptx.append(ptx3) npt = len(ptx3) // len(idx3) lref = len(ivx3) // len(idx3) iv3 = [ivert0[k] for k in idx3] seen = defaultdict(int) for iiv in ivx3[:lref].flatten(): seen[iiv] += 1 xxx = np.sort([kk for kk in seen if seen[kk] == 1]) iv3p = np.hstack([xxx + j * npt for j, k in enumerate(idx3)]) ivert3 = np.vstack(iv3) if len(idx4) != 0: base = mesh.GetElementBaseGeometry(idx4[0]) gt = mesh.GetElementTransformation attr4, ptx4, ivx4, ivxe4, attrx4 = get_geom(idx4, 4, base, gt, attrs, sdim, refine) ptx.append(ptx4) npt = len(ptx4) // len(idx4) lref = len(ivx4) // len(idx4) iv4 = [ivert0[k] for k in idx4] seen = defaultdict(int) for iiv in ivx4[:lref].flatten(): seen[iiv] += 1 xxx = np.sort([kk for kk in seen if seen[kk] == 1]) iv4p = np.hstack([xxx + j * npt for j, k in enumerate(idx4)]) + len(ptx3) ivert4 = np.vstack(iv4) if ivx3 is not None: ivx4 = ivx4 + len(ptx3) ivxe4 = ivxe4 + len(ptx3) ptx_face = np.vstack(ptx) # unique edges for node tmp = np.hstack(iv3 + iv4) tmp2 = np.hstack((iv3p, iv4p)) u, indices = np.unique(tmp, return_inverse=True) ll3 = 3 * len(idx3) indices3 = indices[:ll3] indices4 = indices[ll3:] table = np.zeros(np.max(u) + 1, dtype=int) - 1 for k, u0 in enumerate(u): table[u0] = tmp2[np.where(tmp == u0)[0][0]] X = ptx_face #X = np.vstack([mesh.GetVertexArray(k) for k in u]) if X.shape[1] == 2: X = np.hstack((X, np.zeros((X.shape[0], 1)))) elif X.shape[1] == 1: X = np.hstack((X, np.zeros((X.shape[0], 2)))) kdom = mesh.attributes.ToList() cells = {} cell_data = {} cell_data['X_refined_face'] = ptx_face if ivert3 is not None: cells['triangle'] = indices3.reshape(ivert3.shape) cells['triangle_x'] = ivx3 cells['triangle_xe'] = ivxe3 cell_data['triangle'] = {} cell_data['triangle']['physical'] = attr3 cell_data['triangle_x'] = {} cell_data['triangle_x']['physical'] = attrx3 if ivert4 is not None: cells['quad'] = indices4.reshape(ivert4.shape) cells['quad_x'] = ivx4 cells['quad_xe'] = ivxe4 cell_data['quad'] = {} cell_data['quad']['physical'] = attr4 cell_data['quad_x'] = {} cell_data['quad_x']['physical'] = attrx4 ### process refined edges battrs = mesh.GetBdrAttributeArray() base = 1 gt = mesh.GetBdrElementTransformation idx2 = range(mesh.GetNBE()) if len(idx2) > 0: attr2, ptx2, ivx2, ivxe2, attrx2 = get_geom(idx2, 2, base, gt, battrs, sdim, refine) cells['line_x'] = ivx2 cell_data['line_x'] = {} cell_data['line_x']['physical'] = attrx2 cell_data['X_refined_edge'] = ptx2 from petram.mesh.mesh_utils import populate_plotdata l_s_loop = populate_plotdata(mesh, table, cells, cell_data) iedge2bb = None # is it used? #print "X", X.shape #for k in cells['vertex']:print X[k] return X, cells, cell_data, l_s_loop, iedge2bb
def extract_mesh_data(mesh, refine=1): if isinstance(mesh, ParMesh): assert False, "mesh data must be processed in serial" hasNodal = mesh.GetNodalFESpace() is not None ndim = mesh.Dimension() if hasNodal and refine != 1: if ndim == 3: from petram.mesh.read_mfemmesh3 import extract_refined_mesh_data3 return extract_refined_mesh_data3(mesh, refine) elif ndim == 2: from petram.mesh.read_mfemmesh2 import extract_refined_mesh_data2 return extract_refined_mesh_data2(mesh, refine) else: from petram.mesh.read_mfemmesh1 import extract_refined_mesh_data1 return extract_refined_mesh_data1(mesh, refine) if ndim == 3: ivert0 = [mesh.GetBdrElement(i).GetVerticesArray() for i in range(mesh.GetNBE())] attrs = mesh.GetBdrAttributeArray() elif ndim == 2: ivert0 = [mesh.GetElement(i).GetVerticesArray() for i in range(mesh.GetNE())] attrs = mesh.GetAttributeArray() else: return extract_mesh_data_1D(mesh) nvert = np.array([len(x) for x in ivert0]) idx3 = np.where(nvert == 3)[0] idx4 = np.where(nvert == 4)[0] ivert = []; ivert3 = None; ivert4 = None iv3 = []; iv4 = [] if len(idx3) != 0: iv3 = [ivert0[k] for k in idx3] ivert3 = np.vstack(iv3) attrs3 = attrs[idx3] if len(idx4) != 0: iv4 = [ivert0[k] for k in idx4] ivert4 = np.vstack(iv4) attrs4 = attrs[idx4] tmp = np.hstack(iv3+iv4) u, indices = np.unique(tmp, return_inverse=True) ll3 = 3*len(idx3) indices3 = indices[:ll3] indices4 = indices[ll3:] # table u -> u's idx table = np.zeros(np.max(u)+1, dtype=int)-1 for k, u0 in enumerate(u): table[u0] = k X = np.vstack([mesh.GetVertexArray(k) for k in u]) if X.shape[1] == 2: X = np.hstack((X, np.zeros((X.shape[0],1)))) elif X.shape[1] == 1: X = np.hstack((X, np.zeros((X.shape[0],2)))) kdom = mesh.attributes.ToList() cells = {} cell_data = {} if ivert3 is not None: cells['triangle'] = indices3.reshape(ivert3.shape) cell_data['triangle'] = {} cell_data['triangle']['physical'] = attrs3 if ivert4 is not None: cells['quad'] = indices4.reshape(ivert4.shape) cell_data['quad'] = {} cell_data['quad']['physical'] = attrs4 from petram.mesh.mesh_utils import populate_plotdata l_s_loop = populate_plotdata(mesh, table, cells, cell_data) iedge2bb = None # is it used? return X, cells, cell_data, l_s_loop, iedge2bb '''