root / src / CalcCnct.f90 @ 2
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 |