Statistiques
| Révision :

root / src / ZmatBuild.f90 @ 2

Historique | Voir | Annoter | Télécharger (31,29 ko)

1 1 equemene
      SUBROUTINE ZmatBuild(na,atome,ind_zmat,val_zmat,x,y,z,izm, &
2 1 equemene
           Liaisons, LIes_CP,LIes_CF,ListAt,DejaFait,debug)
3 1 equemene
4 1 equemene
!
5 1 equemene
!     This second version enables the user to freeze some atoms
6 1 equemene
!     the frozen atoms indices are listed in the frozen array.
7 1 equemene
!
8 1 equemene
!     The idea is surely too stupid to work all the time... but here it is
9 1 equemene
!     we first construct the zmat using only the frozen atoms, and then
10 1 equemene
!     we add the other atoms on top of the first ones...
11 1 equemene
!
12 1 equemene
! 12.06.06
13 1 equemene
! Small modification: there was an inconsistency: izm was increased
14 1 equemene
! after the atom was added to ind_zmat for the three first atoms,
15 1 equemene
! but before for all others. Now, it starts at zero and it
16 1 equemene
! is increased before the atom is added to ind_zmat
17 1 equemene
!     IMPLICIT NONE
18 1 equemene
19 1 equemene
      use Path_module, only : Nat, NMaxL, max_Z, KINT, KREAL
20 1 equemene
21 1 equemene
22 1 equemene
      INTEGER(KINT) :: Izm
23 1 equemene
      integer(KINT) :: na,atome(NAt),at,ind_zmat(NAt,5),long
24 1 equemene
      real(KREAL) ::  x(NAt),y(NAt),z(NAt),fact
25 1 equemene
      real(KREAL) ::  val_zmat(NAt,3)
26 1 equemene
!     ListAt contains the indices of frozen atoms
27 1 equemene
      LOGICAL ListAT(NAt),FIzm1,FFirst
28 1 equemene
      INTEGER(KINT) :: Natreat
29 1 equemene
30 1 equemene
      real(KREAL) ::  vx,vy,vz,dist
31 1 equemene
      INTEGER(KINT) :: LIAISONS(NAt,0:NMaxL),Nbli,Nblj
32 1 equemene
      INTEGER(KINT) :: LiaisonsBis(NAt,0:NMaxL)
33 1 equemene
      INTEGER(KINT) :: CAFaire(NAt)
34 1 equemene
      INTEGER(KINT) :: LieS_CP(NAt,0:NMaxL),LieS_CF(NAt,0:NMaxL)
35 1 equemene
      INTEGER(KINT) :: AtCP0(NAt),NbAt0,NbAt0r
36 1 equemene
      Integer(KINT) :: AtTypCycl(Max_Z), NbAt3(NAt,2),CyCleAt(NAt)
37 1 equemene
      Integer(KINT) :: NbCycle
38 1 equemene
      real(KREAL) ::  vx1,vy1,vz1,norm1
39 1 equemene
      real(KREAL) ::  vx2,vy2,vz2,norm2
40 1 equemene
      real(KREAL) ::  vx3,vy3,vz3,norm3
41 1 equemene
      real(KREAL) ::  vx4,vy4,vz4,norm4
42 1 equemene
      real(KREAL) ::  vx5,vy5,vz5,norm5
43 1 equemene
      real(KREAL) ::  val,val_d
44 1 equemene
      Logical AtTerm,Debug,Done
45 1 equemene
      Logical DejaFait(NAt)
46 1 equemene
      LOGICAL F1213, F1223,F1323,FTmp
47 1 equemene
48 1 equemene
!     As we may have to treat only partial molecules, it may happen
49 1 equemene
!     that there are no central atoms... so we first check this by looking
50 1 equemene
!     for the least number of CP atoms
51 1 equemene
      FFirst=.TRUE.
52 1 equemene
      NMinCP=na
53 1 equemene
      NMaxCF=-1
54 1 equemene
      NAtreat=0
55 1 equemene
      Izm0=Izm+1
56 1 equemene
57 1 equemene
      DO I=1,na
58 1 equemene
         if (DEBUG) WRITE(*,*) "DBG ZmatBuild i,listat",i,listAt(i)
59 1 equemene
         IF (ListAt(I).AND.(.NOT.(DejaFait(I)))) THEN
60 1 equemene
            IF (Lies_CP(I,0).lt.NMinCP)      NMinCP=Lies_CP(I,0)
61 1 equemene
            IF (Lies_CF(I,0).gt.NMaxCF)      NMaxCF=Lies_CF(I,0)
62 1 equemene
            NATreat=NATreat+1
63 1 equemene
         END IF
64 1 equemene
      END DO
65 1 equemene
      if (debug) WRITE(*,*) 'NMinCP=',NMinCP
66 1 equemene
      if (debug) WRITE(*,*) 'NMaxCF=',NMaxCF
67 1 equemene
      if (debug) WRITE(*,*) 'NATreat=',NAtreat
68 1 equemene
69 1 equemene
70 1 equemene
      IF (Debug) THEN
71 1 equemene
         WRITE(*,*) '------------------ Zmat Build -------------------'
72 1 equemene
         WRITE(*,*) 'LIAISONS'
73 1 equemene
         DO I=1,na
74 1 equemene
            WRITE(*,1003) i,(LIAISONS(I,J),J=0,NMaxL)
75 1 equemene
         END DO
76 1 equemene
77 1 equemene
         WRITE(*,*) 'LIes_CF'
78 1 equemene
         DO I=1,na
79 1 equemene
            WRITE(*,1003) i,(LIeS_CF(I,J),J=0,NMaxL)
80 1 equemene
         END DO
81 1 equemene
82 1 equemene
         WRITE(*,*) 'LIes_CP'
83 1 equemene
         DO I=1,na
84 1 equemene
            WRITE(*,1003) i,(LIeS_CP(I,J),J=0,NMaxL)
85 1 equemene
         END DO
86 1 equemene
         WRITE(*,*) '-- Zmat Build : only _To treat_ atoms------------'
87 1 equemene
         WRITE(*,*) 'LIAISONS'
88 1 equemene
         DO I=1,na
89 1 equemene
            IF (ListAt(I).AND.(.NOT.DejaFait(I))) &
90 1 equemene
                 WRITE(*,1003) i,(LIAISONS(I,J),J=0,NMaxL)
91 1 equemene
         END DO
92 1 equemene
93 1 equemene
         WRITE(*,*) 'LIes_CF'
94 1 equemene
         DO I=1,na
95 1 equemene
            IF (ListAt(I).AND.(.NOT.DejaFait(I))) &
96 1 equemene
                WRITE(*,1003) i,(LIeS_CF(I,J),J=0,NMaxL)
97 1 equemene
         END DO
98 1 equemene
99 1 equemene
         WRITE(*,*) 'LIes_CP'
100 1 equemene
         DO I=1,na
101 1 equemene
            IF (ListAt(I).AND.(.NOT.DejaFait(I))) &
102 1 equemene
                WRITE(*,1003) i,(LIeS_CP(I,J),J=0,NMaxL)
103 1 equemene
         END DO
104 1 equemene
105 1 equemene
      END IF
106 1 equemene
107 1 equemene
108 1 equemene
      if (NAtreat.EQ.0) THEN
109 1 equemene
         WRITE(*,*) "Foutage de gueule : NAtTreat=0"
110 1 equemene
         RETURN
111 1 equemene
      END IF
112 1 equemene
113 1 equemene
      if (debug) THEN
