summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGard Spreemann <gard.spreemann@epfl.ch>2019-04-30 13:12:21 +0200
committerGard Spreemann <gard.spreemann@epfl.ch>2019-04-30 13:12:21 +0200
commit5d09c6f19834eaf7eb30cb39d8ce018b78c792ab (patch)
treea927db3c0eff3e4a69ef8b58a25a58a2f58b0a98
parentdcbeb81ca393f54669098ad7cd37cfbf6beabe3f (diff)
Missing file for lappy.
-rw-r--r--petsc.py39
1 files changed, 39 insertions, 0 deletions
diff --git a/petsc.py b/petsc.py
new file mode 100644
index 0000000..7d59bf8
--- /dev/null
+++ b/petsc.py
@@ -0,0 +1,39 @@
+from scipy.sparse import coo_matrix
+import struct
+import numpy as np
+
+def load(fname):
+ MATRIX_MAGIC = 1211216
+ VECTOR_MAGIC = 1211214
+
+ with open(fname, "rb") as f:
+ magic = struct.unpack(">i", f.read(4))[0]
+
+ if magic == MATRIX_MAGIC:
+ m = struct.unpack(">i", f.read(4))[0]
+ n = struct.unpack(">i", f.read(4))[0]
+ nonzero = struct.unpack(">i", f.read(4))[0]
+ nonzero_row = struct.unpack(">%di" %(m), f.read(m*4))
+ ks = struct.unpack(">%di" %(nonzero), f.read(nonzero*4))
+ xs = np.array(struct.unpack(">%dd" %(nonzero), f.read(nonzero*8)))
+
+ ii = np.zeros(nonzero, dtype=int)
+ jj = np.zeros(nonzero, dtype=int)
+ a = 0
+ for i in range(0, m):
+ for j in range(0, nonzero_row[i]):
+ ii[a] = i
+ jj[a] = ks[a]
+ a += 1
+
+ return coo_matrix((xs, (ii, jj)), shape=(m, n))
+
+ elif magic == VECTOR_MAGIC:
+ m = struct.unpack(">i", f.read(4))[0]
+ xs = np.array(struct.unpack(">%dd" %(m), f.read(m*8)))
+ return xs
+
+ else:
+ sys.stderr.write("Incorrect PETSc magic number (read %d).\n" %(magic))
+ exit(1)
+