Statistiques
| Révision :

root / src / Calc_zmat_constr_frag.f90 @ 4

Historique | Voir | Annoter | Télécharger (66,97 ko)

1 1 equemene
SUBROUTINE Calc_Zmat_const_frag(na,atome,ind_zmat,val_zmat,x,y,z, &
2 1 equemene
     r_cov,fact,frozen)
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
  Use Path_module, only : max_Z, NMaxL, Nom,MaxFroz
13 1 equemene
  Use Io_module
14 1 equemene
15 1 equemene
  IMPLICIT NONE
16 1 equemene
17 1 equemene
18 1 equemene
  CHARACTER(5) :: AtName
19 1 equemene
  integer(KINT) :: na,atome(na),ind_zmat(Na,5)
20 1 equemene
  INTEGER(KINT) :: idx_zmat(NA)
21 1 equemene
  real(KREAL) ::  x(Na),y(Na),z(Na),fact
22 1 equemene
  real(KREAL) ::  val_zmat(Na,3)
23 1 equemene
  real(KREAL) :: r_cov(0:Max_Z)
24 1 equemene
  !     Frozen contains the indices of frozen atoms
25 1 equemene
  INTEGER(KINT) :: Frozen(*),NFroz
26 1 equemene
  INTEGER(KINT), ALLOCATABLE :: FrozDist(:) ! na
27 1 equemene
  INTEGER(KINT) :: NbFrag,IdxFrag
28 1 equemene
  INTEGER(KINT), ALLOCATABLE :: Fragment(:),NbAtFrag(:) !na
29 1 equemene
  INTEGER(KINT), ALLOCATABLE :: FragAt(:,:) !na,na
30 1 equemene
  INTEGER(KINT), ALLOCATABLE :: FrozFrag(:,:) !na,3
31 1 equemene
  !  INTEGER(KINT), ALLOCATABLE :: IdxFragAt(:) !na
32 1 equemene
  INTEGER(KINT), ALLOCATABLE :: FrozBlock(:,:) !(na,0:na)
33 1 equemene
  REAL(KREAL), ALLOCATABLE :: DistFroz(:) !na
34 1 equemene
35 1 equemene
  INTEGER(KINT) :: IdxCaFaire, IAfaire
36 1 equemene
  INTEGER(KINT), ALLOCATABLE ::  LIAISONS(:,:) ! (Na,0:NMaxL)
37 1 equemene
  INTEGER(KINT), ALLOCATABLE ::  LiaisonsBis(:,:) ! (Na,0:NMaxL)
38 1 equemene
  INTEGER(KINT), ALLOCATABLE ::  LiaisonsIni(:,:) ! (Na,0:NMaxL)
39 1 equemene
  INTEGER(KINT), ALLOCATABLE :: CAFaire(:) ! (Na)
40 1 equemene
41 1 equemene
42 1 equemene
  real(KREAL) ::  vx1,vy1,vz1,norm1
43 1 equemene
  real(KREAL) ::  vx2,vy2,vz2,norm2
44 1 equemene
  real(KREAL) ::  vx3,vy3,vz3,norm3
45 1 equemene
  real(KREAL) ::  vx4,vy4,vz4,norm4
46 1 equemene
  real(KREAL) ::  vx5,vy5,vz5,norm5
47 1 equemene
  real(KREAL) ::  val,val_d, d12, d13,d23,d
48 1 equemene
  Logical PasFini,Debug
49 1 equemene
  LOGICAL, ALLOCATABLE :: DejaFait(:), FCaf(:) !(na)
50 1 equemene
  Logical, ALLOCATABLE ::  FrozAt(:)    !T if this atom is frozen
51 1 equemene
  LOGICAL F1213, F1223,F1323
52 1 equemene
53 1 equemene
54 1 equemene
  INTEGER(KINT) :: I,J,n0,n1,n2,n3,n4,IAt,IL,JL,IFrag,ITmp, K, KMax
55 1 equemene
  INTEGER(KINT) :: IMax, I3,I1,Ip, IFragFroz
56 1 equemene
  INTEGER(KINT) :: I0, Izm, JAt,Izm0
57 1 equemene
58 1 equemene
  REAL(KREAL) :: sDihe, Pi
59 1 equemene
60 1 equemene
  INTERFACE
61 1 equemene
     function valid(string) result (isValid)
62 1 equemene
       CHARACTER(*), intent(in) :: string
63 1 equemene
       logical                  :: isValid
64 1 equemene
     END function VALID
65 1 equemene
66 1 equemene
     FUNCTION angle(v1x,v1y,v1z,norm1,v2x,v2y,v2z,norm2)
67 1 equemene
       use Path_module, only :  Pi,KINT, KREAL
68 1 equemene
       real(KREAL) ::  v1x,v1y,v1z,norm1
69 1 equemene
       real(KREAL) ::  v2x,v2y,v2z,norm2
70 1 equemene
       real(KREAL) ::  angle
71 1 equemene
     END FUNCTION ANGLE
72 1 equemene
73 1 equemene
     FUNCTION SinAngle(v1x,v1y,v1z,norm1,v2x,v2y,v2z,norm2)
74 1 equemene
       use Path_module, only :  Pi,KINT, KREAL
75 1 equemene
       real(KREAL) ::  v1x,v1y,v1z,norm1
76 1 equemene
       real(KREAL) ::  v2x,v2y,v2z,norm2
77 1 equemene
       real(KREAL) ::  SinAngle
78 1 equemene
     END FUNCTION SINANGLE
79 1 equemene
80 1 equemene
81 1 equemene
     FUNCTION angle_d(v1x,v1y,v1z,norm1,v2x,v2y,v2z,norm2,v3x,v3y,v3z,norm3)
82 1 equemene
       use Path_module, only :  Pi,KINT, KREAL
83 1 equemene
       real(KREAL) ::  v1x,v1y,v1z,norm1
84 1 equemene
       real(KREAL) ::  v2x,v2y,v2z,norm2
85 1 equemene
       real(KREAL) ::  v3x,v3y,v3z,norm3
86 1 equemene
       real(KREAL) ::  angle_d,ca,sa
87 1 equemene
     END FUNCTION ANGLE_D
88 1 equemene
89 1 equemene
  END INTERFACE
90 1 equemene
91 1 equemene
92 1 equemene
93 1 equemene
  Pi=dacos(-1.d0)
94 1 equemene
  debug=valid("calc_zmat_constr").OR.valid("calc_zmat_contr_frag")
95 1 equemene
96 1 equemene
  if (debug) WRITE(*,*) "=============================== Entering Calc_zmat_contr_frag ========================"
97 1 equemene
  if (na.le.2) THEN
98 1 equemene
     WRITE(*,*) "I do not work for less than 2 atoms :-p"
99 1 equemene
     RETURN
100 1 equemene
  END IF
101 1 equemene
102 1 equemene
  ALLOCATE(FrozDist(Na),Fragment(na), NbAtFrag(na),FragAt(na,na))
103 1 equemene
  !  ALLOCATE(FrozFrag(na,3), IdxFragAt(na), FrozBlock(na,0:na))
104 1 equemene
  ALLOCATE(FrozFrag(na,3), FrozBlock(na,0:na))
105 1 equemene
  ALLOCATE(DistFroz(na),Liaisons(na,0:NMaxL))
106 1 equemene
  ALLOCATE(LiaisonsBis(na,0:NMaxL),LiaisonsIni(na,0:NMaxL))
107 1 equemene
  ALLOCATE(CaFaire(na),DejaFait(Na),FCaf(na),FrozAt(na))
108 1 equemene
109 1 equemene
  DO i=1,na
110 1 equemene
     DO J=1,5
111 1 equemene
        Ind_Zmat(i,J)=0
112 1 equemene
     END DO
113 1 equemene
  END DO
114 1 equemene
115 1 equemene
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
116 1 equemene
!
117 1 equemene
!     Easy case : 3 or less atoms
118 1 equemene
!
119 1 equemene
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
120 1 equemene
  if (Na.eq.3) THEN
121 1 equemene
     d12=sqrt((x(1)-x(2))**2+(y(1)-y(2))**2+(z(1)-z(2))**2)
122 1 equemene
     d13=sqrt((x(1)-x(3))**2+(y(1)-y(3))**2+(z(1)-z(3))**2)
123 1 equemene
     d23=sqrt((x(3)-x(2))**2+(y(3)-y(2))**2+(z(3)-z(2))**2)
124 1 equemene
     F1213=(d12<=d13)
125 1 equemene
     F1323=(d13<=d23)
126 1 equemene
     F1223=(d12<=d23)
127 1 equemene
     if (debug) THEN
128 1 equemene
        WRITE(*,*) "DEBUG Calc_Zmat 3 atoms"
129 1 equemene
        WRITE(*,*) "d12,d13,d23:",d12,d13,d23
130 1 equemene
        WRITE(*,*) "F1213,F1323,F1223:",F1213,F1323,F1223
131 1 equemene
     END IF
132 1 equemene
     if (F1213) THEN
133 1 equemene
        if (F1323) THEN
134 1 equemene
           ind_zmat(1,1)=3
135 1 equemene
           ind_zmat(2,1)=1
136 1 equemene
           ind_zmat(2,2)=3
137 1 equemene
           ind_zmat(3,1)=2
138 1 equemene
           ind_zmat(3,2)=1
139 1 equemene
           ind_zmat(3,3)=3
140 1 equemene
        ELSE
141 1 equemene
           ind_zmat(1,1)=1
142 1 equemene
           ind_zmat(2,1)=2
143 1 equemene
           ind_zmat(2,2)=1
144 1 equemene
           ind_zmat(3,1)=3
145 1 equemene
           ind_zmat(3,2)=2
146 1 equemene
           ind_zmat(3,3)=1
147 1 equemene
        END IF
148 1 equemene
     ELSE
149 1 equemene
        IF (F1223) THEN
150 1 equemene
           ind_zmat(1,1)=2
151 1 equemene
           ind_zmat(2,1)=1
152 1 equemene
           ind_zmat(2,2)=2
153 1 equemene
           ind_zmat(3,1)=3
154 1 equemene
           ind_zmat(3,2)=1
155 1 equemene
           ind_zmat(3,3)=2
156 1 equemene
        ELSE
157 1 equemene
           ind_zmat(1,1)=2
158 1 equemene
           ind_zmat(2,1)=3
159 1 equemene
           ind_zmat(2,2)=2
160 1 equemene
           ind_zmat(3,1)=1
161 1 equemene
           ind_zmat(3,2)=3
162 1 equemene
           ind_zmat(3,3)=2
163 1 equemene
        END IF
164 1 equemene
     END IF
165 1 equemene
     IF (debug) THEN
166 1 equemene
        DO i=1,na
167 1 equemene
           WRITE(*,'(1X,5(1X,I5))') (ind_zmat(i,j),j=1,5)
168 1 equemene
        END DO
169 1 equemene
     END IF
170 1 equemene
171 1 equemene
     !     We have ind_zmat, we fill val_zmat
172 1 equemene
     val_zmat(1,1)=0.
173 1 equemene
     val_zmat(1,2)=0.
174 1 equemene
     val_zmat(1,3)=0.
175 1 equemene
     n2=ind_zmat(2,1)
176 1 equemene
     n1=ind_zmat(2,2)
177 1 equemene
     d=sqrt((x(n1)-x(n2))**2+(y(n1)-y(n2))**2+(z(n1)-z(n2))**2)
178 1 equemene
     val_zmat(2,1)=d
179 1 equemene
     val_zmat(2,2)=0.
180 1 equemene
     val_zmat(2,3)=0.
181 1 equemene
     n1=ind_zmat(3,1)
182 1 equemene
     n2=ind_zmat(3,2)
183 1 equemene
     n3=ind_zmat(3,3)
184 1 equemene
     CALL vecteur(n2,n1,x,y,z,vx1,vy1,vz1,norm1)
185 1 equemene
     if (debug) write(*,*) n1,n2,norm1
186 1 equemene
     val_zmat(3,1)=norm1
187 1 equemene
188 1 equemene
     CALL vecteur(n2,n3,x,y,z,vx2,vy2,vz2,norm2)
189 1 equemene
     val=angle(vx1,vy1,vz1,norm1,vx2,vy2,vz2,norm2)
190 1 equemene
     if (debug) write(*,*) n2,n3,norm2,val
191 1 equemene
     val_zmat(3,2)=val
192 1 equemene
     val_zmat(3,3)=0.
193 1 equemene
194 1 equemene
     RETURN
195 1 equemene
  END IF
196 1 equemene
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
197 1 equemene
!
198 1 equemene
!  End of   Easy case : 3 or less atoms
199 1 equemene
!
200 1 equemene
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
201 1 equemene
!
202 1 equemene
! General Case
203 1 equemene
!
204 1 equemene
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
205 1 equemene
!
206 1 equemene
! 1 - Frozen Atoms
207 1 equemene
208 1 equemene
! Initialization
209 1 equemene
  DejaFait=.False.
210 1 equemene
  FrozAt=.False.
211 1 equemene
  Liaisons=0
212 1 equemene
  LiaisonsBis=0
213 1 equemene
  ind_zmat=0
214 1 equemene
  val_zmat=0.d0
215 1 equemene
216 1 equemene
  NFroz=0
217 1 equemene
  I=1
218 1 equemene
  DO WHILE (Frozen(I).NE.0)
219 1 equemene
     If (Frozen(I).LT.0) THEN
220 1 equemene
        DO J=Frozen(I-1),abs(Frozen(I))
221 1 equemene
           IF (.NOT.FrozAt(J)) THEN
222 1 equemene
              NFroz=NFroz+1
223 1 equemene
              FrozAt(J)=.TRUE.
224 1 equemene
           END IF
225 1 equemene
        END DO
226 1 equemene
     ELSEIF (.NOT.FrozAt(Frozen(I))) THEN
227 1 equemene
        FrozAt(Frozen(I))=.TRUE.
228 1 equemene
        NFroz=NFroz+1
229 1 equemene
     END IF
230 1 equemene
  I=I+1
231 1 equemene
  END DO
232 1 equemene
233 1 equemene
  if (debug) WRITE(*,*) 'DGB zmtc NFroz=', NFroz
234 1 equemene
  if (debug) WRITE(*,*) 'DGB zmtc FrozAt=',(FrozAt(I),I=1,na)
235 1 equemene
236 1 equemene
  if (debug) THEN
237 1 equemene
     WRITE(*,*) "Liaisons initialized"
238 1 equemene
     WRITE(*,*) 'Covalent radii used'
239 1 equemene
     DO iat=1,na
240 1 equemene
        i=atome(iat)
241 1 equemene
        WRITE(*,*) Nom(I),Iat,r_cov(i),r_cov(i)*fact
242 1 equemene
     END DO
243 1 equemene
  END IF
244 1 equemene
245 1 equemene
1003 FORMAT(1X,I4,' - ',25(I5))
246 1 equemene
  !     DO IL=1,na
247 1 equemene
  !     WRITE(IOOUT,1003) Il,(LIAISONS(IL,JL),JL=0,NMaxL)
248 1 equemene
  !     WRITE(IOOUT,1003) Il,(LIAISONSBis(IL,JL),JL=0,NMaxL)
249 1 equemene
  !     END DO
250 1 equemene
!   First step : connectivity  are calculated
251 1 equemene
252 1 equemene
  Call CalcCnct(na,atome,x,y,z,LIAISONS,r_cov,fact)
253 1 equemene
254 1 equemene
  if (debug) THEN
255 1 equemene
     WRITE(*,*) "Connections calculated"
256 1 equemene
     DO IL=1,na
257 1 equemene
        WRITE(IOOUT,1003) Il,(LIAISONS(IL,JL),JL=0,NMaxL)
258 1 equemene
     END DO
259 1 equemene
  END IF
260 1 equemene
261 1 equemene
  FCaf=.TRUE.
262 1 equemene
  Call Decomp_frag(na,liaisons,FCaf,nbfrag,Fragment,NbAtFrag,FragAt)
263 1 equemene
264 1 equemene
  IF (debug) THEN
265 1 equemene
     WRITE(*,*) 'I found ',NbFrag, 'fragments'
266 1 equemene
     WRITE(*,'(20(1X,I4))') (NbAtFrag(I),I=1,NbFrag)
267 1 equemene
     DO I=1,NbFrag
268 1 equemene
        WRITE(*,*) NbAtFrag(I)
