Statistiques
| Révision :

root / src / CalcCnct.f90 @ 4

Historique | Voir | Annoter | Télécharger (3,72 ko)

1 1 equemene
!================================================================
2 1 equemene
! Calculation of the connectivity.
3 1 equemene
!
4 1 equemene
! Input:
5 1 equemene
! Na: (INTEGER) Number of atoms in the system
6 1 equemene
! Atome: (INTEGER) Number of mass of the atoms.
7 1 equemene
!                  Needed to find their covalent raii.
8 1 equemene
!  x(Nat), y(nat), z(nat) : (REAL) Cartesian coordinates of the system.
9 1 equemene
!  LIAISONS: (INTEGER Na,0:NMaxL) Array containing the connectivity.
10 1 equemene
!            That is Liaisons(i,:) contains the atoms linked to i.
11 1 equemene
!            Liaisons(i,0) contains the number of atoms linked to i.
12 1 equemene
! r_cov(0:Max_Z) (REAL) Covalent radii
13 1 equemene
! Fact (REAL) Factor used to determined if two atoms are linked :
14 1 equemene
!            i and j are linked if (dist(i,j)*fact <= rcov(i)+rcov(j)
15 1 equemene
!
16 1 equemene
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
17 1 equemene
! Taken from Path_Module
18 1 equemene
! NMaxL (INTEGER): Maximum number of bonds for one atome
19 1 equemene
! Max_Z (INTEGER): Last atom for which I have the atomic of mass and covalent radii.
20 1 equemene
! Nom(Nat) (STRING): Name of the atoms.
21 1 equemene
! Prog (SCHARS): Name of the program used to calculate energies and gradients
22 1 equemene
!
23 1 equemene
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
24 1 equemene
! v1.0 (c) PFL
25 1 equemene
! v1.1 (c) PFL 11.2007
26 1 equemene
! A test has been added for periodic system, ie the linked test
27 1 equemene
! is done between i in the central cell, and j in all surrounding cells.
28 1 equemene
!
29 1 equemene
!================================================================
30 1 equemene
31 1 equemene
SUBROUTINE CalcCnct(na,atome,x,y,z,LIAISONS,r_cov,fact)
32 1 equemene
33 1 equemene
  use Path_module, only : NMaxL, max_Z,Nom,Prog, KINT, KREAL
34 1 equemene
35 1 equemene
  character(2) :: ATOM
36 1 equemene
  integer(KINT) :: na,atome(Na),at,ind_zmat(Na,5),long
37 1 equemene
  real(KREAL) ::  x(Na),y(Na),z(Na),fact
38 1 equemene
  real(KREAL) :: vx,vy,vz,dist
39 1 equemene
  REAL(KREAL) :: r_cov(0:Max_Z)
40 1 equemene
  INTEGER(KINT) :: LIAISONS(Na,0:NMaxL),Nbli,Nblj
41 1 equemene
42 1 equemene
  ! For periodic systems
43 1 equemene
  INTEGER(KINT) :: Ka,Kb,Kc
44 1 equemene
  LOGICAL   :: Bound
45 1 equemene
46 1 equemene
  ! Internals
47 1 equemene
  logical(KREAL) ::debug
48 1 equemene
49 1 equemene
  INTERFACE
50 1 equemene
     function valid(string) result (isValid)
51 1 equemene
       CHARACTER(*), intent(in) :: string
52 1 equemene
       logical                  :: isValid
53 1 equemene
     END function VALID
54 1 equemene
  END INTERFACE
55 1 equemene
56 1 equemene
  debug=valid('calccnct')
57 1 equemene
  if (debug) WRITE(*,*) "======================= Entering CalcCnct ======================="
58 1 equemene
59 1 equemene
  DO i=1,na
60 1 equemene
     Liaisons(i,0)=0
61 1 equemene
  END DO
62 1 equemene
63 1 equemene
  if (debug) THEN
64 1 equemene
     WRITE(*,*) 'CalcCnct'
65 1 equemene
     DO iat=1,na
66 1 equemene
        i=atome(iat)
67 1 equemene
        WRITE(*,*) Nom(I),I,r_cov(i),r_cov(i)*fact
68 1 equemene
     END DO
69 1 equemene
  END IF
70 1 equemene
71 1 equemene
  IF (PROG/="VASP") THEN
72 1 equemene
     DO i=1,na
73 1 equemene
        NbLi=LIAISONS(i,0)
74 1 equemene
        DO j=i+1,na
75 1 equemene
           CALL vecteur(j,i,x,y,z,vx,vy,vz,dist)
76 1 equemene
           dist=dist/fact
77 1 equemene
           distth=(r_cov(atome(i))+r_cov(atome(j)))/100.
78 1 equemene
!           if (debug) WRITE(*,*) atome(i),atome(j),dist,distth
79 1 equemene
           if (dist.le.distth) THEN
80 1 equemene
              NbLi=NbLi+1
81 1 equemene
              LIAISONS(i,NbLi)=j;
82 1 equemene
              NBlj=LIAISONS(j,0)+1
83 1 equemene
              LIAISONS(j,Nblj)=i;
84 1 equemene
              LIAISONS(j,0)=Nblj
85 1 equemene
           END IF
86 1 equemene
        END DO
87 1 equemene
        LIAISONS(i,0)=Nbli
88 1 equemene
     END DO
89 1 equemene
  ELSE
90 1 equemene
     DO i=1,na
91 1 equemene
        NbLi=LIAISONS(i,0)
92 1 equemene
        DO j=i+1,na
93 1 equemene
           Bound=.FALSE.
94 1 equemene
           DO ka=-1,1
95 1 equemene
              DO Kb=-1,1
96 1 equemene
                 DO Kc=-1,1
97 1 equemene
                    CALL VectorPer(j,i,ka,kb,kc,x,y,z,vx,vy,vz,dist)
98 1 equemene
                    dist=dist/fact
99 1 equemene
                    distth=(r_cov(atome(i))+r_cov(atome(j)))/100.
100 1 equemene
!                    if (debug) WRITE(*,*) atome(i),atome(j),dist,distth
101 1 equemene
                    if (dist.le.distth) Bound=.TRUE.
102 1 equemene
                 END DO
103 1 equemene
              END DO
104 1 equemene
           END DO
105 1 equemene
           IF (Bound) THEN
106 1 equemene
              if (debug) WRITE(*,*) "Adding a bond between:",i,j
107 1 equemene
              NbLi=NbLi+1
108 1 equemene
              LIAISONS(i,NbLi)=j;
109 1 equemene
              NBlj=LIAISONS(j,0)+1
110 1 equemene
              LIAISONS(j,Nblj)=i;
111 1 equemene
              LIAISONS(j,0)=Nblj
112 1 equemene
           END IF
113 1 equemene
        END DO
114 1 equemene
        LIAISONS(i,0)=Nbli
115 1 equemene
     END DO
116 1 equemene
  END IF
117 1 equemene
  if (debug) WRITE(*,*) "======================= CalcCnct  over ======================="
118 1 equemene
END SUBROUTINE CalcCnct