Statistiques
| Révision :

root / src / Decomp_frag.f90 @ 4

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