Statistiques
| Révision :

root / src / Calc_zmat_frag.f90 @ 3

Historique | Voir | Annoter | Télécharger (41,2 ko)

1 1 equemene
SUBROUTINE Calc_Zmat_frag(na,atome,ind_zmat,val_zmat,x,y,z,r_cov,fact)
2 1 equemene
3 1 equemene
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
4 1 equemene
!
5 1 equemene
!   Goal: to compute a viable Z-Matrix starting from the
6 1 equemene
!         cartesian coordinates of the atoms
7 1 equemene
!
8 1 equemene
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
9 1 equemene
!
10 1 equemene
! Input:
11 1 equemene
!  na    : Number or atoms
12 1 equemene
! atome  : Mass number of the atoms (H=1, He=2,...)
13 1 equemene
! x,y,z  : cartesian coordinates of the atoms
14 1 equemene
! r_cov  : array containing the covalent radii of the atoms
15 1 equemene
!  fact  : multiplicative factor used to determine if two atoms are linked.
16 1 equemene
!          see CalcCnct for more details.
17 1 equemene
!
18 1 equemene
! Output:
19 1 equemene
! ind_zmat : INTEGER(na,5) contains the indices of the Z-matrix
20 1 equemene
! val_zmat : REAL(na,3)    contains the values of the Z-matrix
21 1 equemene
!
22 1 equemene
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
23 1 equemene
! History
24 1 equemene
!
25 1 equemene
! v1.0 written for Cart a long time ago. Does not use fragment analysis, but was quite good !
26 1 equemene
!
27 1 equemene
! v2.0 12/2007
28 1 equemene
! Comes from Calc_zmat_constr_frag, based on a fragment analysis of the
29 1 equemene
! system under study.
30 1 equemene
! It should be more flexible and robust.
31 1 equemene
!
32 1 equemene
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
33 1 equemene
34 1 equemene
  Use Path_module, only : max_Z, NMaxL, Nom,MaxFroz, Pi
35 1 equemene
  Use Io_module
36 1 equemene
37 1 equemene
  IMPLICIT NONE
38 1 equemene
39 1 equemene
  CHARACTER(5) ::  AtName
40 1 equemene
  integer(KINT), INTENT(IN) ::  na,atome(na)
41 1 equemene
  real(KREAL), INTENT(IN)   ::  x(Na),y(Na),z(Na),fact
42 1 equemene
  real(KREAL), INTENT(IN)   ::  r_cov(0:Max_Z)
43 1 equemene
44 1 equemene
  INTEGER(KINT), INTENT(OUT) :: ind_zmat(Na,5)
45 1 equemene
  real(KREAL), INTENT(OUT)   :: val_zmat(Na,3)
46 1 equemene
47 1 equemene
  INTEGER(KINT) :: idx_zmat(NA)
48 1 equemene
! Frozen contains the indices of frozen atoms
49 1 equemene
! INTEGER(KINT) Frozen(*),NFroz
50 1 equemene
! Number of fragment, Index of the current fragment for loops
51 1 equemene
  INTEGER(KINT) :: NbFrag,IdxFrag
52 1 equemene
! Fragment(I) contains the fragment index to which I belongs
53 1 equemene
! NbAtFrag(j) contains the number of atoms of fragment j
54 1 equemene
  INTEGER(KINT), ALLOCATABLE :: Fragment(:),NbAtFrag(:) !na
55 1 equemene
! FragAt(i,:) lists the atoms of fragment i
56 1 equemene
  INTEGER(KINT), ALLOCATABLE :: FragAt(:,:) !na,na
57 1 equemene
! MaxLFrag(i,1) contains the maximum of links for an atom for fragment i
58 1 equemene
! MaxLFrag(i,2) is the atom that has this number of linked atoms
59 1 equemene
  INTEGER(KINT), ALLOCATABLE :: MaxLFrag(:,:) !na,2
60 1 equemene
! INTEGER(KINT), ALLOCATABLE :: IdxFragAt(:) !na
61 1 equemene
! INTEGER(KINT), ALLOCATABLE :: FrozBlock(:,:) !(na,0:na)
62 1 equemene
! DistFrag contains the distance between a given atom and some other atoms
63 1 equemene
  REAL(KREAL), ALLOCATABLE :: DistFrag(:) !na
64 1 equemene
! FragDist(I) contains the index of the atoms corresponding to DistFrag(I)
65 1 equemene
  INTEGER(KINT), ALLOCATABLE :: FragDist(:) ! na
66 1 equemene
67 1 equemene
  INTEGER(KINT) :: IdxCaFaire, IAfaire
68 1 equemene
  INTEGER(KINT), ALLOCATABLE ::  LIAISONS(:,:) ! (Na,0:NMaxL)
69 1 equemene
! INTEGER(KINT), ALLOCATABLE ::  LiaisonsIni(:,:) ! (Na,0:NMaxL)
70 1 equemene
  INTEGER(KINT), ALLOCATABLE :: CAFaire(:) ! (Na)
71 1 equemene
72 1 equemene
  real(KREAL) ::  vx1,vy1,vz1,norm1
73 1 equemene
  real(KREAL) ::  vx2,vy2,vz2,norm2
74 1 equemene
  real(KREAL) ::  vx3,vy3,vz3,norm3
75 1 equemene
  real(KREAL) ::  vx4,vy4,vz4,norm4
76 1 equemene
  real(KREAL) ::  vx5,vy5,vz5,norm5
77 1 equemene
  real(KREAL) ::  val,val_d, d12, d13,d23,d
78 1 equemene
  Logical PasFini,Debug, FirstAt, DebugGaussian
79 1 equemene
  LOGICAL, ALLOCATABLE :: DejaFait(:), FCaf(:) !(na)
80 1 equemene
!  Logical, ALLOCATABLE ::  FrozAt(:)    !T if this atom is frozen
81 1 equemene
  LOGICAL F1213, F1223,F1323
82 1 equemene
83 1 equemene
  INTEGER(KINT) :: I,J,n0,n1,n2,n3,n4,IAt,IL,JL,IFrag,ITmp, K, KMax
84 1 equemene
  INTEGER(KINT) :: IMax, I3,I1,Ip, IFragFroz
85 1 equemene
  INTEGER(KINT) :: I0, Izm, JAt,Izm0
86 1 equemene
  INTEGER(KINT) :: OrderZmat
87 1 equemene
88 1 equemene
  REAL(KREAL) :: sDihe
89 1 equemene
90 1 equemene
  INTERFACE
91 1 equemene
     function valid(string) result (isValid)
92 1 equemene
       CHARACTER(*), intent(in) :: string
93 1 equemene
       logical                  :: isValid
94 1 equemene
     END function VALID
95 1 equemene
96 1 equemene
     FUNCTION angle(v1x,v1y,v1z,norm1,v2x,v2y,v2z,norm2)
97 1 equemene
       INTEGER, PARAMETER :: KREAL=KIND(1.0D0)
98 1 equemene
       real(KREAL) ::  v1x,v1y,v1z,norm1
99 1 equemene
       real(KREAL) ::  v2x,v2y,v2z,norm2
100 1 equemene
       real(KREAL) ::  angle
101 1 equemene
     END FUNCTION ANGLE
102 1 equemene
103 1 equemene
     FUNCTION SinAngle(v1x,v1y,v1z,norm1,v2x,v2y,v2z,norm2)
104 1 equemene
       INTEGER, PARAMETER :: KREAL=KIND(1.0D0)
105 1 equemene
       real(KREAL) ::  v1x,v1y,v1z,norm1
106 1 equemene
       real(KREAL) ::  v2x,v2y,v2z,norm2
107 1 equemene
       real(KREAL) ::  SinAngle
108 1 equemene
     END FUNCTION SINANGLE
109 1 equemene
110 1 equemene
     FUNCTION angle_d(v1x,v1y,v1z,norm1,v2x,v2y,v2z,norm2,v3x,v3y,v3z,norm3)
111 1 equemene
       INTEGER, PARAMETER :: KREAL=KIND(1.0D0)
112 1 equemene
       real(KREAL) ::  v1x,v1y,v1z,norm1
113 1 equemene
       real(KREAL) ::  v2x,v2y,v2z,norm2
114 1 equemene
       real(KREAL) ::  v3x,v3y,v3z,norm3
115 1 equemene
       real(KREAL) ::  angle_d,ca,sa
116 1 equemene
     END FUNCTION ANGLE_D
117 1 equemene
  END INTERFACE
118 1 equemene
119 1 equemene
  debug=valid("calc_zmat").OR.valid("calc_zmat_frag")
120 1 equemene
  debugGaussian=valid("zmat_gaussian")
121 1 equemene
122 1 equemene
  if (debug) WRITE(*,*) "=============================== Entering Calc_zmat_frag ========================"
123 1 equemene
  if (na.le.2) THEN
124 1 equemene
     WRITE(*,*) "I do not work for less than 2 atoms :-p"
125 1 equemene
     RETURN
126 1 equemene
  END IF
127 1 equemene
128 1 equemene
  ALLOCATE(FragDist(Na),Fragment(na), NbAtFrag(na),FragAt(na,na))
129 1 equemene
! ALLOCATE(FrozFrag(na,3), IdxFragAt(na), FrozBlock(na,0:na))
130 1 equemene
! ALLOCATE(FrozFrag(na,3))
131 1 equemene
  ALLOCATE(DistFrag(na),Liaisons(na,0:NMaxL))
132 1 equemene
! ALLOCATE(Liaisons(na,0:NMaxL),LiaisonsIni(na,0:NMaxL))
133 1 equemene
! ALLOCATE(CaFaire(na),DejaFait(Na),FCaf(na),FrozAt(na))
134 1 equemene
  ALLOCATE(CaFaire(na+1),DejaFait(Na),FCaf(na))
135 1 equemene
136 1 equemene
  if (debug) THEN
137 1 equemene
     WRITE(*,*) "DBG Calc_zmat_frag - Cartesian coordinates"
138 1 equemene
     DO I=1,na
139 1 equemene
        WRITE(*,'(1X,A3,3(1X,F15.8))') Nom(atome(i)),x(i),y(i),z(i)
140 1 equemene
     END DO
141 1 equemene
  END if
142 1 equemene
143 1 equemene
  DO I=1,na
144 1 equemene
     DO J=1,5
145 1 equemene
        Ind_Zmat(I,J)=0
146 1 equemene
     END DO
147 1 equemene
  END DO
