Statistiques
| Révision :

root / src / Add2indzmat.f90 @ 2

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