114 1 equemene
         WRITE(*,*) 'DBG ZmatBuil, izm=',izm
115 1 equemene
         DO I=1,na
116 1 equemene
            WRITE(*,'(1X,I5,1X,L4,1X,L4,12(1X,I4))') i,ListAt(I) &
117 1 equemene
                 ,DejaFait(I), &
118 1 equemene
                 (Liaisons(I,J),J=0,Liaisons(I,0))
119 1 equemene
         END DO
120 1 equemene
      END IF
121 1 equemene
122 1 equemene
!!!   atraiter NMaxCF=0 :que des atomes separes...
123 1 equemene
!     mais faut-il reellement faire un cas a part ?
124 1 equemene
125 1 equemene
!     On compte le nb d'atomes sans atomes CP (centripetes)
126 1 equemene
      NbAt0=0
127 1 equemene
      DO I=1,na
128 1 equemene
         IF (ListAt(I).AND.(.NOT.DejaFait(I)).AND. &
129 1 equemene
              (Lies_CP(I,0).eq.NMinCP)) THEN
130 1 equemene
            NbAt0=NbAt0+1
131 1 equemene
            AtCP0(NbAt0)=I
132 1 equemene
            IF (DEBUG) WRITE(*,*) "Center atom",NbAt0,I,Atome(I)
133 1 equemene
         END IF
134 1 equemene
      END DO
135 1 equemene
      AtCP0(NbAt0+1)=0
136 1 equemene
      NbAt0r=NbAt0
137 1 equemene
138 1 equemene
      IF (Debug)  WRITE(*,*) 'DBG ZmatBuld - NCP0,AtCP0 ',NbAt0, &
139 1 equemene
           (AtCP0(i),i=1,NbAt0)
140 1 equemene
141 1 equemene
!     On va les traiter tous en construisant les molecules en partant d'eux
142 1 equemene
!     Le premier atome sans CP est different des autres car il fixe
143 1 equemene
!     l'origine
144 1 equemene
145 1 equemene
!First atom
146 1 equemene
      IF (Izm==0) THEN
147 1 equemene
         FFirst=.FALSE.
148 1 equemene
         if (debug) WRITE(*,*) 'DBG ZmatBuil - Treating Izm=1'
149 1 equemene
!     IZm=1
150 1 equemene
!     Boucle pour trouver celui qui a le plus d'atomes CF
151 1 equemene
         IdAt0=0
152 1 equemene
         VCF=-1
153 1 equemene
         DO I=1,NbAt0
154 1 equemene
!     WRITE(*,*) 'DBG ZmatB',I,AtCP0(I)
155 1 equemene
            if (AtCP0(I).NE.0) THEN
156 1 equemene
               ICat=AtCP0(I)
157 1 equemene
               if (Lies_CF(ICAt,0).gt.VCF) THEN
158 1 equemene
                  IdAt0=ICat
159 1 equemene
                  IdxAt0=I
160 1 equemene
                  VCF=Lies_CF(ICAt,0)
161 1 equemene
               END IF
162 1 equemene
            END IF
163 1 equemene
         END DO
164 1 equemene
165 1 equemene
!     IF (debug) WRITE(*,*) 'DBG ZmatBuil - VCF, IdxAt0,IdAt0',
166 1 equemene
!     &        VCF, IdxAt0,IdAt0
167 1 equemene
!     all atoms with NMinCP CP links do not have CF links... not a good choice to start
168 1 equemene
!     building the molecule(s) around them... we increase NMinCP
169 1 equemene
         AtCP0(IdxAt0)=0
170 1 equemene
         NbAt0r=NbAt0r-1
171 1 equemene
172 1 equemene
!     WRITE(IOOUT,*) 'Atome 1', IdAt0, Nom(Atome(IdAt0))
173 1 equemene
         Izm1=IdAt0
174 1 equemene
         Izm=Izm+1
175 1 equemene
176 1 equemene
         ind_zmat(izm,1)=Izm1
177 1 equemene
         ind_zmat(izm,2)=0
178 1 equemene
         ind_zmat(izm,3)=0
179 1 equemene
         ind_zmat(izm,4)=0
180 1 equemene
         ind_zmat(izm,5)=0
181 1 equemene
         val_zmat(izm,1)=0.0
182 1 equemene
         val_zmat(izm,2)=0.0
183 1 equemene
         val_zmat(izm,3)=0.0
184 1 equemene
         DejaFait(Izm1)=.True.
185 1 equemene
186 1 equemene
      END IF                    ! end of izm==1 test
187 1 equemene
188 1 equemene
!     On construit la premiere couche qui est speciale car elle fixe les
189 1 equemene
!     axes.
190 1 equemene
!     Plusieurs cas sont possibles suivant le nb d'atomes CF
191 1 equemene
      IdAt0=ind_zmat(1,1)
192 1 equemene
      Izm1=IdAt0
193 1 equemene
194 1 equemene
!Second atom
195 1 equemene
      IF ((izm==1).AND.(NAtreat.ge.2))  THEN
196 1 equemene
         Done=.FALSE.
197 1 equemene
         if (debug) WRITE(*,*) 'DBG ZmatBuil - Treating Izm=2'
198 1 equemene
!     Two cases: 1) We are constructing the first fragment: FIzm1=.T.
199 1 equemene
!     2) We are constructing the second fragment: FIzm1=.F.
200 1 equemene
!     in this case, we select one CP0 atom to start with
201 1 equemene
         IF (FFirst) THEN
202 1 equemene
            FFirst=.FALSE.
203 1 equemene
!     This is the first atom to be dealt with
204 1 equemene
!     We look for a CP0
205 1 equemene
            If (NbAt0r.ge.1) THEN
206 1 equemene
               IdAt0=0
207 1 equemene
               VCF=-1
208 1 equemene
               WRITE(*,*) 'DBG  ZBuild Izm=2:AtCP0',(AtCP0(I),I=1,NbAt0)
209 1 equemene
               DO I=1,NbAt0
210 1 equemene
                  if (AtCP0(I).NE.0) THEN
211 1 equemene
                     ICat=AtCP0(I)
212 1 equemene
                     if (Lies_CF(I,0).gt.VCF) THEN
213 1 equemene
                        Izm2=ICat
214 1 equemene
                        IdxAt0=I
215 1 equemene
                        VCF=Lies_CF(ICAt,0)
216 1 equemene
                     END IF
217 1 equemene
                  END IF
218 1 equemene
               END DO
219 1 equemene
               WRITE(*,*) 'DBG ZBuild Izm=2:izm2,IdxAt0,VCF,AtCP0(1)', &
220 1 equemene
                    izm2,IdxAt0,VCF,AtCP0(1)
221 1 equemene
               NbAt0r=NbAt0r-1
222 1 equemene
               Done=.TRUE.
223 1 equemene
            END IF
224 1 equemene
225 1 equemene
!     If we do not have a CP0 available the other tests are identical
226 1 equemene
!     for cases 1 and 2...
227 1 equemene
         END IF
228 1 equemene
         IF (.NOT.DONE) THEN
229 1 equemene
            IF (Lies_CF(IdAt0,0).ge.1) THEN
230 1 equemene
               IZm2=Lies_CF(IdAt0,1)
231 1 equemene
               WRITE(*,*) 'DBG ZBuild Lies_CF(IdAt0,0).ge.1', &
232 1 equemene
                    Lies_CF(IdAt0,0),izm2
233 1 equemene
            ELSE
234 1 equemene
!     First atom is not linked to anything... we look for the second CP0 atom
235 1 equemene
!     if we have one..
236 1 equemene
               If (NbAt0r.ge.1) THEN
