diff --git a/gmsh/01_merge_output.py b/gmsh/01_merge_output.py
new file mode 100644
index 0000000..e85ff06
--- /dev/null
+++ b/gmsh/01_merge_output.py
@@ -0,0 +1,43 @@
+import sys
+import numpy as np
+
+indexes = {
+ 2: {
+ 'order' : 0,
+ 'ep' : 1,
+ 'final' : 6,
+ 'exact' : 7,
+ 'time' : 8,
+ },
+ 3: {
+ 'order' : 0,
+ 'ep' : 1,
+ 'final' : 7,
+ 'exact' : 8,
+ 'time' : 9,
+ },
+}
+
+
+if __name__ == '__main__':
+ files = sys.argv[1:]
+
+ prefixes = set((i[0] for i in files))
+ if len(prefixes) != 1:
+ print "must only feed either 3- or 2-D files, not mixed"
+ sys.exit(1)
+
+ dim = int(prefixes.pop())
+
+ for cur_filename in files:
+ resolution = int(cur_filename.split('.')[1])
+ lines = np.loadtxt(cur_filename)
+ for line in lines:
+ print "%d %d %d %e %e %e" % (
+ resolution,
+ line[indexes[dim]['order']],
+ line[indexes[dim]['ep' ]],
+ line[indexes[dim]['final']],
+ line[indexes[dim]['exact']],
+ line[indexes[dim]['time' ]],
+ )
diff --git a/gmsh/02_merge_to_sqlite.py b/gmsh/02_merge_to_sqlite.py
new file mode 100644
index 0000000..43ae2af
--- /dev/null
+++ b/gmsh/02_merge_to_sqlite.py
@@ -0,0 +1,26 @@
+import sys
+import numpy as np
+import sqlite3
+from optparse import OptionParser
+
+if __name__ == '__main__':
+ parser = OptionParser(usage = "usage: %s