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