148 1 equemene
149 1 equemene
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
150 1 equemene
!
151 1 equemene
!     Easy case : 3 or less atoms
152 1 equemene
!
153 1 equemene
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
154 1 equemene
  if (Na.eq.3) THEN
155 1 equemene
     d12=sqrt((x(1)-x(2))**2+(y(1)-y(2))**2+(z(1)-z(2))**2)
156 1 equemene
     d13=sqrt((x(1)-x(3))**2+(y(1)-y(3))**2+(z(1)-z(3))**2)
157 1 equemene
     d23=sqrt((x(3)-x(2))**2+(y(3)-y(2))**2+(z(3)-z(2))**2)
158 1 equemene
     F1213=(d12<=d13)
159 1 equemene
     F1323=(d13<=d23)
160 1 equemene
     F1223=(d12<=d23)
161 1 equemene
     if (debug) THEN
162 1 equemene
        WRITE(*,*) "DEBUG Calc_Zmat 3 atoms"
163 1 equemene
        WRITE(*,*) "d12,d13,d23:",d12,d13,d23
164 1 equemene
        WRITE(*,*) "F1213,F1323,F1223:",F1213,F1323,F1223
165 1 equemene
     END IF
166 1 equemene
     OrderZmat=0
167 1 equemene
     if (F1213) orderZmat=OrderZmat+4
168 1 equemene
     if (F1323) orderZmat=OrderZmat+2
169 1 equemene
     if (F1223) orderZmat=OrderZmat+1
170 1 equemene
     if (debug) WRITE(*,*) 'OrderZmat=',OrderZmat
171 1 equemene
     SELECT CASE (OrderZmat)
172 1 equemene
        CASE (0)
173 1 equemene
! F F F ordre 2-3----1
174 1 equemene
           ind_zmat(1,1)=3
175 1 equemene
           ind_zmat(2,1)=2
176 1 equemene
           ind_zmat(2,2)=3
177 1 equemene
           ind_zmat(3,1)=1
178 1 equemene
           ind_zmat(3,2)=3
179 1 equemene
           ind_zmat(3,3)=2
180 1 equemene
        CASE (2)
181 1 equemene
! F T F ordre 1-3----2
182 1 equemene
           ind_zmat(1,1)=3
183 1 equemene
           ind_zmat(2,1)=1
184 1 equemene
           ind_zmat(2,2)=3
185 1 equemene
           ind_zmat(3,1)=2
186 1 equemene
           ind_zmat(3,2)=3
187 1 equemene
           ind_zmat(3,3)=1
188 1 equemene
        CASE (3)
189 1 equemene
! F T T ordre 2---1-3
190 1 equemene
           ind_zmat(1,1)=1
191 1 equemene
           ind_zmat(2,1)=3
192 1 equemene
           ind_zmat(2,2)=1
193 1 equemene
           ind_zmat(3,1)=2
194 1 equemene
           ind_zmat(3,2)=1
195 1 equemene
           ind_zmat(3,3)=3
196 1 equemene
        CASE (5)
197 1 equemene
! T F T  ordre 1-2----3
198 1 equemene
           ind_zmat(1,1)=2
199 1 equemene
           ind_zmat(2,1)=1
200 1 equemene
           ind_zmat(2,2)=2
201 1 equemene
           ind_zmat(3,1)=3
202 1 equemene
           ind_zmat(3,2)=2
203 1 equemene
           ind_zmat(3,3)=1
204 1 equemene
        CASE (7)
205 1 equemene
! T T T ordre 3----1-2
206 1 equemene
           ind_zmat(1,1)=1
207 1 equemene
           ind_zmat(2,1)=2
208 1 equemene
           ind_zmat(2,2)=1
209 1 equemene
           ind_zmat(3,1)=3
210 1 equemene
           ind_zmat(3,2)=1
211 1 equemene
           ind_zmat(3,3)=2
212 1 equemene
        END SELECT
213 1 equemene
214 1 equemene
     IF (debug) THEN
215 1 equemene
        WRITE(*,*) "DBG Calc_zmat_frag - Nat=3 -"
216 1 equemene
        DO i=1,na
217 1 equemene
           WRITE(*,'(1X,A3,5(1X,I5))') Nom(Atome(ind_zmat(i,1))),(ind_zmat(i,j),j=1,5)
218 1 equemene
        END DO
219 1 equemene
     END IF
220 1 equemene
221 1 equemene
     ! We have ind_zmat, we fill val_zmat
222 1 equemene
     val_zmat=0.d0
223 1 equemene
     n2=ind_zmat(2,1)
224 1 equemene
     n1=ind_zmat(2,2)
225 1 equemene
     d=sqrt((x(n1)-x(n2))**2+(y(n1)-y(n2))**2+(z(n1)-z(n2))**2)
226 1 equemene
     val_zmat(2,1)=d
227 1 equemene
     n1=ind_zmat(3,1)
228 1 equemene
     n2=ind_zmat(3,2)
229 1 equemene
     n3=ind_zmat(3,3)
230 1 equemene
     CALL vecteur(n2,n1,x,y,z,vx1,vy1,vz1,norm1)
231 1 equemene
     if (debug) write(*,*) n1,n2,norm1
232 1 equemene
     val_zmat(3,1)=norm1
233 1 equemene
234 1 equemene
     CALL vecteur(n2,n3,x,y,z,vx2,vy2,vz2,norm2)
235 1 equemene
     val=angle(vx1,vy1,vz1,norm1,vx2,vy2,vz2,norm2)
236 1 equemene
     if (debug) write(*,*) n2,n3,norm2,val
237 1 equemene
     val_zmat(3,2)=val
238 1 equemene
239 1 equemene
     RETURN
240 1 equemene
  END IF !matches if (Na.eq.3) THEN
241 1 equemene
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
242 1 equemene
!
243 1 equemene
!  End of Easy case : 3 or less atoms
244 1 equemene
!
245 1 equemene
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
246 1 equemene
!
247 1 equemene
! General Case
248 1 equemene
!
249 1 equemene
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
250 1 equemene
!
251 1 equemene
252 1 equemene
! Initialization
253 1 equemene
  DejaFait=.False.
254 1 equemene
  Liaisons=0
255 1 equemene
  ind_zmat=0
256 1 equemene
  val_zmat=0.d0
257 1 equemene
258 1 equemene
  if (debug) WRITE(*,*) "Coucou from Calc_zmat_frag.f90; L240"
259 1 equemene
260 1 equemene
  if (debug) THEN
261 1 equemene
     WRITE(*,*) "Bonds initialized"
262 1 equemene
     WRITE(*,*) 'Covalent radii used'
263 1 equemene
     DO iat=1,na
264 1 equemene
        i=atome(iat)
265 1 equemene
        WRITE(*,*) Nom(I),Iat,r_cov(i),r_cov(i)*fact
266 1 equemene
     END DO
267 1 equemene
  END IF
268 1 equemene
269 1 equemene
1003 FORMAT(1X,I4,' - ',25(I5))
270 1 equemene
271 1 equemene
!   First step : connectivity  are calculated
272 1 equemene
273 1 equemene
  Call CalcCnct(na,atome,x,y,z,LIAISONS,r_cov,fact)
274 1 equemene
275 1 equemene
  if (debug) THEN
276 1 equemene
     WRITE(*,*) "Connections calculated"
277 1 equemene
     DO IL=1,na
278 1 equemene
        WRITE(IOOUT,1003) Il,(LIAISONS(IL,JL),JL=0,NMaxL)
279 1 equemene
     END DO
280 1 equemene
  END IF
281 1 equemene
282 1 equemene
  FCaf=.TRUE.
283 1 equemene
  Call Decomp_frag(na,liaisons,FCaf,nbfrag,Fragment,NbAtFrag,FragAt)
284 1 equemene
285 1 equemene
  IF (debug) THEN
286 1 equemene
     WRITE(*,*) 'I found ',NbFrag, 'fragments'
287 1 equemene
     WRITE(*,*) (NbAtFrag(I),I=1,NbFrag)
288 1 equemene
     DO I=1,NbFrag
289 1 equemene
        WRITE(*,*) NbAtFrag(I)
290 1 equemene
        WRITE(*,*) 'Fragment ', i
291 1 equemene
        DO J=1,Na
292 1 equemene
           IF (Fragment(J).EQ.I) WRITE(*,'(1X,I3,1X,A5,3(1X,F10.6))') J,Nom(Atome(J)) &
293 1 equemene
                ,X(J),Y(J),Z(J)
294 1 equemene
        END DO
295 1 equemene
        WRITE(*,*) "FragAt:",(FragAt(I,j),j=1,NbAtFrag(I))
296 1 equemene
     END DO
297 1 equemene
  END IF
298 1 equemene
299 1 equemene
 ALLOCATE(MaxLFrag(NbFrag,2))
300 1 equemene
301 1 equemene
 MaxLFrag=0
302 1 equemene
303 1 equemene
  DO I=1,NbFrag
304 1 equemene
     MaxLFrag(I,1)=Liaisons(FragAt(I,1),0)
305 1 equemene
     MaxLFrag(I,2)=FragAt(I,1)
306 1 equemene
307 1 equemene
     DO J=1,NbAtFrag(I)
308 1 equemene
	    Iat=FragAt(I,J)
309 1 equemene
        IF (Liaisons(IAt,0).GT.MaxLFrag(I,1)) THEN
310 1 equemene
		   MaxLFrag(I,1)=Liaisons(Iat,0)
311 1 equemene
		   MaxLFrag(I,2)=Iat
312 1 equemene
		END IF
313 1 equemene
     END DO
314 1 equemene
     IF (debug) WRITE(*,*) 'Frag :',I,', atom ',MaxLFrag(I,2), ' has ',MaxLFrag(I,2),' links'
315 1 equemene
  END DO
316 1 equemene
317 1 equemene
  !     We will now build the molecule fragment by fragment
318 1 equemene
  !     We choose the starting fragment with two criteria:
319 1 equemene
  !     1- Number of linked atoms:
320 1 equemene
  !       * >=3 is good as it fully defines the coordinate space
321 1 equemene
  !       * 2 is ok as we can either use a 3rd atom from the same fragment
322 1 equemene
  !       or add a X atom somewhere but this complicates quite a lot the way
323 1 equemene
  !       to treat the conversion from cartesian to zmat latter
324 1 equemene
  !       * 1 is bad...
325 1 equemene
  !     2- Size of the fragment
326 1 equemene
  !     this allows us to deal more easily with cases 1- when number of
327 1 equemene
  !     directly linked atoms is less than 3
