36 SUBROUTINE i25neigh(NRTM ,NSN ,NSV ,IRECT ,IRTLM,
37 2 MVOISIN,EVOISIN ,MSEGLO ,MSEGTYP,ITAB ,
38 3 X ,ID ,TITR ,IGEO ,NADMSR ,
39 4 ADMSR ,ADSKYN ,IADNOR ,NRTM_SH,IEDGE ,
40 5 NEDGE ,LEDGE ,LBOUND ,EDG_COS,NISUB ,
41 6 LISUB ,ADDSUBM,LISUBM ,INFLG_SUBM ,NISUBE,
42 7 ADDSUBE,LISUBE ,INFLG_SUBE,NOINT,NMN,MSR,
43 8 NOM_OPT,ILEV ,MBINFLG ,EBINFLG,IELEM_M,
54#include "implicit_f.inc"
66 INTEGER ,NSN,NMN,NSV(*),IRECT(4,NRTM),MVOISIN(4,NRTM),EVOISIN(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, , LEDGE(NLEDGE,*),
71 . NISUB, LISUB(*), ADDSUBM(*), LISUBM(*), INFLG_SUBM(*),
72 . , ADDSUBE(*), LISUBE(*), INFLG_SUBE(*), MSR(*),
73 . ILEV, MBINFLG(*), EBINFLG(*)
74 INTEGER NOINT, NOM_OPT(LNOPT1,*)
78 CHARACTER(LEN=NCHARTITLE) :: TITR
79 INTEGER ,
INTENT(IN) ::
80 INTEGER ,
INTENT(IN) :: (2,NRTM)
84 INTEGER I,J,K,L,IW,I1,I2,I3,I4,M,N,NMAX,E_MAX,E_ID,N_EI
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,
94 . NA, NB, EA, EB,JM,MJ,DN_EI
95 INTEGER,
DIMENSION(:),
ALLOCATABLE :: MVOI
96 INTEGER,
DIMENSION(:,:),
ALLOCATABLE :: EIDNOD
104 . x01,y01,z01,x02,y02,z02,
105 . xna, yna, zna, xnb, ynb, znb, aaa, bbb, ang
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 . LISUBN,INFLG_SUBN,IXSUB
111 INTEGER,
DIMENSION(:,:,:),
ALLOCATABLE :: MNEIGH_SOLID
121 CALL my_alloc(itag,numnod)
122 CALL my_alloc(ntag,4*nrtm)
123 CALL my_alloc(root,4*nrtm)
139 IF(ielem_m(2,i) == 0)
THEN
145 IF (irect(4,i)/=irect(3,i))
THEN
155 nmax=
max(nmax,itag(i))
158 ALLOCATE(mvoi(nmax+10),eidnod(nmax,numnod))
160 eidnod(1:nmax,1:numnod)=0
163 IF(ielem_m(2,i) == 0)
THEN
170 IF (irect(4,i)/=irect(3,i))
THEN
186 IF(ielem_m(2,i) == 0)
THEN
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 )
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 )
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 )
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 )
228 IF(mvoisin(k,l)==i)
GOTO 120
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)
239 DEALLOCATE(mvoi,eidnod)
246 IF(idel_solid > 0)
THEN
251 IF(ielem_m(1,i) <= numels)
THEN
257 IF (irect(4,i)/=irect(3,i))
THEN
266 nmax=
max(nmax,itag(i))
269 ALLOCATE(eidnod(nmax,numnod))
270 eidnod(1:nmax,1:numnod)=0
271 ALLOCATE(mvoi(nmax+10))
274 ALLOCATE(mneigh_solid(nmax,4,nrtm))
275 mneigh_solid(1:nmax,1:4,1:nrtm) = 0
277 IF(ielem_m(1,i) <= numels)
THEN
284 IF (irect(4,i)/=irect(3,i))
THEN
295 IF(ielem_m(1,i) <= numels)
THEN
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)
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)
310 mneigh_solid(1:dn_ei,2,i) = mvoi(ne0+1:n_ei)
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)
318 mneigh_solid(1:dn_ei,3,i) = mvoi(ne0+1:n_ei)
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)
326 mneigh_solid(1:dn_ei,4,i) = mvoi(ne0+1:n_ei)
332 DEALLOCATE(mvoi,eidnod)
347 IF(irect(4,i)/=irect(3,i))
THEN
352 admsr(4,i)=admsr(3,i)
362 IF(ii(4)==ii(3).AND.iedg==3) cycle
369 jj(1:4)=irect(1:4,mi)
374 IF(jj(4)==jj(3).AND.jedg==3) cycle
378 IF(ii(i2)==jj(j1).AND.ii(i1)==jj(j2))
THEN
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
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
392 ELSEIF(ii(i1)==jj(j1).AND.ii(i2)==jj(j2))
THEN
393 print *,
'i25inisu_nei - internal error : non-consistent neighboring segment'
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))
404 IF(ielem_m(1,i) <= numels.AND.idel_solid > 0)
THEN
406 mj = mneigh_solid(k,iedg,i)
407 IF(mj/=0.AND.mj/=mi)
THEN
409 jj(1:4)=irect(1:4,mj)
414 IF(jj(4)==jj(3).AND.jedg==3) cycle
418 IF(ii(i2)==jj(j1).AND.ii(i1)==jj(j2))
THEN
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
424 ivertx=
min(root(admsr(i2,i)),root(admsr(j1,mj)))
426 IF(jvertx/=ivertx) root(jvertx)=ivertx
448 IF(idel_solid > 0)
DEALLOCATE(mneigh_solid)
452 DO WHILE(root(j) < j)
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))
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
495 adskyn(n+1) = adskyn(n)+ntag(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
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
526 adskyn(n+1) = adskyn(n)+ntag(n)
529 DEALLOCATE(ntag,root)
558 ALLOCATE(ledge_tmp1(nledge,4*nrtm))
561 IF(ielem_m(2,i) == 0)
THEN
573 i2=irect(mod(j,4)+1,i)
582 IF(kbase > nrtm)kbase=kbase-nrtm
586 IF(kbase < ibase)
THEN
588 IF(.NOT.(i1==i2.AND.j==3))
THEN
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
599 ledge_tmp1(5,nedge)=i2
600 ledge_tmp1(6,nedge)=i1
604 IF(msegtyp(i)==0.AND.msegtyp(k)==0)
THEN
605 ledge_tmp1(7,nedge)=1
607 ledge_tmp1(7,nedge)=2
610 ledge_tmp1(7,nedge)=2
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
621 IF(ledge_tmp1(4,nedge)==0)
THEN
623 .
'i25inisu_nei - internal error : could not find the edge on neighboring element'
633 IF(.NOT.(i1==i2.AND.j==3))
THEN
636 lbound(admsr(mod(j,4)+1,i))=1
675 ALLOCATE(clef(4,nedge),ledge_tmp2(nledge,nedge),index(2*nedge))
688 IF(ibase > nrtm)ibase=ibase-nrtm
698 IF(kbase > nrtm)kbase=kbase-nrtm
710 CALL my_orders(0,work,clef,index,nedge,4)
713 ledge_tmp2(1:nledge,1:nedge)=ledge_tmp1(1:nledge,1:nedge)
718 DO WHILE(i <= nedge_tmp)
721 ledge_tmp1(1:nledge,nedge)=ledge_tmp2(1:nledge,kold)
724 DO WHILE (fin == 0 .AND. i < nedge_tmp)
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
736 IF(i==nedge_tmp .AND. fin==0) i=i+1
745 sh_edge =iedge-10*sol_edge
760 IF(ledge_tmp1(7,i)==1)
THEN
761 IF(sol_edge==1.OR.sol_edge==3)
THEN
768 IF(na==0 .OR. nb==0)
THEN
769 print *,
' internal error - i25neigh'
798 xna = y01*z02 - z01*y02
799 yna = z01*x02 - x01*z02
800 zna = x01*y02 - y01*x02
802 aaa=one/
max(em30,sqrt(xna*xna+yna*yna+zna*zna))
833 xnb = y01*z02 - z01*y02
834 ynb = z01*x02 - x01*z02
835 znb = x01*y02 - y01*x02
837 bbb=one/
max(em30,sqrt(xnb*xnb+ynb*ynb+znb*znb))
842 ang = xna*xnb+yna*ynb+zna*znb
843 IF (ang < edg_cos)
THEN
845 ELSEIF(sol_edge==1)
THEN
849 ELSEIF(sol_edge==2)
THEN
852 ELSEIF(sh_edge/=0)
THEN
859 ledge(1:nledge,nedge)=ledge_tmp1(1:nledge,i)
864 DEALLOCATE(clef,index,ledge_tmp1,ledge_tmp2)
884 IF(ims1/=0) ebinflg(i)=
bitset(ebinflg(i),0)
885 IF(ims2/=0) ebinflg(i)=
bitset(ebinflg(i),1)
891 IF(ims1/=0) ebinflg(i)=
bitset(ebinflg(i),0)
892 IF(ims2/=0) ebinflg(i)=
bitset(ebinflg(i),1)
897 IF(nedge/=0.AND.nisub/=0)
THEN
899 ALLOCATE (mloc(numnod),kad(
max(nmn,nedge)),stat=stat)
906 ALLOCATE(addsubn_tmp(nmn+1), addsubn(nmn+1))
910 addsubn_tmp(1:nmn+1)=0
913 IF(.NOT.(j==3.AND.irect(3,i)==irect(4,i)))
THEN
915 addsubn_tmp(n)=addsubn_tmp(n)+addsubm(i+1)-addsubm(i)
922 next = cur+addsubn_tmp(n)
926 addsubn_tmp(1+nmn)=cur
928 nisubn=addsubn_tmp(1+nmn)-1
929 ALLOCATE (lisubn(nisubn),inflg_subn(nisubn),stat=stat)
930 inflg_subn(1:nisubn)=0
934 kad(n)=addsubn_tmp(n)
938 IF(.NOT.(j==3.AND.irect(3,i)==irect(4,i)))
THEN
940 DO kk=addsubm(i),addsubm(i+1)-1
941 lisubn(kad(n)) =lisubm(kk)
942 inflg_subn(kad(n))=inflg_subm(kk)
953 maxadd=
max(maxadd,addsubn_tmp(n+1)-addsubn_tmp(n))
955 ALLOCATE(ixsub(2*maxadd),stat=stat)
958 kad(n)=addsubn_tmp(n)
962 DO ll = 1,addsubn_tmp(n+1)-addsubn_tmp(n)
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)
972 DO ll=addsubn_tmp(n),addsubn_tmp(n+1)-1
973 kk = addsubn_tmp(n)-1+ixsub(ll-addsubn_tmp(n)+1)
975 IF(lisubn(kk)/=cur)
THEN
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)
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)
1002 addsubn(n)=kad(n)-addsubn_tmp(n)
1007 next = cur+addsubn(n)
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))
1022 addsube(1:nedge+1) = 0
1023 inflg_sube(1:nisube)=0
1026 i1 =mloc(ledge(5,ne))
1027 i2 =mloc(ledge(6,ne))
1031 DO WHILE(ll<addsubn(i1+1))
1033 DO WHILE(kk<addsubn(i2+1))
1036 addsube(ne)=addsube(ne)+1
1038 ELSE IF(ksub<jsub)
THEN
1051 next = cur+addsube(ne)
1055 addsube(1+nedge)=cur
1063 i1 =mloc(ledge(5,ne))
1064 i2 =mloc(ledge(6,ne))
1068 DO WHILE(ll<addsubn(i1+1))
1070 ims1 = bitget(inflg_subn(ll),0)
1071 ims2 = bitget(inflg_subn(ll),1)
1072 DO WHILE(kk<addsubn(i2+1))
1074 ims3 = bitget(inflg_subn(kk),0)
1075 ims4 = bitget(inflg_subn(kk),1)
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)
1086 ELSE IF(ksub<jsub)
THEN
1097 DEALLOCATE (mloc,kad,addsubn_tmp,addsubn,lisubn,inflg_subn,ixsub)
1101 WRITE(iout,1010)noint
1102 WRITE(iout,
'(10I10)')
1103 . (nom_opt(1,ninter+lisub(jsub)),jsub=1,nisub)
1107 n =addsube(ne+1)-addsube(ne)
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)
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'/
1123 .
' -> LIST OF SUB-INTERFACES (LOCAL NUMBERS IN INTERFACE)'/)