237 1 equemene
                  IdAt0=0
238 1 equemene
                  VCF=-1
239 1 equemene
                  IF (DEBUG) WRITE(*,*) 'DBG  ZBuild Izm=2:AtCP0', &
240 1 equemene
                       (AtCP0(I),I=1,NbAt0)
241 1 equemene
                  DO I=1,NbAt0
242 1 equemene
                     if (AtCP0(I).NE.0) THEN
243 1 equemene
                        ICat=AtCP0(I)
244 1 equemene
                        if (Lies_CF(I,0).gt.VCF) THEN
245 1 equemene
                           Izm2=ICat
246 1 equemene
                           IdxAt0=I
247 1 equemene
                           VCF=Lies_CF(ICAt,0)
248 1 equemene
                        END IF
249 1 equemene
                     END IF
250 1 equemene
                  END DO
251 1 equemene
                  IF (DEBUG) WRITE(*,*) 'DBG ZBuild Izm=2:izm2,IdxAt0,VCF,AtCP0(1)', &
252 1 equemene
                       izm2,IdxAt0,VCF,AtCP0(1)
253 1 equemene
                  NbAt0r=NbAt0r-1
254 1 equemene
               ELSE
255 1 equemene
!     we do not have another CP0 atom... but we know that there
256 1 equemene
!     is at least two atoms... we look for the closest atom to Izm1
257 1 equemene
                  Izm2=0
258 1 equemene
                  Dist=1.D99
259 1 equemene
                  DO I=1,Na
260 1 equemene
                     IF (ListAt(I).AND.(.NOT.Dejafait(I))) THEN
261 1 equemene
                        CALL vecteur(IZm1,I,x,y,z,vx1,vy1,vz1,norm1)
262 1 equemene
                        if (Norm1.lt.Dist) IZm2=I
263 1 equemene
                     END IF
264 1 equemene
                  END DO
265 1 equemene
               END IF
266 1 equemene
            END IF
267 1 equemene
         END IF
268 1 equemene
         CALL vecteur(IZm1,IZm2,x,y,z,vx1,vy1,vz1,norm1)
269 1 equemene
270 1 equemene
         Izm=Izm+1
271 1 equemene
272 1 equemene
         ind_zmat(izm,1)=izm2
273 1 equemene
         ind_zmat(izm,2)=izm1
274 1 equemene
         ind_zmat(izm,3)=0
275 1 equemene
         ind_zmat(izm,4)=0
276 1 equemene
         ind_zmat(izm,5)=0
277 1 equemene
         val_zmat(izm,1)=norm1
278 1 equemene
         val_zmat(izm,2)=0.0
279 1 equemene
         val_zmat(izm,3)=0.0
280 1 equemene
         DejaFait(Izm2)=.TRUE.
281 1 equemene
282 1 equemene
      END IF                    ! end of izm==2 test
283 1 equemene
284 1 equemene
      Izm1=ind_zmat(1,1)
285 1 equemene
      Izm2=ind_zmat(2,1)
286 1 equemene
287 1 equemene
! Third atom
288 1 equemene
289 1 equemene
      IF ((Izm==2).AND.(NAtreat.ge.3)) THEN
290 1 equemene
         Done=.FALSE.
291 1 equemene
         if (debug) WRITE(*,*) 'DBG ZmatBuil - Treating Izm=3',FFirst
292 1 equemene
!     Two cases: 1) We are constructing the first fragment: FIzm1=.T.
293 1 equemene
!     2) We are constructing the second fragment: FIzm1=.F.
294 1 equemene
!     in this case, we select one CP0 atom to start with
295 1 equemene
         IF (FFirst) THEN
296 1 equemene
            FFirst=.FALSE.
297 1 equemene
!     This is the first atom to be dealt with
298 1 equemene
!     We look for a CP0
299 1 equemene
            If (NbAt0r.ge.1) THEN
300 1 equemene
               IdAt0=0
301 1 equemene
               VCF=-1
302 1 equemene
               DO I=1,NbAt0
303 1 equemene
                  if (AtCP0(I).NE.0) THEN
304 1 equemene
                     ICat=AtCP0(I)
305 1 equemene
                     if (Lies_CF(I,0).gt.VCF) THEN
306 1 equemene
                        Izm3=ICat
307 1 equemene
                        IdxAt0=I
308 1 equemene
                        VCF=Lies_CF(ICAt,0)
309 1 equemene
                     END IF
310 1 equemene
                  END IF
311 1 equemene
               END DO
312 1 equemene
               NbAt0r=NbAt0r-1
313 1 equemene
               Done=.TRUE.
314 1 equemene
            END IF
315 1 equemene
!     If we do not have a CP0 available the other tests are identical
316 1 equemene
!     for cases 1 and 2...
317 1 equemene
         END IF
318 1 equemene
         IF (.NOT.Done) THEN
319 1 equemene
            WRITE(*,*) 'DBG ZmatBuild: Done false for izm=3'
320 1 equemene
            IF (Lies_CF(izm1,0).ge.2) THEN
321 1 equemene
!     easiest case: the first atom is linked to at least 2 atoms.
322 1 equemene
               WRITE(*,*) 'DBG ZmtB-izm3:Lies_CF(izm1,0)>=2 '
323 1 equemene
               I=1
324 1 equemene
               DO WHILE ((.NOT.ListAt(Lies_CF(izm1,I))) &
325 1 equemene
                    .OR.(DejaFait(Lies_CF(izm1,I))))
326 1 equemene
                  I=I+1
327 1 equemene
               END DO
328 1 equemene
               izm3=Lies_CF(Izm1,I)
329 1 equemene
               Done=.TRUE.
330 1 equemene
            ELSEIF (Lies_CF(Izm2,0).ge.1) THEN
331 1 equemene
!     a bit more complex: first atom is linked to one atom (Izm2)
332 1 equemene
!     but luckily 2nd atom is linked to at least one atom
333 1 equemene
               I=1
334 1 equemene
               DO WHILE ((.NOT.ListAt(Lies_CF(izm2,I))) &
335 1 equemene
                    .OR.(DejaFait(Lies_CF(izm2,I))).AND.(I.le.Lies_CF(Izm2,0)))
336 1 equemene
                  I=I+1
337 1 equemene
               END DO
338 1 equemene
               IF (I.LE.Lies_CF(Izm2,0)) THEN
339 1 equemene
                  Izm3=Lies_CF(izm2,I)
340 1 equemene
               WRITE(*,*) 'DBG ZmtB-izm3:Lies_CF(izm2,0)>=1 and ok  '
341 1 equemene
!     We exchange Izm1 and Izm2 because the logical order is Izm3 linked
342 1 equemene
!     to Izm2  and not to Izm1 as is the default later
343 1 equemene
                  IzmTmp=Izm2
344 1 equemene
                  Izm2=Izm1
345 1 equemene
                  Izm1=IzmTmp
346 1 equemene
                  Done=.TRUE.
347 1 equemene
               END IF
348 1 equemene
            END IF
349 1 equemene
         IF (.NOT.Done) THEN
350 1 equemene
!     None of the first two atoms has links to a third atom...
351 1 equemene
!     we take it from the CP0 if possible...
352 1 equemene
               If (NbAt0r.ge.1) THEN
353 1 equemene
                  WRITE(*,*) 'DBG ZmatB izm=3',NbAt0r
354 1 equemene
                  IdAt0=0
355 1 equemene
                  VCF=-1
356 1 equemene
                  DO I=1,NbAt0
