OpenMPCD
test_EckartSystem.py
1 from MPCDAnalysis.EckartSystem import EckartSystem
2 
3 def getParticles(setMass = True):
4  import os.path
5  vtfPath = os.path.dirname(os.path.abspath(__file__))
6  vtfPath += "/data/test_EckartSystem_particles.vtf"
7 
8  from MPCDAnalysis.VTFSnapshotFile import VTFSnapshotFile
9  vtf = VTFSnapshotFile(vtfPath)
10 
11  particles = vtf.readTimestep()
12 
13  from MPCDAnalysis.ParticleCollection import ParticleCollection
14  assert isinstance(particles, ParticleCollection)
15 
16  if setMass:
17  particles.setUniformMass(1.23)
18  return particles
19 
20 
21 def test___init__():
22  import pytest
23 
24  with pytest.raises(TypeError):
25  EckartSystem([[0.0, 0.0, 0.0]])
26 
27 
28  particles = getParticles(setMass = False)
29 
30  with pytest.raises(ValueError):
31  EckartSystem(particles)
32 
33  particles.setUniformMass(1.23)
34  eckartSystem = EckartSystem(particles)
35 
36  assert eckartSystem._referenceConfiguration != particles
37  particles.shiftToCenterOfMassFrame()
38  assert eckartSystem._referenceConfiguration == particles
39 
40  particles.setPositionsAndVelocities([], [])
41  assert eckartSystem._referenceConfiguration != particles
42 
43 
44 def test_getParticleCount():
45  particles = getParticles()
46  eckartSystem = EckartSystem(particles)
47 
48  assert eckartSystem.getParticleCount() == particles.getParticleCount()
49  assert eckartSystem.getParticleCount() == particles.getParticleCount()
50  assert isinstance(eckartSystem.getParticleCount(), int)
51 
52 
53 def test_getReferencePosition():
54  from MPCDAnalysis.Vector3DReal import Vector3DReal
55 
56  import pytest
57 
58 
59  particles = getParticles()
60  eckartSystem = EckartSystem(particles)
61 
62  with pytest.raises(TypeError):
63  eckartSystem.getReferencePosition(0.0)
64  with pytest.raises(KeyError):
65  eckartSystem.getReferencePosition(-1)
66  with pytest.raises(KeyError):
67  eckartSystem.getReferencePosition(eckartSystem.getParticleCount())
68  with pytest.raises(KeyError):
69  eckartSystem.getReferencePosition(eckartSystem.getParticleCount() + 1)
70 
71  particles.shiftToCenterOfMassFrame()
72  for i in range(0, eckartSystem.getParticleCount()):
73  assert eckartSystem.getReferencePosition(i) == particles.getPosition(i)
74  assert eckartSystem.getReferencePosition(i) == particles.getPosition(i)
75  assert isinstance(eckartSystem.getReferencePosition(i), Vector3DReal)
76 
77 
78 def test_getEckartVectors():
79  from MPCDAnalysis.Vector3DReal import Vector3DReal
80 
81  import pytest
82 
83 
84  def getExpected(eckartSystem, particles):
85  expected = [Vector3DReal(0, 0, 0) for _ in range(0, 3)]
86  for p in range(0, eckartSystem.getParticleCount()):
87  for i in range(0, 3):
88  scale = particles.getMass(p)
89  scale *= eckartSystem.getReferencePosition(p)[i]
90  expected[i] += particles.getPosition(p) * scale
91  return expected
92 
93 
94  particles = getParticles()
95  eckartSystem = EckartSystem(particles)
96 
97  with pytest.raises(TypeError):
98  eckartSystem.getEckartVectors([[0.0, 0.0, 0.0]])
99 
100  particles.setUniformMass(0.67)
101  with pytest.raises(ValueError):
102  eckartSystem.getEckartVectors(particles)
103 
104  particles = getParticles()
105  positions = particles.getPositions()
106  velocities = particles.getVelocities()
107  particles.setPositionsAndVelocities(positions[:3], velocities[:3])
108  with pytest.raises(ValueError):
109  eckartSystem.getEckartVectors(particles)
110 
111  particles = getParticles()
112 
113  assert eckartSystem.getEckartVectors(particles) \
114  == getExpected(eckartSystem, particles)
115  assert eckartSystem.getEckartVectors(particles) \
116  == getExpected(eckartSystem, particles)
117 
118  particles.shiftToCenterOfMassFrame()
119  assert eckartSystem.getEckartVectors(particles) \
120  == getExpected(eckartSystem, particles)
121  assert eckartSystem.getEckartVectors(particles) \
122  == getExpected(eckartSystem, particles)
123 
124 
125  import random
126  positions = []
127  velocities = []
128  for _ in range(0, eckartSystem.getParticleCount()):
129  r = [random.uniform(-3.0, 5.0) for _2 in range(0, 6)]
130  positions.append(Vector3DReal(r[0], r[1], r[2]))
131  velocities.append(Vector3DReal(r[3], r[4], r[5]))
132  particles.setPositionsAndVelocities(positions, velocities)
133 
134  assert eckartSystem.getEckartVectors(particles) \
135  == getExpected(eckartSystem, particles)
136  assert eckartSystem.getEckartVectors(particles) \
137  == getExpected(eckartSystem, particles)
138 
139  particles.shiftToCenterOfMassFrame()
140  assert eckartSystem.getEckartVectors(particles) \
141  == getExpected(eckartSystem, particles)
142  assert eckartSystem.getEckartVectors(particles) \
143  == getExpected(eckartSystem, particles)
144 
145 
146  eckartVectors = eckartSystem.getEckartVectors(particles)
147  assert isinstance(eckartVectors, list)
148  for v in eckartVectors:
149  assert isinstance(v, Vector3DReal)
150 
151 
152 def test_getEckartVectors_invariant_under_center_of_mass_translation():
153  particles = getParticles()
154  eckartSystem = EckartSystem(particles)
155  eckartVectors = eckartSystem.getEckartVectors(particles)
156 
157  def check(particles):
158  for _ in range(0, 2):
159  ev = eckartSystem.getEckartVectors(particles)
160  for i in range(0, 3):
161  assert ev[i].isClose(eckartVectors[i])
162 
163 
164  check(particles)
165 
166  particles.shiftToCenterOfMassFrame()
167  check(particles)
168 
169  from MPCDAnalysis.Vector3DReal import Vector3DReal
170  import random
171  for _ in range(0, 5):
172  r = [random.uniform(-5.0, 2.5) for _2 in range(0, 3)]
173  offset = Vector3DReal(*r)
174  positions = []
175  for i in range(0, particles.getParticleCount()):
176  positions.append(particles.getPosition(i) + offset)
177  particles.setPositionsAndVelocities(positions, positions)
178  check(particles)
179 
180 
181 def test_getGramMatrix():
182  from MPCDAnalysis.Vector3DReal import Vector3DReal
183 
184  import pytest
185 
186 
187  def getExpected(eckartSystem, particles):
188  eckartVectors = eckartSystem.getEckartVectors(particles)
189  expected = []
190 
191  for i in range(0, 3):
192  row = []
193  for j in range(0, 3):
194  row.append(eckartVectors[i].dot(eckartVectors[j]))
195  expected.append(row)
196 
197  return expected
198 
199 
200  particles = getParticles()
201  eckartSystem = EckartSystem(particles)
202 
203  with pytest.raises(TypeError):
204  eckartSystem.getGramMatrix([[0.0, 0.0, 0.0]])
205 
206  particles.setUniformMass(0.67)
207  with pytest.raises(ValueError):
208  eckartSystem.getGramMatrix(particles)
209 
210  particles = getParticles()
211  positions = particles.getPositions()
212  velocities = particles.getVelocities()
213  particles.setPositionsAndVelocities(positions[:3], velocities[:3])
214  with pytest.raises(ValueError):
215  eckartSystem.getGramMatrix(particles)
216 
217  particles = getParticles()
218 
219  assert eckartSystem.getGramMatrix(particles) \
220  == getExpected(eckartSystem, particles)
221  assert eckartSystem.getGramMatrix(particles) \
222  == getExpected(eckartSystem, particles)
223 
224  particles.shiftToCenterOfMassFrame()
225  assert eckartSystem.getGramMatrix(particles) \
226  == getExpected(eckartSystem, particles)
227  assert eckartSystem.getGramMatrix(particles) \
228  == getExpected(eckartSystem, particles)
229 
230 
231  import random
232  positions = []
233  velocities = []
234  for _ in range(0, eckartSystem.getParticleCount()):
235  r = [random.uniform(-3.0, 5.0) for _2 in range(0, 6)]
236  positions.append(Vector3DReal(r[0], r[1], r[2]))
237  velocities.append(Vector3DReal(r[3], r[4], r[5]))
238  particles.setPositionsAndVelocities(positions, velocities)
239 
240  assert eckartSystem.getGramMatrix(particles) \
241  == getExpected(eckartSystem, particles)
242  assert eckartSystem.getGramMatrix(particles) \
243  == getExpected(eckartSystem, particles)
244 
245  particles.shiftToCenterOfMassFrame()
246  assert eckartSystem.getGramMatrix(particles) \
247  == getExpected(eckartSystem, particles)
248  assert eckartSystem.getGramMatrix(particles) \
249  == getExpected(eckartSystem, particles)
250 
251 
252  gramMatrix = eckartSystem.getGramMatrix(particles)
253  assert isinstance(gramMatrix, list)
254  for v in gramMatrix:
255  assert isinstance(v, list)
256  for x in v:
257  assert isinstance(x, float)
258 
259 
260 def test_getEckartFrame():
261  from MPCDAnalysis.Vector3DReal import Vector3DReal
262 
263  import pytest
264 
265 
266  def check(eckartSystem, particles):
267  import numpy
268 
269  ev = eckartSystem.getEckartVectors(particles)
270  ev_plain = [[v.getX(), v.getY(), v.getZ()] for v in ev]
271  left = numpy.column_stack(ev_plain)
272  right = eckartSystem._getGramMatrixInverseSquareRoot(particles)
273  expected = numpy.dot(left, right)
274  assert expected.shape == (3, 3)
275 
276  for _ in range(0, 3):
277  result = eckartSystem.getEckartFrame(particles)
278  assert isinstance(result, list)
279  assert len(result) == 3
280  for v in result:
281  assert isinstance(v, Vector3DReal)
282 
283  for i in range(0, 3):
284  assert result[i].getX() == pytest.approx(expected[0][i])
285  assert result[i].getY() == pytest.approx(expected[1][i])
286  assert result[i].getZ() == pytest.approx(expected[2][i])
287 
288 
289  nullVector = Vector3DReal(0, 0, 0)
290  sumOfCrosses = nullVector
291  for i in range(0, 3):
292  sumOfCrosses += result[i].cross(ev[i])
293  assert sumOfCrosses.isClose(nullVector)
294 
295  particles = getParticles()
296  eckartSystem = EckartSystem(particles)
297 
298  with pytest.raises(TypeError):
299  eckartSystem.getEckartFrame([[0.0, 0.0, 0.0]])
300 
301  particles.setUniformMass(0.67)
302  with pytest.raises(ValueError):
303  eckartSystem.getEckartFrame(particles)
304 
305  particles = getParticles()
306  positions = particles.getPositions()
307  velocities = particles.getVelocities()
308  particles.setPositionsAndVelocities(positions[:3], velocities[:3])
309  with pytest.raises(ValueError):
310  eckartSystem.getEckartFrame(particles)
311 
312  particles = getParticles()
313  check(eckartSystem, particles)
314 
315  particles.shiftToCenterOfMassFrame()
316  check(eckartSystem, particles)
317 
318 
319  import random
320  positions = []
321  velocities = []
322  for _ in range(0, eckartSystem.getParticleCount()):
323  r = [random.uniform(-3.0, 5.0) for _2 in range(0, 6)]
324  positions.append(Vector3DReal(r[0], r[1], r[2]))
325  velocities.append(Vector3DReal(r[3], r[4], r[5]))
326  particles.setPositionsAndVelocities(positions, velocities)
327 
328  check(eckartSystem, particles)
329 
330  particles.shiftToCenterOfMassFrame()
331  check(eckartSystem, particles)
332 
333 
334 def test_getEckartFrameEquilibriumPositions():
335  from MPCDAnalysis.Vector3DReal import Vector3DReal
336 
337  import pytest
338 
339 
340  def check(eckartSystem, particles):
341  ef = eckartSystem.getEckartFrame(particles)
342 
343  for _ in range(0, 3):
344  result = \
345  eckartSystem.getEckartFrameEquilibriumPositions(particles)
346 
347  assert isinstance(result, list)
348  assert len(result) == eckartSystem.getParticleCount()
349 
350  for i in range(0, eckartSystem.getParticleCount()):
351  assert isinstance(result[i], Vector3DReal)
352 
353  expected = Vector3DReal(0, 0, 0)
354 
355  for j in range(0, 3):
356  expected += ef[j] * eckartSystem.getReferencePosition(i)[j]
357 
358  assert result[i].isClose(expected)
359 
360 
361  nullVector = Vector3DReal(0, 0, 0)
362  eckartCondition = nullVector
363  centerOfMass = particles.getCenterOfMass()
364  for i in range(0, eckartSystem.getParticleCount()):
365  tmp1 = particles.getPosition(i) - centerOfMass
366  tmp2 = result[i].cross(tmp1)
367  eckartCondition += tmp2 * particles.getMass(i)
368  assert eckartCondition.isClose(nullVector)
369 
370 
371  particles = getParticles()
372  eckartSystem = EckartSystem(particles)
373 
374  with pytest.raises(TypeError):
375  eckartSystem.getEckartFrameEquilibriumPositions([[0.0, 0.0, 0.0]])
376 
377  particles.setUniformMass(0.67)
378  with pytest.raises(ValueError):
379  eckartSystem.getEckartFrameEquilibriumPositions(particles)
380 
381  particles = getParticles()
382  positions = particles.getPositions()
383  velocities = particles.getVelocities()
384  particles.setPositionsAndVelocities(positions[:3], velocities[:3])
385  with pytest.raises(ValueError):
386  eckartSystem.getEckartFrameEquilibriumPositions(particles)
387 
388  particles = getParticles()
389  check(eckartSystem, particles)
390 
391  particles.shiftToCenterOfMassFrame()
392  check(eckartSystem, particles)
393 
394 
395  import random
396  positions = []
397  velocities = []
398  for _ in range(0, eckartSystem.getParticleCount()):
399  r = [random.uniform(-3.0, 5.0) for _2 in range(0, 6)]
400  positions.append(Vector3DReal(r[0], r[1], r[2]))
401  velocities.append(Vector3DReal(r[3], r[4], r[5]))
402  particles.setPositionsAndVelocities(positions, velocities)
403 
404  check(eckartSystem, particles)
405 
406  particles.shiftToCenterOfMassFrame()
407  check(eckartSystem, particles)
408 
409 
410 def test_getEckartMomentOfInertiaTensor():
411  from MPCDAnalysis.Vector3DReal import Vector3DReal
412 
413  import copy
414  import numpy
415  import pytest
416 
417 
418  def check(eckartSystem, particles):
419  ef = eckartSystem.getEckartFrame(particles)
420 
421  for _ in range(0, 3):
422  result = \
423  eckartSystem.getEckartMomentOfInertiaTensor(particles)
424 
425  assert isinstance(result, numpy.ndarray)
426  assert result.shape == (3, 3)
427 
428  comParticles = copy.deepcopy(particles)
429  comParticles.shiftToCenterOfMassFrame()
430 
431  equilibriumPositions = \
432  eckartSystem.getEckartFrameEquilibriumPositions(particles)
433 
434  expected = numpy.zeros((3, 3))
435  for i in range(0, eckartSystem.getParticleCount()):
436  m = comParticles.getMass(i)
437  c = equilibriumPositions[i]
438  r = comParticles.getPosition(i)
439  tmp1 = r.dot(c)
440  for j in range(0, 3):
441  expected[j][j] += tmp1 * m
442 
443  for j in range(0, 3):
444  for k in range(0, 3):
445  expected[j][k] -= m * r[j] * c[k]
446 
447  assert numpy.allclose(result, expected)
448 
449 
450  particles = getParticles()
451  eckartSystem = EckartSystem(particles)
452 
453  with pytest.raises(TypeError):
454  eckartSystem.getEckartMomentOfInertiaTensor([[0.0, 0.0, 0.0]])
455 
456  particles.setUniformMass(0.67)
457  with pytest.raises(ValueError):
458  eckartSystem.getEckartMomentOfInertiaTensor(particles)
459 
460  particles = getParticles()
461  positions = particles.getPositions()
462  velocities = particles.getVelocities()
463  particles.setPositionsAndVelocities(positions[:3], velocities[:3])
464  with pytest.raises(ValueError):
465  eckartSystem.getEckartMomentOfInertiaTensor(particles)
466 
467  particles = getParticles()
468  check(eckartSystem, particles)
469 
470  particles.shiftToCenterOfMassFrame()
471  check(eckartSystem, particles)
472 
473 
474  import random
475  positions = []
476  velocities = []
477  for _ in range(0, eckartSystem.getParticleCount()):
478  r = [random.uniform(-3.0, 5.0) for _2 in range(0, 6)]
479  positions.append(Vector3DReal(r[0], r[1], r[2]))
480  velocities.append(Vector3DReal(r[3], r[4], r[5]))
481  particles.setPositionsAndVelocities(positions, velocities)
482 
483  check(eckartSystem, particles)
484 
485  particles.shiftToCenterOfMassFrame()
486  check(eckartSystem, particles)
487 
488 
489 def test_getEckartAngularVelocityVector():
490  from MPCDAnalysis.Vector3DReal import Vector3DReal
491 
492  import copy
493  import numpy
494  import pytest
495 
496 
497  def check(eckartSystem, particles):
498  import scipy.linalg
499 
500  momentOfInertia = eckartSystem.getEckartMomentOfInertiaTensor(particles)
501  invertedMomentOfInertia = scipy.linalg.inv(momentOfInertia)
502 
503  closeToUnity = numpy.dot(momentOfInertia, invertedMomentOfInertia)
504  assert numpy.allclose(closeToUnity, numpy.identity(3))
505 
506  for _ in range(0, 3):
507  result = \
508  eckartSystem.getEckartAngularVelocityVector(particles)
509 
510  assert isinstance(result, Vector3DReal)
511 
512  comParticles = copy.deepcopy(particles)
513  comParticles.shiftToCenterOfMassFrame()
514 
515  equilibriumPositions = \
516  eckartSystem.getEckartFrameEquilibriumPositions(particles)
517 
518  tmp = Vector3DReal(0, 0, 0)
519  for i in range(0, eckartSystem.getParticleCount()):
520  m = comParticles.getMass(i)
521  c = equilibriumPositions[i]
522  v = comParticles.getVelocity(i)
523  tmp += c.cross(v) * m
524 
525  numpyVector = [tmp.getX(), tmp.getY(), tmp.getZ()]
526  npExpected = numpy.dot(invertedMomentOfInertia, numpyVector)
527  expected = Vector3DReal(npExpected[0], npExpected[1], npExpected[2])
528  assert result.isClose(expected)
529 
530 
531  particles = getParticles()
532  eckartSystem = EckartSystem(particles)
533 
534  with pytest.raises(TypeError):
535  eckartSystem.getEckartAngularVelocityVector([[0.0, 0.0, 0.0]])
536 
537  particles.setUniformMass(0.67)
538  with pytest.raises(ValueError):
539  eckartSystem.getEckartAngularVelocityVector(particles)
540 
541  particles = getParticles()
542  positions = particles.getPositions()
543  velocities = particles.getVelocities()
544  particles.setPositionsAndVelocities(positions[:3], velocities[:3])
545  with pytest.raises(ValueError):
546  eckartSystem.getEckartAngularVelocityVector(particles)
547 
548  particles = getParticles()
549  check(eckartSystem, particles)
550 
551  particles.shiftToCenterOfMassFrame()
552  check(eckartSystem, particles)
553 
554 
555  import random
556  positions = []
557  velocities = []
558  for _ in range(0, eckartSystem.getParticleCount()):
559  r = [random.uniform(-3.0, 5.0) for _2 in range(0, 6)]
560  positions.append(Vector3DReal(r[0], r[1], r[2]))
561  velocities.append(Vector3DReal(r[3], r[4], r[5]))
562  particles.setPositionsAndVelocities(positions, velocities)
563 
564  check(eckartSystem, particles)
565 
566  particles.shiftToCenterOfMassFrame()
567  check(eckartSystem, particles)
568 
569 
570 def test__getGramMatrixInverseSquareRoot():
571  from MPCDAnalysis.Vector3DReal import Vector3DReal
572 
573  import pytest
574 
575  def check(eckartSystem, particles):
576  import numpy
577  for _ in range(0, 3):
578  gramMatrix = eckartSystem.getGramMatrix(particles)
579  result = eckartSystem._getGramMatrixInverseSquareRoot(particles)
580  inverse = numpy.dot(result, result)
581  unity = numpy.dot(inverse, gramMatrix)
582  assert numpy.allclose(unity, numpy.identity(3))
583 
584  particles = getParticles()
585  eckartSystem = EckartSystem(particles)
586 
587  with pytest.raises(TypeError):
588  eckartSystem.getGramMatrix([[0.0, 0.0, 0.0]])
589 
590  particles.setUniformMass(0.67)
591  with pytest.raises(ValueError):
592  eckartSystem.getGramMatrix(particles)
593 
594  particles = getParticles()
595  positions = particles.getPositions()
596  velocities = particles.getVelocities()
597  particles.setPositionsAndVelocities(positions[:3], velocities[:3])
598  with pytest.raises(ValueError):
599  eckartSystem.getGramMatrix(particles)
600 
601  particles = getParticles()
602 
603  check(eckartSystem, particles)
604 
605  particles.shiftToCenterOfMassFrame()
606  check(eckartSystem, particles)
607 
608 
609  import random
610  positions = []
611  velocities = []
612  for _ in range(0, eckartSystem.getParticleCount()):
613  r = [random.uniform(-3.0, 5.0) for _2 in range(0, 6)]
614  positions.append(Vector3DReal(r[0], r[1], r[2]))
615  velocities.append(Vector3DReal(r[3], r[4], r[5]))
616  particles.setPositionsAndVelocities(positions, velocities)
617 
618  check(eckartSystem, particles)
619 
620  particles.shiftToCenterOfMassFrame()
621  check(eckartSystem, particles)
622 
623 
624  import numpy
625  matrix = eckartSystem._getGramMatrixInverseSquareRoot(particles)
626  assert isinstance(matrix, numpy.ndarray)
627  assert matrix.shape == (3, 3)
MPCDAnalysis.EckartSystem
Definition: EckartSystem.py:1
MPCDAnalysis.ParticleCollection
Definition: ParticleCollection.py:1
MPCDAnalysis.VTFSnapshotFile
Definition: VTFSnapshotFile.py:1
MPCDAnalysis.Vector3DReal
Definition: Vector3DReal.py:1