269 1 equemene
        WRITE(*,*) 'Fragment ', i
270 1 equemene
        DO J=1,Na
271 1 equemene
           IF (Fragment(J).EQ.I)   THEN
272 4 pfleura2
            if (FrozAt(J))    THEN
273 1 equemene
                   WRITE(*,'(1X,I3,"f",1X,A5,3(1X,F10.6))') J,Nom(Atome(J)) &
274 1 equemene
                        ,X(J),Y(J),Z(J)
275 1 equemene
               ELSE
276 1 equemene
                    WRITE(*,'(1X,I3,2X,A5,3(1X,F10.6))') J,Nom(Atome(J)) &
277 1 equemene
                      ,X(J),Y(J),Z(J)
278 1 equemene
                END IF
279 4 pfleura2
       END IF
280 1 equemene
        END DO
281 1 equemene
        WRITE(*,*) "FragAt:",(FragAt(I,j),j=1,NbAtFrag(I))
282 1 equemene
     END DO
283 1 equemene
  END IF
284 1 equemene
285 1 equemene
286 1 equemene
! First, we decompose the connectivity into Frozen atoms and non frozen atoms
287 1 equemene
  DO I=1,na
288 1 equemene
     LiaisonsBis(I,0)=0
289 1 equemene
     DO J=1,Liaisons(I,0)
290 1 equemene
        IF (FrozAt(Liaisons(I,J))) THEN
291 1 equemene
           LiaisonsBis(I,0)=LiaisonsBis(I,0)+1
292 1 equemene
           LiaisonsBis(I,LiaisonsBis(I,0))=Liaisons(I,J)
293 1 equemene
        END IF
294 1 equemene
     END DO
295 1 equemene
     IMax=LiaisonsBis(I,0)+1
296 1 equemene
     LiaisonsBis(I,Imax)=0
297 1 equemene
     DO J=1,Liaisons(I,0)
298 1 equemene
        IF (.NOT.FrozAt(Liaisons(I,J))) THEN
299 1 equemene
           LiaisonsBis(I,IMax)=LiaisonsBis(I,Imax)+1
300 1 equemene
           LiaisonsBis(I,LiaisonsBis(I,Imax)+Imax)=Liaisons(I,J)
301 1 equemene
        END IF
302 1 equemene
     END DO
303 1 equemene
  END DO
304 1 equemene
305 1 equemene
  if (debug) THEN
306 1 equemene
     WRITE(*,*) "Liaisons and LiaisonsBis"
307 1 equemene
     DO I=1,Na
308 1 equemene
        WRITE(*,'(1X,I3," -",I3,":",15(1X,I3))') I, &
309 1 equemene
             (Liaisons(I,J),J=0,NMaxL)
310 1 equemene
        WRITE(*,'(1X,I3," +",I3,":",15(1X,I3))') I, &
311 1 equemene
             (LiaisonsBis(I,J),J=0,NMaxL)
312 1 equemene
     END DO
313 1 equemene
  END IF
314 1 equemene
315 1 equemene
! Now, for each frozen atom, we count the length of the frozen block
316 1 equemene
! FrozBlock(I,0) contains the number of frozen atoms forming a frozen
317 1 equemene
!                fragment containing atom I
318 1 equemene
! FrozBlock(I,:) is the list of the frozen atoms of this fragment.
319 1 equemene
  Do I=1,na
320 1 equemene
     FrozBlock(I,0)=-1
321 1 equemene
  END DO
322 1 equemene
  DO I=1,na
323 1 equemene
     IF (FrozAt(I).AND.(FrozBlock(I,0).EQ.-1)) THEN
324 1 equemene
        if (debug) WRITE(*,*) 'Treating atom ',I
325 1 equemene
        FrozBlock(I,0)=1
326 1 equemene
        FrozBlock(I,1)=I
327 1 equemene
        DO J=1,na
328 1 equemene
           DejaFait(J)=.FALSE.
329 1 equemene
        END DO
330 1 equemene
        DejaFait(I)=.TRUE.
331 1 equemene
        DO J=1,LiaisonsBis(I,0)
332 1 equemene
           CaFaire(J)=LiaisonsBis(I,J)
333 1 equemene
        END DO
334 1 equemene
        IdxCaFaire=LiaisonsBis(I,0)+1
335 1 equemene
        CaFaire(IdxCaFaire)=0
336 1 equemene
        IAfaire=1
337 1 equemene
        FCaf=DejaFait
338 1 equemene
        DO WHILE (CaFaire(IAfaire).NE.0)
339 1 equemene
           Iat=CaFaire(IAFAire)
340 1 equemene
           if (debug) WRITE(*,*) 'IaFaire; Iat:', IaFaire, Iat, DejaFait(Iat)
341 1 equemene
           IF (.NOT.DejaFait(Iat)) THEN
342 1 equemene
              FrozBlock(I,0)=FrozBlock(I,0)+1
343 1 equemene
              FrozBlock(I,FrozBlock(I,0))=Iat
344 1 equemene
              DO J=1,LiaisonsBis(Iat,0)
345 1 equemene
                 IF ((.NOT.DejaFait(LiaisonsBis(Iat,J))).AND.(.NOT.FCaf(LiaisonsBis(Iat,J)))) THEN
346 1 equemene
                    CaFaire(IdxCaFaire)=LiaisonsBis(Iat,J)
347 1 equemene
                    IdxCaFaire=IdxCaFaire+1
348 1 equemene
                    CaFaire(IdxCaFaire)=0
349 1 equemene
                    FCaf(LiaisonsBis(Iat,J))=.TRUE.
350 1 equemene
                 END IF
351 1 equemene
              END DO
352 1 equemene
              !     WRITE(*,*) 'liaisonbis(Iat,0),FrozBlick(I,0)',&
353 1 equemene
              !                      LiaisonsBis(Iat,0), FrozBlock(I,0)
354 1 equemene
           END IF
355 1 equemene
           DejaFait(Iat)=.TRUE.
356 1 equemene
           IaFaire=IaFaire+1
357 1 equemene
        END DO
358 1 equemene
        if (debug) WRITE(*,*) 'I,FrozBlock(0),IaFaire',I,FrozBlock(I,0),IaFaire
359 1 equemene
        if (debug) WRITE(*,*) 'FrozBlock:',FrozBlock(I,1:FrozBlock(I,0))
360 1 equemene
        !        FrozBlock(I,1)=I
361 1 equemene
        !        DO J=2,IaFaire
362 1 equemene
        !           FrozBlock(I,J)=CaFaire(J-1)
363 1 equemene
        !        END DO
364 1 equemene
        !     We copy this block into all frozen atoms that belongs to it
365 1 equemene
        DO J=2,Frozblock(I,0)
366 1 equemene
           Iat=FrozBlock(I,J)
367 1 equemene
           DO K=0,FrozBlock(I,0)
368 1 equemene
              FrozBlock(Iat,K)=FrozBlock(I,K)
369 1 equemene
           END DO
370 1 equemene
        END DO
371 1 equemene
     ELSE
372 1 equemene
        IF (.NOT.FrozAt(I))      FrozBlock(I,0)=0
373 1 equemene
     END IF
374 1 equemene
  END DO
375 1 equemene
376 1 equemene
  if (debug) THEN
377 1 equemene
     WRITE(*,*) "FrozBlock"
378 1 equemene
     DO I=1,Na
379 1 equemene
        If (FrozAt(I))  WRITE(*,'(1X,I3," -",I3,":",15(1X,I3))') I, &
380 1 equemene
             (FrozBlock(I,J),J=0,FrozBlock(I,0))
381 1 equemene
     END DO
382 1 equemene
  END IF
383 1 equemene
384 1 equemene
  DO I=1,NbFrag
385 1 equemene
     FrozFrag(I,1)=0
386 1 equemene
     FrozFrag(I,2)=0
387 1 equemene
     DO J=1,NbAtFrag(I)
388 1 equemene
        IF (FrozAt(FragAt(I,J))) THEN
389 1 equemene
           FrozFrag(I,1)=FrozFrag(I,1)+1
390 1 equemene
           IF (FrozBlock(FragAt(I,J),0).GE.FrozFrag(I,2))  &
391 1 equemene
                FrozFrag(I,2)=FrozBlock(FragAt(I,J),0)
392 1 equemene
           if (FrozFrag(I,3).LE.LiaisonsBis(FragAt(I,J),0))&
393 1 equemene
                FrozFrag(I,3)=LiaisonsBis(FragAt(I,J),0)
394 1 equemene
        END IF
395 1 equemene
     END DO
396 1 equemene
     IF (debug) WRITE(*,*) 'Frag :',I,FrozFrag(I,1), &
397 1 equemene
          ' frozen atoms,max linked:'  &
398 1 equemene
          ,FrozFrag(I,2),' with at most',FrozFrag(I,3),' frozen'
399 1 equemene
  END DO
400 1 equemene
401 1 equemene
  !     We will now build the molecule fragment by fragment
402 1 equemene
  !     First the frozen atoms, then the rest of the fragment
403 1 equemene
  !     We choose the starting fragment with two criteria:
404 1 equemene
  !     1- Number of linked frozen atoms:
405 1 equemene
  !       * >=3 is good as it fully defines the coordinate space
406 1 equemene
  !       * 2 is ok as we can either use a 3rd atom from the same fragment
407 1 equemene
  !       or add a X atom somewhere but this complicates quite a lot the way
408 1 equemene
  !       to treat the conversion from cartesian to zmat latter
409 1 equemene
  !       * 1 is bad...
410 1 equemene
  !     2- Max number of linked frozen atoms
411 1 equemene
  !     this allows us to deal more easily with cases 1- when number of
412 1 equemene
  !     directly linked frozen atoms is less than 3
413 1 equemene
414 1 equemene
  IFrag=0
415 1 equemene
  I0=0
416 1 equemene
  I1=0
417 1 equemene
  DO I=1,NbFrag
418 1 equemene
     SELECT CASE(FrozFrag(I,3)-I0)
419 1 equemene
     CASE (1:)
420 1 equemene
        IFrag=I
421 1 equemene
        I0=FrozFrag(I,3)
422 1 equemene
        I1=FrozFrag(I,2)
423 1 equemene
     CASE (0)
424 1 equemene
        if (FrozFrag(I,2).GT.I1) THEN
425 1 equemene
           IFrag=I
426 1 equemene
           I0=FrozFrag(I,3)
427 1 equemene
           I1=FrozFrag(I,2)
428 1 equemene
        END IF
429 1 equemene
     END SELECT
430 1 equemene
  END DO
431 1 equemene
432 1 equemene
  if (debug) WRITE(*,'(1X,A,I5,A,I5,A,I5,A)') 'Starting with fragment:',IFrag,' with ',I0,' frozen linked and overall',I1,' linked'
433 1 equemene
434 1 equemene
  !     We will build the first fragment in a special way, as it will
435 1 equemene
  !     set the coordinates system
436 1 equemene
  !     We look for the frozen atom that is linked to the maximum frozen atom,
437 1 equemene
  !     and belongs to the longer fragment
438 1 equemene
  I0=0
439 1 equemene
  I1=0
440 1 equemene
  DO I=1,NbAtFrag(IFrag)
441 1 equemene
     IF (FrozAt(FragAt(IFrag,I))) THEN
442 1 equemene
        SELECT CASE(LiaisonsBis(FragAt(IFrag,I),0)-I0)
443 1 equemene
        CASE (1:)
444 1 equemene
           IAt=FragAt(IFrag,I)
445 1 equemene
           I0=LiaisonsBis(IAt,0)
446 1 equemene
           I1=FrozBlock(IAt,0)
447 1 equemene
        CASE (0)
448 1 equemene
           IF (FrozBlock(FragAt(IFrag,I),0).GT.I1) THEN
449 1 equemene
              IAt=FragAt(IFrag,I)
450 1 equemene
              I0=LiaisonsBis(Iat,0)
451 1 equemene
              I1=FrozBlock(Iat,0)
452 1 equemene
           END IF
453 1 equemene
        END SELECT
454 1 equemene
     END IF
455 1 equemene
     if (debug) WRITE(*,*) 'DBG: I,FragAt(IFrag,I),IAt,I0,I1',I,FragAt(IFrag,I),IAt,I0,I1
456 1 equemene
  END DO
457 1 equemene
458 1 equemene
  if (debug) WRITE(*,*) 'Fragment 1, starting with atom:',IAt,I0,I1
459 1 equemene
460 1 equemene
  DO I=1,na
461 1 equemene
     DejaFait(I)=.FALSE.
462 1 equemene
     FCaf(I)=.FALSE.
463 1 equemene
  END DO
464 1 equemene
465 1 equemene
  izm=0
466 1 equemene
  SELECT CASE (I0)
467 1 equemene
  CASE(3:)
468 1 equemene
     if (debug) WRITE(*,*) 'DBG select case I0 3'
469 1 equemene
     n0=Iat
470 1 equemene
     !     We search for the fourth atom while making sure that the dihedral angle
471 1 equemene
     !     is not 0 or Pi
472 1 equemene
     ITmp=2
473 1 equemene
     sDihe=0.
474 1 equemene
     n2=IAt
475 1 equemene
     n3=LiaisonsBis(Iat,1)
476 1 equemene
     ! We search for the third atom while making sure that it is not aligned with first two !
477 1 equemene
     DO While ((ITmp.LE.LiaisonsBis(Iat,0)).AND.(sDihe.LE.0.09d0))
478 1 equemene
        n4=LiaisonsBis(Iat,Itmp)
479 1 equemene
        CALL vecteur(n2,n3,x,y,z,vx2,vy2,vz2,norm2)
480 1 equemene
        CALL vecteur(n3,n4,x,y,z,vx3,vy3,vz3,norm3)
481 1 equemene
        val_d=angle(vx3,vy3,vz3,norm3,vx2,vy2,vz2,norm2)
482 1 equemene
        sDiHe=abs(sin(val_d*pi/180.d0))
483 1 equemene
        if (debug) Write(*,*) 'Trying n2,n3,n4,sdihe,val_d',n2,n3,n4,sdihe,val_d
484 1 equemene
        Itmp=Itmp+1
485 1 equemene
     END DO
486 1 equemene
     If (debug) WRITE(*,*) 'Itmp,LiaisonsBis',Itmp,LiaisonsBis(Iat,1:NMaxL)
487 1 equemene
     LiaisonsBis(Iat,Itmp-1)=LiaisonsBis(iat,2)
488 1 equemene
     LiaisonsBis(Iat,2)=n4
489 1 equemene
     If (debug) WRITE(*,*) 'Itmp,LiaisonsBis',Itmp,LiaisonsBis(Iat,1:NMaxL)
490 1 equemene
491 1 equemene
     if (sDihe.LE.0.09d0) THEN
492 1 equemene
        WRITE(*,*) "Dans le caca car tous les atoms de ce block sont align?s!"
493 1 equemene
     END IF
494 1 equemene
495 1 equemene
     CALL produit_vect(vx3,vy3,vz3,norm3,vx2,vy2,vz2,norm2, &
496 1 equemene
          vx5,vy5,vz5,norm5)
497 1 equemene
498 1 equemene
499 1 equemene
     Itmp=2
500 1 equemene
     sDiHe=0.
501 1 equemene
502 1 equemene
     DO While ((ITmp.LT.LiaisonsBis(Iat,0)).AND.(sDihe.LE.0.09d0))
503 1 equemene
        ITmp=ITmp+1
504 1 equemene
        n1=LiaisonsBis(Iat,Itmp)
505 1 equemene
        if (debug) WRITe(*,*) 'trying n1,n2,n3,n4',n1,n2,n3,n4
506 1 equemene
        CALL vecteur(n2,n1,x,y,z,vx1,vy1,vz1,norm1)
507 1 equemene
        ! Is this atom aligned with n2-n3 ?
508 1 equemene
        val_d=angle(vx1,vy1,vz1,norm1,vx2,vy2,vz2,norm2)
509 1 equemene
        sDiHe=abs(sin(val_d*pi/180.d0))
510 1 equemene
        if (debug) Write(*,*) 'Angle n3-n2-n1',val_d
511 1 equemene
        if (sDiHe.le.0.09d0) THEN
512 1 equemene
           ! As atoms n2,n3 and n4 are not aligned, we interchange n3 and n4 so that n1,n2 and n3 are not aligned