357 1 equemene
                     if (AtCP0(I).NE.0) THEN
358 1 equemene
                        ICat=AtCP0(I)
359 1 equemene
                        if (Lies_CF(I,0).gt.VCF) THEN
360 1 equemene
                           Izm3=ICat
361 1 equemene
                           IdxAt0=I
362 1 equemene
                           VCF=Lies_CF(ICAt,0)
363 1 equemene
                        END IF
364 1 equemene
                     END IF
365 1 equemene
                  END DO
366 1 equemene
                  NbAt0r=NbAt0r-1
367 1 equemene
                  WRITE(*,*) 'DBG ZmatB izm=3',NbAt0r,Izm3
368 1 equemene
               ELSE
369 1 equemene
! Or the  atom closest to 1
370 1 equemene
                  Izm3=0
371 1 equemene
                  Dist=1.D99
372 1 equemene
                  DO I=1,Na
373 1 equemene
                     IF (ListAt(I).AND.(.NOT.Dejafait(I))) THEN
374 1 equemene
                        CALL vecteur(IZm1,I,x,y,z,vx1,vy1,vz1,norm1)
375 1 equemene
                        if (Norm1.lt.Dist) IZm3=I
376 1 equemene
                     END IF
377 1 equemene
                  END DO
378 1 equemene
               END IF
379 1 equemene
            END IF
380 1 equemene
         END IF
381 1 equemene
382 1 equemene
         CALL vecteur(IZm1,IZm2,x,y,z,vx1,vy1,vz1,norm1)
383 1 equemene
         CALL vecteur(izm1,izm3,x,y,z,vx2,vy2,vz2,norm2)
384 1 equemene
         val=angle(vx1,vy1,vz1,norm1,vx2,vy2,vz2,norm2)
385 1 equemene
386 1 equemene
!     write(*,11) n1,n2,norm1,n3,val
387 1 equemene
388 1 equemene
         Izm=Izm+1
389 1 equemene
390 1 equemene
         ind_zmat(izm,1)=izm3
391 1 equemene
         ind_zmat(izm,2)=izm1
392 1 equemene
         ind_zmat(izm,3)=izm2
393 1 equemene
         ind_zmat(izm,4)=0
394 1 equemene
         ind_zmat(izm,5)=0
395 1 equemene
         val_zmat(izm,1)=norm2
396 1 equemene
         val_zmat(izm,2)=val
397 1 equemene
         val_zmat(izm,3)=0.0
398 1 equemene
         DejaFait(Izm3)=.TRUE.
399 1 equemene
400 1 equemene
      END IF                    ! end of test izm=3
401 1 equemene
402 1 equemene
!     We add all atoms CF atoms linked to the already present atoms in the zmat to
403 1 equemene
!     the "to do" list:
404 1 equemene
!     Les atomes CF lies a IdAt0 sont mis en attente pour
405 1 equemene
!     etre traites
406 1 equemene
407 1 equemene
!     For 'historical' reasons, the first atom links have to be dealt with
408 1 equemene
!     in a special way... now !
409 1 equemene
410 1 equemene
      if (Izm.ge.NaTreat) Return
411 1 equemene
412 1 equemene
413 1 equemene
      WRITE(*,*) 'DBG ZmatBuild Izm0',Izm0
414 1 equemene
415 1 equemene
      if (debug) THEN
416 1 equemene
         WRITE(*,*) 'ind_zmat'
417 1 equemene
         DO I=1,na
418 1 equemene
            WRITE(*,'(1X,5I5)') (ind_zmat(i,j),j=1,5)
419 1 equemene
         END DO
420 1 equemene
      END IF
421 1 equemene
422 1 equemene
      IF (FFIrst) GOTO 9753
423 1 equemene
424 1 equemene
         I=Ind_zmat(Izm0,1)
425 1 equemene
         DO IdAtl=1,Lies_CF(I,0)
426 1 equemene
            Izm4= Lies_CF(I,IdAtl)
427 1 equemene
!      WRITE(IOOUT,*) 'Atome ',Izm+1,Izm4,Nom(Atome(Izm4)),Izm1,
428 1 equemene
!     $Izm2,Izm3
429 1 equemene
            IF (ListAt(Izm4).AND.(.NOT.DejaFait(Izm4))) THEN
430 1 equemene
               Izm=Izm+1
431 1 equemene
               Call AddLigne(Izm,Izm4,Izm1,Izm2,Izm3,ind_zmat,val_zmat, &
432 1 equemene
                 x,y,z)
433 1 equemene
               DejaFait(Izm4)=.TRUE.
434 1 equemene
            END IF
435 1 equemene
         END DO
436 1 equemene
!      END IF
437 1 equemene
438 1 equemene
      if (debug) THEN
439 1 equemene
         WRITE(*,*) 'ind_zmat'
440 1 equemene
         DO I=1,na
441 1 equemene
            WRITE(*,'(1X,5I5)') (ind_zmat(i,j),j=1,5)
442 1 equemene
         END DO
443 1 equemene
       END IF
444 1 equemene
445 1 equemene
      if (Izm.ge.NaTreat) Return
446 1 equemene
447 1 equemene
      IndFin=1
448 1 equemene
      DO I=Izm0,Izm
449 1 equemene
         Iat=ind_zmat(I,1)
450 1 equemene
!         Do iaf=1,Lies_CF(Iat,0)
451 1 equemene
!!     if (ListAt(Lies_CF(IAt,iaf)).AND.
452 1 equemene
!!     &              (.NOT.DejaFait(Lies_CF(IAt,iaf))))  THEN
453 1 equemene
!            if (ListAt(Lies_CF(IAt,iaf))) THEN
454 1 equemene
!               CAfaire(IndFin)=Lies_CF(IAt,Iaf)
455 1 equemene
               CaFaire(IndFin)=Iat
456 1 equemene
               IndFin=IndFin+1
457 1 equemene
!            END IF
458 1 equemene
!         END DO
459 1 equemene
      END DO
460 1 equemene
      CAfaire(IndFin)=0
461 1 equemene
462 1 equemene
      if (debug) WRITE(IOOUT,*) "CaFaire:",CaFaire
463 1 equemene
464 1 equemene
      if (debug) WRITE(*,*) 'DBG ZmatBuil - Treating Izm=4'
465 1 equemene
466 1 equemene
!     on a cree la premiere couche autour du premier centre
467 1 equemene
!     reste a finir les autres couches
468 1 equemene
      IndAFaire=1
469 1 equemene
      if (debug) WRITE(IOOUT,*) "CaFaire:",CaFaire
470 1 equemene
      Do WHILE (Cafaire(IndAFaire).ne.0)
471 1 equemene
         IAt0=Cafaire(IndAfaire)
472 1 equemene
         if (debug) WRITE(*,*) "IndAFaire,IAt0,Lies_CF(IAt0,0)", &
473 1 equemene
              IndAFaire,IAt0,Lies_CF(IAt0,0)
474 1 equemene
         if (Lies_CF(IAt0,0).ge.1) THEN
475 1 equemene
!     IAt0 est l'atome pour lequel on construit la couche suivante
476 1 equemene
!     le premier atome lie est particulier car il definit l'orientation
477 1 equemene
!     de ce fragment
478 1 equemene
            IAti=Lies_CF(IAt0,1)
479 1 equemene
      WRITE(IOOUT,*) 'IAti:',IAti
480 1 equemene
            IAtd=IAt0
481 1 equemene
      WRITE(IOOUT,*) 'IAtd:',IAtd
