5 &(ifabor,nelem,nelmax,ielm,ikle,sizikl,npoin,nbor,nptfr,
6 & lihbor,klog,indpu,iklestr,neleb2)
72 INTEGER,
INTENT(IN) :: IELM,NPTFR,NELEM,NELMAX,NPOIN,SIZIKL,KLOG
73 INTEGER,
INTENT(IN) :: NBOR(nptfr)
74 INTEGER,
INTENT(INOUT):: IFABOR(nelmax,4)
75 INTEGER,
INTENT(IN) :: IKLE(sizikl,4),LIHBOR(*)
76 INTEGER,
INTENT(IN) :: INDPU(*)
77 INTEGER,
INTENT(IN) :: NELEB2
78 INTEGER,
INTENT(IN) :: IKLESTR(neleb2,3)
87 INTEGER,
DIMENSION(: ),
ALLOCATABLE :: NBOR_INV
90 INTEGER,
DIMENSION(:),
ALLOCATABLE :: NVOIS
93 INTEGER,
DIMENSION(: ),
ALLOCATABLE :: NEIGH
94 INTEGER,
DIMENSION(:,:),
ALLOCATABLE :: IKLE_TRI
95 INTEGER,
DIMENSION(:,:),
ALLOCATABLE :: VOIS_TRI
98 INTEGER,
DIMENSION(NPOIN) :: IADR
123 INTEGER :: I1, I2, I3
124 INTEGER :: M1, M2, M3
128 INTEGER :: IR4,IR5,IR6,COMPT
134 INTEGER :: SOMFAC(3,4)
135 parameter( somfac = reshape( (/
136 & 1,2,3 , 4,1,2 , 2,3,4 , 3,4,1 /), shape=(/ 3,4 /) ) )
145 IF(ielm.EQ.31.OR.ielm.EQ.51)
THEN 149 99
FORMAT(1x,
'VOISIN31: IELM=',1i6,
' TYPE OF ELEMENT NOT AVAILABLE')
156 ALLOCATE(nbor_inv(npoin),stat=err)
157 CALL check_allocate(err,
'VOISIN31:NBOR_INV')
161 ALLOCATE(nvois(npoin),stat=err)
162 CALL check_allocate(err,
'VOISIN31:NVOIS')
184 ipoin = ikle( ielem , inoeud )
186 nvois(ipoin) = nvois(ipoin) + 1
215 nmxvoisin = max(nmxvoisin,nv)
220 imax = iadr(npoin) + nvois(npoin)
223 ALLOCATE(neigh(imax),stat=err)
224 IF(err.NE.0)
GOTO 999
243 ipoin = ikle( ielem , inoeud )
245 nv = nvois(ipoin) + 1
248 neigh(iadr(ipoin)+nv) = ielem
292 nbtri = nmxvoisin * 3
294 ALLOCATE(ikle_tri(nbtri,3),stat=err)
295 IF(err.NE.0)
GOTO 999
296 ALLOCATE(vois_tri(nbtri,2),stat=err)
297 IF(err.NE.0)
GOTO 999
323 ielem = neigh(adr+ivois)
329 IF ( ifabor(ielem,iface) .LE. 0 )
THEN 332 i1 = ikle(ielem,somfac(1,iface))
333 i2 = ikle(ielem,somfac(2,iface))
334 i3 = ikle(ielem,somfac(3,iface))
338 m1 = max(i1,(max(i2,i3)))
339 m3 = min(i1,(min(i2,i3)))
349 IF ( ikle_tri(itri,1) .EQ. m1 )
THEN 350 IF ( ikle_tri(itri,2) .EQ. m2 .AND.
351 & ikle_tri(itri,3) .EQ. m3 )
THEN 356 ielem2 = vois_tri(itri,1)
357 iface2 = vois_tri(itri,2)
358 IF ( ielem2 .EQ. ielem )
THEN 360 909
FORMAT(1x,
'VOISIN: IELM=',1i6,
', 361 & NEIGHBOUR PROBLEM')
366 IF ( ielem2 .EQ. 0 .OR.
367 & iface2 .EQ. 0 )
THEN 368 WRITE(
lu,919) ielem2,iface2
369 919
FORMAT(1x,
'VOISIN31:UNDEFINED TRIANGLE, 370 & IELEM=',1i6,
'IFACE=',1i6)
376 ifabor(ielem ,iface ) = ielem2
377 ifabor(ielem2,iface2) = ielem
384 IF ( .NOT. found)
THEN 386 ikle_tri(nbtri,1) = m1
387 ikle_tri(nbtri,2) = m2
388 ikle_tri(nbtri,3) = m3
389 vois_tri(nbtri,1) = ielem
390 vois_tri(nbtri,2) = iface
419 i1=ikle(ielem,somfac(1,iface))
420 i2=ikle(ielem,somfac(2,iface))
421 i3=ikle(ielem,somfac(3,iface))
423 IF( indpu(i1).NE.0.AND.
424 & indpu(i2).NE.0.AND.
425 & indpu(i3).NE.0 ) ifabor(ielem,iface)=-2
430 ELSE IF (ielm.EQ.31)
THEN 445 IF (ifabor(ielem,iface).EQ.-1)
THEN 447 i1=ikle(ielem,somfac(1,iface))
448 i2=ikle(ielem,somfac(2,iface))
449 i3=ikle(ielem,somfac(3,iface))
451 IF ( indpu(i1).NE.0.AND.
452 & indpu(i2).NE.0.AND.
453 & indpu(i3).NE.0 )
THEN 466 IF (i1.EQ.nbor(j)) ir5=1
467 IF (i2.EQ.nbor(j)) ir4=1
468 IF (i3.EQ.nbor(j)) ir6=1
472 IF (ir5.EQ.1.AND.ir4.EQ.1.AND.ir6.EQ.1)
THEN 478 IF (iklestr(j,i)==i1) compt=compt+1
479 IF (iklestr(j,i)==i2) compt=compt+10
480 IF (iklestr(j,i)==i3) compt=compt+100
493 ifabor(ielem,iface)=-2
510 IF((ielm.EQ.51).OR.(ielm.EQ.31))
GO TO 1000
525 nbor_inv(nbor(k)) = k
533 IF(ifabor(ielem,iface).EQ.-1)
THEN 539 i1 = ikle( ielem , somfac(1,iface) )
540 i2 = ikle( ielem , somfac(2,iface) )
541 i3 = ikle( ielem , somfac(3,iface) )
546 IF(lihbor(nbor_inv(i1)).NE.klog.AND.lihbor(nbor_inv(i2)).NE.klog
547 & .AND.lihbor(nbor_inv(i3)).NE.klog )
THEN 549 ifabor(ielem,iface)=0
567 999
WRITE(
lu,2000) err
568 2000
FORMAT(1x,
'VOISIN31: ERROR DURING ALLOCATION OF MEMORY: ',/,1x,
569 &
'ERROR CODE: ',1i6)
subroutine voisin31(IFABOR, NELEM, NELMAX, IELM, IKLE, SIZIKL, NPOIN, NBOR, NPTFR, LIHBOR, KLOG, INDPU, IKLESTR, NELEB2)