328 1 equemene
329 1 equemene
  IFrag=0
330 1 equemene
! I0 is the number of connections of the best fragment
331 1 equemene
  I0=0
332 1 equemene
! I1 is the number of atoms of the best fragment
333 1 equemene
  I1=0
334 1 equemene
  IAt=0
335 1 equemene
  DO I=1,NbFrag
336 1 equemene
    SELECT CASE(MaxLFrag(I,1)-I0)
337 1 equemene
     CASE (1:)
338 1 equemene
        IFrag=I
339 1 equemene
        I0=MaxLFrag(I,1)
340 1 equemene
        I1=NbAtFrag(I)
341 1 equemene
        IAt=MaxLFrag(I,2)
342 1 equemene
     CASE (0)
343 1 equemene
        if (NbAtFrag(I).GT.I1) THEN
344 1 equemene
           IFrag=I
345 1 equemene
           I0=MaxLFrag(I,1)
346 1 equemene
           I1=NbAtFrag(I)
347 1 equemene
           IAt=MaxLFrag(I,2)
348 1 equemene
        END IF
349 1 equemene
     END SELECT
350 1 equemene
  END DO
351 1 equemene
352 1 equemene
  if (debug) WRITE(*,'(1X,A,I5,A,I5,A,I5,A,I5)') 'Starting with fragment:',IFrag,' with ',I0   &
353 1 equemene
      ,' max links for atom',IAt,' fragment size',NbAtFrag(IFrag)
354 1 equemene
355 1 equemene
  !     We will build the first fragment in a special way, as it will
356 1 equemene
  !     set the coordinates system
357 1 equemene
358 1 equemene
  if (debug) WRITE(*,*) 'Fragment 1, starting with atom:',IAt, &
359 1 equemene
    'with ',I0,' connections'
360 1 equemene
361 1 equemene
  DejaFait=.FALSE.
362 1 equemene
  FCaf=.FALSE.
363 1 equemene
364 1 equemene
  izm=0
365 1 equemene
  SELECT CASE (I0)
366 1 equemene
  CASE(3:)
367 1 equemene
     if (debug) WRITE(*,*) 'DBG select case I0 3'
368 1 equemene
     n0=Iat
369 1 equemene
370 1 equemene
     ITmp=2
371 1 equemene
     sDihe=0.
372 1 equemene
     n2=IAt
373 1 equemene
     n3=Liaisons(Iat,1)
374 1 equemene
     ! We search for the third atom while making sure that it is not aligned with first two !
375 1 equemene
     DO While ((ITmp.LE.Liaisons(Iat,0)).AND.(sDihe.LE.0.09d0))
376 1 equemene
        n4=Liaisons(Iat,Itmp)
377 1 equemene
        CALL vecteur(n2,n3,x,y,z,vx2,vy2,vz2,norm2)
378 1 equemene
        CALL vecteur(n3,n4,x,y,z,vx3,vy3,vz3,norm3)
379 1 equemene
        val_d=angle(vx3,vy3,vz3,norm3,vx2,vy2,vz2,norm2)
380 1 equemene
        sDiHe=abs(sin(val_d*pi/180.d0))
381 1 equemene
        if (debug) Write(*,*) 'Trying n2,n3,n4,sdihe,val_d',n2,n3,n4,sdihe,val_d
382 1 equemene
        Itmp=Itmp+1
383 1 equemene
     END DO
384 1 equemene
     If (debug) WRITE(*,*) 'Itmp,Liaisons',Itmp,Liaisons(Iat,1:NMaxL)
385 1 equemene
     Liaisons(Iat,Itmp-1)=Liaisons(iat,2)
386 1 equemene
     Liaisons(Iat,2)=n4
387 1 equemene
     If (debug) WRITE(*,*) 'Itmp,Liaisons',Itmp,Liaisons(Iat,1:NMaxL)
388 1 equemene
389 1 equemene
     if (sDihe.LE.0.09d0) THEN
390 1 equemene
        WRITE(*,*) "PROBLEM !!! All atoms linked to ",n0," are aligned..."
391 1 equemene
		WRITE(*,*) "Surprising as this atom has at least three bonds... For NOW STOP"
392 1 equemene
		STOP
393 1 equemene
     END IF
394 1 equemene
395 1 equemene
     CALL produit_vect(vx3,vy3,vz3,norm3,vx2,vy2,vz2,norm2, &
396 1 equemene
          vx5,vy5,vz5,norm5)
397 1 equemene
398 1 equemene
399 1 equemene
! We search for the fourth atom while checking that it is not aligned with 1st and 2nd atoms.
400 1 equemene
     Itmp=3
401 1 equemene
     sDiHe=0.
402 1 equemene
! PFL 28 Dec 2007 ->
403 1 equemene
! I had a test on the dihedral angle, but I cannot see why it is important to have
404 1 equemene
! a non planar fragment at the begining... ethylene works and is fully planar
405 1 equemene
! I thus suppress this test
406 1 equemene
!
407 1 equemene
!     DO While ((ITmp.LE.Liaisons(Iat,0)).AND.(sDihe.LE.0.09d0))
408 1 equemene
!        ITmp=ITmp+1
409 1 equemene
        n1=Liaisons(Iat,Itmp)
410 1 equemene
        if (debug) WRITe(*,*) 'trying n1,n2,n3,n4',n1,n2,n3,n4
411 1 equemene
        CALL vecteur(n2,n1,x,y,z,vx1,vy1,vz1,norm1)
412 1 equemene
        ! Is this atom aligned with n2-n3 ?
413 1 equemene
        val_d=angle(vx1,vy1,vz1,norm1,vx2,vy2,vz2,norm2)
414 1 equemene
        sDiHe=abs(sin(val_d*pi/180.d0))
415 1 equemene
        if (debug) Write(*,*) 'Angle n3-n2-n1',val_d
416 1 equemene
        if (sDiHe.le.0.09d0) THEN
417 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
418 1 equemene
           if (debug) WRITE(*,*) "n3-n2-n1 aligned, we interchange n3 and n4"
419 1 equemene
           n1=n3
420 1 equemene
           n3=n4
421 1 equemene
           n4=n1
422 1 equemene
           n1=Liaisons(Iat,ITmp)
423 1 equemene
           CALL vecteur(n2,n3,x,y,z,vx2,vy2,vz2,norm2)
424 1 equemene
           CALL vecteur(n2,n4,x,y,z,vx3,vy3,vz3,norm3)
425 1 equemene
           val_d=angle(vx1,vy1,vz1,norm1,vx2,vy2,vz2,norm2)
426 1 equemene
           if (debug) Write(*,*) 'NEW Angle n3-n2-n1',val_d
427 1 equemene
        END IF
428 1 equemene
429 1 equemene
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
430 1 equemene
        ! avant de tester l'angle diedre, il faut verifier que ce 4e atome n'est pas
431 1 equemene
        ! aligne avec les 2 premiers.
432 1 equemene
        ! comme on a deja test? que les 3 premiers ne sont pas alignes,
433 1 equemene
        ! s'il est align? avec les 2 premiers, on peut inverser le role de 2 et 3.
434 1 equemene
        ! On pourrait tout simplier en faisant une bete recherche parmi tous les atomes geles
435 1 equemene
        ! de ce bloc (au moins 4 ?) avec le critere 1) on les range par distance croissante
436 1 equemene
        ! 2) on les scanne tant que l'angle valence n'est pas bon, puis tant que diehedre pas bon
437 1 equemene
        ! puis les atomes des autres fragment par distance croissante.
438 1 equemene
        ! les autres fragments ne seraient additonn?s que si l'on ne trouve pas notre bonheur dans le premier bloc
439 1 equemene
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
440 1 equemene
441 1 equemene
        CALL produit_vect(vx1,vy1,vz1,norm1,vx2,vy2,vz2,norm2, &
442 1 equemene
             vx4,vy4,vz4,norm4)
443 1 equemene
        val_d=angle_d(vx4,vy4,vz4,norm4,vx5,vy5,vz5,norm5, &
444 1 equemene
             vx2,vy2,vz2,norm2)
445 1 equemene
        sDihe=abs(sin(val_d*pi/180.d0))
446 1 equemene
        if (debug) WRITE(*,*) 'n2,n3,n4,n1, angle_d',n2,n3,n4,n1,val_d
447 1 equemene
!     END DO
448 1 equemene
449 1 equemene
     DejaFait(n2)=.TRUE.
450 1 equemene
     DejaFait(n3)=.TRUE.
451 1 equemene
     DejaFait(n4)=.TRUE.