482 1 equemene
            IAtv=Lies_CP(IAt0,1)
483 1 equemene
      WRITE(IOOUT,*) 'IAtv:',IAtv
484 1 equemene
            IIAtdh=1
485 1 equemene
            IAtdh=Lies_CF(IAtv,IIatdh)
486 1 equemene
            DO WHILE (Iatdh.eq.IAt0)
487 1 equemene
               IIatdh=IIatdh+1
488 1 equemene
               IAtdh=Lies_CF(IAtv,IIatdh)
489 1 equemene
            END DO
490 1 equemene
            IF (IAtdh.eq.0) IAtdh=Lies_CP(IAtv,1)
491 1 equemene
      WRITE(IOOUT,*) 'IAtdh:',IAtdh
492 1 equemene
            IF (ListAt(IAti).AND.(.NOT.DejaFait(IAti))) THEN
493 1 equemene
               Izm=Izm+1
494 1 equemene
               if (debug) WRITE(*,*) 'izm,IAti,IAtd,IAtv,IAtdh', &
495 1 equemene
                    izm,IAti,IAtd,IAtv,IAtdh
496 1 equemene
               Call AddLigne(Izm,IAti,IAtd,IAtv,IAtdh, &
497 1 equemene
                    ind_zmat,val_zmat ,x,y,z)
498 1 equemene
               DejaFait(IAti)=.TRUE.
499 1 equemene
            END IF
500 1 equemene
501 1 equemene
            CAfaire(IndFin)=Lies_CF(IAt0,1)
502 1 equemene
            IndFin=IndFin+1
503 1 equemene
!     Le traitement des autres est plus facile
504 1 equemene
            IAtdh=Lies_CF(IAt0,1)
505 1 equemene
            DO IAta=2,Lies_CF(IAt0,0)
506 1 equemene
               IAtI=Lies_CF(IAt0,IAta)
507 1 equemene
               CAfaire(IndFin)=IAtI
508 1 equemene
               IndFin=IndFin+1
509 1 equemene
510 1 equemene
               IF (ListAt(IAti).AND.(.NOT.DejaFait(IAti))) THEN
511 1 equemene
                  Izm=Izm+1
512 1 equemene
                  Call AddLigne(Izm,IAti,IAtd,IAtv,IAtdh,ind_zmat &
513 1 equemene
                       ,val_zmat,x,y,z)
514 1 equemene
                  DejaFait(IAti)=.TRUE.
515 1 equemene
               END IF
516 1 equemene
            END DO
517 1 equemene
            CAfaire(IndFin)=0
518 1 equemene
         END IF
519 1 equemene
         IndAFaire=IndAFaire+1
520 1 equemene
         if (debug) WRITE(IOOUT,*) "IndAfaire,CaFaire:",IndAfaire, &
521 1 equemene
            CaFaire
522 1 equemene
      END DO
523 1 equemene
524 1 equemene
      IndFin=1
525 1 equemene
      DO I=1,Izm0
526 1 equemene
         Iat=ind_zmat(I,1)
527 1 equemene
!         Do iaf=1,Lies_CF(Iat,0)
528 1 equemene
         if (ListAt(IAt).AND. &
529 1 equemene
                    (.NOT.DejaFait(IAt)))  THEN
530 1 equemene
!            if (ListAt(Lies_CF(IAt,iaf))) THEN
531 1 equemene
!               CAfaire(IndFin)=Lies_CF(IAt,Iaf)
532 1 equemene
               CaFaire(IndFin)=Iat
533 1 equemene
               IndFin=IndFin+1
534 1 equemene
            END IF
535 1 equemene
!         END DO
536 1 equemene
      END DO
537 1 equemene
      CAfaire(IndFin)=0
538 1 equemene
539 1 equemene
      if (debug) WRITE(IOOUT,*) "CaFaire:",CaFaire
540 1 equemene
541 1 equemene
      if (debug) WRITE(*,*) 'DBG ZmatBuil - Treating Izm=4'
542 1 equemene
543 1 equemene
!     on a cree la premiere couche autour du premier centre
544 1 equemene
!     reste a finir les autres couches
545 1 equemene
      IndAFaire=1
546 1 equemene
      if (debug) WRITE(IOOUT,*) "CaFaire:",CaFaire
547 1 equemene
      Do WHILE (Cafaire(IndAFaire).ne.0)
548 1 equemene
         IAt0=Cafaire(IndAfaire)
549 1 equemene
         if (debug) WRITE(*,*) "IndAFaire,IAt0,Lies_CF(IAt0,0)", &
550 1 equemene
              IndAFaire,IAt0,Lies_CF(IAt0,0)
551 1 equemene
         if (Lies_CF(IAt0,0).ge.1) THEN
552 1 equemene
!     IAt0 est l'atome pour lequel on construit la couche suivante
553 1 equemene
!     le premier atome lie est particulier car il definit l'orientation
554 1 equemene
!     de ce fragment
555 1 equemene
            IAti=Lies_CF(IAt0,1)
556 1 equemene
      WRITE(IOOUT,*) 'IAti:',IAti
557 1 equemene
            IAtd=IAt0
558 1 equemene
      WRITE(IOOUT,*) 'IAtd:',IAtd
559 1 equemene
            IAtv=Lies_CP(IAt0,1)
560 1 equemene
      WRITE(IOOUT,*) 'IAtv:',IAtv
561 1 equemene
            IIAtdh=1
562 1 equemene
            IAtdh=Lies_CF(IAtv,IIatdh)
563 1 equemene
            DO WHILE (Iatdh.eq.IAt0)
564 1 equemene
               IIatdh=IIatdh+1
565 1 equemene
               IAtdh=Lies_CF(IAtv,IIatdh)
566 1 equemene
            END DO
567 1 equemene
            IF (IAtdh.eq.0) IAtdh=Lies_CP(IAtv,1)
568 1 equemene
      WRITE(IOOUT,*) 'IAtdh:',IAtdh
569 1 equemene
            IF (ListAt(IAti).AND.(.NOT.DejaFait(IAti))) THEN
570 1 equemene
               Izm=Izm+1
571 1 equemene
               if (debug) WRITE(*,*) 'izm,IAti,IAtd,IAtv,IAtdh', &
572 1 equemene
                    izm,IAti,IAtd,IAtv,IAtdh
573 1 equemene
               Call AddLigne(Izm,IAti,IAtd,IAtv,IAtdh, &
574 1 equemene
                    ind_zmat,val_zmat ,x,y,z)
575 1 equemene
               DejaFait(IAti)=.TRUE.
576 1 equemene
            END IF
577 1 equemene
578 1 equemene
            CAfaire(IndFin)=Lies_CF(IAt0,1)
579 1 equemene
            IndFin=IndFin+1
580 1 equemene
!     Le traitement des autres est plus facile
581 1 equemene
            IAtdh=Lies_CF(IAt0,1)
582 1 equemene
            DO IAta=2,Lies_CF(IAt0,0)
583 1 equemene
               IAtI=Lies_CF(IAt0,IAta)
584 1 equemene
               CAfaire(IndFin)=IAtI
585 1 equemene
               IndFin=IndFin+1
586 1 equemene
587 1 equemene
               IF (ListAt(IAti).AND.(.NOT.DejaFait(IAti))) THEN
588 1 equemene
                  Izm=Izm+1
589 1 equemene
                  Call AddLigne(Izm,IAti,IAtd,IAtv,IAtdh,ind_zmat &
590 1 equemene
                       ,val_zmat,x,y,z)
591 1 equemene
                  DejaFait(IAti)=.TRUE.