513 1 equemene
           if (debug) WRITE(*,*) "n3-n2-n1 aligned, we interchange n3 and n4"
514 1 equemene
           n1=n3
515 1 equemene
           n3=n4
516 1 equemene
           n4=n1
517 1 equemene
           n1=LiaisonsBis(Iat,ITmp)
518 1 equemene
           CALL vecteur(n2,n3,x,y,z,vx2,vy2,vz2,norm2)
519 1 equemene
           CALL vecteur(n2,n4,x,y,z,vx3,vy3,vz3,norm3)
520 1 equemene
           val_d=angle(vx1,vy1,vz1,norm1,vx2,vy2,vz2,norm2)
521 1 equemene
           if (debug) Write(*,*) 'NEW Angle n3-n2-n1',val_d
522 1 equemene
        END IF
523 1 equemene
524 1 equemene
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
525 1 equemene
        ! avant de tester l'angle diedre, il faut verifier que ce 4e atome n'est pas
526 1 equemene
        ! aligne avec les 2 premiers.
527 1 equemene
        ! comme on a deja test? que les 3 premiers ne sont pas alignes,
528 1 equemene
        ! s'il est align? avec les 2 premiers, on peut inverser le role de 2 et 3.
529 1 equemene
        ! On pourrait tout simplier en faisant une bete recherche parmi tous les atomes geles
530 1 equemene
        ! de ce bloc (au moins 4 ?) avec le critere 1) on les range par distance croissante
531 1 equemene
        ! 2) on les scanne tant que l'angle valence n'est pas bon, puis tant que diehedre pas bon
532 1 equemene
        ! puis les atomes des autres fragment par distance croissante.
533 1 equemene
        ! les autres fragments ne seraient additonn?s que si l'on ne trouve pas notre bonheur dans le premier bloc
534 1 equemene
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
535 1 equemene
536 1 equemene
        CALL produit_vect(vx1,vy1,vz1,norm1,vx2,vy2,vz2,norm2, &
537 1 equemene
             vx4,vy4,vz4,norm4)
538 1 equemene
        val_d=angle_d(vx4,vy4,vz4,norm4,vx5,vy5,vz5,norm5, &
539 1 equemene
             vx2,vy2,vz2,norm2)
540 1 equemene
        sDihe=abs(sin(val_d*pi/180.d0))
541 1 equemene
        if (debug) WRITE(*,*) 'n2,n3,n4,n1, angle_d',n2,n3,n4,n1,val_d
542 1 equemene
     END DO
543 1 equemene
544 1 equemene
     DejaFait(n2)=.TRUE.
545 1 equemene
     DejaFait(n3)=.TRUE.
546 1 equemene
     DejaFait(n4)=.TRUE.
547 1 equemene
548 1 equemene
     if (sDihe.LE.0.09d0) THEN
549 1 equemene
        !     None of the frozen atoms linked to IAt are good to define the third
550 1 equemene
        !     direction in space...
551 1 equemene
        !     We will look at the other frozen atoms
552 1 equemene
        !     we might improve the search so as to take the atom closest to IAt
553 1 equemene
        if (debug) WRITE(*,*) "All atoms linked to ",Iat," are in a plane. Looking for other frozen atoms"
554 1 equemene
        ITmp=0
555 1 equemene
        DO I=1,NbAtFrag(IFrag)
556 1 equemene
           JAt=FragAt(IFrag,I)
557 1 equemene
           if (FrozAt(Jat).AND.(.NOT.DejaFait(JAt))) THEN
558 1 equemene
              n1=JAt
559 1 equemene
              CALL vecteur(n2,n1,x,y,z,vx1,vy1,vz1,norm1)
560 1 equemene
              CALL produit_vect(vx1,vy1,vz1,norm1,vx2,vy2,vz2,norm2, &
561 1 equemene
                   vx4,vy4,vz4,norm4)
562 1 equemene
              val_d=angle_d(vx4,vy4,vz4,norm4, &
563 1 equemene
                   vx5,vy5,vz5,norm5, &
564 1 equemene
                   vx2,vy2,vz2,norm2)
565 1 equemene
              if (abs(sin(val_d)).GE.0.09D0) THEN
566 1 equemene
                 ITmp=ITmp+1
567 1 equemene
                 DistFroz(ITmp)=Norm1
568 1 equemene
                 FrozDist(ITmp)=JAt
569 1 equemene
              END IF
570 1 equemene
           END IF
571 1 equemene
        END DO
572 1 equemene
        IF (ITmp.EQ.0) THEN
573 1 equemene
           !     All dihedral angles between frozen atoms are less than 5?
