Statistiques
| Révision :

root / src / Add2indzmat.f90 @ 5

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

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