36
37
38
39#include "implicit_f.inc"
40
41
42
43#include "units_c.inc"
44#include "com04_c.inc"
45#include "titr_c.inc"
46
47
48
49 INTEGER ITAB(), ITABM1(2*NUMNOD),IMERGE(*),
50 . IMERGE2(NUMNOD+1),IADMERGE2(NUMNOD+1),IMERGE0(NUMCNOD),NMERGE_TOT
51 TARGET itab
53 . x(3,numnod),cmerge(*)
54
55
56
57 INTEGER I,J,K,M,N,I1,IB,IG,JG,J1,JK,KK,KP,N1,N2,NC,NS,NN,NM,
58 . IBZ1,IBZ,IBY1,IBY,IBX1,IBX,KS,NUMNOD1,NUMCNOD1,
59 . NBOX,NBOY,NBOZ,NBX,NBY,NBZ,NBAND,IBOITE,NMERGED_OLD
60
61 INTEGER
62 . NOBX(NUMNOD),NOBY(NUMNOD),NOBZ(NUMNOD),
63 . NOBCX(NUMCNOD),NOBCY(NUMCNOD),NOBCZ(NUMCNOD),
64 . LBUF(NUMNOD),IADMERGE2TMP(NUMNOD+1)
65
66 INTEGER, DIMENSION(:),POINTER :: ITABC
67 INTEGER, DIMENSION(:),ALLOCATABLE ::
68 . NPX,IPX,NPY,IPY,NPZ,IPZ,NPCX,IPCX,NPCY,IPCY,NPCZ,IPCZ,
69 . IMERGETMP
70
72 . xi, yi, zi, xj, yj, zj, dk,
73 . dist2,dvois,dbuc,eps,xmin,xmax,ymin,
ymax,zmin,
74 . zmax,dmx,dmy,dmz,dmerge,ddd(numcnod)
75
76 INTEGER
77 . USRTOS,USRTOSC
79
80
81
82
83
84
85
86
87
88 IF (numcnod <= 1) RETURN
89
90 numnod1 = numnod0-numcnod
91 itabc => itab(numnod1+1:numnod0)
92 dbuc = zero
93 DO n=1,numcnod
95 dbuc =
max(dbuc,cmerge(n))
96 ENDDO
97
98 dbuc = two*dbuc
99 eps = em3*dbuc
100 xmin = ep30
101 xmax =-ep30
102 ymin = ep30
104 zmin = ep30
105 zmax =-ep30
106
107 DO n=1,numcnod
109 xmin=
min(xmin,x(1,nn))
110 ymin=
min(ymin,x(2,nn))
111 zmin=
min(zmin,x(3,nn))
112 xmax=
max(xmax,x(1,nn))
114 zmax=
max(zmax,x(3,nn))
115 ENDDO
116
117 xmin=xmin-eps
118 ymin=ymin-eps
119 zmin=zmin-eps
120 xmax=xmax+eps
122 zmax=zmax+eps
123
124 dmx=xmax-xmin
126 dmz=zmax-zmin
127
128 nbx =
max(1,int(dmx/dbuc))
129 nby =
max(1,int(dmy/dbuc))
130 nbz =
max(1,int(dmz/dbuc))
131
132 DO n=1,numcnod
134 nobx(n) = (x(1,nn)-xmin)/dbuc
135 noby(n) = (x(2,nn)-ymin)/dbuc
136 nobz(n) = (x(3,nn)-zmin)/dbuc
137 ENDDO
138
139 DO n=1,numcnod
141 nobcx(n) = (x(1,nn)-xmin)/dbuc
142 nobcy(n) = (x(2,nn)-ymin)/dbuc
143 nobcz(n) = (x(3,nn)-zmin)/dbuc
144 ENDDO
145
146 nband =
max(nbx, nby,nbz) + 1
147
148 ALLOCATE(npx(0:numcnod+nband) , npy(0:3*(numcnod+nband)),
149 . npz(0:9*(numcnod+nband)) , ipx(numcnod+nband) ,
150 . ipy(numcnod+nband) , ipz(numcnod+nband) ,
151 . npcx(0:numcnod+nband) , npcy(0:numcnod+nband) ,
152 . npcz(0:numcnod+nband) , ipcx(numcnod+nband) ,
153 . ipcy(numcnod+nband) , ipcz(numcnod+nband) ,
154 . imergetmp(numcnod))
155
156 npx(0:numcnod+nband) = 0
157 npy(0:3*(numcnod+nband)) = 0
158 npz(0:9*(numcnod+nband)) = 0
159 ipx(numcnod+nband) = 0
160 ipy(numcnod+nband) = 0
161 ipz(numcnod+nband) = 0
162 npcx(0:numcnod+nband) = 0
163 npcy(0:numcnod+nband) = 0
164 npcz(0:numcnod+nband) = 0
165 ipcx(numcnod+nband) = 0
166 ipcy(numcnod+nband) = 0
167 ipcz(numcnod+nband) = 0
168 imergetmp(1:numcnod) = 0
169
170
171
172
173
174
175 DO ib=0,nbx+1
176 npx(ib)=0
177 ENDDO
178
179 DO n=1,numcnod
180 nbox=nobx(n)+1
181 IF(nbox >= 1.AND.nbox <= nbx+1)THEN
182 npx(nbox)=npx(nbox)+1
183 ENDIF
184 ENDDO
185 DO ib=1,nbx+1
186 npx(ib)=npx(ib)+npx(ib-1)
187 ENDDO
188 DO ib=nbx+1,1,-1
189 npx(ib)=npx(ib-1)
190 ENDDO
191
192 DO n=1,numcnod
193 nbox=nobx(n)+1
194
195 IF(nbox >= 1.AND.nbox <= nbx+1)THEN
196 npx(nbox)=npx(nbox)+1
197 ipx(npx(nbox))=n
198 ENDIF
199 ENDDO
200
201
202
203 DO ib=0,nbx+1
204 npcx(ib)=0
205 ENDDO
206 DO n=1,numcnod
207 nbox=nobcx(n)+1
208 IF(nbox >= 1.AND.nbox <= nbx+1)THEN
209 npcx(nbox)=npcx(nbox)+1
210 ENDIF
211 ENDDO
212 DO ib=1,nbx+1
213 npcx(ib)=npcx(ib)+npcx(ib-1)
214 ENDDO
215 DO ib=nbx+1,1,-1
216 npcx(ib)=npcx(ib-1)
217 ENDDO
218 DO n=1,numcnod
219 nbox=nobcx(n)+1
220
221 IF(nbox >= 1.AND.nbox <= nbx+1)THEN
222 npcx(nbox)=npcx(nbox)+1
223 ipcx(npcx(nbox))=n
224 ENDIF
225 ENDDO
226
227 DO ibx=1,nbx+1
228 iboite = 0
229 DO kp= npcx(ibx-1)+1,npcx(ibx)
230 IF(ipcx(kp)> 0)iboite =1
231 ENDDO
232
233 IF(iboite > 0) THEN
234 DO iby=0,nby+1
235 npy(iby)=0
236 ENDDO
237 DO ks=npx(
max(ibx-2,0))+1,npx(
min(ibx+1,nbx+1))
238 n =ipx(ks)
239 nboy=noby(n)+1
240
241 IF(nboy >= 1 .AND. nboy <= nby+1)THEN
242 npy(nboy)=npy(nboy)+1
243 ENDIF
244 ENDDO
245 DO iby=1,nby+1
246 npy(iby)=npy(iby)+npy(iby-1)
247 ENDDO
248 DO iby=nby+1,1,-1
249 npy(iby)=npy(iby-1)
250 ENDDO
251 DO ks=npx(
max(ibx-2,0))+1,npx(
min(ibx+1,nbx+1))
252 n =ipx(ks)
253 nboy=noby(n)+1
254
255 IF(nboy >= 1 .AND. nboy <= nby+1)THEN
256 npy(nboy)=npy(nboy)+1
257 ipy(npy(nboy))=n
258 ENDIF
259 ENDDO
260
261
262
263 DO iby=0,nby+1
264 npcy(iby)=0
265 ENDDO
266 DO ks=npcx(ibx-1)+1,npcx(ibx)
267 n =ipcx(ks)
268 nboy=nobcy(n)+1
269
270 IF(nboy >= 1.AND.nboy <= nby+1)THEN
271 npcy(nboy)=npcy(nboy)+1
272 ENDIF
273 ENDDO
274
275 DO iby=1,nby+1
276 npcy(iby)=npcy(iby)+npcy(iby-1)
277 ENDDO
278
279 DO iby=nby+1,1,-1
280 npcy(iby)=npcy(iby-1)
281 ENDDO
282 DO ks=npcx(ibx-1)+1,npcx(ibx)
283 n =ipcx(ks)
284 nboy=nobcy(n)+1
285
286 IF(nboy >= 1.AND. nboy <= nby+1)THEN
287 npcy(nboy)=npcy(nboy)+1
288 ipcy(npcy(nboy))=n
289 ENDIF
290 ENDDO
291
292
293
294 DO iby=1,nby+1
295 iboite = 0
296 DO kp= npcy(iby-1)+1,npcy(iby)
297 IF(ipcy(kp) > 0)iboite = 1
298 ENDDO
299
300 IF(iboite > 0) THEN
301 DO ibz=0,nbz+1
302 npz(ibz)=0
303 ENDDO
304 DO ks=npy(
max(iby-2,0))+1,npy(
min(iby+1, nby+1))
305 n =ipy(ks)
306 nboz=nobz(n)+1
307
308 IF(nboz >= 1.AND.nboz <= nbz+1)THEN
309 npz(nboz)=npz(nboz)+1
310 ENDIF
311 ENDDO
312 DO ibz=1,nbz+1
313 npz(ibz)=npz(ibz)+npz(ibz-1)
314 ENDDO
315 DO ibz=nbz+1,1,-1
316 npz(ibz)=npz(ibz-1)
317 ENDDO
318 DO ks=npy(
max(iby-2,0))+1,npy(
min(iby+1, nby+1))
319 n =ipy(ks)
320 nboz=nobz(n)+1
321
322 IF(nboz >= 1 .AND. nboz <= nbz+1)THEN
323 npz(nboz)=npz(nboz)+1
324 ipz(npz(nboz))=n
325 ENDIF
326 ENDDO
327
328
329
330 DO ibz=0,nbz+1
331 npcz(ibz)=0
332 ENDDO
333 DO ks=npcy(iby-1)+1,npcy(iby)
334 n =ipcy(ks)
335 nboz=nobcz(n)+1
336 IF(nboz >= 1.AND.nboz <= nbz+1)THEN
337 npcz(nboz)=npcz(nboz)+1
338 ENDIF
339 ENDDO
340 DO ibz=1,nbz+1
341 npcz(ibz)=npcz(ibz)+npcz(ibz-1)
342 ENDDO
343 DO ibz=nbz+1,1,-1
344 npcz(ibz)=npcz(ibz-1)
345 ENDDO
346 DO ks=npcy(iby-1)+1,npcy(iby)
347 n =ipcy(ks)
348 nboz=nobcz(n)+1
349 IF(nboz >= 1.AND. nboz <= nbz+1)THEN
350 npcz(nboz)=npcz(nboz)+1
351 ipcz(npcz(nboz))=n
352 ENDIF
353 ENDDO
354
355
356
357 DO ibz=1,nbz+1
358 DO kp= npcz(ibz-1)+1,npcz(ibz)
359 nc =ipcz(kp)
360 IF (nc > 0) THEN
361 DO ks=npz(
max(ibz-2,0))+1,npz(
min(ibz+1,nbz+1))
362 ns =ipz(ks)
363
364 IF (nc /= ns .AND. (imergetmp(nc) == 0 .and.
365 . imergetmp(ns) == 0)) THEN
366
368 xi =x(1,ig)
369 yi =x(2,ig)
370 zi =x(3,ig)
371 dmerge = cmerge(nc)*cmerge(nc)
373 xj =(x(1,jg)-xi)
374 yj =(x(2,jg)-yi)
375 zj =(x(3,jg)-zi)
376 dist2=xj**2 + yj**2 + zj**2
377 ddd(nc) = dist2
378 IF(itabc(nc)/=itabc(ns).AND.dist2<=dmerge)THEN
379 IF(imergetmp(nc) == 0) THEN
380 imergetmp(nc) = itabc(ns)
381 dvois = dist2
382 ddd(nc) = dist2
383 ELSEIF(dist2 < dvois)THEN
384 imergetmp(nc) = itabc(ns)
385 dvois = dist2
386 ddd(nc) = dist2
387 ENDIF
388 ENDIF
389
390 ENDIF
391
392 ENDDO
393 ENDIF
394 ENDDO
395 ENDDO
396
397 ENDIF
398 ENDDO
399 ENDIF
400 ENDDO
401
402
403
404
405 nmerged_old = nmerged
406 nm = nmerged_old
407
408 DO i= 1,numcnod
409 IF (imergetmp(i) > 0 .AND. imerge0(i) == 0) THEN
410 nm = nm+1
411 imerge(nmerge_tot+nm) =
usrtosc(imergetmp(i),itabm1)
412 imerge(nm) =
usrtosc(itabc(i) ,itabm1)
413
414
415
416
417
418 ENDIF
419 ENDDO
420 nmerged = nm
421
422
423
424 IF (nmerged - nmerged_old > 0) THEN
425 lbuf = 0
426 DO i = 1,numcnod
427 IF (imerge(nmerge_tot+i) > 0) THEN
428 n = imerge(nmerge_tot+i)
429 lbuf(n) = lbuf(n) + 1
430 ENDIF
431 ENDDO
432
433
434 iadmerge2tmp(1) = 1
435 DO i = 2,numnod+1
436
437 iadmerge2tmp(i) = iadmerge2tmp(i-1) + lbuf(i-1)
438 ENDDO
439
440 DO i = nmerged_old+1,numcnod
441 IF (imerge(nmerge_tot+i) > 0) THEN
442 n = imerge(nmerge_tot+i)
443 imerge2(iadmerge2tmp(n)) = imerge(i)
444 iadmerge2tmp(n)=iadmerge2tmp(n)+1
445 ENDIF
446 ENDDO
447 ENDIF
448
449 WRITE(iout,'(//A/A//A/)')titre(207),titre(115),titre(208)
450
451 j=nmerged_old
452 DO n=nmerged_old+1,nmerged,50
453 j=j+50
455 DO i=n,j
456 WRITE(iout,'(5X,I10,8X,I10)')
457 . itab(imerge(i)),itab(imerge(nmerge_tot+i))
458 ENDDO
459 ENDDO
460
461
462
463
464 WRITE(iout,'(//A/A//A/)')titre(209),titre(115),titre(210)
465
466 DO i= 1,numcnod
467 IF (imergetmp(i) == 0 .AND. imerge0(i) == 0) THEN
468 WRITE(iout,'(5X,I10)') itabc(i)
469 ENDIF
470 ENDDO
471
472 DEALLOCATE(npx ,npy ,npz ,ipx ,ipy ,ipz ,
473 . npcx ,npcy ,npcz ,ipcx ,ipcy ,ipcz ,
474 . imergetmp)
475
476 RETURN
subroutine ymax(idn, fac, npc, pld, stiffmin, stiffmax, stiffini, stiffavg)
integer function usrtosc(iu, itabm1)
integer function usrtos(iu, itabm1)