diff options
author | Gard Spreemann <gard.spreemann@epfl.ch> | 2019-04-30 13:12:21 +0200 |
---|---|---|
committer | Gard Spreemann <gard.spreemann@epfl.ch> | 2019-04-30 13:12:21 +0200 |
commit | 5d09c6f19834eaf7eb30cb39d8ce018b78c792ab (patch) | |
tree | a927db3c0eff3e4a69ef8b58a25a58a2f58b0a98 | |
parent | dcbeb81ca393f54669098ad7cd37cfbf6beabe3f (diff) |
Missing file for lappy.
-rw-r--r-- | petsc.py | 39 |
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) + |