41
42
43
45
46
47
48#include "implicit_f.inc"
49
50
51
52#include "mvsiz_p.inc"
53
54
55
56#include "param_c.inc"
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112 INTEGER NRTM,NRTSR,I_ADD,MAXSIZ,I_MEM,ESHIFT,NRTS,
113 . NSN4,NB_N_B,NOINT,I_ADD_MAX,IAUTO ,NIN,
114 . ADD(2,*),IRECTS(2,*),IRECTM(2,*),
115 . CAND_S(*),CAND_M(*),ADDCM(*),CHAINE(2,*),ITAB(*),
116 . NB_OLD(2,*),IFPEN(*),IFORM,II_STOK
117
119 . x(3,*),xyzm(6,*),stfs(*),stfm(*),
120 . tzinf,maxbox,minbox
121
122
123
124 INTEGER NB_NCN,NB_NCN1,NB_ECN,ADDNN,ADDNE,I,J,DIR,NN1,NN2,
125 . N1,N2,NN,NE,K,L,NCAND_PROV,J_STOK,NI,
126 . ISTOP,NB_ECN1,PROV_S(2*MVSIZ),PROV_M(2*MVSIZ),
127 . NB_NC_OLD, NB_EC_OLD, NB_NC, NB_EC,JJ,KK,
128
129
130 . BPE(NRTM+100),PE(MAXSIZ),BPN(NRTS+NRTSR+100),PN(MAXSIZ)
131
133 . dx,dy,dz,dsup,seuil, xx1, xx2,
134 . xmin, xmax,ymin,
ymax,zmin, zmax,
135 . xmins,ymins,zmins,xmaxs,ymaxs,zmaxs,
136 . yy1,yy2,zz1,zz2,dmx,dmy,dmz,
137 . xy1,xy2,xz1,xz2,ximin,ximax,xjmin,xjmax,xkmin,xkmax,
138 . timin,timax,tjmin,tjmax,tkmin,tkmax,tsmin,tsmax,
139 . txmin, txmax,tymin, tymax,tzmin, tzmax
141 LOGICAL I11INSID
142
143
144
145
146
147
148 xmin = xyzm(1,i_add)
149 ymin = xyzm(2,i_add)
150 zmin = xyzm(3,i_add)
151 xmax = xyzm(4,i_add)
153 zmax = xyzm(6,i_add)
154
155
156 nb_ec = 0
157 DO i=1,nrtm
158
159 IF(stfm(i)/=zero)THEN
160 nb_ec = nb_ec + 1
161 bpe(nb_ec) = i
162 END IF
163 ENDDO
164
165
166
167
168 nb_nc = 0
169 DO i=1,nrts
170
171 IF(stfs(i)/=zero)THEN
172 n1=irects(1,i)
173 n2=irects(2,i)
174 xmins =
min(x(1,n1),x(1,n2))
175 ymins =
min(x(2,n1),x(2,n2))
176 zmins =
min(x(3,n1),x(3,n2))
177 xmaxs =
max(x(1,n1),x(1,n2))
178 ymaxs =
max(x(2,n1),x(2,n2))
179 zmaxs =
max(x(3,n1),x(3,n2))
180 IF(xmaxs>=xmin.AND.xmins<=xmax.AND.
181 . ymaxs>=ymin.AND.ymins<=
ymax.AND.
182 . zmaxs>=zmin.AND.zmins<=zmax)THEN
183 nb_nc = nb_nc + 1
184 bpn(nb_nc) = i
185 ENDIF
186 END IF
187 ENDDO
188
189
190
191 DO i = nrts+1, nrts+nrtsr
192 nb_nc = nb_nc + 1
193 bpn(nb_nc) = i
194 ENDDO
195
196
197
198
199 j_stok = 0
200 istop = 0
201 nb_nc_old = 0
202 nb_ec_old = 0
203
204 nb_old(1,i_add) = 0
205 nb_old(2,i_add) = 0
206
207 dx = xyzm(4,i_add) - xyzm(1,i_add)
208 dy = xyzm(5,i_add) - xyzm(2,i_add)
209 dz = xyzm(6,i_add) - xyzm(3,i_add)
211 GOTO 200
212
213 100 CONTINUE
214
215
216
217
218
219
220
221
222
223
224
225 xmin = 1.e30
226 xmax = -1.e30
227
228 ymin = 1.e30
230
231 zmin = 1.e30
232 zmax = -1.e30
233
234 DO i=1,nb_ec
235 ne = bpe(i)
236 xx1=x(1, irectm(1,ne))
237 xx2=x(1, irectm(2,ne))
238 xmin=
min(xmin,xx1,xx2)
239 xmax=
max(xmax,xx1,xx2)
240
241 yy1=x(2, irectm(1,ne))
242 yy2=x(2, irectm(2,ne))
243 ymin=
min(ymin,yy1,yy2)
245
246 zz1=x(3, irectm(1,ne))
247 zz2=x(3, irectm(2,ne))
248 zmin=
min(zmin,zz1,zz2)
249 zmax=
max(zmax,zz1,zz2)
250 ENDDO
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299 xmin =
max(xmin - tzinf , xyzm(1,i_add))
300 ymin =
max(ymin - tzinf , xyzm(2,i_add))
301 zmin =
max(zmin - tzinf , xyzm(3,i_add))
302 xmax =
min(xmax + tzinf , xyzm(4,i_add))
304 zmax =
min(zmax + tzinf , xyzm(6,i_add))
305
306 txmin = xmin - tzinf
307 tymin = ymin - tzinf
308 tzmin = zmin - tzinf
309 txmax = xmax + tzinf
311 tzmax = zmax + tzinf
312
313 dmx = xmax-xmin
315 dmz = zmax-zmin
316
317 dsup =
max(dmx,dmy,dmz)
318
319 IF(dmy==dsup) THEN
320 dir = 2
321 jj = 3
322 kk = 1
323 seuil = (ymin+
ymax)*0.5
324 ximin = ymin
325 xjmin = zmin
326 xkmin = xmin
328 xjmax = zmax
329 xkmax = xmax
330 timin = tymin
331 tjmin = tzmin
332 tkmin = txmin
333 timax = tymax
334 tjmax = tzmax
335 tkmax = txmax
336 ELSE IF(dmz==dsup) THEN
337 dir = 3
338 jj = 1
339 kk = 2
340 seuil = (zmin+zmax)*0.5
341 ximin = zmin
342 xjmin = xmin
343 xkmin = ymin
344 ximax = zmax
345 xjmax = xmax
347 timin = tzmin
348 tjmin = txmin
349 tkmin = tymin
350 timax = tzmax
351 tjmax = txmax
352 tkmax = tymax
353 ELSE
354 dir = 1
355 jj = 2
356 kk = 3
357 seuil = (xmin+xmax)*0.5
358 ximin = xmin
359 xjmin = ymin
360 xkmin = zmin
361 ximax = xmax
363 xkmax = zmax
364 timin = txmin
365 tjmin = tymin
366 tkmin = tzmin
367 timax = txmax
368 tjmax = tymax
369 tkmax = tzmax
370 ENDIF
371
372 tsmin = seuil - tzinf
373 tsmax = seuil + tzinf
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391 nb_ncn= 0
392 nb_ncn1= 0
393 addnn= add(1,i_add)
394 DO i=1,nb_nc
395 nn = bpn(i)
396 IF(nn<=nrts) THEN
397 xx1=x(dir,irects(1,nn))
398 xx2=x(dir,irects(2,nn))
399 xy1=x(jj, irects(1,nn))
400 xy2=x(jj, irects(2,nn))
401 xz1=x(kk, irects(1,nn))
402 xz2=x(kk, irects(2,nn))
403 ELSE
404 ni = nn-nrts
405 xx1=xrem(dir,ni)
406 xx2=xrem(dir+7,ni)
407 xy1=xrem(jj ,ni)
408 xy2=xrem(jj+7 ,ni)
409 xz1=xrem(kk ,ni)
410 xz2=xrem(kk+7 ,ni)
411 END IF
414 IF(xmin<seuil.AND.xmax>=ximin) THEN
415 IF(
i11insid(xx1,xx2,xy1,xy2,xz1,xz2,
416 . ximin,seuil,xjmin,xjmax,xkmin,xkmax)) THEN
417
418 nb_ncn1 = nb_ncn1 + 1
419 addnn = addnn + 1
420 pn(addnn) = nn
421 END IF
422 END IF
423 ENDDO
424 DO i=1,nb_nc
425 nn = bpn(i)
426 IF(nn<=nrts) THEN
427 xx1=x(dir,irects(1,nn))
428 xx2=x(dir,irects(2,nn))
429 xy1=x(jj, irects(1,nn))
430 xy2=x(jj, irects(2,nn))
431 xz1=x(kk, irects(1,nn))
432 xz2=x(kk, irects(2,nn))
433 ELSE
434 ni = nn-nrts
435 xx1=xrem(dir,ni)
436 xx2=xrem(dir+7,ni)
437 xy1=xrem(jj ,ni)
438 xy2=xrem(jj+7 ,ni)
439 xz1=xrem(kk ,ni)
440 xz2=xrem(kk+7 ,ni)
441 END IF
444 IF(xmax>=seuil.AND.xmin<=ximax) THEN
445 IF(
i11insid(xx1,xx2,xy1,xy2,xz1,xz2,
446 . seuil,ximax,xjmin,xjmax,xkmin,xkmax)) THEN
447
448 nb_ncn = nb_ncn + 1
449 bpn(nb_ncn) = nn
450 ENDIF
451 ENDIF
452 ENDDO
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479 nb_ecn= 0
480 nb_ecn1= 0
481 addne= add(2,i_add)
482 IF(nb_ncn1==0) THEN
483 DO i=1,nb_ec
484 ne = bpe(i)
485 xx1=x(dir, irectm(1,ne))
486 xx2=x(dir, irectm(2,ne))
487 IF(
max(xx1,xx2)>=tsmin)
THEN
488 xy1=x(jj, irectm(1,ne))
489 xy2=x(jj, irectm(2,ne))
490 xz1=x(kk, irectm(1,ne))
491 xz2=x(kk, irectm(2,ne))
492 IF(
i11insid(xx1,xx2,xy1,xy2,xz1,xz2,
493 . tsmin,timax,tjmin,tjmax,tkmin,tkmax)) THEN
494
495 nb_ecn = nb_ecn + 1
496 bpe(nb_ecn) = ne
497 ENDIF
498 ENDIF
499 ENDDO
500 ELSEIF(nb_ncn==0) THEN
501 DO i=1,nb_ec
502 ne = bpe(i)
503 xx1=x(dir, irectm(1,ne))
504 xx2=x(dir, irectm(2,ne))
505 IF(
min(xx1,xx2)<tsmax)
THEN
506 xy1=x(jj, irectm(1,ne))
507 xy2=x(jj, irectm(2,ne))
508 xz1=x(kk, irectm(1,ne))
509 xz2=x(kk, irectm(2,ne))
510 IF(
i11insid(xx1,xx2,xy1,xy2,xz1,xz2,
511 . timin,tsmax,tjmin,tjmax,tkmin,tkmax)) THEN
512
513 addne = addne + 1
514 nb_ecn1= nb_ecn1 + 1
515 pe(addne) = ne
516 ENDIF
517 ENDIF
518 ENDDO
519 ELSE
520 DO i=1,nb_ec
521 ne = bpe(i)
522 xx1=x(dir, irectm(1,ne))
523 xx2=x(dir, irectm(2,ne))
524 IF(
min(xx1,xx2)<tsmax)
THEN
525 xy1=x(jj, irectm(1,ne))
526 xy2=x(jj, irectm(2,ne))
527 xz1=x(kk, irectm(1,ne))
528 xz2=x(kk, irectm(2,ne))
529 IF(
i11insid(xx1,xx2,xy1,xy2,xz1,xz2,
530 . timin,tsmax,tjmin,tjmax,tkmin,tkmax)) THEN
531
532 addne = addne + 1
533 nb_ecn1= nb_ecn1 + 1
534 pe(addne) = ne
535 ENDIF
536 ENDIF
537 ENDDO
538 DO i=1,nb_ec
539 ne = bpe(i)
540 xx1=x(dir, irectm(1,ne))
541 xx2=x(dir, irectm(2,ne))
542 IF(
max(xx1,xx2)>=tsmin)
THEN
543 xy1=x(jj, irectm(1,ne))
544 xy2=x(jj, irectm(2,ne))
545 xz1=x(kk, irectm(1,ne))
546 xz2=x(kk, irectm(2,ne))
547 IF(
i11insid(xx1,xx2,xy1,xy2,xz1,xz2,
548 . tsmin,timax,tjmin,tjmax,tkmin,tkmax)) THEN
549
550 nb_ecn = nb_ecn + 1
551 bpe(nb_ecn) = ne
552 ENDIF
553 ENDIF
554 ENDDO
555 ENDIF
556
557
558
559 add(1,i_add+1) = addnn
560 add(2,i_add+1) = addne
561
562
563
564
565
566
567 xyzm(1,i_add+1) = xyzm(1,i_add)
568 xyzm(2,i_add+1) = xyzm(2,i_add)
569 xyzm(3,i_add+1) = xyzm(3,i_add)
570 xyzm(4,i_add+1) = xyzm(4,i_add)
571 xyzm(5,i_add+1) = xyzm(5,i_add)
572 xyzm(6,i_add+1) = xyzm(6,i_add)
573
574 xyzm(dir ,i_add) = ximin
575 xyzm(dir+3,i_add) = seuil
576 xyzm(dir ,i_add+1) = seuil
577 xyzm(dir+3,i_add+1) = ximax
578
579 nb_old(1,i_add)=nb_nc
580 nb_old(2,i_add)=nb_ec
581 nb_old(1,i_add+1)=nb_nc
582 nb_old(2,i_add+1)=nb_ec
583
584 nb_nc = nb_ncn
585 nb_ec = nb_ecn
586
587 i_add = i_add + 1
588 IF(i_add+1>=i_add_max) THEN
589 i_mem = 3
590 RETURN
591 ENDIF
592
593 200 CONTINUE
594
595
596
597
598
599
600
601
602
603
604
605 IF(add(1,i_add)+nb_nc>maxsiz) THEN
606
607 i_mem = 1
608 RETURN
609 ENDIF
610 IF(add(2,i_add)+nb_ec>maxsiz) THEN
611
612 i_mem = 1
613 RETURN
614 ENDIF
615
616
617
618 IF(nb_ec/=0.AND.nb_nc/=0) THEN
619
620 dx = xyzm(4,i_add) - xyzm(1,i_add)
621 dy = xyzm(5,i_add) - xyzm(2,i_add)
622 dz = xyzm(6,i_add) - xyzm(3,i_add)
624
625
626
627
628
629 IF(nb_ec+nb_nc<=128) THEN
630 ncand_prov = nb_ec*nb_nc
631 ELSE
632 ncand_prov = 129
633 ENDIF
634
635 nb_nc_old = nb_old(1,i_add)
636 nb_ec_old = nb_old(2,i_add)
637
638 IF(dsup<minbox.OR.
639 . nb_nc<=nb_n_b.OR.nb_ec<=nb_n_b.OR.
640 . ncand_prov<=128.OR.(nb_ec==nb_ec_old
641 . .AND.nb_nc==nb_nc_old)) THEN
642
643 ncand_prov = nb_ec*nb_nc
644 DO k=1,ncand_prov,nvsiz
645 DO l=k,
min(k-1+nvsiz,ncand_prov)
646 i = 1+(l-1)/nb_nc
647 j = l-(i-1)*nb_nc
648 ne = bpe(i)
649 nn = bpn(j)
650 n1=irectm(1,ne)
651 n2=irectm(2,ne)
652 IF(nn<=nrts) THEN
653 nn1=irects(1,nn)
654 nn2=irects(2,nn)
655 IF(iauto==0 .OR. itab(n1)>itab(nn1) )THEN
656 IF(nn1/=n1.AND.nn1/=n2.AND.
657 . nn2/=n1.AND.nn2/=n2) THEN
658 j_stok = j_stok + 1
659 prov_s(j_stok) = nn
660 prov_m(j_stok) = ne
661 ENDIF
662 ENDIF
663 ELSE
664 ni = nn-nrts
667 n1 = itab(n1)
668 n2 = itab(n2)
669 IF(iauto==0 .OR. n1>nn1 )THEN
670 IF(nn1/=n1.AND.nn1/=n2.AND.
671 . nn2/=n1.AND.nn2/=n2) THEN
672 j_stok = j_stok + 1
673 prov_s(j_stok) = nn
674 prov_m(j_stok) = ne
675 ENDIF
676 ENDIF
677 END IF
678 ENDDO
679 IF(j_stok>=nvsiz)THEN
681 1 nvsiz,irects,irectm,x ,ii_stok,
682 2 cand_s,cand_m,nsn4 ,noint ,tzinf ,
683 3 i_mem ,prov_s,prov_m,eshift,addcm ,
684 4 chaine,nrts ,itab ,ifpen ,iform )
685 IF(i_mem==2)RETURN
686 j_stok = j_stok-nvsiz
687#include "vectorize.inc"
688 DO j=1,j_stok
689 prov_s(j) = prov_s(j+nvsiz)
690 prov_m(j) = prov_m(j+nvsiz)
691 ENDDO
692 ENDIF
693 ENDDO
694 ELSE
695
696 GOTO 100
697
698 ENDIF
699 ENDIF
700
701
702
703
704
705 i_add = i_add - 1
706 IF (i_add/=0) THEN
707
708
709
710
711 CALL i7dstk(nb_nc,nb_ec,add(1,i_add),bpn,pn,bpe,pe)
712
713 GOTO 200
714
715 ENDIF
716
717
718
720 1 j_stok,irects,irectm,x ,ii_stok,
721 2 cand_s,cand_m,nsn4 ,noint ,tzinf ,
722 3 i_mem ,prov_s,prov_m,eshift,addcm ,
723 4 chaine,nrts ,itab ,ifpen ,iform )
724
725 RETURN
integer, dimension(:,:), allocatable irem
subroutine i11sto(j_stok, irects, irectm, x, ii_stok, cand_n, cand_e, nsn, noint, tzinf, i_mem, prov_n, prov_e, multimp, addcm, chaine, iadfin)
subroutine i7dstk(i_add, nb_nc, nb_ec, add, bpn, pn, bpe, pe)