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 |