summaryrefslogtreecommitdiff
path: root/Trivac/src/NEIGHB.f
diff options
context:
space:
mode:
Diffstat (limited to 'Trivac/src/NEIGHB.f')
-rwxr-xr-xTrivac/src/NEIGHB.f158
1 files changed, 158 insertions, 0 deletions
diff --git a/Trivac/src/NEIGHB.f b/Trivac/src/NEIGHB.f
new file mode 100755
index 0000000..1d0de37
--- /dev/null
+++ b/Trivac/src/NEIGHB.f
@@ -0,0 +1,158 @@
+*DECK NEIGHB
+ FUNCTION NEIGHB (J,K,IHEX,NH,POIDS)
+*
+*-----------------------------------------------------------------------
+*
+*Purpose:
+* Compute the index of a neighbour hexagon taking into account the
+* symmetries.
+*
+*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. Benaboud
+*
+*Parameters: input
+* J index of the considered hexagon.
+* K index of the side.
+* IHEX type of symmetry:
+* =1: S30; =2: SA60; =3: SB60; =4: S90; =5: R120;
+* =6: R180; =7: SA180; =8: SB180; =9: complete;
+* =10: S30 with HBC SYME; =11: sa60 with HBC SYME.
+* NH total number of hexagons.
+* POIDS weight of the hexagon.
+*
+*Parameters: output
+* NEIGHB index of the neighbour hexagon. Note that:
+* ABS(NEIGHB).GT.NH: external boundary;
+* NEIGHB=J: reflection on side k;
+* NEIGHB.LT.0: axial symmetry or rotation.
+*
+*-----------------------------------------------------------------------
+*
+* side 2
+* xxxxxx
+* side 3 x x side 1
+* x x
+* x x
+* x x
+* side 4 x x side 6
+* xxxxxx
+* side 5
+*----
+* SUBROUTINE ARGUMENTS
+*----
+ INTEGER J,K,IHEX,NH
+ REAL POIDS
+*
+ IF ((IHEX.EQ.1).OR.(IHEX.EQ.10)) THEN
+ VI = 2.* SQRT(REAL(NH)) - 1.
+ VP = SQRT(REAL(4*NH+1)) - 1.
+ IF (AINT(VI).EQ.VI) THEN
+ NC = INT(VI)
+ ELSE IF (AINT(VP).EQ.VP) THEN
+ NC = INT(VP)
+ ELSE
+ CALL XABORT('NEIGHB: INVALID NUMBER OF HEXAGONS(1).')
+ ENDIF
+ ELSE IF ((IHEX.EQ.2).OR.(IHEX.EQ.11)) THEN
+ VA = (SQRT(REAL(8*NH+1)) - 1.)/2.
+ IF (AINT(VA).EQ.VA) THEN
+ NC = INT(VA)
+ ELSE
+ CALL XABORT('NEIGHB: INVALID NUMBER OF HEXAGONS(2).')
+ ENDIF
+ ELSE IF (IHEX.EQ.3) THEN
+ VI = SQRT(REAL(2*NH-1))
+ VP = SQRT(REAL(2*NH))
+ IF (AINT(VI).EQ.VI) THEN
+ NC = INT(VI)
+ ELSE IF (AINT(VP).EQ.VP) THEN
+ NC = INT(VP)
+ ELSE
+ CALL XABORT('NEIGHB: INVALID NUMBER OF HEXAGONS(3).')
+ ENDIF
+ ELSE IF (IHEX.EQ.4) THEN
+ VI = SQRT(REAL((4*NH-1)/3))
+ VP = SQRT(REAL(4*NH/3))
+ IF (AINT(VI).EQ.VI) THEN
+ NC = INT(VI)
+ ELSE IF (AINT(VP).EQ.VP) THEN
+ NC = INT(VP)
+ ELSE
+ CALL XABORT('NEIGHB: INVALID NUMBER OF HEXAGONS(4).')
+ ENDIF
+ ELSE IF (IHEX.EQ.5) THEN
+ VA = (SQRT(REAL(4*(NH-1)+1)) + 1.)/2.
+ IF (AINT(VA).EQ.VA) THEN
+ NC = INT(VA)
+ ELSE
+ CALL XABORT('NEIGHB: INVALID NUMBER OF HEXAGONS(5).')
+ ENDIF
+ ELSE IF (IHEX.EQ.6) THEN
+ VA = (SQRT(REAL(8*(NH-1)/3+1)) + 1)/2
+ IF (AINT(VA).EQ.VA) THEN
+ NC = INT(VA)
+ ELSE
+ CALL XABORT('NEIGHB: INVALID NUMBER OF HEXAGONS(6).')
+ ENDIF
+ ELSE IF (IHEX.EQ.7) THEN
+ VA = (SQRT(REAL(24*NH+1)) + 1.)/6.
+ IF (AINT(VA).EQ.VA) THEN
+ NC = INT(VA)
+ ELSE
+ CALL XABORT('NEIGHB: INVALID NUMBER OF HEXAGONS(7).')
+ ENDIF
+ ELSE IF (IHEX.EQ.8) THEN
+ VI = (1.+SQRT(REAL(3*(2*NH-1)+1)))/3.
+ VP = (1.+SQRT(REAL(6*NH+1)))/3.
+ IF (AINT(VI).EQ.VI) THEN
+ NC = INT(VI)
+ ELSE IF (AINT(VP).EQ.VP) THEN
+ NC = INT(VP)
+ ELSE
+ CALL XABORT('NEIGHB: INVALID NUMBER OF HEXAGONS(8).')
+ ENDIF
+ ELSE IF (IHEX.EQ.9) THEN
+ VA = (SQRT(REAL((4*NH-1)/3)) + 1.)/2.
+ IF (AINT(VA).EQ.VA) THEN
+ NC = INT(VA)
+ ELSE
+ CALL XABORT('NEIGHB: INVALID NUMBER OF HEXAGONS(9).')
+ ENDIF
+ ELSE
+ CALL XABORT('NEIGHB: INVALID TYPE OF SYMMETRY.')
+ ENDIF
+*
+ IF (IHEX.EQ.1) THEN
+ CALL NEIGH1 (NC,J,K,N,POIDS)
+ ELSE IF (IHEX.EQ.2) THEN
+ CALL NEIGH2 (NC,J,K,N,POIDS)
+ ELSE IF (IHEX.EQ.3) THEN
+ CALL NEIGH3 (NC,J,K,N,POIDS)
+ ELSE IF (IHEX.EQ.4) THEN
+ CALL NEIGH4 (NC,J,K,N,POIDS)
+ ELSE IF (IHEX.EQ.5) THEN
+ CALL NEIGH5 (NC,J,K,N,POIDS)
+ IF (-N.GT.NH) N=-N
+ ELSE IF (IHEX.EQ.6) THEN
+ CALL NEIGH6 (NC,J,K,N,POIDS)
+ IF (-N.GT.NH) N=-N
+ ELSE IF (IHEX.EQ.7) THEN
+ CALL NEIGH7 (NC,J,K,N,POIDS)
+ ELSE IF (IHEX.EQ.8) THEN
+ CALL NEIGH8 (NC,J,K,N,POIDS)
+ ELSE IF (IHEX.EQ.9) THEN
+ CALL NEIGH9 (NC,J,K,N,POIDS)
+ ELSE IF (IHEX.EQ.10) THEN
+ CALL NEIG10 (NC,J,K,N,POIDS)
+ ELSE IF (IHEX.EQ.11) THEN
+ CALL NEIG11 (NC,J,K,N,POIDS)
+ ENDIF
+ NEIGHB=N
+ RETURN
+ END