3 def getParticles(setMass = True):
5 vtfPath = os.path.dirname(os.path.abspath(__file__))
6 vtfPath +=
"/data/test_EckartSystem_particles.vtf"
9 vtf = VTFSnapshotFile(vtfPath)
11 particles = vtf.readTimestep()
14 assert isinstance(particles, ParticleCollection)
17 particles.setUniformMass(1.23)
24 with pytest.raises(TypeError):
25 EckartSystem([[0.0, 0.0, 0.0]])
28 particles = getParticles(setMass =
False)
30 with pytest.raises(ValueError):
31 EckartSystem(particles)
33 particles.setUniformMass(1.23)
34 eckartSystem = EckartSystem(particles)
36 assert eckartSystem._referenceConfiguration != particles
37 particles.shiftToCenterOfMassFrame()
38 assert eckartSystem._referenceConfiguration == particles
40 particles.setPositionsAndVelocities([], [])
41 assert eckartSystem._referenceConfiguration != particles
44 def test_getParticleCount():
45 particles = getParticles()
46 eckartSystem = EckartSystem(particles)
48 assert eckartSystem.getParticleCount() == particles.getParticleCount()
49 assert eckartSystem.getParticleCount() == particles.getParticleCount()
50 assert isinstance(eckartSystem.getParticleCount(), int)
53 def test_getReferencePosition():
59 particles = getParticles()
60 eckartSystem = EckartSystem(particles)
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)
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)
78 def test_getEckartVectors():
84 def getExpected(eckartSystem, particles):
85 expected = [Vector3DReal(0, 0, 0)
for _
in range(0, 3)]
86 for p
in range(0, eckartSystem.getParticleCount()):
88 scale = particles.getMass(p)
89 scale *= eckartSystem.getReferencePosition(p)[i]
90 expected[i] += particles.getPosition(p) * scale
94 particles = getParticles()
95 eckartSystem = EckartSystem(particles)
97 with pytest.raises(TypeError):
98 eckartSystem.getEckartVectors([[0.0, 0.0, 0.0]])
100 particles.setUniformMass(0.67)
101 with pytest.raises(ValueError):
102 eckartSystem.getEckartVectors(particles)
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)
111 particles = getParticles()
113 assert eckartSystem.getEckartVectors(particles) \
114 == getExpected(eckartSystem, particles)
115 assert eckartSystem.getEckartVectors(particles) \
116 == getExpected(eckartSystem, particles)
118 particles.shiftToCenterOfMassFrame()
119 assert eckartSystem.getEckartVectors(particles) \
120 == getExpected(eckartSystem, particles)
121 assert eckartSystem.getEckartVectors(particles) \
122 == getExpected(eckartSystem, particles)
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)
134 assert eckartSystem.getEckartVectors(particles) \
135 == getExpected(eckartSystem, particles)
136 assert eckartSystem.getEckartVectors(particles) \
137 == getExpected(eckartSystem, particles)
139 particles.shiftToCenterOfMassFrame()
140 assert eckartSystem.getEckartVectors(particles) \
141 == getExpected(eckartSystem, particles)
142 assert eckartSystem.getEckartVectors(particles) \
143 == getExpected(eckartSystem, particles)
146 eckartVectors = eckartSystem.getEckartVectors(particles)
147 assert isinstance(eckartVectors, list)
148 for v
in eckartVectors:
149 assert isinstance(v, Vector3DReal)
152 def test_getEckartVectors_invariant_under_center_of_mass_translation():
153 particles = getParticles()
154 eckartSystem = EckartSystem(particles)
155 eckartVectors = eckartSystem.getEckartVectors(particles)
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])
166 particles.shiftToCenterOfMassFrame()
171 for _
in range(0, 5):
172 r = [random.uniform(-5.0, 2.5)
for _2
in range(0, 3)]
173 offset = Vector3DReal(*r)
175 for i
in range(0, particles.getParticleCount()):
176 positions.append(particles.getPosition(i) + offset)
177 particles.setPositionsAndVelocities(positions, positions)
181 def test_getGramMatrix():
187 def getExpected(eckartSystem, particles):
188 eckartVectors = eckartSystem.getEckartVectors(particles)
191 for i
in range(0, 3):
193 for j
in range(0, 3):
194 row.append(eckartVectors[i].dot(eckartVectors[j]))
200 particles = getParticles()
201 eckartSystem = EckartSystem(particles)
203 with pytest.raises(TypeError):
204 eckartSystem.getGramMatrix([[0.0, 0.0, 0.0]])
206 particles.setUniformMass(0.67)
207 with pytest.raises(ValueError):
208 eckartSystem.getGramMatrix(particles)
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)
217 particles = getParticles()
219 assert eckartSystem.getGramMatrix(particles) \
220 == getExpected(eckartSystem, particles)
221 assert eckartSystem.getGramMatrix(particles) \
222 == getExpected(eckartSystem, particles)
224 particles.shiftToCenterOfMassFrame()
225 assert eckartSystem.getGramMatrix(particles) \
226 == getExpected(eckartSystem, particles)
227 assert eckartSystem.getGramMatrix(particles) \
228 == getExpected(eckartSystem, particles)
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)
240 assert eckartSystem.getGramMatrix(particles) \
241 == getExpected(eckartSystem, particles)
242 assert eckartSystem.getGramMatrix(particles) \
243 == getExpected(eckartSystem, particles)
245 particles.shiftToCenterOfMassFrame()
246 assert eckartSystem.getGramMatrix(particles) \
247 == getExpected(eckartSystem, particles)
248 assert eckartSystem.getGramMatrix(particles) \
249 == getExpected(eckartSystem, particles)
252 gramMatrix = eckartSystem.getGramMatrix(particles)
253 assert isinstance(gramMatrix, list)
255 assert isinstance(v, list)
257 assert isinstance(x, float)
260 def test_getEckartFrame():
266 def check(eckartSystem, particles):
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)
276 for _
in range(0, 3):
277 result = eckartSystem.getEckartFrame(particles)
278 assert isinstance(result, list)
279 assert len(result) == 3
281 assert isinstance(v, Vector3DReal)
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])
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)
295 particles = getParticles()
296 eckartSystem = EckartSystem(particles)
298 with pytest.raises(TypeError):
299 eckartSystem.getEckartFrame([[0.0, 0.0, 0.0]])
301 particles.setUniformMass(0.67)
302 with pytest.raises(ValueError):
303 eckartSystem.getEckartFrame(particles)
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)
312 particles = getParticles()
313 check(eckartSystem, particles)
315 particles.shiftToCenterOfMassFrame()
316 check(eckartSystem, particles)
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)
328 check(eckartSystem, particles)
330 particles.shiftToCenterOfMassFrame()
331 check(eckartSystem, particles)
334 def test_getEckartFrameEquilibriumPositions():
340 def check(eckartSystem, particles):
341 ef = eckartSystem.getEckartFrame(particles)
343 for _
in range(0, 3):
345 eckartSystem.getEckartFrameEquilibriumPositions(particles)
347 assert isinstance(result, list)
348 assert len(result) == eckartSystem.getParticleCount()
350 for i
in range(0, eckartSystem.getParticleCount()):
351 assert isinstance(result[i], Vector3DReal)
353 expected = Vector3DReal(0, 0, 0)
355 for j
in range(0, 3):
356 expected += ef[j] * eckartSystem.getReferencePosition(i)[j]
358 assert result[i].isClose(expected)
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)
371 particles = getParticles()
372 eckartSystem = EckartSystem(particles)
374 with pytest.raises(TypeError):
375 eckartSystem.getEckartFrameEquilibriumPositions([[0.0, 0.0, 0.0]])
377 particles.setUniformMass(0.67)
378 with pytest.raises(ValueError):
379 eckartSystem.getEckartFrameEquilibriumPositions(particles)
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)
388 particles = getParticles()
389 check(eckartSystem, particles)
391 particles.shiftToCenterOfMassFrame()
392 check(eckartSystem, particles)
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)
404 check(eckartSystem, particles)
406 particles.shiftToCenterOfMassFrame()
407 check(eckartSystem, particles)
410 def test_getEckartMomentOfInertiaTensor():
418 def check(eckartSystem, particles):
419 ef = eckartSystem.getEckartFrame(particles)
421 for _
in range(0, 3):
423 eckartSystem.getEckartMomentOfInertiaTensor(particles)
425 assert isinstance(result, numpy.ndarray)
426 assert result.shape == (3, 3)
428 comParticles = copy.deepcopy(particles)
429 comParticles.shiftToCenterOfMassFrame()
431 equilibriumPositions = \
432 eckartSystem.getEckartFrameEquilibriumPositions(particles)
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)
440 for j
in range(0, 3):
441 expected[j][j] += tmp1 * m
443 for j
in range(0, 3):
444 for k
in range(0, 3):
445 expected[j][k] -= m * r[j] * c[k]
447 assert numpy.allclose(result, expected)
450 particles = getParticles()
451 eckartSystem = EckartSystem(particles)
453 with pytest.raises(TypeError):
454 eckartSystem.getEckartMomentOfInertiaTensor([[0.0, 0.0, 0.0]])
456 particles.setUniformMass(0.67)
457 with pytest.raises(ValueError):
458 eckartSystem.getEckartMomentOfInertiaTensor(particles)
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)
467 particles = getParticles()
468 check(eckartSystem, particles)
470 particles.shiftToCenterOfMassFrame()
471 check(eckartSystem, particles)
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)
483 check(eckartSystem, particles)
485 particles.shiftToCenterOfMassFrame()
486 check(eckartSystem, particles)
489 def test_getEckartAngularVelocityVector():
497 def check(eckartSystem, particles):
500 momentOfInertia = eckartSystem.getEckartMomentOfInertiaTensor(particles)
501 invertedMomentOfInertia = scipy.linalg.inv(momentOfInertia)
503 closeToUnity = numpy.dot(momentOfInertia, invertedMomentOfInertia)
504 assert numpy.allclose(closeToUnity, numpy.identity(3))
506 for _
in range(0, 3):
508 eckartSystem.getEckartAngularVelocityVector(particles)
510 assert isinstance(result, Vector3DReal)
512 comParticles = copy.deepcopy(particles)
513 comParticles.shiftToCenterOfMassFrame()
515 equilibriumPositions = \
516 eckartSystem.getEckartFrameEquilibriumPositions(particles)
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
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)
531 particles = getParticles()
532 eckartSystem = EckartSystem(particles)
534 with pytest.raises(TypeError):
535 eckartSystem.getEckartAngularVelocityVector([[0.0, 0.0, 0.0]])
537 particles.setUniformMass(0.67)
538 with pytest.raises(ValueError):
539 eckartSystem.getEckartAngularVelocityVector(particles)
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)
548 particles = getParticles()
549 check(eckartSystem, particles)
551 particles.shiftToCenterOfMassFrame()
552 check(eckartSystem, particles)
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)
564 check(eckartSystem, particles)
566 particles.shiftToCenterOfMassFrame()
567 check(eckartSystem, particles)
570 def test__getGramMatrixInverseSquareRoot():
575 def check(eckartSystem, particles):
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))
584 particles = getParticles()
585 eckartSystem = EckartSystem(particles)
587 with pytest.raises(TypeError):
588 eckartSystem.getGramMatrix([[0.0, 0.0, 0.0]])
590 particles.setUniformMass(0.67)
591 with pytest.raises(ValueError):
592 eckartSystem.getGramMatrix(particles)
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)
601 particles = getParticles()
603 check(eckartSystem, particles)
605 particles.shiftToCenterOfMassFrame()
606 check(eckartSystem, particles)
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)
618 check(eckartSystem, particles)
620 particles.shiftToCenterOfMassFrame()
621 check(eckartSystem, particles)
625 matrix = eckartSystem._getGramMatrixInverseSquareRoot(particles)
626 assert isinstance(matrix, numpy.ndarray)
627 assert matrix.shape == (3, 3)