45
46
47
48 USE my_alloc_mod
51
52
53
54#include "implicit_f.inc"
55
56
57
58#include "com04_c.inc"
59#include "units_c.inc"
60#include "param_c.inc"
61#include "scr03_c.inc"
62#include "scr17_c.inc"
63
64
65
66 INTEGER NRTM,NSN,NMN,NSV(*),(4,NRTM),MVOISIN(4,NRTM),(4,NRTM),
67 . MSEGLO(NRTM),IRTLM(4,NSN),MSEGTYP(NRTM),ITAB(*),
68 . IGEO(NPROPGI,*), NADMSR, ADMSR(4,NRTM), ADSKYN(4*NRTM+1),
69 . IADNOR(4,NRTM), NRTM_SH, IEDGE, NEDGE, LEDGE(NLEDGE,*),
70 . LBOUND(*),
71 . NISUB, LISUB(*), ADDSUBM(*), LISUBM(*), INFLG_SUBM(*),
72 . NISUBE, ADDSUBE(*), (*), INFLG_SUBE(*), MSR(*),
73 . ILEV, MBINFLG(*), EBINFLG(*)
74 INTEGER NOINT, NOM_OPT(LNOPT1,*)
75 INTEGER ID
77 . x(3,*), edg_cos
78 CHARACTER(LEN=NCHARTITLE) :: TITR
79 INTEGER , INTENT(IN) :: IDEL_SOLID
80 INTEGER , INTENT(IN) :: IELEM_M(2,NRTM)
81
82
83
84 INTEGER I,J,K,L,IW,I1,I2,I3,I4,M,N,NMAX,E_MAX,E_ID,N_EI,
85 1 NE0,NRTM0,ISH,NVERTX, IVERTX, JVERTX,
86 2 J1,J2,J3,J4,K1,K2,L1,L2,KPERM1(4),KPERM2(4),IRR,
87 3 NFT,JLT,MI,II(4),JJ(4),IEDG,JEDG,IOK,
88 4 IBASE, KBASE, KOLD, FIN, NE, EJ, NEDGE_TMP,
89 5 SOL_EDGE, SH_EDGE, ISTORE,
90 6 LL, KK, CUR, NEXT, JSUB, KSUB, IMS1, IMS2, IMS3, IMS4,
91 7 NISUBN, INFLG, MAXADD, STAT
92 INTEGER IX1, IX2, IX3, IX4,
93 , JX1, JX2, JX3, JX4,
94 . NA, NB, EA, EB,JM,MJ,DN_EI
95 INTEGER, DIMENSION(:),ALLOCATABLE :: MVOI
96 INTEGER, DIMENSION(:,:),ALLOCATABLE :: EIDNOD
98 . xa1,xa2,xa3,xa4,
99 . ya1,ya2,ya3,ya4,
100 . za1,za2,za3,za4,
101 . xb1,xb2,xb3,xb4,
102 . yb1,yb2,yb3,yb4,
103 . zb1,zb2,zb3,zb4,
104 . x01,y01,z01,x02,y02,z02,
105 . xna, yna, zna, xnb, ynb, znb, aaa, bbb, ang
106 INTEGER WORK(70000)
107 INTEGER, DIMENSION(:,:),ALLOCATABLE :: CLEF,LEDGE_TMP1,LEDGE_TMP2
108 INTEGER, DIMENSION(:),ALLOCATABLE :: INDEX, ITAG, NTAG, ROOT
109 INTEGER, DIMENSION(:), ALLOCATABLE :: MLOC,KAD,ADDSUBN,ADDSUBN_TMP,
110 . ,INFLG_SUBN,IXSUB
111 INTEGER, DIMENSION(:,:,:),ALLOCATABLE :: MNEIGH_SOLID
112
113
114
115 INTEGER BITSET, BITGET
117
118 DATA kperm1/1,3,5,7/
119 DATA kperm2/2,4,6,8/
120
121 CALL my_alloc(itag,numnod)
122 CALL my_alloc(ntag,4*nrtm)
123 CALL my_alloc(root,4*nrtm)
124
125 DO i=1,nrtm
126 mseglo(i)=i
127 ENDDO
128
129
130
131
132
133
134
135 DO i=1,numnod
136 itag(i)=0
137 ENDDO
138 DO i=1,nrtm
139 IF(ielem_m(2,i) == 0) THEN
140
141 DO j=1,3
142 m=irect(j,i)
143 itag(m)=itag(m)+1
144 END DO
145 IF (irect(4,i)/=irect(3,i))THEN
146 m= irect(4,i)
147 itag(m)=itag(m)+1
148 END IF
149 ENDIF
150 END DO
151
152
153 nmax=0
154 DO i=1,numnod
155 nmax=
max(nmax,itag(i))
156 itag(i)=0
157 ENDDO
158 ALLOCATE(mvoi(nmax+10),eidnod(nmax,numnod))
159 mvoi(1:nmax+10)=0
160 eidnod(1:nmax,1:numnod)=0
161
162 DO i=1,nrtm
163 IF(ielem_m(2,i) == 0) THEN
164
165 DO j=1,3
166 m=irect(j,i)
167 itag(m)=itag(m)+1
168 eidnod(itag(m),m)=i
169 END DO
170 IF (irect(4,i)/=irect(3,i)) THEN
171 m= irect(4,i)
172 itag(m)=itag(m)+1
173 eidnod(itag(m),m)=i
174 END IF
175 ENDIF
176 END DO
177
178 e_max=4
179 DO i=1,nrtm
180 DO j=1,e_max
181 mvoisin(j,i)=0
182 END DO
183 END DO
184
185 DO i=1,nrtm
186 IF(ielem_m(2,i) == 0) THEN
187 n_ei=0
188
189 i1 =irect(1,i)
190 i2 =irect(2,i)
191 CALL i25neigh_seg_en(itag(i1),eidnod(1,i1),itag(i2),eidnod(1,i2),mvoisin,
192 1 n_ei,mvoi ,i ,i1 ,i2 ,irect,
193 2 x ,mvoisin(1,i),nrtm,msegtyp,irr )
195
196 i1 =irect(2,i)
197 i2 =irect(3,i)
198 CALL i25neigh_seg_en(itag(i1),eidnod(1,i1),itag(i2),eidnod(1,i2),mvoisin,
199 1 n_ei,mvoi ,i ,i1 ,i2 ,irect,
200 2 x ,mvoisin(1,i),nrtm,msegtyp,irr )
202
203 i1 =irect(3,i)
204 i2 =irect(4,i)
205 CALL i25neigh_seg_en(itag(i1),eidnod(1,i1),itag(i2),eidnod(1,i2),mvoisin,
206 1 n_ei,mvoi ,i ,i1 ,i2 ,irect,
207 2 x ,mvoisin(1,i),nrtm,msegtyp,irr )
209
210 i1 =irect(4,i)
211 i2 =irect(1,i)
212 CALL i25neigh_seg_en(itag(i1),eidnod(1,i1),itag(i2),eidnod(1,i2),mvoisin,
213 1 n_ei,mvoi ,i ,i1 ,i2 ,irect,
214 2 x ,mvoisin(1,i),nrtm,msegtyp,irr )
216
217 mvoi(1:n_ei)=0
218
219 ENDIF
220 END DO
221
222
223 DO i=1,nrtm
224 DO j=1,4
225 l = mvoisin(j,i)
226 IF(l/=0) THEN
227 DO k=1,4
228 IF(mvoisin(k,l)==i) GOTO 120
229 END DO
230 WRITE(istdo,'(A,/,10I10)')
231 . 'i25inisu_nei - internal error : a segment is not neighboring its neighbor segments...',
232 . i,(itab(irect(m,i)),m=1,4),
233 . l,(itab(irect(m,l)),m=1,4)
234 120 CONTINUE
235 END IF
236 END DO
237 END DO
238
239 DEALLOCATE(mvoi,eidnod)
240
241
242
243
244
245
246 IF(idel_solid > 0) THEN
247 DO i=1,numnod
248 itag(i)=0
249 ENDDO
250 DO i=1,nrtm
251 IF(ielem_m(1,i) <= numels) THEN
252
253 DO j=1,3
254 m=irect(j,i)
255 itag(m)=itag(m)+1
256 END DO
257 IF (irect(4,i)/=irect(3,i))THEN
258 m= irect(4,i)
259 itag(m)=itag(m)+1
260 END IF
261 ENDIF
262 END DO
263
264 nmax=0
265 DO i=1,numnod
266 nmax=
max(nmax,itag(i))
267 itag(i)=0
268 ENDDO
269 ALLOCATE(eidnod(nmax,numnod))
270 eidnod(1:nmax,1:numnod)=0
271 ALLOCATE(mvoi(nmax+10))
272 mvoi(1:nmax+10)=0
273
274 ALLOCATE(mneigh_solid(nmax,4,nrtm))
275 mneigh_solid(1:nmax,1:4,1:nrtm) = 0
276 DO i=1,nrtm
277 IF(ielem_m(1,i) <= numels) THEN
278
279 DO j=1,3
280 m=irect(j,i)
281 itag(m)=itag(m)+1
282 eidnod(itag(m),m)=i
283 END DO
284 IF (irect(4,i)/=irect(3,i)) THEN
285 m= irect(4,i)
286 itag(m)=itag(m)+1
287 eidnod(itag(m),m)=i
288 END IF
289 ENDIF
290 END DO
291
292
293
294 DO i=1,nrtm
295 IF(ielem_m(1,i) <= numels) THEN
296 n_ei=0
297
298 i1 =irect(1,i)
299 i2 =irect(2,i)
300 CALL i25neigh_seg_e(itag(i1),eidnod(1,i1),itag(i2),eidnod(1,i2),n_ei,mvoi,i,
301 . i1,i2,irect,nrtm,msegtyp ,mvoisin)
302 mneigh_solid(1:n_ei,1,i) = mvoi(1:n_ei)
303 ne0 =n_ei
304
305 i1 =irect(2,i)
306 i2 =irect(3,i)
307 CALL i25neigh_seg_e(itag(i1),eidnod(1,i1),itag(i2),eidnod(1,i2),n_ei,mvoi,i,
308 . i1,i2,irect,nrtm,msegtyp ,mvoisin)
309 dn_ei = n_ei - ne0
310 mneigh_solid(1:dn_ei,2,i) = mvoi(ne0+1:n_ei)
311 ne0 =n_ei
312
313 i1 =irect(3,i)
314 i2 =irect(4,i)
315 CALL i25neigh_seg_e(itag(i1),eidnod(1,i1),itag(i2),eidnod(1,i2),n_ei,mvoi,i,
316 . i1,i2,irect,nrtm,msegtyp ,mvoisin)
317 dn_ei = n_ei - ne0
318 mneigh_solid(1:dn_ei,3,i) = mvoi(ne0+1:n_ei)
319 ne0 =n_ei
320
321 i1 =irect(4,i)
322 i2 =irect(1,i)
323 CALL i25neigh_seg_e(itag(i1),eidnod(1,i1),itag(i2),eidnod(1,i2),n_ei,mvoi,i,
324 . i1,i2,irect,nrtm,msegtyp ,mvoisin)
325 dn_ei = n_ei - ne0
326 mneigh_solid(1:dn_ei,4,i) = mvoi(ne0+1:n_ei)
327
328 mvoi(1:n_ei)=0
329 ENDIF
330 ENDDO
331
332 DEALLOCATE(mvoi,eidnod)
333
334 ENDIF
335 DEALLOCATE(itag)
336
337
338
339
340 nvertx=0
341 DO i=1,nrtm
342 DO j=1,3
343 nvertx =nvertx+1
344 admsr(j,i) =nvertx
345 root(nvertx)=nvertx
346 END DO
347 IF(irect(4,i)/=irect(3,i))THEN
348 nvertx =nvertx+1
349 admsr(4,i) =nvertx
350 root(nvertx)=nvertx
351 ELSE
352 admsr(4,i)=admsr(3,i)
353 END IF
354 END DO
355
356 DO i=1,nrtm
357
358 ii(1:4)=irect(1:4,i)
359
360 DO iedg=1,4
361
362 IF(ii(4)==ii(3).AND.iedg==3) cycle
363 i1=iedg
364 i2=mod(iedg,4)+1
365
366 mi=mvoisin(iedg,i)
367 IF(mi/=0)THEN
368
369 jj(1:4)=irect(1:4,mi)
370
371 iok=0
372 DO jedg=1,4
373
374 IF(jj(4)==jj(3).AND.jedg==3) cycle
375
376 j1=jedg
377 j2=mod(jedg,4)+1
378 IF(ii(i2)==jj(j1).AND.ii(i1)==jj(j2))THEN
379
380 ivertx=
min(root(admsr(i1,i)),root(admsr(j2,mi)))
381 jvertx=
max(root(admsr(i1,i)),root(admsr(j2,mi)))
382 IF(jvertx/=ivertx) root(jvertx)=ivertx
383
384 ivertx=
min(root(admsr(i2,i)),root(admsr(j1,mi)))
385 jvertx=
max(root(admsr(i2,i)),root(admsr(j1,mi)))
386 IF(jvertx/=ivertx) root(jvertx)=ivertx
387
388 iok=1
389
390 evoisin(iedg,i)=jedg
391
392 ELSEIF(ii(i1)==jj(j1).AND.ii(i2)==jj(j2))THEN
393 print *,'i25inisu_nei - internal error : non-consistent neighboring segment'
394
395 END IF
396 END DO
397
398 IF(iok==0)
399 . WRITE(istdo,*) 'i25inisu_nei - internal error : no common edge w/neighboring segment',
400 . itab(ii(1)),itab(ii(2)),itab(ii(3)),itab(ii(4)),
401 . itab(jj(1)),itab(jj(2)),itab(jj(3)),itab(jj(4))
402 END IF
403
404 IF(ielem_m(1,i) <= numels.AND.idel_solid > 0) THEN
405 DO k=1,nmax
406 mj = mneigh_solid(k,iedg,i)
407 IF(mj/=0.AND.mj/=mi) THEN
408
409 jj(1:4)=irect(1:4,mj)
410
411 iok=0
412 DO jedg=1,4
413
414 IF(jj(4)==jj(3).AND.jedg==3) cycle
415
416 j1=jedg
417 j2=mod(jedg,4)+1
418 IF(ii(i2)==jj(j1).AND.ii(i1)==jj(j2))THEN
419
420 ivertx=
min(root(admsr(i1,i)),root(admsr(j2,mj)))
421 jvertx=
max(root(admsr(i1,i)),root(admsr(j2,mj)))
422 IF(jvertx/=ivertx) root(jvertx)=ivertx
423
424 ivertx=
min(root(admsr(i2,i)),root(admsr(j1,mj)))
425 jvertx=
max(root(admsr(i2,i)),root(admsr(j1,mj)))
426 IF(jvertx/=ivertx) root(jvertx)=ivertx
427
428 iok=1
429
430
431
432
433 END IF
434 END DO
435
436
437
438
439
440
441 ENDIF
442 ENDDO
443 ENDIF
444 END DO
445
446 END DO
447
448 IF(idel_solid > 0) DEALLOCATE(mneigh_solid)
449
450 DO i=1,nvertx
451 j=i
452 DO WHILE(root(j) < j)
453 j=root(j)
454 END DO
455 root(i)=j
456 END DO
457
458 nadmsr=0
459 ntag(1:nvertx)=0
460 DO i=1,nvertx
461 j=root(i)
462 IF(ntag(j)==0)THEN
463 nadmsr =nadmsr+1
464 ntag(j)=nadmsr
465 END IF
466 END DO
467
468 DO i=1,nrtm
469 admsr(1,i)=root(admsr(1,i))
470 admsr(1,i)=ntag(admsr(1,i))
471 admsr(2,i)=root(admsr(2,i))
472 admsr(2,i)=ntag(admsr(2,i))
473 admsr(3,i)=root(admsr(3,i))
474 admsr(3,i)=ntag(admsr(3,i))
475 admsr(4,i)=root(admsr(4,i))
476 admsr(4,i)=ntag(admsr(4,i))
477 END DO
478
479
480
481 ntag(1:4*nrtm)=0
482 DO i=1,nrtm
483 i1 = abs(admsr(1,i))
484 i2 = abs(admsr(2,i))
485 i3 = abs(admsr(3,i))
486 i4 = abs(admsr(4,i))
487 ntag(i1) = ntag(i1) + 1
488 ntag(i2) = ntag(i2) + 1
489 ntag(i3) = ntag(i3) + 1
490 IF(i4/=i3) ntag(i4) = ntag(i4) + 1
491 END DO
492
493 adskyn(1) = 1
494 DO n=1,nadmsr
495 adskyn(n+1) = adskyn(n)+ntag(n)
496 END DO
497
498 DO n=1,nrtm
499 i1 = abs(admsr(1,n))
500 i2 = abs(admsr(2,n))
501 i3 = abs(admsr(3,n))
502 i4 = abs(admsr(4,n))
503 IF(irect(3,n)/=irect(4,n))THEN
504 iadnor(1,n)=adskyn(i1)
505 adskyn(i1) = adskyn(i1)+1
506 iadnor(2,n)=adskyn(i2)
507 adskyn(i2) = adskyn(i2)+1
508 iadnor(3,n)=adskyn(i3)
509 adskyn(i3) = adskyn(i3)+1
510 iadnor(4,n)=adskyn(i4)
511 adskyn(i4) = adskyn(i4)+1
512 ELSE
513 iadnor(1,n)=adskyn(i1)
514 adskyn(i1) = adskyn(i1)+1
515 iadnor(2,n)=adskyn(i2)
516 adskyn(i2) = adskyn(i2)+1
517 iadnor(3,n)=adskyn(i3)
518 adskyn(i3) = adskyn(i3)+1
519 END IF
520 END DO
521
522
523
524 adskyn(1) = 1
525 DO n=1,nadmsr
526 adskyn(n+1) = adskyn(n)+ntag(n)
527 END DO
528
529 DEALLOCATE(ntag,root)
530
531 nrtm0=nrtm-nrtm_sh
532
533 nedge =0
534 lbound(1:nadmsr)=0
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558 ALLOCATE(ledge_tmp1(nledge,4*nrtm))
559
560 DO i=1,nrtm
561 IF(ielem_m(2,i) == 0) THEN
562 IF(i <= nrtm0)THEN
563 ibase=i
564 ELSE
565 ibase=-msegtyp(i)
566
567 IF(ibase > nrtm)ibase=ibase-nrtm
568
569 END IF
570
571 DO j=1,4
572 i1=irect(j,i)
573 i2=irect(mod(j,4)+1,i)
574
575 k=mvoisin(j,i)
576
577 IF(k <= nrtm0)THEN
578 kbase=k
579 ELSE
580 kbase=-msegtyp(k)
581
582 IF(kbase > nrtm)kbase=kbase-nrtm
583
584 END IF
585
586 IF(kbase < ibase)THEN
587
588 IF(.NOT.(i1==i2.AND.j==3))THEN
589
590 nedge=nedge+1
591 ledge_tmp1(1,nedge)=i
592 ledge_tmp1(2,nedge)=j
593 ledge_tmp1(3,nedge)=k
594 ledge_tmp1(4,nedge)=0
595 IF(itab(i1) < itab(i2))THEN
596 ledge_tmp1(5,nedge)=i1
597 ledge_tmp1(6,nedge)=i2
598 ELSE
599 ledge_tmp1(5,nedge)=i2
600 ledge_tmp1(6,nedge)=i1
601 END IF
602
603 IF(k/=0)THEN
604 IF(msegtyp(i)==0.AND.msegtyp(k)==0)THEN
605 ledge_tmp1(7,nedge)=1
606 ELSE
607 ledge_tmp1(7,nedge)=2
608 END IF
609 ELSE
610 ledge_tmp1(7,nedge)=2
611 END IF
612
613 IF(k/=0)THEN
614 DO l=1,4
615 k1=irect(l,k)
616 k2=irect(mod(l,4)+1,k)
617 IF(.NOT.(k1==k2.AND.l==3).AND.((k1==i1.AND.k2==i2).OR.(k2==i1.AND.k1==i2))) THEN
618 ledge_tmp1(4,nedge)=l
619 END IF
620 END DO
621 IF(ledge_tmp1(4,nedge)==0)THEN
622 WRITE(istdo,'(A)')
623 . 'i25inisu_nei - internal error : could not find the edge on neighboring element'
624 END IF
625 END IF
626
627 END IF
628
629
630 END IF
631
632 IF(k==0)THEN
633 IF(.NOT.(i1==i2.AND.j==3))THEN
634
635 lbound(admsr(j,i))=1
636 lbound(admsr(mod(j,4)+1,i))=1
637
638 END IF
639 END IF
640 END DO
641 ENDIF
642 END DO
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675 ALLOCATE(clef(4,nedge),ledge_tmp2(nledge,nedge),index(2*nedge))
676 DO i=1,nedge
677
678 i1 = ledge_tmp1(5,i)
679 i2 = ledge_tmp1(6,i)
680
681 ne =ledge_tmp1(1,i)
682 ej =ledge_tmp1(2,i)
683
684 IF(ne <= nrtm0)THEN
685 ibase=ne
686 ELSE
687 ibase=-msegtyp(ne)
688 IF(ibase > nrtm)ibase=ibase-nrtm
689 END IF
690
691 ne =ledge_tmp1(3,i)
692 ej =ledge_tmp1(4,i)
693
694 IF(ne <= nrtm0)THEN
695 kbase=ne
696 ELSE
697 kbase=-msegtyp(ne)
698 IF(kbase > nrtm)kbase=kbase-nrtm
699 END IF
700
701 index(i) = i
702
703 clef(1,i) = i1
704 clef(2,i) = i2
705 clef(3,i) = ibase
706 clef(4,i) = kbase
707
708 END DO
709
710 CALL my_orders(0,work,clef,index,nedge,4)
711
712 nedge_tmp = nedge
713 ledge_tmp2(1:nledge,1:nedge)=ledge_tmp1(1:nledge,1:nedge)
714
715 nedge = 0
716
717 i=1
718 DO WHILE(i <= nedge_tmp)
719 nedge = nedge+1
720 kold = index(i)
721 ledge_tmp1(1:nledge,nedge)=ledge_tmp2(1:nledge,kold)
722
723 fin = 0
724 DO WHILE (fin == 0 .AND. i < nedge_tmp)
725 i = i+1
726 k = index(i)
727 IF(clef(1,k)/=clef(1,kold).OR.
728 . clef(2,k)/=clef(2,kold).OR.
729 . clef(3,k)/=clef(3,kold).OR.
730 . clef(4,k)/=clef(4,kold))THEN
731 fin=1
732 END IF
733 kold=k
734 END DO
735
736 IF(i==nedge_tmp .AND. fin==0) i=i+1
737
738 END DO
739
740
741 nedge_tmp = nedge
742 nedge = 0
743
744 sol_edge =iedge/10
745 sh_edge =iedge-10*sol_edge
746
747 DO i=1,nedge_tmp
748
749
750
751
752
753
754
755
756
757
758
759 istore=0
760 IF(ledge_tmp1(7,i)==1)THEN
761 IF(sol_edge==1.OR.sol_edge==3)THEN
762
763 na =ledge_tmp1(1,i)
764 ea =ledge_tmp1(2,i)
765 nb =ledge_tmp1(3,i)
766 eb =ledge_tmp1(4,i)
767
768 IF(na==0 .OR. nb==0) THEN
769 print *,' internal error - i25neigh'
770 END IF
771
772 ix1 =irect(1,na)
773 ix2 =irect(2,na)
774 ix3 =irect(3,na)
775 ix4 =irect(4,na)
776
777 xa1=x(1,ix1)
778 ya1=x(2,ix1)
779 za1=x(3,ix1)
780 xa2=x(1,ix2)
781 ya2=x(2,ix2)
782 za2=x(3,ix2)
783 xa3=x(1,ix3)
784 ya3=x(2,ix3)
785 za3=x(3,ix3)
786 xa4=x(1,ix4)
787 ya4=x(2,ix4)
788 za4=x(3,ix4)
789
790 x01 = xa3 - xa1
791 y01 = ya3 - ya1
792 z01 = za3 - za1
793
794 x02 = xa4 - xa2
795 y02 = ya4 - ya2
796 z02 = za4 - za2
797
798 xna = y01*z02 - z01*y02
799 yna = z01*x02 - x01*z02
800 zna = x01*y02 - y01*x02
801
802 aaa=one/
max(em30,sqrt(xna*xna+yna*yna+zna*zna))
803 xna = -xna*aaa
804 yna = -yna*aaa
805 zna = -zna*aaa
806
807 jx1 =irect(1,nb)
808 jx2 =irect(2,nb)
809 jx3 =irect(3,nb)
810 jx4 =irect(4,nb)
811
812 xb1=x(1,jx1)
813 yb1=x(2,jx1)
814 zb1=x(3,jx1)
815 xb2=x(1,jx2)
816 yb2=x(2,jx2)
817 zb2=x(3,jx2)
818 xb3=x(1,jx3)
819 yb3=x(2,jx3)
820 zb3=x(3,jx3)
821 xb4=x(1,jx4)
822 yb4=x(2,jx4)
823 zb4=x(3,jx4)
824
825 x01 = xb3 - xb1
826 y01 = yb3 - yb1
827 z01 = zb3 - zb1
828
829 x02 = xb4 - xb2
830 y02 = yb4 - yb2
831 z02 = zb4 - zb2
832
833 xnb = y01*z02 - z01*y02
834 ynb = z01*x02 - x01*z02
835 znb = x01*y02 - y01*x02
836
837 bbb=one/
max(em30,sqrt(xnb*xnb+ynb*ynb+znb*znb))
838 xnb = -xnb*bbb
839 ynb = -ynb*bbb
840 znb = -znb*bbb
841
842 ang = xna*xnb+yna*ynb+zna*znb
843 IF (ang < edg_cos) THEN
844 istore=1
845 ELSEIF(sol_edge==1)THEN
846 ledge_tmp1(7,i)=-1
847 istore=1
848 END IF
849 ELSEIF(sol_edge==2)THEN
850 istore=1
851 END IF
852 ELSEIF(sh_edge/=0)THEN
853 istore=1
854 END IF
855
856
857 IF(istore==1)THEN
858 nedge = nedge+1
859 ledge(1:nledge,nedge)=ledge_tmp1(1:nledge,i)
860 END IF
861
862 END DO
863
864 DEALLOCATE(clef,index,ledge_tmp1,ledge_tmp2)
865
866
867
868
869
870
871
872
873
874
875
876
877 IF(nedge/=0 .AND. ilev==2)THEN
878 ebinflg(1:nedge)=0
879 DO i=1,nedge
880 ne =ledge(1,i)
881 inflg=mbinflg(ne)
884 IF(ims1/=0) ebinflg(i)=
bitset(ebinflg(i),0)
885 IF(ims2/=0) ebinflg(i)=
bitset(ebinflg(i),1)
886 ne=ledge(3,i)
887 IF(ne/=0)THEN
888 inflg=mbinflg(ne)
891 IF(ims1/=0) ebinflg(i)=
bitset(ebinflg(i),0)
892 IF(ims2/=0) ebinflg(i)=
bitset(ebinflg(i),1)
893 END IF
894 END DO
895 END IF
896
897 IF(nedge/=0.AND.nisub/=0)THEN
898
899 ALLOCATE (mloc(numnod),kad(
max(nmn,nedge)),stat=stat)
900 mloc(1:numnod)=0
901 DO i=1,nmn
902 n = msr(i)
903 mloc(n) = i
904 END DO
905
906 ALLOCATE(addsubn_tmp(nmn+1), addsubn(nmn+1))
907
908
909
910 addsubn_tmp(1:nmn+1)=0
911 DO i=1,nrtm
912 DO j=1,4
913 IF(.NOT.(j==3.AND.irect(3,i)==irect(4,i)))THEN
914 n = mloc(irect(j,i))
915 addsubn_tmp(n)=addsubn_tmp(n)+addsubm(i+1)-addsubm(i)
916 END IF
917 END DO
918 END DO
919
920 cur=1
921 DO n=1,nmn
922 next = cur+addsubn_tmp(n)
923 addsubn_tmp(n) = cur
924 cur = next
925 END DO
926 addsubn_tmp(1+nmn)=cur
927
928 nisubn=addsubn_tmp(1+nmn)-1
929 ALLOCATE (lisubn(nisubn),inflg_subn(nisubn),stat=stat)
930 inflg_subn(1:nisubn)=0
931
932
933 DO n=1,nmn
934 kad(n)=addsubn_tmp(n)
935 END DO
936 DO i=1,nrtm
937 DO j=1,4
938 IF(.NOT.(j==3.AND.irect(3,i)==irect(4,i)))THEN
939 n = mloc(irect(j,i))
940 DO kk=addsubm(i),addsubm(i+1)-1
941 lisubn(kad(n)) =lisubm(kk)
942 inflg_subn(kad(n))=inflg_subm(kk)
943 kad(n)=kad(n)+1
944 END DO
945 END IF
946 END DO
947 END DO
948
949
950
951 maxadd = 0
952 DO n=1,nmn
953 maxadd=
max(maxadd,addsubn_tmp(n+1)-addsubn_tmp(n))
954 END DO
955 ALLOCATE(ixsub(2*maxadd),stat=stat)
956
957 DO n=1,nmn
958 kad(n)=addsubn_tmp(n)
959 END DO
960
961 DO n=1,nmn
962 DO ll = 1,addsubn_tmp(n+1)-addsubn_tmp(n)
963 ixsub(ll) = ll
964 ENDDO
965
966
967 IF(addsubn_tmp(n+1)-addsubn_tmp(n) > 1 .AND. addsubn_tmp(n) <=nisubn ) THEN
968 CALL my_orders(0,work,lisubn(addsubn_tmp(n)),ixsub,addsubn_tmp(n+1)-addsubn_tmp(n),1)
969 ENDIF
970
971 cur =0
972 DO ll=addsubn_tmp(n),addsubn_tmp(n+1)-1
973 kk = addsubn_tmp(n)-1+ixsub(ll-addsubn_tmp(n)+1)
974
975 IF(lisubn(kk)/=cur)THEN
976
977
978 inflg=inflg_subn(kk)
980 IF(ims1/=0) inflg_subn(kad(n))=
981 .
bitset(inflg_subn(kad(n)),0)
983 IF(ims2/=0) inflg_subn(kad(n))=
984 .
bitset(inflg_subn(kad(n)),1)
985
986 cur = lisubn(kk)
987 lisubn(kad(n))=cur
988 kad(n)=kad(n)+1
989 ELSE
990
991
992 inflg=inflg_subn(kk)
994 IF(ims1/=0) inflg_subn(kad(n)-1)=
995 .
bitset(inflg_subn(kad(n)-1),0)
997 IF(ims2/=0) inflg_subn(kad(n)-1)=
998 .
bitset(inflg_subn(kad(n)-1),1)
999 END IF
1000 END DO
1001
1002 addsubn(n)=kad(n)-addsubn_tmp(n)
1003 END DO
1004
1005 cur=1
1006 DO n=1,nmn
1007 next = cur+addsubn(n)
1008 addsubn(n) = cur
1009 cur = next
1010 END DO
1011 addsubn(1+nmn)=cur
1012
1013 DO n=1,nmn
1014 DO kk=addsubn(n),addsubn(n+1)-1
1015 lisubn(kk) =lisubn(addsubn_tmp(n)+kk-addsubn(n))
1016 inflg_subn(kk)=inflg_subn(addsubn_tmp(n)+kk-addsubn(n))
1017 END DO
1018 END DO
1019
1020
1021
1022 addsube(1:nedge+1) = 0
1023 inflg_sube(1:nisube)=0
1024
1025 DO ne=1,nedge
1026 i1 =mloc(ledge(5,ne))
1027 i2 =mloc(ledge(6,ne))
1028
1029 ll =addsubn(i1)
1030 kk =addsubn(i2)
1031 DO WHILE(ll<addsubn(i1+1))
1032 jsub=lisubn(ll)
1033 DO WHILE(kk<addsubn(i2+1))
1034 ksub=lisubn(kk)
1035 IF(ksub==jsub)THEN
1036 addsube(ne)=addsube(ne)+1
1037 kk=kk+1
1038 ELSE IF(ksub<jsub)THEN
1039 kk=kk+1
1040 ELSE
1041 GO TO 100
1042 END IF
1043 END DO
1044 100 CONTINUE
1045 ll=ll+1
1046 END DO
1047 END DO
1048
1049 cur=1
1050 DO ne=1,nedge
1051 next = cur+addsube(ne)
1052 addsube(ne)= cur
1053 cur = next
1054 END DO
1055 addsube(1+nedge)=cur
1056
1057
1058 DO ne=1,nedge
1059 kad(ne)=addsube(ne)
1060 END DO
1061
1062 DO ne=1,nedge
1063 i1 =mloc(ledge(5,ne))
1064 i2 =mloc(ledge(6,ne))
1065
1066 ll =addsubn(i1)
1067 kk =addsubn(i2)
1068 DO WHILE(ll<addsubn(i1+1))
1069 jsub=lisubn(ll)
1070 ims1 =
bitget(inflg_subn(ll),0)
1071 ims2 =
bitget(inflg_subn(ll),1)
1072 DO WHILE(kk<addsubn(i2+1))
1073 ksub=lisubn(kk)
1074 ims3 =
bitget(inflg_subn(kk),0)
1075 ims4 =
bitget(inflg_subn(kk),1)
1076 IF(ksub==jsub)THEN
1077 lisube(kad(ne))=jsub
1078 IF(ims1==1.AND.ims3==1)
1079 . inflg_sube(kad(ne))=
1080 .
bitset(inflg_sube(kad(ne)),0)
1081 IF(ims2==1.AND.ims4==1)
1082 . inflg_sube(kad(ne))=
1083 .
bitset(inflg_sube(kad(ne)),1)
1084 kad(ne) =kad(ne)+1
1085 kk=kk+1
1086 ELSE IF(ksub<jsub)THEN
1087 kk=kk+1
1088 ELSE
1089 GO TO 200
1090 END IF
1091 END DO
1092 200 CONTINUE
1093 ll=ll+1
1094 END DO
1095 END DO
1096
1097 DEALLOCATE (mloc,kad,addsubn_tmp,addsubn,lisubn,inflg_subn,ixsub)
1098
1099 IF(ipri>=6) THEN
1100 WRITE(iout,1000)
1101 WRITE(iout,1010)noint
1102 WRITE(iout,'(10I10)')
1103 . (nom_opt(1,ninter+lisub(jsub)),jsub=1,nisub)
1104 WRITE(iout,1030)
1105 DO ne=1,nedge
1106 jsub=addsube(ne)
1107 n =addsube(ne+1)-addsube(ne)
1108 IF(n>0)THEN
1109 WRITE(iout,'(3I10)')ne,itab(ledge(5,ne)),itab(ledge(6,ne))
1110 WRITE(iout,'(30X,2I10)')
1111 . (lisube(jsub-1+k),inflg_sube(jsub-1+k),k=1,n)
1112 END IF
1113 END DO
1114 END IF
1115 END IF
1116
1117 1000 FORMAT( /1x,' STRUCTURE OF SUB-INTERFACES OUTPUT TO TH'/
1118 . 1x,' ----------------------------------------'// )
1119 1010 FORMAT( /1x,' INTERFACE ID . . . . . . . . . . . . . .',i10/,
1120 . ' -> LIST OF SUB-INTERFACES IDS : ')
1121 1030 FORMAT(/,' EDGE NODE 1 NODE 2'/
1122 . ' NUMBER ID ID'/
1123 . ' -> LIST OF SUB-INTERFACES (LOCAL NUMBERS IN INTERFACE)'/)
1124
1125 RETURN
integer function bitget(i, n)
integer function bitset(i, n)
subroutine i25neigh_msg_err(i1, i2, itab, irr)
subroutine i25neigh_seg_e(n1, ied1, n2, ied2, n, ic, iself, i1, i2, irect, nrtm, msegtyp, mvoisin)
subroutine i25neigh_seg_en(n1, ied1, n2, ied2, mvoisin, ne, ice, iself, i1, i2, irect, x, ie, nrtm, msegtyp, irr)
void my_orders(int *mode, int *iwork, int *data, int *index, int *n, int *irecl)
integer, parameter nchartitle