452 1 equemene
453 1 equemene
!     if (sDihe.LE.0.09d0) THEN
454 1 equemene
!        !     None of the atoms linked to IAt are good to define the third
455 1 equemene
!        !     direction in space...
456 1 equemene
!        !     We will look at the other atoms
457 1 equemene
!        !     we might improve the search so as to take the atom closest to IAt
458 1 equemene
!        if (debug) WRITE(*,*) "All atoms linked to ",Iat," are in a plane. Looking for other atoms"
459 1 equemene
!        ITmp=0
460 1 equemene
!        DO I=1,NbAtFrag(IFrag)
461 1 equemene
!           JAt=FragAt(IFrag,I)
462 1 equemene
!           if (FrozAt(Jat).AND.(.NOT.DejaFait(JAt))) THEN
463 1 equemene
!              n1=JAt
464 1 equemene
!              CALL vecteur(n2,n1,x,y,z,vx1,vy1,vz1,norm1)
465 1 equemene
!              CALL produit_vect(vx1,vy1,vz1,norm1,vx2,vy2,vz2,norm2, &
466 1 equemene
!                   vx4,vy4,vz4,norm4)
467 1 equemene
!              val_d=angle_d(vx4,vy4,vz4,norm4, &
468 1 equemene
!                   vx5,vy5,vz5,norm5, &
469 1 equemene
!                   vx2,vy2,vz2,norm2)
470 1 equemene
!              if (abs(sin(val_d)).GE.0.09D0) THEN
471 1 equemene
!                 ITmp=ITmp+1
472 1 equemene
!                 DistFrag(ITmp)=Norm1
473 1 equemene
!                 FragDist(ITmp)=JAt
474 1 equemene
!              END IF
475 1 equemene
!           END IF
476 1 equemene
!        END DO
477 1 equemene
478 1 equemene
!        IF (ITmp.EQ.0) THEN
479 1 equemene
!           !     All dihedral angles between frozen atoms are less than 5?
480 1 equemene
!           !     (or more than 175?). We have to look at other fragments :-(
481 1 equemene
!           DO I=1,NFroz
482 1 equemene
!              Jat=Frozen(I)
483 1 equemene
!              if (.NOT.DejaFait(JAt)) THEN
484 1 equemene
!                 n1=JAt
485 1 equemene
!                 CALL vecteur(n2,n1,x,y,z,vx1,vy1,vz1,norm1)
486 1 equemene
!                 CALL produit_vect(vx1,vy1,vz1,norm1, &
487 1 equemene
!                      vx2,vy2,vz2,norm2, &
488 1 equemene
!                      vx4,vy4,vz4,norm4)
489 1 equemene
!                 val_d=angle_d(vx4,vy4,vz4,norm4, &
490 1 equemene
!                      vx5,vy5,vz5,norm5, &
491 1 equemene
!                      vx2,vy2,vz2,norm2)
492 1 equemene
!                 if (abs(sin(val_d)).GE.0.09D0) THEN
493 1 equemene
!                    ITmp=ITmp+1
494 1 equemene
!                    DistFrag(ITmp)=Norm1
495 1 equemene
!                    FragDist(ITmp)=JAt
496 1 equemene
!                 END IF
497 1 equemene
!              END IF
498 1 equemene
!           END DO
499 1 equemene
!           IF (ITmp.EQ.0) THEN
500 1 equemene
!              !     All frozen atoms are in a plane... too bad
501 1 equemene
!              WRITE(*,*) 'ERROR: It seems that all frozen atoms are in a plane'
502 1 equemene
!              WRITE(*,*) 'For now, I do not treat this case'
503 1 equemene
!              STOP
504 1 equemene
!           END IF
505 1 equemene
!        END IF
506 1 equemene
!        I1=0
507 1 equemene
!        d=1e9
508 1 equemene
!        DO I=1,ITmp
509 1 equemene
!           IF (DistFrag(I).LE.d) THEN
510 1 equemene
!              d=DistFrag(I)
511 1 equemene
!              I1=FragDist(I)
512 1 equemene
!           END IF
513 1 equemene
!        END DO
514 1 equemene
!     ELSE                !(sDihe.LE.0.09d0)
515 1 equemene
!        I1=FrozBlock(IAt,ITmp)
516 1 equemene
!        if (debug) WRITE(*,*) 'I1,n1:',I1,n1
517 1 equemene
!     END IF                 !(sDihe.LE.0.09d0)
518 1 equemene
!     !     we now have the atom that is closer to the first one and that
519 1 equemene
!     !     forms a non 0/Pi dihedral angle
520 1 equemene
!
521 1 equemene
!  <- PFL 28 Dec 2007
522 1 equemene
523 1 equemene
! We construct the begining of the Z-Matrix
524 1 equemene
525 1 equemene
     ind_zmat(1,1)=n2
526 1 equemene
     ind_zmat(2,1)=n3
527 1 equemene
     ind_zmat(2,2)=n2
528 1 equemene
     ind_zmat(3,1)=n4
529 1 equemene
     ind_zmat(3,2)=n2
530 1 equemene
     ind_zmat(3,3)=n3
531 1 equemene
     DejaFait(n2)=.TRUE.
532 1 equemene
     DejaFait(n3)=.TRUE.
533 1 equemene
     DejaFait(n4)=.TRUE.
534 1 equemene
     CaFaire(1)=n3
535 1 equemene
     CaFaire(2)=n4
536 1 equemene
537 1 equemene
! PFL 28 Dec 2007
538 1 equemene
! We have not selected a fourth atom, so that the following is not needed
539 1 equemene
!     ind_zmat(4,1)=I1
540 1 equemene
!     ind_zmat(4,2)=n2
541 1 equemene
!     ind_zmat(4,3)=n3
542 1 equemene
!     ind_zmat(4,4)=n4
543 1 equemene
!     DejaFait(I1)=.TRUE.
544 1 equemene
!     CaFaire(3)=I1
545 1 equemene
!     CaFaire(4)=0
546 1 equemene
!     IdxCaFaire=4
547 1 equemene
!     izm=4
548 1 equemene
!     FCaf(I1)=.TRUE.
549 1 equemene
!!!!!!!
550 1 equemene
! and replaced by:
551 1 equemene
     CaFaire(3)=0
552 1 equemene
	 IdxCaFaire=3
553 1 equemene
	 izm=3
554 1 equemene
!
555 1 equemene
! <- PFL 28 Dec 2007
556 1 equemene
557 1 equemene
     FCaf(n2)=.TRUE.
558 1 equemene
     FCaf(n3)=.TRUE.
559 1 equemene
	 FirstAt=.TRUE.
560 1 equemene
     DO I=3,Liaisons(Iat,0)
561 1 equemene
        IF (.NOT.DejaFait(Liaisons(Iat,I))) THEN
562 1 equemene
           izm=izm+1
563 1 equemene
           !           ind_zmat(izm,1)=Liaisons(Iat,I)
564 1 equemene
           !           ind_zmat(izm,2)=n2
565 1 equemene
           !           ind_zmat(izm,3)=n3
566 1 equemene
           !           ind_zmat(izm,4)=n4
567 1 equemene
           Call add2indzmat(na,izm,Liaisons(Iat,I),n2,n3,n4,ind_zmat,x,y,z)
568 1 equemene
           if (FirstAt) THEN
569 1 equemene
		       n4=Liaisons(Iat,I)
570 1 equemene
			   FirstAt=.FALSE.
571 1 equemene
		   END IF
572 1 equemene
           IF (.NOT.FCaf(Liaisons(Iat,I))) THEN
573 1 equemene
              CaFaire(IdxCaFaire)=Liaisons(Iat,I)
574 1 equemene
              IdxCaFaire=IdxCaFaire+1
575 1 equemene
              CaFaire(IdxCaFaire)=0
576 1 equemene
              FCaf(Liaisons(Iat,I))=.TRUE.
577 1 equemene
           END IF
578 1 equemene
           DejaFait(Liaisons(Iat,I))=.TRUE.
579 1 equemene
        END IF
580 1 equemene
     END DO
581 1 equemene
582 1 equemene
     if (debug) THEN
583 1 equemene
        WRITE(*,*) "Ind_zmat 0 - SELECT CASE I0 3: -- izm=",izm
584 1 equemene
        WRITE(*,'(1X,4(1X,I5))') ind_zmat(1,1)
585 1 equemene
        WRITE(*,'(1X,4(1X,I5))') ind_zmat(2,1), ind_zmat(2,2)
586 1 equemene
        WRITE(*,'(1X,4(1X,I5))') ind_zmat(3,1), ind_zmat(3,2), ind_zmat(3,3)
587 1 equemene
        DO I=4,izm
588 1 equemene
           WRITE(*,'(1X,4(1X,I5))') ind_zmat(I,1), ind_zmat(I,2),  &
589 1 equemene
                ind_zmat(I,3), ind_zmat(I,4)
590 1 equemene
        END DO
591 1 equemene
     END IF
592 1 equemene
593 1 equemene
594 1 equemene
     !     First four atoms (at least) have been put we go on with next parts
595 1 equemene
     !     of this fragment... later
596 1 equemene
597 1 equemene
598 1 equemene
  CASE(2)
599 1 equemene
     if (debug) WRITE(*,*) 'DBG select case I0 2'
600 1 equemene
	 WRITE(*,*) "PFL 28 Dec 2007: No test of alignment here :(  TO DO TO DO TO DO"
601 1 equemene
     ind_zmat(1,1)=IAt
602 1 equemene
     ind_zmat(2,1)=Liaisons(IAt,1)
603 1 equemene
     ind_zmat(2,2)=IAt
604 1 equemene
     ind_zmat(3,1)=Liaisons(IAt,2)
605 1 equemene
     ind_zmat(3,2)=IAt
606 1 equemene
     ind_zmat(3,3)=Liaisons(IAt,1)
607 1 equemene
     DejaFait(IAt)=.TRUE.
608 1 equemene
     DejaFait(Liaisons(Iat,1))=.TRUE.
609 1 equemene
     DejaFait(Liaisons(Iat,2))=.TRUE.
610 1 equemene
     CaFaire(1)=Liaisons(Iat,1)
611 1 equemene
     CaFaire(2)=Liaisons(Iat,2)
612 1 equemene
     FCaf(Liaisons(Iat,1))=.TRUE.
613 1 equemene
     FCaf(Liaisons(Iat,2))=.TRUE.
614 1 equemene
615 1 equemene
! PFL 28 Dec 2007 ->
616 1 equemene
! We do NOT need a fourth atom !!! The third direction in space is defined by the cross
617 1 equemene
! product of the first two directions
618 1 equemene
!
619 1 equemene
! the following is thus commented
620 1 equemene
!
621 1 equemene
!     !     We search for a fourth atom, first in the FrozBlock atoms
622 1 equemene
!     ITmp=2
623 1 equemene
!     sDihe=0.
624 1 equemene
!     n2=IAt
625 1 equemene
!     n3=Liaisons(Iat,1)
626 1 equemene
!     n4=Liaisons(Iat,2)
627 1 equemene
!     CALL vecteur(n2,n3,x,y,z,vx2,vy2,vz2,norm2)
628 1 equemene
!     CALL vecteur(n3,n4,x,y,z,vx3,vy3,vz3,norm3)
629 1 equemene
!     CALL produit_vect(vx3,vy3,vz3,norm3, &
630 1 equemene
!          vx2,vy2,vz2,norm2, &
631 1 equemene
!          vx5,vy5,vz5,norm5)
632 1 equemene
!
633 1 equemene
!     DO While ((ITmp.LE.FrozBlock(Iat,0)).AND.(sDihe.LE.0.09d0))
634 1 equemene
!        ITmp=ITmp+1
635 1 equemene
!        n1=FrozBlock(Iat,Itmp)
636 1 equemene
!        CALL vecteur(n2,n1,x,y,z,vx1,vy1,vz1,norm1)
637 1 equemene
!        CALL produit_vect(vx1,vy1,vz1,norm1, &
638 1 equemene
!             vx2,vy2,vz2,norm2, &
639 1 equemene
!             vx4,vy4,vz4,norm4)
640 1 equemene
!        val_d=angle_d(vx4,vy4,vz4,norm4,  &
641 1 equemene
!             vx5,vy5,vz5,norm5,           &
642 1 equemene
!             vx2,vy2,vz2,norm2)
643 1 equemene
!        sDihe=abs(sin(val_d))
644 1 equemene
!     END DO
645 1 equemene
!     IF (debug) WRITE(*,*) 'DBG 4th atom, ITmp, sDihe',ITmp, sDihe
646 1 equemene
!     if (sDihe.LE.0.09d0) THEN
647 1 equemene
!        !     None of the frozen atoms linked to IAt are good to define the third
648 1 equemene
!        !     direction in space...
649 1 equemene
!        !     We will look at the other frozen atoms
650 1 equemene
!        !     we might improve the search so as to take the atom closest to IAt
651 1 equemene
!        ITmp=0
652 1 equemene
!        DO I=1,NbAtFrag(IFrag)
653 1 equemene
!           JAt=FragAt(IFrag,I)
654 1 equemene
!           if (FrozAt(Jat).AND.(.NOT.DejaFait(JAt))) THEN
655 1 equemene
!              n1=JAt
656 1 equemene
!              CALL vecteur(n2,n1,x,y,z,vx1,vy1,vz1,norm1)
657 1 equemene
!              CALL produit_vect(vx1,vy1,vz1,norm1,  &
658 1 equemene
!                   vx2,vy2,vz2,norm2,               &
659 1 equemene
!                   vx4,vy4,vz4,norm4)
660 1 equemene
!              val_d=angle_d(vx4,vy4,vz4,norm4,    &
661 1 equemene
!                   vx5,vy5,vz5,norm5,              &
662 1 equemene
!                   vx2,vy2,vz2,norm2)
663 1 equemene
!              if (abs(sin(val_d)).GE.0.09D0) THEN
664 1 equemene
!                 ITmp=ITmp+1
665 1 equemene
!                 DistFrag(ITmp)=Norm1
666 1 equemene
!                 FragDist(ITmp)=JAt
667 1 equemene
!              END IF
668 1 equemene
!           END IF
669 1 equemene
!        END DO
670 1 equemene
!        IF (ITmp.EQ.0) THEN
671 1 equemene
!           !     All dihedral angles between frozen atoms are less than 5?
672 1 equemene
!           !     (or more than 175?). We have to look at other fragments :-(
673 1 equemene
!           DO I=1,NFroz
674 1 equemene
!              Jat=Frozen(I)
675 1 equemene
!              if (.NOT.DejaFait(JAt)) THEN
676 1 equemene
!                 n1=JAt
677 1 equemene
!                 CALL vecteur(n2,n1,x,y,z,vx1,vy1,vz1,norm1)
678 1 equemene
!                 CALL produit_vect(vx1,vy1,vz1,norm1,   &
679 1 equemene
!                      vx2,vy2,vz2,norm2,                 &
680 1 equemene
!                      vx4,vy4,vz4,norm4)
681 1 equemene
!                 val_d=angle_d(vx4,vy4,vz4,norm4,       &
682 1 equemene
!                      vx5,vy5,vz5,norm5,                 &
683 1 equemene
!                      vx2,vy2,vz2,norm2)
684 1 equemene
!                 if (abs(sin(val_d)).GE.0.09D0) THEN
685 1 equemene
!                    ITmp=ITmp+1
686 1 equemene
!                    DistFrag(ITmp)=Norm1
687 1 equemene
!                    FragDist(ITmp)=JAt
688 1 equemene
!                 END IF
689 1 equemene
!              END IF
690 1 equemene
!           END DO
691 1 equemene
!           IF (ITmp.EQ.0) THEN
692 1 equemene
!              !     All frozen atoms are in a plane... too bad
693 1 equemene
!              WRITE(*,*) 'ERROR: It seems that all frozen atoms are in a plane'
694 1 equemene
!              WRITE(*,*) 'For now, I do not treat this case'
695 1 equemene
!              STOP
696 1 equemene
!           END IF
697 1 equemene
!        END IF
698 1 equemene
!        I1=0
699 1 equemene
!        d=1e9
700 1 equemene
!        DO I=1,ITmp
701 1 equemene
!           IF (DistFrag(I).LE.d) THEN
702 1 equemene
!              d=DistFrag(I)
703 1 equemene
!              I1=FragDist(I)
704 1 equemene
!           END IF
705 1 equemene
!        END DO
706 1 equemene
!     ELSE                   !(sDihe.LE.0.09d0)
707 1 equemene
!        I1=FrozBlock(IAt,ITmp)
708 1 equemene
!     END IF                 !(sDihe.LE.0.09d0)
709 1 equemene
!     !     we now have the atom that is closer to the first one and that
710 1 equemene
!     !     forms a non 0/Pi dihedral angle
711 1 equemene
!     !     ind_zmat(4,1)=I1
712 1 equemene
!     !     ind_zmat(4,2)=IAt
713 1 equemene
!     !     ind_zmat(4,3)=Liaisons(Iat,1)
714 1 equemene
!     !     ind_zmat(4,4)=Liaisons(Iat,2)
715 1 equemene
!     n3=Liaisons(Iat,1)
716 1 equemene
!     n4=Liaisons(Iat,2)
717 1 equemene
!     Call add2indzmat(na,4,I1,Iat,n3,n4,ind_zmat,x,y,z)
718 1 equemene
!     Liaisons(Iat,1)=n3
719 1 equemene
!     Liaisons(Iat,2)=n4
720 1 equemene
!     DejaFait(I1)=.TRUE.
721 1 equemene
!     CaFaire(3)=I1
722 1 equemene
!     CaFaire(4)=0
723 1 equemene
!     IdxCaFaire=4
724 1 equemene
!     izm=4
725 1 equemene
!     FCaf(I1)=.TRUE.
726 1 equemene
!
727 1 equemene
!!!!!! <- PFL 28 Dec 2007
728 1 equemene
729 1 equemene
     CaFaire(3)=0
730 1 equemene
     IdxCaFaire=3
731 1 equemene
     izm=3
732 1 equemene
733 1 equemene
  CASE(1)
734 1 equemene
     if (debug) WRITE(*,*) 'DBG select case I0 1, NbAtFrag=',NbAtFrag(IFrag)
735 1 equemene
     ind_zmat(1,1)=IAt
736 1 equemene
     ind_zmat(2,1)=Liaisons(IAt,1)
737 1 equemene
     ind_zmat(2,2)=IAt
738 1 equemene
     DejaFait(IAt)=.TRUE.
739 1 equemene
     DejaFait(Liaisons(Iat,1))=.TRUE.
740 1 equemene
     IdxCaFaire=2
741 1 equemene
     CaFaire(1)=Liaisons(Iat,1)
742 1 equemene
     CaFaire(2)=0
743 1 equemene
     FCaf(Liaisons(Iat,1))=.TRUE.
744 1 equemene
745 1 equemene
! PFL 28 Dec 2007 ->
746 1 equemene
! We do NOT need a fourth atom. So we will look only for a third atom
747 1 equemene
!
748 1 equemene
!!!!
749 1 equemene
!
750 1 equemene
     !     We search for a third and fourth atoms, first in the FrozBlock atoms
751 1 equemene
     !     It should not be possible to have   (FrozBlock(Iat,0).GT.2) and
752 1 equemene
     !     iat linked to only one atom !
753 1 equemene
754 1 equemene
755 1 equemene
     !     we calculate the distances between Iat and all other frozen
756 1 equemene
     !     atoms of this fragment, and store only those for which
757 1 equemene
     !     valence angles are not too close to 0/Pi. (limit:5?)
758 1 equemene
759 1 equemene
     ITmp=0
760 1 equemene
     CALL vecteur(Liaisons(Iat,1),IAt,x,y,z,vx2,vy2,vz2,norm2)
761 1 equemene
762 1 equemene
! PFL 28 Dec 2007: As MaxL=1 I think that there is at most 2 atoms in this fragment...
763 1 equemene
! so that the following loop is useless... this should be tested more carefully
764 1 equemene
     DO I=1,NbAtFrag(IFrag)
765 1 equemene
        JAt=FragAt(IFrag,I)
766 1 equemene
        if (.NOT.DejaFait(JAt)) THEN
767 1 equemene
           CALL vecteur(JAt,IAt,x,y,z,vx1,vy1,vz1,norm1)
768 1 equemene
           if (abs(cos(angle(vx1,vy1,vz1,norm1,  &
769 1 equemene
                vx2,vy2,vz2,norm2))).LE.0.996d0) THEN
770 1 equemene
              ITmp=ITmp+1
771 1 equemene
              DistFrag(ITmp)=Norm1
772 1 equemene
              FragDist(ITmp)=JAt
773 1 equemene
           END IF
774 1 equemene
        END IF
775 1 equemene
     END DO
776 1 equemene
777 1 equemene
     IF (ITMP.EQ.0) THEN
778 1 equemene
        !     We have no atoms correct in this fragment, we use
779 1 equemene
        !     atoms from other fragments
780 1 equemene
        DO Jat=1,Na
781 1 equemene
! DejaFait(Iat)=.TRUE. so that we do not need to test Jat/=Iat
782 1 equemene
           if (.NOT.DejaFait(JAt)) THEN
783 1 equemene
              CALL vecteur(JAt,IAt,x,y,z,vx1,vy1,vz1,norm1)
784 1 equemene
              if (abs(cos(angle(vx1,vy1,vz1,norm1, &
785 1 equemene
                   vx2,vy2,vz2,norm2))).LE.0.996d0) THEN
786 1 equemene
                 ITmp=ITmp+1
787 1 equemene
                 DistFrag(ITmp)=Norm1
788 1 equemene
                 FragDist(ITmp)=JAt
789 1 equemene
              END IF
790 1 equemene
           END IF
791 1 equemene
        END DO
792 1 equemene
        IF (ITMP.EQ.0) THEN
793 1 equemene
           WRITE(*,*) 'It seems all atoms are aligned'
794 1 equemene
           WRITE(*,*) 'Case non treated for now :-( '
795 1 equemene
           STOP
796 1 equemene
        END IF
797 1 equemene
     END IF
798 1 equemene
799 1 equemene
     I1=0
800 1 equemene
     d=1e9
801 1 equemene
! PFL 28 Dec 2007: There exists some F90 intrinsics to find the smallest element of an array.
802 1 equemene
! The following loop should be replaced by it !
803 1 equemene
     DO I=1,ITmp
804 1 equemene
        IF (DistFrag(I).LE.d) THEN
805 1 equemene
           I1=FragDist(I)
806 1 equemene
           d=DistFrag(I)
807 1 equemene
        END IF
808 1 equemene
     END DO
809 1 equemene
810 1 equemene
     !     we now have the atom that is closer to the first one and that
811 1 equemene
     !     forms a non 0/Pi valence angle
812 1 equemene
     ind_zmat(3,1)=I1
813 1 equemene
     ind_zmat(3,2)=IAt
814 1 equemene
     ind_zmat(3,3)=Liaisons(Iat,1)
815 1 equemene
     DejaFait(I1)=.TRUE.
816 1 equemene
     CaFaire(2)=I1
817 1 equemene
     FCaf(I1)=.TRUE.
818 1 equemene
819 1 equemene
820 1 equemene
! PFL 28 Dec 2007 ->
821 1 equemene
! We do NOT need a fourth atom so that the following is suppressed
822 1 equemene
!
823 1 equemene
!     !     we search for a fourth atom !
824 1 equemene
!     !     We search for a fourth atom, first in the FrozBlock atoms
825 1 equemene
!     ITmp=2
826 1 equemene
!     sDihe=0.
827 1 equemene
!     n2=IAt
828 1 equemene
!     n3=Liaisons(Iat,1)
829 1 equemene
!     n4=I1
830 1 equemene
!     CALL vecteur(n2,n3,x,y,z,vx2,vy2,vz2,norm2)
831 1 equemene
!     CALL vecteur(n3,n4,x,y,z,vx3,vy3,vz3,norm3)
832 1 equemene
!     CALL produit_vect(vx3,vy3,vz3,norm3,  &
833 1 equemene
!          vx2,vy2,vz2,norm2,    &
834 1 equemene
!          vx5,vy5,vz5,norm5)
835 1 equemene
!
836 1 equemene
!     !     We will look at the other frozen atoms
837 1 equemene
!     !     we might improve the search so as to take the atom closest to IAt
838 1 equemene
!     ITmp=0
839 1 equemene
!     DO I=1,NbAtFrag(IFrag)
840 1 equemene
!        JAt=FragAt(IFrag,I)
841 1 equemene
!        if (FrozAt(Jat).AND.(.NOT.DejaFait(JAt))) THEN
842 1 equemene
!           n1=JAt
843 1 equemene
!           CALL vecteur(n2,n1,x,y,z,vx1,vy1,vz1,norm1)
844 1 equemene
!           CALL produit_vect(vx1,vy1,vz1,norm1, &
845 1 equemene
!                vx2,vy2,vz2,norm2, &
846 1 equemene
!                vx4,vy4,vz4,norm4)
847 1 equemene
!           val_d=angle_d(vx4,vy4,vz4,norm4,  &
848 1 equemene
!                vx5,vy5,vz5,norm5,   &
849 1 equemene
!                vx2,vy2,vz2,norm2)
850 1 equemene
!           if (abs(sin(val_d)).GE.0.09D0) THEN
851 1 equemene
!              ITmp=ITmp+1
852 1 equemene
!              DistFrag(ITmp)=Norm1
853 1 equemene
!              FragDist(ITmp)=JAt
854 1 equemene
!           END IF
855 1 equemene
!        END IF
856 1 equemene
!     END DO
857 1 equemene
!     IF (ITmp.EQ.0) THEN
858 1 equemene
!        !     All dihedral angles between frozen atoms are less than 5?
859 1 equemene
!        !     (or more than 175?). We have to look at other fragments :-(
860 1 equemene
!        DO I=1,NFroz
861 1 equemene
!           Jat=Frozen(I)
862 1 equemene
!           if (.NOT.DejaFait(JAt)) THEN
863 1 equemene
!              n1=JAt
864 1 equemene
!              CALL vecteur(n2,n1,x,y,z,vx1,vy1,vz1,norm1)
865 1 equemene
!              CALL produit_vect(vx1,vy1,vz1,norm1,  &
866 1 equemene
!                   vx2,vy2,vz2,norm2, &
867 1 equemene
!                   vx4,vy4,vz4,norm4)
868 1 equemene
!              val_d=angle_d(vx4,vy4,vz4,norm4,   &
869 1 equemene
!                   vx5,vy5,vz5,norm5,           &
870 1 equemene
!                   vx2,vy2,vz2,norm2)
871 1 equemene
!              if (abs(sin(val_d)).GE.0.09D0) THEN
872 1 equemene
!                 ITmp=ITmp+1
873 1 equemene
!                 DistFrag(ITmp)=Norm1
874 1 equemene
!                 FragDist(ITmp)=JAt
875 1 equemene
!              END IF
876 1 equemene
!           END IF
877 1 equemene
!       END DO
878 1 equemene
!        IF (ITmp.EQ.0) THEN
879 1 equemene
!           !     All frozen atoms are in a plane... too bad
880 1 equemene
!           WRITE(*,*) 'ERROR: It seems that all frozen atoms are in a plane'
881 1 equemene
!           WRITE(*,*) 'For now, I do not treat this case'
882 1 equemene
!           STOP
883 1 equemene
!        END IF
884 1 equemene
!     END IF                 ! ITmp.EQ.0 after scaning fragment
885 1 equemene
!     I1=0
886 1 equemene
!     d=1e9
887 1 equemene
!     DO I=1,ITmp
888 1 equemene
!        IF (DistFrag(I).LE.d) THEN
889 1 equemene
!           d=DistFrag(I)
890 1 equemene
!           I1=FragDist(I)
891 1 equemene
!        END IF
892 1 equemene
!     END DO
893 1 equemene
!
894 1 equemene
!     !     we now have the atom that is closer to the first one and that
895 1 equemene
!     !     forms a non 0/Pi dihedral angle
896 1 equemene
!     !     ind_zmat(4,1)=I1
897 1 equemene
!     !     ind_zmat(4,2)=IAt
898 1 equemene
!     !     ind_zmat(4,3)=ind_zmat(2,1)
899 1 equemene
!     !     ind_zmat(4,4)=ind_zmat(3,1)
900 1 equemene
!     n3=ind_zmat(2,1)
901 1 equemene
!     n4=ind_zmat(3,1)
902 1 equemene
!     Call add2indzmat(na,4,I1,IAt,n3,n4,ind_zmat,x,y,z)
903 1 equemene
!     ind_zmat(2,1)=n3
904 1 equemene
!     ind_zmat(3,1)=n4
905 1 equemene
!     DejaFait(I1)=.TRUE.
906 1 equemene
!     CaFaire(3)=I1
907 1 equemene
!     CaFaire(4)=0
908 1 equemene
!     IdxCaFaire=4
909 1 equemene
!     izm=4
910 1 equemene
!     FCaf(I1)=.TRUE.
911 1 equemene
!!!!!!!!!!!
912 1 equemene
!
913 1 equemene
! <- PFL 28 Dec 2007
914 1 equemene
915 1 equemene
     CaFaire(3)=0
916 1 equemene
	 IdxCaFaire=3
917 1 equemene
918 1 equemene
  CASE(0)
919 1 equemene
     WRITE(*,*) 'All atoms are separated .. '
920 1 equemene
     WRITE(*,*) 'this case should be treated separately !'
921 1 equemene
     STOP
922 1 equemene
  END SELECT
923 1 equemene
924 1 equemene
  if (debug) THEN
925 1 equemene
     WRITE(*,*) 'ind_zmat 1 izm=',izm
926 1 equemene
     WRITE(*,'(1X,4(1X,I5))') ind_zmat(1,1)
927 1 equemene
     WRITE(*,'(1X,4(1X,I5))') ind_zmat(2,1), ind_zmat(2,2)
928 1 equemene
     WRITE(*,'(1X,4(1X,I5))') ind_zmat(3,1), ind_zmat(3,2), ind_zmat(3,3)
929 1 equemene
     DO I=4,izm
930 1 equemene
        WRITE(*,'(1X,4(1X,I5))') ind_zmat(I,1), ind_zmat(I,2),  &
931 1 equemene
             ind_zmat(I,3), ind_zmat(I,4)
932 1 equemene
     END DO
933 1 equemene
  END IF
934 1 equemene
935 1 equemene
  DO I=1,izm
936 1 equemene
     Idx_zmat(ind_zmat(I,1))=i
937 1 equemene
  END Do
938 1 equemene
939 1 equemene
  !     at least first three atoms of this fragment done...
940 1 equemene
  !     we empty the 'cafaire' array before going on
941 1 equemene
  IAFaire=1
942 1 equemene
  DO WHILE (CaFaire(IaFaire).NE.0)
943 1 equemene
     n1=CaFaire(IaFaire)
944 1 equemene
     n2=ind_zmat(idx_zmat(N1),2)
945 1 equemene
     if (idx_zmat(N1).EQ.2) THEN
946 1 equemene
        !     We have a (small) problem: we have to add atoms linked to the 2nd
947 1 equemene
        !     atom of the zmat. This is a pb because we do not know
948 1 equemene
        !     which atom to use to define the dihedral angle
949 1 equemene
        !     we take the third atom of the zmat
950 1 equemene
        n3=ind_zmat(3,1)
951 1 equemene
     ELSE
952 1 equemene
        n3=ind_zmat(idx_zmat(n1),3)
953 1 equemene
     END IF
954 1 equemene
955 1 equemene
	 FirstAt=.TRUE.
956 1 equemene
     DO I=1,Liaisons(n1,0)
957 1 equemene
        IAt=Liaisons(n1,I)
958 1 equemene
! PFL 29.Aug.2008 ->
959 1 equemene
! We dissociate the test on 'DejaFait' that indicates that this atom
960 1 equemene
! has already been put in the Zmat
961 1 equemene
! from the test on FCaf that indicates that this atom has been put in the
962 1 equemene
! 'CAFaire' list that deals with identifying its connectivity.
963 1 equemene
! Those two test might differ in some cases.
964 1 equemene
        IF (.NOT.DejaFait(Iat)) THEN
965 1 equemene
           izm=izm+1
966 1 equemene
           if (debug) WRITE(*,*) ">1< Adding atom ",Iat,"position izm=",izm
967 1 equemene
           !           ind_zmat(izm,1)=iat
968 1 equemene
           !           ind_zmat(izm,2)=n1
969 1 equemene
           !           ind_zmat(izm,3)=n2
970 1 equemene
           !           ind_zmat(izm,4)=n3
971 1 equemene
           Call add2indzmat(na,izm,iat,n1,n2,n3,ind_zmat,x,y,z)
972 1 equemene
		   if (FirstAt) THEN
973 1 equemene
		      n3=Iat
974 1 equemene
			  FirstAt=.FALSE.
975 1 equemene
           END IF
976 1 equemene
           idx_zmat(iat)=izm
977 1 equemene
           DejaFait(iat)=.TRUE.
978 1 equemene
        END IF
979 1 equemene
        IF (.NOT.FCaf(Iat)) THEN
980 1 equemene
           CaFaire(IdxCaFaire)=iat
981 1 equemene
           IdxCaFaire=IdxCaFaire+1
982 1 equemene
           CaFaire(IdxCaFaire)=0
983 1 equemene
           FCaf(Iat)=.TRUE.
984 1 equemene
        END IF
985 1 equemene
! <- PFL 29.Aug.2008
986 1 equemene
     END DO
987 1 equemene
     IaFaire=IaFaire+1
988 1 equemene
  END Do                    ! DO WHILE CaFaire
989 1 equemene
990 1 equemene
  if (debug) THEN
991 1 equemene
     WRITE(*,*) 'ind_zmat 2, izm=',izm
992 1 equemene
     WRITE(*,'(1X,4(1X,I5))') ind_zmat(1,1)
993 1 equemene
     WRITE(*,'(1X,4(1X,I5))') ind_zmat(2,1), ind_zmat(2,2)
994 1 equemene
     WRITE(*,'(1X,4(1X,I5))') ind_zmat(3,1), ind_zmat(3,2), ind_zmat(3,3)
995 1 equemene
     DO I=4,izm
996 1 equemene
        WRITE(*,'(1X,4(1X,I5))') ind_zmat(I,1), ind_zmat(I,2),  &
997 1 equemene
             ind_zmat(I,3), ind_zmat(I,4)
998 1 equemene
     END DO
999 1 equemene
  END IF
1000 1 equemene
1001 1 equemene
  !     We have finished putting atoms linked to the first one
1002 1 equemene
  ! There should not be any atom left from this fragment. We check:
1003 1 equemene
  !     we will add other atoms of this fragment
1004 1 equemene
  DO I=1,NbAtFrag(IFrag)
1005 1 equemene
     Iat=FragAt(IFrag,I)
1006 1 equemene
     if (debug) WRITE(*,*) "DBG: I,Iat,dejafait",I,Iat,DejaFait(Iat)
1007 1 equemene
     IF (.NOT.DejaFait(Iat)) THEN
1008 1 equemene
           WRITE(*,*) 'Treating atom I,Iat',I,Iat
1009 1 equemene
1010 1 equemene
     END IF
1011 1 equemene
1012 1 equemene
  END DO
1013 1 equemene
1014 1 equemene
	NbAtFrag(Ifrag)=0
1015 1 equemene
	MaxLFrag(IFrag,1)=0
1016 1 equemene
1017 1 equemene
  !     we start again with the rest of the molecule...
1018 1 equemene
  ! v 1.01 We add the fragment in the order corresponding to NbAtFrag
1019 1 equemene
  KMax=NbFrag-1
1020 1 equemene
1021 1 equemene
  IF (DEBUG) WRITE(*,*) "Adding the ",Kmax," remaining fragments"
1022 1 equemene
  DO K=1, KMax
1023 1 equemene
  IFrag=0
1024 1 equemene
  I0=0
1025 1 equemene
  IAt=0
1026 1 equemene
  I1=0
1027 1 equemene
  DO I=1,NbFrag
1028 1 equemene
    SELECT CASE(MaxLFrag(I,1)-I0)
1029 1 equemene
     CASE (1:)
1030 1 equemene
        IFrag=I
1031 1 equemene
        I0=MaxLFrag(I,1)
1032 1 equemene
        IAt=MaxLFrag(I,2)
1033 1 equemene
        I1=NbAtFrag(I)
1034 1 equemene
     CASE (0)
1035 1 equemene
        if (NbAtFrag(I).GT.I1) THEN
1036 1 equemene
           IFrag=I
1037 1 equemene
           I0=MaxLFrag(I,1)
1038 1 equemene
           IAt=MaxLFrag(I,2)
1039 1 equemene
           I1=NbAtFrag(I)
1040 1 equemene
        END IF
1041 1 equemene
     END SELECT
1042 1 equemene
1043 1 equemene
  END DO
1044 1 equemene
1045 1 equemene
  if (debug) WRITE(*,'(1X,A,I5,A,I5,A,I5,A,I5)') 'Adding fragment:',IFrag,' with ',I0   &
1046 1 equemene
      ,' max links for atom',IAt,' fragment size',NbAtFrag(IFrag)
1047 1 equemene
1048 1 equemene
     MaxLFrag(IFrag,1)=0
1049 1 equemene
1050 1 equemene
! We search for the closest atoms of the previous fragments to the atom with max links
1051 1 equemene
	d=1e9
1052 1 equemene
	DO J=1,izm
1053 1 equemene
		Call vecteur(iat,ind_zmat(j,1),x,y,z,vx1,vy1,vz1,norm1)
1054 1 equemene
		if (norm1.le.d) THEN
1055 1 equemene
			Jat=j
1056 1 equemene
			d=norm1
1057 1 equemene
		END IF
1058 1 equemene
	END DO
1059 1 equemene
	n2=ind_zmat(jat,1)
1060 1 equemene
	SELECT CASE(jat)
1061 1 equemene
        CASE (1)
1062 1 equemene
		 n3=ind_zmat(2,1)
1063 1 equemene
		 n4=ind_zmat(3,1)
1064 1 equemene
	  CASE (2)
1065 1 equemene
		 n3=ind_zmat(1,1)
1066 1 equemene
		 n4=ind_zmat(3,1)
1067 1 equemene
	  CASE DEFAULT
1068 1 equemene
		 n3=ind_zmat(jAt,2)
1069 1 equemene
		 n4=ind_zmat(jat,3)
1070 1 equemene
	END SELECT
1071 1 equemene
	izm=izm+1
1072 1 equemene
	Call add2indzmat(na,izm,iat,n2,n3,n4,ind_zmat,x,y,z)
1073 1 equemene
    idx_zmat(iat)=izm
1074 1 equemene
    DejaFait(iat)=.TRUE.
1075 1 equemene
	IdxCaFaire=2
1076 1 equemene
    CaFaire(1)=iat
1077 1 equemene
              CaFaire(2)=0
1078 1 equemene
              FCaf(Iat)=.TRUE.
1079 1 equemene
              IaFaire=1
1080 1 equemene
              DO WHILE (CaFaire(IaFaire).NE.0)
1081 1 equemene
                 n1=CaFaire(IaFaire)
1082 1 equemene
                 n2=ind_zmat(idx_zmat(N1),2)
1083 1 equemene
                 if (idx_zmat(N1).EQ.2) THEN
1084 1 equemene
                    !     We have a (small) problem: we have to add atoms linked to the 2nd
1085 1 equemene
                    !     atom of the zmat. This is a pb because we do not know
1086 1 equemene
                    !     which atom to use to define the dihedral angle
1087 1 equemene
                    !     we take the third atom of the zmat
1088 1 equemene
                    n3=ind_zmat(3,1)
1089 1 equemene
                 ELSE
1090 1 equemene
                    n3=ind_zmat(idx_zmat(n1),3)
1091 1 equemene
                 END IF
1092 1 equemene
                 DO I3=1,Liaisons(n1,0)
1093 1 equemene
                    IAt=Liaisons(n1,I3)
1094 1 equemene
! PFL 29.Aug.2008 ->
1095 1 equemene
! We dissociate the test on 'DejaFait' that indicates that this atom
1096 1 equemene
! has already been put in the Zmat
1097 1 equemene
! from the test on FCaf that indicates that this atom has been put in the
1098 1 equemene
! 'CAFaire' list that deals with identifying its connectivity.
1099 1 equemene
! Those two test might differ for a frozen atom linked to non frozen atoms.
1100 1 equemene
                    IF (.NOT.DejaFait(Iat)) THEN
1101 1 equemene
                       izm=izm+1
1102 1 equemene
                       Call add2indzmat(na,izm,Iat,n1,n2,n3,ind_zmat,x,y,z)
1103 1 equemene
                       idx_zmat(iat)=izm
1104 1 equemene
                       n3=iat
1105 1 equemene
                       DejaFait(Iat)=.TRUE.
1106 1 equemene
                    END IF
1107 1 equemene
                    IF (.NOT.FCaf(Iat)) THEN
1108 1 equemene
                       CaFaire(IdxCaFaire)=iat
1109 1 equemene
                       IdxCaFaire=IdxCaFaire+1
1110 1 equemene
                       CaFaire(IdxCaFaire)=0
1111 1 equemene
                       FCaf(Iat)=.TRUE.
1112 1 equemene
                    END IF
1113 1 equemene
! <- PFL 29.Aug.2008
1114 1 equemene
                 END DO
1115 1 equemene
                 IaFaire=IaFaire+1
1116 1 equemene
              END Do              ! DO WHILE CaFaire
1117 1 equemene
1118 1 equemene
        if (debug) THEN
1119 1 equemene
           WRITE(*,*) 'ind_zmat 4'
1120 1 equemene
           WRITE(*,'(1X,4(1X,I5))') ind_zmat(1,1)
1121 1 equemene
           WRITE(*,'(1X,4(1X,I5))') ind_zmat(2,1), ind_zmat(2,2)
1122 1 equemene
           WRITE(*,'(1X,4(1X,I5))') ind_zmat(3,1), ind_zmat(3,2), ind_zmat(3,3)
1123 1 equemene
           DO Ip=4,izm
1124 1 equemene
              WRITE(*,'(1X,4(1X,I5))') ind_zmat(Ip,1), ind_zmat(Ip,2), &
1125 1 equemene
                   ind_zmat(Ip,3), ind_zmat(Ip,4)
1126 1 equemene
           END DO
1127 1 equemene
        END IF
1128 1 equemene
1129 1 equemene
  END DO                    ! Loop on all fragments
1130 1 equemene
1131 1 equemene
1132 1 equemene
     ! We have ind_zmat. We calculate val_zmat :-)
1133 1 equemene
     if (debug) WRITE(*,*) "Calculating val_zmat"
1134 1 equemene
1135 1 equemene
     val_zmat(1,1)=0.d0
1136 1 equemene
     val_zmat(1,2)=0.d0
1137 1 equemene
     val_zmat(1,3)=0.d0
1138 1 equemene
     val_zmat(2,2)=0.d0
1139 1 equemene
     val_zmat(2,3)=0.d0
1140 1 equemene
     val_zmat(3,3)=0.d0
1141 1 equemene
1142 1 equemene
     n1=ind_zmat(2,1)
1143 1 equemene
     n2=ind_zmat(2,2)
1144 1 equemene
1145 1 equemene
     CALL vecteur(n2,n1,x,y,z,vx1,vy1,vz1,norm1)
1146 1 equemene
1147 1 equemene
     val_zmat(2,1)=norm1
1148 1 equemene
1149 1 equemene
1150 1 equemene
     n1=ind_zmat(3,1)
1151 1 equemene
     n2=ind_zmat(3,2)
1152 1 equemene
     n3=ind_zmat(3,3)
1153 1 equemene
1154 1 equemene
     CALL vecteur(n2,n1,x,y,z,vx1,vy1,vz1,norm1)
1155 1 equemene
1156 1 equemene
     val_zmat(3,1)=norm1
1157 1 equemene
1158 1 equemene
     CALL vecteur(n2,n3,x,y,z,vx2,vy2,vz2,norm2)
1159 1 equemene
     val=angle(vx1,vy1,vz1,norm1,vx2,vy2,vz2,norm2)
1160 1 equemene
1161 1 equemene
     val_zmat(3,2)=val
1162 1 equemene
1163 1 equemene
     DO i=4,na
1164 1 equemene
1165 1 equemene
        n1=ind_zmat(i,1)
1166 1 equemene
        n2=ind_zmat(i,2)
1167 1 equemene
        n3=ind_zmat(i,3)
1168 1 equemene
        n4=ind_zmat(i,4)
1169 1 equemene
1170 1 equemene
        if (debug) WRITE(*,*) "Doing i,n1,n2,n3,n4",i,n1,n2,n3,n4
1171 1 equemene
        CALL vecteur(n2,n1,x,y,z,vx1,vy1,vz1,norm1)
1172 1 equemene
1173 1 equemene
        CALL vecteur(n2,n3,x,y,z,vx2,vy2,vz2,norm2)
1174 1 equemene
        val=angle(vx1,vy1,vz1,norm1,vx2,vy2,vz2,norm2)
1175 1 equemene
1176 1 equemene
        CALL vecteur(n3,n4,x,y,z,vx3,vy3,vz3,norm3)
1177 1 equemene
        CALL produit_vect(vx1,vy1,vz1,norm1,vx2,vy2,vz2,norm2, &
1178 1 equemene
             vx4,vy4,vz4,norm4)
1179 1 equemene
        CALL produit_vect(vx3,vy3,vz3,norm3,vx2,vy2,vz2,norm2, &
1180 1 equemene
             vx5,vy5,vz5,norm5)
1181 1 equemene
1182 1 equemene
        val_d=angle_d(vx4,vy4,vz4,norm4, vx5,vy5,vz5,norm5, &
1183 1 equemene
             vx2,vy2,vz2,norm2)
1184 1 equemene
1185 1 equemene
        !     write(*,11) n1,n2,norm1,n3,val,n4,val_d
1186 1 equemene
        !11   format (2(1x,i3),1x,f8.4,2(1x,i3,1x,f8.3))
1187 1 equemene
1188 1 equemene
        val_zmat(i,1)=norm1
1189 1 equemene
        val_zmat(i,2)=val
1190 1 equemene
        val_zmat(i,3)=val_d
1191 1 equemene
1192 1 equemene
     END DO
1193 1 equemene
1194 1 equemene
     if (debug) THEN
1195 1 equemene
        WRITE(*,*) 'DBG Cre_Zmat_Frag: ind_zmat'
1196 1 equemene
        DO I=1,na
1197 1 equemene
           WRITE(*,'(1X,5I5)') (ind_zmat(i,j),j=1,5)
1198 1 equemene
        END DO
1199 1 equemene
1200 1 equemene
        WRITE(*,*) 'DBG Cre_Zmat_Frag: Full zmat'
1201 1 equemene
        DO I=1,na
1202 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)
1203 1 equemene
        END DO
1204 1 equemene
1205 1 equemene
     END IF
1206 1 equemene
1207 1 equemene
     if (debugGaussian) THEN
1208 1 equemene
        WRITE(*,*) 'DBG Cre_Zmat_Frag: Gaussian Zmat - START'
1209 1 equemene
        Call zmat_g92(na,atome,ind_zmat,val_zmat)
1210 1 equemene
        WRITE(*,*) 'DBG Cre_Zmat_Frag: Gaussian Zmat - END'
1211 1 equemene
     END IF
1212 1 equemene
1213 1 equemene
1214 1 equemene
     if (debug) WRITE(*,*) "Deallocate (FragDist,Fragment, NbAtFrag,FragAt)"
1215 1 equemene
     DEALLOCATE(FragDist,Fragment, NbAtFrag,FragAt)
1216 1 equemene
     if (debug) WRITE(*,*) "Deallocate (DistFrag,Liaisons)"
1217 1 equemene
     DEALLOCATE(DistFrag,Liaisons)
1218 1 equemene
     if (debug) WRITE(*,*) "Deallocate(CaFaire,DejaFait)"
1219 1 equemene
     DEALLOCATE(CaFaire,DejaFait,FCaf,MaxLFrag)
1220 1 equemene
1221 1 equemene
1222 1 equemene
1223 1 equemene
     if (debug) WRITE(*,*) "=============================== Exiting Calc_zmat_frag ========================"
1224 1 equemene
1225 1 equemene
END SUBROUTINE Calc_Zmat_frag
1226 1 equemene
1227 1 equemene
SUBROUTINE zmat_g92(na,atome,ind_zmat,val_zmat)
1228 1 equemene
1229 1 equemene
! This subroutine comes for Cart. Slightly modified to be f90
1230 1 equemene
1231 1 equemene
  Use Path_module, only : max_Z, NMaxL, Nom,MaxFroz, Pi
1232 1 equemene
  Use Io_module
1233 1 equemene
1234 1 equemene
  IMPLICIT NONE
1235 1 equemene
1236 1 equemene
  integer(KINT), INTENT(IN) ::  na,atome(na)
1237 1 equemene
  INTEGER(KINT), INTENT(IN) :: ind_zmat(Na,5)
1238 1 equemene
  real(KREAL), INTENT(IN)   :: val_zmat(Na,3)
1239 1 equemene
1240 1 equemene
  character(6) :: at1,at2,at3,at4,at5,d,a,dh
1241 1 equemene
  character(SCHARS), ALLOCATABLE :: tab(:) ! 3*na
1242 1 equemene
  character(LCHARS) :: ligne
1243 1 equemene
1244 1 equemene
  INTEGER(KINT) :: i,n1,n2,n3,n4
1245 1 equemene
1246 1 equemene
  ALLOCATE(tab(3*na))
1247 1 equemene
1248 1 equemene
  DO i=1,na
1249 1 equemene
     IF (i .GE. 1)  THEN
1250 1 equemene
        n1=ind_zmat(i,1)
1251 1 equemene
        write(at1,11) nom(atome(n1)),n1
1252 1 equemene
11      format(a2,i3)
1253 1 equemene
        Call ecris_sb(at1,at1)
1254 1 equemene
        write(ligne,4) at1
1255 1 equemene
     END IF
1256 1 equemene
     IF (i .GE. 2)  THEN
1257 1 equemene
        n2=ind_zmat(i,2)
1258 1 equemene
        write(at2,11) nom(atome(n2)),n2
1259 1 equemene
        Call ecris_sb(At2,at2)
1260 1 equemene
        write(d,11) 'R',i-1
1261 1 equemene
        Call ecris_sb(D,d)
1262 1 equemene
        write(ligne,4) at1,at2,d
1263 1 equemene
        write(tab(i-1),12) d,val_zmat(i,1)
1264 1 equemene
12      format(a8,f8.4)
1265 1 equemene
     END IF
1266 1 equemene
     IF (i .GE. 3)  THEN
1267 1 equemene
        n3=ind_zmat(i,3)
1268 1 equemene
        write(at3,11) nom(atome(n3)),n3
1269 1 equemene
        Call ecris_sb(At3,at3)
1270 1 equemene
        write(a,11) 'A',na+i-3
1271 1 equemene
        Call ecris_sb(A,A)
1272 1 equemene
        write(ligne,4) at1,at2,d,at3,a
1273 1 equemene
           write(tab(na+i-3),13) a,val_zmat(i,2)
1274 1 equemene
13         format(a8,f8.3)
1275 1 equemene
        END IF
1276 1 equemene
        IF (i .GE. 4)  THEN
1277 1 equemene
           n4=ind_zmat(i,4)
1278 1 equemene
           write(at4,11) nom(atome(n4)),n4
1279 1 equemene
           Call ecris_sb(At4,at4)
1280 1 equemene
           write(dh,11) 'DH',na+na+i-6
1281 1 equemene
           Call ecris_sb(dh,dh)
1282 1 equemene
           write(ligne,4) at1,at2,d,at3,a,at4,dh
1283 1 equemene
4          format(7a6)
1284 1 equemene
           write(tab(na+na+i-6),13) dh,val_zmat(i,3)
1285 1 equemene
        END IF
1286 1 equemene
        write(IOOUT,*) TRIM(ligne)
1287 1 equemene
     END DO
1288 1 equemene
1289 1 equemene
     write(IOOUT,*)
1290 1 equemene
     IF (na .EQ. 2) THEN
1291 1 equemene
        write(IOOUT,*) TRIM(tab(1))
1292 1 equemene
     ELSE
1293 1 equemene
        DO i=1,3*na-6
1294 1 equemene
           write(IOOUT,*) TRIM(tab(i))
1295 1 equemene
        END DO
1296 1 equemene
     END IF
1297 1 equemene
     write(IOOUT,*)
1298 1 equemene
1299 1 equemene
     DEALLOCATE(Tab)
1300 1 equemene
1301 1 equemene
   END SUBROUTINE zmat_g92
1302 1 equemene
1303 1 equemene
   SUBROUTINE ecris_sb(inter1,inter)
1304 1 equemene
1305 1 equemene
      character(6) :: inter,inter1
1306 1 equemene
1307 1 equemene
1308 1 equemene
      k=1
1309 1 equemene
      DO j=1,len(inter)
1310 1 equemene
        IF (inter(j:j) .NE. ' ' ) THEN
1311 1 equemene
         inter1(k:k)=inter(j:j)
1312 1 equemene
         k=k+1
1313 1 equemene
        END IF
1314 1 equemene
      END DO
1315 1 equemene
1316 1 equemene
       inter1(k:6)=' '
1317 1 equemene
1318 1 equemene
    END SUBROUTINE ecris_sb