592 1 equemene
               END IF
593 1 equemene
            END DO
594 1 equemene
            CAfaire(IndFin)=0
595 1 equemene
         END IF
596 1 equemene
         IndAFaire=IndAFaire+1
597 1 equemene
         if (debug) WRITE(IOOUT,*) "IndAfaire,CaFaire:",IndAfaire, &
598 1 equemene
            CaFaire
599 1 equemene
      END DO
600 1 equemene
601 1 equemene
602 1 equemene
!     On a fini de creer la molecule autour du premier atome 'centre'
603 1 equemene
!     Pour les autres c'est presque id... sauf que les axes sont deja fixes
604 1 equemene
!     On pourrait imaginer de mettre des atomes fictifs pour redefinir des axes
605 1 equemene
!     locaux... dans une autre version
606 1 equemene
!     V2.0
607 1 equemene
 9753 FFirst=.FALSE.
608 1 equemene
      if (debug) THEN
609 1 equemene
         WRITE(*,*) 'NbAt0r',NbAt0r,AtCP0
610 1 equemene
      END IF
611 1 equemene
      DO I=1,NbAt0r
612 1 equemene
!     Boucle pour trouver celui qui a le plus d'atomes CF
613 1 equemene
         IdAt0=0
614 1 equemene
         VCF=-1
615 1 equemene
         DO ICP0=1,NbAt0
616 1 equemene
            if (AtCP0(ICP0).NE.0) THEN
617 1 equemene
               ICat=AtCP0(ICP0)
618 1 equemene
               if (Lies_CF(ICAt,0).gt.VCF) THEN
619 1 equemene
                  IdAt0=ICat
620 1 equemene
                  IdxAt0=ICP0
621 1 equemene
                  VCF=Lies_CF(ICAt,0)
622 1 equemene
               END IF
623 1 equemene
            END IF
624 1 equemene
         END DO
625 1 equemene
         AtCP0(IdxAt0)=0
626 1 equemene
627 1 equemene
         IF (debug) WRITE(*,*) 'Adding fragment centered on ',IdAt0, &
628 1 equemene
              LIAISONS(IdAt0,0)
629 1 equemene
         IF (debug) WRITE(*,*) 'Center linked to ',Lies_CF(IdAt0,0), &
630 1 equemene
              ' atoms'
631 1 equemene
!     if (LIAISONS(IdAt0,0).EQ.0) goto 12345
632 1 equemene
633 1 equemene
         if (debug) THEN
634 1 equemene
            WRITE(IOOUT,*) 'LIAISONS tralala',nbcycle
635 1 equemene
            DO IAt=1,na
636 1 equemene
               WRITE(IOOUT,1003) iat,(LIAISONS(Iat,Jat),Jat=0,NMaxL)
637 1 equemene
            END DO
638 1 equemene
         END IF
639 1 equemene
 1003    FORMAT(1X,I5,' - ',12(I5))
640 1 equemene
!     Boucle pour voir quel est l'atome du fragment precedent qui est le plus
641 1 equemene
!     proche de celui ci
642 1 equemene
!     Rq: si ce sont des cycles lies, il pourrait etre malin de rechercher
643 1 equemene
!     a quoi il etait lie.
644 1 equemene
         norm2=1.e6
645 1 equemene
         Idx=0
646 1 equemene
         DO ICAt=1,Izm
647 1 equemene
            CALL vecteur(Idat0,ind_zmat(icat,1),x,y,z,vx1,vy1,vz1 &
648 1 equemene
                 ,norm1)
649 1 equemene
            if (norm2.ge.norm1) THEN
650 1 equemene
               norm2=norm1
651 1 equemene
               Idx=Icat
652 1 equemene
            END IF
653 1 equemene
         END DO
654 1 equemene
         IF (debug) WRITE(*,*) 'Link between fragments ',IdAt0, &
655 1 equemene
              ind_zmat(Idx,1), ' -- Idx=',Idx
656 1 equemene
657 1 equemene
! Despite the fact that this atom has officialy no CP atom
658 1 equemene
! we add one into its list; the one just found
659 1 equemene
         Lies_CP(IdAt0,0)=Lies_CP(IdAt0,0)+1
660 1 equemene
         Lies_CP(Idat0,Lies_CP(IdAt0,0))= ind_zmat(Idx,1)
661 1 equemene
         Lies_CP(Idat0,Lies_CP(IdAt0,0)+1)=0
662 1 equemene
663 1 equemene
664 1 equemene
!     on a l'indice... on va rajouter cet atome a la liste !
665 1 equemene
         izm=izm+1
666 1 equemene
         n1=ind_zmat(Idx,1)
667 1 equemene
!     Petit probleme si Idx<=2
668 1 equemene
         IF (Idx.EQ.1) THEN
669 1 equemene
!     Pb non negligeable ...
670 1 equemene
            IF (izm.ge.2) THEN
671 1 equemene
               IAtv=ind_zmat(2,1)
672 1 equemene
               IAtdh=ind_zmat(3,1)
673 1 equemene
            ELSE
674 1 equemene
               WRITE(*,*) '2 frag, le 1er a moins de 2 atomes..'
675 1 equemene
               WRITE(*,*) "J'ai merde... "
676 1 equemene
               STOP
677 1 equemene
            END IF
678 1 equemene
         ELSEIF (Idx.EQ.2) THEN
679 1 equemene
            IAtv=1
680 1 equemene
            IF (izm.ge.2) THEN
681 1 equemene
               IAtdh=ind_zmat(3,1)
682 1 equemene
            ELSE
683 1 equemene
               WRITE(*,*) '2 frag, le 1er a moins de 2 atomes...'
684 1 equemene
               WRITE(*,*) "J'ai merde... "
685 1 equemene
               STOP
686 1 equemene
            END IF
687 1 equemene
         ELSE
688 1 equemene
            IAtv=ind_zmat(Idx,2)
689 1 equemene
            IAtdh=ind_zmat(Idx,3)
690 1 equemene
         END IF
691 1 equemene
692 1 equemene
!     WRITE(*,*) "Outchilou IAtv, IAtdh", IAtv, IAtdh,n1
693 1 equemene
         CALL vecteur(n1,IdAt0,x,y,z,vx1,vy1,vz1,norm1)
694 1 equemene
         CALL vecteur(n1,IAtv,x,y,z,vx2,vy2,vz2,norm2)
695 1 equemene
         val=angle(vx1,vy1,vz1,norm1, &
696 1 equemene
              vx2,vy2,vz2,norm2)
697 1 equemene
         if (debug) WRITE(*,*) 'Angle val:1',IdAt0,n1,IAtv,val
698 1 equemene
         if ((abs(val).LE.10.).OR.(abs(pi-val).le.10.)) THEN
699 1 equemene
            IAtv=IAtdh
700 1 equemene
!     Ceci pose pb si Idx<=3... a traiter plus tard
701 1 equemene
            IF (Idx.ge.3) THEN
702 1 equemene
               IAtdh=ind_zmat(Idx,4)
703 1 equemene
            ELSE
704 1 equemene
               if (izm.ge.4) THEN
705 1 equemene
                  IAtdh=4
706 1 equemene
               ELSE
707 1 equemene
                  WRITE(*,*) 'Pb Angle Val+idx=3+izm<=4'
708 1 equemene
                  STOP
709 1 equemene
               END IF
710 1 equemene
            END IF
711 1 equemene
         END IF
712 1 equemene
         Call AddLigne(Izm,IdAt0,ind_zmat(Idx,1),IAtv,IAtdh, &
713 1 equemene
              ind_zmat,val_zmat,x,y,z)
