hi,
I have fixed dolfin-convert (patch attached). Now the output is in the
current format for both Gmsh and Medit. I have tested dolfin-convert
with triangular Gmsh meshes but is should work fine with all the
remaining combinations as well.
Regarding the addition to the user manual, maybe we should just add that
on top of the steps described in the Gmsh mesh generation tutorial
(http://www.geuz.org/gmsh/doc/gui_tutorial/gui_tutorial.pdf) one needs
to create physical surfaces/volumes as well to generate a
dolfin-friendly mesh -- yesterday I have used Gmsh for the first time...
that's why I did that mistake. Anyway, dolfin-convert complains if the
mesh is not in the correct format.
angelo
------------------------------------------------------------------------
diff -u --new-file --recursive dolfin-0.6.4/src/utils/convert/dolfin-convert dolfin-0.6.4-mod/src/utils/convert/dolfin-convert
--- dolfin-0.6.4/src/utils/convert/dolfin-convert 2006-12-01 11:43:25.000000000 +0100
+++ dolfin-0.6.4-mod/src/utils/convert/dolfin-convert 2006-12-02 20:41:10.000000000 +0100
@@ -5,11 +5,13 @@
#
# Modified by Garth N. Wells (gmsh function)
# Modified by Alexander H. Jarosch (gmsh fix)
+# Modified by Angelo Simone (Gmsh and Medit new format fix)
#
# Script for converting between various data formats
import getopt
import sys
+import os
from commands import getoutput
def main(argv):
@@ -42,6 +44,7 @@
# Get filenames and suffixes
ifilename = args[0]
ofilename = args[1]
+ tfilename = ifilename+".tmp"
isuffix = ifilename.split(".")[-1]
osuffix = ofilename.split(".")[-1]
@@ -53,9 +56,9 @@
# Choose conversion
if input_format == "mesh" and output_format == "xml":
- mesh2xml(ifilename, ofilename)
+ mesh2xml(ifilename, ofilename, tfilename)
elif input_format == "gmsh" and output_format == "xml":
- gmsh2xml(ifilename, ofilename)
+ gmsh2xml(ifilename, ofilename, tfilename)
elif input_format == "xml-old" and output_format == "xml":
xml_old2xml(ifilename, ofilename)
else:
@@ -113,7 +116,7 @@
print "*** %s" % line
sys.exit(2)
-def mesh2xml(ifilename, ofilename):
+def mesh2xml(ifilename, ofilename, tfilename):
"""Convert between .mesh and .xml, parser implemented as a
state machine:
@@ -133,7 +136,7 @@
# Open files
ifile = open(ifilename, "r")
- ofile = open(ofilename, "w")
+ ofile = open(tfilename, "w")
# Write header
write_header(ofile)
@@ -233,7 +236,10 @@
ifile.close()
ofile.close()
-def gmsh2xml(ifilename, ofilename):
+ # Complete the conversion
+ complete_conversion(tfilename, ofilename)
+
+def gmsh2xml(ifilename, ofilename, tfilename):
"""Convert between .gmsh v2.0 format (http://www.geuz.org/gmsh/) and .xml,
parser implemented as a state machine:
@@ -255,7 +261,7 @@
# Open files
ifile = open(ifilename, "r")
- ofile = open(ofilename, "w")
+ ofile = open(tfilename, "w")
# Write header
write_header(ofile)
@@ -349,6 +355,9 @@
n2 = nodelist[nn[2]]
n3 = nodelist[nn[3]]
write_cell_tetrahedron(ofile, num_cells_read, n0, n1, n2, n3)
+ else:
+ error("Unknown element type. Did you define a physical surface/volume? \n\
+If you didn't, gmsh exports edges as cells. \nSee http://www.geuz.org/gmsh/doc/texinfo/gmsh.html")
num_cells_read +=1
if num_cells == num_cells_read:
@@ -371,6 +380,9 @@
ifile.close()
ofile.close()
+ # Complete the conversion
+ complete_conversion(tfilename, ofilename)
+
def xml_old2xml(ifilename, ofilename):
"Convert from old DOLFIN XML format to new."
@@ -428,6 +440,52 @@
ifile.close();
ofile.close();
+def complete_conversion(tfilename, ofilename):
+ " -- Replace <mesh> with <mesh celltype=CELLTYPE dim=DIM> and remove the third coordinate in 2D"
+
+ # Get dimension
+ tris = len(getoutput("grep triangle " + tfilename))
+ tets = len(getoutput("grep tetrahedron " + tfilename))
+ if tris > 0 and tets == 0:
+ dim = 2
+ celltype = "triangle"
+ elif tris == 0 and tets > 0:
+ dim = 3
+ celltype = "tetrahedron"
+ else:
+ error("Inconsistent mesh file, not exactly one type of cells.")
+
+ # Open files
+ ifile = open(tfilename, "r")
+ ofile = open(ofilename, "w")
+
+ # Read lines and make changes
+ while 1:
+
+ # Read next line
+ line = ifile.readline()
+ if not line: break
+
+ # Modify line
+ if "<mesh>" in line:
+ line = " <mesh celltype=\"%s\" dim=\"%d\">\n" % (celltype, dim)
+ if dim == 2 and " z=\"0.0\"" in line:
+ line = line.replace(" z=\"0.0\"", "")
+ if dim == 2 and " z=\"0\"" in line:
+ line = line.replace(" z=\"0\"", "")
+
+ # Write line
+ ofile.write(line)
+
+ ofile.write("\n")
+
+ # Close files
+ ifile.close();
+ ofile.close();
+
+ # Remove temporary file
+ os.remove(tfilename)
+
# Write mesh header
def write_header(ofile):
ofile.write("""\
@@ -456,7 +514,7 @@
def write_vertex(ofile, vertex, x, y, z):
"Write vertex"
- ofile.write(" <vertex name=\"%d\" x=\"%g\" y=\"%g\" z=\"%g\"/>\n" % \
+ ofile.write(" <vertex index=\"%d\" x=\"%g\" y=\"%g\" z=\"%g\"/>\n" % \
(vertex, x, y, z))
def write_header_cells(ofile, num_cells):
@@ -471,12 +529,12 @@
def write_cell_triangle(ofile, cell, n0, n1, n2):
"Write cell (triangle)"
- ofile.write(" <triangle name=\"%d\" n0=\"%d\" n1=\"%d\" n2=\"%d\"/>\n" % \
+ ofile.write(" <triangle index=\"%d\" v0=\"%d\" v1=\"%d\" v2=\"%d\"/>\n" % \
(cell, n0, n1, n2))
def write_cell_tetrahedron(ofile, cell, n0, n1, n2, n3):
"Write cell (tetrahedron)"
- ofile.write(" <tetrahedron name=\"%d\" n0=\"%d\" n1=\"%d\" n2=\"%d\" n3=\"%d\"/>\n" % \
+ ofile.write(" <tetrahedron index=\"%d\" v0=\"%d\" v1=\"%d\" v2=\"%d\" v3=\"%d\"/>\n" % \
(cell, n0, n1, n2, n3))
if __name__ == "__main__":
------------------------------------------------------------------------
_______________________________________________
DOLFIN-dev mailing list
DOLFIN-dev@xxxxxxxxxx
http://www.fenics.org/mailman/listinfo/dolfin-dev