parse jumps now correctly uses fractional coordinates and should work for triclinic boxes. this should lead to correct behavior in all cases except for maybe changing angles in triclinic boxes. old behavior can still be used

This commit is contained in:
robrobo
2026-04-23 14:34:05 +02:00
parent d97863e356
commit 303bdbf9d2
+36 -19
View File
@@ -187,35 +187,52 @@ def nojump_save_filename(reader: BaseReader):
return full_path_fallback return full_path_fallback
def parse_jumps(trajectory: Coordinates): def parse_jumps(trajectory: Coordinates, whole: bool=True, fractional_inverted: bool=True):
prev = trajectory[0].whole if whole:
prev = trajectory[0].whole
else:
prev = trajectory[0]
box = prev.box box = prev.box
if fractional_inverted:
s_prev = prev @ np.linalg.inv(box)
SparseData = namedtuple("SparseData", ["data", "row", "col"]) SparseData = namedtuple("SparseData", ["data", "row", "col"])
jump_data = ( jump_data = (
SparseData(data=array("b"), row=array("l"), col=array("l")), SparseData(data=array("b"), row=array("l"), col=array("l")),
SparseData(data=array("b"), row=array("l"), col=array("l")), SparseData(data=array("b"), row=array("l"), col=array("l")),
SparseData(data=array("b"), row=array("l"), col=array("l")), SparseData(data=array("b"), row=array("l"), col=array("l")),
) )
for i, curr in enumerate(trajectory): for i, curr in enumerate(trajectory):
if i % 500 == 0: if i % 500 == 0:
logger.debug("Parse jumps Step: %d", i) logger.debug("Parse jumps Step: %d", i)
r3 = np.subtract(curr, prev) if not fractional_inverted:
delta_z = np.array(np.rint(np.divide(r3[:, 2], box[2][2])), dtype=np.int8) r3 = np.subtract(curr, prev)
r2 = np.subtract( delta_z = np.array(np.rint(np.divide(r3[:, 2], box[2][2])), dtype=np.int8)
r3, r2 = np.subtract(
(np.rint(np.divide(r3[:, 2], box[2][2])))[:, np.newaxis] r3,
* box[2][np.newaxis, :], (np.rint(np.divide(r3[:, 2], box[2][2])))[:, np.newaxis]
) * box[2][np.newaxis, :],
delta_y = np.array(np.rint(np.divide(r2[:, 1], box[1][1])), dtype=np.int8) )
r1 = np.subtract( delta_y = np.array(np.rint(np.divide(r2[:, 1], box[1][1])), dtype=np.int8)
r2, r1 = np.subtract(
(np.rint(np.divide(r2[:, 1], box[1][1])))[:, np.newaxis] r2,
* box[1][np.newaxis, :], (np.rint(np.divide(r2[:, 1], box[1][1])))[:, np.newaxis]
) * box[1][np.newaxis, :],
delta_x = np.array(np.rint(np.divide(r1[:, 0], box[0][0])), dtype=np.int8) )
delta = np.array([delta_x, delta_y, delta_z]).T delta_x = np.array(np.rint(np.divide(r1[:, 0], box[0][0])), dtype=np.int8)
prev = curr delta = np.array([delta_x, delta_y, delta_z]).T
box = prev.box prev = curr
box = prev.box
else:
s_curr = curr @ np.linalg.inv(curr.box)
ds = s_curr - s_prev
delta = np.array(np.rint(ds), dtype=np.int8)
s_prev = s_curr
for d in range(3): for d in range(3):
(col,) = np.where(delta[:, d] != 0) (col,) = np.where(delta[:, d] != 0)
jump_data[d].col.extend(col) jump_data[d].col.extend(col)