Statistiques
| Révision :

root / src / Add2indzmat.f90 @ 2

Historique | Voir | Annoter | Télécharger (1,97 ko)

1
SUBROUTINE  add2indzmat(na,izm,n1,n2,n3,n4,ind_zmat,x,y,z)
2
  ! This subroutine adds the description of atom n1
3
  ! into ind_zmat at position izm
4
  ! it checks that atoms n1 n2 n3 are not aligned
5
  ! and if so, it describes n1 as n1 n2 n4 n3 instead of n1 n2 n3 n4.
6
  ! As n2 n3 n4 are not aligned, this is sufficient to ensure that the description
7
  ! of n1 is ok.
8
  IMPLICIT NONE
9

    
10
  INTEGER, PARAMETER :: KINT=KIND(1)
11
  INTEGER, PARAMETER :: KREAL=KIND(1.0D0)
12

    
13

    
14
  INTEGER(KINT), INTENT(IN) :: na,izm,n1,n2
15
  INTEGER(KINT), INTENT(INOUT) :: n3,n4
16
  INTEGER(KINT) :: ind_zmat(na,5),n0
17
  REAL(KREAL) :: x(na), y(na), z(na)
18

    
19
  real(KREAL) :: vx1,vy1,vz1,norm1
20
  real(KREAL) :: vx2,vy2,vz2,norm2
21
  real(KREAL) :: vx3,vy3,vz3,norm3
22
  REAL(KREAL) :: pi
23

    
24
  LOGICAL :: debug
25

    
26

    
27
  REAL(KREAL) :: Ang123,Ang234,sangle
28

    
29
  INTERFACE
30
     function valid(string) result (isValid)
31
       CHARACTER(*), intent(in) :: string
32
       logical                  :: isValid
33
     END function VALID
34

    
35
     FUNCTION angle(v1x,v1y,v1z,norm1,v2x,v2y,v2z,norm2)
36
       use Path_module, only :  Pi,KINT, KREAL
37
       real(KREAL) ::  v1x,v1y,v1z,norm1
38
       real(KREAL) ::  v2x,v2y,v2z,norm2
39
       real(KREAL) ::  angle
40
     END FUNCTION ANGLE
41

    
42
  END INTERFACE
43

    
44
  debug=valid("add2indzmat")
45
  pi=acos(-1.d0)
46

    
47
  if (debug) WRITE(*,*) "Entering Add2IndZmat with izm,n1,n2,n3,n4",izm,n1,n2,n3,n4
48
  Call vecteur(n2,n1,x,y,z,vx1,vy1,vz1,norm1)
49
  Call vecteur(n2,n3,x,y,z,vx2,vy2,vz2,norm2)
50
  Call vecteur(n3,n4,x,y,z,vx3,vy3,vz3,norm3)
51

    
52
  Ang123=angle(vx1,vy1,vz1,norm1,vx2,vy2,vz2,norm2)/180.*pi
53
  Ang234=angle(vx2,vy2,vz2,norm2,vx3,vy3,vz3,norm3)/180.*pi
54

    
55
  sangle=sin(ang123)
56
  if (sangle.LE.0.09d0) THEN
57
     sangle=sin(ang234) 
58
     if (sangle.LE.0.09d0) THEN
59
        WRITE(*,*) "ERROR in Add2IndZmat : all four atoms aligned"
60
        WRITE(*,*) n1,n2,n3,n4
61
        STOP
62
     END IF
63
     n0=n3
64
     n3=n4
65
     n4=n0
66
  END IF
67
  ind_zmat(izm,1)=n1
68
  ind_zmat(izm,2)=n2
69
  ind_zmat(izm,3)=n3
70
  ind_zmat(izm,4)=n4
71

    
72
  RETURN
73
END SUBROUTINE add2indzmat
74