suppose donc que vous avez un système de particules données parComment vous faites pivoter un système de particules (une matrice 2d de taille = num_particles * 3) de telle sorte que certaines entrées deviennent nulles
pos = [x1, y1, z1,
x2, y2, z2,
.
.
xn, yn , zn]
Je veux tourner la système de sorte que la première particule se déplace vers l'origine, soit x1 = 0, y1 = 0, z1 = 0, la deuxième particule se déplace vers l'axe z, c'est-à-dire nouvelles coordonnées x2 = 0, y2 = 0, z2 = nouveau z2, et enfin la troisième particule se déplace vers le plan yz, c'est-à-dire, x3 = 0, y3 = nouveau y3, z3 = nouveau z3. L'important est que la distance entre toutes les particules doit être préservée.
J'ai essayé d'utiliser Givens Rotation pour mettre à zéro les coordonnées que j'ai spécifiées ci-dessus mais cette méthode change la distance entre les particules. Je code dans Fortran 90.
Ajouté: Voici un sous-programme que j'appelle la contrainte. J'ai essayé en construisant des matrices de rotation pour faire tourner le système comme je l'ai décrit ci-dessus. Comme prévu je reçois les zéros que je veux. Mais quand je mesure les distances entre les particules après appel de la contrainte, elles ne sont pas les mêmes qu'avant de les appeler (en fait, je calcule l'énergie du système qui est invariante par translation et rotation car elle ne dépend que de la séparation des particules)
SUBROUTINE constraint(pos)
REAL(KIND=dp), DIMENSION(np,3), INTENT(INOUT) :: pos
REAL(KIND=dp) :: r1, r2
REAL(KIND=dp), DIMENSION(3,3) :: rotMatrix
!------------------
! Translating the whole system so that the first particle at the origin
IF(pos(1,1) .NE. 0.0d0) THEN
pos(:,1) = pos(:,1) - pos(1,1)
END IF
IF(pos(1,2) .NE. 0.0d0) THEN
pos(:,2) = pos(:,2) - pos(1,2)
END IF
IF(pos(1,3) .NE. 0.0d0) THEN
pos(:,3) = pos(:,3) - pos(1,3)
END IF
! First rotation: Roates the whole system so that the second particle is on
! the z-axis
IF(pos(2,1) .NE. 0.0d0 .OR. pos(2,2) .NE. 0.0d0) THEN
r1 = NORM2(pos(2,:))
r2 = NORM2(pos(2,1:2))
r2 = r2*r2
rotMatrix(1,1) = (pos(2,2)*pos(2,2) + (pos(2,1) * pos(2,1) * pos(2,3)) /r1)/r2
rotMatrix(1,2) = pos(2,1)* pos(2,2) * (-1.0d0 + pos(2,3)/r1)/r2
rotMatrix(1,3) = - pos(2,1)/r1
rotMatrix(2,1) = rotMatrix(1,2)
rotMatrix(2,2) = (pos(2,1)*pos(2,1) + (pos(2,2) * pos(2,2) * pos(2,3)) /r1)/r2
rotMatrix(2,3) = - pos(2,2)/r1
rotMatrix(3,1) = pos(2,1)/r1
rotMatrix(3,2) = pos(2,2)/r1
rotMatrix(3,3) = pos(2,3)/r1
pos = MATMUL(pos, TRANSPOSE(rotMatrix))
END IF
! Second rotation: Roates the whole system around the z-axis so that the
! third particle is on the zy-plane
! the z-axis
IF(pos(3,1) .NE. 0.0d0) THEN
r1 = NORM2(pos(3,1:2))
rotMatrix(1,1) = pos(3,2)/r1
rotMatrix(1,2) = - pos(3,1)/r1
rotMatrix(1,3) = 0.0d0
rotMatrix(2,1) = pos(3,1)/r1
rotMatrix(2,2) = - pos(3,2)/r1
rotMatrix(2,3) = 0.0d0
rotMatrix(3,1) = 0.0d0
rotMatrix(3,2) = 0.0d0
rotMatrix(3,3) = 1.0d0
pos = MATMUL(pos, TRANSPOSE(rotMatrix))
END IF
END SUBROUTINE constraint
Avez-vous du code? Avez-vous essayé quelque chose vous-même? –
oui je fais..je vais poster – Ruzayqat