Skip to content

Commit 0325f26

Browse files
authored
Merge pull request #1343 from glotzerlab/fix_msd_nanobind
Fix msd
2 parents 3f0dc2d + 1d98632 commit 0325f26

File tree

3 files changed

+26
-1
lines changed

3 files changed

+26
-1
lines changed

ChangeLog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ The format is based on [Keep a Changelog] and this project adheres to
1212

1313
### Fixed
1414
* Type hinting in `UnitCell` no longer infers incorrect type.
15+
* Fixed `MSD` compute to correctly preprocess the data for msd calculation.
1516

1617
## 3.3.1 -- 2025-04-28
1718

freud/msd.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,7 +205,11 @@ def compute(self, positions, images=None, reset=True):
205205
# Make sure we aren't modifying the provided array
206206
if self._box is not None and images is not None:
207207
unwrapped_positions = positions.copy()
208-
positions = self._box.wrap(unwrapped_positions, images)
208+
for i in range(positions.shape[0]):
209+
unwrapped_positions[i, :, :] = self._box.unwrap(
210+
unwrapped_positions[i, :, :], images[i, :, :]
211+
)
212+
positions = unwrapped_positions
209213

210214
if self.mode == "window":
211215
# First compute the first term r^2(k+m) - r^2(k)

tests/test_msd_msd.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,26 @@ def simple_msd(positions):
8181
npt.assert_allclose(solution, simple, atol=1e-6)
8282
npt.assert_allclose(solution_particle, simple_particle, atol=1e-5)
8383

84+
def test_MSD_compute(self):
85+
n_frames = 5
86+
n_particles = 10
87+
88+
positions = np.zeros((n_frames, n_particles, 3), dtype=np.float32)
89+
for t in range(n_frames):
90+
# at frame t, x = t, y = z = 0
91+
positions[t, :, 0] = t
92+
93+
images = np.zeros((n_frames, n_particles, 3), dtype=np.int32)
94+
box = freud.box.Box.cube(30)
95+
96+
msd = freud.msd.MSD(box=box, mode="window")
97+
msd.compute(positions=positions, images=images, reset=False)
98+
99+
expected_msd = np.arange(n_frames) ** 2
100+
expected_particle = np.tile(expected_msd, (n_particles, 1)).T
101+
assert np.allclose(msd.msd, expected_msd)
102+
assert np.allclose(msd.particle_msd, expected_particle)
103+
84104
def test_repr(self):
85105
msd = freud.msd.MSD()
86106
assert str(msd) == str(eval(repr(msd)))

0 commit comments

Comments
 (0)