574 1 equemene
           !     (or more than 175?). We have to look at other fragments :-(
575 1 equemene
           DO I=1,NFroz
576 1 equemene
              Jat=Frozen(I)
577 1 equemene
              if (.NOT.DejaFait(JAt)) THEN
578 1 equemene
                 n1=JAt
579 1 equemene
                 CALL vecteur(n2,n1,x,y,z,vx1,vy1,vz1,norm1)
580 1 equemene
                 CALL produit_vect(vx1,vy1,vz1,norm1, &
581 1 equemene
                      vx2,vy2,vz2,norm2, &
582 1 equemene
                      vx4,vy4,vz4,norm4)
583 1 equemene
                 val_d=angle_d(vx4,vy4,vz4,norm4, &
584 1 equemene
                      vx5,vy5,vz5,norm5, &
585 1 equemene
                      vx2,vy2,vz2,norm2)
586 1 equemene
                 if (abs(sin(val_d)).GE.0.09D0) THEN
587 1 equemene
                    ITmp=ITmp+1
588 1 equemene
                    DistFroz(ITmp)=Norm1
589 1 equemene
                    FrozDist(ITmp)=JAt
590 1 equemene
                 END IF
591 1 equemene
              END IF
592 1 equemene
           END DO
593 1 equemene
           IF (ITmp.EQ.0) THEN
594 1 equemene
              !     All frozen atoms are in a plane... too bad
595 1 equemene
              WRITE(*,*) 'ERROR: It seems that all frozen atoms are in a plane'
596 1 equemene
              WRITE(*,*) 'For now, I do not treat this case'
597 1 equemene
              STOP
598 1 equemene
           END IF
599 1 equemene
        END IF
600 1 equemene
        I1=0
601 1 equemene
        d=1e9
602 1 equemene
        DO I=1,ITmp
603 1 equemene
           IF (DistFroz(I).LE.d) THEN
604 1 equemene
              d=DistFroz(I)
605 1 equemene
              I1=FrozDist(I)
606 1 equemene
           END IF
607 1 equemene
        END DO
608 1 equemene
     ELSE                !(sDihe.LE.0.09d0)
609 1 equemene
        I1=FrozBlock(IAt,ITmp)
610 1 equemene
        if (debug) WRITE(*,*) 'I1,n1:',I1,n1
611 1 equemene
     END IF                 !(sDihe.LE.0.09d0)
612 1 equemene
     !     we now have the atom that is closer to the first one and that
613 1 equemene
     !     forms a non 0/Pi dihedral angle
614 1 equemene
615 1 equemene
     ind_zmat(1,1)=n2
616 1 equemene
     ind_zmat(2,1)=n3
617 1 equemene
     ind_zmat(2,2)=n2
618 1 equemene
     ind_zmat(3,1)=n4
619 1 equemene
     ind_zmat(3,2)=n2
620 1 equemene
     ind_zmat(3,3)=n3
621 1 equemene
     DejaFait(n2)=.TRUE.
622 1 equemene
     DejaFait(n3)=.TRUE.
623 1 equemene
     DejaFait(n4)=.TRUE.
624 1 equemene
     CaFaire(1)=n3
625 1 equemene
     CaFaire(2)=n4
626 1 equemene
627 1 equemene
     ind_zmat(4,1)=I1
628 1 equemene
     ind_zmat(4,2)=n2
629 1 equemene
     ind_zmat(4,3)=n3
630 1 equemene
     ind_zmat(4,4)=n4
631 1 equemene
     DejaFait(I1)=.TRUE.
632 1 equemene
     CaFaire(3)=I1
633 1 equemene
     CaFaire(4)=0
634 1 equemene
     IdxCaFaire=4
635 1 equemene
636 1 equemene
     FCaf(n2)=.TRUE.
637 1 equemene
     FCaf(n3)=.TRUE.
638 1 equemene
     FCaf(I1)=.TRUE.
639 1 equemene
     izm=4
640 1 equemene
     DO I=3,LiaisonsBis(Iat,0)
641 1 equemene
        IF (.NOT.DejaFait(LiaisonsBis(Iat,I))) THEN
642 1 equemene
           izm=izm+1
643 1 equemene
           !           ind_zmat(izm,1)=LiaisonsBis(Iat,I)
644 1 equemene
           !           ind_zmat(izm,2)=n2
645 1 equemene
           !           ind_zmat(izm,3)=n3
646 1 equemene
           !           ind_zmat(izm,4)=n4
647 1 equemene
           Call add2indzmat(na,izm,LiaisonsBis(Iat,I),n2,n3,n4,ind_zmat,x,y,z)
648 1 equemene
           IF (.NOT.FCaf(LiaisonsBis(Iat,I))) THEN
649 1 equemene
              CaFaire(IdxCaFaire)=LiaisonsBis(Iat,I)
650 1 equemene
              IdxCaFaire=IdxCaFaire+1
651 1 equemene
              CaFaire(IdxCaFaire)=0
652 1 equemene
              FCaf(LiaisonsBis(Iat,I))=.TRUE.
653 1 equemene
           END IF
654 1 equemene
           DejaFait(LiaisonsBis(Iat,I))=.TRUE.
655 1 equemene
        END IF
656 1 equemene
     END DO
657 1 equemene
658 1 equemene
     if (debug) THEN
659 1 equemene
        WRITE(*,*) "Ind_zmat 0 - SELECT CASE I0 3: -- izm=",izm
660 1 equemene
        WRITE(*,'(1X,4(1X,I5))') ind_zmat(1,1)
661 1 equemene
        WRITE(*,'(1X,4(1X,I5))') ind_zmat(2,1), ind_zmat(2,2)
662 1 equemene
        WRITE(*,'(1X,4(1X,I5))') ind_zmat(3,1), ind_zmat(3,2), ind_zmat(3,3)
663 1 equemene
        DO I=4,izm
664 1 equemene
           WRITE(*,'(1X,4(1X,I5))') ind_zmat(I,1), ind_zmat(I,2),  &
665 1 equemene
                ind_zmat(I,3), ind_zmat(I,4)
666 1 equemene
        END DO
667 1 equemene
     END IF
668 1 equemene
669 1 equemene
670 1 equemene
     !     First four atoms (at least) have been put we go on with next parts
671 1 equemene
     !     of this fragment... later
672 1 equemene
673 1 equemene
674 1 equemene
  CASE(2)
675 1 equemene
     if (debug) WRITE(*,*) 'DBG select case I0 2'
676 1 equemene
     if (debug) WRITE(*,*) 'ATTENTION For now, case with only 3 frozen atoms non treated'
677 1 equemene
     ind_zmat(1,1)=IAt
678 1 equemene
     ind_zmat(2,1)=liaisonsBis(IAt,1)
679 1 equemene
     ind_zmat(2,2)=IAt
680 1 equemene
     ind_zmat(3,1)=LiaisonsBis(IAt,2)
681 1 equemene
     ind_zmat(3,2)=IAt
682 1 equemene
     ind_zmat(3,3)=LiaisonsBis(IAt,1)
683 1 equemene
     DejaFait(IAt)=.TRUE.
684 1 equemene
     DejaFait(LiaisonsBis(Iat,1))=.TRUE.
685 1 equemene
     DejaFait(LiaisonsBis(Iat,2))=.TRUE.
686 1 equemene
     CaFaire(1)=LiaisonsBis(Iat,1)
687 1 equemene
     CaFaire(2)=LiaisonsBis(Iat,2)
688 1 equemene
     FCaf(LiaisonsBis(Iat,1))=.TRUE.
689 1 equemene
     FCaf(LiaisonsBis(Iat,2))=.TRUE.
690 1 equemene
691 1 equemene
     !     We search for a fourth atom, first in the FrozBlock atoms
692 1 equemene
     ITmp=2
693 1 equemene
     sDihe=0.
694 1 equemene
     n2=IAt
695 1 equemene
     n3=LiaisonsBis(Iat,1)
696 1 equemene
     n4=LiaisonsBis(Iat,2)
697 1 equemene
     CALL vecteur(n2,n3,x,y,z,vx2,vy2,vz2,norm2)
698 1 equemene
     CALL vecteur(n3,n4,x,y,z,vx3,vy3,vz3,norm3)
699 1 equemene
     CALL produit_vect(vx3,vy3,vz3,norm3, &
700 1 equemene
          vx2,vy2,vz2,norm2, &
701 1 equemene
          vx5,vy5,vz5,norm5)
702 1 equemene
703 1 equemene
     DO While ((ITmp.LE.FrozBlock(Iat,0)).AND.(sDihe.LE.0.09d0))
704 1 equemene
        ITmp=ITmp+1
705 1 equemene
        n1=FrozBlock(Iat,Itmp)
706 1 equemene
        CALL vecteur(n2,n1,x,y,z,vx1,vy1,vz1,norm1)
707 1 equemene
        CALL produit_vect(vx1,vy1,vz1,norm1, &
708 1 equemene
             vx2,vy2,vz2,norm2, &
709 1 equemene
             vx4,vy4,vz4,norm4)
710 1 equemene
        val_d=angle_d(vx4,vy4,vz4,norm4,  &
711 1 equemene
             vx5,vy5,vz5,norm5,           &
712 1 equemene
             vx2,vy2,vz2,norm2)
713 1 equemene
        sDihe=abs(sin(val_d))
714 1 equemene
     END DO
715 1 equemene
     IF (debug) WRITE(*,*) 'DBG 4th atom, ITmp, sDihe',ITmp, sDihe
716 1 equemene
     if (sDihe.LE.0.09d0) THEN
717 1 equemene
        !     None of the frozen atoms linked to IAt are good to define the third
718 1 equemene
        !     direction in space...
719 1 equemene
        !     We will look at the other frozen atoms
720 1 equemene
        !     we might improve the search so as to take the atom closest to IAt
721 1 equemene
        ITmp=0
722 1 equemene
        DO I=1,NbAtFrag(IFrag)
723 1 equemene
           JAt=FragAt(IFrag,I)
724 1 equemene
           if (FrozAt(Jat).AND.(.NOT.DejaFait(JAt))) THEN
725 1 equemene
              n1=JAt
726 1 equemene
              CALL vecteur(n2,n1,x,y,z,vx1,vy1,vz1,norm1)
727 1 equemene
              CALL produit_vect(vx1,vy1,vz1,norm1,  &
728 1 equemene
                   vx2,vy2,vz2,norm2,               &
729 1 equemene
                   vx4,vy4,vz4,norm4)
730 1 equemene
              val_d=angle_d(vx4,vy4,vz4,norm4,    &
731 1 equemene
                   vx5,vy5,vz5,norm5,              &
732 1 equemene
                   vx2,vy2,vz2,norm2)
733 1 equemene
              if (abs(sin(val_d)).GE.0.09D0) THEN
734 1 equemene
                 ITmp=ITmp+1
735 1 equemene
                 DistFroz(ITmp)=Norm1
736 1 equemene
                 FrozDist(ITmp)=JAt
737 1 equemene
              END IF
738 1 equemene
           END IF
739 1 equemene
        END DO
740 1 equemene
        IF (ITmp.EQ.0) THEN
741 1 equemene
           !     All dihedral angles between frozen atoms are less than 5?
742 1 equemene
           !     (or more than 175?). We have to look at other fragments :-(
743 1 equemene
           DO I=1,NFroz
744 1 equemene
              Jat=Frozen(I)
745 1 equemene
              if (.NOT.DejaFait(JAt)) THEN
746 1 equemene
                 n1=JAt
747 1 equemene
                 CALL vecteur(n2,n1,x,y,z,vx1,vy1,vz1,norm1)
748 1 equemene
                 CALL produit_vect(vx1,vy1,vz1,norm1,   &
749 1 equemene
                      vx2,vy2,vz2,norm2,                 &
750 1 equemene
                      vx4,vy4,vz4,norm4)
751 1 equemene
                 val_d=angle_d(vx4,vy4,vz4,norm4,       &
752 1 equemene
                      vx5,vy5,vz5,norm5,                 &
753 1 equemene
                      vx2,vy2,vz2,norm2)
754 1 equemene
                 if (abs(sin(val_d)).GE.0.09D0) THEN
755 1 equemene
                    ITmp=ITmp+1
756 1 equemene
                    DistFroz(ITmp)=Norm1
757 1 equemene
                    FrozDist(ITmp)=JAt
758 1 equemene
                 END IF
759 1 equemene
              END IF
760 1 equemene
           END DO
761 1 equemene
           IF (ITmp.EQ.0) THEN
762 1 equemene
              !     All frozen atoms are in a plane... too bad
763 1 equemene
              WRITE(*,*) 'ERROR: It seems that all frozen atoms are in a plane'
764 1 equemene
              WRITE(*,*) 'For now, I do not treat this case'
765 1 equemene
              STOP
766 1 equemene
           END IF
767 1 equemene
        END IF
768 1 equemene
        I1=0
769 1 equemene
        d=1e9
770 1 equemene
        DO I=1,ITmp
771 1 equemene
           IF (DistFroz(I).LE.d) THEN
772 1 equemene
              d=DistFroz(I)
773 1 equemene
              I1=FrozDist(I)
774 1 equemene
           END IF
775 1 equemene
        END DO
776 1 equemene
     ELSE                   !(sDihe.LE.0.09d0)
777 1 equemene
        I1=FrozBlock(IAt,ITmp)
778 1 equemene
     END IF                 !(sDihe.LE.0.09d0)
779 1 equemene
     !     we now have the atom that is closer to the first one and that
780 1 equemene
     !     forms a non 0/Pi dihedral angle
781 1 equemene
     !     ind_zmat(4,1)=I1
782 1 equemene
     !     ind_zmat(4,2)=IAt
783 1 equemene
     !     ind_zmat(4,3)=LiaisonsBis(Iat,1)
784 1 equemene
     !     ind_zmat(4,4)=LiaisonsBis(Iat,2)
785 1 equemene
     n3=LiaisonsBis(Iat,1)
786 1 equemene
     n4=LiaisonsBis(Iat,2)
787 1 equemene
     Call add2indzmat(na,4,I1,Iat,n3,n4,ind_zmat,x,y,z)
788 1 equemene
     LiaisonsBis(Iat,1)=n3
789 1 equemene
     LiaisonsBis(Iat,2)=n4
790 1 equemene
     DejaFait(I1)=.TRUE.
791 1 equemene
     CaFaire(3)=I1
792 1 equemene
     CaFaire(4)=0
793 1 equemene
     IdxCaFaire=4
794 1 equemene
     izm=4
795 1 equemene
     FCaf(I1)=.TRUE.
796 1 equemene
797 1 equemene
  CASE(1)
798 1 equemene
     if (debug) WRITE(*,*) 'DBG select case I0 1'
799 1 equemene
     ind_zmat(1,1)=IAt
800 1 equemene
     ind_zmat(2,1)=liaisonsBis(IAt,1)
801 1 equemene
     ind_zmat(2,2)=IAt
802 1 equemene
     DejaFait(IAt)=.TRUE.
803 1 equemene
     DejaFait(LiaisonsBis(Iat,1))=.TRUE.
804 1 equemene
     IdxCaFaire=2
805 1 equemene
     CaFaire(1)=LiaisonsBis(Iat,1)
806 1 equemene
     CaFaire(2)=0
807 1 equemene
     FCaf(LiaisonsBis(Iat,1))=.TRUE.
808 1 equemene
809 1 equemene
     !     We search for a third and fourth atoms, first in the FrozBlock atoms
810 1 equemene
     !     It should not be possible to have   (FrozBlock(Iat,0).GT.2) and
811 1 equemene
     !     iat linked to only one atom !
812 1 equemene
813 1 equemene
     IF (FrozBlock(Iat,0).GT.2) THEN
814 1 equemene
        WRITE(*,*) 'I found some inconsistancy: IAt linked to 1'
815 1 equemene
        WRITE(*,*) 'Atom only, but belongs to a frozblock of at '
816 1 equemene
        WRITE(*,*) 'least 3 atoms. IAt, FrozBlock'
817 1 equemene
        WRITE(*,*) Iat,(FrozBlock(IAt,J),J=0,FrozBlock(Iat,0))
818 1 equemene
        STOP
819 1 equemene
     END IF
820 1 equemene
821 1 equemene
     !     we calculate the distances between Iat and all other frozen
822 1 equemene
     !     atoms of this fragment, and store only those for which
823 1 equemene
     !     valence angles are not too close to 0/Pi. (limit:5?)
824 1 equemene
825 1 equemene
     ITmp=0
826 1 equemene
     CALL vecteur(LiaisonsBis(Iat,1),IAt,x,y,z,vx2,vy2,vz2,norm2)
827 1 equemene
828 1 equemene
     DO I=1,NbAtFrag(IFrag)
829 1 equemene
        JAt=FragAt(IFrag,I)
830 1 equemene
        if (FrozAt(Jat).AND.(.NOT.DejaFait(JAt))) THEN
831 1 equemene
           CALL vecteur(JAt,IAt,x,y,z,vx1,vy1,vz1,norm1)
832 1 equemene
           if (abs(cos(angle(vx1,vy1,vz1,norm1,  &
833 1 equemene
                vx2,vy2,vz2,norm2))).LE.0.996d0) THEN
834 1 equemene
              ITmp=ITmp+1
835 1 equemene
              DistFroz(ITmp)=Norm1
836 1 equemene
              FrozDist(ITmp)=JAt
837 1 equemene
           END IF
838 1 equemene
        END IF
839 1 equemene
     END DO
840 1 equemene
841 1 equemene
     IF (ITMP.EQ.0) THEN
842 1 equemene
        !     We have no frozen atoms correct in this fragment, we use
843 1 equemene
        !     atoms from other fragments
844 1 equemene
        DO I=1,NFroz
845 1 equemene
           Jat=Frozen(I)
846 1 equemene
           if (.NOT.DejaFait(JAt)) THEN
847 1 equemene
              CALL vecteur(JAt,IAt,x,y,z,vx1,vy1,vz1,norm1)
848 1 equemene
              if (abs(cos(angle(vx1,vy1,vz1,norm1, &
849 1 equemene
                   vx2,vy2,vz2,norm2))).LE.0.996d0) THEN
850 1 equemene
                 ITmp=ITmp+1
851 1 equemene
                 DistFroz(ITmp)=Norm1
852 1 equemene
                 FrozDist(ITmp)=JAt
853 1 equemene
              END IF
854 1 equemene
           END IF
855 1 equemene
        END DO
856 1 equemene
        IF (ITMP.EQ.0) THEN
857 1 equemene
           WRITE(*,*) 'It seems all frozen atoms are aligned'
858 1 equemene
           WRITE(*,*) 'Case non treated for now :-( '
859 1 equemene
           STOP
860 1 equemene
        END IF
861 1 equemene
     END IF
862 1 equemene
863 1 equemene
     I1=0
864 1 equemene
     d=1e9
865 1 equemene
     DO I=1,ITmp
866 1 equemene
        IF (DistFroz(I).LE.d) THEN
867 1 equemene
           I1=FrozDist(I)
868 1 equemene
           d=DistFroz(I)
869 1 equemene
        END IF
870 1 equemene
     END DO
871 1 equemene
872 1 equemene
     !     we now have the atom that is closer to the first one and that
873 1 equemene
     !     forms a non 0/Pi valence angle
874 1 equemene
     ind_zmat(3,1)=I1
875 1 equemene
     ind_zmat(3,2)=IAt
876 1 equemene
     ind_zmat(3,3)=LiaisonsBis(Iat,1)
877 1 equemene
     DejaFait(I1)=.TRUE.
878 1 equemene
     CaFaire(2)=I1
879 1 equemene
     FCaf(I1)=.TRUE.
880 1 equemene
881 1 equemene
882 1 equemene
     !     we search for a fourth atom !
883 1 equemene
     !     We search for a fourth atom, first in the FrozBlock atoms
884 1 equemene
     ITmp=2
885 1 equemene
     sDihe=0.
886 1 equemene
     n2=IAt
887 1 equemene
     n3=LiaisonsBis(Iat,1)
888 1 equemene
     n4=I1
889 1 equemene
     CALL vecteur(n2,n3,x,y,z,vx2,vy2,vz2,norm2)
890 1 equemene
     CALL vecteur(n3,n4,x,y,z,vx3,vy3,vz3,norm3)
891 1 equemene
     CALL produit_vect(vx3,vy3,vz3,norm3,  &
892 1 equemene
          vx2,vy2,vz2,norm2,    &
893 1 equemene
          vx5,vy5,vz5,norm5)
894 1 equemene
895 1 equemene
     !     We will look at the other frozen atoms
896 1 equemene
     !     we might improve the search so as to take the atom closest to IAt
897 1 equemene
     ITmp=0
898 1 equemene
     DO I=1,NbAtFrag(IFrag)
899 1 equemene
        JAt=FragAt(IFrag,I)
900 1 equemene
        if (FrozAt(Jat).AND.(.NOT.DejaFait(JAt))) THEN
901 1 equemene
           n1=JAt
902 1 equemene
           CALL vecteur(n2,n1,x,y,z,vx1,vy1,vz1,norm1)
903 1 equemene
           CALL produit_vect(vx1,vy1,vz1,norm1, &
904 1 equemene
                vx2,vy2,vz2,norm2, &
905 1 equemene
                vx4,vy4,vz4,norm4)
906 1 equemene
           val_d=angle_d(vx4,vy4,vz4,norm4,  &
907 1 equemene
                vx5,vy5,vz5,norm5,   &
908 1 equemene
                vx2,vy2,vz2,norm2)
909 1 equemene
           if (abs(sin(val_d)).GE.0.09D0) THEN
910 1 equemene
              ITmp=ITmp+1
911 1 equemene
              DistFroz(ITmp)=Norm1
912 1 equemene
              FrozDist(ITmp)=JAt
913 1 equemene
           END IF
914 1 equemene
        END IF
915 1 equemene
     END DO
916 1 equemene
     IF (ITmp.EQ.0) THEN
917 1 equemene
        !     All dihedral angles between frozen atoms are less than 5?
918 1 equemene
        !     (or more than 175?). We have to look at other fragments :-(
919 1 equemene
        DO I=1,NFroz
920 1 equemene
           Jat=Frozen(I)
921 1 equemene
           if (.NOT.DejaFait(JAt)) THEN
922 1 equemene
              n1=JAt
923 1 equemene
              CALL vecteur(n2,n1,x,y,z,vx1,vy1,vz1,norm1)
924 1 equemene
              CALL produit_vect(vx1,vy1,vz1,norm1,  &
925 1 equemene
                   vx2,vy2,vz2,norm2, &
926 1 equemene
                   vx4,vy4,vz4,norm4)
927 1 equemene
              val_d=angle_d(vx4,vy4,vz4,norm4,   &
928 1 equemene
                   vx5,vy5,vz5,norm5,           &
929 1 equemene
                   vx2,vy2,vz2,norm2)
930 1 equemene
              if (abs(sin(val_d)).GE.0.09D0) THEN
931 1 equemene
                 ITmp=ITmp+1
932 1 equemene
                 DistFroz(ITmp)=Norm1
933 1 equemene
                 FrozDist(ITmp)=JAt
934 1 equemene
              END IF
935 1 equemene
           END IF
936 1 equemene
        END DO
937 1 equemene
        IF (ITmp.EQ.0) THEN
938 1 equemene
           !     All frozen atoms are in a plane... too bad
939 1 equemene
           WRITE(*,*) 'ERROR: It seems that all frozen atoms are in a plane'
940 1 equemene
           WRITE(*,*) 'For now, I do not treat this case'
941 1 equemene
           STOP
942 1 equemene
        END IF
943 1 equemene
     END IF                 ! ITmp.EQ.0 after scaning fragment
944 1 equemene
     I1=0
945 1 equemene
     d=1e9
946 1 equemene
     DO I=1,ITmp
947 1 equemene
        IF (DistFroz(I).LE.d) THEN
948 1 equemene
           d=DistFroz(I)
949 1 equemene
           I1=FrozDist(I)
950 1 equemene
        END IF
951 1 equemene
     END DO
952 1 equemene
953 1 equemene
     !     we now have the atom that is closer to the first one and that
954 1 equemene
     !     forms a non 0/Pi dihedral angle
955 1 equemene
     !     ind_zmat(4,1)=I1
956 1 equemene
     !     ind_zmat(4,2)=IAt
957 1 equemene
     !     ind_zmat(4,3)=ind_zmat(2,1)
958 1 equemene
     !     ind_zmat(4,4)=ind_zmat(3,1)
959 1 equemene
     n3=ind_zmat(2,1)
960 1 equemene
     n4=ind_zmat(3,1)
961 1 equemene
     Call add2indzmat(na,4,I1,IAt,n3,n4,ind_zmat,x,y,z)
962 1 equemene
     ind_zmat(2,1)=n3
963 1 equemene
     ind_zmat(3,1)=n4
964 1 equemene
     DejaFait(I1)=.TRUE.
965 1 equemene
     CaFaire(3)=I1
966 1 equemene
     CaFaire(4)=0
967 1 equemene
     IdxCaFaire=4
968 1 equemene
     izm=4
969 1 equemene
     FCaf(I1)=.TRUE.
970 1 equemene
971 1 equemene
  CASE(0)
972 1 equemene
     WRITE(*,*) 'All frozen atoms are separated .. '
973 1 equemene
     WRITE(*,*) 'this case should be treated separately !'
974 1 equemene
     STOP
975 1 equemene
  END SELECT
976 1 equemene
977 1 equemene
  if (debug) THEN
978 1 equemene
     WRITE(*,*) 'ind_zmat 1'
979 1 equemene
     WRITE(*,'(1X,4(1X,I5))') ind_zmat(1,1)
980 1 equemene
     WRITE(*,'(1X,4(1X,I5))') ind_zmat(2,1), ind_zmat(2,2)
981 1 equemene
     WRITE(*,'(1X,4(1X,I5))') ind_zmat(3,1), ind_zmat(3,2), ind_zmat(3,3)
982 1 equemene
     DO I=4,izm
983 1 equemene
        WRITE(*,'(1X,4(1X,I5))') ind_zmat(I,1), ind_zmat(I,2),  &
984 1 equemene
             ind_zmat(I,3), ind_zmat(I,4)
985 1 equemene
     END DO
986 1 equemene
  END IF
987 1 equemene
988 1 equemene
  DO I=1,izm
989 1 equemene
     Idx_zmat(ind_zmat(I,1))=i
990 1 equemene
  END Do
991 1 equemene
992 1 equemene
  !     at least first four (frozen) atoms of this fragment done...
993 1 equemene
  !     we empty the 'cafaire' array before pursuing
994 1 equemene
  IAFaire=1
995 1 equemene
  DO WHILE (CaFaire(IaFaire).NE.0)
996 1 equemene
     n1=CaFaire(IaFaire)
997 1 equemene
     n2=ind_zmat(idx_zmat(N1),2)
998 1 equemene
     if (idx_zmat(N1).EQ.2) THEN
999 1 equemene
        !     We have a (small) problem: we have to add atoms linked to the 2nd
1000 1 equemene
        !     atom of the zmat. This is a pb because we do not know
1001 1 equemene
        !     which atom to use to define the dihedral angle
1002 1 equemene
        !     we take the third atom of the zmat
1003 1 equemene
        n3=ind_zmat(3,1)
1004 1 equemene
     ELSE
1005 1 equemene
        n3=ind_zmat(idx_zmat(n1),3)
1006 1 equemene
     END IF
1007 1 equemene
     IF (LiaisonsBis(n1,0).GE.1) THEN
1008 1 equemene
        IAt=LiaisonsBis(n1,1)
1009 1 equemene
        if (.NOT.DejaFait(Iat)) THEN
1010 1 equemene
           izm=izm+1
1011 1 equemene
           if (debug) WRITE(*,*) ">0< Adding atom ",Iat,"position izm=",izm
1012 1 equemene
           !           ind_zmat(izm,1)=iat
1013 1 equemene
           !           ind_zmat(izm,2)=n1
1014 1 equemene
           !           ind_zmat(izm,3)=n2
1015 1 equemene
           !           ind_zmat(izm,4)=n3
1016 1 equemene
           Call add2indzmat(na,izm,iat,n1,n2,n3,ind_zmat,x,y,z)
1017 1 equemene
           Idx_zmat(iat)=izm
1018 1 equemene
           n3=iat
1019 1 equemene
           IF (.NOT.FCaf(Iat)) THEN
1020 1 equemene
              CaFaire(IdxCaFaire)=iat
1021 1 equemene
              IdxCaFaire=IdxCaFaire+1
1022 1 equemene
              CaFaire(IdxCaFaire)=0
1023 1 equemene
              FCaf(Iat)=.TRUE.
1024 1 equemene
           END IF
1025 1 equemene
           DejaFait(iat)=.TRUE.
1026 1 equemene
        END IF
1027 1 equemene
     END IF
1028 1 equemene
     DO I=2,LiaisonsBis(n1,0)
1029 1 equemene
        IAt=LiaisonsBis(n1,I)
1030 1 equemene
! PFL 29.Aug.2008 ->
1031 1 equemene
! We dissociate the test on 'DejaFait' that indicates that this atom
1032 1 equemene
! has already been put in the Zmat
1033 1 equemene
! from the test on FCaf that indicates that this atom has been put in the
1034 1 equemene
! 'CAFaire' list that deals with identifying its connectivity.
1035 1 equemene
! Those two test might differ for a frozen atom linked to non frozen atoms.
1036 1 equemene
        IF (.NOT.DejaFait(Iat)) THEN
1037 1 equemene
           izm=izm+1
1038 1 equemene
           if (debug) WRITE(*,*) ">1< Adding atom ",Iat,"position izm=",izm
1039 1 equemene
           !           ind_zmat(izm,1)=iat
1040 1 equemene
           !           ind_zmat(izm,2)=n1
1041 1 equemene
           !           ind_zmat(izm,3)=n2
1042 1 equemene
           !           ind_zmat(izm,4)=n3
1043 1 equemene
           Call add2indzmat(na,izm,iat,n1,n2,n3,ind_zmat,x,y,z)
1044 1 equemene
           idx_zmat(iat)=izm
1045 1 equemene
           DejaFait(iat)=.TRUE.
1046 1 equemene
        END IF
1047 1 equemene
        IF (.NOT.FCaf(Iat)) THEN
1048 1 equemene
           CaFaire(IdxCaFaire)=iat
1049 1 equemene
           IdxCaFaire=IdxCaFaire+1
1050 1 equemene
           CaFaire(IdxCaFaire)=0
1051 1 equemene
           FCaf(Iat)=.TRUE.
1052 1 equemene
        END IF
1053 1 equemene
! <- PFL 29.Aug.2008
1054 1 equemene
     END DO
1055 1 equemene
     IaFaire=IaFaire+1
1056 1 equemene
  END Do                    ! DO WHILE CaFaire
1057 1 equemene
1058 1 equemene
  if (debug) THEN
1059 1 equemene
     WRITE(*,*) 'ind_zmat 2, izm=',izm
1060 1 equemene
     WRITE(*,'(1X,4(1X,I5))') ind_zmat(1,1)
1061 1 equemene
     WRITE(*,'(1X,4(1X,I5))') ind_zmat(2,1), ind_zmat(2,2)
1062 1 equemene
     WRITE(*,'(1X,4(1X,I5))') ind_zmat(3,1), ind_zmat(3,2), ind_zmat(3,3)
1063 1 equemene
     DO I=4,izm
1064 1 equemene
        WRITE(*,'(1X,4(1X,I5))') ind_zmat(I,1), ind_zmat(I,2),  &
1065 1 equemene
             ind_zmat(I,3), ind_zmat(I,4)
1066 1 equemene
     END DO
1067 1 equemene
  END IF
1068 1 equemene
1069 1 equemene
  !     We have finished putting atoms linked to the first one
1070 1 equemene
  !     we will add other frozen atoms of this fragment
1071 1 equemene
  DO I=1,NbAtFrag(IFrag)
1072 1 equemene
     Iat=FragAt(IFrag,I)
1073 1 equemene
     if (debug) WRITE(*,*) "DBG: I,Iat,Frozat,dejafait,frozbloc",I,Iat,FrozAt(Iat), DejaFait(Iat),FrozBlock(Iat,0)
1074 1 equemene
     IF (FrozAt(Iat).AND.(.NOT.DejaFait(Iat))) THEN
1075 1 equemene
        !     in order to have the zmat as connected as possible,
1076 1 equemene
        !     we look if this atom belongs to a frozblock
1077 1 equemene
        if (debug) WRITE(*,*) 'Treating atom I,Iat, FrozBlock ',I,Iat, FrozBlock(Iat,0)
1078 1 equemene
        IF (FrozBlock(Iat,0).EQ.1) THEN
1079 1 equemene
           !     it is a lonely atom :-)
1080 1 equemene
           d=1e9
1081 1 equemene
           DO J=1,izm
1082 1 equemene
              Call vecteur(iat,ind_zmat(j,1),x,y,z,vx1,vy1,vz1,norm1)
1083 1 equemene
              if (norm1.le.d) THEN
1084 1 equemene
                 Jat=j
1085 1 equemene
                 d=norm1
1086 1 equemene
              END IF
1087 1 equemene
           END DO
1088 1 equemene
           n2=ind_zmat(jat,1)
1089 1 equemene
           SELECT CASE(jat)
1090 1 equemene
           CASE (1)
1091 1 equemene
              n3=ind_zmat(2,1)
1092 1 equemene
              n4=ind_zmat(3,1)
1093 1 equemene
           CASE (2)
1094 1 equemene
              n3=ind_zmat(1,1)
1095 1 equemene
              n4=ind_zmat(3,1)
1096 1 equemene
           CASE DEFAULT
1097 1 equemene
              n3=ind_zmat(jAt,2)
1098 1 equemene
              n4=ind_zmat(jat,3)
1099 1 equemene
           END SELECT
1100 1 equemene
           izm=izm+1
1101 1 equemene
           !           ind_zmat(izm,1)=iat
1102 1 equemene
           !           ind_zmat(izm,2)=n2
1103 1 equemene
           !           ind_zmat(izm,3)=n3
1104 1 equemene
           !           ind_zmat(izm,4)=n4
1105 1 equemene
           Call add2indzmat(na,izm,iat,n2,n3,n4,ind_zmat,x,y,z)
1106 1 equemene
           DejaFait(iat)=.TRUE.
1107 1 equemene
           idx_zmat(iat)=iat
1108 1 equemene
        ELSE        !(FrozBlock(Iat,0).EQ.1)
1109 1 equemene
           !     we have a group of atoms
1110 1 equemene
           !     We search for the atom of the group with the most links
1111 1 equemene
           ITmp=-1
1112 1 equemene
           DO J=1,FrozBlock(Iat,0)
1113 1 equemene
              Jat=FrozBlock(Iat,J)
1114 1 equemene
              IF ((.NOT.DejaFait(Jat)).AND.  &
1115 1 equemene
                   (LiaisonsBis(Jat,0).GT.ITMP)) THEN
1116 1 equemene
                 JL=Jat
1117 1 equemene
                 ITmp=LiaisonsBis(Jat,0)
1118 1 equemene
              END IF
1119 1 equemene
           END DO
1120 1 equemene
           if (debug) WRITE(*,*) 'JL,ITmp:',JL,ITmp
1121 1 equemene
           Iat=JL
1122 1 equemene
           d=1e9
1123 1 equemene
           DO J=1,izm
1124 1 equemene
              Call vecteur(iat,ind_zmat(j,1),x,y,z, vx1,vy1,vz1,norm1)
1125 1 equemene
              if (norm1.le.d) THEN
1126 1 equemene
                 Jat=j
1127 1 equemene
                 d=norm1
1128 1 equemene
              END IF
1129 1 equemene
           END DO
1130 1 equemene
           if (debug) WRITE(*,*) 'Jat,d:',Jat,d
1131 1 equemene
           n2=ind_zmat(jat,1)
1132 1 equemene
           SELECT CASE(jat)
1133 1 equemene
           CASE (1)
1134 1 equemene
              n3=ind_zmat(2,1)
1135 1 equemene
              n4=ind_zmat(3,1)
1136 1 equemene
           CASE (2)
1137 1 equemene
              n3=ind_zmat(1,1)
1138 1 equemene
              n4=ind_zmat(3,1)
1139 1 equemene
           CASE DEFAULT
1140 1 equemene
              n3=ind_zmat(jAt,2)
1141 1 equemene
              n4=ind_zmat(jat,3)
1142 1 equemene
           END SELECT
1143 1 equemene
           izm=izm+1
1144 1 equemene
           !           ind_zmat(izm,1)=iat
1145 1 equemene
           !           ind_zmat(izm,2)=n2
1146 1 equemene
           !           ind_zmat(izm,3)=n3
1147 1 equemene
           !           ind_zmat(izm,4)=n4
1148 1 equemene
           Call add2indzmat(na,izm,iat,n2,n3,n4,ind_zmat,x,y,z)
1149 1 equemene
           idx_zmat(iat)=izm
1150 1 equemene
           DejaFait(iat)=.TRUE.
1151 1 equemene
           IdxCaFaire=2
1152 1 equemene
           CaFaire(1)=iat
1153 1 equemene
           CaFaire(2)=0
1154 1 equemene
           FCaf(Iat)=.TRUE.
1155 1 equemene
1156 1 equemene
           if (debug) WRITE(*,*) izm,iat,n2,n3,n4
1157 1 equemene
1158 1 equemene
           IaFaire=1
1159 1 equemene
           DO WHILE (CaFaire(IaFaire).NE.0)
1160 1 equemene
              n1=CaFaire(IaFaire)
1161 1 equemene
              n2=ind_zmat(idx_zmat(N1),2)
1162 1 equemene
              if (debug) WRITE(*,*) 'DBG Cafaire, Iafaire,n1,n2',Iafaire,n1,n2
1163 1 equemene
              if (idx_zmat(N1).EQ.2) THEN
1164 1 equemene
                 !     We have a (small) problem: we have to add atoms linked to the 2nd
1165 1 equemene
                 !     atom of the zmat. This is a pb because we do not know
1166 1 equemene
                 !     which atom to use to define the dihedral angle
1167 1 equemene
                 !     we take the third atom of the zmat
1168 1 equemene
                 n3=ind_zmat(3,1)
1169 1 equemene
              ELSE
1170 1 equemene
                 n3=ind_zmat(idx_zmat(n1),3)
1171 1 equemene
              END IF
1172 1 equemene
              if (debug) WRITe(*,*) 'DBG :n3,liaisonBis',n3,LiaisonsBis(n1,0)
1173 1 equemene
              DO I3=1,LiaisonsBis(n1,0)
1174 1 equemene
! PFL 29.Aug.2008 ->
1175 1 equemene
! We dissociate the test on 'DejaFait' that indicates that this atom
1176 1 equemene
! has already been put in the Zmat
1177 1 equemene
! from the test on FCaf that indicates that this atom has been put in the
1178 1 equemene
! 'CAFaire' list that deals with identifying its connectivity.
1179 1 equemene
! Those two test might differ for a frozen atom linked to non frozen atoms.
1180 1 equemene
                 IAt=LiaisonsBis(n1,I3)
1181 1 equemene
                 if (.NOT.DejaFait(Iat)) THEN
1182 1 equemene
                    izm=izm+1
1183 1 equemene
                    !                 ind_zmat(izm,1)=iat
1184 1 equemene
                    !                 ind_zmat(izm,2)=n1
1185 1 equemene
                    !                 ind_zmat(izm,3)=n2
1186 1 equemene
                    !                 ind_zmat(izm,4)=n3
1187 1 equemene
                    Call add2indzmat(na,izm,iat,n1,n2,n3,ind_zmat,x,y,z)
1188 1 equemene
                    idx_zmat(iat)=izm
1189 1 equemene
                    if (I3.EQ.1) n3=ind_zmat(izm,1)
1190 1 equemene
                    DejaFait(Iat)=.TRUE.
1191 1 equemene
                 END IF
1192 1 equemene
                 If (.NOT.FCaf(Iat)) THEN
1193 1 equemene
                    CaFaire(IdxCaFaire)=iat
1194 1 equemene
                    IdxCaFaire=IdxCaFaire+1
1195 1 equemene
                    CaFaire(IdxCaFaire)=0
1196 1 equemene
                    FCaf(Iat)=.TRUE.
1197 1 equemene
                 END IF
1198 1 equemene
! <- PFL 29.Aug.2008
1199 1 equemene
              END DO
1200 1 equemene
              IaFaire=IaFaire+1
1201 1 equemene
           END Do           ! DO WHILE CaFaire
1202 1 equemene
        END IF
1203 1 equemene
     END IF
1204 1 equemene
     if (debug) THEN
1205 1 equemene
        WRITE(*,*) 'ind_zmat 3'
1206 1 equemene
        WRITE(*,'(1X,4(1X,I5))') ind_zmat(1,1)
1207 1 equemene
        WRITE(*,'(1X,4(1X,I5))') ind_zmat(2,1), ind_zmat(2,2)
1208 1 equemene
        WRITE(*,'(1X,4(1X,I5))') ind_zmat(3,1), ind_zmat(3,2), ind_zmat(3,3)
1209 1 equemene
        DO Ip=4,izm
1210 1 equemene
           WRITE(*,'(1X,4(1X,I5))') ind_zmat(Ip,1), ind_zmat(Ip,2),  &
1211 1 equemene
                ind_zmat(Ip,3), ind_zmat(Ip,4)
1212 1 equemene
        END DO
1213 1 equemene
     END IF
1214 1 equemene
1215 1 equemene
  END DO
1216 1 equemene
1217 1 equemene
  FrozFrag(IFrag,1)=-1
1218 1 equemene
  FrozFrag(IFrag,2)=-1
1219 1 equemene
  FrozFrag(IFrag,3)=-1
1220 1 equemene
1221 1 equemene
  !     we start again with the rest of the molecule...
1222 1 equemene
  ! v 1.01 We add the fragment in the order corresponding to FrozFrag
1223 1 equemene
  KMax=0
1224 1 equemene
  DO I=1,NbFrag
1225 1 equemene
     IF (FrozFrag(I,1).NE.0) KMax=KMax+1
1226 1 equemene
  END DO
1227 1 equemene
1228 1 equemene
  IF (DEBUG) WRITE(*,*) "Adding the",Kmax,"fragments with frozen atoms"
1229 1 equemene
  DO K=1, KMax-1
1230 1 equemene
     IFrag=0
1231 1 equemene
     I0=0
1232 1 equemene
     I1=0
1233 1 equemene
     DO I=1,NbFrag
1234 1 equemene
        SELECT CASE(FrozFrag(I,3)-I0)
1235 1 equemene
        CASE (1:)
1236 1 equemene
           IFrag=I
1237 1 equemene
           I0=FrozFrag(I,3)
1238 1 equemene
           I1=FrozFrag(I,2)
1239 1 equemene
        CASE (0)
1240 1 equemene
           if (FrozFrag(I,2).GT.I1) THEN
1241 1 equemene
              IFrag=I
1242 1 equemene
              I0=FrozFrag(I,3)
1243 1 equemene
              I1=FrozFrag(I,2)
1244 1 equemene
           END IF
1245 1 equemene
        END SELECT
1246 1 equemene
     END DO
1247 1 equemene
1248 1 equemene
     FrozFrag(IFrag,1)=-1
1249 1 equemene
     FrozFrag(IFrag,2)=-1
1250 1 equemene
     FrozFrag(IFrag,3)=-1
1251 1 equemene
1252 1 equemene
     if (debug) WRITE(*,*) "Adding Fragment ",IFrag,K
1253 1 equemene
1254 1 equemene
     DO I=1,NbAtFrag(IFrag)
1255 1 equemene
        Iat=FragAt(IFrag,I)
1256 1 equemene
        IF (FrozAt(Iat).AND.(.NOT.DejaFait(Iat))) THEN
1257 1 equemene
           !     in order to have the zmat as connected as possible,
1258 1 equemene
           !     we look if this atom belongs to a frozblock
1259 1 equemene
           IF (FrozBlock(Iat,0).EQ.1) THEN
1260 1 equemene
              !     it is a lonely atom :-)
1261 1 equemene
              if (debug) write(*,*) "DBG 4: Lonely atom",Iat
1262 1 equemene
              d=1e9
1263 1 equemene
              DO J=1,izm
1264 1 equemene
                 Call vecteur(iat,ind_zmat(j,1),x,y,z,vx1,vy1,vz1,norm1)
1265 1 equemene
                 if (norm1.le.d) THEN
1266 1 equemene
                    Jat=j
1267 1 equemene
                    d=norm1
1268 1 equemene
                 END IF
1269 1 equemene
              END DO
1270 1 equemene
              n2=ind_zmat(jat,1)
1271 1 equemene
              SELECT CASE(jat)
1272 1 equemene
              CASE (1)
1273 1 equemene
                 n3=ind_zmat(2,1)
1274 1 equemene
                 n4=ind_zmat(3,1)
1275 1 equemene
              CASE (2)
1276 1 equemene
                 n3=ind_zmat(1,1)
1277 1 equemene
                 n4=ind_zmat(3,1)
1278 1 equemene
              CASE DEFAULT
1279 1 equemene
                 n3=ind_zmat(jAt,2)
1280 1 equemene
                 n4=ind_zmat(jat,3)
1281 1 equemene
              END SELECT
1282 1 equemene
              izm=izm+1
1283 1 equemene
              !              ind_zmat(izm,1)=iat
1284 1 equemene
              !              ind_zmat(izm,2)=n2
1285 1 equemene
              !              ind_zmat(izm,3)=n3
1286 1 equemene
              !              ind_zmat(izm,4)=n4
1287 1 equemene
              Call add2indzmat(na,izm,iat,n2,n3,n4,ind_zmat,x,y,z)
1288 1 equemene
              idx_zmat(iat)=izm
1289 1 equemene
              DejaFait(iat)=.TRUE.
1290 1 equemene
           ELSE
1291 1 equemene
              !     we have a group of atoms
1292 1 equemene
              !     We search for the atom of the group with the most links
1293 1 equemene
              if (debug) write(*,*) "DBG 4b: ",Iat," belong to frozblock",FrozBlock(Iat,0)
1294 1 equemene
              ITmp=-1
1295 1 equemene
              DO J=1,FrozBlock(Iat,0)
1296 1 equemene
                 Jat=FrozBlock(Iat,J)
1297 1 equemene
                 IF ((.NOT.DejaFait(Jat)).AND.         &
1298 1 equemene
                      (LiaisonsBis(Jat,0).GT.ITMP)) THEN
1299 1 equemene
                    JL=Jat
1300 1 equemene
                    ITmp=LiaisonsBis(Jat,0)
1301 1 equemene
                 END IF
1302 1 equemene
              END DO
1303 1 equemene
              Iat=JL
1304 1 equemene
              d=1e9
1305 1 equemene
              DO J=1,izm
1306 1 equemene
                 Call vecteur(iat,ind_zmat(j,1),x,y,z,vx1,vy1,vz1,norm1)
1307 1 equemene
                 if (norm1.le.d) THEN
1308 1 equemene
                    Jat=j
1309 1 equemene
                    d=norm1
1310 1 equemene
                 END IF
1311 1 equemene
              END DO
1312 1 equemene
              n2=ind_zmat(jat,1)
1313 1 equemene
              SELECT CASE(jat)
1314 1 equemene
              CASE (1)
1315 1 equemene
                 n3=ind_zmat(2,1)
1316 1 equemene
                 n4=ind_zmat(3,1)
1317 1 equemene
              CASE (2)
1318 1 equemene
                 n3=ind_zmat(1,1)
1319 1 equemene
                 n4=ind_zmat(3,1)
1320 1 equemene
              CASE DEFAULT
1321 1 equemene
                 n3=ind_zmat(jAt,2)
1322 1 equemene
                 n4=ind_zmat(jat,3)
1323 1 equemene
              END SELECT
1324 1 equemene
              izm=izm+1
1325 1 equemene
              !              ind_zmat(izm,1)=iat
1326 1 equemene
              !              ind_zmat(izm,2)=n2
1327 1 equemene
              !              ind_zmat(izm,3)=n3
1328 1 equemene
              !              ind_zmat(izm,4)=n4
1329 1 equemene
              Call add2indzmat(na,izm,Iat,n2,n3,n4,ind_zmat,x,y,z)
1330 1 equemene
              idx_zmat(iat)=izm
1331 1 equemene
              DejaFait(iat)=.TRUE.
1332 1 equemene
              IdxCaFaire=2
1333 1 equemene
              CaFaire(1)=iat
1334 1 equemene
              CaFaire(2)=0
1335 1 equemene
              FCaf(Iat)=.TRUE.
1336 1 equemene
              IaFaire=1
1337 1 equemene
              DO WHILE (CaFaire(IaFaire).NE.0)
1338 1 equemene
                 n1=CaFaire(IaFaire)
1339 1 equemene
                 n2=ind_zmat(idx_zmat(N1),2)
1340 1 equemene
                 if (idx_zmat(N1).EQ.2) THEN
1341 1 equemene
                    !     We have a (small) problem: we have to add atoms linked to the 2nd
1342 1 equemene
                    !     atom of the zmat. This is a pb because we do not know
1343 1 equemene
                    !     which atom to use to define the dihedral angle
1344 1 equemene
                    !     we take the third atom of the zmat
1345 1 equemene
                    n3=ind_zmat(3,1)
1346 1 equemene
                 ELSE
1347 1 equemene
                    n3=ind_zmat(idx_zmat(n1),3)
1348 1 equemene
                 END IF
1349 1 equemene
                 DO I3=1,LiaisonsBis(n1,0)
1350 1 equemene
                    IAt=LiaisonsBis(n1,I3)
1351 1 equemene
! PFL 29.Aug.2008 ->
1352 1 equemene
! We dissociate the test on 'DejaFait' that indicates that this atom
1353 1 equemene
! has already been put in the Zmat
1354 1 equemene
! from the test on FCaf that indicates that this atom has been put in the
1355 1 equemene
! 'CAFaire' list that deals with identifying its connectivity.
1356 1 equemene
! Those two test might differ for a frozen atom linked to non frozen atoms.
1357 1 equemene
                    IF (.NOT.DejaFait(Iat)) THEN
1358 1 equemene
                       izm=izm+1
1359 1 equemene
                       Call add2indzmat(na,izm,Iat,n1,n2,n3,ind_zmat,x,y,z)
1360 1 equemene
                       idx_zmat(iat)=izm
1361 1 equemene
                       n3=iat
1362 1 equemene
                       DejaFait(Iat)=.TRUE.
1363 1 equemene
                    END IF
1364 1 equemene
                    IF (.NOT.FCaf(Iat)) THEN
1365 1 equemene
                       CaFaire(IdxCaFaire)=iat
1366 1 equemene
                       IdxCaFaire=IdxCaFaire+1
1367 1 equemene
                       CaFaire(IdxCaFaire)=0
1368 1 equemene
                       FCaf(Iat)=.TRUE.
1369 1 equemene
                    END IF
1370 1 equemene
! <- PFL 29.Aug.2008
1371 1 equemene
                 END DO
1372 1 equemene
                 IaFaire=IaFaire+1
1373 1 equemene
              END Do              ! DO WHILE CaFaire
1374 1 equemene
           END IF
1375 1 equemene
        END IF
1376 1 equemene
1377 1 equemene
        if (debug) THEN
1378 1 equemene
           WRITE(*,*) 'ind_zmat 4'
1379 1 equemene
           WRITE(*,'(1X,4(1X,I5))') ind_zmat(1,1)
1380 1 equemene
           WRITE(*,'(1X,4(1X,I5))') ind_zmat(2,1), ind_zmat(2,2)
1381 1 equemene
           WRITE(*,'(1X,4(1X,I5))') ind_zmat(3,1), ind_zmat(3,2), ind_zmat(3,3)
1382 1 equemene
           DO Ip=4,izm
1383 1 equemene
              WRITE(*,'(1X,4(1X,I5))') ind_zmat(Ip,1), ind_zmat(Ip,2), &
1384 1 equemene
                   ind_zmat(Ip,3), ind_zmat(Ip,4)
1385 1 equemene
           END DO
1386 1 equemene
        END IF
1387 1 equemene
1388 1 equemene
     END DO ! loop on atoms of fragment IFrag
1389 1 equemene
  END DO                    ! Loop on all fragments
1390 1 equemene
1391 1 equemene
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1392 1 equemene
!
1393 1 equemene
!        General case
1394 1 equemene
!
1395 1 equemene
! 2 - we have all frozen atoms done... now comes the non frozen atoms
1396 1 equemene
! and we should fragment the fragments !
1397 1 equemene
!
1398 1 equemene
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
1399 1 equemene
1400 1 equemene
! First, we get rid of bonds between frozen atoms
1401 1 equemene
! the trick is to do this on liaisons while keeping LiaisonsBis ok.
1402 1 equemene
1403 1 equemene
  if (debug) THEN
1404 1 equemene
     WRITE(*,*) 'Frozen',NFroz
1405 1 equemene
     WRITE(*,'(20(1X,I3))') (Frozen(I),I=1,NFroz)
1406 1 equemene
  END IF
1407 1 equemene
1408 1 equemene
  DO I=1,na
1409 1 equemene
     DO J=0,NMAxL
1410 1 equemene
        LiaisonsIni(I,J)=LiaisonsBis(I,J)
1411 1 equemene
     END DO
1412 1 equemene
! PFL 29.Aug.2008 ->
1413 1 equemene
! We re-initialize FCaf in order to add frozen atoms that are connected
1414 1 equemene
! to non frozen atoms
1415 1 equemene
     FCaf(I)=.FALSE.
1416 1 equemene
! <- 29.Aug.2008
1417 1 equemene
  END DO
1418 1 equemene
1419 1 equemene
  DO I=1,Na
1420 1 equemene
     IF (FrozAt(I)) THEN
1421 1 equemene
        Iat=I
1422 1 equemene
        if (debug) WRITE(*,'(20(1X,I3))') I,Iat,  &
1423 1 equemene
             (LiaisonsIni(Iat,Itmp),ITmp=0,LiaisonsIni(Iat,0))
1424 1 equemene
        DO J=1,LiaisonsIni(Iat,0)
1425 1 equemene
           Jat=LiaisonsIni(Iat,J)
1426 1 equemene
           Call Annul(Liaisons,Iat,Jat)
1427 1 equemene
           Call Annul(Liaisons,Jat,Iat)
1428 1 equemene
           Call Annul(LiaisonsIni,Jat,Iat)
1429 1 equemene
           Liaisons(Iat,0)=Liaisons(Iat,0)-1
1430 1 equemene
           Liaisons(Jat,0)=Liaisons(Jat,0)-1
1431 1 equemene
           LiaisonsIni(Jat,0)=LiaisonsIni(Jat,0)-1
1432 1 equemene
        END DO
1433 1 equemene
     END IF
1434 1 equemene
  END DO
1435 1 equemene
1436 1 equemene
  if (debug) THEN
1437 1 equemene
     WRITE(*,*) "Connections calculees"
1438 1 equemene
     DO IL=1,na
1439 1 equemene
        WRITE(IOOUT,1003) Il,(LIAISONS(IL,JL),JL=0,NMaxL)
1440 1 equemene
     END DO
1441 1 equemene
  END IF
1442 1 equemene
1443 1 equemene
1444 1 equemene
1445 1 equemene
  ! We re-decompose the system into fragments, but we omit on purpuse
1446 1 equemene
  ! fragments consisting only of frozen atoms
1447 1 equemene
  ! Now, frozblock will contain the frozen atom indices in a given fragment
1448 1 equemene
1449 1 equemene
  DO I=1,na
1450 1 equemene
     Fragment(I)=0
1451 1 equemene
     NbAtFrag(I)=0
1452 1 equemene
     FrozBlock(I,0)=0
1453 1 equemene
  END DO
1454 1 equemene
  IdxFrag=0
1455 1 equemene
  NbFrag=0
1456 1 equemene
1457 1 equemene
  DO I=1,na
1458 1 equemene
     IdxCAfaire=1
1459 1 equemene
     CaFaire(IdxCaFaire)=0
1460 1 equemene
1461 1 equemene
     if (debug) WRITE(*,*) 'Treating atom I, fragment(I)',I,Fragment(I)
1462 1 equemene
     IF (.NOT.FrozAt(I).OR.(Liaisons(I,0).NE.0)) THEN
1463 1 equemene
        IF (Fragment(I).EQ.0) THEN
1464 1 equemene
           IdxFrag=IdxFrag+1
1465 1 equemene
           NbFrag=NbFrag+1
1466 1 equemene
           IFrag=IdxFrag
1467 1 equemene
           Fragment(I)=IFrag
1468 1 equemene
           NbAtFrag(IFrag)=NbAtFrag(IFrag)+1
1469 1 equemene
           FragAt(IFrag,NbAtFrag(IFrag))=I
1470 1 equemene
        ELSE  ! fragment(I).EQ.0
1471 1 equemene
           IFrag=Fragment(I)
1472 1 equemene
        END IF     ! fragment(I).EQ.0
1473 1 equemene
        DO J=1,Liaisons(I,0)
1474 1 equemene
           Iat=Liaisons(I,J)
1475 1 equemene
           IF ((Fragment(Iat).NE.0).AND.(Fragment(Iat).NE.IFrag)) THEN
1476 1 equemene
              WRITE(*,*) 'Error : Atoms ',I,' and ',Iat
1477 1 equemene
              WRITE(*,*) 'are linked, but belongs to fragments ',IFrag,' and ',Fragment(Iat)
1478 1 equemene
              STOP
1479 1 equemene
           END IF
1480 1 equemene
           IF (Fragment(Iat).EQ.0) THEN
1481 1 equemene
              IF (.NOT.FCaf(IAt)) THEN
1482 1 equemene
                 CaFaire(IdxCaFaire)=Iat
1483 1 equemene
                 IdxCAfaire=IdxCAFaire+1
1484 1 equemene
                 FCaf(IAt)=.TRUE.
1485 1 equemene
              END IF
1486 1 equemene
              Fragment(Iat)=IFrag
1487 1 equemene
              NbAtFrag(IFrag)=NbAtFrag(IFrag)+1
1488 1 equemene
              FragAt(IFrag,NbAtFrag(IFrag))=Iat
1489 1 equemene
           END IF
1490 1 equemene
        END DO
1491 1 equemene
        CaFaire(IdxCaFaire)=0
1492 1 equemene
1493 1 equemene
        If (debug) WRITE(*,'(1X,A,1000I4)') 'Cafaire:',CaFaire(1:IdxCaFaire)
1494 1 equemene
        If (debug) WRITE(*,*) 'IFrag=',IFrag
1495 1 equemene
1496 1 equemene
        IAfaire=1
1497 1 equemene
        DO WHILE (CaFaire(IAfaire).NE.0)
1498 1 equemene
           Iat=CaFaire(IaFaire)
1499 1 equemene
           IF (.NOT.FrozAt(Iat).OR.(Liaisons(Iat,0).NE.0)) THEN
1500 1 equemene
              if (debug) WRITE(*,*) 'Cafaire treating ',Iat
1501 1 equemene
              IF (Fragment(Iat).EQ.0) THEN
1502 1 equemene
                 WRITE(*,*) 'Error: Atom ',Iat,' does not belong to any fragment !'
1503 1 equemene
                 STOP
1504 1 equemene
              END IF
1505 1 equemene
1506 1 equemene
              DO J=1,Liaisons(Iat,0)
1507 1 equemene
                 Jat=Liaisons(Iat,J)
1508 1 equemene
                 IF ((Fragment(Jat).NE.0).AND.(Fragment(Jat).NE.IFrag)) THEN
1509 1 equemene
                    WRITE(*,*) 'Error: Atoms ',Iat,' and ',Liaisons(Iat,J)
1510 1 equemene
                    WRITE(*,*) 'are linked, but belongs to fragments ',IFrag,' and ',Fragment(Liaisons(Iat,J))
1511 1 equemene
                    STOP
1512 1 equemene
                 END IF
1513 1 equemene
                 IF (Fragment(Jat).EQ.0) THEN
1514 1 equemene
                    IF (.NOT.FCaf(Liaisons(Iat,J))) THEN
1515 1 equemene
                       CaFaire(IdxCaFaire)=Liaisons(Iat,J)
1516 1 equemene
                       IdxCAfaire=IdxCAFaire+1
1517 1 equemene
                       FCaf(Liaisons(Iat,J))=.TRUE.
1518 1 equemene
                    END IF
1519 1 equemene
                    Fragment(Jat)=IFrag
1520 1 equemene
                    NbAtFrag(IFrag)=NbAtFrag(IFrag)+1
1521 1 equemene
                    FragAt(IFrag,NbAtFrag(IFrag))=Jat
1522 1 equemene
                 END IF
1523 1 equemene
              END DO
1524 1 equemene
              CaFaire(IdxCaFaire)=0
1525 1 equemene
              If (debug) WRITE(*,*) 'IAfaire, IdxCaFaire,Cafaire :',IAfaire,IdxCafaire,' == ',CaFaire(IaFaire+1:IdxCaFaire)
1526 1 equemene
              IAFaire=IAFaire+1
1527 1 equemene
           END IF
1528 1 equemene
        END DO
1529 1 equemene
     END IF
1530 1 equemene
  END DO
1531 1 equemene
1532 1 equemene
  ! We compute FrozBlock now
1533 1 equemene
  DO IFrag=1,NbFrag
1534 1 equemene
     DO I=1,NbAtFrag(IFrag)
1535 1 equemene
        Iat=FragAt(IFrag,I)
1536 1 equemene
        IF (FrozAt(Iat)) THEN
1537 1 equemene
           FrozBlock(IFrag,0)=FrozBlock(IFrag,0)+1
1538 1 equemene
           FrozBlock(IFrag,FrozBlock(IFrag,0))=IAt
1539 1 equemene
        END IF
1540 1 equemene
     END DO
1541 1 equemene
  END DO
1542 1 equemene
1543 1 equemene
1544 1 equemene
  if (debug) THEN
1545 1 equemene
     WRITE(*,*) 'I found ',NbFrag, 'fragments with respectively '
1546 1 equemene
     WRITE(*,*) (NbAtFrag(I),I=1,NbFrag), 'atoms'
1547 1 equemene
     WRITE(*,*) "Fragments atoms are now listed as F in the following"
1548 1 equemene
     DO I=1,NbFrag
1549 1 equemene
        WRITE(*,*) Na
1550 1 equemene
        WRITE(*,*) 'Fragment ', i
1551 1 equemene
        DO J=1,Na
1552 1 equemene
           AtName=Nom(Atome(J))
1553 1 equemene
           IF (Fragment(J).EQ.I) AtName='F'
1554 1 equemene
           WRITE(*,'(1X,A5,3(1X,F10.6))') AtName,X(J),Y(J),Z(J)
1555 1 equemene
        END DO
1556 1 equemene
        !     WRITE(*,*) "FragAt:",(FragAt(I,j),j=1,NbAtFrag(I))
1557 1 equemene
     END DO
1558 1 equemene
1559 1 equemene
     DO I=1,NbFrag
1560 1 equemene
        WRITE(*,*) 'Fragment ', i
1561 1 equemene
        WRITE(*,'(A,20(1X,I3))') "FragAt:",(FragAt(I,j),j=1,NbAtFrag(I))
1562 1 equemene
        WRITE(*,'(A,20(1X,I3))') "FrozBlock:",(FrozBlock(I,j),j=0,FrozBlock(I,0))
1563 1 equemene
     END DO
1564 1 equemene
  END IF
1565 1 equemene
1566 1 equemene
1567 1 equemene
  NFroz=0
1568 1 equemene
  DO IFrag=1,NbFrag
1569 1 equemene
     If (FrozBlock(IFrag,0).NE.0) NFroz=NFroz+1
1570 1 equemene
  END DO
1571 1 equemene
1572 1 equemene
  IF (DEBUG) WRITE(*,'(1X,A,I4,A,I4,A)') "Found ",NFroz," fragmenst with frozen atoms, out of",NbFrag," fragments"
1573 1 equemene
1574 1 equemene
  ! We will now add the fragments containing non frozen atoms.
1575 1 equemene
  ! I am not sure that there is a best strategy to add them...
1576 1 equemene
  ! so we add them in the order they were created :-(
1577 1 equemene
  ! First only block with frozen atoms are added
1578 1 equemene
  izm0=-1
1579 1 equemene
  IFrag=1
1580 1 equemene
  FCaf=.FALSE.
1581 1 equemene
1582 1 equemene
  DO IFragFroz=1,NFroz
1583 1 equemene
     DO WHILE (FrozBlock(IFrag,0).EQ.0)
1584 1 equemene
        IFrag=IFrag+1
1585 1 equemene
     END DO
1586 1 equemene
     ! each atom has at least one frozen atom that will serve as the seed
1587 1 equemene
     ! of this fragment.
1588 1 equemene
     if (debug) WRITE(*,*) 'Adding fragment :', ifrag,'with',FrozBlock(IFrag,0),' frozen atoms'
1589 1 equemene
     IF (FrozBlock(IFrag,0).EQ.1) THEN
1590 1 equemene
        ! There is only one frozen atom, easy case ...
1591 1 equemene
        Iat=FrozBlock(IFrag,1)
1592 1 equemene
        if (debug) WRITE(*,*) 'Only frozen atom of frag',iat
1593 1 equemene
        DejaFait(iat)=.TRUE.
1594 1 equemene
        IdxCaFaire=2
1595 1 equemene
        CaFaire(1)=iat
1596 1 equemene
        CaFaire(2)=0
1597 1 equemene
        FCaf(Iat)=.TRUE.
1598 1 equemene
        IaFaire=1
1599 1 equemene
        DO WHILE (CaFaire(IaFaire).NE.0)
1600 1 equemene
           n1=CaFaire(IaFaire)
1601 1 equemene
           SELECT CASE(idx_zmat(n1))
1602 1 equemene
           CASE (1)
1603 1 equemene
              n2=ind_zmat(2,1)
1604 1 equemene
              n3=ind_zmat(3,1)
1605 1 equemene
           CASE (2)
1606 1 equemene
              n2=ind_zmat(1,1)
1607 1 equemene
              n3=ind_zmat(3,1)
1608 1 equemene
           CASE (3:)
1609 1 equemene
              n2=ind_zmat(idx_zmat(n1),2)
1610 1 equemene
              n3=ind_zmat(idx_zmat(n1),3)
1611 1 equemene
           END SELECT
1612 1 equemene
1613 1 equemene
           DO I3=1,Liaisons(n1,0)
1614 1 equemene
              IAt=Liaisons(n1,I3)
1615 1 equemene
              ! PFL 2007.Apr.16 ->
1616 1 equemene
              ! We add ALL atoms linked to n1 to CaFaire
1617 1 equemene
              ! But we delete their link to n1
1618 1 equemene
              IF (.NOT.FCaf(Iat)) THEN
1619 1 equemene
                 CaFaire(IdxCaFaire)=Iat
1620 1 equemene
                 IdxCaFaire=IdxCaFaire+1
1621 1 equemene
                 CaFaire(IdxCaFaire)=0
1622 1 equemene
              END IF
1623 1 equemene
              Call Annul(Liaisons,Iat,n1)
1624 1 equemene
              Liaisons(iat,0)=Liaisons(Iat,0)-1
1625 1 equemene
              ! <- PFL 2007.Apr.16
1626 1 equemene
              IF (.NOT.DejaFait(Iat)) THEN
1627 1 equemene
                 ! we add it to the Zmat
1628 1 equemene
                 izm=izm+1
1629 1 equemene
                 !              ind_zmat(izm,1)=iat
1630 1 equemene
                 !              ind_zmat(izm,2)=n1
1631 1 equemene
                 !              ind_zmat(izm,3)=n2
1632 1 equemene
                 !              ind_zmat(izm,4)=n3
1633 1 equemene
                 Call add2indzmat(na,izm,Iat,n1,n2,n3,ind_zmat,x,y,z)
1634 1 equemene
                 idx_zmat(iat)=izm
1635 1 equemene
                 !                  Call Annul(Liaisons,n1,iat)
1636 1 equemene
                 n3=iat
1637 1 equemene
                 DejaFait(Iat)=.TRUE.
1638 1 equemene
              END IF
1639 1 equemene
           END DO
1640 1 equemene
              IaFaire=IaFaire+1
1641 1 equemene
1642 1 equemene
              if (debug) THEN
1643 1 equemene
                 WRITE(*,*) 'ind_zmat 5'
1644 1 equemene
                 WRITE(*,'(1X,4(1X,I5))') ind_zmat(1,1)
1645 1 equemene
                 WRITE(*,'(1X,4(1X,I5))') ind_zmat(2,1), ind_zmat(2,2)
1646 1 equemene
                 WRITE(*,'(1X,4(1X,I5))') ind_zmat(3,1), ind_zmat(3,2), ind_zmat(3,3)
1647 1 equemene
                 DO Ip=4,izm
1648 1 equemene
                    WRITE(*,'(1X,4(1X,I5))') ind_zmat(Ip,1),  &
1649 1 equemene
                         ind_zmat(Ip,2),ind_zmat(Ip,3), ind_zmat(Ip,4)
1650 1 equemene
                 END DO
1651 1 equemene
              END IF
1652 1 equemene
1653 1 equemene
           END Do              ! DO WHILE CaFaire
1654 1 equemene
1655 1 equemene
1656 1 equemene
        ELSE     ! FrozBlock(I,0)==1
1657 1 equemene
           if (debug) WRITE(*,*) 'IFrag=',IFrag,'Frozblock(I,0)/=1',Frozblock(IFrag,0)
1658 1 equemene
           ! We have many frozen atoms for one fragment. We will have to choose
1659 1 equemene
           ! the first one, and then to decide when to swich...
1660 1 equemene
           Iat=0
1661 1 equemene
           I0=-1
1662 1 equemene
           DO I=1,FrozBlock(IFrag,0)
1663 1 equemene
              JAt=FrozBlock(IFrag,I)
1664 1 equemene
              if (debug) WRITE(*,*) Jat, &
1665 1 equemene
                   (LiaisonsBis(Jat,Itmp),Itmp=0,LiaisonsBis(Jat,0))
1666 1 equemene
              IF (LiaisonsBis(Jat,0).GT.I0) THEN
1667 1 equemene
                 I0=LiaisonsBis(Jat,0)
1668 1 equemene
                 Iat=Jat
1669 1 equemene
              END IF
1670 1 equemene
           END DO
1671 1 equemene
           ! Iat is the starting frozen atom
1672 1 equemene
           IF (debug) WRITE(*,*) 'Choosing atom ',iat,'as a starting atom for frag',ifrag
1673 1 equemene
           DejaFait(iat)=.TRUE.
1674 1 equemene
           IdxCaFaire=2
1675 1 equemene
           CaFaire(1)=iat
1676 1 equemene
           CaFaire(2)=0
1677 1 equemene
           IaFaire=1
1678 1 equemene
           FCaf(Iat)=.TRUE.
1679 1 equemene
           DO WHILE (CaFaire(IaFaire).NE.0)
1680 1 equemene
              n1=CaFaire(IaFaire)
1681 1 equemene
              if (debug) WRITE(*,*) 'Iafaire,n1,dejafait,idx_zmat', &
1682 1 equemene
                   IaFaire,n1,    DejaFait(n1),idx_zmat(n1)
1683 1 equemene
              if (debug) WRITE(*,*) 'Cafaire', &
1684 1 equemene
                   (CaFaire(J),J=Iafaire,IdxCAfaire)
1685 1 equemene
              SELECT CASE(idx_zmat(n1))
1686 1 equemene
              CASE (1)
1687 1 equemene
                 n2=ind_zmat(2,1)
1688 1 equemene
                 n3=ind_zmat(3,1)
1689 1 equemene
              CASE (2)
1690 1 equemene
                 n2=ind_zmat(1,1)
1691 1 equemene
                 n3=ind_zmat(3,1)
1692 1 equemene
              CASE (3:)
1693 1 equemene
                 n2=ind_zmat(idx_zmat(n1),2)
1694 1 equemene
                 n3=ind_zmat(idx_zmat(n1),3)
1695 1 equemene
              END SELECT
1696 1 equemene
1697 1 equemene
              if (debug) WRITE(*,*) "DBG n1,Liaisons(n1,0)",n1,Liaisons(n1,0)
1698 1 equemene
              DO I3=1,Liaisons(n1,0)
1699 1 equemene
                 IAt=Liaisons(n1,I3)
1700 1 equemene
                 if (debug) WRITE(*,*) "DBG I3,Iat",I3,Iat
1701 1 equemene
                 ! PFL 2007.Apr.16 ->
1702 1 equemene
                 ! We add ALL atoms linked to n1 to CaFaire
1703 1 equemene
                 ! But we delete their link to n1
1704 1 equemene
!! PFL 2007.Aug.28 ->
1705 1 equemene
! re-add the test on FCaf in order not to put the same atom more than once in
1706 1 equemene
! CaFaire array.
1707 1 equemene
                 IF (.NOT.FCaf(Iat)) THEN
1708 1 equemene
                    CaFaire(IdxCaFaire)=Iat
1709 1 equemene
                    IdxCaFaire=IdxCaFaire+1
1710 1 equemene
                    CaFaire(IdxCaFaire)=0
1711 1 equemene
                    FCaf(Iat)=.TRUE.
1712 1 equemene
                    if (debug) WRITE(*,*) 'Adding ',iat,' to CaFaire. I3=',I3,'IdxCafaire=',IdxCafaire
1713 1 equemene
                    if (debug) WRITE(*,*) 'Cafaire',(CaFaire(J),J=Iafaire,IdxCAfaire)
1714 1 equemene
1715 1 equemene
                 END IF
1716 1 equemene
!! <-- PFL 2007.Aug.28
1717 1 equemene
1718 1 equemene
                 Call Annul(Liaisons,Iat,n1)
1719 1 equemene
                 Liaisons(iat,0)=Liaisons(Iat,0)-1
1720 1 equemene
                 ! <- PFL 2007.Apr.16
1721 1 equemene
                 IF (.NOT.DejaFait(Iat)) THEN
1722 1 equemene
                    izm=izm+1
1723 1 equemene
                    !                 ind_zmat(izm,1)=iat
1724 1 equemene
                    !                 ind_zmat(izm,2)=n1
1725 1 equemene
                    !                 ind_zmat(izm,3)=n2
1726 1 equemene
                    !                 ind_zmat(izm,4)=n3
1727 1 equemene
                    Call add2indzmat(na,izm,Iat,n1,n2,n3,ind_zmat,x,y,z)
1728 1 equemene
                    idx_zmat(iat)=izm
1729 1 equemene
                    !                  Call Annul(Liaisons,n1,iat)
1730 1 equemene
1731 1 equemene
                    n3=iat
1732 1 equemene
                    DejaFait(Iat)=.TRUE.
1733 1 equemene
                 END IF
1734 1 equemene
              END DO
1735 1 equemene
1736 1 equemene
              if (debug) WRITE(*,*) 'I3,n1,Liaisons(n1,:)', &
1737 1 equemene
                   I3,n1,(Liaisons(n1,J),J=0,Liaisons(n1,0))
1738 1 equemene
1739 1 equemene
1740 1 equemene
              if (debug.AND.(izm.GT.izm0)) THEN
1741 1 equemene
                 WRITE(*,*) 'ind_zmat 6, izm=',izm
1742 1 equemene
                 WRITE(*,'(1X,4(1X,I5))') ind_zmat(1,1)
1743 1 equemene
                 WRITE(*,'(1X,4(1X,I5))') ind_zmat(2,1), ind_zmat(2,2)
1744 1 equemene
                 WRITE(*,'(1X,4(1X,I5))') ind_zmat(3,1), ind_zmat(3,2),  &
1745 1 equemene
                      ind_zmat(3,3)
1746 1 equemene
                 DO Ip=4,izm
1747 1 equemene
                    WRITE(*,'(1X,4(1X,I5))') ind_zmat(Ip,1), &
1748 1 equemene
                         ind_zmat(Ip,2),ind_zmat(Ip,3), ind_zmat(Ip,4)
1749 1 equemene
                 END DO
1750 1 equemene
                 izm0=izm
1751 1 equemene
              END IF
1752 1 equemene
1753 1 equemene
              IaFaire=IaFaire+1
1754 1 equemene
1755 1 equemene
1756 1 equemene
           END Do              ! DO WHILE CaFaire
1757 1 equemene
1758 1 equemene
        END IF  ! FrozBlock(I,0)==1
1759 1 equemene
1760 1 equemene
        IFrag=IFrag+1
1761 1 equemene
     END DO                    ! Loop on all fragments
1762 1 equemene
1763 1 equemene
1764 1 equemene
     DO IFrag=1,NbFrag
1765 1 equemene
        IF (FrozBlock(IFrag,0).EQ.0) THEN
1766 1 equemene
           if (debug) WRITE(*,*) 'Adding fragment :', ifrag,'with no frozen atoms'
1767 1 equemene
           ! We have no frozen atoms for this fragment. We will have to choose
1768 1 equemene
           ! the first atom to put.
1769 1 equemene
           ! For now, we do not care of the 'central' atom (ie the one with
1770 1 equemene
           ! no CP atoms...)
1771 1 equemene
           ! We just take the atom that is the closest to the already placed
1772 1 equemene
           ! atoms !
1773 1 equemene
1774 1 equemene
1775 1 equemene
           I0=0
1776 1 equemene
           I1=0
1777 1 equemene
           d=1e9
1778 1 equemene
           DO J=1,izm
1779 1 equemene
              Jat=ind_zmat(J,1)
1780 1 equemene
              DO I=1,NbAtfrag(IFrag)
1781 1 equemene
                 IAt=FragAt(IFrag,I)
1782 1 equemene
                 IF (.NOT.DejaFait(Iat)) THEN
1783 1 equemene
                    Call vecteur(Iat,Jat,x,y,z,vx1,vy1,vz1,norm1)
1784 1 equemene
                    IF (norm1.LT.d) THEN
1785 1 equemene
                       I1=Jat
1786 1 equemene
                       I0=Iat
1787 1 equemene
                       d=Norm1
1788 1 equemene
                    END IF
1789 1 equemene
                 END IF
1790 1 equemene
              END DO
1791 1 equemene
           END DO
1792 1 equemene
1793 1 equemene
           Iat=I0
1794 1 equemene
           n1=I1
1795 1 equemene
1796 1 equemene
           IF (debug) WRITE(*,*) Iat,' starting atom for frag',ifrag
1797 1 equemene
1798 1 equemene
1799 1 equemene
           SELECT CASE(idx_zmat(n1))
1800 1 equemene
           CASE (1)
1801 1 equemene
              n2=ind_zmat(2,1)
1802 1 equemene
              n3=ind_zmat(3,1)
1803 1 equemene
           CASE (2)
1804 1 equemene
              n2=ind_zmat(1,1)
1805 1 equemene
              n3=ind_zmat(3,1)
1806 1 equemene
           CASE (3:)
1807 1 equemene
              n2=ind_zmat(idx_zmat(n1),2)
1808 1 equemene
              n3=ind_zmat(idx_zmat(n1),3)
1809 1 equemene
           END SELECT
1810 1 equemene
1811 1 equemene
           izm=izm+1
1812 1 equemene
           !        ind_zmat(izm,1)=iat
1813 1 equemene
           !        ind_zmat(izm,2)=n1
1814 1 equemene
           !        ind_zmat(izm,3)=n2
1815 1 equemene
           !        ind_zmat(izm,4)=n3
1816 1 equemene
           Call add2indzmat(na,izm,Iat,n1,n2,n3,ind_zmat,x,y,z)
1817 1 equemene
           idx_zmat(iat)=izm
1818 1 equemene
1819 1 equemene
1820 1 equemene
           DejaFait(iat)=.TRUE.
1821 1 equemene
           IdxCaFaire=2
1822 1 equemene
           CaFaire(1)=iat
1823 1 equemene
           CaFaire(2)=0
1824 1 equemene
           IaFaire=1
1825 1 equemene
           FCaf(Iat)=.TRUE.
1826 1 equemene
           DO WHILE (CaFaire(IaFaire).NE.0)
1827 1 equemene
              n1=CaFaire(IaFaire)
1828 1 equemene
              if (debug) WRITE(*,*) 'Iafaire,n1',IaFaire,n1, &
1829 1 equemene
                   DejaFait(n1),idx_zmat(n1)
1830 1 equemene
              if (debug) WRITE(*,*) 'Cafaire', &
1831 1 equemene
                   (CaFaire(J),J=Iafaire,IdxCAfaire)
1832 1 equemene
              SELECT CASE(idx_zmat(n1))
1833 1 equemene
              CASE (1)
1834 1 equemene
                 n2=ind_zmat(2,1)
1835 1 equemene
                 n3=ind_zmat(3,1)
1836 1 equemene
              CASE (2)
1837 1 equemene
                 n2=ind_zmat(1,1)
1838 1 equemene
                 n3=ind_zmat(3,1)
1839 1 equemene
              CASE (3:)
1840 1 equemene
                 n2=ind_zmat(idx_zmat(n1),2)
1841 1 equemene
                 n3=ind_zmat(idx_zmat(n1),3)
1842 1 equemene
              END SELECT
1843 1 equemene
1844 1 equemene
1845 1 equemene
              DO I3=1,Liaisons(n1,0)
1846 1 equemene
                 IAt=Liaisons(n1,I3)
1847 1 equemene
                 ! PFL 2007.Apr.16 ->
1848 1 equemene
                 ! We add ALL atoms linked to n1 to CaFaire
1849 1 equemene
                 ! But we delete their link to n1
1850 1 equemene
!! PFL 2007.Aug.28 ->
1851 1 equemene
! re-add the test on FCaf in order not to put the same atom more than once in
1852 1 equemene
! CaFaire array.
1853 1 equemene
                 IF (.NOT.FCaf(Iat)) THEN
1854 1 equemene
                    CaFaire(IdxCaFaire)=Iat
1855 1 equemene
                    IdxCaFaire=IdxCaFaire+1
1856 1 equemene
                    CaFaire(IdxCaFaire)=0
1857 1 equemene
                    FCaf(Iat)=.TRUE.
1858 1 equemene
                 END IF
1859 1 equemene
!! <-- PFL 2007.Aug.28
1860 1 equemene
1861 1 equemene
                 Call Annul(Liaisons,Iat,n1)
1862 1 equemene
                 Liaisons(iat,0)=Liaisons(Iat,0)-1
1863 1 equemene
                 if (debug) WRITE(*,*) 'Adding ',iat,' to CaFaire. I3=',I3
1864 1 equemene
                 if (debug) WRITE(*,*) 'Cafaire',(CaFaire(J),J=Iafaire,IdxCAfaire)
1865 1 equemene
1866 1 equemene
                 ! <- PFL 2007.Apr.16
1867 1 equemene
                 IF (.NOT.DejaFait(Liaisons(n1,i3))) THEN
1868 1 equemene
                    IAt=Liaisons(n1,I3)
1869 1 equemene
                    izm=izm+1
1870 1 equemene
                    !                 ind_zmat(izm,1)=iat
1871 1 equemene
                    !                 ind_zmat(izm,2)=n1
1872 1 equemene
                    !                 ind_zmat(izm,3)=n2
1873 1 equemene
                    !                 ind_zmat(izm,4)=n3
1874 1 equemene
                    Call add2indzmat(na,izm,Iat,n1,n2,n3,ind_zmat,x,y,z)
1875 1 equemene
                    idx_zmat(iat)=izm
1876 1 equemene
1877 1 equemene
                    n3=iat
1878 1 equemene
                    DejaFait(Iat)=.TRUE.
1879 1 equemene
                 END IF
1880 1 equemene
1881 1 equemene
              if (debug) WRITE(*,*) 'I3,n1,Liaisons(n1,:)', &
1882 1 equemene
                   I3,n1,(Liaisons(n1,J),J=0,Liaisons(n1,0))
1883 1 equemene
              END DO
1884 1 equemene
              IaFaire=IaFaire+1
1885 1 equemene
1886 1 equemene
              if (debug) THEN
1887 1 equemene
                 WRITE(*,*) 'ind_zmat 7', izm
1888 1 equemene
                 WRITE(*,'(1X,4(1X,I5))') ind_zmat(1,1)
1889 1 equemene
                 WRITE(*,'(1X,4(1X,I5))') ind_zmat(2,1), ind_zmat(2,2)
1890 1 equemene
                 WRITE(*,'(1X,4(1X,I5))') ind_zmat(3,1), ind_zmat(3,2),ind_zmat(3,3)
1891 1 equemene
                 DO Ip=4,izm
1892 1 equemene
                    WRITE(*,'(1X,4(1X,I5))') ind_zmat(Ip,1), &
1893 1 equemene
                         ind_zmat(Ip,2),  &
1894 1 equemene
                         ind_zmat(Ip,3), ind_zmat(Ip,4)
1895 1 equemene
                 END DO
1896 1 equemene
              END IF
1897 1 equemene
1898 1 equemene
           END Do              ! DO WHILE CaFaire
1899 1 equemene
        END IF                 ! FrozBlock(IFrag,0).EQ.0
1900 1 equemene
1901 1 equemene
     END DO                    ! Loop on all fragments without frozen atoms
1902 1 equemene
1903 1 equemene
     if (debug) THEN
1904 1 equemene
        WRITE(*,*) Na+Izm
1905 1 equemene
        WRITE(*,*) 'Done... ', izm
1906 1 equemene
        DO J=1,Na
1907 1 equemene
           WRITE(*,'(1X,A5,3(1X,F10.6))') Nom(Atome(J)),X(J),Y(J),Z(J)
1908 1 equemene
        END DO
1909 1 equemene
        DO I=1,Izm
1910 1 equemene
           J=ind_zmat(I,1)
1911 1 equemene
           WRITE(*,'(1X,A5,3(1X,F10.6))') 'X ',X(J),Y(J),Z(J)
1912 1 equemene
        END DO
1913 1 equemene
        IF (izm.NE.Na) THEN
1914 1 equemene
           WRITE(*,*) "Atoms not done:"
1915 1 equemene
           DO I=1,Na
1916 1 equemene
              IF (.NOT.DejaFait(I)) WRITE(*,'(I5)',ADVANCE='NO') I
1917 1 equemene
           END DO
1918 1 equemene
        END IF
1919 1 equemene
     END IF
1920 1 equemene
1921 1 equemene
1922 1 equemene
     ! We have ind_zmat. We calculate val_zmat :-)
1923 1 equemene
     if (debug) WRITE(*,*) "Calculating val_zmat"
1924 1 equemene
1925 1 equemene
     val_zmat(1,1)=0.d0
1926 1 equemene
     val_zmat(1,2)=0.d0
1927 1 equemene
     val_zmat(1,3)=0.d0
1928 1 equemene
     val_zmat(2,2)=0.d0
1929 1 equemene
     val_zmat(2,3)=0.d0
1930 1 equemene
     val_zmat(3,3)=0.d0
1931 1 equemene
1932 1 equemene
     n1=ind_zmat(2,1)
1933 1 equemene
     n2=ind_zmat(2,2)
1934 1 equemene
1935 1 equemene
     CALL vecteur(n2,n1,x,y,z,vx1,vy1,vz1,norm1)
1936 1 equemene
1937 1 equemene
     val_zmat(2,1)=norm1
1938 1 equemene
1939 1 equemene
1940 1 equemene
     n1=ind_zmat(3,1)
1941 1 equemene
     n2=ind_zmat(3,2)
1942 1 equemene
     n3=ind_zmat(3,3)
1943 1 equemene
1944 1 equemene
     CALL vecteur(n2,n1,x,y,z,vx1,vy1,vz1,norm1)
1945 1 equemene
1946 1 equemene
     val_zmat(3,1)=norm1
1947 1 equemene
1948 1 equemene
     CALL vecteur(n2,n3,x,y,z,vx2,vy2,vz2,norm2)
1949 1 equemene
     val=angle(vx1,vy1,vz1,norm1,vx2,vy2,vz2,norm2)
1950 1 equemene
1951 1 equemene
     val_zmat(3,2)=val
1952 1 equemene
1953 1 equemene
     DO i=4,na
1954 1 equemene
1955 1 equemene
        n1=ind_zmat(i,1)
1956 1 equemene
        n2=ind_zmat(i,2)
1957 1 equemene
        n3=ind_zmat(i,3)
1958 1 equemene
        n4=ind_zmat(i,4)
1959 1 equemene
1960 1 equemene
        if (debug) WRITE(*,*) "Doing i,n1,n2,n3,n4",i,n1,n2,n3,n4
1961 1 equemene
        CALL vecteur(n2,n1,x,y,z,vx1,vy1,vz1,norm1)
1962 1 equemene
1963 1 equemene
        CALL vecteur(n2,n3,x,y,z,vx2,vy2,vz2,norm2)
1964 1 equemene
        val=angle(vx1,vy1,vz1,norm1,vx2,vy2,vz2,norm2)
1965 1 equemene
1966 1 equemene
        CALL vecteur(n3,n4,x,y,z,vx3,vy3,vz3,norm3)
1967 1 equemene
        CALL produit_vect(vx1,vy1,vz1,norm1,vx2,vy2,vz2,norm2, &
1968 1 equemene
             vx4,vy4,vz4,norm4)
1969 1 equemene
        CALL produit_vect(vx3,vy3,vz3,norm3,vx2,vy2,vz2,norm2, &
1970 1 equemene
             vx5,vy5,vz5,norm5)
1971 1 equemene
1972 1 equemene
        val_d=angle_d(vx4,vy4,vz4,norm4, vx5,vy5,vz5,norm5, &
1973 1 equemene
             vx2,vy2,vz2,norm2)
1974 1 equemene
1975 1 equemene
        !     write(*,11) n1,n2,norm1,n3,val,n4,val_d
1976 1 equemene
        !11   format (2(1x,i3),1x,f8.4,2(1x,i3,1x,f8.3))
1977 1 equemene
1978 1 equemene
        val_zmat(i,1)=norm1
1979 1 equemene
        val_zmat(i,2)=val
1980 1 equemene
        val_zmat(i,3)=val_d
1981 1 equemene
1982 1 equemene
     END DO
1983 1 equemene
1984 1 equemene
     if (debug) THEN
1985 1 equemene
        WRITE(*,*) 'DBG Cre_Zmat_Constr: ind_zmat'
1986 1 equemene
        DO I=1,na
1987 1 equemene
           WRITE(*,'(1X,5I5)') (ind_zmat(i,j),j=1,5)
1988 1 equemene
        END DO
1989 1 equemene
1990 1 equemene
        WRITE(*,*) 'DBG Cre_Zmat_Constr: Full zmat'
1991 1 equemene
        DO I=1,na
1992 1 equemene
           WRITE(*,'(1X,I5,1X,I5,F8.4,2(1X,I5,1X,F7.2))') ind_zmat(i,1),(ind_zmat(i,j+1),val_zmat(i,j),j=1,3)
1993 1 equemene
        END DO
1994 1 equemene
1995 1 equemene
     END IF
1996 1 equemene
1997 1 equemene
     if (debug) WRITE(*,*) "Deallocate (FrozDist,Fragment, NbAtFrag,FragAt)"
1998 1 equemene
     DEALLOCATE(FrozDist,Fragment, NbAtFrag,FragAt)
1999 1 equemene
     if (debug) WRITE(*,*) "Deallocate FrozFrag, IdxFragAt, FrozBlock"
2000 1 equemene
     !  DEALLOCATE(FrozFrag, IdxFragAt, FrozBlock)
2001 1 equemene
     DEALLOCATE(FrozFrag,FrozBlock)
2002 1 equemene
     if (debug) WRITE(*,*) "Deallocate (DistFroz,Liaisons)"
2003 1 equemene
     DEALLOCATE(DistFroz,Liaisons)
2004 1 equemene
     if (debug) WRITE(*,*) "Deallocate (LiaisonsIni)"
2005 1 equemene
     DEALLOCATE(LiaisonsIni)
2006 1 equemene
     if (debug) WRITE(*,*) "Deallocate(CaFaire,DejaFait,FrozAt)"
2007 1 equemene
     DEALLOCATE(CaFaire,DejaFait,FrozAt)
2008 1 equemene
     if (debug) WRITE(*,*) "Deallocate (LiaisonsBis"
2009 1 equemene
     DEALLOCATE(LiaisonsBis)
2010 1 equemene
2011 1 equemene
2012 1 equemene
     if (debug) WRITE(*,*) "=============================== Exiting Calc_zmat_contr_frag ========================"
2013 1 equemene
2014 1 equemene
   END SUBROUTINE Calc_Zmat_const_frag
2015 1 equemene