root / src / Decomp_frag.f90 @ 2
Historique | Voir | Annoter | Télécharger (3,66 ko)
1 | 1 | equemene | !This subroutines decomposes a connectivity list into fragments. |
---|---|---|---|
2 | 1 | equemene | SUBROUTINE Decomp_Frag(na,ListConnect,ListAt,nbfrag,Fragment,NbAtFrag,FragAt) |
3 | 1 | equemene | |
4 | 1 | equemene | Use Path_module, only : NMaxL |
5 | 1 | equemene | Use Io_module |
6 | 1 | equemene | |
7 | 1 | equemene | IMPLICIT NONE |
8 | 1 | equemene | |
9 | 1 | equemene | INTEGER(KINT), INTENT(IN) :: na |
10 | 1 | equemene | INTEGER(KINT), INTENT(IN) :: ListConnect(na,0:NMaxL) |
11 | 1 | equemene | LOGICAL, INTENT(IN) :: ListAt(na) |
12 | 1 | equemene | INTEGER(KINT), INTENT(OUT) :: NbFrag,Fragment(na),NbAtFrag(na),FragAt(na,na) |
13 | 1 | equemene | |
14 | 1 | equemene | INTEGER(KINT) :: i,j,k,iat,jat |
15 | 1 | equemene | INTEGER(KINT) :: IdxFrag, IdxtoDo, IFrag,IaFaire |
16 | 1 | equemene | INTEGER(KINT), ALLOCATABLE :: ToDo(:) |
17 | 1 | equemene | |
18 | 1 | equemene | LOGICAL :: Debug |
19 | 1 | equemene | |
20 | 1 | equemene | INTERFACE |
21 | 1 | equemene | function valid(string) result (isValid) |
22 | 1 | equemene | CHARACTER(*), intent(in) :: string |
23 | 1 | equemene | logical :: isValid |
24 | 1 | equemene | END function VALID |
25 | 1 | equemene | END INTERFACE |
26 | 1 | equemene | |
27 | 1 | equemene | |
28 | 1 | equemene | debug=valid('decompfrag') |
29 | 1 | equemene | ! We analyse the connectivity in terms of fragments |
30 | 1 | equemene | ALLOCATE(ToDo(na)) |
31 | 1 | equemene | |
32 | 1 | equemene | Fragment=0 |
33 | 1 | equemene | ToDo=0 |
34 | 1 | equemene | IdxFrag=0 |
35 | 1 | equemene | NbFrag=0 |
36 | 1 | equemene | NbAtFrag=0 |
37 | 1 | equemene | Fragment=0 |
38 | 1 | equemene | FragAt=0 |
39 | 1 | equemene | |
40 | 1 | equemene | DO I=1,na |
41 | 1 | equemene | IdxToDo=1 |
42 | 1 | equemene | ToDo(IdxToDo)=0 |
43 | 1 | equemene | |
44 | 1 | equemene | if (debug) WRITE(*,*) 'Treating atom I, fragment(I)',I,Fragment(I) |
45 | 1 | equemene | IF (ListAt(I).OR.(ListConnect(I,0).NE.0)) THEN |
46 | 1 | equemene | IF (Fragment(I).EQ.0) THEN |
47 | 1 | equemene | IdxFrag=IdxFrag+1 |
48 | 1 | equemene | NbFrag=NbFrag+1 |
49 | 1 | equemene | IFrag=IdxFrag |
50 | 1 | equemene | Fragment(I)=IFrag |
51 | 1 | equemene | NbAtFrag(IFrag)=NbAtFrag(IFrag)+1 |
52 | 1 | equemene | FragAt(IFrag,NbAtFrag(IFrag))=I |
53 | 1 | equemene | ELSE |
54 | 1 | equemene | IFrag=Fragment(I) |
55 | 1 | equemene | END IF |
56 | 1 | equemene | DO J=1,ListConnect(I,0) |
57 | 1 | equemene | Iat=ListConnect(I,J) |
58 | 1 | equemene | IF ((Fragment(Iat).NE.0).AND.(Fragment(Iat).NE.IFrag)) THEN |
59 | 1 | equemene | WRITE(*,*) 'Error : Atoms ',I,' and ',Iat |
60 | 1 | equemene | WRITE(*,*) 'are linked, but belongs to fragments ',IFrag,' and ',Fragment(Iat) |
61 | 1 | equemene | STOP |
62 | 1 | equemene | END IF |
63 | 1 | equemene | IF (Fragment(Iat).EQ.0) THEN |
64 | 1 | equemene | ToDo(IdxToDo)=Iat |
65 | 1 | equemene | Fragment(Iat)=IFrag |
66 | 1 | equemene | NbAtFrag(IFrag)=NbAtFrag(IFrag)+1 |
67 | 1 | equemene | FragAt(IFrag,NbAtFrag(IFrag))=Iat |
68 | 1 | equemene | IdxToDo=IdxToDo+1 |
69 | 1 | equemene | END IF |
70 | 1 | equemene | END DO |
71 | 1 | equemene | ToDo(IdxToDo)=0 |
72 | 1 | equemene | |
73 | 1 | equemene | If (debug) WRITE(*,*) 'ToDo:',ToDo(1:IdxToDo) |
74 | 1 | equemene | If (debug) WRITE(*,*) 'IFrag=',IFrag |
75 | 1 | equemene | |
76 | 1 | equemene | IAfaire=1 |
77 | 1 | equemene | |
78 | 1 | equemene | DO WHILE (ToDo(IAfaire).NE.0) |
79 | 1 | equemene | Iat=ToDo(IaFaire) |
80 | 1 | equemene | IF (ListAt(I).OR.(ListConnect(I,0).NE.0)) THEN |
81 | 1 | equemene | if (debug) WRITE(*,*) 'ToDo treating ',Iat |
82 | 1 | equemene | IF (Fragment(Iat).EQ.0) THEN |
83 | 1 | equemene | WRITE(*,*) 'Error: Atom ',Iat,' does not belong to any fragment !' |
84 | 1 | equemene | STOP |
85 | 1 | equemene | END IF |
86 | 1 | equemene | |
87 | 1 | equemene | DO J=1,ListConnect(Iat,0) |
88 | 1 | equemene | Jat=ListConnect(Iat,J) |
89 | 1 | equemene | IF ((Fragment(ListConnect(Iat,J)).NE.0).AND.(Fragment(ListConnect(Iat,J)).NE.IFrag)) THEN |
90 | 1 | equemene | WRITE(*,*) 'Error: Atoms ',Iat,' and ',ListConnect(Iat,J) |
91 | 1 | equemene | WRITE(*,*) 'are linked, but belongs to fragments ',IFrag,' and ',Fragment(ListConnect(Iat,J)) |
92 | 1 | equemene | STOP |
93 | 1 | equemene | END IF |
94 | 1 | equemene | IF (Fragment(Jat).EQ.0) THEN |
95 | 1 | equemene | ToDo(IdxToDo)=ListConnect(Iat,J) |
96 | 1 | equemene | Fragment(Jat)=IFrag |
97 | 1 | equemene | NbAtFrag(IFrag)=NbAtFrag(IFrag)+1 |
98 | 1 | equemene | FragAt(IFrag,NbAtFrag(IFrag))=Jat |
99 | 1 | equemene | IdxToDo=IdxToDo+1 |
100 | 1 | equemene | END IF |
101 | 1 | equemene | END DO |
102 | 1 | equemene | ToDo(IdxToDo)=0 |
103 | 1 | equemene | If (debug) WRITE(*,*) 'IAfaire, IdxToDo,ToDo :',IAfaire,IdxToDo,' == ',ToDo(IaFaire+1:IdxToDo) |
104 | 1 | equemene | IAFaire=IAFaire+1 |
105 | 1 | equemene | END IF |
106 | 1 | equemene | END DO |
107 | 1 | equemene | END IF |
108 | 1 | equemene | END DO |
109 | 1 | equemene | |
110 | 1 | equemene | IF (debug) THEN |
111 | 1 | equemene | WRITE(*,*) 'DECOMP_FRAG: I found ',NbFrag, 'fragments' |
112 | 1 | equemene | DO I=1,NbFrag |
113 | 1 | equemene | WRITE(*,*) 'Fragment ', i,' with ',NbAtFrag(I),' atoms.' |
114 | 1 | equemene | WRITE(*,*) "FragAt:",(FragAt(I,j),j=1,NbAtFrag(I)) |
115 | 1 | equemene | END DO |
116 | 1 | equemene | END IF |
117 | 1 | equemene | |
118 | 1 | equemene | |
119 | 1 | equemene | END SUBROUTINE Decomp_Frag |