def write_fenics_file(ofile, mesh, editor): dim = mesh.geometry().dim() for i in range(1, len(cell_map)+1): if dim == 2: editor.add_cell(i-1, cell_map[i][0]-1, cell_map[i][1]-1, cell_map[i][2]-1) else: editor.add_cell(i-1, cell_map[i][0]-1, cell_map[i][1]-1, cell_map[i][2]-1, cell_map[i][3]-1) mesh.order() # Set MeshValueCollections from info in boundary_cell #mvc = mesh.domains().markers(dim-1) md = mesh.domains() for zone, cells in boundary_cells.iteritems(): for cell, nds in cells.iteritems(): dolfin_cell = Cell(mesh, cell-1) vertices_of_cell = dolfin_cell.entities(0) vertices_of_face = nds - 1 for jj, ff in enumerate(facets(dolfin_cell)): facet_vertices = ff.entities(0) if all(map(lambda x: x in vertices_of_face, facet_vertices)): local_index = jj break #mvc.set_value(cell-1, local_index, zone) md.set_marker((ff.index(), zone), dim-1) ofile << mesh from dolfin import plot plot(mesh, interactive=True) print 'Finished writing FEniCS mesh\n'
def write_fenics_file(ofile, mesh, editor): dim = mesh.geometry().dim() for i in range(1, len(cell_map) + 1): if dim == 2: editor.add_cell(i - 1, cell_map[i][0] - 1, cell_map[i][1] - 1, cell_map[i][2] - 1) else: editor.add_cell(i - 1, cell_map[i][0] - 1, cell_map[i][1] - 1, cell_map[i][2] - 1, cell_map[i][3] - 1) mesh.order() # Set MeshValueCollections from info in boundary_cell #mvc = mesh.domains().markers(dim-1) md = mesh.domains() for zone, cells in boundary_cells.iteritems(): for cell, nds in cells.iteritems(): dolfin_cell = Cell(mesh, cell - 1) vertices_of_cell = dolfin_cell.entities(0) vertices_of_face = nds - 1 for jj, ff in enumerate(facets(dolfin_cell)): facet_vertices = ff.entities(0) if all(map(lambda x: x in vertices_of_face, facet_vertices)): local_index = jj break #mvc.set_value(cell-1, local_index, zone) md.set_marker((ff.index(), zone), dim - 1) ofile << mesh from dolfin import plot plot(mesh, interactive=True) print 'Finished writing FEniCS mesh\n'
def write_fenics_file(dim, ofilename): ofile = File(ofilename + '.xml') mesh = Mesh() editor = MeshEditor() editor.open(mesh, dim, dim) editor.init_vertices(nodes.shape[1]) editor.init_cells(len(cell_map)) for i in range(nodes.shape[1]): if dim == 2: editor.add_vertex(i, nodes[0, i], nodes[1, i]) else: editor.add_vertex(i, nodes[0, i], nodes[1, i], nodes[2, i]) for i in range(1, len(cell_map)+1): if dim == 2: editor.add_cell(i-1, cell_map[i][0]-1, cell_map[i][1]-1, cell_map[i][2]-1) else: editor.add_cell(i-1, cell_map[i][0]-1, cell_map[i][1]-1, cell_map[i][2]-1, cell_map[i][3]-1) mesh.order() mvc = mesh.domains().markers(dim-1) for zone, cells in boundary_cells.iteritems(): for cell, nds in cells.iteritems(): dolfin_cell = Cell(mesh, cell-1) nodes_of_cell = dolfin_cell.entities(0) #print cell #print nodes_of_cell nodes_of_face = nds - 1 #print nodes_of_face for jj, ff in enumerate(facets(dolfin_cell)): facet_nodes = ff.entities(0) #print facet_nodes if all(map(lambda x: x in nodes_of_face, facet_nodes)): local_index = jj break mvc.set_value(cell-1, local_index, zone) ofile << mesh from dolfin import plot plot(mesh, interactive=True) print 'Finished writing FEniCS mesh\n'
def mesh_to_boundarymesh_dofmap(boundary, V, Vb, _should_own="cdof"): "Find the mapping from dofs on full mesh FS to dofs on boundarymesh FS" from dolfin import dolfin_version, MPI, mpi_comm_world #if dolfin_version() != '1.4.0' and MPI.size(mpi_comm_world()) > 1: # raise RuntimeError("mesh_to_boundarymesh_dofmap is currently not supported in parallel in version %s" %(dolfin_version())) assert V.ufl_element().family() == Vb.ufl_element().family() assert V.ufl_element().degree() == Vb.ufl_element().degree() assert _should_own in ["cdof", "bdof"] # Currently only CG1 and DG0 spaces are supported assert V.ufl_element().family() in ["Lagrange", "Discontinuous Lagrange"] if V.ufl_element().family() == "Discontinuous Lagrange": assert V.ufl_element().degree() == 0 else: assert V.ufl_element().degree() == 1 D = boundary.topology().dim() mesh = V.mesh() V_dm = V.dofmap() Vb_dm = Vb.dofmap() dofmap_to_boundary = {} # Extract maps from boundary to mesh vertex_map = boundary.entity_map(0) cell_map = boundary.entity_map(D) for i in xrange(len(cell_map)): boundary_cell = Cell(boundary, i) mesh_facet = Facet(mesh, cell_map[i]) mesh_cell_index = mesh_facet.entities(D + 1)[0] mesh_cell = Cell(mesh, mesh_cell_index) cell_dofs = V_dm.cell_dofs(mesh_cell_index) boundary_dofs = Vb_dm.cell_dofs(i) if V_dm.num_entity_dofs(0) > 0: for v_idx in boundary_cell.entities(0): mesh_v_idx = vertex_map[int(v_idx)] mesh_list_idx = where( mesh_cell.entities(0) == mesh_v_idx)[0][0] boundary_list_idx = where( boundary_cell.entities(0) == v_idx)[0][0] bdofs = boundary_dofs[Vb_dm.tabulate_entity_dofs( 0, boundary_list_idx)] cdofs = cell_dofs[V_dm.tabulate_entity_dofs(0, mesh_list_idx)] for bdof, cdof in zip(bdofs, cdofs): #if dolfin_version() in ["1.4.0+", "1.5.0", "1.6.0"]: if LooseVersion(dolfin_version()) > LooseVersion("1.4.0"): bdof = Vb_dm.local_to_global_index(bdof) cdof = V_dm.local_to_global_index(cdof) if _should_own == "cdof" and not (V_dm.ownership_range( )[0] <= cdof < V_dm.ownership_range()[1]): continue elif _should_own == "bdof" and not (Vb_dm.ownership_range( )[0] <= bdof < Vb_dm.ownership_range()[1]): continue else: dofmap_to_boundary[bdof] = cdof if V_dm.num_entity_dofs(D + 1) > 0 and V_dm.num_entity_dofs(0) == 0: bdofs = boundary_dofs[Vb_dm.tabulate_entity_dofs(D, 0)] cdofs = cell_dofs[V_dm.tabulate_entity_dofs(D + 1, 0)] for bdof, cdof in zip(bdofs, cdofs): #if dolfin_version() in ["1.4.0+", "1.5.0"]: if LooseVersion(dolfin_version()) > LooseVersion("1.4.0"): bdof = Vb_dm.local_to_global_index(bdof) cdof = V_dm.local_to_global_index(cdof) dofmap_to_boundary[bdof] = cdof return dofmap_to_boundary