summaryrefslogtreecommitdiff
path: root/Trivac/src/BIVSBH.f
diff options
context:
space:
mode:
Diffstat (limited to 'Trivac/src/BIVSBH.f')
-rwxr-xr-xTrivac/src/BIVSBH.f489
1 files changed, 489 insertions, 0 deletions
diff --git a/Trivac/src/BIVSBH.f b/Trivac/src/BIVSBH.f
new file mode 100755
index 0000000..df95d2d
--- /dev/null
+++ b/Trivac/src/BIVSBH.f
@@ -0,0 +1,489 @@
+*DECK BIVSBH
+ SUBROUTINE BIVSBH (MAXEV,MAXKN,IMPX,ISPLH,LX,SIDE,LL4,IHEX,NCODE,
+ 1 MAT,VOL,KN,QFR)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Numbering of an hexagonal 2-D geometry with or without triangular
+* mesh-splitting.
+*
+*Copyright:
+* Copyright (C) 2002 Ecole Polytechnique de Montreal
+* This library is free software; you can redistribute it and/or
+* modify it under the terms of the GNU Lesser General Public
+* License as published by the Free Software Foundation; either
+* version 2.1 of the License, or (at your option) any later version
+*
+*Author(s): A. Hebert
+*
+*Parameters: input
+* MAXEV dimension for array IGAR:
+* if ISPLH=1: number of hexagons;
+* if ISPLH>1: (6*(ISPLH-1)**2)*LX where LX is the number of
+* hexagons.
+* MAXKN dimension for arrays KN and QFR.
+* IMPX print parameter.
+* ISPLH type of hexagonal mesh-splitting:
+* =1: no mesh splitting (complete hexagons);
+* =K: 6*(K-1)*(K-1) triangles per hexagon.
+* LX number of hexagons.
+* SIDE side of an hexagon.
+* NCODE type of boundary condition applied on each side
+* (i=1: X- i=2: X+ i=3: Y- i=4: Y+):
+* NCODE(I)=1: VOID; NCODE(I)=2: REFL; NCODE(I)=5: SYME;
+* NCODE(I)=7: ZERO.
+* MAT mixture index assigned to each hexagon.
+* IHEX type of hexagonal boundary condition.
+*
+*Parameters: output
+* LL4 number of elements after mesh-splitting.
+* VOL volume of each hexagon.
+* KN element-ordered unknown list.
+* QFR element-ordered external surfaces: =1.0 on external surfaces;
+* =0.0 on internal surfaces.
+*
+*-----------------------------------------------------------------------
+*
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ INTEGER MAXEV,MAXKN,IMPX,ISPLH,LX,LL4,IHEX,NCODE(6),MAT(LX),
+ 1 KN(MAXKN)
+ REAL SIDE,VOL(LX),QFR(7*LX)
+*----
+* LOCAL VARIABLES
+*----
+ INTEGER KK(6)
+ CHARACTER HSMG*131
+ LOGICAL LOGSUR
+ INTEGER, DIMENSION(:), ALLOCATABLE :: IGAR,KN2
+ REAL, DIMENSION(:), ALLOCATABLE :: QFR2
+*----
+* SCRATCH STORAGE ALLOCATION
+*----
+ ALLOCATE(IGAR(MAXEV),KN2(MAXKN),QFR2(MAXKN))
+*
+ IF(LX.GT.MAXEV) THEN
+ WRITE(HSMG,'(30HBIVSBH: 1 INSUFFICIENT MAXEV (,I7,7H). SHOU,
+ 1 18HLD BE INCREASED TO,I7,1H.)') MAXEV,LX
+ CALL XABORT(HSMG)
+ ENDIF
+ LL4=0
+ DO 10 KX=1,LX
+ IGAR(KX)=0
+ IF(MAT(KX).LE.0) GO TO 10
+ LL4=LL4+1
+ IGAR(KX)=LL4
+ 10 CONTINUE
+ NSURF=6
+ NUM1=0
+ DO 30 KX=1,LX
+ VOL(KX)=0.0
+ IF(MAT(KX).LE.0) GO TO 30
+ IF(NUM1+7.GT.MAXKN) THEN
+ WRITE(HSMG,'(30HBIVSBH: 1 INSUFFICIENT MAXKN (,I7,2H).)') MAXKN
+ CALL XABORT(HSMG)
+ ENDIF
+ LOGSUR=(NCODE(1).EQ.1).OR.(NCODE(1).EQ.7)
+ DO 20 IX=1,6
+ N1=NEIGHB(KX,IX,IHEX,LX,POIDS)
+ IF(N1.EQ.0) CALL XABORT('BIVSBH: NEIGHB FAILURE.')
+ QFR(NUM1+IX)=0.0
+ IF(ABS(N1).GT.LX) THEN
+ IF(LOGSUR) QFR(NUM1+IX)=1.0
+ KN(NUM1+IX)=SIGN(LX+1,N1)
+ ELSE IF(MAT(ABS(N1)).LE.0) THEN
+ IF(LOGSUR) QFR(NUM1+IX)=1.0
+ KN(NUM1+IX)=SIGN(LX+1,N1)
+ IF((IHEX.EQ.5).OR.(IHEX.EQ.6)) KN(NUM1+IX)=LX+1
+ ELSE
+ KN(NUM1+IX)=SIGN(IGAR(ABS(N1)),N1)
+ ENDIF
+ 20 CONTINUE
+ KN(NUM1+7)=KX
+ VOL(KX)=2.59807587*SIDE*SIDE*POIDS
+ QFR(NUM1+7)=VOL(KX)
+ NUM1=NUM1+7
+ 30 CONTINUE
+ MAXMAX=LX
+ IF(IMPX.GT.4) THEN
+ WRITE(6,510) 1
+ NUM1=0
+ DO 40 I=1,LL4
+ WRITE(6,520) I,KN(NUM1+7),(KN(NUM1+J),J=1,6),(QFR(NUM1+J),
+ 1 J=1,7)
+ NUM1=NUM1+7
+ 40 CONTINUE
+ ENDIF
+ IF(ISPLH.GE.2) THEN
+* HEXAGON TO TRIANGLE.
+ NSURF=3
+ IF(LL4*24.GT.MAXKN) THEN
+ WRITE(HSMG,'(30HBIVSBH: 2 INSUFFICIENT MAXKN (,I7,7H). SHOU,
+ 1 18HLD BE INCREASED TO,I7,1H.)') MAXKN,LL4*24
+ CALL XABORT(HSMG)
+ ENDIF
+ NUM1=0
+ DO 60 KX=1,LL4
+ IOF2=(KX-1)*24
+ DO 50 IT=1,6
+ KK(IT)=KN(NUM1+IT)
+ KN2(IOF2+(IT-1)*4+4)=KN(NUM1+7)
+ QFR2(IOF2+(IT-1)*4+1)=QFR(NUM1+IT)
+ QFR2(IOF2+(IT-1)*4+2)=0.0
+ QFR2(IOF2+(IT-1)*4+3)=0.0
+ IF(IT.NE.6) KN2(IOF2+(IT-1)*4+2)=(KX-1)*6+IT+1
+ IF(IT.EQ.6) KN2(IOF2+(IT-1)*4+2)=(KX-1)*6+1
+ IF(IT.NE.1) KN2(IOF2+(IT-1)*4+3)=(KX-1)*6+IT-1
+ IF(IT.EQ.1) KN2(IOF2+(IT-1)*4+3)=(KX-1)*6+6
+ QFR2(IOF2+(IT-1)*4+4)=QFR(NUM1+7)/6.0
+ IF((KK(IT).LT.0).AND.((IHEX.EQ.5).OR.(IHEX.EQ.6)).AND.
+ 1 (KX.GT.1)) THEN
+ IC=0
+ DO 45 I=1,6
+ IF(-KN((-KK(IT)-1)*7+I).EQ.KX) IC=I
+ 45 CONTINUE
+ IF(IC.EQ.0) CALL XABORT('BIVSBH: ALGORITHM FAILURE 1.')
+ KN2(IOF2+(IT-1)*4+1)=-((-KK(IT)-1)*6+IC)
+ ELSE IF(KK(IT).LT.0) THEN
+ KN2(IOF2+(IT-1)*4+1)=0
+ ELSE IF(KK(IT).EQ.KX) THEN
+ KN2(IOF2+(IT-1)*4+1)=((KX-1)*6+IT)
+ ELSE IF(ABS(KK(IT)).GT.MAXMAX) THEN
+ KN2(IOF2+(IT-1)*4+1)=SIGN(LL4*6+1,KK(IT))
+ ELSE
+ KN2(IOF2+(IT-1)*4+1)=(KK(IT)-1)*6+IT+3-(IT/4)*6
+ ENDIF
+ 50 CONTINUE
+* CHECK SYMMETRIES.
+ IF((KX.EQ.1).AND.((IHEX.EQ.1).OR.(IHEX.EQ.10))) THEN
+ KN2(2)=-1
+ KN2(3)=1
+ QFR2(4)=QFR(7)
+ ELSE IF((KX.EQ.1).AND.((IHEX.EQ.2).OR.(IHEX.EQ.11))) THEN
+ KN2((1-1)*4+2)=-KN2((1-1)*4+3)
+ KN2((6-1)*4+3)=-KN2((6-1)*4+2)
+ QFR2((1-1)*4+4)=QFR(7)/2.0
+ QFR2((6-1)*4+4)=QFR(7)/2.0
+ ELSE IF((KX.EQ.1).AND.(IHEX.EQ.3)) THEN
+ KN2(2)=1
+ KN2(3)=1
+ QFR2(4)=QFR(7)
+ ELSE IF((KX.EQ.1).AND.(IHEX.EQ.4)) THEN
+ KN2((1-1)*4+3)=1
+ KN2((2-1)*4+2)=-KN2((2-1)*4+3)
+ QFR2((1-1)*4+4)=2.0*QFR(7)/3.0
+ QFR2((2-1)*4+4)=QFR(7)/3.0
+ ELSE IF((KX.EQ.1).AND.(IHEX.EQ.5)) THEN
+ KN2((1-1)*4+3)=-KN2((1-1)*4+2)
+ KN2((2-1)*4+2)=-KN2((2-1)*4+3)
+ QFR2((1-1)*4+4)=QFR(7)/2.0
+ QFR2((2-1)*4+4)=QFR(7)/2.0
+ ELSE IF((KX.EQ.1).AND.(IHEX.EQ.6)) THEN
+ KN2((2-1)*4+2)=-6
+ KN2((6-1)*4+3)=-2
+ QFR2((1-1)*4+4)=QFR(7)/3.0
+ QFR2((2-1)*4+4)=QFR(7)/3.0
+ QFR2((6-1)*4+4)=QFR(7)/3.0
+ ELSE IF((KK(1).EQ.-KK(5)).AND.(KK(2).EQ.-KK(4)).AND.
+ 1 (KK(3).EQ.-KK(5)).AND.(KK(6).EQ.-KK(4))) THEN
+ KN2(IOF2+(4-1)*4+3)=-KN2(IOF2+(4-1)*4+2)
+ KN2(IOF2+(5-1)*4+2)=-KN2(IOF2+(5-1)*4+3)
+ QFR2(IOF2+(4-1)*4+4)=QFR(NUM1+7)/2.0
+ QFR2(IOF2+(5-1)*4+4)=QFR(NUM1+7)/2.0
+ ELSE IF((KK(1).EQ.-KK(3)).AND.(KK(4).EQ.-KK(2)).AND.
+ 1 (KK(5).EQ.-KK(3)).AND.(KK(6).EQ.-KK(2))) THEN
+ KN2(IOF2+(2-1)*4+3)=-KN2(IOF2+(2-1)*4+2)
+ KN2(IOF2+(3-1)*4+2)=-KN2(IOF2+(3-1)*4+3)
+ QFR2(IOF2+(2-1)*4+4)=QFR(NUM1+7)/2.0
+ QFR2(IOF2+(3-1)*4+4)=QFR(NUM1+7)/2.0
+ ELSE IF((KK(1).EQ.-KK(6)).AND.(KK(2).EQ.-KK(5)).AND.
+ 1 (KK(3).EQ.-KK(4))) THEN
+ KN2(IOF2+(1-1)*4+3)=((KX-1)*6+1)
+ KN2(IOF2+(3-1)*4+2)=((KX-1)*6+3)
+ QFR2(IOF2+(1-1)*4+4)=QFR(NUM1+7)/3.0
+ QFR2(IOF2+(2-1)*4+4)=QFR(NUM1+7)/3.0
+ QFR2(IOF2+(3-1)*4+4)=QFR(NUM1+7)/3.0
+ ELSE IF((KK(5).EQ.-KK(4)).AND.(KK(6).EQ.-KK(3)).AND.
+ 1 (KK(1).EQ.-KK(2))) THEN
+ KN2(IOF2+(5-1)*4+3)=((KX-1)*6+5)
+ KN2(IOF2+(1-1)*4+2)=((KX-1)*6+1)
+ QFR2(IOF2+(5-1)*4+4)=QFR(NUM1+7)/3.0
+ QFR2(IOF2+(6-1)*4+4)=QFR(NUM1+7)/3.0
+ QFR2(IOF2+(1-1)*4+4)=QFR(NUM1+7)/3.0
+ ELSE IF((KK(1).EQ.-KK(3)).AND.(KK(4).EQ.-KK(3)).AND.
+ 1 (KK(5).EQ.-KK(2)).AND.(KK(6).EQ.-KK(3))) THEN
+ KN2(IOF2+(2-1)*4+3)=-KN2(IOF2+(2-1)*4+2)
+ KN2(IOF2+(3-1)*4+2)=((KX-1)*6+3)
+ QFR2(IOF2+(2-1)*4+4)=QFR(NUM1+7)/3.0
+ QFR2(IOF2+(3-1)*4+4)=2.0*QFR(NUM1+7)/3.0
+ ELSE IF((KK(2).EQ.-KK(6)).AND.(KK(3).EQ.-KK(5)).AND.
+ 1 (KK(2).LT.0)) THEN
+ KN2(IOF2+(1-1)*4+2)=-KN2(IOF2+(1-1)*4+3)
+ KN2(IOF2+(4-1)*4+3)=-KN2(IOF2+(4-1)*4+2)
+ QFR2(IOF2+(5-1)*4+4)=2.0*QFR2(IOF2+(5-1)*4+4)
+ QFR2(IOF2+(6-1)*4+4)=2.0*QFR2(IOF2+(6-1)*4+4)
+ ELSE IF((KK(1).EQ.-KK(3)).AND.(KK(6).EQ.-KK(4)).AND.
+ 1 (KK(1).LT.0)) THEN
+ KN2(IOF2+(2-1)*4+3)=-KN2(IOF2+(2-1)*4+2)
+ KN2(IOF2+(5-1)*4+2)=-KN2(IOF2+(5-1)*4+3)
+ QFR2(IOF2+(3-1)*4+4)=2.0*QFR2(IOF2+(3-1)*4+4)
+ QFR2(IOF2+(4-1)*4+4)=2.0*QFR2(IOF2+(4-1)*4+4)
+ ELSE IF((KK(4).EQ.-KK(2)).AND.(KK(5).EQ.-KK(1)).AND.
+ 1 (KK(4).LT.0)) THEN
+ KN2(IOF2+(3-1)*4+2)=-KN2(IOF2+(3-1)*4+3)
+ KN2(IOF2+(6-1)*4+3)=-KN2(IOF2+(6-1)*4+2)
+ QFR2(IOF2+(1-1)*4+4)=2.0*QFR2(IOF2+(1-1)*4+4)
+ QFR2(IOF2+(2-1)*4+4)=2.0*QFR2(IOF2+(2-1)*4+4)
+ ELSE IF((KK(3).EQ.-KK(1)).AND.(KK(4).EQ.-KK(6)).AND.
+ 1 (KK(3).LT.0)) THEN
+ KN2(IOF2+(2-1)*4+2)=-KN2(IOF2+(2-1)*4+3)
+ KN2(IOF2+(5-1)*4+3)=-KN2(IOF2+(5-1)*4+2)
+ QFR2(IOF2+(1-1)*4+4)=2.0*QFR2(IOF2+(1-1)*4+4)
+ QFR2(IOF2+(6-1)*4+4)=2.0*QFR2(IOF2+(6-1)*4+4)
+ ENDIF
+ NUM1=NUM1+7
+ 60 CONTINUE
+ MAXMAX=LL4*6
+ IF(LL4*6.GT.MAXEV) THEN
+ WRITE(HSMG,'(30HBIVSBH: 2 INSUFFICIENT MAXEV (,I7,7H). SHOU,
+ 1 18HLD BE INCREASED TO,I7,1H.)') MAXEV,LL4*6
+ CALL XABORT(HSMG)
+ ENDIF
+ LL5=0
+ NUM1=0
+ NUM2=0
+ DO 85 I=1,LL4*6
+ IGAR(I)=0
+ IF(KN2(NUM2+1).EQ.0) GO TO 80
+ LL5=LL5+1
+ IGAR(I)=LL5
+ DO 70 J=1,4
+ KN(NUM1+J)=KN2(NUM2+J)
+ QFR(NUM1+J)=QFR2(NUM2+J)
+ 70 CONTINUE
+ NUM1=NUM1+4
+ 80 NUM2=NUM2+4
+ 85 CONTINUE
+ NUM1=0
+ DO 100 I=1,LL5
+ DO 90 K=1,3
+ IF(ABS(KN(NUM1+K)).LE.LL4*6) THEN
+ IF(IGAR(ABS(KN(NUM1+K))).EQ.0) CALL XABORT('BIVSBH: ALGORIT'
+ 1 //'HM FAILURE 2.')
+ KN(NUM1+K)=SIGN(IGAR(ABS(KN(NUM1+K))),KN(NUM1+K))
+ ENDIF
+ 90 CONTINUE
+ NUM1=NUM1+4
+ 100 CONTINUE
+ LL4=LL5
+ IF(IMPX.GT.4) THEN
+ WRITE(6,530) 2
+ NUM1=0
+ DO 110 I=1,LL4
+ WRITE(6,540) I,KN(NUM1+4),(KN(NUM1+J),J=1,3),(QFR(NUM1+J),
+ 1 J=1,4)
+ NUM1=NUM1+4
+ 110 CONTINUE
+ ENDIF
+*
+* TRIANGLE TO TRIANGLE.
+ KSPLH=0
+ IF(ISPLH.EQ.2) THEN
+* MESH-SPLITTING INTO 6 TRIANGLES.
+ KSPLH=2
+ ELSE IF(ISPLH.EQ.3) THEN
+* MESH-SPLITTING INTO 24 TRIANGLES.
+ KSPLH=3
+ ELSE IF(ISPLH.EQ.5) THEN
+* MESH-SPLITTING INTO 96 TRIANGLES.
+ KSPLH=4
+ ELSE IF(ISPLH.EQ.9) THEN
+* MESH-SPLITTING INTO 384 TRIANGLES.
+ KSPLH=5
+ ELSE IF(ISPLH.EQ.17) THEN
+* MESH-SPLITTING INTO 1536 TRIANGLES.
+ KSPLH=6
+ ELSE
+ WRITE(HSMG,'(36HBIVSBH: UNABLE TO SPLIT WITH ISPLH =,I5,
+ 1 38H ISPLH = 1, 2, 3, 5, 9 AND 17 ALLOWED.)') ISPLH
+ CALL XABORT(HSMG)
+ ENDIF
+ DO 230 JSPLH=3,KSPLH
+ IF(LL4*16.GT.MAXKN) THEN
+ WRITE(HSMG,'(30HBIVSBH: 3 INSUFFICIENT MAXKN (,I7,7H). SHOU,
+ 1 18HLD BE INCREASED TO,I7,1H.)') MAXKN,LL4*16
+ CALL XABORT(HSMG)
+ ENDIF
+ NUM1=0
+ DO 170 KX=1,LL4
+ IOF2=(KX-1)*16
+ DO 120 IT=1,3
+ KK(IT)=KN(NUM1+IT)
+ 120 CONTINUE
+ DO 130 IT=1,4
+ KN2(IOF2+(IT-1)*4+4)=KN(NUM1+4)
+ QFR2(IOF2+(IT-1)*4+1)=0.0
+ QFR2(IOF2+(IT-1)*4+2)=0.0
+ QFR2(IOF2+(IT-1)*4+3)=0.0
+ QFR2(IOF2+(IT-1)*4+4)=QFR(NUM1+4)/4.0
+ 130 CONTINUE
+ QFR2(IOF2+(1-1)*4+3)=QFR(NUM1+1)
+ QFR2(IOF2+(3-1)*4+2)=QFR(NUM1+1)
+ QFR2(IOF2+(1-1)*4+1)=QFR(NUM1+2)
+ QFR2(IOF2+(4-1)*4+2)=QFR(NUM1+2)
+ QFR2(IOF2+(3-1)*4+1)=QFR(NUM1+3)
+ QFR2(IOF2+(4-1)*4+3)=QFR(NUM1+3)
+ KN2(IOF2+(1-1)*4+1)=(KK(2)-1)*4+3
+ KN2(IOF2+(1-1)*4+2)=(KX-1)*4+2
+ KN2(IOF2+(1-1)*4+3)=(KK(1)-1)*4+3
+ KN2(IOF2+(2-1)*4+1)=(KX-1)*4+4
+ KN2(IOF2+(2-1)*4+2)=(KX-1)*4+3
+ KN2(IOF2+(2-1)*4+3)=(KX-1)*4+1
+ KN2(IOF2+(3-1)*4+1)=(KK(3)-1)*4+1
+ KN2(IOF2+(3-1)*4+2)=(KK(1)-1)*4+1
+ KN2(IOF2+(3-1)*4+3)=(KX-1)*4+2
+ KN2(IOF2+(4-1)*4+1)=(KX-1)*4+2
+ KN2(IOF2+(4-1)*4+2)=(KK(2)-1)*4+4
+ KN2(IOF2+(4-1)*4+3)=(KK(3)-1)*4+4
+ IF(ABS(KK(1)).GT.MAXMAX) THEN
+ KN2(IOF2+(1-1)*4+3)=SIGN(LL4*4+1,KK(1))
+ KN2(IOF2+(3-1)*4+2)=SIGN(LL4*4+1,KK(1))
+ ENDIF
+ IF(ABS(KK(2)).GT.MAXMAX) THEN
+ KN2(IOF2+(1-1)*4+1)=SIGN(LL4*4+1,KK(2))
+ KN2(IOF2+(4-1)*4+2)=SIGN(LL4*4+1,KK(2))
+ ENDIF
+ IF(ABS(KK(3)).GT.MAXMAX) THEN
+ KN2(IOF2+(3-1)*4+1)=SIGN(LL4*4+1,KK(3))
+ KN2(IOF2+(4-1)*4+3)=SIGN(LL4*4+1,KK(3))
+ ENDIF
+ IF((KK(1).LT.0).AND.((IHEX.EQ.5).OR.(IHEX.EQ.6))) THEN
+ IC=0
+ DO 140 I=1,3
+ IF(-KN((-KK(1)-1)*4+I).EQ.KX) IC=I
+ 140 CONTINUE
+ IF(IC.EQ.0) CALL XABORT('BIVSBH: ALGORITHM FAILURE 3.')
+ KN2(IOF2+(1-1)*4+3)=-((-KK(1)-1)*4+3)
+ KN2(IOF2+(3-1)*4+2)=-((-KK(1)-1)*4+1)
+ ELSE IF((KK(2).LT.0).AND.((IHEX.EQ.5).OR.(IHEX.EQ.6))) THEN
+ IC=0
+ DO 150 I=1,3
+ IF(-KN((-KK(2)-1)*4+I).EQ.KX) IC=I
+ 150 CONTINUE
+ IF(IC.EQ.0) CALL XABORT('BIVSBH: ALGORITHM FAILURE 4.')
+ KN2(IOF2+(1-1)*4+1)=-((-KK(2)-1)*4+3)
+ KN2(IOF2+(4-1)*4+2)=-((-KK(2)-1)*4+4)
+ ELSE IF((KK(3).LT.0).AND.((IHEX.EQ.5).OR.(IHEX.EQ.6))) THEN
+ IC=0
+ DO 160 I=1,3
+ IF(-KN((-KK(3)-1)*4+I).EQ.KX) IC=I
+ 160 CONTINUE
+ IF(IC.EQ.0) CALL XABORT('BIVSBH: ALGORITHM FAILURE 5.')
+ KN2(IOF2+(3-1)*4+1)=-((-KK(3)-1)*4+1)
+ KN2(IOF2+(4-1)*4+3)=-((-KK(3)-1)*4+4)
+ ELSE IF((KK(1).EQ.-KK(2)).AND.(KK(1).LT.0)) THEN
+ KN2(IOF2+(1-1)*4+3)=-KN2(IOF2+(1-1)*4+1)
+ KN2(IOF2+(2-1)*4+2)=-KN2(IOF2+(2-1)*4+1)
+ KN2(IOF2+(3-1)*4+1)=0
+ QFR2(IOF2+(4-1)*4+4)=2.0*QFR2(IOF2+(4-1)*4+4)
+ ELSE IF((KK(1).EQ.-KK(3)).AND.(KK(1).LT.0)) THEN
+ KN2(IOF2+(2-1)*4+3)=-KN2(IOF2+(2-1)*4+1)
+ KN2(IOF2+(3-1)*4+2)=-KN2(IOF2+(3-1)*4+1)
+ KN2(IOF2+(1-1)*4+1)=0
+ QFR2(IOF2+(4-1)*4+4)=2.0*QFR2(IOF2+(4-1)*4+4)
+ ELSE IF((KK(2).EQ.-KK(3)).AND.(KK(2).LT.0)) THEN
+ KN2(IOF2+(2-1)*4+3)=-KN2(IOF2+(2-1)*4+2)
+ KN2(IOF2+(4-1)*4+2)=-KN2(IOF2+(4-1)*4+3)
+ KN2(IOF2+(1-1)*4+1)=0
+ QFR2(IOF2+(3-1)*4+4)=2.0*QFR2(IOF2+(3-1)*4+4)
+ ELSE IF((KK(2).EQ.-KK(1)).AND.(KK(2).LT.0)) THEN
+ KN2(IOF2+(1-1)*4+1)=-KN2(IOF2+(1-1)*4+3)
+ KN2(IOF2+(2-1)*4+1)=-KN2(IOF2+(2-1)*4+2)
+ KN2(IOF2+(4-1)*4+1)=0
+ QFR2(IOF2+(3-1)*4+4)=2.0*QFR2(IOF2+(3-1)*4+4)
+ ELSE IF((KK(3).EQ.-KK(1)).AND.(KK(3).LT.0)) THEN
+ KN2(IOF2+(2-1)*4+1)=-KN2(IOF2+(2-1)*4+3)
+ KN2(IOF2+(3-1)*4+1)=-KN2(IOF2+(3-1)*4+2)
+ KN2(IOF2+(4-1)*4+1)=0
+ QFR2(IOF2+(1-1)*4+4)=2.0*QFR2(IOF2+(1-1)*4+4)
+ ELSE IF((KK(3).EQ.-KK(2)).AND.(KK(3).LT.0)) THEN
+ KN2(IOF2+(2-1)*4+2)=-KN2(IOF2+(2-1)*4+3)
+ KN2(IOF2+(4-1)*4+3)=-KN2(IOF2+(4-1)*4+2)
+ KN2(IOF2+(3-1)*4+1)=0
+ QFR2(IOF2+(1-1)*4+4)=2.0*QFR2(IOF2+(1-1)*4+4)
+ ENDIF
+ IF(KK(1).EQ.KX) THEN
+ IF(KN2(IOF2+(1-1)*4+3).NE.0) KN2(IOF2+(1-1)*4+3)=((KX-1)*4+1)
+ IF(KN2(IOF2+(3-1)*4+2).NE.0) KN2(IOF2+(3-1)*4+2)=((KX-1)*4+3)
+ ENDIF
+ IF(KK(2).EQ.KX) THEN
+ IF(KN2(IOF2+(1-1)*4+1).NE.0) KN2(IOF2+(1-1)*4+1)=((KX-1)*4+1)
+ IF(KN2(IOF2+(4-1)*4+2).NE.0) KN2(IOF2+(4-1)*4+2)=((KX-1)*4+4)
+ ENDIF
+ IF(KK(3).EQ.KX) THEN
+ IF(KN2(IOF2+(3-1)*4+1).NE.0) KN2(IOF2+(3-1)*4+1)=((KX-1)*4+3)
+ IF(KN2(IOF2+(4-1)*4+3).NE.0) KN2(IOF2+(4-1)*4+3)=((KX-1)*4+4)
+ ENDIF
+ NUM1=NUM1+4
+ 170 CONTINUE
+ MAXMAX=LL4*4
+ IF(LL4*4.GT.MAXEV) THEN
+ WRITE(HSMG,'(30HBIVSBH: 3 INSUFFICIENT MAXEV (,I7,7H). SHOU,
+ 1 18HLD BE INCREASED TO,I7,1H.)') MAXEV,LL4*4
+ CALL XABORT(HSMG)
+ ENDIF
+ LL5=0
+ NUM1=0
+ NUM2=0
+ DO 195 I=1,LL4*4
+ IGAR(I)=0
+ IF(KN2(NUM2+1).EQ.0) GO TO 190
+ LL5=LL5+1
+ IGAR(I)=LL5
+ DO 180 J=1,4
+ KN(NUM1+J)=KN2(NUM2+J)
+ QFR(NUM1+J)=QFR2(NUM2+J)
+ 180 CONTINUE
+ NUM1=NUM1+4
+ 190 NUM2=NUM2+4
+ 195 CONTINUE
+ NUM1=0
+ DO 210 I=1,LL5
+ DO 200 K=1,3
+ IF(ABS(KN(NUM1+K)).LE.LL4*4) THEN
+ IF(IGAR(ABS(KN(NUM1+K))).EQ.0) CALL XABORT('BIVSBH: ALGORIT'
+ 1 //'HM FAILURE 6.')
+ KN(NUM1+K)=SIGN(IGAR(ABS(KN(NUM1+K))),KN(NUM1+K))
+ ENDIF
+ 200 CONTINUE
+ NUM1=NUM1+4
+ 210 CONTINUE
+ LL4=LL5
+ IF(IMPX.GT.4) THEN
+ WRITE(6,530) JSPLH
+ NUM1=0
+ DO 220 I=1,LL4
+ WRITE(6,540) I,KN(NUM1+4),(KN(NUM1+J),J=1,3),(QFR(NUM1+J),
+ 1 J=1,4)
+ NUM1=NUM1+4
+ 220 CONTINUE
+ ENDIF
+ 230 CONTINUE
+ ENDIF
+*----
+* SCRATCH STORAGE DEALLOCATION
+*----
+ DEALLOCATE(IGAR,KN2,QFR2)
+ RETURN
+*
+ 510 FORMAT(/36H BIVSBH: NUMBERING OF UNKNOWNS. STEP,I3,1H./1X,40(1H-)/
+ 1 9X,7HHEXAGON,3X,9HNEIGHBOUR,27X,17HEXTERNAL SURFACES,22X,
+ 2 6HVOLUME)
+ 520 FORMAT (1X,2I6,2X,6I6,2X,6F6.2,5X,1P,E13.6)
+ 530 FORMAT(/36H BIVSBH: NUMBERING OF UNKNOWNS. STEP,I3,1H./1X,40(1H-)/
+ 1 9X,7HHEXAGON,3X,9HNEIGHBOUR,9X,17HEXTERNAL SURFACES,11X,
+ 2 6HVOLUME)
+ 540 FORMAT (1X,2I6,2X,3I6,2X,3F6.2,12X,1P,E13.6)
+ END