root / src / Add2indzmat.f90 @ 6
Historique | Voir | Annoter | Télécharger (1,97 ko)
1 | 1 | equemene | SUBROUTINE add2indzmat(na,izm,n1,n2,n3,n4,ind_zmat,x,y,z) |
---|---|---|---|
2 | 1 | equemene | ! This subroutine adds the description of atom n1 |
3 | 1 | equemene | ! into ind_zmat at position izm |
4 | 1 | equemene | ! it checks that atoms n1 n2 n3 are not aligned |
5 | 1 | equemene | ! and if so, it describes n1 as n1 n2 n4 n3 instead of n1 n2 n3 n4. |
6 | 1 | equemene | ! As n2 n3 n4 are not aligned, this is sufficient to ensure that the description |
7 | 1 | equemene | ! of n1 is ok. |
8 | 1 | equemene | IMPLICIT NONE |
9 | 1 | equemene | |
10 | 1 | equemene | INTEGER, PARAMETER :: KINT=KIND(1) |
11 | 1 | equemene | INTEGER, PARAMETER :: KREAL=KIND(1.0D0) |
12 | 1 | equemene | |
13 | 1 | equemene | |
14 | 1 | equemene | INTEGER(KINT), INTENT(IN) :: na,izm,n1,n2 |
15 | 1 | equemene | INTEGER(KINT), INTENT(INOUT) :: n3,n4 |
16 | 1 | equemene | INTEGER(KINT) :: ind_zmat(na,5),n0 |
17 | 1 | equemene | REAL(KREAL) :: x(na), y(na), z(na) |
18 | 1 | equemene | |
19 | 1 | equemene | real(KREAL) :: vx1,vy1,vz1,norm1 |
20 | 1 | equemene | real(KREAL) :: vx2,vy2,vz2,norm2 |
21 | 1 | equemene | real(KREAL) :: vx3,vy3,vz3,norm3 |
22 | 1 | equemene | REAL(KREAL) :: pi |
23 | 1 | equemene | |
24 | 1 | equemene | LOGICAL :: debug |
25 | 1 | equemene | |
26 | 1 | equemene | |
27 | 1 | equemene | REAL(KREAL) :: Ang123,Ang234,sangle |
28 | 1 | equemene | |
29 | 1 | equemene | INTERFACE |
30 | 1 | equemene | function valid(string) result (isValid) |
31 | 1 | equemene | CHARACTER(*), intent(in) :: string |
32 | 1 | equemene | logical :: isValid |
33 | 1 | equemene | END function VALID |
34 | 1 | equemene | |
35 | 1 | equemene | FUNCTION angle(v1x,v1y,v1z,norm1,v2x,v2y,v2z,norm2) |
36 | 1 | equemene | use Path_module, only : Pi,KINT, KREAL |
37 | 1 | equemene | real(KREAL) :: v1x,v1y,v1z,norm1 |
38 | 1 | equemene | real(KREAL) :: v2x,v2y,v2z,norm2 |
39 | 1 | equemene | real(KREAL) :: angle |
40 | 1 | equemene | END FUNCTION ANGLE |
41 | 1 | equemene | |
42 | 1 | equemene | END INTERFACE |
43 | 1 | equemene | |
44 | 1 | equemene | debug=valid("add2indzmat") |
45 | 1 | equemene | pi=acos(-1.d0) |
46 | 1 | equemene | |
47 | 1 | equemene | if (debug) WRITE(*,*) "Entering Add2IndZmat with izm,n1,n2,n3,n4",izm,n1,n2,n3,n4 |
48 | 1 | equemene | Call vecteur(n2,n1,x,y,z,vx1,vy1,vz1,norm1) |
49 | 1 | equemene | Call vecteur(n2,n3,x,y,z,vx2,vy2,vz2,norm2) |
50 | 1 | equemene | Call vecteur(n3,n4,x,y,z,vx3,vy3,vz3,norm3) |
51 | 1 | equemene | |
52 | 1 | equemene | Ang123=angle(vx1,vy1,vz1,norm1,vx2,vy2,vz2,norm2)/180.*pi |
53 | 1 | equemene | Ang234=angle(vx2,vy2,vz2,norm2,vx3,vy3,vz3,norm3)/180.*pi |
54 | 1 | equemene | |
55 | 1 | equemene | sangle=sin(ang123) |
56 | 1 | equemene | if (sangle.LE.0.09d0) THEN |
57 | 1 | equemene | sangle=sin(ang234) |
58 | 1 | equemene | if (sangle.LE.0.09d0) THEN |
59 | 1 | equemene | WRITE(*,*) "ERROR in Add2IndZmat : all four atoms aligned" |
60 | 1 | equemene | WRITE(*,*) n1,n2,n3,n4 |
61 | 1 | equemene | STOP |
62 | 1 | equemene | END IF |
63 | 1 | equemene | n0=n3 |
64 | 1 | equemene | n3=n4 |
65 | 1 | equemene | n4=n0 |
66 | 1 | equemene | END IF |
67 | 1 | equemene | ind_zmat(izm,1)=n1 |
68 | 1 | equemene | ind_zmat(izm,2)=n2 |
69 | 1 | equemene | ind_zmat(izm,3)=n3 |
70 | 1 | equemene | ind_zmat(izm,4)=n4 |
71 | 1 | equemene | |
72 | 1 | equemene | RETURN |
73 | 1 | equemene | END SUBROUTINE add2indzmat |