Statistiques
| Révision :

root / src / Std_ori.f90 @ 4

Historique | Voir | Annoter | Télécharger (3,26 ko)

1 1 equemene
subroutine Std_ori(natom,rx,ry,rz,a,b,c,rmass)
2 1 equemene
  !c
3 1 equemene
  !c      rotational constants for all replicas by inline diagonalization
4 1 equemene
  !c      of inertial tensor
5 1 equemene
  !c
6 1 equemene
!!!!!!! Input
7 1 equemene
! natom    : number of atoms
8 1 equemene
! rx,ry,rz : arrays natom with cartesian coordinates of natom particles
9 1 equemene
! rmass    : vector of length natom with particle masses
10 1 equemene
!
11 1 equemene
!!!!!!! Output
12 1 equemene
! a,b,c    : rotational constants a, b, and c
13 1 equemene
!
14 1 equemene
!!!!!! Dependencies
15 1 equemene
! tensor: calculate the inertial tensor
16 1 equemene
! Jacobi, trie : diaganalization subroutines
17 1 equemene
18 1 equemene
  implicit none
19 1 equemene
20 1 equemene
  INTEGER, PARAMETER :: KINT=KIND(1)
21 1 equemene
  INTEGER, PARAMETER :: KREAL=KIND(1.0D0)
22 1 equemene
23 1 equemene
  INTEGER(KINT), INTENT(IN) :: Natom
24 1 equemene
  REAL(KREAL), INTENT(INOUT) :: rx(Natom),ry(Natom),rz(Natom)
25 1 equemene
  REAL(KREAL), INTENT(IN) :: rmass(Natom)
26 1 equemene
  REAL(KREAL), INTENT(OUT) :: a,b,c
27 1 equemene
28 1 equemene
  real(KREAL) :: Tinert(3,3),D(3),V(3,3),CoordG(3)
29 1 equemene
  real(KREAL) :: ca,sa,na,cb,sb,nb
30 1 equemene
31 1 equemene
  INTEGER(KINT) :: I
32 1 equemene
  REAL(KREAL) :: Vt,Rxt,Ryt
33 1 equemene
34 1 equemene
  call tensor(natom,rx,ry,rz,Tinert,CoordG,rmass)
35 1 equemene
  call Jacobi(Tinert,3,D,V,3)
36 1 equemene
  call Trie(3,D,V,3)
37 1 equemene
38 1 equemene
!1000 FORMAT(3F15.3)
39 1 equemene
!1010 FORMAT(4F15.3)
40 1 equemene
41 1 equemene
  a=D(1)
42 1 equemene
!     WRITE(*,1010) a,(V(i,1),i=1,3)
43 1 equemene
  b=D(2)
44 1 equemene
!     WRITE(*,1010) b,(V(i,2),i=1,3)
45 1 equemene
  c=D(3)
46 1 equemene
!     WRITE(*,1010) c,(V(i,3),i=1,3)
47 1 equemene
48 1 equemene
!C On commence par mettre le centre de masse a l'origine
49 1 equemene
50 1 equemene
  Do I=1,natom
51 1 equemene
!     WRITE(*,*) 'DBG Tensor', I, rx(I),rY(I),rz(I)
52 1 equemene
     rx(i)=rx(i)-CoordG(1)
53 1 equemene
     ry(i)=ry(i)-CoordG(2)
54 1 equemene
     rz(i)=rz(i)-CoordG(3)
55 1 equemene
!     WRITE(*,*) 'DBG Tensor', I, rx(I),rY(I),rz(I)
56 1 equemene
  END DO
57 1 equemene
58 1 equemene
  ! C Ensuite, on va faire coincider les axes d'inertie avec x,y,z
59 1 equemene
  ! C Pour etre coherent, et bien que ce ne soit pas le plus logique,
60 1 equemene
  ! C on classe les vecteurs dans le sens croissant, et on fait coincider
61 1 equemene
  ! C les axes dans l'ordre x,y,z pour l'instant.
62 1 equemene
63 1 equemene
  ! C Coincidation du premier axe avec x
