← Back to team overview

dolfin team mailing list archive

Re: dolfin-convert: bug with conversion from gmsh?

 

Why are temporary files being created? Isn't updating to the new mesh xml format just a case of changing the output formatting?

Garth

angelo simone wrote:
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




Follow ups

References