714 1 equemene
         DejaFait(IdAt0)=.TRUE.
715 1 equemene
716 1 equemene
         IndFin=1
717 1 equemene
         IAtd=IdAt0
718 1 equemene
         n1=IAtdh
719 1 equemene
         IAtdh=IAtv
720 1 equemene
         IAtv=ind_zmat(Idx,1)
721 1 equemene
!     On ajoute les atomes lies a cet atome dans la liste a faire
722 1 equemene
         Do iaf=1,Lies_CF(IdAt0,0)
723 1 equemene
            IatI=Lies_CF(IdAt0,Iaf)
724 1 equemene
!     We check that this atom is not the one that is the closest to
725 1 equemene
!     the center atom
726 1 equemene
            if (IAtv.Ne.IAtI) THEN
727 1 equemene
               IF (debug) WRITE(*,*) 'Adding atom',IAtI, &
728 1 equemene
                    'to CAFaire in pos',iaf
729 1 equemene
               CAfaire(IndFin)=IAtI
730 1 equemene
               IndFin=IndFin+1
731 1 equemene
!     On les ajoute aussi dans la zmat
732 1 equemene
               If (ListAt(IAtI).AND.(.NOT.DejaFait(IatI))) THEN
733 1 equemene
                  izm=izm+1
734 1 equemene
       WRITE(*,*) "Outchili IAtv, IAtdh,IAtI", IAtv, IAtdh,IAtI
735 1 equemene
                  CALL vecteur(IAtI,IAtD,x,y,z,vx1,vy1,vz1,norm1)
736 1 equemene
                  CALL vecteur(IAtI,IAtv,x,y,z,vx2,vy2,vz2,norm2)
737 1 equemene
                  val=angle(vx1,vy1,vz1,norm1, vx2,vy2,vz2,norm2)
738 1 equemene
                  if (debug) &
739 1 equemene
                       WRITE(*,*) 'Angle val:2',IAtI,IAtD,IAtv,val
740 1 equemene
                  if ((abs(val).LE.10.).OR. &
741 1 equemene
                       (abs(180.-abs(val)).le.10.)) THEN
742 1 equemene
                     Call AddLigne(Izm,IAtI,IAtv,IAtdh,n1, &
743 1 equemene
                          ind_zmat,val_zmat,x,y,z)
744 1 equemene
                     DejaFait(Iati)=.TRUE.
745 1 equemene
                  ELSE
746 1 equemene
                     Call AddLigne(Izm,IAtI,IAtD,IAtv,IAtdh, &
747 1 equemene
                          ind_zmat,val_zmat,x,y,z)
748 1 equemene
                     DejaFait(Iati)=.TRUE.
749 1 equemene
                  END IF
750 1 equemene
               END IF
751 1 equemene
            END IF
752 1 equemene
         END DO
753 1 equemene
         CAfaire(IndFin)=0
754 1 equemene
755 1 equemene
!     On traite le reste de ce fragment !!
756 1 equemene
         IndAFaire=1
757 1 equemene
         WRITE(IOOUT,*) CaFaire
758 1 equemene
         Do WHILE (Cafaire(IndAFaire).ne.0)
759 1 equemene
            IAt0=Cafaire(IndAfaire)
760 1 equemene
            if (Lies_CF(IAt0,0).ge.1) THEN
761 1 equemene
!     IAt0 est l'atome pour lequel on construit la couche suivante
762 1 equemene
!     le premier atome lie est particulier car il definit l'orientation
763 1 equemene
!     de ce fragment
764 1 equemene
               Itmp=1
765 1 equemene
               IAti=Lies_CF(IAt0,Itmp)
766 1 equemene
               DO WHILE (DejaFait(IAti).AND. &
767 1 equemene
                    (Itmp.Le.Lies_CF(IAt0,0)))
768 1 equemene
                  Itmp=Itmp+1
769 1 equemene
                  IAti=Lies_CF(IAt0,ITmp)
770 1 equemene
               END DO
771 1 equemene
               If (ListAt(IAtI).AND.(.NOT.DejaFait(IatI))) THEN
772 1 equemene
                  IF (debug) WRITE(IOOUT,*) 'IAti:',IAti
773 1 equemene
                  IAtd=IAt0
774 1 equemene
                  IF (debug)     WRITE(IOOUT,*) 'IAtd:',IAtd
775 1 equemene
                  IAtv=Lies_CP(IAt0,1)
776 1 equemene
                  IF (debug)     WRITE(IOOUT,*) 'IAtv:',IAtv
777 1 equemene
                  IIAtdh=1
778 1 equemene
                  IAtdh=Lies_CF(IAtv,IIatdh)
779 1 equemene
                  DO WHILE (Iatdh.eq.IAt0)
780 1 equemene
                     IIatdh=IIatdh+1
781 1 equemene
                     IAtdh=Lies_CF(IAtv,IIatdh)
782 1 equemene
                  END DO
783 1 equemene
                  IF (IAtdh.eq.0) IAtdh=Lies_CP(IAtv,1)
784 1 equemene
                  IF (debug) WRITE(IOOUT,*) 'IAtdh:',IAtdh
785 1 equemene
                  Izm=Izm+1
786 1 equemene
                  Call AddLigne(Izm,IAti,IAtd,IAtv,IAtdh, &
787 1 equemene
                       ind_zmat,val_zmat,x,y,z)
788 1 equemene
                     DejaFait(Iati)=.TRUE.
789 1 equemene
!     Le traitement des autres est plus facile
790 1 equemene
                  IAtdh=Lies_CF(IAt0,ITmp)
791 1 equemene
                  DO IAta=ITmp+1,Lies_CF(IAt0,0)
792 1 equemene
                     IAtI=Lies_CF(IAt0,IAta)
793 1 equemene
                     If (ListAt(IAtI).AND.(.NOT.DejaFait(IatI))) &
794 1 equemene
                          THEN
795 1 equemene
                        Izm=Izm+1
796 1 equemene
                        Call AddLigne(Izm,IAti,IAtd,IAtv,IAtdh, &
797 1 equemene
                             ind_zmat,val_zmat,x,y,z)
798 1 equemene
                        DejaFait(Iati)=.TRUE.
799 1 equemene
                     END IF
800 1 equemene
                  END DO
801 1 equemene
               END IF
802 1 equemene
803 1 equemene
!     On ajoute les atomes lies a cet atome dans la liste a faire
804 1 equemene
               Do iaf=1,Lies_CF(IAt0,0)
805 1 equemene
                  CAfaire(IndFin)=Lies_CF(IAt0,Iaf)
806 1 equemene
                  IndFin=IndFin+1
807 1 equemene
               END DO
808 1 equemene
               CAfaire(IndFin)=0
809 1 equemene
            END IF
810 1 equemene
            IndAFaire=IndAFaire+1
811 1 equemene
         END DO
812 1 equemene
12345    CONTINUE
813 1 equemene
      END DO
814 1 equemene
815 1 equemene
      WRITE(*,*) 'TOTOTOTOTOTOTOTOT'
816 1 equemene
817 1 equemene
      if (debug) THEN
818 1 equemene
         WRITE(*,*) 'ind_zmat'
819 1 equemene
         DO I=1,na
820 1 equemene
            WRITE(*,'(1X,5I5)') (ind_zmat(i,j),j=1,5)
821 1 equemene
         END DO
822 1 equemene
      END IF
823 1 equemene
824 1 equemene
      IndFin=1
825 1 equemene
      DO I=1,Izm0