64 1 equemene
  ! C Rotation autour de z pour l'amener dans le plan xOz
65 1 equemene
  ! C puis Rotation autour de y pour l'amener suivant x
66 1 equemene
  na=sqrt(V(1,1)*V(1,1)+V(2,1)*V(2,1))
67 1 equemene
  nb=1
68 1 equemene
  if (na.gt.1D-10) then
69 1 equemene
     ca=V(1,1)/na
70 1 equemene
     sa=-V(2,1)/na
71 1 equemene
  else
72 1 equemene
     ca=1
73 1 equemene
     sa=0
74 1 equemene
  END IF
75 1 equemene
  cb=na/nb
76 1 equemene
  sb=-V(3,1)/nb
77 1 equemene
  DO I=1,natom
78 1 equemene
     rxt=rx(i)
79 1 equemene
     rx(i)=rx(i)*ca-ry(i)*sa
80 1 equemene
     ry(i)=rxt*sa+ry(i)*ca
81 1 equemene
     rxt=rx(i)
82 1 equemene
     rx(i)=rx(i)*cb-rz(i)*sb
83 1 equemene
     rz(i)=rxt*sb+rz(i)*cb
84 1 equemene
  END DO
85 1 equemene
86 1 equemene
  !C on applique aussi la rotation aux deux autres axes...
87 1 equemene
  Vt=V(1,2)
88 1 equemene
  V(1,2)=V(1,2)*ca-V(2,2)*sa
89 1 equemene
  V(2,2)=Vt*sa+V(2,2)*ca
90 1 equemene
  Vt=V(1,2)
91 1 equemene
  V(1,2)=V(1,2)*cb-V(3,2)*sb
92 1 equemene
  V(3,2)=Vt*sb+V(3,2)*cb
93 1 equemene
94 1 equemene
  !c     WRITE(IOOUT,1010) b,(V(i,2),i=1,3)
95 1 equemene
96 1 equemene
  !c      Vt=V(1,3)
97 1 equemene
  !c      V(1,3)=V(1,3)*ca-V(2,3)*sa
98 1 equemene
  !c      V(2,3)=Vt*sa+V(2,3)*ca
99 1 equemene
  !c      Vt=V(1,3)
100 1 equemene
  !c      V(1,3)=V(1,3)*cb-V(3,3)*sb
101 1 equemene
  !c      V(3,3)=Vt*sb+V(3,3)*cb
102 1 equemene
  !c     WRITE(IOOUT,1010) c,(V(i,3),i=1,3)
103 1 equemene
104 1 equemene
  !C et on repart pour le 2e axe sur y
105 1 equemene
  !C commes les vecteurs sont orthonormes, il est
106 1 equemene
  !C deja dans le plan yOz d'ou une seule rotation
107 1 equemene
  !c      na=sqrt(V(2,2)*V(2,2)+V(3,2)*V(3,2))
108 1 equemene
  na=1
109 1 equemene
  nb=1
110 1 equemene
  ca=V(2,2)/na
111 1 equemene
  sa=-V(3,2)/na
112 1 equemene
  !c      write(IOOUT,*) 'ca:',ca,sa,cb,sb,na
113 1 equemene
  DO I=1,natom
114 1 equemene
     ryt=ry(i)
115 1 equemene
     ry(i)=ry(i)*ca-rz(i)*sa
116 1 equemene
     rz(i)=ryt*sa+rz(i)*ca
117 1 equemene
  END DO
118 1 equemene
  !C on applique aussi la rotation au dernier axe...
119 1 equemene
  !c      Vt=V(2,3)
120 1 equemene
  !c      V(2,3)=V(2,3)*ca-V(3,3)*sa
121 1 equemene
  !c      V(3,3)=Vt*sa+V(3,3)*ca
122 1 equemene
  !c      WRITE(IOOUT,1010) c,(V(i,3),i=1,3)
123 1 equemene
124 1 equemene
  !C et le 3e axe est deja sur z car  ils sont orthogonaux...
125 1 equemene
126 1 equemene
  return
127 1 equemene
end subroutine Std_ori