dolfin team mailing list archive
-
dolfin team
-
Mailing list archive
-
Message #02561
Re: dolfin-convert, fix
The fixes look good so I have updated the script. No need to resend it.
Thanks!
/Anders
On Mon, May 15, 2006 at 05:25:34PM +0000, Alexander Jarosch wrote:
> Sorry not today, but if on Thursday is early enough I could make one, no
> problem. I have to go out of office now until then, so I will check
> back, and if still needed I will make one, sorry for not making one now.
>
> Alex
>
> Garth N. Wells wrote:
>
> >Could you make a patch file?
> >
> >Garth
> >
> >On Mon, 2006-05-15 at 17:13 +0000, Alexander Jarosch wrote:
> >
> >
> >>woops the code got broken, here I attached the updated dolvin-convert
> >>file...
> >>
> >>cheers
> >>
> >>Alex
> >>
> >>plain text document attachment (dolfin-convert)
> >>#!/usr/bin/env python
> >>#
> >># Copyright (C) 2006 Anders Logg
> >># Licensed under the GNU GPL Version 2
> >>#
> >># Modified by Garth N. Wells (gmsh function)
> >>#
> >># Modified by Alexander H. Jarosch (gmsh fix, 15.05.2006)
> >>#
> >># Script for converting between various data formats.
> >>#
> >># Supported input formats:
> >>#
> >># .mesh (Medit, generated by tetgen with option -g)
> >>#
> >># Supported output formats:
> >>#
> >># .xml (DOLFIN XML mesh file)
> >>
> >>import getopt
> >>import sys
> >>
> >>def main(argv):
> >> "Main function"
> >>
> >> # Get command-line arguments
> >> try:
> >> opts, args = getopt.getopt(argv, "h", ["help"])
> >> except getopt.GetoptError:
> >> usage()
> >> sys.exit(2)
> >>
> >> # Get options
> >> for opt, arg in opts:
> >> if opt in ("-h", "--help"):
> >> usage()
> >> sys.exit()
> >>
> >> # Check that we got two filenames
> >> if not len(args) == 2:
> >> usage()
> >> sys.exit(2)
> >>
> >> # Get filenames and suffixes
> >> ifilename = args[0]
> >> ofilename = args[1]
> >> isuffix = ifilename.split(".")[-1]
> >> osuffix = ofilename.split(".")[-1]
> >>
> >> # Choose conversion
> >> if isuffix == "mesh" and osuffix == "xml":
> >> mesh2xml(ifilename, ofilename)
> >> if (isuffix == "gmsh" or isuffix == "msh") and osuffix == "xml":
> >> gmsh2xml(ifilename, ofilename)
> >> else:
> >> print "Sorry, cannot convert between .%s and .%s file formats." %
> >> (isuffix, osuffix)
> >>
> >>def usage():
> >> "Display usage"
> >> print """\
> >>Usage: dolfin-convert [OPTION]... input.x output.y
> >>
> >> -h display this help text and exit
> >>
> >>Alternatively, the following long options may be used:
> >>
> >> --help
> >> """
> >> return
> >>
> >>def error(message):
> >> "Write an error message"
> >> for line in message.split("\n"):
> >> print "*** %s" % line
> >> sys.exit(2)
> >>
> >>def mesh2xml(ifilename, ofilename):
> >> """Convert between .mesh and .xml, parser implemented as a
> >> state machine:
> >>
> >> 0 = read 'Dimension'
> >> 1 = read dimension
> >> 2 = read 'Vertices'
> >> 3 = read number of vertices
> >> 4 = read next vertex
> >> 5 = read 'Triangles' or 'Tetrahedra'
> >> 6 = read number of cells
> >> 7 = read next cell
> >> 8 = done
> >>
> >> """
> >>
> >> print "Converting from Medit format (.mesh) to DOLFIN XML format"
> >>
> >> # Open files
> >> ifile = open(ifilename, "r")
> >> ofile = open(ofilename, "w")
> >>
> >> # Write header
> >> write_header(ofile)
> >>
> >> # Current state
> >> state = 0
> >>
> >> # Write data
> >> num_vertices_read = 0
> >> num_cells_read = 0
> >> while 1:
> >>
> >> # Read next line
> >> line = ifile.readline()
> >> if not line: break
> >>
> >> # Skip comments
> >> if line[0] == '#':
> >> continue
> >>
> >> # Remove newline
> >> if line[-1] == "\n":
> >> line = line[:-1]
> >>
> >> if state == 0:
> >> if line == "Dimension":
> >> state += 1
> >> elif state == 1:
> >> num_dims = int(line)
> >> state +=1
> >> elif state == 2:
> >> if line == "Vertices":
> >> state += 1
> >> elif state == 3:
> >> num_vertices = int(line)
> >> write_header_vertices(ofile, num_vertices)
> >> state +=1
> >> elif state == 4:
> >> if num_dims == 2:
> >> (x, y, tmp) = line.split()
> >> x = float(x)
> >> y = float(y)
> >> z = 0.0
> >> elif num_dims == 3:
> >> (x, y, z, tmp) = line.split()
> >> x = float(x)
> >> y = float(y)
> >> z = float(z)
> >> write_vertex(ofile, num_vertices_read, x, y, z)
> >> num_vertices_read +=1
> >> if num_vertices == num_vertices_read:
> >> write_footer_vertices(ofile)
> >> state += 1
> >> elif state == 5:
> >> if line == "Triangles" and num_dims == 2:
> >> state += 1
> >> if line == "Tetrahedra" and num_dims == 3:
> >> state += 1
> >> elif state == 6:
> >> num_cells = int(line)
> >> write_header_cells(ofile, num_cells)
> >> state +=1
> >> min_vertex = 1000000
> >> elif state == 7:
> >> if num_dims == 2:
> >> (n0, n1, n2, tmp) = line.split()
> >> n0 = int(n0) - 1
> >> n1 = int(n1) - 1
> >> n2 = int(n2) - 1
> >> write_cell_triangle(ofile, num_cells_read, n0, n1, n2)
> >> elif num_dims == 3:
> >> (n0, n1, n2, n3, tmp) = line.split()
> >> n0 = int(n0) - 1
> >> n1 = int(n1) - 1
> >> n2 = int(n2) - 1
> >> n3 = int(n3) - 1
> >> write_cell_tetrahedron(ofile, num_cells_read, n0, n1, n2,
> >> n3)
> >> num_cells_read +=1
> >> if num_cells == num_cells_read:
> >> write_footer_cells(ofile)
> >> state += 1
> >> elif state == 8:
> >> break
> >>
> >> #print line
> >>
> >> # Check that we got all data
> >> if state == 8:
> >> print "Conversion done"
> >> else:
> >> print "*** Missing data, unable to convert"
> >>
> >> # Write footer
> >> write_footer(ofile)
> >>
> >> # Close files
> >> ifile.close()
> >> ofile.close()
> >>
> >>
> >>def gmsh2xml(ifilename, ofilename):
> >> """Convert between .gmsh v1.0 format (http://www.geuz.org/gmsh/) and
> >> .xml, parser implemented as a state machine:
> >>
> >> 0 = read number of vertices
> >> 1 = read 'Vertices'
> >> 2 = read indentifer
> >> 3 = read indentifer
> >> 4 = read number of cells
> >> 5 = read cells
> >> 6 = done
> >>
> >> """
> >>
> >> print "Converting from Gmsh format (.msh, .gmsh) to DOLFIN XML format"
> >>
> >> # Open files
> >> ifile = open(ifilename, "r")
> >> ofile = open(ofilename, "w")
> >>
> >> # Write header
> >> write_header(ofile)
> >>
> >> # Initialise node list (gmsh does not export all vertexes in order)
> >> nodelist = {}
> >>
> >> # Current state
> >> state = 0
> >>
> >> # Write data
> >> num_vertices_read = 0
> >> num_cells_read = 0
> >>
> >> while 1:
> >>
> >> # Read next line
> >> line = ifile.readline()
> >> if not line: break
> >>
> >> # Skip comments
> >> if line[0] == '#':
> >> continue
> >>
> >> # Remove newline
> >> if line[-1] == "\n":
> >> line = line[:-1]
> >>
> >> if line == "$NOD":
> >> continue
> >>
> >> if state == 0:
> >> num_vertices = int(line)
> >> write_header_vertices(ofile, num_vertices)
> >> state +=1
> >> elif state == 1:
> >> (node_no, x, y, z) = line.split()
> >> nodelist[int(node_no)] = num_vertices_read
> >> x = float(x)
> >> y = float(y)
> >> z = float(z)
> >> write_vertex(ofile, num_vertices_read, x, y, z)
> >> num_vertices_read +=1
> >>
> >> if num_vertices == num_vertices_read:
> >> write_footer_vertices(ofile)
> >> state += 1
> >> elif state == 2:
> >> if line == "$ENDNOD":
> >> state += 1
> >> elif state == 3:
> >> if line == "$ELM":
> >> state += 1
> >> elif state == 4:
> >> num_cells = int(line)
> >> if num_cells == 0:
> >> print "No cells found in gmsh file."
> >> break
> >> else:
> >> write_header_cells(ofile, num_cells)
> >> state += 1
> >> elif state == 5:
> >> element = line.split()
> >> cell_type = int(element[1])
> >> if cell_type == 2:
> >> nn = [int(node) for node in element[5:8]]
> >> for node in nn:
> >> if not node in nodelist:
> >> error("Vertex %d of triangle %d not previously
> >> defined." % (node, num_cells_read))
> >> n0 = nodelist[nn[0]]
> >> n1 = nodelist[nn[1]]
> >> n2 = nodelist[nn[2]]
> >> write_cell_triangle(ofile, num_cells_read, n0, n1, n2)
> >> elif cell_type == 4:
> >> nn = [int(node) for node in element[5:9]]
> >> for node in nn:
> >> if not node in nodelist:
> >> error("Vertex %d of tetrahedron %d not previously
> >> defined." % (node, num_cells_read))
> >> n0 = nodelist[nn[0]]
> >> n1 = nodelist[nn[1]]
> >> n2 = nodelist[nn[2]]
> >> n3 = nodelist[nn[3]]
> >> write_cell_tetrahedron(ofile, num_cells_read, n0, n1, n2,
> >> n3)
> >>
> >> num_cells_read +=1
> >> if num_cells == num_cells_read:
> >> write_footer_cells(ofile)
> >> state += 1
> >> elif state == 6:
> >> break
> >>
> >> #print line
> >>
> >> # Check that we got all data
> >> if state == 6:
> >> print "Conversion done"
> >> else:
> >> print "*** Missing data, unable to convert"
> >>
> >> # Write footer
> >> write_footer(ofile)
> >>
> >> # Close files
> >> ifile.close()
> >> ofile.close()
> >>
> >># Write mesh header
> >>def write_header(ofile):
> >> ofile.write("""\
> >><?xml version=\"1.0\" encoding=\"UTF-8\"?>
> >>
> >><dolfin xmlns:dolfin=\"http://www.fenics.org/dolfin/\">
> >> <mesh>
> >>""")
> >>
> >># Write mesh footer
> >>def write_footer(ofile):
> >> ofile.write("""\
> >> </mesh>
> >></dolfin>
> >>""")
> >>
> >># Write vertices header
> >>def write_header_vertices(ofile, num_vertices):
> >> print "Expecting %d vertices" % num_vertices
> >> ofile.write(" <vertices size=\"%d\">\n" % num_vertices)
> >>
> >># Write vertices footer
> >>def write_footer_vertices(ofile):
> >> ofile.write(" </vertices>\n")
> >> print "Found all vertices"
> >>
> >># Write vertex
> >>def write_vertex(ofile, vertex, x, y, z):
> >> ofile.write(" <vertex name=\"%d\" x=\"%g\" y=\"%g\" z=\"%g\"/>\n"
> >> % \
> >> (vertex, x, y, z))
> >>
> >># Write cells header
> >>def write_header_cells(ofile, num_cells):
> >> ofile.write(" <cells size=\"%d\">\n" % num_cells)
> >> print "Expecting %d cells" % num_cells
> >>
> >># Write cells footer
> >>def write_footer_cells(ofile):
> >> ofile.write(" </cells>\n")
> >> print "Found all cells"
> >>
> >># Write cell (triangle)
> >>def write_cell_triangle(ofile, cell, n0, n1, n2):
> >> ofile.write(" <triangle name=\"%d\" n0=\"%d\" n1=\"%d\"
> >> n2=\"%d\"/>\n" % \
> >> (cell, n0, n1, n2))
> >>
> >># Write cell (tetrahedron)
> >>def write_cell_tetrahedron(ofile, cell, n0, n1, n2, n3):
> >> ofile.write(" <tetrahedron name=\"%d\" n0=\"%d\" n1=\"%d\"
> >> n2=\"%d\" n3=\"%d\"/>\n" % \
> >> (cell, n0, n1, n2, n3))
> >>
> >>if __name__ == "__main__":
> >> main(sys.argv[1:])
> >>_______________________________________________
> >>DOLFIN-dev mailing list
> >>DOLFIN-dev@xxxxxxxxxx
> >>http://www.fenics.org/cgi-bin/mailman/listinfo/dolfin-dev
> >>
> >>
> >
> >
> >_______________________________________________
> >DOLFIN-dev mailing list
> >DOLFIN-dev@xxxxxxxxxx
> >http://www.fenics.org/cgi-bin/mailman/listinfo/dolfin-dev
> >
> >
> >
>
>
References