826 1 equemene
         Iat=ind_zmat(I,1)
827 1 equemene
         Do iaf=1,Lies_CF(Iat,0)
828 1 equemene
            IIat=Lies_CF(Iat,iaf)
829 1 equemene
            if (ListAt(iIAt).AND. &
830 1 equemene
                 (.NOT.DejaFait(iIAt)))  THEN
831 1 equemene
               IAti=IIat
832 1 equemene
               WRITE(IOOUT,*) 'IAti:',IAti
833 1 equemene
               IAtd=IAt0
834 1 equemene
               WRITE(IOOUT,*) 'IAtd:',IAtd
835 1 equemene
               IAtv=Lies_CP(IAt0,1)
836 1 equemene
               WRITE(IOOUT,*) 'IAtv:',IAtv
837 1 equemene
               IIAtdh=1
838 1 equemene
               IAtdh=Lies_CF(IAtv,IIatdh)
839 1 equemene
               DO WHILE (Iatdh.eq.IAt0)
840 1 equemene
                  IIatdh=IIatdh+1
841 1 equemene
                  IAtdh=Lies_CF(IAtv,IIatdh)
842 1 equemene
               END DO
843 1 equemene
               IF (IAtdh.eq.0) IAtdh=Lies_CP(IAtv,1)
844 1 equemene
               WRITE(IOOUT,*) 'IAtdh:',IAtdh
845 1 equemene
               IF (ListAt(IAti).AND.(.NOT.DejaFait(IAti))) THEN
846 1 equemene
                  Izm=Izm+1
847 1 equemene
                  if (debug) WRITE(*,*) 'izm,IAti,IAtd,IAtv,IAtdh', &
848 1 equemene
                       izm,IAti,IAtd,IAtv,IAtdh
849 1 equemene
                  Call AddLigne(Izm,IAti,IAtd,IAtv,IAtdh, &
850 1 equemene
                       ind_zmat,val_zmat ,x,y,z)
851 1 equemene
                  DejaFait(IAti)=.TRUE.
852 1 equemene
                  CaFaire(IndFin)=iIat
853 1 equemene
                  IndFin=IndFin+1
854 1 equemene
               END IF
855 1 equemene
            END IF
856 1 equemene
         END DO
857 1 equemene
      END DO
858 1 equemene
      CAfaire(IndFin)=0
859 1 equemene
860 1 equemene
      if (debug) WRITE(IOOUT,*) "CaFaire:",CaFaire
861 1 equemene
862 1 equemene
      if (debug) WRITE(*,*) 'DBG ZmatBuil - Toto'
863 1 equemene
      if (debug) THEN
864 1 equemene
         WRITE(*,*) 'ind_zmat'
865 1 equemene
         DO I=1,na
866 1 equemene
            WRITE(*,'(1X,5I5)') (ind_zmat(i,j),j=1,5)
867 1 equemene
         END DO
868 1 equemene
      END IF
869 1 equemene
870 1 equemene
!     on a cree la premiere couche autour du premier centre
871 1 equemene
!     reste a finir les autres couches
872 1 equemene
      IndAFaire=1
873 1 equemene
      if (debug) WRITE(IOOUT,*) "CaFaire:",CaFaire
874 1 equemene
      Do WHILE (Cafaire(IndAFaire).ne.0)
875 1 equemene
         IAt0=Cafaire(IndAfaire)
876 1 equemene
         if (debug) WRITE(*,*) "IndAFaire,IAt0,Lies_CF(IAt0,0)", &
877 1 equemene
              IndAFaire,IAt0,Lies_CF(IAt0,0)
878 1 equemene
         if (Lies_CF(IAt0,0).ge.1) THEN
879 1 equemene
!     IAt0 est l'atome pour lequel on construit la couche suivante
880 1 equemene
!     le premier atome lie est particulier car il definit l'orientation
881 1 equemene
!     de ce fragment
882 1 equemene
            IAti=Lies_CF(IAt0,1)
883 1 equemene
      WRITE(IOOUT,*) 'IAti:',IAti
884 1 equemene
            IAtd=IAt0
885 1 equemene
      WRITE(IOOUT,*) 'IAtd:',IAtd
886 1 equemene
            IAtv=Lies_CP(IAt0,1)
887 1 equemene
      WRITE(IOOUT,*) 'IAtv:',IAtv
888 1 equemene
            IIAtdh=1
889 1 equemene
            IAtdh=Lies_CF(IAtv,IIatdh)
890 1 equemene
            DO WHILE (Iatdh.eq.IAt0)
891 1 equemene
               IIatdh=IIatdh+1
892 1 equemene
               IAtdh=Lies_CF(IAtv,IIatdh)
893 1 equemene
            END DO
894 1 equemene
            IF (IAtdh.eq.0) IAtdh=Lies_CP(IAtv,1)
895 1 equemene
      WRITE(IOOUT,*) 'IAtdh:',IAtdh
896 1 equemene
            IF (ListAt(IAti).AND.(.NOT.DejaFait(IAti))) THEN
897 1 equemene
               Izm=Izm+1
898 1 equemene
               if (debug) WRITE(*,*) 'izm,IAti,IAtd,IAtv,IAtdh', &
899 1 equemene
                    izm,IAti,IAtd,IAtv,IAtdh
900 1 equemene
               Call AddLigne(Izm,IAti,IAtd,IAtv,IAtdh, &
901 1 equemene
                    ind_zmat,val_zmat ,x,y,z)
902 1 equemene
               DejaFait(IAti)=.TRUE.
903 1 equemene
            END IF
904 1 equemene
905 1 equemene
            CAfaire(IndFin)=Lies_CF(IAt0,1)
906 1 equemene
            IndFin=IndFin+1
907 1 equemene
!     Le traitement des autres est plus facile
908 1 equemene
            IAtdh=Lies_CF(IAt0,1)
909 1 equemene
            DO IAta=2,Lies_CF(IAt0,0)
910 1 equemene
               IAtI=Lies_CF(IAt0,IAta)
911 1 equemene
               CAfaire(IndFin)=IAtI
912 1 equemene
               IndFin=IndFin+1
913 1 equemene
914 1 equemene
               IF (ListAt(IAti).AND.(.NOT.DejaFait(IAti))) THEN
915 1 equemene
                  IF (debug) &
916 1 equemene
         WRITE(*,*) 'DBG ZmatBuil Toto adding',Iati,Izm
917 1 equemene
                  Izm=Izm+1
918 1 equemene
                  Call AddLigne(Izm,IAti,IAtd,IAtv,IAtdh,ind_zmat &
919 1 equemene
                       ,val_zmat,x,y,z)
920 1 equemene
                  DejaFait(IAti)=.TRUE.
921 1 equemene
               END IF
922 1 equemene
            END DO
923 1 equemene
            CAfaire(IndFin)=0
924 1 equemene
         END IF
925 1 equemene
         IndAFaire=IndAFaire+1
926 1 equemene
         if (debug) WRITE(IOOUT,*) "Toto IndAfaire,CaFaire:",IndAfaire, &
927 1 equemene
            CaFaire
928 1 equemene
      END DO
929 1 equemene
930 1 equemene
931 1 equemene
      if (debug) THEN
932 1 equemene
         WRITE(*,*) 'ind_zmat'
933 1 equemene
         DO I=1,na
934 1 equemene
            WRITE(*,'(1X,5I5)') (ind_zmat(i,j),j=1,5)
935 1 equemene
         END DO
936 1 equemene
      END IF
937 1 equemene
938 1 equemene
      END